@rfkit/charts 1.10.1 → 1.10.3

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/index.js CHANGED
@@ -121,9 +121,15 @@ var __webpack_modules__ = {
121
121
  --tw-skew-x: initial;
122
122
  --tw-skew-y: initial;
123
123
  --tw-space-y-reverse: 0;
124
+ --tw-divide-y-reverse: 0;
124
125
  --tw-border-style: solid;
125
126
  --tw-leading: initial;
126
127
  --tw-font-weight: initial;
128
+ --tw-ordinal: initial;
129
+ --tw-slashed-zero: initial;
130
+ --tw-numeric-figure: initial;
131
+ --tw-numeric-spacing: initial;
132
+ --tw-numeric-fraction: initial;
127
133
  --tw-shadow: 0 0 #0000;
128
134
  --tw-shadow-color: initial;
129
135
  --tw-shadow-alpha: 100%;
@@ -202,9 +208,15 @@ var __webpack_modules__ = {
202
208
  --tw-skew-x: initial;
203
209
  --tw-skew-y: initial;
204
210
  --tw-space-y-reverse: 0;
211
+ --tw-divide-y-reverse: 0;
205
212
  --tw-border-style: solid;
206
213
  --tw-leading: initial;
207
214
  --tw-font-weight: initial;
215
+ --tw-ordinal: initial;
216
+ --tw-slashed-zero: initial;
217
+ --tw-numeric-figure: initial;
218
+ --tw-numeric-spacing: initial;
219
+ --tw-numeric-fraction: initial;
208
220
  --tw-shadow: 0 0 #0000;
209
221
  --tw-shadow-color: initial;
210
222
  --tw-shadow-alpha: 100%;
@@ -759,6 +771,14 @@ var __webpack_modules__ = {
759
771
  margin-bottom: calc(var(--spacing) * 2);
760
772
  }
761
773
 
774
+ [data-rfkit-charts-root] .ml-4 {
775
+ margin-left: calc(var(--spacing) * 4);
776
+ }
777
+
778
+ [data-rfkit-charts-root] .ml-6 {
779
+ margin-left: calc(var(--spacing) * 6);
780
+ }
781
+
762
782
  [data-rfkit-charts-root] .ml-\\[-0\\.5px\\] {
763
783
  margin-left: -.5px;
764
784
  }
@@ -811,6 +831,11 @@ var __webpack_modules__ = {
811
831
  display: inline-flex;
812
832
  }
813
833
 
834
+ [data-rfkit-charts-root] .size-2 {
835
+ width: calc(var(--spacing) * 2);
836
+ height: calc(var(--spacing) * 2);
837
+ }
838
+
814
839
  [data-rfkit-charts-root] .size-3 {
815
840
  width: calc(var(--spacing) * 3);
816
841
  height: calc(var(--spacing) * 3);
@@ -939,6 +964,10 @@ var __webpack_modules__ = {
939
964
  max-height: calc(var(--spacing) * 96);
940
965
  }
941
966
 
967
+ [data-rfkit-charts-root] .max-h-\\[var\\(--radix-dropdown-menu-content-available-height\\)\\] {
968
+ max-height: var(--radix-dropdown-menu-content-available-height);
969
+ }
970
+
942
971
  [data-rfkit-charts-root] .min-h-0 {
943
972
  min-height: 0;
944
973
  }
@@ -987,6 +1016,10 @@ var __webpack_modules__ = {
987
1016
  width: calc(var(--spacing) * 9);
988
1017
  }
989
1018
 
1019
+ [data-rfkit-charts-root] .w-10 {
1020
+ width: calc(var(--spacing) * 10);
1021
+ }
1022
+
990
1023
  [data-rfkit-charts-root] .w-14 {
991
1024
  width: calc(var(--spacing) * 14);
992
1025
  }
@@ -1044,6 +1077,10 @@ var __webpack_modules__ = {
1044
1077
  width: 100%;
1045
1078
  }
1046
1079
 
1080
+ [data-rfkit-charts-root] .w-max {
1081
+ width: max-content;
1082
+ }
1083
+
1047
1084
  [data-rfkit-charts-root] .w-px {
1048
1085
  width: 1px;
1049
1086
  }
@@ -1072,6 +1109,10 @@ var __webpack_modules__ = {
1072
1109
  max-width: 520px;
1073
1110
  }
1074
1111
 
1112
+ [data-rfkit-charts-root] .max-w-\\[calc\\(100vw-1rem\\)\\] {
1113
+ max-width: calc(100vw - 1rem);
1114
+ }
1115
+
1075
1116
  [data-rfkit-charts-root] .max-w-full {
1076
1117
  max-width: 100%;
1077
1118
  }
@@ -1351,6 +1392,12 @@ var __webpack_modules__ = {
1351
1392
  gap: var(--size-gap-base);
1352
1393
  }
1353
1394
 
1395
+ [data-rfkit-charts-root] :where(.space-y-0\\.5 > :not(:last-child)) {
1396
+ --tw-space-y-reverse: 0;
1397
+ margin-block-start: calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));
1398
+ margin-block-end: calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)));
1399
+ }
1400
+
1354
1401
  [data-rfkit-charts-root] :where(.space-y-1 > :not(:last-child)) {
1355
1402
  --tw-space-y-reverse: 0;
1356
1403
  margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse));
@@ -1385,6 +1432,24 @@ var __webpack_modules__ = {
1385
1432
  row-gap: calc(var(--spacing) * 2);
1386
1433
  }
1387
1434
 
1435
+ [data-rfkit-charts-root] :where(.divide-y > :not(:last-child)) {
1436
+ --tw-divide-y-reverse: 0;
1437
+ border-bottom-style: var(--tw-border-style);
1438
+ border-top-style: var(--tw-border-style);
1439
+ border-top-width: calc(1px * var(--tw-divide-y-reverse));
1440
+ border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
1441
+ }
1442
+
1443
+ [data-rfkit-charts-root] :where(.divide-border\\/40 > :not(:last-child)) {
1444
+ border-color: var(--border);
1445
+ }
1446
+
1447
+ @supports (color: color-mix(in lab, red, red)) {
1448
+ [data-rfkit-charts-root] :where(.divide-border\\/40 > :not(:last-child)) {
1449
+ border-color: color-mix(in oklab, var(--border) 40%, transparent);
1450
+ }
1451
+ }
1452
+
1388
1453
  [data-rfkit-charts-root] .self-center {
1389
1454
  align-self: center;
1390
1455
  }
@@ -1576,7 +1641,17 @@ var __webpack_modules__ = {
1576
1641
  border-left-color: #0000;
1577
1642
  }
1578
1643
 
1579
- [data-rfkit-charts-root] .bg-accent, [data-rfkit-charts-root] .bg-accent\\/80 {
1644
+ [data-rfkit-charts-root] .bg-accent, [data-rfkit-charts-root] .bg-accent\\/72 {
1645
+ background-color: var(--accent);
1646
+ }
1647
+
1648
+ @supports (color: color-mix(in lab, red, red)) {
1649
+ [data-rfkit-charts-root] .bg-accent\\/72 {
1650
+ background-color: color-mix(in oklab, var(--accent) 72%, transparent);
1651
+ }
1652
+ }
1653
+
1654
+ [data-rfkit-charts-root] .bg-accent\\/80 {
1580
1655
  background-color: var(--accent);
1581
1656
  }
1582
1657
 
@@ -1886,8 +1961,8 @@ var __webpack_modules__ = {
1886
1961
  padding-top: 0;
1887
1962
  }
1888
1963
 
1889
- [data-rfkit-charts-root] .pt-1 {
1890
- padding-top: var(--spacing);
1964
+ [data-rfkit-charts-root] .pt-2 {
1965
+ padding-top: calc(var(--spacing) * 2);
1891
1966
  }
1892
1967
 
1893
1968
  [data-rfkit-charts-root] .pt-\\[calc\\(var\\(--size-gap-base\\)\\/2\\)\\] {
@@ -1922,6 +1997,10 @@ var __webpack_modules__ = {
1922
1997
  padding-left: calc(var(--spacing) * .5);
1923
1998
  }
1924
1999
 
2000
+ [data-rfkit-charts-root] .pl-1 {
2001
+ padding-left: var(--spacing);
2002
+ }
2003
+
1925
2004
  [data-rfkit-charts-root] .pl-8 {
1926
2005
  padding-left: calc(var(--spacing) * 8);
1927
2006
  }
@@ -2021,6 +2100,10 @@ var __webpack_modules__ = {
2021
2100
  font-weight: var(--font-weight-semibold);
2022
2101
  }
2023
2102
 
2103
+ [data-rfkit-charts-root] .break-words {
2104
+ overflow-wrap: break-word;
2105
+ }
2106
+
2024
2107
  [data-rfkit-charts-root] .text-ellipsis {
2025
2108
  text-overflow: ellipsis;
2026
2109
  }
@@ -2105,6 +2188,11 @@ var __webpack_modules__ = {
2105
2188
  color: var(--color-white);
2106
2189
  }
2107
2190
 
2191
+ [data-rfkit-charts-root] .tabular-nums {
2192
+ --tw-numeric-spacing: tabular-nums;
2193
+ font-variant-numeric: var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );
2194
+ }
2195
+
2108
2196
  [data-rfkit-charts-root] .\\[font-variant-numeric\\:tabular-nums\\] {
2109
2197
  font-variant-numeric: tabular-nums;
2110
2198
  }
@@ -2125,6 +2213,10 @@ var __webpack_modules__ = {
2125
2213
  opacity: .3;
2126
2214
  }
2127
2215
 
2216
+ [data-rfkit-charts-root] .opacity-35 {
2217
+ opacity: .35;
2218
+ }
2219
+
2128
2220
  [data-rfkit-charts-root] .opacity-40 {
2129
2221
  opacity: .4;
2130
2222
  }
@@ -2180,6 +2272,20 @@ var __webpack_modules__ = {
2180
2272
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2181
2273
  }
2182
2274
 
2275
+ [data-rfkit-charts-root] .shadow-\\[inset_0_0_0_1px_color-mix\\(in_srgb\\,var\\(--primary\\)_28\\%\\,transparent\\)\\] {
2276
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--primary));
2277
+ }
2278
+
2279
+ @supports (color: color-mix(in lab, red, red)) {
2280
+ [data-rfkit-charts-root] .shadow-\\[inset_0_0_0_1px_color-mix\\(in_srgb\\,var\\(--primary\\)_28\\%\\,transparent\\)\\] {
2281
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, color-mix(in srgb, var(--primary) 28%, transparent));
2282
+ }
2283
+ }
2284
+
2285
+ [data-rfkit-charts-root] .shadow-\\[inset_0_0_0_1px_color-mix\\(in_srgb\\,var\\(--primary\\)_28\\%\\,transparent\\)\\] {
2286
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2287
+ }
2288
+
2183
2289
  [data-rfkit-charts-root] .shadow-lg {
2184
2290
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, #0000001a), 0 4px 6px -4px var(--tw-shadow-color, #0000001a);
2185
2291
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2215,6 +2321,11 @@ var __webpack_modules__ = {
2215
2321
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2216
2322
  }
2217
2323
 
2324
+ [data-rfkit-charts-root] .ring-1 {
2325
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2326
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2327
+ }
2328
+
2218
2329
  [data-rfkit-charts-root] .\\[box-shadow\\:0_0_0_1px_color-mix\\(in_srgb\\,var\\(--background\\)_82\\%\\,transparent\\)\\,[data-rfkit-charts-root] 0_1px_4px_color-mix\\(in_srgb\\,var\\(--foreground\\)_32\\%\\,transparent\\)\\] {
2219
2330
  box-shadow: 0 0 0 1px var(--background), 0 1px 4px var(--foreground);
2220
2331
  }
@@ -2235,6 +2346,20 @@ var __webpack_modules__ = {
2235
2346
  }
2236
2347
  }
2237
2348
 
