@nice2dev/ui-ai 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # @nice2dev/ui-ai — Changelog
2
2
 
3
+ ## 1.1.7
4
+
5
+ ### Patch Changes
6
+
7
+ - Close the three items left open in the 1.1.6 response to OmniVerk.
8
+
9
+ **Every value control works without state in the parent.** The `audit-controllable-state` gate
10
+ counted 87 value props that were required with no `default*`, so the control could not render from a
11
+ manifest without data. It now reports 0 and gates CI at `--max=0`. 48 controls gained `default*` props
12
+ through `useControllableState` (existing `value` + handler call sites behave as before); 33 read-only
13
+ data lists are optional with a stable empty default; 4 props paired with a handler only by name are
14
+ optional; `NiceWhiteboard` and `NiceMetricsDashboard` render an empty state until a session or
15
+ dashboard arrives. Additive API only — nothing renamed or removed.
16
+
17
+ - `NicePivotGrid.fields`, `NiceScheduler.events` and `NiceGitHooks.hooks` are controlled only together
18
+ with their change handler, as `NiceScheduler` already documented for `currentDate`/`view`. A bare
19
+ prop stays an initial value; prop plus handler now always wins (later prop updates used to be
20
+ ignored). `NiceGitHooks.onHookChange` is now called; `onHooksChange` and
21
+ `NiceLocaleManager.onTranslationsChange` are new.
22
+ - `NiceCodeEditor` / `NiceCodeDiffEditor` no longer report a value written from the prop back through
23
+ `onChange`, and call the latest handler rather than the one captured at mount.
24
+ - `NiceHtmlEditor` no longer rewrites its content on every render (React 19 compares the
25
+ `dangerouslySetInnerHTML` object, not its string), which moved the caret; the HTML source and
26
+ Markdown views can be closed again.
27
+ - Selections seeded once from the first item (access manager, automation/scene editors, git diff
28
+ viewer, ribbon, setup wizard) follow data that arrives after mount.
29
+ - `useControllableState`: new `fallbackValue` seed that never triggers the value/default clash warning;
30
+ two functional updates in one tick no longer lose the first; `onChange` is called with one argument
31
+ when there is no meta. `UseControllableStateOptions` is now a union type alias.
32
+
33
+ **`--nice-*` is the source of truth for design tokens.** Controls read only `--nice-*` (9,225 reads in
34
+ 339 files). The unprefixed names (`--color-primary`, `--bg-primary`, `--text-muted`, …) stay declared
35
+ as aliases pointing at the Nice tokens, so reading them works, but setting them no longer repaints Nice
36
+ controls. Apps that relied on that can import `@nice2dev/ui/css/legacy-bg-text-aliases.css` after
37
+ `style.css` (removed in 1.2), or set `--nice-color-primary` and friends directly. 13 tokens that were
38
+ read and never declared (`--color-danger`, `--text-on-primary`, `--color-white`, …) are defined; the
39
+ dark blocks define the canonical names, so `.nice-dark` on `<body>` no longer leaves them on light
40
+ values; `--nice-primary-bg` and `--nice-selected-bg` are a primary tint instead of falling through to
41
+ grey. New gate `audit-token-names`.
42
+
43
+ **Node ESM and `require()`.** `@nice2dev/spatial-core` imports from plain Node ESM (51 relative
44
+ specifiers gained extensions, enforced by `nodenext`), and so does `@nice2dev/ui-buildings`, which
45
+ failed through it. `require()` works for `ui-3d`, `ui-graphics` and `game-engine`. The package-exports
46
+ gate now loads every entry in both module systems.
47
+
48
+ **Hygiene.** Sources are prettier-formatted and CI gates on it; 640 stale `.d.ts` files were removed
49
+ from source trees (never published).
50
+
51
+ ## 1.1.6
52
+
53
+ No changes in this release.
54
+
3
55
  ## 1.1.5
4
56
 
5
57
  No changes in this release.
@@ -1,3 +1,2 @@
1
1
  import { NiceAIHintBubbleProps } from './types';
2
2
  export declare const NiceAIHintBubble: import('react').ForwardRefExoticComponent<NiceAIHintBubbleProps & import('react').RefAttributes<HTMLSpanElement>>;
