@optifye/dashboard-core 6.12.0 → 6.12.2
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/dist/index.css +53 -3
- package/dist/index.d.mts +18 -6
- package/dist/index.d.ts +18 -6
- package/dist/index.js +1298 -848
- package/dist/index.mjs +1298 -848
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -592,9 +592,6 @@ body {
|
|
|
592
592
|
.top-0 {
|
|
593
593
|
top: 0px;
|
|
594
594
|
}
|
|
595
|
-
.top-0\.5 {
|
|
596
|
-
top: 0.125rem;
|
|
597
|
-
}
|
|
598
595
|
.top-1 {
|
|
599
596
|
top: 0.25rem;
|
|
600
597
|
}
|
|
@@ -728,6 +725,10 @@ body {
|
|
|
728
725
|
margin-left: -1rem;
|
|
729
726
|
margin-right: -1rem;
|
|
730
727
|
}
|
|
728
|
+
.mx-0\.5 {
|
|
729
|
+
margin-left: 0.125rem;
|
|
730
|
+
margin-right: 0.125rem;
|
|
731
|
+
}
|
|
731
732
|
.mx-1 {
|
|
732
733
|
margin-left: 0.25rem;
|
|
733
734
|
margin-right: 0.25rem;
|
|
@@ -916,6 +917,9 @@ body {
|
|
|
916
917
|
.mt-8 {
|
|
917
918
|
margin-top: 2rem;
|
|
918
919
|
}
|
|
920
|
+
.mt-\[5px\] {
|
|
921
|
+
margin-top: 5px;
|
|
922
|
+
}
|
|
919
923
|
.mt-auto {
|
|
920
924
|
margin-top: auto;
|
|
921
925
|
}
|
|
@@ -1447,6 +1451,9 @@ body {
|
|
|
1447
1451
|
.min-w-0 {
|
|
1448
1452
|
min-width: 0px;
|
|
1449
1453
|
}
|
|
1454
|
+
.min-w-\[100px\] {
|
|
1455
|
+
min-width: 100px;
|
|
1456
|
+
}
|
|
1450
1457
|
.min-w-\[120px\] {
|
|
1451
1458
|
min-width: 120px;
|
|
1452
1459
|
}
|
|
@@ -1686,6 +1693,10 @@ body {
|
|
|
1686
1693
|
--tw-translate-y: -1rem;
|
|
1687
1694
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
1688
1695
|
}
|
|
1696
|
+
.-translate-y-full {
|
|
1697
|
+
--tw-translate-y: -100%;
|
|
1698
|
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
1699
|
+
}
|
|
1689
1700
|
.translate-x-0 {
|
|
1690
1701
|
--tw-translate-x: 0px;
|
|
1691
1702
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
@@ -2510,6 +2521,9 @@ body {
|
|
|
2510
2521
|
--tw-border-opacity: 1;
|
|
2511
2522
|
border-color: rgb(241 245 249 / var(--tw-border-opacity, 1));
|
|
2512
2523
|
}
|
|
2524
|
+
.border-slate-100\/50 {
|
|
2525
|
+
border-color: rgb(241 245 249 / 0.5);
|
|
2526
|
+
}
|
|
2513
2527
|
.border-slate-200 {
|
|
2514
2528
|
--tw-border-opacity: 1;
|
|
2515
2529
|
border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));
|
|
@@ -2517,6 +2531,9 @@ body {
|
|
|
2517
2531
|
.border-slate-200\/60 {
|
|
2518
2532
|
border-color: rgb(226 232 240 / 0.6);
|
|
2519
2533
|
}
|
|
2534
|
+
.border-slate-200\/80 {
|
|
2535
|
+
border-color: rgb(226 232 240 / 0.8);
|
|
2536
|
+
}
|
|
2520
2537
|
.border-slate-300 {
|
|
2521
2538
|
--tw-border-opacity: 1;
|
|
2522
2539
|
border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
|
|
@@ -4320,9 +4337,15 @@ body {
|
|
|
4320
4337
|
.leading-relaxed {
|
|
4321
4338
|
line-height: 1.625;
|
|
4322
4339
|
}
|
|
4340
|
+
.leading-snug {
|
|
4341
|
+
line-height: 1.375;
|
|
4342
|
+
}
|
|
4323
4343
|
.leading-tight {
|
|
4324
4344
|
line-height: 1.25;
|
|
4325
4345
|
}
|
|
4346
|
+
.tracking-\[0\.02em\] {
|
|
4347
|
+
letter-spacing: 0.02em;
|
|
4348
|
+
}
|
|
4326
4349
|
.tracking-\[0\.05em\] {
|
|
4327
4350
|
letter-spacing: 0.05em;
|
|
4328
4351
|
}
|
|
@@ -4598,6 +4621,9 @@ body {
|
|
|
4598
4621
|
--tw-text-opacity: 1;
|
|
4599
4622
|
color: rgb(249 115 22 / var(--tw-text-opacity, 1));
|
|
4600
4623
|
}
|
|
4624
|
+
.text-orange-500\/70 {
|
|
4625
|
+
color: rgb(249 115 22 / 0.7);
|
|
4626
|
+
}
|
|
4601
4627
|
.text-orange-600 {
|
|
4602
4628
|
--tw-text-opacity: 1;
|
|
4603
4629
|
color: rgb(234 88 12 / var(--tw-text-opacity, 1));
|
|
@@ -4864,6 +4890,14 @@ body {
|
|
|
4864
4890
|
var(--tw-ring-shadow, 0 0 #0000),
|
|
4865
4891
|
var(--tw-shadow);
|
|
4866
4892
|
}
|
|
4893
|
+
.shadow-\[0_0_4px_rgba\(251\,146\,60\,0\.5\)\] {
|
|
4894
|
+
--tw-shadow: 0 0 4px rgba(251,146,60,0.5);
|
|
4895
|
+
--tw-shadow-colored: 0 0 4px var(--tw-shadow-color);
|
|
4896
|
+
box-shadow:
|
|
4897
|
+
var(--tw-ring-offset-shadow, 0 0 #0000),
|
|
4898
|
+
var(--tw-ring-shadow, 0 0 #0000),
|
|
4899
|
+
var(--tw-shadow);
|
|
4900
|
+
}
|
|
4867
4901
|
.shadow-\[0_0_4px_rgba\(34\,197\,94\,0\.6\)\] {
|
|
4868
4902
|
--tw-shadow: 0 0 4px rgba(34,197,94,0.6);
|
|
4869
4903
|
--tw-shadow-colored: 0 0 4px var(--tw-shadow-color);
|
|
@@ -4872,6 +4906,14 @@ body {
|
|
|
4872
4906
|
var(--tw-ring-shadow, 0 0 #0000),
|
|
4873
4907
|
var(--tw-shadow);
|
|
4874
4908
|
}
|
|
4909
|
+
.shadow-\[0_0_6px_rgba\(249\,115\,22\,0\.6\)\] {
|
|
4910
|
+
--tw-shadow: 0 0 6px rgba(249,115,22,0.6);
|
|
4911
|
+
--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);
|
|
4912
|
+
box-shadow:
|
|
4913
|
+
var(--tw-ring-offset-shadow, 0 0 #0000),
|
|
4914
|
+
var(--tw-ring-shadow, 0 0 #0000),
|
|
4915
|
+
var(--tw-shadow);
|
|
4916
|
+
}
|
|
4875
4917
|
.shadow-\[0_2px_10px_-3px_rgba\(6\,81\,237\,0\.1\)\] {
|
|
4876
4918
|
--tw-shadow: 0 2px 10px -3px rgba(6,81,237,0.1);
|
|
4877
4919
|
--tw-shadow-colored: 0 2px 10px -3px var(--tw-shadow-color);
|
|
@@ -4996,6 +5038,14 @@ body {
|
|
|
4996
5038
|
--tw-shadow-color: rgb(168 85 247 / 0.4);
|
|
4997
5039
|
--tw-shadow: var(--tw-shadow-colored);
|
|
4998
5040
|
}
|
|
5041
|
+
.shadow-slate-200\/40 {
|
|
5042
|
+
--tw-shadow-color: rgb(226 232 240 / 0.4);
|
|
5043
|
+
--tw-shadow: var(--tw-shadow-colored);
|
|
5044
|
+
}
|
|
5045
|
+
.shadow-slate-200\/50 {
|
|
5046
|
+
--tw-shadow-color: rgb(226 232 240 / 0.5);
|
|
5047
|
+
--tw-shadow: var(--tw-shadow-colored);
|
|
5048
|
+
}
|
|
4999
5049
|
.shadow-slate-400\/40 {
|
|
5000
5050
|
--tw-shadow-color: rgb(148 163 184 / 0.4);
|
|
5001
5051
|
--tw-shadow: var(--tw-shadow-colored);
|
package/dist/index.d.mts
CHANGED
|
@@ -128,6 +128,7 @@ interface LineDetailedMetrics {
|
|
|
128
128
|
underperforming_workspace_uuids: string[];
|
|
129
129
|
output_array: number[];
|
|
130
130
|
output_hourly?: Record<string, number[]>;
|
|
131
|
+
hourly_target_output?: Array<number | null> | null;
|
|
131
132
|
line_threshold: number;
|
|
132
133
|
threshold_pph?: number;
|
|
133
134
|
shift_start?: string;
|
|
@@ -224,6 +225,7 @@ interface WorkspaceDetailedMetrics {
|
|
|
224
225
|
avg_efficiency: number;
|
|
225
226
|
total_actions: number;
|
|
226
227
|
hourly_action_counts: number[];
|
|
228
|
+
hourly_target_output?: Array<number | null> | null;
|
|
227
229
|
hourly_cycle_times?: number[];
|
|
228
230
|
cycle_completion_clip_count?: number | null;
|
|
229
231
|
cycle_time_data_status?: 'available' | 'missing_clips' | null;
|
|
@@ -2978,6 +2980,7 @@ interface HistoricWorkspaceMetrics {
|
|
|
2978
2980
|
output_array?: number[];
|
|
2979
2981
|
idle_time_hourly?: Record<string, string[]>;
|
|
2980
2982
|
hourly_action_counts: number[];
|
|
2983
|
+
hourly_target_output?: Array<number | null> | null;
|
|
2981
2984
|
hourly_cycle_times?: number[];
|
|
2982
2985
|
cycle_completion_clip_count?: number | null;
|
|
2983
2986
|
cycle_time_data_status?: 'available' | 'missing_clips' | null;
|
|
@@ -5642,12 +5645,16 @@ declare const pickPreferredLineMetricsRow: (supabase: {
|
|
|
5642
5645
|
* `backend/backend/services/dashboard_service.py::_combine_line_metrics_rows`.
|
|
5643
5646
|
*
|
|
5644
5647
|
* Per PLAN.md §5 / decision #16:
|
|
5645
|
-
* - Aggregates
|
|
5646
|
-
*
|
|
5647
|
-
*
|
|
5648
|
+
* - Aggregates `current_output` and `ideal_output` sum across
|
|
5649
|
+
* **real-SKU rows only**. Dummy rows contribute 0 — they are skipped
|
|
5650
|
+
* from that summation set.
|
|
5648
5651
|
* - Weighted-average fields (avg_efficiency, avg_cycle_time, threshold_pph)
|
|
5649
5652
|
* use per-row active-minutes as weight; falls back to plain mean when
|
|
5650
5653
|
* no row has positive weight.
|
|
5654
|
+
* - `underperforming_workspaces` is averaged across ACTIVE real rows only
|
|
5655
|
+
* (real row with `current_output > 0 || ideal_output > 0`), rounded
|
|
5656
|
+
* half-up to the nearest whole number. Names / UUIDs are deduped unions
|
|
5657
|
+
* across that same active-real set.
|
|
5651
5658
|
* - Hourly fields (output_hourly, idle_time_hourly) merge through
|
|
5652
5659
|
* `mergeHourlyFields` over the FULL row set (including dummy) so we
|
|
5653
5660
|
* never drop a minute that only the dummy row has data for. Dummy
|
|
@@ -7747,10 +7754,17 @@ declare const CycleTimeOverTimeChart: React__default.FC<CycleTimeOverTimeChartPr
|
|
|
7747
7754
|
interface HourlyOutputChartProps {
|
|
7748
7755
|
data: number[];
|
|
7749
7756
|
pphThreshold: number;
|
|
7757
|
+
/**
|
|
7758
|
+
* Authoritative per-bucket target series from the backend. Explicit `null`
|
|
7759
|
+
* means "hide the target line"; omitted means the chart may fall back to a
|
|
7760
|
+
* local legacy target plan.
|
|
7761
|
+
*/
|
|
7762
|
+
hourlyTargetOutput?: Array<number | null> | null;
|
|
7750
7763
|
shiftStart: string;
|
|
7751
7764
|
shiftEnd?: string;
|
|
7765
|
+
shiftBreaks?: Break[];
|
|
7752
7766
|
showIdleTime?: boolean;
|
|
7753
|
-
idleTimeHourly?: Record<string,
|
|
7767
|
+
idleTimeHourly?: Record<string, any> | null;
|
|
7754
7768
|
idleTimeClips?: IdleTimeClipMetadata[];
|
|
7755
7769
|
idleTimeClipClassifications?: Record<string, ClipClassification>;
|
|
7756
7770
|
shiftDate?: string;
|
|
@@ -8824,7 +8838,6 @@ interface WorkspaceGridItemProps {
|
|
|
8824
8838
|
legend?: EfficiencyLegendUpdate;
|
|
8825
8839
|
}
|
|
8826
8840
|
interface LegendProps {
|
|
8827
|
-
useBottleneckLabel?: boolean;
|
|
8828
8841
|
legend?: EfficiencyLegendUpdate;
|
|
8829
8842
|
metricLabel?: string;
|
|
8830
8843
|
}
|
|
@@ -8884,7 +8897,6 @@ interface VideoCardProps {
|
|
|
8884
8897
|
shouldPlay: boolean;
|
|
8885
8898
|
onClick?: () => void;
|
|
8886
8899
|
onFatalError?: () => void;
|
|
8887
|
-
isVeryLowEfficiency?: boolean;
|
|
8888
8900
|
legend?: EfficiencyLegendUpdate;
|
|
8889
8901
|
cropping?: VideoCroppingRect;
|
|
8890
8902
|
canvasFps?: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -128,6 +128,7 @@ interface LineDetailedMetrics {
|
|
|
128
128
|
underperforming_workspace_uuids: string[];
|
|
129
129
|
output_array: number[];
|
|
130
130
|
output_hourly?: Record<string, number[]>;
|
|
131
|
+
hourly_target_output?: Array<number | null> | null;
|
|
131
132
|
line_threshold: number;
|
|
132
133
|
threshold_pph?: number;
|
|
133
134
|
shift_start?: string;
|
|
@@ -224,6 +225,7 @@ interface WorkspaceDetailedMetrics {
|
|
|
224
225
|
avg_efficiency: number;
|
|
225
226
|
total_actions: number;
|
|
226
227
|
hourly_action_counts: number[];
|
|
228
|
+
hourly_target_output?: Array<number | null> | null;
|
|
227
229
|
hourly_cycle_times?: number[];
|
|
228
230
|
cycle_completion_clip_count?: number | null;
|
|
229
231
|
cycle_time_data_status?: 'available' | 'missing_clips' | null;
|
|
@@ -2978,6 +2980,7 @@ interface HistoricWorkspaceMetrics {
|
|
|
2978
2980
|
output_array?: number[];
|
|
2979
2981
|
idle_time_hourly?: Record<string, string[]>;
|
|
2980
2982
|
hourly_action_counts: number[];
|
|
2983
|
+
hourly_target_output?: Array<number | null> | null;
|
|
2981
2984
|
hourly_cycle_times?: number[];
|
|
2982
2985
|
cycle_completion_clip_count?: number | null;
|
|
2983
2986
|
cycle_time_data_status?: 'available' | 'missing_clips' | null;
|
|
@@ -5642,12 +5645,16 @@ declare const pickPreferredLineMetricsRow: (supabase: {
|
|
|
5642
5645
|
* `backend/backend/services/dashboard_service.py::_combine_line_metrics_rows`.
|
|
5643
5646
|
*
|
|
5644
5647
|
* Per PLAN.md §5 / decision #16:
|
|
5645
|
-
* - Aggregates
|
|
5646
|
-
*
|
|
5647
|
-
*
|
|
5648
|
+
* - Aggregates `current_output` and `ideal_output` sum across
|
|
5649
|
+
* **real-SKU rows only**. Dummy rows contribute 0 — they are skipped
|
|
5650
|
+
* from that summation set.
|
|
5648
5651
|
* - Weighted-average fields (avg_efficiency, avg_cycle_time, threshold_pph)
|
|
5649
5652
|
* use per-row active-minutes as weight; falls back to plain mean when
|
|
5650
5653
|
* no row has positive weight.
|
|
5654
|
+
* - `underperforming_workspaces` is averaged across ACTIVE real rows only
|
|
5655
|
+
* (real row with `current_output > 0 || ideal_output > 0`), rounded
|
|
5656
|
+
* half-up to the nearest whole number. Names / UUIDs are deduped unions
|
|
5657
|
+
* across that same active-real set.
|
|
5651
5658
|
* - Hourly fields (output_hourly, idle_time_hourly) merge through
|
|
5652
5659
|
* `mergeHourlyFields` over the FULL row set (including dummy) so we
|
|
5653
5660
|
* never drop a minute that only the dummy row has data for. Dummy
|
|
@@ -7747,10 +7754,17 @@ declare const CycleTimeOverTimeChart: React__default.FC<CycleTimeOverTimeChartPr
|
|
|
7747
7754
|
interface HourlyOutputChartProps {
|
|
7748
7755
|
data: number[];
|
|
7749
7756
|
pphThreshold: number;
|
|
7757
|
+
/**
|
|
7758
|
+
* Authoritative per-bucket target series from the backend. Explicit `null`
|
|
7759
|
+
* means "hide the target line"; omitted means the chart may fall back to a
|
|
7760
|
+
* local legacy target plan.
|
|
7761
|
+
*/
|
|
7762
|
+
hourlyTargetOutput?: Array<number | null> | null;
|
|
7750
7763
|
shiftStart: string;
|
|
7751
7764
|
shiftEnd?: string;
|
|
7765
|
+
shiftBreaks?: Break[];
|
|
7752
7766
|
showIdleTime?: boolean;
|
|
7753
|
-
idleTimeHourly?: Record<string,
|
|
7767
|
+
idleTimeHourly?: Record<string, any> | null;
|
|
7754
7768
|
idleTimeClips?: IdleTimeClipMetadata[];
|
|
7755
7769
|
idleTimeClipClassifications?: Record<string, ClipClassification>;
|
|
7756
7770
|
shiftDate?: string;
|
|
@@ -8824,7 +8838,6 @@ interface WorkspaceGridItemProps {
|
|
|
8824
8838
|
legend?: EfficiencyLegendUpdate;
|
|
8825
8839
|
}
|
|
8826
8840
|
interface LegendProps {
|
|
8827
|
-
useBottleneckLabel?: boolean;
|
|
8828
8841
|
legend?: EfficiencyLegendUpdate;
|
|
8829
8842
|
metricLabel?: string;
|
|
8830
8843
|
}
|
|
@@ -8884,7 +8897,6 @@ interface VideoCardProps {
|
|
|
8884
8897
|
shouldPlay: boolean;
|
|
8885
8898
|
onClick?: () => void;
|
|
8886
8899
|
onFatalError?: () => void;
|
|
8887
|
-
isVeryLowEfficiency?: boolean;
|
|
8888
8900
|
legend?: EfficiencyLegendUpdate;
|
|
8889
8901
|
cropping?: VideoCroppingRect;
|
|
8890
8902
|
canvasFps?: number;
|