2349
+ [data-rfkit-charts-root] .ring-background\\/30 {
2350
+ --tw-ring-color: var(--background);
2351
+ }
2352
+
2353
+ @supports (color: color-mix(in lab, red, red)) {
2354
+ [data-rfkit-charts-root] .ring-background\\/30 {
2355
+ --tw-ring-color: color-mix(in oklab, var(--background) 30%, transparent);
2356
+ }
2357
+ }
2358
+
2359
+ [data-rfkit-charts-root] .ring-border {
2360
+ --tw-ring-color: var(--border);
2361
+ }
2362
+
2238
2363
  [data-rfkit-charts-root] .ring-offset-background {
2239
2364
  --tw-ring-offset-color: var(--background);
2240
2365
  }
@@ -2404,6 +2529,10 @@ var __webpack_modules__ = {
2404
2529
  animation-play-state: paused;
2405
2530
  }
2406
2531
 
2532
+ [data-rfkit-charts-root] .ring-inset {
2533
+ --tw-ring-inset: inset;
2534
+ }
2535
+
2407
2536
  [data-rfkit-charts-root] .group-focus-within\\:opacity-90:is(:where(.group):focus-within *) {
2408
2537
  opacity: .9;
2409
2538
  }
@@ -2539,6 +2668,16 @@ var __webpack_modules__ = {
2539
2668
  }
2540
2669
  }
2541
2670
 
2671
+ [data-rfkit-charts-root] .hover\\:bg-accent\\/80:hover {
2672
+ background-color: var(--accent);
2673
+ }
2674
+
2675
+ @supports (color: color-mix(in lab, red, red)) {
2676
+ [data-rfkit-charts-root] .hover\\:bg-accent\\/80:hover {
2677
+ background-color: color-mix(in oklab, var(--accent) 80%, transparent);
2678
+ }
2679
+ }
2680
+
2542
2681
  [data-rfkit-charts-root] .hover\\:bg-background\\/70:hover {
2543
2682
  background-color: var(--background);
2544
2683
  }
@@ -2924,16 +3063,12 @@ var __webpack_modules__ = {
2924
3063
  translate: var(--tw-translate-x) var(--tw-translate-y);
2925
3064
  }
2926
3065
 