3
- //# sourceMappingURL=NiceAIHintBubble.d.ts.map
@@ -25,4 +25,3 @@ export declare function NiceAIProvider({ config, rateLimits, enabled, onRateLimi
25
25
  */
26
26
  export declare function useAIContext(): AIContextValue | null;
27
27
  export {};
28
- //# sourceMappingURL=NiceAIProvider.d.ts.map
@@ -94,4 +94,3 @@ export interface NiceAccessibilityAIProps {
94
94
  renderIssue?: (issue: AIAccessibilityIssue) => ReactNode;
95
95
  }
96
96
  export declare function NiceAccessibilityAI({ config, wcagLevel, onAuditComplete, showContrastChecker, className, style, renderIssue, }: NiceAccessibilityAIProps): import("react").JSX.Element;
97
- //# sourceMappingURL=NiceAccessibilityAI.d.ts.map
@@ -108,4 +108,3 @@ export interface NiceChartAIProps {
108
108
  renderChart?: (config: AIChartConfig) => ReactNode;
109
109
  }
110
110
  export declare function NiceChartAI({ config, dataFields, context, onGenerate, placeholder, showTypeSelector, showPreview, className, style, renderChart, }: NiceChartAIProps): import("react").JSX.Element;
111
- //# sourceMappingURL=NiceChartAI.d.ts.map
@@ -110,4 +110,3 @@ export interface NiceCodeEditorAIProps {
110
110
  }) => ReactNode;
111
111
  }
112
112
  export declare function NiceCodeEditorAI({ code: initialCode, language, config, onChange, onAcceptSuggestion, showToolbar, enableInlineSuggestions, placeholder, className, style, renderEditor, }: NiceCodeEditorAIProps): import("react").JSX.Element;
113
- //# sourceMappingURL=NiceCodeEditorAI.d.ts.map
@@ -81,4 +81,3 @@ export interface NiceDataGridAIProps {
81
81
  children?: ReactNode;
82
82
  }
83
83
  export declare function NiceDataGridAI({ columns, config, onFilter, onSort, placeholder, showHistory, showSuggestions, className, style, }: NiceDataGridAIProps): import("react").JSX.Element;
84
- //# sourceMappingURL=NiceDataGridAI.d.ts.map
@@ -2,4 +2,3 @@ import { default as React } from 'react';
2
2
  import { NiceDataLabelerProps } from './ml-types';
3
3
  export declare const NiceDataLabeler: React.FC<NiceDataLabelerProps>;
4
4
  export default NiceDataLabeler;
5
- //# sourceMappingURL=NiceDataLabeler.d.ts.map
@@ -103,4 +103,3 @@ export interface NiceFormBuilderAIProps {
103
103
  renderForm?: (config: AIFormConfig) => ReactNode;
104
104
  }
105
105
  export declare function NiceFormBuilderAI({ config, schema, context, onGenerate, placeholder, showExamples, showPreview, className, style, renderForm, }: NiceFormBuilderAIProps): import("react").JSX.Element;
106
- //# sourceMappingURL=NiceFormBuilderAI.d.ts.map
@@ -77,4 +77,3 @@ export interface NiceIconSuggestorAIProps {
77
77
  style?: React.CSSProperties;
78
78
  }
79
79
  export declare function NiceIconSuggestorAI({ config, defaultLibrary, defaultStyle, maxSuggestions, onSelect, showCategories, showPreview, className, style, }: NiceIconSuggestorAIProps): import("react").JSX.Element;
80
- //# sourceMappingURL=NiceIconSuggestorAI.d.ts.map
@@ -99,4 +99,3 @@ export interface NiceLayoutAIProps {
99
99
  renderLayout?: (layout: AILayoutDefinition) => ReactNode;
100
100
  }
101
101
  export declare function NiceLayoutAI({ config, targetDevice, onGenerate, showTypeSelector, showPreview, className, style, renderLayout, }: NiceLayoutAIProps): import("react").JSX.Element;
102
- //# sourceMappingURL=NiceLayoutAI.d.ts.map
@@ -2,4 +2,3 @@ import { default as React } from 'react';
2
2
  import { NiceMLStudioProps } from './ml-types';
