@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 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 (current_output, ideal_output, line_threshold,
5646
- * underperforming_workspaces) sum across **real-SKU rows only**.
5647
- * Dummy rows contribute 0 — they are skipped from the summation set.
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, 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 (current_output, ideal_output, line_threshold,
5646
- * underperforming_workspaces) sum across **real-SKU rows only**.
5647
- * Dummy rows contribute 0 — they are skipped from the summation set.
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, 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;