2927
- [data-rfkit-charts-root] .data-\\[state\\=checked\\]\\:border-current[data-state="checked"] {
2928
- border-color: currentColor;
2929
- }
2930
-
2931
- [data-rfkit-charts-root] .data-\\[state\\=checked\\]\\:bg-current[data-state="checked"] {
2932
- background-color: currentColor;
3066
+ [data-rfkit-charts-root] .data-\\[state\\=checked\\]\\:border-primary[data-state="checked"] {
3067
+ border-color: var(--primary);
2933
3068
  }
2934
3069
 
2935
- [data-rfkit-charts-root] .data-\\[state\\=checked\\]\\:text-background[data-state="checked"] {
2936
- color: var(--background);
3070
+ [data-rfkit-charts-root] .data-\\[state\\=checked\\]\\:text-primary-foreground[data-state="checked"] {
3071
+ color: var(--primary-foreground, #fff);
2937
3072
  }
2938
3073
 
2939
3074
  [data-rfkit-charts-root] .data-\\[state\\=closed\\]\\:animate-out[data-state="closed"] {
@@ -2948,6 +3083,18 @@ var __webpack_modules__ = {
2948
3083
  --tw-exit-scale: .95;
2949
3084
  }
2950
3085
 
3086
+ [data-rfkit-charts-root] .data-\\[state\\=indeterminate\\]\\:border-primary[data-state="indeterminate"] {
3087
+ border-color: var(--primary);
3088
+ }
3089
+
3090
+ [data-rfkit-charts-root] .data-\\[state\\=indeterminate\\]\\:bg-primary[data-state="indeterminate"] {
3091
+ background-color: var(--primary);
3092
+ }
3093
+
3094
+ [data-rfkit-charts-root] .data-\\[state\\=indeterminate\\]\\:text-primary-foreground[data-state="indeterminate"] {
3095
+ color: var(--primary-foreground, #fff);
3096
+ }
3097
+
2951
3098
  [data-rfkit-charts-root] .data-\\[state\\=open\\]\\:animate-in[data-state="open"] {
2952
3099
  animation: enter var(--tw-animation-duration, var(--tw-duration, .15s)) var(--tw-ease, ease) var(--tw-animation-delay, 0s) var(--tw-animation-iteration-count, 1) var(--tw-animation-direction, normal) var(--tw-animation-fill-mode, none);
2953
3100
  }
@@ -3126,6 +3273,14 @@ var __webpack_modules__ = {
3126
3273
  justify-content: center;
3127
3274
  }
3128
3275
 
3276
+ [data-rfkit-charts-root] .\\[\\&\\>span\\:last-child\\]\\:ml-0 > span:last-child {
3277
+ margin-left: 0;
3278
+ }
3279
+
3280
+ [data-rfkit-charts-root] .\\[\\&\\>span\\:last-child\\]\\:text-primary > span:last-child {
3281
+ color: var(--primary);
3282
+ }
3283
+
3129
3284
  [data-rfkit-charts-root] .\\[\\&\\>svg\\]\\:h-full > svg {
3130
3285
  height: 100%;
3131
3286
  }
@@ -3471,6 +3626,12 @@ var __webpack_modules__ = {
3471
3626
  initial-value: 0;
3472
3627
  }
3473
3628
 
3629
+ @property --tw-divide-y-reverse {
3630
+ syntax: "*";
3631
+ inherits: false;
3632
+ initial-value: 0;
3633
+ }
3634
+
3474
3635
  @property --tw-border-style {
3475
3636
  syntax: "*";
3476
3637
  inherits: false;
@@ -3487,6 +3648,31 @@ var __webpack_modules__ = {
3487
3648
  inherits: false
3488
3649
  }
3489
3650
 
3651
+ @property --tw-ordinal {
3652
+ syntax: "*";
3653
+ inherits: false
3654
+ }
3655
+
3656
+ @property --tw-slashed-zero {
3657
+ syntax: "*";
3658
+ inherits: false
3659
+ }
3660
+
3661
+ @property --tw-numeric-figure {
3662
+ syntax: "*";
3663
+ inherits: false
3664
+ }
3665
+
3666
+ @property --tw-numeric-spacing {
3667
+ syntax: "*";
3668
+ inherits: false
3669
+ }
3670
+
3671
+ @property --tw-numeric-fraction {
3672
+ syntax: "*";
3673
+ inherits: false
3674
+ }
3675
+
3490
3676
  @property --tw-shadow {
3491
3677
  syntax: "*";
3492
3678
  inherits: false;
@@ -5789,6 +5975,7 @@ function createParams() {
5789
5975
  show: true,
5790
5976
  display: false,
5791
5977
  data: [],
5978
+ hiddenCategoryKeys: [],
5792
5979
  onChange: ()=>{}
5793
5980
  },
5794
5981
  signalAnalysis: {
@@ -17401,14 +17588,15 @@ const ScrollBar = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(({
17401
17588
  })
17402
17589
  }));
17403
17590
  ScrollBar.displayName = ScrollAreaScrollbar.displayName;
17404
- const scroll_area_ScrollArea = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(({ className, children, ...props }, ref)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(react_scroll_area_dist_Root, {
17591
+ const scroll_area_ScrollArea = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(({ className, viewportClassName, children, ...props }, ref)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(react_scroll_area_dist_Root, {
17405
17592
  ref: ref,
17406
17593
  "data-slot": "scroll-area",
17407
17594
  className: cn_cn('relative overflow-hidden', className),
17408
17595
  ...props,
17409
17596
  children: [
17410
17597
  /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Viewport, {
17411
- className: "h-full w-full rounded-[inherit]",
17598
+ "data-slot": "scroll-area-viewport",
17599
+ className: cn_cn('h-full w-full rounded-[inherit]', viewportClassName),
17412
17600
  children: children
17413
17601
  }),
17414
17602
  /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ScrollBar, {}),
@@ -18114,7 +18302,7 @@ const Tooltip_Tooltip = ({ children, content, delay = 200, duration = 3000, offs
18114
18302
  });
18115
18303
  };
18116
18304
  const Overlay_Tooltip = Tooltip_Tooltip;
18117
- const Dropdown_Dropdown = ({ value: value1, options, onChange, placeholder = "\u8BF7\u9009\u62E9", triggerContent, triggerTitle, closeOnSelect = true, triggerVariant = 'default', showChevron = true, triggerClassName, contentClassName })=>{
18305
+ const Dropdown_Dropdown = ({ value: value1, options, onChange, placeholder = "\u8BF7\u9009\u62E9", triggerContent, triggerTitle, closeOnSelect = true, triggerVariant = 'default', showChevron = true, triggerClassName, contentClassName, contentAlignOffset, customContent, triggerTestId })=>{
18118
18306
  const [open, setOpen] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(false);
18119
18307
  const handleSelect = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((option)=>{
18120
18308
  const nextValue = option.value ?? null;
@@ -18144,6 +18332,7 @@ const Dropdown_Dropdown = ({ value: value1, options, onChange, placeholder = "\u
18144
18332
  asChild: true,
18145
18333
  children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("button", {
18146
18334
  type: "button",
18335
+ "data-testid": triggerTestId,
18147
18336
  className: cn_cn('cursor-pointer appearance-none select-none border-0 bg-transparent text-left', 'default' === triggerVariant && TOOLBAR_OUTLINED_TRIGGER_CLASS_NAME, 'default' === triggerVariant && TOOLBAR_OUTLINED_TRIGGER_OPEN_CLASS_NAME, 'plain' === triggerVariant && TOOLBAR_INLINE_TRIGGER_CLASS_NAME, triggerClassName),
18148
18337
  children: [
18149
18338
  resolvedTriggerContent,
@@ -18166,10 +18355,11 @@ const Dropdown_Dropdown = ({ value: value1, options, onChange, placeholder = "\u
18166
18355
  }) : triggerNode,
18167
18356
  /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dropdown_menu_DropdownMenuContent, {
18168
18357
  align: "start",
18358
+ alignOffset: contentAlignOffset,
18169
18359
  collisionPadding: 8,
18170
18360
  className: cn_cn('min-w-[140px] [min-width:var(--radix-dropdown-menu-trigger-width)]', contentClassName),
18171
- children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(scroll_area_ScrollArea, {
18172
- className: "max-h-64",
18361
+ children: customContent ?? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(scroll_area_ScrollArea, {
18362
+ viewportClassName: "h-auto max-h-64",
18173
18363
  children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
18174
18364
  children: options.map((option, index)=>'separator' === option.type ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dropdown_menu_DropdownMenuSeparator, {
18175
18365
  style: option.style
@@ -18697,6 +18887,7 @@ const ToolbarGroupSeparator = ({ className })=>/*#__PURE__*/ (0, __WEBPACK_EXTER
18697
18887
  className: cn_cn(TOOLBAR_GROUP_SEPARATOR_CLASS_NAME, className),
18698
18888
  orientation: "vertical"
18699
18889
  });
18890
+ const TOOLBAR_DROPDOWN_GROUP_ALIGN_OFFSET = -27;
18700
18891
  const ToolbarDropdown = (props)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Dropdown, {
18701
18892
  ...props,
18702
18893
  triggerVariant: "default",
@@ -18718,13 +18909,14 @@ const ToolbarIconDropdown = ({ icon, title, triggerClassName, ...props })=>{
18718
18909
  triggerContent: iconNode
18719
18910
  });
18720
18911
  };
18721
- const ToolbarDropdownGroup = ({ leading, triggerClassName, ...props })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(ToolbarGroup, {
18912
+ const ToolbarDropdownGroup = ({ leading, triggerClassName, contentAlignOffset = TOOLBAR_DROPDOWN_GROUP_ALIGN_OFFSET, ...props })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(ToolbarGroup, {
18722
18913
  children: [
18723
18914
  leading,
18724
18915
  /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Dropdown, {
18725
18916
  ...props,
18726
18917
  triggerVariant: "plain",
18727
18918
  contentClassName: cn_cn(TOOLBAR_DROPDOWN_CONTENT_CLASS_NAME, props.contentClassName),
18919
+ contentAlignOffset: contentAlignOffset,
18728
18920
  triggerClassName: cn_cn(TOOLBAR_INLINE_INSET_CLASS_NAME, triggerClassName)
18729
18921
  })
18730
18922
  ]
@@ -22846,28 +23038,196 @@ const OccupancyCursorPopover = ({ id })=>{
22846
23038
  });
22847
23039
  };
22848
23040
  const Occupancy_CursorPopover = OccupancyCursorPopover;
23041
+ const SignalType = {
23042
+ LEGITIMATE: 'Legitimate',
23043
+ UNKNOWN: 'UnKnown',
23044
+ KNOWN: 'Know',
23045
+ VIOLATION: 'Violation',
23046
+ ILLEGAL: 'Illegal'
23047
+ };
22849
23048
  const SIGNAL_TYPE_MAP = {
22850
23049
  Legitimate: {
22851
23050
  name: "\u5408\u6CD5",
22852
- color: '#52c41a',
23051
+ color: 'var(--success)',
22853
23052
  isLegitimate: true
22854
23053
  },
23054
+ UnKnown: {
23055
+ name: "\u672A\u77E5",
23056
+ color: 'var(--muted-foreground)',
23057
+ isLegitimate: false
23058
+ },
22855
23059
  Know: {
22856
23060
  name: "\u5DF2\u77E5",
22857
- color: '#ff9900',
23061
+ color: 'var(--primary)',
22858
23062
  isLegitimate: true
22859
23063
  },
22860
- UnKnown: {
22861
- name: "\u672A\u77E5",
22862
- color: '#bfbfbf',
23064
+ Violation: {
23065
+ name: "\u8FDD\u89C4",
23066
+ color: 'var(--warning)',
22863
23067
  isLegitimate: false
22864
23068
  },
22865
23069
  Illegal: {
22866
- name: "\u4E0D\u5408\u6CD5",
22867
- color: '#f5222d',
23070
+ name: "\u975E\u6CD5",
23071
+ color: 'var(--destructive)',
22868
23072
  isLegitimate: false
22869
23073
  }
22870
23074
  };
23075
+ const SIGNAL_TYPE_ORDER = [
23076
+ SignalType.LEGITIMATE,
23077
+ SignalType.UNKNOWN,
23078
+ SignalType.KNOWN,
23079
+ SignalType.VIOLATION,
23080
+ SignalType.ILLEGAL
23081
+ ];
23082
+ const normalizeSignalType = (value1)=>{
23083
+ if ('string' == typeof value1 && SIGNAL_TYPE_ORDER.includes(value1)) return value1;
23084
+ return SignalType.UNKNOWN;
23085
+ };
23086
+ const SIGNAL_LEVEL_UNASSIGNED = -1;
23087
+ const SIGNAL_LEVEL_FIRST = 0;
23088
+ const SIGNAL_LEVEL_SECOND = 1;
23089
+ const SIGNAL_LEVEL_THIRD = 2;
23090
+ const SIGNAL_LEVEL_ORDER = [
23091
+ SIGNAL_LEVEL_UNASSIGNED,
23092
+ SIGNAL_LEVEL_FIRST,
23093
+ SIGNAL_LEVEL_SECOND,
23094
+ SIGNAL_LEVEL_THIRD
23095
+ ];
23096
+ const SIGNAL_LEVEL_MAP = {
23097
+ [SIGNAL_LEVEL_UNASSIGNED]: {
23098
+ name: "\u672A\u5206\u914D",
23099
+ color: 'color-mix(in oklab, var(--success) 35%, var(--background))'
23100
+ },
23101
+ [SIGNAL_LEVEL_FIRST]: {
23102
+ name: "\u4E00\u7EA7",
23103
+ color: 'color-mix(in oklab, var(--success) 55%, var(--background))'
23104
+ },
23105
+ [SIGNAL_LEVEL_SECOND]: {
23106
+ name: "\u4E8C\u7EA7",
23107
+ color: 'color-mix(in oklab, var(--success) 75%, var(--background))'
23108
+ },
23109
+ [SIGNAL_LEVEL_THIRD]: {
23110
+ name: "\u4E09\u7EA7",
23111
+ color: 'var(--success)'
23112
+ }
23113
+ };
23114
+ const normalizeSignalLevel = (value1)=>{
23115
+ if ('number' != typeof value1 || !Number.isInteger(value1)) return SIGNAL_LEVEL_UNASSIGNED;
23116
+ if (value1 === SIGNAL_LEVEL_UNASSIGNED || value1 === SIGNAL_LEVEL_FIRST || value1 === SIGNAL_LEVEL_SECOND || value1 === SIGNAL_LEVEL_THIRD) return value1;
23117
+ return SIGNAL_LEVEL_UNASSIGNED;
23118
+ };
23119
+ const resolveSignalColor = (item)=>{
23120
+ if (item.color) return item.color;
23121
+ const signalType = normalizeSignalType(item.signalType);
23122
+ if ('simple' === item.source && signalType === SignalType.LEGITIMATE) return SIGNAL_LEVEL_MAP[normalizeSignalLevel(item.level)].color;
23123
+ return SIGNAL_TYPE_MAP[signalType].color;
23124
+ };
23125
+ const SIGNAL_SOURCE_ORDER = [
23126
+ 'station',
23127
+ 'simple'
23128
+ ];
23129
+ const SIGNAL_SOURCE_LABEL = {
23130
+ station: "\u53F0\u7AD9\u5E93",
23131
+ simple: "\u4FE1\u53F7\u5E93"
23132
+ };
23133
+ function tree_isStationInfo(item) {
23134
+ return 'signalName' in item && 'orgName' in item;
23135
+ }
23136
+ const resolveSignalSource = (item)=>tree_isStationInfo(item) ? 'station' : 'simple';
23137
+ const getSignalLeafKey = (item)=>`${resolveSignalSource(item)}:${normalizeSignalType(item.signalType)}:${normalizeSignalLevel(item.level)}`;
23138
+ function getUnifiedSignalKey(item) {
23139
+ const source = resolveSignalSource(item);
23140
+ if (item.id) return `${source}:${item.id}`;
23141
+ if (tree_isStationInfo(item)) return `${source}:${item.signalName}-${item.frequency}`;
23142
+ if (null != item.startFrequency && null != item.stopFrequency) return `${source}:${item.startFrequency}-${item.stopFrequency}`;
23143
+ return `${source}:${item.frequency}-${item.bandwidth}`;
23144
+ }
23145
+ const buildSignalTree = (signalItems)=>{
23146
+ const leafKeysWithData = new Set(signalItems.map(getSignalLeafKey));
23147
+ const sources = [];
23148
+ for (const source of SIGNAL_SOURCE_ORDER){
23149
+ const sourceDataLeafKeys = [
23150
+ ...leafKeysWithData
23151
+ ].filter((key)=>key.startsWith(`${source}:`));
23152
+ if (0 === sourceDataLeafKeys.length) continue;
23153
+ if ('station' === source) {
23154
+ sources.push({
23155
+ source,
23156
+ label: SIGNAL_SOURCE_LABEL[source],
23157
+ leafKeys: sourceDataLeafKeys,
23158
+ dataLeafKeys: sourceDataLeafKeys,
23159
+ hasData: true,
23160
+ types: []
23161
+ });
23162
+ continue;
23163
+ }
23164
+ const types = SIGNAL_TYPE_ORDER.flatMap((signalType)=>{
23165
+ const levels = SIGNAL_LEVEL_ORDER.map((level)=>{
23166
+ const leafKey = `${source}:${signalType}:${level}`;
23167
+ return {
23168
+ level,
23169
+ label: SIGNAL_LEVEL_MAP[level].name,
23170
+ leafKey,
23171
+ hasData: leafKeysWithData.has(leafKey)
23172
+ };
23173
+ });
23174
+ const leafKeys = levels.map((level)=>level.leafKey);
23175
+ const dataLeafKeys = leafKeys.filter((key)=>leafKeysWithData.has(key));
23176
+ if (0 === dataLeafKeys.length) return [];
23177
+ return {
23178
+ signalType,
23179
+ label: SIGNAL_TYPE_MAP[signalType].name,
23180
+ leafKeys,
23181
+ dataLeafKeys,
23182
+ hasData: dataLeafKeys.length > 0,
23183
+ levels: signalType === SignalType.LEGITIMATE ? levels.filter((level)=>level.hasData) : []
23184
+ };
23185
+ });
23186
+ if (0 === types.length) continue;
23187
+ const leafKeys = types.flatMap((type)=>type.leafKeys);
23188
+ const dataLeafKeys = leafKeys.filter((key)=>leafKeysWithData.has(key));
23189
+ sources.push({
23190
+ source,
23191
+ label: SIGNAL_SOURCE_LABEL[source],
23192
+ leafKeys,
23193
+ dataLeafKeys,
23194
+ hasData: true,
23195
+ types
23196
+ });
23197
+ }
23198
+ return {
23199
+ sources
23200
+ };
23201
+ };
23202
+ const resolveNodeCheckState = (leafKeysWithData, hiddenCategoryKeys, fixedLeafKeys)=>{
23203
+ const dataLeafKeys = fixedLeafKeys.filter((key)=>leafKeysWithData.has(key));
23204
+ if (0 === dataLeafKeys.length) return 'disabled';
23205
+ const hiddenCount = dataLeafKeys.filter((key)=>hiddenCategoryKeys.has(key)).length;
23206
+ if (0 === hiddenCount) return 'checked';
23207
+ if (hiddenCount === dataLeafKeys.length) return 'unchecked';
23208
+ return 'indeterminate';
23209
+ };
23210
+ const toggleNodeHiddenKeys = (hiddenCategoryKeys, fixedLeafKeys, leafKeysWithData)=>{
23211
+ const next = new Set(hiddenCategoryKeys);
23212
+ const dataLeafKeys = fixedLeafKeys.filter((key)=>leafKeysWithData.has(key));
23213
+ const hiddenDataCount = dataLeafKeys.filter((key)=>next.has(key)).length;
23214
+ const allDataVisible = dataLeafKeys.length > 0 && 0 === hiddenDataCount;
23215
+ if (allDataVisible) {
23216
+ for (const key of fixedLeafKeys)next.add(key);
23217
+ return [
23218
+ ...next
23219
+ ];
23220
+ }
23221
+ for (const key of fixedLeafKeys)next.delete(key);
23222
+ return [
23223
+ ...next
23224
+ ];
23225
+ };
23226
+ const filterSignalItemsByHiddenKeys = (signalItems, hiddenCategoryKeys)=>{
23227
+ if (!hiddenCategoryKeys.length) return signalItems;
23228
+ const hiddenKeys = new Set(hiddenCategoryKeys);
23229
+ return signalItems.filter((item)=>!hiddenKeys.has(getSignalLeafKey(item)));
23230
+ };
22871
23231
  const SIGNAL_INDEX_MATCH_TOLERANCE = 1;
22872
23232
  const getRangeCenter = (range)=>(range.startFreq + range.stopFreq) / 2;
22873
23233
  const getRangeWidth = (range)=>Math.abs(range.stopFreq - range.startFreq);
@@ -22885,7 +23245,7 @@ const compareFrequencyMatchedCandidates = (currentFrequency, a, b)=>{
22885
23245
  if (0 !== widthDiff) return widthDiff;
22886
23246
  const centerDistanceDiff = Math.abs(getRangeCenter(a.range) - currentFrequency) - Math.abs(getRangeCenter(b.range) - currentFrequency);
22887
23247
  if (0 !== centerDistanceDiff) return centerDistanceDiff;
22888
- const stationPriorityDiff = Number(utils_isStationInfo(b.item)) - Number(utils_isStationInfo(a.item));
23248
+ const stationPriorityDiff = Number(tree_isStationInfo(b.item)) - Number(tree_isStationInfo(a.item));
22889
23249
  if (0 !== stationPriorityDiff) return stationPriorityDiff;
22890
23250
  return getUnifiedSignalKey(a.item).localeCompare(getUnifiedSignalKey(b.item));
22891
23251
  };
@@ -22896,18 +23256,10 @@ const compareIndexMatchedCandidates = (currentFrequency, currentPointIndex, a, b
22896
23256
  if (0 !== widthDiff) return widthDiff;
22897
23257
  const frequencyDistanceDiff = getFrequencyDistanceToRange(currentFrequency, a.range) - getFrequencyDistanceToRange(currentFrequency, b.range);
22898
23258
  if (0 !== frequencyDistanceDiff) return frequencyDistanceDiff;
22899
- const stationPriorityDiff = Number(utils_isStationInfo(b.item)) - Number(utils_isStationInfo(a.item));
23259
+ const stationPriorityDiff = Number(tree_isStationInfo(b.item)) - Number(tree_isStationInfo(a.item));
22900
23260
  if (0 !== stationPriorityDiff) return stationPriorityDiff;
22901
23261
  return getUnifiedSignalKey(a.item).localeCompare(getUnifiedSignalKey(b.item));
22902
23262
  };
22903
- function utils_isStationInfo(item) {
22904
- return 'signalName' in item && 'orgName' in item;
22905
- }
22906
- function getUnifiedSignalKey(item) {
22907
- if (utils_isStationInfo(item)) return `${item.signalName}-${item.frequency}`;
22908
- if (null != item.startFrequency && null != item.stopFrequency) return `${item.startFrequency}-${item.stopFrequency}`;
22909
- return `${item.frequency}-${item.bandwidth}`;
22910
- }
22911
23263
  function toFrequencyRangeInput(item) {
22912
23264
  return {
22913
23265
  frequency: null != item.frequency ? Number(item.frequency) : void 0,
@@ -22916,7 +23268,7 @@ function toFrequencyRangeInput(item) {
22916
23268
  stopFrequency: null != item.stopFrequency ? Number(item.stopFrequency) : void 0
22917
23269
  };
22918
23270
  }
22919
- function utils_resolveBestSignalMatch(candidates, options) {
23271
+ function match_resolveBestSignalMatch(candidates, options) {
22920
23272
  const { currentFrequency, currentPointIndex } = options;
22921
23273
  const indexTolerance = options.indexTolerance ?? SIGNAL_INDEX_MATCH_TOLERANCE;
22922
23274
  if (!Number.isFinite(currentFrequency) || !Number.isFinite(currentPointIndex) || !candidates.length) return;
@@ -22928,24 +23280,39 @@ function utils_resolveBestSignalMatch(candidates, options) {
22928
23280
  }, indexTolerance)).sort((a, b)=>compareIndexMatchedCandidates(currentFrequency, currentPointIndex, a, b));
22929
23281
  return indexMatched[0];
22930
23282
  }
23283
+ const resolveFrequencyPresentation = (item)=>{
23284
+ if (null != item.frequency) return `${item.frequency}MHz`;
23285
+ if (null != item.startFrequency && null != item.stopFrequency) return `${item.startFrequency}-${item.stopFrequency}MHz`;
23286
+ };
22931
23287
  const resolveSignalPresentation = (item)=>{
22932
- if (utils_isStationInfo(item)) {
22933
- const signalType = item.signalType;
22934
- const signalTypeInfo = SIGNAL_TYPE_MAP[signalType];
22935
- const signalTypeName = signalTypeInfo?.name || item.signalType;
22936
- return {
22937
- color: signalTypeInfo?.color || 'var(--primary)',
22938
- tooltip: [
22939
- item.signalName,
22940
- `${item.frequency}MHz`,
22941
- item.orgName && `\u{5355}\u{4F4D}: ${item.orgName}`,
22942
- signalTypeName && `\u{7C7B}\u{578B}: ${signalTypeName}`
22943
- ].filter(Boolean).join(' | ')
22944
- };
22945
- }
23288
+ const source = resolveSignalSource(item);
23289
+ const signalType = normalizeSignalType(item.signalType);
23290
+ const signalTypeName = SIGNAL_TYPE_MAP[signalType].name;
23291
+ const levelName = SIGNAL_LEVEL_MAP[normalizeSignalLevel(item.level)].name;
23292
+ const color = resolveSignalColor({
23293
+ ...item,
23294
+ source
23295
+ });
23296
+ const frequencyText = resolveFrequencyPresentation(item);
23297
+ const bandwidthText = null != item.bandwidth ? `\u{5E26}\u{5BBD}: ${item.bandwidth}kHz` : void 0;
23298
+ if (tree_isStationInfo(item)) return {
23299
+ color,
23300
+ tooltip: [
23301
+ item.signalName,
23302
+ frequencyText,
23303
+ item.orgName && `\u{5355}\u{4F4D}: ${item.orgName}`,
23304
+ signalTypeName && `\u{7C7B}\u{578B}: ${signalTypeName}`
23305
+ ].filter(Boolean).join(' | ')
23306
+ };
22946
23307
  return {
22947
- color: item.color || 'var(--primary)',
22948
- tooltip: void 0
23308
+ color,
23309
+ tooltip: [
23310
+ SIGNAL_SOURCE_LABEL[source],
23311
+ frequencyText,
23312
+ bandwidthText,
23313
+ signalTypeName && `\u{7C7B}\u{578B}: ${signalTypeName}`,
23314
+ signalType === SignalType.LEGITIMATE && levelName && `\u{7B49}\u{7EA7}: ${levelName}`
23315
+ ].filter(Boolean).join(' | ')
22949
23316
  };
22950
23317
  };
22951
23318
  const resolveSignalMatchCandidates = (signalItems, segment)=>signalItems.flatMap((item)=>{
@@ -23001,26 +23368,23 @@ const resolveActiveSignalKey = ({ segmentData, isCursorActive, currentFrequency,
23001
23368
  if (!isCursorActive || !Number.isFinite(currentFrequency) || currentPosition.segmentIndex < 0) return;
23002
23369
  const currentSegmentData = segmentData[currentPosition.segmentIndex];
23003
23370
  if (!currentSegmentData) return;
23004
- return utils_resolveBestSignalMatch(currentSegmentData.signalPositions, {
23371
+ return match_resolveBestSignalMatch(currentSegmentData.signalPositions, {
23005
23372
  currentFrequency,
23006
23373
  currentPointIndex: currentPosition.pointIndex
23007
23374
  })?.key;
23008
23375
  };
23009
- const createStationRangeIndex = ({ signalItems, segments })=>{
23376
+ const createSignalRangeIndex = ({ signalItems, segments })=>{
23010
23377
  if (!signalItems.length || !segments.length) return [];
23011
- const stationItems = signalItems.filter(utils_isStationInfo);
23012
- if (!stationItems.length) return [];
23013
- return segments.map((segment)=>resolveSignalMatchCandidates(stationItems, segment));
23378
+ return segments.map((segment)=>resolveSignalMatchCandidates(signalItems, segment));
23014
23379
  };
23015
- const findStationInRangeIndex = ({ frequency, stationRangeIndex, currentPosition })=>{
23380
+ const findSignalInRangeIndex = ({ frequency, signalRangeIndex, currentPosition })=>{
23016
23381
  if (!Number.isFinite(frequency)) return;
23017
- const candidates = stationRangeIndex[currentPosition.segmentIndex];
23382
+ const candidates = signalRangeIndex[currentPosition.segmentIndex];
23018
23383
  if (!candidates?.length) return;
23019
- const matchedSignal = utils_resolveBestSignalMatch(candidates, {
23384
+ return match_resolveBestSignalMatch(candidates, {
23020
23385
  currentFrequency: frequency,
23021
23386
  currentPointIndex: currentPosition.pointIndex
23022
- });
23023
- return matchedSignal && utils_isStationInfo(matchedSignal.item) ? matchedSignal.item : void 0;
23387
+ })?.item;
23024
23388
  };
23025
23389
  const withStationDataUpdate = (globalID, name, func)=>{
23026
23390
  const subscriptionId = `stationData-update-${globalID}`;
@@ -23035,11 +23399,12 @@ const STATION_DATA = (globalID, data)=>{
23035
23399
  }
23036
23400
  return result;
23037
23401
  };
23038
- function useUnifiedSignals({ respectVisibility = false } = {}) {
23402
+ function useUnifiedSignals({ respectVisibility = false, filterHidden = true } = {}) {
23039
23403
  const globalID = useStore_useSelector((state)=>state.globalID);
23040
23404
  const signalData = useStore_useSelector((state)=>state.signal.data);
23041
23405
  const signalDisplay = useStore_useSelector((state)=>state.signal.display);
23042
23406
  const signalShow = useStore_useSelector((state)=>state.signal.show);
23407
+ const hiddenCategoryKeys = useStore_useSelector((state)=>state.signal.hiddenCategoryKeys);
23043
23408
  const [updateTrigger, setUpdateTrigger] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(0);
23044
23409
  (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{
23045
23410
  const subscriberName = `useUnifiedSignals-${globalID}-${Date.now()}`;
@@ -23058,32 +23423,44 @@ function useUnifiedSignals({ respectVisibility = false } = {}) {
23058
23423
  if (respectVisibility && (!signalShow || !signalDisplay)) return [];
23059
23424
  const stationData = STATION_DATA(globalID);
23060
23425
  const nextSignalData = signalData || [];
23061
- return [
23426
+ const combined = [
23062
23427
  ...stationData,
23063
23428
  ...nextSignalData
23064
23429
  ];
23430
+ if (!filterHidden || !hiddenCategoryKeys?.length) return combined;
23431
+ return filterSignalItemsByHiddenKeys(combined, hiddenCategoryKeys);
23065
23432
  }, [
23066
23433
  globalID,
23067
23434
  signalData,
23068
23435
  signalDisplay,
23069
23436
  signalShow,
23070
23437
  respectVisibility,
23438
+ filterHidden,
23439
+ hiddenCategoryKeys,
23071
23440
  updateTrigger
23072
23441
  ]);
23073
23442
  }
23074
- function useStationInfoAtCursor({ frequency, enabled = true, cursorSample }) {
23443
+ const useSignalMatchAtCursor = ({ frequency, enabled = true, cursorSample }, source)=>{
23075
23444
  const cursor = useStore_useSelector((state)=>state.cursor);
23076
23445
  const segments = useStore_useSelector((state)=>state.segments);
23077
23446
  const left = cursorSample?.coord.left ?? cursor.coord.left;
23078
23447
  const signalItems = useUnifiedSignals({
23079
23448
  respectVisibility: enabled
23080
23449
  });
23081
- const stationRangeIndex = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>createStationRangeIndex({
23082
- signalItems,
23450
+ const matchingSignalItems = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>{
23451
+ if (!enabled) return [];
23452
+ return 'station' === source ? signalItems.filter(tree_isStationInfo) : signalItems;
23453
+ }, [
23454
+ enabled,
23455
+ signalItems,
23456
+ source
23457
+ ]);
23458
+ const signalRangeIndex = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>createSignalRangeIndex({
23459
+ signalItems: matchingSignalItems,
23083
23460
  segments
23084
23461
  }), [
23085
- segments,
23086
- signalItems
23462
+ matchingSignalItems,
23463
+ segments
23087
23464
  ]);
23088
23465
  const isCursorActive = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>enabled && (cursorSample ? true : cursor_hasActiveSpectrumCursor(cursor)), [
23089
23466
  cursor,
@@ -23099,100 +23476,142 @@ function useStationInfoAtCursor({ frequency, enabled = true, cursorSample }) {
23099
23476
  segments
23100
23477
  ]);
23101
23478
  return (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>{
23102
- if (!enabled || 'number' != typeof left || !Number.isFinite(left) || left < 0 || !stationRangeIndex.length || !segments?.length) return;
23479
+ if (!enabled || 'number' != typeof left || !Number.isFinite(left) || left < 0 || !signalRangeIndex.length || !segments?.length) return;
23103
23480
  if (!isCursorActive) return;
23104
23481
  const currentFrequency = frequencyCalculation_getCursorFrequencyAtPosition(segments, currentPosition);
23105
23482
  if (!Number.isFinite(currentFrequency)) {
23106
23483
  const fallbackFrequency = Number(frequency);
23107
23484
  if (!Number.isFinite(fallbackFrequency)) return;
23108
- return findStationInRangeIndex({
23485
+ return findSignalInRangeIndex({
23109
23486
  frequency: fallbackFrequency,
23110
- stationRangeIndex,
23487
+ signalRangeIndex,
23111
23488
  currentPosition
23112
23489
  });
23113
23490
  }
23114
- return findStationInRangeIndex({
23491
+ return findSignalInRangeIndex({
23115
23492
  frequency: currentFrequency,
23116
- stationRangeIndex,
23493
+ signalRangeIndex,
23117
23494
  currentPosition
23118
23495
  });
23119
23496
  }, [
23120
23497
  enabled,
23121
23498
  frequency,
23122
- stationRangeIndex,
23499
+ signalRangeIndex,
23123
23500
  segments,
23124
23501
  currentPosition,
23125
23502
  left,
23126
23503
  isCursorActive
23127
23504
  ]);
23505
+ };
23506
+ function useSignalInfoAtCursor(props) {
23507
+ return useSignalMatchAtCursor(props, 'all');
23128
23508
  }
23129
- const StationInfoPanel = ({ stationInfo })=>{
23130
- const signalTypeInfo = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>{
23131
- if (!stationInfo?.signalType) return null;
23132
- return SIGNAL_TYPE_MAP[stationInfo.signalType];
23133
- }, [
23134
- stationInfo?.signalType
23135
- ]);
23136
- const signalColor = signalTypeInfo?.color;
23137
- const signalTypeName = signalTypeInfo?.name || stationInfo?.signalType;
23138
- if (!stationInfo) return null;
23139
- return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23140
- className: "mt-1 border-t border-dashed border-border/70 pt-1 text-xs leading-5 text-foreground",
23509
+ const SignalInfoRow = ({ label, value: value1, tabular = false })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23510
+ className: `flex gap-2${tabular ? ' tabular-nums' : ''}`,
23141
23511
  children: [
23142
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23143
- children: [
23144
- "\u540D\u79F0\uFF1A",
23145
- stationInfo.signalName
23146
- ]
23512
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
23513
+ className: "w-10 shrink-0 text-muted-foreground",
23514
+ children: label
23147
23515
  }),
23148
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23149
- children: [
23150
- "\u5355\u4F4D\uFF1A",
23151
- stationInfo.orgName
23152
- ]
23153
- }),
23154
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23155
- children: [
23156
- "\u9891\u7387\uFF1A",
23157
- stationInfo.frequency,
23158
- "MHz"
23159
- ]
23160
- }),
23161
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23162
- children: [
23163
- "\u5E26\u5BBD\uFF1A",
23164
- stationInfo.bandwidth,
23165
- "kHz"
23166
- ]
23167
- }),
23168
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23169
- children: [
23170
- "\u8C03\u5236\uFF1A",
23171
- stationInfo.modulation
23172
- ]
23516
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
23517
+ className: "min-w-0 break-words",
23518
+ children: value1
23519
+ })
23520
+ ]
23521
+ });
23522
+ const SignalMetaValue = ({ color, label, testId })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("span", {
23523
+ className: "inline-flex items-center gap-1.5 font-medium text-foreground",
23524
+ children: [
23525
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
23526
+ "aria-hidden": "true",
23527
+ className: "size-2 shrink-0 rounded-full ring-1 ring-inset ring-border",
23528
+ "data-testid": testId,
23529
+ style: {
23530
+ backgroundColor: color
23531
+ }
23173
23532
  }),
23174
- signalTypeName ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23175
- children: [
23176
- "\u7C7B\u578B\uFF1A",
23177
- /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
23178
- style: {
23179
- color: signalColor
23180
- },
23181
- children: signalTypeName
23182
- })
23183
- ]
23184
- }) : null,
23185
- stationInfo.remark ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23186
- children: [
23187
- "\u5907\u6CE8\uFF1A",
23188
- stationInfo.remark
23189
- ]
23190
- }) : null
23533
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
23534
+ children: label
23535
+ })
23191
23536
  ]
23192
23537
  });
23538
+ const SignalInfoPanel = ({ signalInfo })=>{
23539
+ if (!signalInfo) return null;
23540
+ const source = resolveSignalSource(signalInfo);
23541
+ const stationInfo = tree_isStationInfo(signalInfo) ? signalInfo : void 0;
23542
+ const signalType = normalizeSignalType(signalInfo.signalType);
23543
+ const signalTypeInfo = SIGNAL_TYPE_MAP[signalType];
23544
+ const levelInfo = SIGNAL_LEVEL_MAP[normalizeSignalLevel(signalInfo.level)];
23545
+ const showLevel = 'simple' === source && signalType === SignalType.LEGITIMATE;
23546
+ const resolvedColor = resolveSignalColor({
23547
+ ...signalInfo,
23548
+ source
23549
+ });
23550
+ const typeColor = showLevel ? signalTypeInfo.color : resolvedColor;
23551
+ const hasFrequencyRange = null != signalInfo.startFrequency && null != signalInfo.stopFrequency;
23552
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
23553
+ className: "mt-2 border-t border-border/60 pt-2 text-xs leading-5 text-foreground",
23554
+ "data-signal-source": source,
23555
+ "data-testid": "signal-info-panel",
23556
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
23557
+ className: "space-y-0.5",
23558
+ children: [
23559
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23560
+ label: "\u6765\u6E90",
23561
+ value: SIGNAL_SOURCE_LABEL[source]
23562
+ }),
23563
+ stationInfo?.signalName ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23564
+ label: "\u540D\u79F0",
23565
+ value: stationInfo.signalName
23566
+ }) : null,
23567
+ stationInfo?.orgName ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23568
+ label: "\u5355\u4F4D",
23569
+ value: stationInfo.orgName
23570
+ }) : null,
23571
+ null != signalInfo.frequency ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23572
+ label: "\u9891\u7387",
23573
+ value: `${signalInfo.frequency}MHz`,
23574
+ tabular: true
23575
+ }) : hasFrequencyRange ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23576
+ label: "\u8303\u56F4",
23577
+ value: `${signalInfo.startFrequency}-${signalInfo.stopFrequency}MHz`,
23578
+ tabular: true
23579
+ }) : null,
23580
+ null != signalInfo.bandwidth ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23581
+ label: "\u5E26\u5BBD",
23582
+ value: `${signalInfo.bandwidth}kHz`,
23583
+ tabular: true
23584
+ }) : null,
23585
+ stationInfo?.modulation ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23586
+ label: "\u8C03\u5236",
23587
+ value: stationInfo.modulation
23588
+ }) : null,
23589
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23590
+ label: "\u7C7B\u578B",
23591
+ value: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalMetaValue, {
23592
+ color: typeColor,
23593
+ label: signalTypeInfo.name,
23594
+ testId: "signal-info-type-swatch"
23595
+ })
23596
+ }),
23597
+ showLevel ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23598
+ label: "\u7B49\u7EA7",
23599
+ value: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalMetaValue, {
23600
+ color: resolvedColor,
23601
+ label: levelInfo.name,
23602
+ testId: "signal-info-level-swatch"
23603
+ })
23604
+ }) : null,
23605
+ stationInfo?.remark ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalInfoRow, {
23606
+ label: "\u5907\u6CE8",
23607
+ value: stationInfo.remark
23608
+ }) : null
23609
+ ]
23610
+ })
23611
+ });
23193
23612
  };