3
3
  export declare const NiceMLStudio: React.FC<NiceMLStudioProps>;
4
4
  export default NiceMLStudio;
5
- //# sourceMappingURL=NiceMLStudio.d.ts.map
@@ -2,4 +2,3 @@ import { default as React } from 'react';
2
2
  import { NiceModelInferenceProps } from './ml-types';
3
3
  export declare const NiceModelInference: React.FC<NiceModelInferenceProps>;
4
4
  export default NiceModelInference;
5
- //# sourceMappingURL=NiceModelInference.d.ts.map
@@ -172,4 +172,3 @@ export interface NiceReportBuilderAIProps {
172
172
  renderReport?: (layout: AIReportLayout) => ReactNode;
173
173
  }
174
174
  export declare function NiceReportBuilderAI({ config, dataSources, context, onGenerate, placeholder, showTemplates, showPreview, className, style, renderReport, }: NiceReportBuilderAIProps): import("react").JSX.Element;
175
- //# sourceMappingURL=NiceReportBuilderAI.d.ts.map
@@ -182,4 +182,3 @@ export interface NiceThemeGeneratorAIProps {
182
182
  style?: React.CSSProperties;
183
183
  }
184
184
  export declare function NiceThemeGeneratorAI({ config, generateDarkMode, onGenerate, showPresets, showPreview, className, style, }: NiceThemeGeneratorAIProps): import("react").JSX.Element;
185
- //# sourceMappingURL=NiceThemeGeneratorAI.d.ts.map
@@ -104,4 +104,3 @@ export interface NiceWorkflowDesignerAIProps {
104
104
  renderWorkflow?: (workflow: AIWorkflowDefinition) => ReactNode;
105
105
  }
106
106
  export declare function NiceWorkflowDesignerAI({ config, context, roles, onGenerate, placeholder, showExamples, showPreview, className, style, renderWorkflow, }: NiceWorkflowDesignerAIProps): import("react").JSX.Element;
107
- //# sourceMappingURL=NiceWorkflowDesignerAI.d.ts.map
@@ -145,4 +145,3 @@ export declare function useCostTracker(tenantId: string, budgetConfig?: BudgetCo
145
145
  }>;
146
146
  refresh: () => Promise<void>;
147
147
  };
