@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 +52 -0
- package/dist/NiceAIHintBubble.d.ts +0 -1
- package/dist/NiceAIProvider.d.ts +0 -1
- package/dist/NiceAccessibilityAI.d.ts +0 -1
- package/dist/NiceChartAI.d.ts +0 -1
- package/dist/NiceCodeEditorAI.d.ts +0 -1
- package/dist/NiceDataGridAI.d.ts +0 -1
- package/dist/NiceDataLabeler.d.ts +0 -1
- package/dist/NiceFormBuilderAI.d.ts +0 -1
- package/dist/NiceIconSuggestorAI.d.ts +0 -1
- package/dist/NiceLayoutAI.d.ts +0 -1
- package/dist/NiceMLStudio.d.ts +0 -1
- package/dist/NiceModelInference.d.ts +0 -1
- package/dist/NiceReportBuilderAI.d.ts +0 -1
- package/dist/NiceThemeGeneratorAI.d.ts +0 -1
- package/dist/NiceWorkflowDesignerAI.d.ts +0 -1
- package/dist/cost-tracker.d.ts +0 -1
- package/dist/fallback-strategies.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/integrations.d.ts +0 -1
- package/dist/llm-providers.d.ts +0 -1
- package/dist/ml-types.d.ts +0 -1
- package/dist/prompt-templates.d.ts +0 -1
- package/dist/rateLimiter.d.ts +0 -1
- package/dist/streaming.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/ui-ai.css +1 -1
- package/dist/useNiceAIHint.d.ts +0 -1
- package/dist/wrappers.d.ts +0 -1
- package/package.json +4 -4
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.
|
package/dist/NiceAIProvider.d.ts
CHANGED
|
@@ -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
|
package/dist/NiceChartAI.d.ts
CHANGED
|
@@ -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
|
package/dist/NiceDataGridAI.d.ts
CHANGED
|
@@ -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
|
|
@@ -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
|
package/dist/NiceLayoutAI.d.ts
CHANGED
|
@@ -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
|
package/dist/NiceMLStudio.d.ts
CHANGED
|
@@ -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
|
package/dist/cost-tracker.d.ts
CHANGED
|
@@ -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
|
package/dist/integrations.d.ts
CHANGED
|
@@ -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
|
package/dist/llm-providers.d.ts
CHANGED
|
@@ -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
|
package/dist/ml-types.d.ts
CHANGED
|
@@ -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
|
package/dist/rateLimiter.d.ts
CHANGED
package/dist/streaming.d.ts
CHANGED
package/dist/types.d.ts
CHANGED
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}}
|
package/dist/useNiceAIHint.d.ts
CHANGED
package/dist/wrappers.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nice2dev/ui-ai",
|
|
3
|
-
"version": "1.1.
|
|
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/
|
|
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.
|
|
43
|
-
"@nice2dev/ui-core": "^1.1.
|
|
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",
|