23194
- const panels_StationInfoPanel = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__["default"].memo(StationInfoPanel);
23195
- const FrequencyDataBoard = ({ left, updateKey, onChange, showStationInfo = true, cursorSample })=>{
23613
+ const StationInfoPanel = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__["default"].memo(SignalInfoPanel);
23614
+ const FrequencyDataBoard = ({ left, updateKey, onChange, showSignalInfo = true, cursorSample })=>{
23196
23615
  const axisYUnit = useStore_useSelector((state)=>state.axisY.unit);
23197
23616
  const frequencyFormat = useStore_useSelector((state)=>state.axisX.frequencyFormat);
23198
23617
  const unit = useStore_useSelector((state)=>state.axisX.unit);
@@ -23328,17 +23747,17 @@ const FrequencyDataBoard = ({ left, updateKey, onChange, showStationInfo = true,
23328
23747
  frequency,
23329
23748
  onChange
23330
23749
  ]);
23331
- const matchedStation = useStationInfoAtCursor({
23750
+ const matchedSignal = useSignalInfoAtCursor({
23332
23751
  frequency,
23333
- enabled: showStationInfo,
23752
+ enabled: showSignalInfo,
23334
23753
  cursorSample
23335
23754
  });
23336
- const hasStationInfo = showStationInfo && !!matchedStation;
23755
+ const hasSignalInfo = showSignalInfo && !!matchedSignal;
23337
23756
  const hasValue = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>value1 && (Array.isArray(value1) ? value1.length > 0 : true), [
23338
23757
  value1
23339
23758
  ]);
23340
23759
  if (left < 0) return null;
23341
- if (!hasValue && !hasStationInfo) return null;
23760
+ if (!hasValue && !hasSignalInfo) return null;
23342
23761
  return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(components_Mask, {
23343
23762
  children: [
23344
23763
  frequency && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
@@ -23352,8 +23771,8 @@ const FrequencyDataBoard = ({ left, updateKey, onChange, showStationInfo = true,
23352
23771
  className: "mt-2 space-y-1",
23353
23772
  children: value1
23354
23773
  }) : null,
23355
- showStationInfo ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(panels_StationInfoPanel, {
23356
- stationInfo: matchedStation
23774
+ showSignalInfo ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(StationInfoPanel, {
23775
+ signalInfo: matchedSignal
23357
23776
  }) : null
23358
23777
  ]
23359
23778
  });
@@ -23368,7 +23787,7 @@ const SpectrumCursorPopover = ({ id })=>{
23368
23787
  return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Spectrum_FrequencyDataBoard, {
23369
23788
  left: 'number' == typeof left ? left : -1,
23370
23789
  updateKey: updateKey,
23371
- showStationInfo: signalShow && signalDisplay,
23790
+ showSignalInfo: signalShow && signalDisplay,
23372
23791
  cursorSample: sample
23373
23792
  });
23374
23793
  };
@@ -27590,7 +28009,7 @@ const FluorescenceSwitch = ()=>{
27590
28009
  })
27591
28010
  });
27592
28011
  return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ToolbarDropdownGroup, {
27593
- leading: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(primitives_IconBox, {
28012
+ leading: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ToolbarGroupIconBox, {
27594
28013
  active: display,
27595
28014
  tone: "primary",
27596
28015
  onClick: toggleDisplay,
@@ -28208,10 +28627,497 @@ const Markers_Switch_Switch = ()=>{
28208
28627
  });
28209
28628
  };
28210
28629
  const Markers_Switch = Markers_Switch_Switch;
28630
+ /**
28631
+ * @license lucide-react v0.577.0 - ISC
28632
+ *
28633
+ * This source code is licensed under the ISC license.
28634
+ * See the LICENSE file in the root directory of this source tree.
28635
+ */ const chevron_down_iconNode = [
28636
+ [
28637
+ "path",
28638
+ {
28639
+ d: "m6 9 6 6 6-6",
28640
+ key: "qrunsl"
28641
+ }
28642
+ ]
28643
+ ];
28644
+ const ChevronDown = createLucideIcon("chevron-down", chevron_down_iconNode);
28645
+ /**
28646
+ * @license lucide-react v0.577.0 - ISC
28647
+ *
28648
+ * This source code is licensed under the ISC license.
28649
+ * See the LICENSE file in the root directory of this source tree.
28650
+ */ const chevron_right_iconNode = [
28651
+ [
28652
+ "path",
28653
+ {
28654
+ d: "m9 18 6-6-6-6",
28655
+ key: "mthhwq"
28656
+ }
28657
+ ]
28658
+ ];
28659
+ const ChevronRight = createLucideIcon("chevron-right", chevron_right_iconNode);
28660
+ "use client";
28661
+ var react_checkbox_dist_defProp = Object.defineProperty;
28662
+ var react_checkbox_dist_name = (target, value1)=>react_checkbox_dist_defProp(target, "name", {
28663
+ value: value1,
28664
+ configurable: true
28665
+ });
28666
+ var CHECKBOX_NAME = "Checkbox";
28667
+ var [createCheckboxContext, createCheckboxScope] = createContextScope(CHECKBOX_NAME);
28668
+ var [CheckboxProviderImpl, useCheckboxContext] = createCheckboxContext(CHECKBOX_NAME);
28669
+ function CheckboxProvider(props) {
28670
+ const { __scopeCheckbox, checked: checkedProp, children, defaultChecked, disabled, form, name, onCheckedChange, required, value: value1 = "on", internal_do_not_use_render } = props;
28671
+ const [checked, setChecked] = dist_useControllableState({
28672
+ prop: checkedProp,
28673
+ defaultProp: defaultChecked ?? false,
28674
+ onChange: onCheckedChange,
28675
+ caller: CHECKBOX_NAME
28676
+ });
28677
+ const [control, setControl] = __WEBPACK_EXTERNAL_MODULE_react__.useState(null);
28678
+ const [bubbleInput, setBubbleInput] = __WEBPACK_EXTERNAL_MODULE_react__.useState(null);
28679
+ const hasConsumerStoppedPropagationRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(false);
28680
+ const [userInteractionCount, onUserInteraction] = __WEBPACK_EXTERNAL_MODULE_react__.useReducer((count)=>count + 1, 0);
28681
+ const isFormControl = control ? !!form || !!control.closest("form") : true;
28682
+ const context = {
28683
+ checked,
28684
+ disabled,
28685
+ setChecked,
28686
+ control,
28687
+ setControl,
28688
+ name,
28689
+ form,
28690
+ value: value1,
28691
+ hasConsumerStoppedPropagationRef,
28692
+ userInteractionCount,
28693
+ onUserInteraction,
28694
+ required,
28695
+ defaultChecked: dist_isIndeterminate(defaultChecked) ? false : defaultChecked,
28696
+ isFormControl,
28697
+ bubbleInput,
28698
+ setBubbleInput
28699
+ };
28700
+ return /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(CheckboxProviderImpl, {
28701
+ scope: __scopeCheckbox,
28702
+ ...context,
28703
+ children: dist_isFunction(internal_do_not_use_render) ? internal_do_not_use_render(context) : children
28704
+ });
28705
+ }
28706
+ react_checkbox_dist_name(CheckboxProvider, "CheckboxProvider");
28707
+ var react_checkbox_dist_TRIGGER_NAME = "CheckboxTrigger";
28708
+ var CheckboxTrigger = /* @__PURE__ */ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(/* @__PURE__ */ react_checkbox_dist_name(function({ __scopeCheckbox, onKeyDown, onClick, ...checkboxProps }, forwardedRef) {
28709
+ const { control, value: value1, disabled, checked, required, setControl, setChecked, hasConsumerStoppedPropagationRef, onUserInteraction, isFormControl, bubbleInput } = useCheckboxContext(react_checkbox_dist_TRIGGER_NAME, __scopeCheckbox);
28710
+ const composedRefs = dist_useComposedRefs(forwardedRef, setControl);
28711
+ const initialCheckedStateRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(checked);
28712
+ __WEBPACK_EXTERNAL_MODULE_react__.useEffect(()=>{
28713
+ const form = control?.form;
28714
+ if (form) {
28715
+ const reset = /* @__PURE__ */ react_checkbox_dist_name(()=>setChecked(initialCheckedStateRef.current), "reset");
28716
+ form.addEventListener("reset", reset);
28717
+ return ()=>form.removeEventListener("reset", reset);
28718
+ }
28719
+ }, [
28720
+ control,
28721
+ setChecked
28722
+ ]);
28723
+ return /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dist_Primitive.button, {
28724
+ type: "button",
28725
+ role: "checkbox",
28726
+ "aria-checked": dist_isIndeterminate(checked) ? "mixed" : checked,
28727
+ "aria-required": required,
28728
+ "data-state": getState(checked),
28729
+ "data-disabled": disabled ? "" : void 0,
28730
+ disabled,
28731
+ value: value1,
28732
+ ...checkboxProps,
28733
+ ref: composedRefs,
28734
+ onKeyDown: dist_composeEventHandlers(onKeyDown, (event)=>{
28735
+ if ("Enter" === event.key) event.preventDefault();
28736
+ }),
28737
+ onClick: dist_composeEventHandlers(onClick, (event)=>{
28738
+ onUserInteraction();
28739
+ setChecked((prevChecked)=>dist_isIndeterminate(prevChecked) ? true : !prevChecked);
28740
+ if (bubbleInput && isFormControl) {
28741
+ hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();
28742
+ if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();
28743
+ }
28744
+ })
28745
+ });
28746
+ }, "CheckboxTrigger"));
28747
+ var Checkbox = /* @__PURE__ */ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(/* @__PURE__ */ react_checkbox_dist_name(function(props, forwardedRef) {
28748
+ const { __scopeCheckbox, name, checked, defaultChecked, required, disabled, value: value1, onCheckedChange, form, ...checkboxProps } = props;
28749
+ return /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(CheckboxProvider, {
28750
+ __scopeCheckbox,
28751
+ checked,
28752
+ defaultChecked,
28753
+ disabled,
28754
+ required,
28755
+ onCheckedChange,
28756
+ name,
28757
+ form,
28758
+ value: value1,
28759
+ internal_do_not_use_render: ({ isFormControl })=>/* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.Fragment, {
28760
+ children: [
28761
+ /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(CheckboxTrigger, {
28762
+ ...checkboxProps,
28763
+ ref: forwardedRef,
28764
+ __scopeCheckbox
28765
+ }),
28766
+ isFormControl && /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(CheckboxBubbleInput, {
28767
+ __scopeCheckbox
28768
+ })
28769
+ ]
28770
+ })
28771
+ });
28772
+ }, "Checkbox"));
28773
+ var INDICATOR_NAME = "CheckboxIndicator";
28774
+ var CheckboxIndicator = /* @__PURE__ */ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(/* @__PURE__ */ react_checkbox_dist_name(function(props, forwardedRef) {
28775
+ const { __scopeCheckbox, forceMount, ...indicatorProps } = props;
28776
+ const context = useCheckboxContext(INDICATOR_NAME, __scopeCheckbox);
28777
+ return /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dist_Presence, {
28778
+ present: forceMount || dist_isIndeterminate(context.checked) || true === context.checked,
28779
+ children: /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dist_Primitive.span, {
28780
+ "data-state": getState(context.checked),
28781
+ "data-disabled": context.disabled ? "" : void 0,
28782
+ ...indicatorProps,
28783
+ ref: forwardedRef,
28784
+ style: {
28785
+ pointerEvents: "none",
28786
+ ...props.style
28787
+ }
28788
+ })
28789
+ });
28790
+ }, "CheckboxIndicator"));
28791
+ var BUBBLE_INPUT_NAME = "CheckboxBubbleInput";
28792
+ var CheckboxBubbleInput = /* @__PURE__ */ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(/* @__PURE__ */ react_checkbox_dist_name(function({ __scopeCheckbox, onClick, ...props }, forwardedRef) {
28793
+ const { control, hasConsumerStoppedPropagationRef, userInteractionCount, checked, defaultChecked, required, disabled, name, value: value1, form, bubbleInput, setBubbleInput } = useCheckboxContext(BUBBLE_INPUT_NAME, __scopeCheckbox);
28794
+ const composedRefs = dist_useComposedRefs(forwardedRef, setBubbleInput);
28795
+ const controlSize = useSize(control);
28796
+ const shouldStopClickPropagationRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(false);
28797
+ const prevCheckedRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(checked);
28798
+ const prevUserInteractionCountRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(userInteractionCount);
28799
+ __WEBPACK_EXTERNAL_MODULE_react__.useEffect(()=>{
28800
+ const input = bubbleInput;
28801
+ if (!input) return;
28802
+ const inputProto = window.HTMLInputElement.prototype;
28803
+ const descriptor = Object.getOwnPropertyDescriptor(inputProto, "checked");
28804
+ const setChecked = descriptor.set;
28805
+ const isUserInteraction = userInteractionCount !== prevUserInteractionCountRef.current;
28806
+ prevUserInteractionCountRef.current = userInteractionCount;
28807
+ const checkedChanged = prevCheckedRef.current !== checked;
28808
+ prevCheckedRef.current = checked;
28809
+ const bubbles = !(isUserInteraction && hasConsumerStoppedPropagationRef.current);
28810
+ if (checkedChanged && setChecked) {
28811
+ shouldStopClickPropagationRef.current = !isUserInteraction;
28812
+ const event = new Event("click", {
28813
+ bubbles
28814
+ });
28815
+ input.indeterminate = dist_isIndeterminate(checked);
28816
+ setChecked.call(input, dist_isIndeterminate(checked) ? false : checked);
28817
+ input.dispatchEvent(event);
28818
+ shouldStopClickPropagationRef.current = false;
28819
+ }
28820
+ }, [
28821
+ bubbleInput,
28822
+ checked,
28823
+ hasConsumerStoppedPropagationRef,
28824
+ userInteractionCount
28825
+ ]);
28826
+ const defaultCheckedRef = __WEBPACK_EXTERNAL_MODULE_react__.useRef(dist_isIndeterminate(checked) ? false : checked);
28827
+ return /* @__PURE__ */ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(dist_Primitive.input, {
28828
+ type: "checkbox",
28829
+ "aria-hidden": true,
28830
+ defaultChecked: defaultChecked ?? defaultCheckedRef.current,
28831
+ required,
28832
+ disabled,
28833
+ name,
28834
+ value: value1,
28835
+ form,
28836
+ ...props,
28837
+ tabIndex: -1,
28838
+ ref: composedRefs,
28839
+ onClick: dist_composeEventHandlers(onClick, (event)=>{
28840
+ if (shouldStopClickPropagationRef.current) event.stopPropagation();
28841
+ }),
28842
+ style: {
28843
+ ...props.style,
28844
+ ...controlSize,
28845
+ position: "absolute",
28846
+ pointerEvents: "none",
28847
+ opacity: 0,
28848
+ margin: 0,
28849
+ transform: "translateX(-100%)"
28850
+ }
28851
+ });
28852
+ }, "CheckboxBubbleInput"));
28853
+ function dist_isFunction(value1) {
28854
+ return "function" == typeof value1;
28855
+ }
28856
+ react_checkbox_dist_name(dist_isFunction, "isFunction");
28857
+ function dist_isIndeterminate(checked) {
28858
+ return "indeterminate" === checked;
28859
+ }
28860
+ react_checkbox_dist_name(dist_isIndeterminate, "isIndeterminate");
28861
+ function getState(checked) {
28862
+ return dist_isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
28863
+ }
28864
+ react_checkbox_dist_name(getState, "getState");
28865
+ /**
28866
+ * @license lucide-react v0.577.0 - ISC
28867
+ *
28868
+ * This source code is licensed under the ISC license.
28869
+ * See the LICENSE file in the root directory of this source tree.
28870
+ */ const minus_iconNode = [
28871
+ [
28872
+ "path",
28873
+ {
28874
+ d: "M5 12h14",
28875
+ key: "1ays0h"
28876
+ }
28877
+ ]
28878
+ ];
28879
+ const Minus = createLucideIcon("minus", minus_iconNode);
28880
+ /**
28881
+ * @license lucide-react v0.577.0 - ISC
28882
+ *
28883
+ * This source code is licensed under the ISC license.
28884
+ * See the LICENSE file in the root directory of this source tree.
28885
+ */ const check_iconNode = [
28886
+ [
28887
+ "path",
28888
+ {
28889
+ d: "M20 6 9 17l-5-5",
28890
+ key: "1gmf2c"
28891
+ }
28892
+ ]
28893
+ ];
28894
+ const Check = createLucideIcon("check", check_iconNode);
28895
+ const checkbox_Checkbox = /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Checkbox, {
28896
+ ref: ref,
28897
+ "data-slot": "checkbox",
28898
+ className: cn_cn('peer inline-flex size-4 shrink-0 items-center justify-center rounded-[var(--radius-micro)] border border-border bg-background text-primary shadow-xs transition-colors outline-none', 'focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50', 'data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground', 'data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground', className),
28899
+ ...props,
28900
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(CheckboxIndicator, {
28901
+ "data-slot": "checkbox-indicator",
28902
+ className: "flex items-center justify-center text-current",
28903
+ children: 'indeterminate' === props.checked ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Minus, {
28904
+ className: "size-3.5"
28905
+ }) : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(Check, {
28906
+ className: "size-3.5"
28907
+ })
28908
+ })
28909
+ }));
28910
+ checkbox_Checkbox.displayName = Checkbox.displayName;
28911
+ const toCheckboxValue = (state)=>{
28912
+ if ('checked' === state) return true;
28913
+ if ('indeterminate' === state) return 'indeterminate';
28914
+ return false;
28915
+ };
28916
+ const SignalTypeRow = ({ source, type, leafKeysWithData, hiddenKeys, expanded, onToggleExpanded, onToggleNode })=>{
28917
+ const state = resolveNodeCheckState(leafKeysWithData, hiddenKeys, type.leafKeys);
28918
+ const checkboxId = `signal-tree-type-checkbox-${source.source}-${type.signalType}`;
28919
+ const hasLevels = type.levels.length > 0;
28920
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
28921
+ children: [
28922
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
28923
+ className: "group flex items-center gap-1.5 rounded-[var(--radius-control)] px-[var(--size-gap-base)] py-[calc(var(--size-gap-base)/2)] transition-colors hover:bg-accent/80",
28924
+ "data-testid": `signal-tree-type-${source.source}-${type.signalType}`,
28925
+ children: [
28926
+ hasLevels ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("button", {
28927
+ type: "button",
28928
+ "aria-label": expanded ? "\u6298\u53E0\u4FE1\u53F7\u7C7B\u578B" : "\u5C55\u5F00\u4FE1\u53F7\u7C7B\u578B",
28929
+ className: "flex size-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
28930
+ onClick: onToggleExpanded,
28931
+ children: expanded ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ChevronDown, {
28932
+ className: "size-3.5"
28933
+ }) : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ChevronRight, {
28934
+ className: "size-3.5"
28935
+ })
28936
+ }) : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
28937
+ "aria-hidden": "true",
28938
+ className: "size-4 shrink-0"
28939
+ }),
28940
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("label", {
28941
+ htmlFor: checkboxId,
28942
+ className: cn_cn('flex min-w-0 flex-1 items-center gap-1.5', 'disabled' === state ? 'cursor-not-allowed' : 'cursor-pointer'),
28943
+ children: [
28944
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(checkbox_Checkbox, {
28945
+ id: checkboxId,
28946
+ "aria-label": `${source.label} ${type.label}`,
28947
+ checked: toCheckboxValue(state),
28948
+ disabled: 'disabled' === state,
28949
+ onCheckedChange: ()=>onToggleNode(type.leafKeys)
28950
+ }),
28951
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
28952
+ "aria-hidden": "true",
28953
+ className: cn_cn('size-2 shrink-0 rounded-full ring-1 ring-inset ring-background/30', 'disabled' === state && 'opacity-35'),
28954
+ "data-testid": `signal-tree-type-color-${source.source}-${type.signalType}`,
28955
+ style: {
28956
+ backgroundColor: SIGNAL_TYPE_MAP[type.signalType].color
28957
+ }
28958
+ }),
28959
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
28960
+ className: cn_cn('min-w-0 truncate text-xs font-medium', 'disabled' === state ? 'text-muted-foreground' : 'text-foreground/90'),
28961
+ children: type.label
28962
+ })
28963
+ ]
28964
+ })
28965
+ ]
28966
+ }),
28967
+ expanded && hasLevels ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
28968
+ className: "relative ml-6 border-l border-border/60 pl-1",
28969
+ children: type.levels.map((level)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalLevelRow, {
28970
+ source: source.source,
28971
+ signalType: type.signalType,
28972
+ level: level,
28973
+ leafKeysWithData: leafKeysWithData,
28974
+ hiddenKeys: hiddenKeys,
28975
+ onToggleNode: onToggleNode
28976
+ }, level.leafKey))
28977
+ }) : null
28978
+ ]
28979
+ }, type.signalType);
28980
+ };
28981
+ const SignalLevelRow = ({ source, signalType, level, leafKeysWithData, hiddenKeys, onToggleNode })=>{
28982
+ const state = resolveNodeCheckState(leafKeysWithData, hiddenKeys, [
28983
+ level.leafKey
28984
+ ]);
28985
+ const checkboxId = `signal-tree-level-checkbox-${source}-${signalType}-${level.level}`;
28986
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
28987
+ className: "group flex items-center gap-1.5 rounded-[var(--radius-control)] px-[var(--size-gap-base)] py-[calc(var(--size-gap-base)/2)] transition-colors hover:bg-accent/80",
28988
+ "data-testid": `signal-tree-level-${source}-${signalType}-${level.level}`,
28989
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("label", {
28990
+ htmlFor: checkboxId,
28991
+ className: cn_cn('flex min-w-0 flex-1 items-center gap-1.5', 'disabled' === state ? 'cursor-not-allowed' : 'cursor-pointer'),
28992
+ children: [
28993
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(checkbox_Checkbox, {
28994
+ id: checkboxId,
28995
+ "aria-label": `${signalType} ${level.label}`,
28996
+ checked: toCheckboxValue(state),
28997
+ disabled: 'disabled' === state,
28998
+ onCheckedChange: ()=>onToggleNode([
28999
+ level.leafKey
29000
+ ])
29001
+ }),
29002
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
29003
+ "aria-hidden": "true",
29004
+ className: cn_cn('size-2 shrink-0 rounded-full ring-1 ring-inset ring-background/30', 'disabled' === state && 'opacity-35'),
29005
+ "data-testid": `signal-tree-level-color-${source}-${signalType}-${level.level}`,
29006
+ style: {
29007
+ backgroundColor: SIGNAL_LEVEL_MAP[level.level].color
29008
+ }
29009
+ }),
29010
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
29011
+ className: cn_cn('text-xs', 'disabled' === state ? 'text-muted-foreground' : 'text-foreground/80'),
29012
+ children: level.label
29013
+ })
29014
+ ]
29015
+ })
29016
+ });
29017
+ };
29018
+ const SignalAnnotationTree = ({ tree, leafKeysWithData, hiddenKeys, onToggleNode })=>{
29019
+ const [collapsedKeys, setCollapsedKeys] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(()=>new Set());
29020
+ const [collapsedSourceKeys, setCollapsedSourceKeys] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(()=>new Set());
29021
+ const toggleExpanded = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((key)=>{
29022
+ setCollapsedKeys((prev)=>{
29023
+ const next = new Set(prev);
29024
+ if (next.has(key)) next.delete(key);
29025
+ else next.add(key);
29026
+ return next;
29027
+ });
29028
+ }, []);
29029
+ const toggleSourceExpanded = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((source)=>{
29030
+ setCollapsedSourceKeys((prev)=>{
29031
+ const next = new Set(prev);
29032
+ if (next.has(source)) next.delete(source);
29033
+ else next.add(source);
29034
+ return next;
29035
+ });
29036
+ }, []);
29037
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(scroll_area_ScrollArea, {
29038
+ viewportClassName: "h-auto max-h-[var(--radix-dropdown-menu-content-available-height)]",
29039
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
29040
+ className: "p-[calc(var(--size-gap-base)/2)]",
29041
+ children: tree.sources.map((source, sourceIndex)=>{
29042
+ const sourceState = resolveNodeCheckState(leafKeysWithData, hiddenKeys, source.leafKeys);
29043
+ const checkboxId = `signal-tree-source-checkbox-${source.source}`;
29044
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
29045
+ className: cn_cn(sourceIndex > 0 && 'mt-[calc(var(--size-gap-base)/2)] border-t border-border/60 pt-[calc(var(--size-gap-base)/2)]'),
29046
+ "data-testid": `signal-tree-source-${source.source}`,
29047
+ children: [
29048
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", {
29049
+ className: "flex items-center gap-1.5 rounded-[var(--radius-control)] px-[var(--size-gap-base)] py-[calc(var(--size-gap-base)/2)] transition-colors hover:bg-accent/80",
29050
+ "data-testid": `signal-tree-source-row-${source.source}`,
29051
+ children: [
29052
+ source.types.length > 0 ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("button", {
29053
+ type: "button",
29054
+ "aria-label": collapsedSourceKeys.has(source.source) ? "\u5C55\u5F00\u6570\u636E\u6765\u6E90" : "\u6298\u53E0\u6570\u636E\u6765\u6E90",
29055
+ className: "flex size-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
29056
+ onClick: ()=>toggleSourceExpanded(source.source),
29057
+ children: collapsedSourceKeys.has(source.source) ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ChevronRight, {
29058
+ className: "size-3.5"
29059
+ }) : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ChevronDown, {
29060
+ className: "size-3.5"
29061
+ })
29062
+ }) : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
29063
+ "aria-hidden": "true",
29064
+ className: "size-4 shrink-0"
29065
+ }),
29066
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("label", {
29067
+ htmlFor: checkboxId,
29068
+ className: cn_cn('flex min-w-0 flex-1 items-center gap-1.5', 'disabled' === sourceState ? 'cursor-not-allowed' : 'cursor-pointer'),
29069
+ children: [
29070
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(checkbox_Checkbox, {
29071
+ id: checkboxId,
29072
+ "aria-label": `${source.label}\u{7B5B}\u{9009}`,
29073
+ checked: toCheckboxValue(sourceState),
29074
+ disabled: 'disabled' === sourceState,
29075
+ onCheckedChange: ()=>onToggleNode(source.leafKeys)
29076
+ }),
29077
+ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
29078
+ className: "text-xs font-medium text-foreground",
29079
+ children: source.label
29080
+ })
29081
+ ]
29082
+ })
29083
+ ]
29084
+ }),
29085
+ collapsedSourceKeys.has(source.source) ? null : /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
29086
+ className: "ml-4 divide-y divide-border/40 border-l border-border/60 pl-1",
29087
+ children: source.types.map((type)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalTypeRow, {
29088
+ source: source,
29089
+ type: type,
29090
+ leafKeysWithData: leafKeysWithData,
29091
+ hiddenKeys: hiddenKeys,
29092
+ expanded: !collapsedKeys.has(`${source.source}:${type.signalType}`),
29093
+ onToggleExpanded: ()=>toggleExpanded(`${source.source}:${type.signalType}`),
29094
+ onToggleNode: onToggleNode
29095
+ }, type.signalType))
29096
+ })
29097
+ ]
29098
+ }, source.source);
29099
+ })
29100
+ })
29101
+ });
29102
+ };
28211
29103
  const Signal_Switch_Switch = ()=>{
28212
29104
  const { state: { signal }, dispatch } = useStore_useStore();
28213
29105
  const isActive = signal.display;
28214
29106
  const shouldShow = signal.show;
29107
+ const signalItems = useUnifiedSignals({
29108
+ respectVisibility: false,
29109
+ filterHidden: false
29110
+ });
29111
+ const tree = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>buildSignalTree(signalItems), [
29112
+ signalItems
29113
+ ]);
29114
+ const leafKeysWithData = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>new Set(tree.sources.flatMap((source)=>source.dataLeafKeys)), [
29115
+ tree
29116
+ ]);
29117
+ const hiddenKeys = (0, __WEBPACK_EXTERNAL_MODULE_react__.useMemo)(()=>new Set(signal.hiddenCategoryKeys ?? []), [
29118
+ signal.hiddenCategoryKeys
29119
+ ]);
29120
+ const hasCategoryFilter = (signal.hiddenCategoryKeys?.length ?? 0) > 0;
28215
29121
  const setActive = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((active)=>{
28216
29122
  dispatch({
28217
29123
  payload: {
@@ -28225,22 +29131,58 @@ const Signal_Switch_Switch = ()=>{
28225
29131
  signal,
28226
29132
  dispatch
28227
29133
  ]);
29134
+ const toggleNode = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((fixedLeafKeys)=>{
29135
+ const next = toggleNodeHiddenKeys(signal.hiddenCategoryKeys ?? [], fixedLeafKeys, leafKeysWithData);
29136
+ dispatch({
29137
+ payload: {
29138
+ signal: {
29139
+ ...signal,
29140
+ hiddenCategoryKeys: next
29141
+ }
29142
+ }
29143
+ });
29144
+ }, [
29145
+ signal,
29146
+ leafKeysWithData,
29147
+ dispatch
29148
+ ]);
28228
29149
  if (!shouldShow) return null;
28229
- return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(primitives_IconBox, {
28230
- active: isActive,
28231
- tone: "primary",
28232
- onClick: ()=>{
28233
- setActive(!isActive);
28234
- },
28235
- title: `\u{4FE1}\u{53F7}\u{6807}\u{6CE8}-\u{5DF2}${isActive ? "\u663E\u793A" : "\u9690\u85CF"}`,
28236
- children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("svg", {
28237
- viewBox: "0 0 1024 1024",
28238
- xmlns: "http://www.w3.org/2000/svg",
28239
- children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("path", {
28240
- fill: "currentColor",
28241
- d: "M563.072 376.48a79.456 79.456 0 0 0 28.928-61.12 80 80 0 1 0-160 0c0 24.672 11.392 46.432 28.928 61.12l-202.88 540.256a32 32 0 1 0 59.904 22.496l49.28-131.264h289.504l49.28 131.264a32.064 32.064 0 0 0 41.248 18.752c16.544-6.208 24.896-24.672 18.72-41.216l-202.912-540.288z m-1.312 178.624h-99.552L512 422.56l49.76 132.544z m-170.464 188.896l46.912-124.896h147.616l46.912 124.896h-241.44zM662.464 417.408a32 32 0 1 0 53.12 35.648 254.72 254.72 0 0 0 43.136-142.304 255.04 255.04 0 0 0-43.136-142.304 32 32 0 1 0-53.12 35.68 190.944 190.944 0 0 1 32.288 106.624 190.816 190.816 0 0 1-32.288 106.656zM289.888 453.024a32 32 0 1 0 53.184-35.616 191.36 191.36 0 0 1-32.32-106.656 191.328 191.328 0 0 1 32.32-106.656 32.064 32.064 0 0 0-8.768-44.416 32.096 32.096 0 0 0-44.416 8.768 254.976 254.976 0 0 0-43.136 142.304 254.976 254.976 0 0 0 43.136 142.272zM210.656 117.12A32 32 0 1 0 157.44 81.536a420.032 420.032 0 0 0-70.848 233.824 419.744 419.744 0 0 0 70.88 233.856 31.936 31.936 0 0 0 44.416 8.768 32 32 0 0 0 8.768-44.416 355.168 355.168 0 0 1-60.032-198.24A355.36 355.36 0 0 1 210.656 117.12zM896.224 154.304a416.96 416.96 0 0 0-38.912-72.768 32 32 0 1 0-53.184 35.584 354.912 354.912 0 0 1 60.064 198.24 355.2 355.2 0 0 1-60.064 198.208 32.032 32.032 0 0 0 53.184 35.648 418.816 418.816 0 0 0 70.88-233.856c0-55.68-10.752-109.856-31.968-161.056z"
29150
+ return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ToolbarDropdownGroup, {
29151
+ leading: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(ToolbarGroupIconBox, {
29152
+ active: isActive,
29153
+ tone: "primary",
29154
+ onClick: ()=>{
29155
+ setActive(!isActive);
29156
+ },
29157
+ title: `\u{5168}\u{90E8}\u{4FE1}\u{53F7}\u{6807}\u{6CE8}\u{FF1A}${isActive ? "\u663E\u793A" : "\u9690\u85CF"}`,
29158
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("svg", {
29159
+ viewBox: "0 0 1024 1024",
29160
+ xmlns: "http://www.w3.org/2000/svg",
29161
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("path", {
29162
+ fill: "currentColor",
29163
+ d: "M563.072 376.48a79.456 79.456 0 0 0 28.928-61.12 80 80 0 1 0-160 0c0 24.672 11.392 46.432 28.928 61.12l-202.88 540.256a32 32 0 1 0 59.904 22.496l49.28-131.264h289.504l49.28 131.264a32.064 32.064 0 0 0 41.248 18.752c16.544-6.208 24.896-24.672 18.72-41.216l-202.912-540.288z m-1.312 178.624h-99.552L512 422.56l49.76 132.544z m-170.464 188.896l46.912-124.896h147.616l46.912 124.896h-241.44zM662.464 417.408a32 32 0 1 0 53.12 35.648 254.72 254.72 0 0 0 43.136-142.304 255.04 255.04 0 0 0-43.136-142.304 32 32 0 1 0-53.12 35.68 190.944 190.944 0 0 1 32.288 106.624 190.816 190.816 0 0 1-32.288 106.656zM289.888 453.024a32 32 0 1 0 53.184-35.616 191.36 191.36 0 0 1-32.32-106.656 191.328 191.328 0 0 1 32.32-106.656 32.064 32.064 0 0 0-8.768-44.416 32.096 32.096 0 0 0-44.416 8.768 254.976 254.976 0 0 0-43.136 142.304 254.976 254.976 0 0 0 43.136 142.272zM210.656 117.12A32 32 0 1 0 157.44 81.536a420.032 420.032 0 0 0-70.848 233.824 419.744 419.744 0 0 0 70.88 233.856 31.936 31.936 0 0 0 44.416 8.768 32 32 0 0 0 8.768-44.416 355.168 355.168 0 0 1-60.032-198.24A355.36 355.36 0 0 1 210.656 117.12zM896.224 154.304a416.96 416.96 0 0 0-38.912-72.768 32 32 0 1 0-53.184 35.584 354.912 354.912 0 0 1 60.064 198.24 355.2 355.2 0 0 1-60.064 198.208 32.032 32.032 0 0 0 53.184 35.648 418.816 418.816 0 0 0 70.88-233.856c0-55.68-10.752-109.856-31.968-161.056z"
29164
+ })
28242
29165
  })
28243
- })
29166
+ }),
29167
+ value: null,
29168
+ options: [],
29169
+ triggerTitle: `\u{7B5B}\u{9009}\u{4FE1}\u{53F7}\u{6807}\u{6CE8}\u{7C7B}\u{522B}${hasCategoryFilter ? "\uFF08\u5DF2\u5E94\u7528\u7B5B\u9009\uFF09" : ''}`,
29170
+ triggerTestId: "signal-tree-trigger",
29171
+ triggerContent: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", {
29172
+ className: "sr-only",
29173
+ children: hasCategoryFilter ? "\u4FE1\u53F7\u6807\u6CE8\u7C7B\u522B\u7B5B\u9009\uFF08\u5DF2\u5E94\u7528\uFF09" : "\u4FE1\u53F7\u6807\u6CE8\u7C7B\u522B\u7B5B\u9009"
29174
+ }),
29175
+ customContent: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
29176
+ "data-testid": "signal-tree-popover",
29177
+ children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalAnnotationTree, {
29178
+ tree: tree,
29179
+ leafKeysWithData: leafKeysWithData,
29180
+ hiddenKeys: hiddenKeys,
29181
+ onToggleNode: toggleNode
29182
+ })
29183
+ }),
29184
+ contentClassName: "w-max max-w-[calc(100vw-1rem)] p-0",
29185
+ triggerClassName: cn_cn('justify-center [&>span:last-child]:ml-0', hasCategoryFilter && 'bg-accent/72 shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--primary)_28%,transparent)] [&>span:last-child]:text-primary')
28244
29186
  });
28245
29187
  };
28246
29188
  const Signal_Switch = Signal_Switch_Switch;
@@ -30408,7 +31350,7 @@ const Board = ({ id })=>{
30408
31350
  left: left,
30409
31351
  updateKey: updateKey,
30410
31352
  onChange: handleChange,
30411
- showStationInfo: false
31353
+ showSignalInfo: false
30412
31354
  })