148
- //# sourceMappingURL=cost-tracker.d.ts.map
@@ -116,4 +116,3 @@ export declare function createResilientClient(primaryConfig: LLMProviderConfig,
116
116
  */
117
117
  export declare function createResilientClientWithDefaults(primaryConfig: LLMProviderConfig, backupConfig?: LLMProviderConfig): ResilientLLMClient;
118
118
  export {};
119
- //# sourceMappingURL=fallback-strategies.d.ts.map
package/dist/index.d.ts CHANGED
@@ -45,4 +45,3 @@ export type { WCAGLevel, AIIssueSeverity, AIIssueCategory, AIAccessibilityIssue,
45
45
  export { useAccessibilityAI, NiceAccessibilityAI } from './NiceAccessibilityAI';
46
46
  export type { AIIconStyle, AIIconCategory, AIIconLibrary, AISuggestedIcon, AIIconSuggestionResult, AIIconContext, UseIconSuggestorAIOptions, NiceIconSuggestorAIProps, } from './NiceIconSuggestorAI';
47
47
  export { useIconSuggestorAI, NiceIconSuggestorAI } from './NiceIconSuggestorAI';
48
- //# sourceMappingURL=index.d.ts.map
@@ -283,4 +283,3 @@ export declare function buildSlideDesignContext(slide: SlideDesignAIContext['sli
283
283
  /** AI hook for slide design suggestions.
284
284
  * Returns alignment, contrast, spacing, and typography improvements. */
285
285
  export declare function useAISlideDesign(slide: SlideDesignAIContext['slide'], opts?: Omit<SlideDesignAIContext, 'slide'> & UseNiceAIHintOptions): import('./types').AIHintResult;
286
- //# sourceMappingURL=integrations.d.ts.map
@@ -176,4 +176,3 @@ export declare function createLLMProvider(config: LLMProviderConfig): ILLMProvid
176
176
  /** Create provider from NiceAIConfig */
177
177
  export declare function createProviderFromConfig(config: NiceAIConfig): ILLMProvider;
178
178
  export {};
179
- //# sourceMappingURL=llm-providers.d.ts.map
@@ -358,4 +358,3 @@ export interface NiceModelInferenceProps {
358
358
  showLogs?: boolean;
359
359
  className?: string;
360
360
  }
361
- //# sourceMappingURL=ml-types.d.ts.map
@@ -61,4 +61,3 @@ export declare function getTemplate(id: string): PromptTemplate | undefined;
61
61
  export declare function getTemplatesByCategory(category: PromptCategory): PromptTemplate[];
62
62
  /** List all template IDs */
63
63
  export declare function listTemplates(): string[];
64
- //# sourceMappingURL=prompt-templates.d.ts.map
@@ -19,4 +19,3 @@ export declare class RateLimiter {
19
19
  private pruneOldTimestamps;
20
20
  private checkWarning;
21
21
  }
22
- //# sourceMappingURL=rateLimiter.d.ts.map
@@ -21,4 +21,3 @@ export declare function parseJSONResponse(response: Response): Promise<{
21
21
  text: string;
22
22
  usage?: StreamChunk['usage'];
23
23
  }>;
24
- //# sourceMappingURL=streaming.d.ts.map
package/dist/types.d.ts CHANGED
@@ -130,4 +130,3 @@ export interface StreamChunk {
130
130
  total_tokens?: number;
131
131
  };
132
132
  }
133
- //# sourceMappingURL=types.d.ts.map
package/dist/ui-ai.css CHANGED
@@ -1 +1 @@
1
- :root{--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{--ntd-ai-bg: var(--nice-bg, #FFFFFF);--ntd-ai-fg: var(--nice-bg, #1e1e2e);--ntd-ai-border: #dce0e8;--ntd-ai-trigger-color: var(--nice-accent, #7c3aed);--ntd-ai-error: var(--nice-danger-dark, #dc2626)}}:root{--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-text, #0f172a);--ml-surface: var(--nice-text, #1e293b);--ml-surface-alt: var(--nice-text, #334155);--ml-border: var(--nice-text-secondary, #475569);--ml-text: var(--nice-bg-secondary, #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{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}@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{--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{--ntd-ai-bg: var(--nice-bg, #ffffff);--ntd-ai-fg: var(--nice-bg, #1e1e2e);--ntd-ai-border: #dce0e8;--ntd-ai-trigger-color: var(--nice-accent, #7c3aed);--ntd-ai-error: var(--nice-danger-dark, #dc2626)}}:root{--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-text, #0f172a);--ml-surface: var(--nice-text, #1e293b);--ml-surface-alt: var(--nice-text, #334155);--ml-border: var(--nice-text-secondary, #475569);--ml-text: var(--nice-bg-secondary, #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{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}@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}}
@@ -6,4 +6,3 @@ export interface UseNiceAIHintOptions {
6
6
  disabled?: boolean;
7
7
  }
8
8
  export declare function useNiceAIHint(context?: AIHintContext, options?: UseNiceAIHintOptions): AIHintResult;
9
- //# sourceMappingURL=useNiceAIHint.d.ts.map
@@ -62,4 +62,3 @@ export declare function colorControlContext(props: {
62
62
  label?: string;
63
63
  value?: string;
64
64
  }): AIHintContext;
65
- //# sourceMappingURL=wrappers.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nice2dev/ui-ai",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
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",
@@ -12,7 +12,7 @@
12
12
  "import": "./dist/index.mjs",
13
13
  "require": "./dist/index.cjs"
14
14
  },
15
- "./style.css": "./dist/style.css"
15
+ "./style.css": "./dist/ui-ai.css"
16
16
  },
17
17
  "files": [
18
18
  "dist",
@@ -39,8 +39,8 @@
39
39
  "react-dom": ">=17.0.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@nice2dev/ui": "^1.1.5",
43
- "@nice2dev/ui-core": "^1.1.5",
42
+ "@nice2dev/ui": "^1.1.7",
43
+ "@nice2dev/ui-core": "^1.1.7",
44
44
  "@testing-library/jest-dom": "^7.0.1",
45
45
  "@testing-library/react": "^16.3.3",
46
46
  "@types/react": "^19.2.18",