30413
31355
  });
30414
31356
  };
@@ -32176,27 +33118,31 @@ const Scope = ()=>{
32176
33118
  });
32177
33119
  };
32178
33120
  const Spectrum_Scope = Scope;
32179
- const SignalSegments_SignalSegments = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react__.memo)(({ style, signalPositions, activeSignalKey, segmentIndex })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
33121
+ const SignalSegments = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react__.memo)(({ style, signalPositions, activeSignalKey, segmentIndex })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
32180
33122
  className: "absolute h-full box-border",
32181
33123
  style: style,
32182
- children: signalPositions.map(({ key, position, color, tooltip })=>{
33124
+ children: signalPositions.map(({ item, key, position, color, tooltip })=>{
32183
33125
  const isActive = activeSignalKey === key;
32184
33126
  const itemStyle = {
32185
33127
  left: position.left,
32186
33128
  width: position.width,
32187
33129
  minWidth: '1px',
32188
33130
  backgroundColor: color,
32189
- opacity: isActive ? 0.5 : 1,
32190
- height: isActive ? '100%' : '8px'
33131
+ height: isActive ? '100%' : '8px',
33132
+ opacity: isActive ? 0.5 : 1
32191
33133
  };
32192
33134
  return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
32193
33135
  className: "pointer-events-none absolute top-0 flex min-w-px items-center justify-center overflow-hidden text-ellipsis whitespace-nowrap text-center text-xs text-foreground",
33136
+ "data-signal-active": isActive ? 'true' : 'false',
33137
+ "data-signal-key": key,
33138
+ "data-signal-source": resolveSignalSource(item),
33139
+ "data-testid": "signal-annotation",
32194
33140
  style: itemStyle,
32195
33141
  title: tooltip
32196
33142
  }, `segment-${segmentIndex}-signal-${key}`);
32197
33143
  })
32198
33144
  }));
32199
- const SignalSegments = SignalSegments_SignalSegments;
33145
+ const presenters_SignalSegments = SignalSegments;
32200
33146
  function useSignalDataManager() {
32201
33147
  const { state, dispatch } = useStore_useStore();
32202
33148
  const globalIDRef = (0, __WEBPACK_EXTERNAL_MODULE_react__.useRef)(state.globalID);
@@ -32213,11 +33159,11 @@ function useSignalDataManager() {
32213
33159
  if (!state.globalID) return;
32214
33160
  const pendingStationData = pendingDataRef.current.station;
32215
33161
  const pendingSimpleSignalData = pendingDataRef.current.simple;
32216
- if (pendingStationData?.length) {
33162
+ if (void 0 !== pendingStationData) {
32217
33163
  STATION_DATA(state.globalID, pendingStationData);
32218
33164
  pendingDataRef.current.station = void 0;
32219
33165
  }
32220
- if (pendingSimpleSignalData?.length) {
33166
+ if (void 0 !== pendingSimpleSignalData) {
32221
33167
  dispatch({
32222
33168
  payload: {
32223
33169
  signal: {
@@ -32234,7 +33180,7 @@ function useSignalDataManager() {
32234
33180
  ]);
32235
33181
  const updateSignalData = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((params)=>{
32236
33182
  const { type, data } = params;
32237
- if (!data || !Array.isArray(data) || 0 === data.length) return;
33183
+ if (!Array.isArray(data)) return;
32238
33184
  if ('station' === type) {
32239
33185
  if (!globalIDRef.current) {
32240
33186
  pendingDataRef.current.station = data;
@@ -32310,7 +33256,7 @@ const Signal = ({ id, show = true, display = true })=>{
32310
33256
  children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("div", {
32311
33257
  className: "absolute right-0 top-0 flex h-full w-full",
32312
33258
  style: zoomOffStyle ?? void 0,
32313
- children: segmentData.map(({ segmentIndex, signalPositions, style })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(SignalSegments, {
33259
+ children: segmentData.map(({ segmentIndex, signalPositions, style })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(presenters_SignalSegments, {
32314
33260
  style: style,
32315
33261
  signalPositions: signalPositions,
32316
33262
  activeSignalKey: currentPosition.segmentIndex === segmentIndex ? activeSignalKey : void 0,