@crowdin/app-project-module 3.2.2 → 3.3.0

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.
@@ -19057,7 +19057,7 @@
19057
19057
  */
19058
19058
 
19059
19059
 
19060
- const __iconData$E = {
19060
+ const __iconData$D = {
19061
19061
  name: "arrow-down",
19062
19062
  size: 24,
19063
19063
  node: [
@@ -19065,8 +19065,8 @@
19065
19065
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
19066
19066
  ]
19067
19067
  };
19068
- __iconData$E.node;
19069
- const ArrowDown = createLucideIcon(__iconData$E);
19068
+ __iconData$D.node;
19069
+ const ArrowDown = createLucideIcon(__iconData$D);
19070
19070
 
19071
19071
  /**
19072
19072
  * @license lucide-react v1.44.0 - ISC
@@ -19076,7 +19076,7 @@
19076
19076
  */
19077
19077
 
19078
19078
 
19079
- const __iconData$D = {
19079
+ const __iconData$C = {
19080
19080
  name: "arrow-left",
19081
19081
  size: 24,
19082
19082
  node: [
@@ -19084,8 +19084,8 @@
19084
19084
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
19085
19085
  ]
19086
19086
  };
19087
- __iconData$D.node;
19088
- const ArrowLeft = createLucideIcon(__iconData$D);
19087
+ __iconData$C.node;
19088
+ const ArrowLeft = createLucideIcon(__iconData$C);
19089
19089
 
19090
19090
  /**
19091
19091
  * @license lucide-react v1.44.0 - ISC
@@ -19095,7 +19095,7 @@
19095
19095
  */
19096
19096
 
19097
19097
 
19098
- const __iconData$C = {
19098
+ const __iconData$B = {
19099
19099
  name: "arrow-up",
19100
19100
  size: 24,
19101
19101
  node: [
@@ -19103,8 +19103,8 @@
19103
19103
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
19104
19104
  ]
19105
19105
  };
19106
- __iconData$C.node;
19107
- const ArrowUp = createLucideIcon(__iconData$C);
19106
+ __iconData$B.node;
19107
+ const ArrowUp = createLucideIcon(__iconData$B);
19108
19108
 
19109
19109
  /**
19110
19110
  * @license lucide-react v1.44.0 - ISC
@@ -19114,7 +19114,7 @@
19114
19114
  */
19115
19115
 
19116
19116
 
19117
- const __iconData$B = {
19117
+ const __iconData$A = {
19118
19118
  name: "ban",
19119
19119
  size: 24,
19120
19120
  node: [
@@ -19122,8 +19122,8 @@
19122
19122
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
19123
19123
  ]
19124
19124
  };
19125
- __iconData$B.node;
19126
- const Ban = createLucideIcon(__iconData$B);
19125
+ __iconData$A.node;
19126
+ const Ban = createLucideIcon(__iconData$A);
19127
19127
 
19128
19128
  /**
19129
19129
  * @license lucide-react v1.44.0 - ISC
@@ -19133,13 +19133,13 @@
19133
19133
  */
19134
19134
 
19135
19135
 
19136
- const __iconData$A = {
19136
+ const __iconData$z = {
19137
19137
  name: "check",
19138
19138
  size: 24,
19139
19139
  node: [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]]
19140
19140
  };
19141
- __iconData$A.node;
19142
- const Check = createLucideIcon(__iconData$A);
19141
+ __iconData$z.node;
19142
+ const Check = createLucideIcon(__iconData$z);
19143
19143
 
19144
19144
  /**
19145
19145
  * @license lucide-react v1.44.0 - ISC
@@ -19149,13 +19149,13 @@
19149
19149
  */
19150
19150
 
19151
19151
 
19152
- const __iconData$z = {
19152
+ const __iconData$y = {
19153
19153
  name: "chevron-down",
19154
19154
  size: 24,
19155
19155
  node: [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]]
19156
19156
  };
19157
- __iconData$z.node;
19158
- const ChevronDown = createLucideIcon(__iconData$z);
19157
+ __iconData$y.node;
19158
+ const ChevronDown = createLucideIcon(__iconData$y);
19159
19159
 
19160
19160
  /**
19161
19161
  * @license lucide-react v1.44.0 - ISC
@@ -19165,13 +19165,13 @@
19165
19165
  */
19166
19166
 
19167
19167
 
19168
- const __iconData$y = {
19168
+ const __iconData$x = {
19169
19169
  name: "chevron-left",
19170
19170
  size: 24,
19171
19171
  node: [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]]
19172
19172
  };
19173
- __iconData$y.node;
19174
- const ChevronLeft = createLucideIcon(__iconData$y);
19173
+ __iconData$x.node;
19174
+ const ChevronLeft = createLucideIcon(__iconData$x);
19175
19175
 
19176
19176
  /**
19177
19177
  * @license lucide-react v1.44.0 - ISC
@@ -19181,13 +19181,13 @@
19181
19181
  */
19182
19182
 
19183
19183
 
19184
- const __iconData$x = {
19184
+ const __iconData$w = {
19185
19185
  name: "chevron-right",
19186
19186
  size: 24,
19187
19187
  node: [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]]
19188
19188
  };
19189
- __iconData$x.node;
19190
- const ChevronRight = createLucideIcon(__iconData$x);
19189
+ __iconData$w.node;
19190
+ const ChevronRight = createLucideIcon(__iconData$w);
19191
19191
 
19192
19192
  /**
19193
19193
  * @license lucide-react v1.44.0 - ISC
@@ -19197,13 +19197,13 @@
19197
19197
  */
19198
19198
 
19199
19199
 
19200
- const __iconData$w = {
19200
+ const __iconData$v = {
19201
19201
  name: "chevron-up",
19202
19202
  size: 24,
19203
19203
  node: [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]]
19204
19204
  };
19205
- __iconData$w.node;
19206
- const ChevronUp = createLucideIcon(__iconData$w);
19205
+ __iconData$v.node;
19206
+ const ChevronUp = createLucideIcon(__iconData$v);
19207
19207
 
19208
19208
  /**
19209
19209
  * @license lucide-react v1.44.0 - ISC
@@ -19213,7 +19213,7 @@
19213
19213
  */
19214
19214
 
19215
19215
 
19216
- const __iconData$v = {
19216
+ const __iconData$u = {
19217
19217
  name: "chevrons-down",
19218
19218
  size: 24,
19219
19219
  node: [
@@ -19221,8 +19221,8 @@
19221
19221
  ["path", { d: "m7 13 5 5 5-5", key: "1d48rs" }]
19222
19222
  ]
19223
19223
  };
19224
- __iconData$v.node;
19225
- const ChevronsDown = createLucideIcon(__iconData$v);
19224
+ __iconData$u.node;
19225
+ const ChevronsDown = createLucideIcon(__iconData$u);
19226
19226
 
19227
19227
  /**
19228
19228
  * @license lucide-react v1.44.0 - ISC
@@ -19232,7 +19232,7 @@
19232
19232
  */
19233
19233
 
19234
19234
 
19235
- const __iconData$u = {
19235
+ const __iconData$t = {
19236
19236
  name: "chevrons-left",
19237
19237
  size: 24,
19238
19238
  node: [
@@ -19240,8 +19240,8 @@
19240
19240
  ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
19241
19241
  ]
19242
19242
  };
19243
- __iconData$u.node;
19244
- const ChevronsLeft = createLucideIcon(__iconData$u);
19243
+ __iconData$t.node;
19244
+ const ChevronsLeft = createLucideIcon(__iconData$t);
19245
19245
 
19246
19246
  /**
19247
19247
  * @license lucide-react v1.44.0 - ISC
@@ -19251,7 +19251,7 @@
19251
19251
  */
19252
19252
 
19253
19253
 
19254
- const __iconData$t = {
19254
+ const __iconData$s = {
19255
19255
  name: "chevrons-right",
19256
19256
  size: 24,
19257
19257
  node: [
@@ -19259,8 +19259,8 @@
19259
19259
  ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
19260
19260
  ]
19261
19261
  };
19262
- __iconData$t.node;
19263
- const ChevronsRight = createLucideIcon(__iconData$t);
19262
+ __iconData$s.node;
19263
+ const ChevronsRight = createLucideIcon(__iconData$s);
19264
19264
 
19265
19265
  /**
19266
19266
  * @license lucide-react v1.44.0 - ISC
@@ -19270,7 +19270,7 @@
19270
19270
  */
19271
19271
 
19272
19272
 
19273
- const __iconData$s = {
19273
+ const __iconData$r = {
19274
19274
  name: "circle-check",
19275
19275
  size: 24,
19276
19276
  node: [
@@ -19279,29 +19279,8 @@
19279
19279
  ],
19280
19280
  aliases: ["check-circle-2"]
19281
19281
  };
19282
- __iconData$s.node;
19283
- const CircleCheck = createLucideIcon(__iconData$s);
19284
-
19285
- /**
19286
- * @license lucide-react v1.44.0 - ISC
19287
- *
19288
- * This source code is licensed under the ISC license.
19289
- * See the LICENSE file in the root directory of this source tree.
19290
- */
19291
-
19292
-
19293
- const __iconData$r = {
19294
- name: "circle-user-round",
19295
- size: 24,
19296
- node: [
19297
- ["path", { d: "M17.925 20.056a6 6 0 0 0-11.851.001", key: "z69sun" }],
19298
- ["circle", { cx: "12", cy: "11", r: "4", key: "1gt34v" }],
19299
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
19300
- ],
19301
- aliases: ["user-circle-2"]
19302
- };
19303
19282
  __iconData$r.node;
19304
- const CircleUserRound = createLucideIcon(__iconData$r);
19283
+ const CircleCheck = createLucideIcon(__iconData$r);
19305
19284
 
19306
19285
  /**
19307
19286
  * @license lucide-react v1.44.0 - ISC
@@ -19566,29 +19545,6 @@
19566
19545
 
19567
19546
 
19568
19547
  const __iconData$e = {
19569
- name: "languages",
19570
- size: 24,
19571
- node: [
19572
- ["path", { d: "m5 8 6 6", key: "1wu5hv" }],
19573
- ["path", { d: "m4 14 6-6 2-3", key: "1k1g8d" }],
19574
- ["path", { d: "M2 5h12", key: "or177f" }],
19575
- ["path", { d: "M7 2h1", key: "1t2jsx" }],
19576
- ["path", { d: "m22 22-5-10-5 10", key: "don7ne" }],
19577
- ["path", { d: "M14 18h6", key: "1m8k6r" }]
19578
- ]
19579
- };
19580
- __iconData$e.node;
19581
- const Languages = createLucideIcon(__iconData$e);
19582
-
19583
- /**
19584
- * @license lucide-react v1.44.0 - ISC
19585
- *
19586
- * This source code is licensed under the ISC license.
19587
- * See the LICENSE file in the root directory of this source tree.
19588
- */
19589
-
19590
-
19591
- const __iconData$d = {
19592
19548
  name: "link",
19593
19549
  size: 24,
19594
19550
  node: [
@@ -19596,8 +19552,8 @@
19596
19552
  ["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
19597
19553
  ]
19598
19554
  };
19599
- __iconData$d.node;
19600
- const Link = createLucideIcon(__iconData$d);
19555
+ __iconData$e.node;
19556
+ const Link = createLucideIcon(__iconData$e);
19601
19557
 
19602
19558
  /**
19603
19559
  * @license lucide-react v1.44.0 - ISC
@@ -19607,7 +19563,7 @@
19607
19563
  */
19608
19564
 
19609
19565
 
19610
- const __iconData$c = {
19566
+ const __iconData$d = {
19611
19567
  name: "list",
19612
19568
  size: 24,
19613
19569
  node: [
@@ -19619,8 +19575,8 @@
19619
19575
  ["path", { d: "M8 19h13", key: "m83p4d" }]
19620
19576
  ]
19621
19577
  };
19622
- __iconData$c.node;
19623
- const List$1 = createLucideIcon(__iconData$c);
19578
+ __iconData$d.node;
19579
+ const List$1 = createLucideIcon(__iconData$d);
19624
19580
 
19625
19581
  /**
19626
19582
  * @license lucide-react v1.44.0 - ISC
@@ -19630,14 +19586,14 @@
19630
19586
  */
19631
19587
 
19632
19588
 
19633
- const __iconData$b = {
19589
+ const __iconData$c = {
19634
19590
  name: "loader-circle",
19635
19591
  size: 24,
19636
19592
  node: [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]],
19637
19593
  aliases: ["loader-2"]
19638
19594
  };
19639
- __iconData$b.node;
19640
- const LoaderCircle = createLucideIcon(__iconData$b);
19595
+ __iconData$c.node;
19596
+ const LoaderCircle = createLucideIcon(__iconData$c);
19641
19597
 
19642
19598
  /**
19643
19599
  * @license lucide-react v1.44.0 - ISC
@@ -19647,7 +19603,7 @@
19647
19603
  */
19648
19604
 
19649
19605
 
19650
- const __iconData$a = {
19606
+ const __iconData$b = {
19651
19607
  name: "mail-plus",
19652
19608
  size: 24,
19653
19609
  node: [
@@ -19657,8 +19613,8 @@
19657
19613
  ["path", { d: "M16 19h6", key: "xwg31i" }]
19658
19614
  ]
19659
19615
  };
19660
- __iconData$a.node;
19661
- const MailPlus = createLucideIcon(__iconData$a);
19616
+ __iconData$b.node;
19617
+ const MailPlus = createLucideIcon(__iconData$b);
19662
19618
 
19663
19619
  /**
19664
19620
  * @license lucide-react v1.44.0 - ISC
@@ -19668,13 +19624,13 @@
19668
19624
  */
19669
19625
 
19670
19626
 
19671
- const __iconData$9 = {
19627
+ const __iconData$a = {
19672
19628
  name: "minus",
19673
19629
  size: 24,
19674
19630
  node: [["path", { d: "M5 12h14", key: "1ays0h" }]]
19675
19631
  };
19676
- __iconData$9.node;
19677
- const Minus = createLucideIcon(__iconData$9);
19632
+ __iconData$a.node;
19633
+ const Minus = createLucideIcon(__iconData$a);
19678
19634
 
19679
19635
  /**
19680
19636
  * @license lucide-react v1.44.0 - ISC
@@ -19684,7 +19640,7 @@
19684
19640
  */
19685
19641
 
19686
19642
 
19687
- const __iconData$8 = {
19643
+ const __iconData$9 = {
19688
19644
  name: "octagon-x",
19689
19645
  size: 24,
19690
19646
  node: [
@@ -19700,8 +19656,35 @@
19700
19656
  ],
19701
19657
  aliases: ["x-octagon"]
19702
19658
  };
19659
+ __iconData$9.node;
19660
+ const OctagonX = createLucideIcon(__iconData$9);
19661
+
19662
+ /**
19663
+ * @license lucide-react v1.44.0 - ISC
19664
+ *
19665
+ * This source code is licensed under the ISC license.
19666
+ * See the LICENSE file in the root directory of this source tree.
19667
+ */
19668
+
19669
+
19670
+ const __iconData$8 = {
19671
+ name: "refresh-cw-off",
19672
+ size: 24,
19673
+ node: [
19674
+ [
19675
+ "path",
19676
+ { d: "M21 8L18.74 5.74A9.75 9.75 0 0 0 12 3C11 3 10.03 3.16 9.13 3.47", key: "1krf6h" }
19677
+ ],
19678
+ ["path", { d: "M8 16H3v5", key: "1cv678" }],
19679
+ ["path", { d: "M3 12C3 9.51 4 7.26 5.64 5.64", key: "ruvoct" }],
19680
+ ["path", { d: "m3 16 2.26 2.26A9.75 9.75 0 0 0 12 21c2.49 0 4.74-1 6.36-2.64", key: "19q130" }],
19681
+ ["path", { d: "M21 12c0 1-.16 1.97-.47 2.87", key: "4w8emr" }],
19682
+ ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
19683
+ ["path", { d: "M22 22 2 2", key: "1r8tn9" }]
19684
+ ]
19685
+ };
19703
19686
  __iconData$8.node;
19704
- const OctagonX = createLucideIcon(__iconData$8);
19687
+ const RefreshCwOff = createLucideIcon(__iconData$8);
19705
19688
 
19706
19689
  /**
19707
19690
  * @license lucide-react v1.44.0 - ISC
@@ -19773,443 +19756,127 @@
19773
19756
 
19774
19757
 
19775
19758
  const __iconData$4 = {
19776
- name: "settings",
19777
- size: 24,
19778
- node: [
19779
- [
19780
- "path",
19781
- {
19782
- d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
19783
- key: "1i5ecw"
19784
- }
19785
- ],
19786
- ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
19787
- ]
19788
- };
19789
- __iconData$4.node;
19790
- const Settings = createLucideIcon(__iconData$4);
19791
-
19792
- /**
19793
- * @license lucide-react v1.44.0 - ISC
19794
- *
19795
- * This source code is licensed under the ISC license.
19796
- * See the LICENSE file in the root directory of this source tree.
19797
- */
19798
-
19799
-
19800
- const __iconData$3 = {
19801
- name: "search",
19802
- size: 24,
19803
- node: [
19804
- ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
19805
- ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
19806
- ]
19807
- };
19808
- __iconData$3.node;
19809
- const Search = createLucideIcon(__iconData$3);
19810
-
19811
- /**
19812
- * @license lucide-react v1.44.0 - ISC
19813
- *
19814
- * This source code is licensed under the ISC license.
19815
- * See the LICENSE file in the root directory of this source tree.
19816
- */
19817
-
19818
-
19819
- const __iconData$2 = {
19820
- name: "trash",
19821
- size: 24,
19822
- node: [
19823
- ["path", { d: "M10 11v6", key: "nco0om" }],
19824
- ["path", { d: "M14 11v6", key: "outv1u" }],
19825
- ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
19826
- ["path", { d: "M3 6h18", key: "d0wm0j" }],
19827
- ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
19828
- ],
19829
- aliases: ["trash-2"]
19830
- };
19831
- __iconData$2.node;
19832
- const Trash = createLucideIcon(__iconData$2);
19833
-
19834
- /**
19835
- * @license lucide-react v1.44.0 - ISC
19836
- *
19837
- * This source code is licensed under the ISC license.
19838
- * See the LICENSE file in the root directory of this source tree.
19839
- */
19840
-
19841
-
19842
- const __iconData$1 = {
19843
- name: "triangle-alert",
19844
- size: 24,
19845
- node: [
19846
- [
19847
- "path",
19848
- {
19849
- d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
19850
- key: "wmoenq"
19851
- }
19852
- ],
19853
- ["path", { d: "M12 9v4", key: "juzpu7" }],
19854
- ["path", { d: "M12 17h.01", key: "p32p05" }]
19855
- ],
19856
- aliases: ["alert-triangle"]
19857
- };
19858
- __iconData$1.node;
19859
- const TriangleAlert = createLucideIcon(__iconData$1);
19860
-
19861
- /**
19862
- * @license lucide-react v1.44.0 - ISC
19863
- *
19864
- * This source code is licensed under the ISC license.
19865
- * See the LICENSE file in the root directory of this source tree.
19866
- */
19867
-
19868
-
19869
- const __iconData = {
19870
- name: "x",
19871
- size: 24,
19872
- node: [
19873
- ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
19874
- ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
19875
- ]
19876
- };
19877
- __iconData.node;
19878
- const X = createLucideIcon(__iconData);
19879
-
19880
- const Toaster = ({ ...props }) => {
19881
- const { theme = 'system' } = z();
19882
- return (jsxRuntimeExports.jsx(Toaster$1, { theme: theme, position: "bottom-center", className: "toaster group", icons: {
19883
- success: jsxRuntimeExports.jsx(CircleCheck, { className: "size-4" }),
19884
- info: jsxRuntimeExports.jsx(Info, { className: "size-4" }),
19885
- warning: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-4" }),
19886
- error: jsxRuntimeExports.jsx(OctagonX, { className: "size-4" }),
19887
- loading: jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin" }),
19888
- }, style: {
19889
- '--normal-bg': 'var(--popover)',
19890
- '--normal-text': 'var(--popover-foreground)',
19891
- '--normal-border': 'var(--border)',
19892
- '--border-radius': 'var(--radius)',
19893
- }, ...props }));
19894
- };
19895
-
19896
- const dependencyShowClassName = 'dependency-show';
19897
- const dependencySelector = '[data-dependency]';
19898
- const events = ['input', 'change'];
19899
- function containsDependencyField(nodes) {
19900
- return Array.from(nodes).some((node) => node instanceof Element &&
19901
- (node.matches(dependencySelector) || Boolean(node.querySelector(dependencySelector))));
19902
- }
19903
- function useFieldDependencies(refreshKey) {
19904
- const cleanupRef = reactExports.useRef(() => undefined);
19905
- const refreshDependencies = reactExports.useCallback(() => {
19906
- cleanupRef.current();
19907
- cleanupRef.current = initializeFieldDependencies();
19908
- }, []);
19909
- reactExports.useEffect(() => {
19910
- refreshDependencies();
19911
- // Radix unmounts closed dialogs and inactive tab panels, so dependent fields
19912
- // often mount long after this hook runs. Without rebinding they would keep
19913
- // their initial hidden state forever, with no listeners on their sources.
19914
- const observer = new MutationObserver((records) => {
19915
- const touchesDependencies = records.some((record) => containsDependencyField(record.addedNodes) || containsDependencyField(record.removedNodes));
19916
- if (touchesDependencies) {
19917
- refreshDependencies();
19918
- }
19919
- });
19920
- observer.observe(document.body, { childList: true, subtree: true });
19921
- return () => {
19922
- observer.disconnect();
19923
- cleanupRef.current();
19924
- cleanupRef.current = () => undefined;
19925
- };
19926
- }, [refreshDependencies, refreshKey]);
19927
- return refreshDependencies;
19928
- }
19929
- function initializeFieldDependencies(root = document) {
19930
- const cleanupCallbacks = [];
19931
- const fields = Array.from(root.querySelectorAll(dependencySelector));
19932
- fields.forEach((field) => {
19933
- const dependency = field.dataset.dependency;
19934
- if (!dependency) {
19935
- return;
19936
- }
19937
- try {
19938
- const conditions = JSON.parse(dependency);
19939
- applyDependencyState(field, conditions);
19940
- cleanupCallbacks.push(...bindDependencyListeners(field, conditions));
19941
- }
19942
- catch (e) {
19943
- console.error('[Dependencies] Error parsing conditions for field:', field, e);
19944
- }
19945
- });
19946
- return () => {
19947
- cleanupCallbacks.forEach((cleanup) => cleanup());
19948
- };
19949
- }
19950
- function bindDependencyListeners(field, conditions) {
19951
- const cleanupCallbacks = [];
19952
- conditions.forEach((rules) => {
19953
- Object.keys(rules).forEach((selector) => {
19954
- const element = document.querySelector(selector);
19955
- if (!element) {
19956
- return;
19957
- }
19958
- // Toggle controls never emit input/change; aria-checked is the only
19959
- // signal, and watching it also catches programmatic updates.
19960
- if (isToggleControl(element)) {
19961
- const observer = new MutationObserver(() => applyDependencyState(field, conditions));
19962
- observer.observe(element, { attributes: true, attributeFilter: ['aria-checked'] });
19963
- cleanupCallbacks.push(() => observer.disconnect());
19964
- return;
19965
- }
19966
- events.forEach((event) => {
19967
- const listener = () => applyDependencyState(field, conditions);
19968
- element.addEventListener(event, listener);
19969
- cleanupCallbacks.push(() => element.removeEventListener(event, listener));
19970
- });
19971
- });
19972
- });
19973
- return cleanupCallbacks;
19974
- }
19975
- function applyDependencyState(field, conditions) {
19976
- if (checkConditions(conditions)) {
19977
- field.classList.add(dependencyShowClassName);
19978
- }
19979
- else {
19980
- field.classList.remove(dependencyShowClassName);
19981
- }
19982
- }
19983
- function checkConditions(conditions) {
19984
- return conditions.every((conditionObj) => {
19985
- const selectors = Object.keys(conditionObj);
19986
- return selectors.every((selector) => evaluateDependencyRule(selector, conditionObj[selector]));
19987
- });
19988
- }
19989
- function evaluateDependencyRule(selector, condition) {
19990
- const type = condition.type;
19991
- const currentValue = getValue(selector);
19992
- const checkValue = typeof condition.value === 'undefined' ? false : condition.value;
19993
- let minValue = typeof condition.min === 'undefined' ? false : Number.parseInt(String(condition.min), 10);
19994
- let maxValue = typeof condition.max === 'undefined' ? false : Number.parseInt(String(condition.max), 10);
19995
- const allowEmpty = typeof condition.empty === 'undefined' ? false : condition.empty;
19996
- const isEmpty = !allowEmpty && currentValue.length < 1;
19997
- const likeSelector = typeof condition.like === 'undefined' ? false : condition.like;
19998
- const likeSelectorValue = getValue(likeSelector);
19999
- const regExpPattern = typeof condition.pattern === 'undefined' ? false : condition.pattern;
20000
- const regExpModifier = typeof condition.modifier === 'undefined' ? 'gi' : condition.modifier;
20001
- const sign = typeof condition.sign === 'undefined' ? false : condition.sign;
20002
- const strict = typeof condition.strict === 'undefined' ? false : condition.strict;
20003
- const emptyTypes = ['empty', 'blank'];
20004
- const notEmptyTypes = ['!empty', 'notEmpty', 'not-empty', 'notempty'];
20005
- const equalTypes = ['equal', '=', '==', '==='];
20006
- const notEqualTypes = ['!equal', '!=', '!==', '!===', 'notEqual', 'not-equal', 'notequal'];
20007
- const regularExpressionTypes = ['regexp', 'exp', 'expression', 'match'];
20008
- if (type && emptyTypes.includes(type)) {
20009
- return currentValue.length < 1;
20010
- }
20011
- if (type && notEmptyTypes.includes(type)) {
20012
- return currentValue.length > 0;
20013
- }
20014
- if (type && equalTypes.includes(type)) {
20015
- if (isEmpty) {
20016
- return false;
20017
- }
20018
- if (likeSelector) {
20019
- return strict
20020
- ? likeSelectorValue.every((value) => currentValue.includes(value))
20021
- : likeSelectorValue.some((value) => currentValue.includes(value));
20022
- }
20023
- if (strict) {
20024
- if (checkValue && Array.isArray(checkValue)) {
20025
- return checkValue.every((value) => currentValue.includes(value));
20026
- }
20027
- if (checkValue && !Array.isArray(checkValue)) {
20028
- return currentValue.includes(checkValue);
20029
- }
20030
- }
20031
- else {
20032
- if (checkValue && Array.isArray(checkValue)) {
20033
- return checkValue.some((value) => currentValue.includes(value));
20034
- }
20035
- if (checkValue && !Array.isArray(checkValue)) {
20036
- return currentValue.includes(checkValue);
20037
- }
20038
- }
20039
- }
20040
- if (type && notEqualTypes.includes(type)) {
20041
- if (isEmpty) {
20042
- return false;
20043
- }
20044
- if (likeSelector) {
20045
- return strict
20046
- ? likeSelectorValue.every((value) => !currentValue.includes(value))
20047
- : likeSelectorValue.some((value) => !currentValue.includes(value));
20048
- }
20049
- if (strict) {
20050
- if (checkValue && Array.isArray(checkValue)) {
20051
- return checkValue.every((value) => !currentValue.includes(value));
20052
- }
20053
- if (checkValue && !Array.isArray(checkValue)) {
20054
- return !currentValue.includes(checkValue);
20055
- }
20056
- }
20057
- else {
20058
- if (checkValue && Array.isArray(checkValue)) {
20059
- return checkValue.some((value) => !currentValue.includes(value));
20060
- }
20061
- if (checkValue && !Array.isArray(checkValue)) {
20062
- return !currentValue.includes(checkValue);
20063
- }
20064
- }
20065
- }
20066
- if (type && regularExpressionTypes.includes(type) && regExpPattern) {
20067
- if (isEmpty) {
20068
- return false;
20069
- }
20070
- const exp = new RegExp(regExpPattern, regExpModifier);
20071
- return currentValue.every((value) => exp.test(String(value)));
20072
- }
20073
- if (type === 'length') {
20074
- if (isEmpty) {
20075
- return false;
20076
- }
20077
- if (checkValue && Array.isArray(checkValue)) {
20078
- minValue = Number.parseInt(String(checkValue[0]), 10);
20079
- maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
20080
- }
20081
- if (checkValue && !Array.isArray(checkValue)) {
20082
- minValue = Number.parseInt(String(checkValue), 10);
20083
- maxValue = false;
20084
- }
20085
- const minBoundary = minValue === false ? 0 : minValue;
20086
- const maxBoundary = maxValue === false ? 0 : maxValue;
20087
- return currentValue.every((value) => {
20088
- const valueLength = String(value).length;
20089
- if (!maxValue) {
20090
- return valueLength >= minBoundary;
20091
- }
20092
- if (!minValue) {
20093
- return valueLength <= maxBoundary;
20094
- }
20095
- return valueLength >= minBoundary && valueLength <= maxBoundary;
20096
- });
20097
- }
20098
- if (type === 'range') {
20099
- if (isEmpty) {
20100
- return false;
20101
- }
20102
- if (checkValue && Array.isArray(checkValue)) {
20103
- minValue = Number.parseInt(String(checkValue[0]), 10);
20104
- maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
20105
- }
20106
- const minBoundary = minValue === false ? 0 : minValue;
20107
- const maxBoundary = maxValue === false ? 0 : maxValue;
20108
- return currentValue.every((value) => {
20109
- const numericValue = Number.parseInt(String(value), 10);
20110
- if (!maxValue) {
20111
- return numericValue > minBoundary;
20112
- }
20113
- if (!minValue) {
20114
- return numericValue < maxBoundary;
20115
- }
20116
- return numericValue > minBoundary && numericValue < maxBoundary;
20117
- });
20118
- }
20119
- if (type === 'compare' && sign && checkValue) {
20120
- if (isEmpty) {
20121
- return false;
20122
- }
20123
- const numericCheckValue = Number.parseInt(String(checkValue), 10);
20124
- switch (sign) {
20125
- case '<':
20126
- return currentValue.every((value) => Number.parseInt(String(value), 10) < numericCheckValue);
20127
- case '<=':
20128
- return currentValue.every((value) => Number.parseInt(String(value), 10) <= numericCheckValue);
20129
- case '>':
20130
- return currentValue.every((value) => Number.parseInt(String(value), 10) > numericCheckValue);
20131
- case '>=':
20132
- return currentValue.every((value) => Number.parseInt(String(value), 10) >= numericCheckValue);
20133
- case '=':
20134
- case '==':
20135
- return currentValue.every((value) => Number.parseInt(String(value), 10) === numericCheckValue);
20136
- }
20137
- }
20138
- return false;
20139
- }
20140
- // shadcn checkboxes and switches render as <button role="checkbox|switch">, which
20141
- // carries a static value="on" - the checked state only lives in aria-checked.
20142
- function isToggleControl(element) {
20143
- const role = element.getAttribute('role');
20144
- return role === 'checkbox' || role === 'switch';
20145
- }
20146
- function readElementValue(element) {
20147
- if (isToggleControl(element)) {
20148
- return element.getAttribute('aria-checked') === 'true';
20149
- }
20150
- if (element instanceof HTMLInputElement && element.type === 'checkbox') {
20151
- return element.checked;
20152
- }
20153
- return element.value;
20154
- }
20155
- function getValue(selector) {
20156
- const values = [];
20157
- const element = selector ? document.querySelector(selector) : null;
20158
- if (selector && element) {
20159
- const inputType = element.tagName.toLowerCase();
20160
- let currentSelector = selector;
20161
- if (inputType === 'select') {
20162
- currentSelector = `${selector} option:checked`;
20163
- }
20164
- document.querySelectorAll(currentSelector).forEach((match) => {
20165
- values.push(readElementValue(match));
20166
- });
20167
- }
20168
- return values.filter((value) => value !== '');
20169
- }
19759
+ name: "settings",
19760
+ size: 24,
19761
+ node: [
19762
+ [
19763
+ "path",
19764
+ {
19765
+ d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
19766
+ key: "1i5ecw"
19767
+ }
19768
+ ],
19769
+ ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
19770
+ ]
19771
+ };
19772
+ __iconData$4.node;
19773
+ const Settings = createLucideIcon(__iconData$4);
20170
19774
 
20171
- function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
19775
+ /**
19776
+ * @license lucide-react v1.44.0 - ISC
19777
+ *
19778
+ * This source code is licensed under the ISC license.
19779
+ * See the LICENSE file in the root directory of this source tree.
19780
+ */
20172
19781
 
20173
- const falsyToString = (value)=>typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
20174
- const cx = clsx;
20175
- const cva = (base, config)=>(props)=>{
20176
- var _config_compoundVariants;
20177
- if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
20178
- const { variants, defaultVariants } = config;
20179
- const getVariantClassNames = Object.keys(variants).map((variant)=>{
20180
- const variantProp = props === null || props === void 0 ? void 0 : props[variant];
20181
- const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
20182
- if (variantProp === null) return null;
20183
- const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
20184
- return variants[variant][variantKey];
20185
- });
20186
- const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{
20187
- let [key, value] = param;
20188
- if (value === undefined) {
20189
- return acc;
20190
- }
20191
- acc[key] = value;
20192
- return acc;
20193
- }, {});
20194
- const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{
20195
- let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
20196
- return Object.entries(compoundVariantOptions).every((param)=>{
20197
- let [key, value] = param;
20198
- return Array.isArray(value) ? value.includes({
20199
- ...defaultVariants,
20200
- ...propsWithoutUndefined
20201
- }[key]) : ({
20202
- ...defaultVariants,
20203
- ...propsWithoutUndefined
20204
- })[key] === value;
20205
- }) ? [
20206
- ...acc,
20207
- cvClass,
20208
- cvClassName
20209
- ] : acc;
20210
- }, []);
20211
- return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
20212
- };
19782
+
19783
+ const __iconData$3 = {
19784
+ name: "search",
19785
+ size: 24,
19786
+ node: [
19787
+ ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
19788
+ ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
19789
+ ]
19790
+ };
19791
+ __iconData$3.node;
19792
+ const Search = createLucideIcon(__iconData$3);
19793
+
19794
+ /**
19795
+ * @license lucide-react v1.44.0 - ISC
19796
+ *
19797
+ * This source code is licensed under the ISC license.
19798
+ * See the LICENSE file in the root directory of this source tree.
19799
+ */
19800
+
19801
+
19802
+ const __iconData$2 = {
19803
+ name: "trash",
19804
+ size: 24,
19805
+ node: [
19806
+ ["path", { d: "M10 11v6", key: "nco0om" }],
19807
+ ["path", { d: "M14 11v6", key: "outv1u" }],
19808
+ ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
19809
+ ["path", { d: "M3 6h18", key: "d0wm0j" }],
19810
+ ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
19811
+ ],
19812
+ aliases: ["trash-2"]
19813
+ };
19814
+ __iconData$2.node;
19815
+ const Trash = createLucideIcon(__iconData$2);
19816
+
19817
+ /**
19818
+ * @license lucide-react v1.44.0 - ISC
19819
+ *
19820
+ * This source code is licensed under the ISC license.
19821
+ * See the LICENSE file in the root directory of this source tree.
19822
+ */
19823
+
19824
+
19825
+ const __iconData$1 = {
19826
+ name: "triangle-alert",
19827
+ size: 24,
19828
+ node: [
19829
+ [
19830
+ "path",
19831
+ {
19832
+ d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
19833
+ key: "wmoenq"
19834
+ }
19835
+ ],
19836
+ ["path", { d: "M12 9v4", key: "juzpu7" }],
19837
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
19838
+ ],
19839
+ aliases: ["alert-triangle"]
19840
+ };
19841
+ __iconData$1.node;
19842
+ const TriangleAlert = createLucideIcon(__iconData$1);
19843
+
19844
+ /**
19845
+ * @license lucide-react v1.44.0 - ISC
19846
+ *
19847
+ * This source code is licensed under the ISC license.
19848
+ * See the LICENSE file in the root directory of this source tree.
19849
+ */
19850
+
19851
+
19852
+ const __iconData = {
19853
+ name: "x",
19854
+ size: 24,
19855
+ node: [
19856
+ ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
19857
+ ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
19858
+ ]
19859
+ };
19860
+ __iconData.node;
19861
+ const X = createLucideIcon(__iconData);
19862
+
19863
+ const Toaster = ({ ...props }) => {
19864
+ const { theme = 'system' } = z();
19865
+ return (jsxRuntimeExports.jsx(Toaster$1, { theme: theme, position: "bottom-center", className: "toaster group", icons: {
19866
+ success: jsxRuntimeExports.jsx(CircleCheck, { className: "size-4" }),
19867
+ info: jsxRuntimeExports.jsx(Info, { className: "size-4" }),
19868
+ warning: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-4" }),
19869
+ error: jsxRuntimeExports.jsx(OctagonX, { className: "size-4" }),
19870
+ loading: jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin" }),
19871
+ }, style: {
19872
+ '--normal-bg': 'var(--popover)',
19873
+ '--normal-text': 'var(--popover-foreground)',
19874
+ '--normal-border': 'var(--border)',
19875
+ '--border-radius': 'var(--radius)',
19876
+ }, ...props }));
19877
+ };
19878
+
19879
+ function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
20213
19880
 
20214
19881
  /**
20215
19882
  * Concatenates two arrays faster than the array spread operator.
@@ -23494,6 +23161,322 @@
23494
23161
  return twMerge(clsx(inputs));
23495
23162
  }
23496
23163
 
23164
+ const dependencyShowClassName = 'dependency-show';
23165
+ const dependencySelector = '[data-dependency]';
23166
+ const events = ['input', 'change'];
23167
+ function containsDependencyField(nodes) {
23168
+ return Array.from(nodes).some((node) => node instanceof Element &&
23169
+ (node.matches(dependencySelector) || Boolean(node.querySelector(dependencySelector))));
23170
+ }
23171
+ function useFieldDependencies(refreshKey) {
23172
+ const cleanupRef = reactExports.useRef(() => undefined);
23173
+ const refreshDependencies = reactExports.useCallback(() => {
23174
+ cleanupRef.current();
23175
+ cleanupRef.current = initializeFieldDependencies();
23176
+ }, []);
23177
+ reactExports.useEffect(() => {
23178
+ refreshDependencies();
23179
+ // Radix unmounts closed dialogs and inactive tab panels, so dependent fields
23180
+ // often mount long after this hook runs. Without rebinding they would keep
23181
+ // their initial hidden state forever, with no listeners on their sources.
23182
+ const observer = new MutationObserver((records) => {
23183
+ const touchesDependencies = records.some((record) => containsDependencyField(record.addedNodes) || containsDependencyField(record.removedNodes));
23184
+ if (touchesDependencies) {
23185
+ refreshDependencies();
23186
+ }
23187
+ });
23188
+ observer.observe(document.body, { childList: true, subtree: true });
23189
+ return () => {
23190
+ observer.disconnect();
23191
+ cleanupRef.current();
23192
+ cleanupRef.current = () => undefined;
23193
+ };
23194
+ }, [refreshDependencies, refreshKey]);
23195
+ return refreshDependencies;
23196
+ }
23197
+ function initializeFieldDependencies(root = document) {
23198
+ const cleanupCallbacks = [];
23199
+ const fields = Array.from(root.querySelectorAll(dependencySelector));
23200
+ fields.forEach((field) => {
23201
+ const dependency = field.dataset.dependency;
23202
+ if (!dependency) {
23203
+ return;
23204
+ }
23205
+ try {
23206
+ const conditions = JSON.parse(dependency);
23207
+ applyDependencyState(field, conditions);
23208
+ cleanupCallbacks.push(...bindDependencyListeners(field, conditions));
23209
+ }
23210
+ catch (e) {
23211
+ console.error('[Dependencies] Error parsing conditions for field:', field, e);
23212
+ }
23213
+ });
23214
+ return () => {
23215
+ cleanupCallbacks.forEach((cleanup) => cleanup());
23216
+ };
23217
+ }
23218
+ function bindDependencyListeners(field, conditions) {
23219
+ const cleanupCallbacks = [];
23220
+ conditions.forEach((rules) => {
23221
+ Object.keys(rules).forEach((selector) => {
23222
+ const element = document.querySelector(selector);
23223
+ if (!element) {
23224
+ return;
23225
+ }
23226
+ // Toggle controls never emit input/change; aria-checked is the only
23227
+ // signal, and watching it also catches programmatic updates.
23228
+ if (isToggleControl(element)) {
23229
+ const observer = new MutationObserver(() => applyDependencyState(field, conditions));
23230
+ observer.observe(element, { attributes: true, attributeFilter: ['aria-checked'] });
23231
+ cleanupCallbacks.push(() => observer.disconnect());
23232
+ return;
23233
+ }
23234
+ events.forEach((event) => {
23235
+ const listener = () => applyDependencyState(field, conditions);
23236
+ element.addEventListener(event, listener);
23237
+ cleanupCallbacks.push(() => element.removeEventListener(event, listener));
23238
+ });
23239
+ });
23240
+ });
23241
+ return cleanupCallbacks;
23242
+ }
23243
+ function applyDependencyState(field, conditions) {
23244
+ if (checkConditions(conditions)) {
23245
+ field.classList.add(dependencyShowClassName);
23246
+ }
23247
+ else {
23248
+ field.classList.remove(dependencyShowClassName);
23249
+ }
23250
+ }
23251
+ function checkConditions(conditions) {
23252
+ return conditions.every((conditionObj) => {
23253
+ const selectors = Object.keys(conditionObj);
23254
+ return selectors.every((selector) => evaluateDependencyRule(selector, conditionObj[selector]));
23255
+ });
23256
+ }
23257
+ function evaluateDependencyRule(selector, condition) {
23258
+ const type = condition.type;
23259
+ const currentValue = getValue(selector);
23260
+ const checkValue = typeof condition.value === 'undefined' ? false : condition.value;
23261
+ let minValue = typeof condition.min === 'undefined' ? false : Number.parseInt(String(condition.min), 10);
23262
+ let maxValue = typeof condition.max === 'undefined' ? false : Number.parseInt(String(condition.max), 10);
23263
+ const allowEmpty = typeof condition.empty === 'undefined' ? false : condition.empty;
23264
+ const isEmpty = !allowEmpty && currentValue.length < 1;
23265
+ const likeSelector = typeof condition.like === 'undefined' ? false : condition.like;
23266
+ const likeSelectorValue = getValue(likeSelector);
23267
+ const regExpPattern = typeof condition.pattern === 'undefined' ? false : condition.pattern;
23268
+ const regExpModifier = typeof condition.modifier === 'undefined' ? 'gi' : condition.modifier;
23269
+ const sign = typeof condition.sign === 'undefined' ? false : condition.sign;
23270
+ const strict = typeof condition.strict === 'undefined' ? false : condition.strict;
23271
+ const emptyTypes = ['empty', 'blank'];
23272
+ const notEmptyTypes = ['!empty', 'notEmpty', 'not-empty', 'notempty'];
23273
+ const equalTypes = ['equal', '=', '==', '==='];
23274
+ const notEqualTypes = ['!equal', '!=', '!==', '!===', 'notEqual', 'not-equal', 'notequal'];
23275
+ const regularExpressionTypes = ['regexp', 'exp', 'expression', 'match'];
23276
+ if (type && emptyTypes.includes(type)) {
23277
+ return currentValue.length < 1;
23278
+ }
23279
+ if (type && notEmptyTypes.includes(type)) {
23280
+ return currentValue.length > 0;
23281
+ }
23282
+ if (type && equalTypes.includes(type)) {
23283
+ if (isEmpty) {
23284
+ return false;
23285
+ }
23286
+ if (likeSelector) {
23287
+ return strict
23288
+ ? likeSelectorValue.every((value) => currentValue.includes(value))
23289
+ : likeSelectorValue.some((value) => currentValue.includes(value));
23290
+ }
23291
+ if (strict) {
23292
+ if (checkValue && Array.isArray(checkValue)) {
23293
+ return checkValue.every((value) => currentValue.includes(value));
23294
+ }
23295
+ if (checkValue && !Array.isArray(checkValue)) {
23296
+ return currentValue.includes(checkValue);
23297
+ }
23298
+ }
23299
+ else {
23300
+ if (checkValue && Array.isArray(checkValue)) {
23301
+ return checkValue.some((value) => currentValue.includes(value));
23302
+ }
23303
+ if (checkValue && !Array.isArray(checkValue)) {
23304
+ return currentValue.includes(checkValue);
23305
+ }
23306
+ }
23307
+ }
23308
+ if (type && notEqualTypes.includes(type)) {
23309
+ if (isEmpty) {
23310
+ return false;
23311
+ }
23312
+ if (likeSelector) {
23313
+ return strict
23314
+ ? likeSelectorValue.every((value) => !currentValue.includes(value))
23315
+ : likeSelectorValue.some((value) => !currentValue.includes(value));
23316
+ }
23317
+ if (strict) {
23318
+ if (checkValue && Array.isArray(checkValue)) {
23319
+ return checkValue.every((value) => !currentValue.includes(value));
23320
+ }
23321
+ if (checkValue && !Array.isArray(checkValue)) {
23322
+ return !currentValue.includes(checkValue);
23323
+ }
23324
+ }
23325
+ else {
23326
+ if (checkValue && Array.isArray(checkValue)) {
23327
+ return checkValue.some((value) => !currentValue.includes(value));
23328
+ }
23329
+ if (checkValue && !Array.isArray(checkValue)) {
23330
+ return !currentValue.includes(checkValue);
23331
+ }
23332
+ }
23333
+ }
23334
+ if (type && regularExpressionTypes.includes(type) && regExpPattern) {
23335
+ if (isEmpty) {
23336
+ return false;
23337
+ }
23338
+ const exp = new RegExp(regExpPattern, regExpModifier);
23339
+ return currentValue.every((value) => exp.test(String(value)));
23340
+ }
23341
+ if (type === 'length') {
23342
+ if (isEmpty) {
23343
+ return false;
23344
+ }
23345
+ if (checkValue && Array.isArray(checkValue)) {
23346
+ minValue = Number.parseInt(String(checkValue[0]), 10);
23347
+ maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
23348
+ }
23349
+ if (checkValue && !Array.isArray(checkValue)) {
23350
+ minValue = Number.parseInt(String(checkValue), 10);
23351
+ maxValue = false;
23352
+ }
23353
+ const minBoundary = minValue === false ? 0 : minValue;
23354
+ const maxBoundary = maxValue === false ? 0 : maxValue;
23355
+ return currentValue.every((value) => {
23356
+ const valueLength = String(value).length;
23357
+ if (!maxValue) {
23358
+ return valueLength >= minBoundary;
23359
+ }
23360
+ if (!minValue) {
23361
+ return valueLength <= maxBoundary;
23362
+ }
23363
+ return valueLength >= minBoundary && valueLength <= maxBoundary;
23364
+ });
23365
+ }
23366
+ if (type === 'range') {
23367
+ if (isEmpty) {
23368
+ return false;
23369
+ }
23370
+ if (checkValue && Array.isArray(checkValue)) {
23371
+ minValue = Number.parseInt(String(checkValue[0]), 10);
23372
+ maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
23373
+ }
23374
+ const minBoundary = minValue === false ? 0 : minValue;
23375
+ const maxBoundary = maxValue === false ? 0 : maxValue;
23376
+ return currentValue.every((value) => {
23377
+ const numericValue = Number.parseInt(String(value), 10);
23378
+ if (!maxValue) {
23379
+ return numericValue > minBoundary;
23380
+ }
23381
+ if (!minValue) {
23382
+ return numericValue < maxBoundary;
23383
+ }
23384
+ return numericValue > minBoundary && numericValue < maxBoundary;
23385
+ });
23386
+ }
23387
+ if (type === 'compare' && sign && checkValue) {
23388
+ if (isEmpty) {
23389
+ return false;
23390
+ }
23391
+ const numericCheckValue = Number.parseInt(String(checkValue), 10);
23392
+ switch (sign) {
23393
+ case '<':
23394
+ return currentValue.every((value) => Number.parseInt(String(value), 10) < numericCheckValue);
23395
+ case '<=':
23396
+ return currentValue.every((value) => Number.parseInt(String(value), 10) <= numericCheckValue);
23397
+ case '>':
23398
+ return currentValue.every((value) => Number.parseInt(String(value), 10) > numericCheckValue);
23399
+ case '>=':
23400
+ return currentValue.every((value) => Number.parseInt(String(value), 10) >= numericCheckValue);
23401
+ case '=':
23402
+ case '==':
23403
+ return currentValue.every((value) => Number.parseInt(String(value), 10) === numericCheckValue);
23404
+ }
23405
+ }
23406
+ return false;
23407
+ }
23408
+ // shadcn checkboxes and switches render as <button role="checkbox|switch">, which
23409
+ // carries a static value="on" - the checked state only lives in aria-checked.
23410
+ function isToggleControl(element) {
23411
+ const role = element.getAttribute('role');
23412
+ return role === 'checkbox' || role === 'switch';
23413
+ }
23414
+ function readElementValue(element) {
23415
+ if (isToggleControl(element)) {
23416
+ return element.getAttribute('aria-checked') === 'true';
23417
+ }
23418
+ if (element instanceof HTMLInputElement && element.type === 'checkbox') {
23419
+ return element.checked;
23420
+ }
23421
+ return element.value;
23422
+ }
23423
+ function getValue(selector) {
23424
+ const values = [];
23425
+ const element = selector ? document.querySelector(selector) : null;
23426
+ if (selector && element) {
23427
+ const inputType = element.tagName.toLowerCase();
23428
+ let currentSelector = selector;
23429
+ if (inputType === 'select') {
23430
+ currentSelector = `${selector} option:checked`;
23431
+ }
23432
+ document.querySelectorAll(currentSelector).forEach((match) => {
23433
+ values.push(readElementValue(match));
23434
+ });
23435
+ }
23436
+ return values.filter((value) => value !== '');
23437
+ }
23438
+
23439
+ const falsyToString = (value)=>typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
23440
+ const cx = clsx;
23441
+ const cva = (base, config)=>(props)=>{
23442
+ var _config_compoundVariants;
23443
+ if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
23444
+ const { variants, defaultVariants } = config;
23445
+ const getVariantClassNames = Object.keys(variants).map((variant)=>{
23446
+ const variantProp = props === null || props === void 0 ? void 0 : props[variant];
23447
+ const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
23448
+ if (variantProp === null) return null;
23449
+ const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
23450
+ return variants[variant][variantKey];
23451
+ });
23452
+ const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{
23453
+ let [key, value] = param;
23454
+ if (value === undefined) {
23455
+ return acc;
23456
+ }
23457
+ acc[key] = value;
23458
+ return acc;
23459
+ }, {});
23460
+ const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{
23461
+ let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
23462
+ return Object.entries(compoundVariantOptions).every((param)=>{
23463
+ let [key, value] = param;
23464
+ return Array.isArray(value) ? value.includes({
23465
+ ...defaultVariants,
23466
+ ...propsWithoutUndefined
23467
+ }[key]) : ({
23468
+ ...defaultVariants,
23469
+ ...propsWithoutUndefined
23470
+ })[key] === value;
23471
+ }) ? [
23472
+ ...acc,
23473
+ cvClass,
23474
+ cvClassName
23475
+ ] : acc;
23476
+ }, []);
23477
+ return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
23478
+ };
23479
+
23497
23480
  const alertVariants = cva('relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', {
23498
23481
  variants: {
23499
23482
  variant: {
@@ -23545,11 +23528,12 @@
23545
23528
  };
23546
23529
  function AppAlert({ title, variant = 'info', hideIcon = false, className, children, dangerouslySetInnerHTML, ...props }) {
23547
23530
  const Icon = variantIcons[variant];
23548
- return (jsxRuntimeExports.jsxs(Alert, { variant: variant === 'destructive' ? 'destructive' : 'default', className: cn(variantStyles[variant], className), ...props, children: [!hideIcon && jsxRuntimeExports.jsx(Icon, {}), title && jsxRuntimeExports.jsx(AlertTitle, { children: title }), dangerouslySetInnerHTML ? (jsxRuntimeExports.jsx(AlertDescription, { dangerouslySetInnerHTML: dangerouslySetInnerHTML })) : (jsxRuntimeExports.jsx(AlertDescription, { children: children }))] }));
23531
+ return (jsxRuntimeExports.jsxs(Alert, { variant: variant === 'destructive' ? 'destructive' : 'default', className: cn(variantStyles[variant], className), ...props, children: [!hideIcon && jsxRuntimeExports.jsx(Icon, {}), title && jsxRuntimeExports.jsx(AlertTitle, { children: title }), dangerouslySetInnerHTML ? (jsxRuntimeExports.jsx(AlertDescription, { className: "html-content block", dangerouslySetInnerHTML: dangerouslySetInnerHTML })) : (jsxRuntimeExports.jsx(AlertDescription, { children: children }))] }));
23549
23532
  }
23550
23533
 
23534
+ // Two brand files, each tuned for its own background, swapped by theme.
23551
23535
  function CrowdinMark({ className }) {
23552
- return (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 248 248", className: className, fill: "none", "aria-hidden": "true", children: [jsxRuntimeExports.jsx("path", { d: "M163.024 177.312c-6 0-11.357-1.798-15.785-5.317-5.285-4.144-9.5-10.321-9.642-17.593-.072-3.675 3.928-3.675 3.928-3.675s6.5-.078 9.642-.078c3.143.078 4.071 4.457 4.214 5.551 1.214 9.853 6.785 14.153 11.071 16.108 2.571 1.173 1.928 4.848-3.428 5.004Z", fill: "currentColor" }), jsxRuntimeExports.jsx("path", { d: "M109.1 127.248c-5.284-.622-13.138-1.166-18.208-2.409-8.211-2.02-7.997-9.401-7.64-11.809.999-7.226 3.642-13.908 7.712-20.123 5.069-7.614 12.353-14.296 21.706-19.734 17.565-10.178 42.128-15.85 69.118-15.85 19.779 0 40.414 2.564 40.628 2.564 1.857.233 3.214 2.02 3.142 4.04-.071 2.02-1.499 3.574-3.356 3.73-2.999-.078-5.926-.078-8.711-.078-27.49 0-47.054 3.729-61.621 11.809-14.352 7.925-24.348 20.045-31.131 37.993-.714 1.553-3.071 10.799-11.639 9.867Z", fill: "currentColor" }), jsxRuntimeExports.jsx("path", { d: "M133.089 201.326c-13.638 0-26.495-5.889-36.226-16.645-8.239-9.107-13.212-18.293-14.135-30.07-.568-7.694 2.841-10.363 7.458-9.892 3.197.314 13.141.785 18.823 1.963 4.262.863 7.103 3.219 7.814 8.086 3.764 25.909 20.101 36.116 29.832 38.314 1.705.393 2.771 1.492 2.7 3.455-.071 1.884-1.35 3.454-3.055 3.768-4.333.707-8.879 1.021-13.211 1.021Z", fill: "currentColor" }), jsxRuntimeExports.jsx("path", { d: "M94.224 224.321c-9.677 0-19.141-1.539-21.844-2.025-11.385-2.026-20.92-5.51-29.103-10.696-19.568-12.397-31.38-34.274-32.803-60.203-.356-6.158-1.138-17.907 13.52-17.016 6.048.324 15.654 3.241 22.414 5.186 8.396 2.35 12.452 8.832 12.452 15.233 0 36.543 33.087 60.689 47.532 60.689 6.191 0 3.914 6.645 1.21 7.374-4.768 1.296-10.887 1.458-13.378 1.458Z", fill: "currentColor" }), jsxRuntimeExports.jsx("path", { d: "M43.75 116.947c-5.724-1.026-11.305-3.393-16.743-4.734-16.814-4.182-13.952-21.147-12.378-25.802 15.312-45.054 63.895-60.125 103.105-64.149 36.92-3.787 75.558-.868 111.548 9.153 2.934.789 12.021 2.998 6.797 8.443-3.291 3.392-16.099-.158-19.533-.395-21.108-1.578-42.001-1.815-63.037 1.42-22.252 3.393-45.148 10.416-63.537 25.25-8.872 7.18-16.671 16.333-21.895 27.143-1.359 2.84-2.432 5.681-3.362 8.522-.931 2.998-4.437 18.069-20.965 15.149Z", fill: "currentColor" }), jsxRuntimeExports.jsx("path", { d: "M137.892 125.638c3.151-14.1 17.152-36.444 60.485-34.903 9.941.309 5.391 7.089.49 6.935-24.502-.848-36.123 14.947-42.213 30.973-1.96 5.162-6.441 5.933-12.041 5.008-3.92-.693-8.191-1.155-6.721-8.013Z", fill: "currentColor" })] }));
23536
+ return (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 80 80", className: className, fill: "none", "aria-hidden": "true", children: [jsxRuntimeExports.jsxs("g", { className: "dark:hidden", children: [jsxRuntimeExports.jsx("path", { d: "M56.6667 80H23.3333C9.16667 80 0 70.8333 0 56.6667V23.0781C0 9.16667 9.16667 0 23.0781 0H56.6667C70.8333 0 80 9.16667 80 23.3333V56.6667C80 70.8333 70.8333 80 56.6667 80Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M51.3968 54.5041C49.9 54.5041 48.5662 54.0395 47.4621 53.1296C46.1432 52.0583 45.0947 50.4611 45.0576 48.5835C45.0391 47.6352 46.0357 47.6352 46.0357 47.6352C46.0357 47.6352 47.6548 47.616 48.4402 47.616C49.2257 47.6352 49.4554 48.7678 49.4924 49.052C49.7962 51.5976 51.1856 52.7072 52.2526 53.214C52.8936 53.5174 52.7342 54.4657 51.3968 54.508V54.5041Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M37.9552 41.5689C36.6363 41.4076 34.6801 41.2694 33.4167 40.9469C31.3679 40.4247 31.4234 38.5164 31.5124 37.8944C31.7606 36.0284 32.4201 34.3006 33.4352 32.6957C34.6986 30.7298 36.514 29.002 38.8481 27.5967C43.2274 24.9666 49.9385 23.3335 56.6667 23.3335C57.9136 23.3335 66.9908 23.3335 66.9908 25.2085C66.9908 26.2502 64.8949 26.1531 63.9824 26.1531C57.1283 26.1531 52.2489 27.1168 48.618 29.2055C45.0391 31.252 42.5456 34.3851 40.8562 39.0232C40.6784 39.4264 40.0893 41.8146 37.9552 41.5727V41.5689Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M43.9348 60.7086C40.5337 60.7815 37.3289 59.1881 34.9022 56.4083C32.846 54.0546 31.6085 51.6818 31.3788 48.637C31.238 46.6481 32.0865 45.9609 33.2387 46.0799C34.0352 46.1605 36.5138 46.2834 37.9328 46.5867C38.9962 46.8094 39.7038 47.4199 39.8816 48.6754C40.819 55.3716 44.8944 58.0055 47.3211 58.5738C47.7472 58.6736 48.0102 58.9578 47.9954 59.4684C47.9769 59.956 47.7064 60.6241 43.9385 60.7048L43.9348 60.7086Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M34.2464 66.6527C31.8345 66.7564 29.4744 66.2534 28.8001 66.1305C25.9622 65.6084 23.5836 64.7061 21.5459 63.3661C16.6665 60.1639 13.7211 54.5082 13.3691 47.812C13.2802 46.2224 13.0838 43.1853 16.7406 43.4157C18.2485 43.5002 20.6419 44.2527 22.3276 44.7557C24.4209 45.3624 25.4324 47.0364 25.4324 48.6913C25.4324 58.1327 33.3333 64.1667 37.0833 64.1667C37.9429 64.1667 38.3333 64.4452 38.3333 65C38.3333 65.4167 37.9439 66.4953 34.2501 66.6566L34.2464 66.6527Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M21.6602 38.9073C20.2338 38.6424 18.8408 38.0319 17.4848 37.6825C13.2908 36.6036 14.0058 32.2188 14.3986 31.017C18.2146 19.3755 30.3298 15.4822 40.1071 14.4417C49.3138 13.4626 58.9467 14.219 67.92 16.8068C68.561 16.9835 70.3282 17.425 69.9466 18.5001C69.565 19.5752 68.5017 18.8265 58.7133 18.6038C55.4863 18.5308 52.263 18.742 49.0286 19.2565C43.4786 20.1319 37.773 21.948 33.1863 25.7799C30.9744 27.6344 29.0293 29.9996 27.7289 32.7948C27.3881 33.5281 27.1213 34.2615 26.8916 34.9948C26.6582 35.7704 25.7838 39.6637 21.6639 38.9112L21.6602 38.9073Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M45.1315 41.1541C45.9169 37.5104 48.75 32.0831 59.5833 32.0831C60.8333 32.0831 61.25 32.4998 61.25 32.9165C61.25 33.3331 60.6669 33.7498 60 33.7498C53.4172 33.7498 51.3261 37.7906 49.8071 41.9297C49.3181 43.262 48.2029 43.4617 46.8061 43.2236C45.828 43.0432 44.7647 42.9241 45.1315 41.1541Z", fill: "white" })] }), jsxRuntimeExports.jsxs("g", { className: "hidden dark:block", children: [jsxRuntimeExports.jsx("path", { d: "M55.2553 80H24.7447C8.91588 80 0 70.916 0 55.2553V24.7447C0 9.08403 8.91588 0 24.7447 0H55.2553C71.4167 0 80 8.75146 80 24.7447V55.2553C80 71.2485 71.4167 80 55.2553 80Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M51.3959 54.5041C49.8991 54.5041 48.5653 54.0395 47.4613 53.1296C46.1423 52.0583 45.0938 50.4611 45.0568 48.5835C45.0382 47.6352 46.0349 47.6352 46.0349 47.6352C46.0349 47.6352 47.6539 47.616 48.4394 47.616C49.2248 47.6352 49.4545 48.7678 49.4916 49.052C49.7954 51.5976 51.1847 52.7072 52.2518 53.214C52.8927 53.5174 52.7334 54.4657 51.3959 54.508V54.5041Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M37.9549 41.5687C36.6359 41.4074 34.6797 41.2692 33.4163 40.9467C31.3675 40.4245 31.4231 38.5163 31.512 37.8943C31.7602 36.0282 32.4197 34.3004 33.4349 32.6955C34.6982 30.7296 36.5137 29.0018 38.8478 27.5966C43.227 24.9665 49.3512 23.4998 56.0794 23.4998C61.0107 23.4998 66.1568 24.164 66.2087 24.164C66.6718 24.2254 67.009 24.6862 66.9904 25.2084C66.9719 25.7305 66.6162 26.1299 66.1531 26.1721C65.4047 26.1529 64.6748 26.1529 63.982 26.1529C57.1279 26.1529 52.2485 27.1166 48.6177 29.2053C45.0387 31.2518 42.5453 34.3849 40.8558 39.0231C40.678 39.4262 40.0889 41.8144 37.9549 41.5725V41.5687Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M43.9348 60.709C40.5337 60.7819 37.3289 59.1885 34.9022 56.4087C32.846 54.055 31.6085 51.6822 31.3788 48.6374C31.238 46.6485 32.0865 45.9612 33.2387 46.0802C34.0352 46.1609 36.5138 46.2837 37.9328 46.5871C38.9962 46.8098 39.7038 47.4203 39.8816 48.6758C40.819 55.372 44.8944 58.0059 47.3211 58.5742C47.7472 58.674 48.0102 58.9581 47.9954 59.4688C47.9769 59.9564 47.7064 60.6245 43.9385 60.7051L43.9348 60.709Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M34.246 66.6527C31.8341 66.7564 29.4741 66.2534 28.7998 66.1305C25.9618 65.6084 23.5832 64.7061 21.5455 63.3661C16.6661 60.1639 13.7207 54.5082 13.3687 47.812C13.2798 46.2224 13.0835 43.1853 16.7402 43.4157C18.2481 43.5002 20.6415 44.2527 22.3273 44.7557C24.4205 45.3624 25.432 47.0364 25.432 48.6913C25.432 58.1327 33.6829 64.372 37.2841 64.372C38.1436 64.372 38.3474 64.9019 38.2436 65.4087C38.1621 65.8119 37.9435 66.4953 34.2497 66.6566L34.246 66.6527Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M21.6602 38.9077C20.2338 38.6428 18.8408 38.0323 17.4848 37.6829C13.2908 36.604 14.0058 32.2192 14.3986 31.0174C18.2147 19.3759 30.3298 15.4826 40.1071 14.442C49.3138 13.463 58.9467 14.2194 67.92 16.8072C68.561 16.9838 70.3282 17.4254 69.9466 18.5005C69.565 19.5755 68.5017 18.8268 58.7133 18.6041C55.4863 18.5312 52.263 18.7424 49.0286 19.2569C43.4786 20.1323 37.773 21.9484 33.1863 25.7803C30.9744 27.6348 29.0293 29.9999 27.7289 32.7951C27.3881 33.5285 27.1213 34.2618 26.8916 34.9952C26.6582 35.7708 25.7838 39.6641 21.6639 38.9115L21.6602 38.9077Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M45.1311 41.1543C45.9166 37.5105 49.4066 31.7358 60.2102 32.1351C62.6888 32.2158 61.5551 33.9666 60.3325 33.9282C54.223 33.7094 51.3258 37.7908 49.8068 41.9298C49.3177 43.2622 48.2025 43.4618 46.8058 43.2238C45.8277 43.0433 44.7643 42.9243 45.1311 41.1543Z", fill: "#263238" })] })] }));
23553
23537
  }
23554
23538
 
23555
23539
  var __defProp$D = Object.defineProperty;
@@ -26368,6 +26352,27 @@
26368
26352
  }
26369
26353
  );
26370
26354
  }, "Dialog");
26355
+ var TRIGGER_NAME$9 = "DialogTrigger";
26356
+ var DialogTrigger$1 = /* @__PURE__ */ reactExports.forwardRef(
26357
+ /* @__PURE__ */ __name$k(function DialogTrigger2(props, forwardedRef) {
26358
+ const { __scopeDialog, ...triggerProps } = props;
26359
+ const context = useDialogContext(TRIGGER_NAME$9, __scopeDialog);
26360
+ const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);
26361
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
26362
+ Primitive.button,
26363
+ {
26364
+ type: "button",
26365
+ "aria-haspopup": "dialog",
26366
+ "aria-expanded": context.open,
26367
+ "aria-controls": context.open ? context.contentId : void 0,
26368
+ "data-state": getState$4(context.open),
26369
+ ...triggerProps,
26370
+ ref: composedTriggerRef,
26371
+ onClick: composeEventHandlers(props.onClick, context.onOpenToggle)
26372
+ }
26373
+ );
26374
+ }, "DialogTrigger")
26375
+ );
26371
26376
  var PORTAL_NAME$4 = "DialogPortal";
26372
26377
  var [PortalProvider$4, usePortalContext$5] = createDialogContext(PORTAL_NAME$4, {
26373
26378
  forceMount: void 0
@@ -34232,7 +34237,7 @@ Defaulting to \`null\`.`;
34232
34237
  // Shared by both filter modes: RadioGroup's root defaults to `grid gap-3`, so
34233
34238
  // styling either list separately makes them drift apart.
34234
34239
  const FILTER_OPTION_LIST_CLASS = 'grid gap-1 p-3';
34235
- const FILTER_OPTION_CLASS = 'flex min-h-9 cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 hover:bg-accent';
34240
+ const FILTER_OPTION_CLASS = 'flex min-h-9 cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 text-sm hover:bg-accent';
34236
34241
  function FilterOptionRow({ children }) {
34237
34242
  return jsxRuntimeExports.jsx("label", { className: FILTER_OPTION_CLASS, children: children });
34238
34243
  }
@@ -35890,7 +35895,7 @@ Defaulting to \`null\`.`;
35890
35895
  function FilesTreeSkeleton() {
35891
35896
  return (jsxRuntimeExports.jsx("div", { className: "space-y-1 p-2", "aria-hidden": "true", children: [72, 56, 64, 48, 60].map((width, index) => (jsxRuntimeExports.jsxs("div", { className: "flex h-10 items-center gap-3 px-2", style: { paddingLeft: 8 + index * 8 }, children: [jsxRuntimeExports.jsx(Skeleton, { className: "size-4" }), jsxRuntimeExports.jsx(Skeleton, { className: "size-4" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-4", style: { width: `${width}%` } })] }, width))) }));
35892
35897
  }
35893
- function FilesTree({ id = 'files-tree', items, selectedIds, onSelectedIdsChange, openedFolderIds, onOpenedFolderIdsChange, disabled = false, loading = false, searchQuery = '', onItemOpenChange, assumeFoldersHaveChildren = false, isItemSelectable = selectAnyItem, onLoadMore, loadingItemIds = [], emptyTitle = 'No files found', emptyDescription = 'Try a different search or check the available files.', maxHeight = DEFAULT_MAX_HEIGHT, renderItemName, renderItemMeta, itemActions, }) {
35898
+ function FilesTree({ id = 'files-tree', items, selectedIds, onSelectedIdsChange, openedFolderIds, onOpenedFolderIdsChange, disabled = false, loading = false, searchQuery = '', onItemOpenChange, assumeFoldersHaveChildren = false, isItemSelectable = selectAnyItem, onLoadMore, loadingItemIds = [], emptyTitle = 'No files found', emptyDescription = 'Try a different search or check the available files.', maxHeight = DEFAULT_MAX_HEIGHT, fill = false, renderItemName, renderItemMeta, itemActions, }) {
35894
35899
  const model = reactExports.useMemo(() => buildFilesTreeModel(items), [items]);
35895
35900
  const isInteractionDisabled = disabled || loading;
35896
35901
  const { tree, items: headlessItems, getSelectionState, } = useFilesTree({
@@ -35916,7 +35921,9 @@ Defaulting to \`null\`.`;
35916
35921
  const allVisibleSelected = selectableVisibleIds.length > 0 && selectableVisibleIds.every((itemId) => getSelectionState(itemId) === true);
35917
35922
  const someVisibleSelected = selectableVisibleIds.some((itemId) => getSelectionState(itemId) !== false);
35918
35923
  const selectAllState = allVisibleSelected ? true : someVisibleSelected ? 'indeterminate' : false;
35919
- return (jsxRuntimeExports.jsxs("div", { id: id, className: cn('overflow-hidden rounded-md border bg-card text-card-foreground', disabled && 'opacity-50'), "aria-busy": loading || undefined, "data-disabled": isInteractionDisabled || undefined, children: [jsxRuntimeExports.jsxs("div", { className: "flex min-h-10 items-center gap-2 border-b px-3 text-xs font-medium text-muted-foreground", children: [jsxRuntimeExports.jsx("span", { className: "size-8 shrink-0", "aria-hidden": "true" }), jsxRuntimeExports.jsx(Checkbox, { checked: selectAllState, onCheckedChange: () => onSelectedIdsChange(toggleAllFilesTreeSelection(model, selectedIds, selectableVisibleIds, isItemSelectable)), disabled: isInteractionDisabled || selectableVisibleIds.length === 0, "aria-label": "Select all visible files" }), jsxRuntimeExports.jsx("span", { children: "Name" })] }), jsxRuntimeExports.jsx(ScrollArea, { style: { maxHeight }, className: "[&>[data-radix-scroll-area-viewport]]:max-h-[inherit]", children: loading ? (jsxRuntimeExports.jsx(FilesTreeSkeleton, {})) : headlessItems.length === 0 ? (jsxRuntimeExports.jsx(Empty, { className: "min-h-48 border-0", children: jsxRuntimeExports.jsxs(EmptyHeader, { children: [jsxRuntimeExports.jsx(EmptyMedia, { variant: "icon", children: jsxRuntimeExports.jsx(Folder, { "aria-hidden": "true" }) }), jsxRuntimeExports.jsx(EmptyTitle, { children: emptyTitle }), jsxRuntimeExports.jsx(EmptyDescription, { children: emptyDescription })] }) })) : (jsxRuntimeExports.jsx("div", { ...tree.getContainerProps('Files'), id: `${id}-tree`, "aria-multiselectable": "true", className: "p-1", children: headlessItems.map((headlessItem) => {
35924
+ return (jsxRuntimeExports.jsxs("div", { id: id, className: cn('text-card-foreground', fill && 'flex min-h-0 flex-1 flex-col', disabled && 'opacity-50'), "aria-busy": loading || undefined, "data-disabled": isInteractionDisabled || undefined, children: [jsxRuntimeExports.jsxs("div", { className: "flex min-h-10 shrink-0 items-center gap-2 border-y px-4 text-xs font-medium text-muted-foreground", children: [jsxRuntimeExports.jsx("span", { className: "size-8 shrink-0", "aria-hidden": "true" }), jsxRuntimeExports.jsx(Checkbox, { checked: selectAllState, onCheckedChange: () => onSelectedIdsChange(toggleAllFilesTreeSelection(model, selectedIds, selectableVisibleIds, isItemSelectable)), disabled: isInteractionDisabled || selectableVisibleIds.length === 0, "aria-label": "Select all visible files" }), jsxRuntimeExports.jsx("span", { children: "Name" })] }), jsxRuntimeExports.jsx(ScrollArea, { style: fill ? undefined : { maxHeight }, className: cn(fill
35925
+ ? 'min-h-0 flex-1 [&>[data-radix-scroll-area-viewport]]:h-full [&>[data-radix-scroll-area-viewport]>div]:h-full'
35926
+ : '[&>[data-radix-scroll-area-viewport]]:max-h-[inherit]'), children: loading ? (jsxRuntimeExports.jsx(FilesTreeSkeleton, {})) : headlessItems.length === 0 ? (jsxRuntimeExports.jsx(Empty, { className: cn('min-h-48 border-0', fill && 'h-full'), children: jsxRuntimeExports.jsxs(EmptyHeader, { children: [jsxRuntimeExports.jsx(EmptyMedia, { variant: "icon", children: jsxRuntimeExports.jsx(Folder, { "aria-hidden": "true" }) }), jsxRuntimeExports.jsx(EmptyTitle, { children: emptyTitle }), jsxRuntimeExports.jsx(EmptyDescription, { children: emptyDescription })] }) })) : (jsxRuntimeExports.jsx("div", { ...tree.getContainerProps('Files'), id: `${id}-tree`, "aria-multiselectable": "true", className: "px-2 py-1", children: headlessItems.map((headlessItem) => {
35920
35927
  var _a, _b, _c, _d, _e;
35921
35928
  const item = headlessItem.getItemData();
35922
35929
  const level = headlessItem.getItemMeta().level;
@@ -36030,6 +36037,30 @@ Defaulting to \`null\`.`;
36030
36037
  return (jsxRuntimeExports.jsx(Portal, { children: jsxRuntimeExports.jsxs(Content2, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn('z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95', className), ...props, children: [children, jsxRuntimeExports.jsx(Arrow2, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })] }) }));
36031
36038
  }
36032
36039
 
36040
+ // Independent debounce timer per key; always fires the latest `fn`.
36041
+ function useKeyedDebounce(fn, delay) {
36042
+ const fnRef = reactExports.useRef(fn);
36043
+ reactExports.useLayoutEffect(() => {
36044
+ fnRef.current = fn;
36045
+ });
36046
+ const timers = reactExports.useRef(new Map());
36047
+ reactExports.useEffect(() => () => timers.current.forEach((timer) => clearTimeout(timer)), []);
36048
+ return reactExports.useMemo(() => {
36049
+ const cancel = (key) => {
36050
+ clearTimeout(timers.current.get(key));
36051
+ timers.current.delete(key);
36052
+ };
36053
+ const schedule = (key, ...args) => {
36054
+ cancel(key);
36055
+ timers.current.set(key, setTimeout(() => {
36056
+ timers.current.delete(key);
36057
+ fnRef.current(key, ...args);
36058
+ }, delay));
36059
+ };
36060
+ return { schedule, cancel };
36061
+ }, [delay]);
36062
+ }
36063
+
36033
36064
  const MOBILE_BREAKPOINT = 768;
36034
36065
  function useIsMobile() {
36035
36066
  const [isMobile, setIsMobile] = reactExports.useState(undefined);
@@ -36162,6 +36193,7 @@ Defaulting to \`null\`.`;
36162
36193
  return parsed.filter((item) => Boolean(item) && typeof item.label === 'string' && typeof item.action === 'string');
36163
36194
  }
36164
36195
 
36196
+ const SEARCH_DEBOUNCE = 300;
36165
36197
  // Stable identity: an inline arrow would invalidate useFilesTree's memoised map.
36166
36198
  function isSelectableTreeItem(item) {
36167
36199
  return item.nodeType !== 'load-more';
@@ -36171,6 +36203,7 @@ Defaulting to \`null\`.`;
36171
36203
  selectedIds: [],
36172
36204
  openedIds: [],
36173
36205
  search: '',
36206
+ appliedSearch: '',
36174
36207
  loading: true,
36175
36208
  syncSettingsLoading: false,
36176
36209
  };
@@ -36411,7 +36444,6 @@ Defaulting to \`null\`.`;
36411
36444
  getOpenedFolders: async () => providersRef.current[provider].openedIds,
36412
36445
  setOpenedFolders: async (ids) => setProvider(provider, { openedIds: ids.map(String) }),
36413
36446
  getFilesToDisplay: async () => providersRef.current[provider].items,
36414
- hasSearchText: async () => Boolean(providersRef.current[provider].search.trim()),
36415
36447
  setLoadMoreLoading: async (id, loading) => {
36416
36448
  const stringId = String(id);
36417
36449
  setLoadMoreLoadingIds((current) => loading
@@ -36725,6 +36757,22 @@ Defaulting to \`null\`.`;
36725
36757
  }
36726
36758
  return actions;
36727
36759
  };
36760
+ const applySearch = (provider, search) => {
36761
+ const isUnchanged = search.trim() === providersRef.current[provider].appliedSearch.trim();
36762
+ setProvider(provider, { search, appliedSearch: search });
36763
+ if (!isUnchanged && provider === 'integration' && integrationSearchListener) {
36764
+ onIntegrationFilterChange(search);
36765
+ }
36766
+ };
36767
+ const debouncedSearch = useKeyedDebounce(applySearch, SEARCH_DEBOUNCE);
36768
+ const changeSearch = (provider, search) => {
36769
+ setProvider(provider, { search });
36770
+ debouncedSearch.schedule(provider, search);
36771
+ };
36772
+ const clearSearch = (provider) => {
36773
+ debouncedSearch.cancel(provider);
36774
+ applySearch(provider, '');
36775
+ };
36728
36776
  const renderItemName = (provider) => (item) => {
36729
36777
  const source = item.original;
36730
36778
  if (provider !== 'crowdin' || !source.isLanguage) {
@@ -36746,20 +36794,9 @@ Defaulting to \`null\`.`;
36746
36794
  // Derived, never stored: as state it went stale whenever items changed without a
36747
36795
  // selection change - disableSync cleared the markers but left the button live.
36748
36796
  const hasSyncOption = hasSyncMetadata(displayItems, state.selectedIds);
36749
- return (jsxRuntimeExports.jsxs("section", { className: "flex min-w-0 flex-col", "aria-label": `${providerName} files`, children: [jsxRuntimeExports.jsxs("header", { className: "flex min-h-16 items-start gap-3 px-4 pt-4", children: [isCrowdin ? (jsxRuntimeExports.jsx("span", { className: "mt-0.5 flex size-8 shrink-0 items-center justify-center text-foreground", children: jsxRuntimeExports.jsx(CrowdinMark, { className: "size-8" }) })) : (jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "mt-0.5 size-8 object-contain" })), jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex-1", children: [jsxRuntimeExports.jsx("h2", { className: "truncate text-base font-semibold", children: providerName }), jsxRuntimeExports.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: isCrowdin
36750
- ? `Select content for synchronization to ${name}`
36751
- : 'Select content for synchronization to Crowdin' })] }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": `Reload ${providerName} files`, title: `Reload ${providerName} files`, disabled: state.loading, onClick: () => onRefreshFilesList(isCrowdin ? { refreshCrowdin: true } : { refreshIntegration: true }), children: state.loading ? jsxRuntimeExports.jsx(Spinner, {}) : jsxRuntimeExports.jsx(RefreshCw, {}) })] }), jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-2 px-4 py-3", children: [jsxRuntimeExports.jsxs(InputGroup, { className: "min-w-52 flex-1 sm:max-w-80", children: [jsxRuntimeExports.jsx(InputGroupAddon, { children: jsxRuntimeExports.jsx(Search, {}) }), jsxRuntimeExports.jsx(InputGroupInput, { value: state.search, onChange: (event) => {
36752
- const search = event.target.value;
36753
- setProvider(provider, { search });
36754
- if (!isCrowdin && integrationSearchListener) {
36755
- onIntegrationFilterChange(search);
36756
- }
36757
- }, placeholder: isCrowdin ? 'Search Crowdin files' : `Search ${name} files`, "aria-label": isCrowdin ? 'Search Crowdin files' : `Search ${name} files` }), state.search && (jsxRuntimeExports.jsx(InputGroupAddon, { align: "inline-end", children: jsxRuntimeExports.jsx(InputGroupButton, { size: "icon-xs", "aria-label": "Clear search", onClick: () => {
36758
- setProvider(provider, { search: '' });
36759
- if (!isCrowdin && integrationSearchListener) {
36760
- onIntegrationFilterChange('');
36761
- }
36762
- }, children: jsxRuntimeExports.jsx(X, {}) }) }))] }), isCrowdin && (filtering === null || filtering === void 0 ? void 0 : filtering.crowdinLanguages) && languages.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: languageFilterSections, values: { languages: filteredLanguageIds }, onValuesChange: (values) => { var _a; return setFilteredLanguageIds((_a = values.languages) !== null && _a !== void 0 ? _a : []); } })), !isCrowdin && integrationFilterSections.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: integrationFilterSections, values: integrationFilterValues, onValuesChange: setIntegrationFilterValues })), jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [scheduleEnabled(provider) && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [state.syncSettingsLoading && jsxRuntimeExports.jsx(Spinner, { className: "mx-1" }), hasSyncOption && (jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Disable sync", disabled: state.syncSettingsLoading, onClick: () => disableSync(provider), children: [jsxRuntimeExports.jsx(Ban, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Disable sync" })] })), jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Enable auto sync", disabled: syncDisabled(provider) || state.syncSettingsLoading, onClick: () => schedule(provider), children: [jsxRuntimeExports.jsx(RotateCw, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Enable auto sync" })] })] })), jsxRuntimeExports.jsxs(ButtonGroup, { children: [jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: syncDisabled(provider) || anyProcess, onClick: () => upload(provider), children: [syncing && jsxRuntimeExports.jsx(Spinner, {}), "Sync to", isCrowdin ? (jsxRuntimeExports.jsx("img", { src: logo, alt: name, className: "size-4 object-contain" })) : (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }))] }), menuItems.length > 0 && (jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "icon-sm", disabled: syncDisabled(provider) || anyProcess, children: [jsxRuntimeExports.jsx(ChevronDown, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "More synchronization actions" })] }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-80 min-w-60", children: menuItems.map((item) => (jsxRuntimeExports.jsx(DropdownMenuItem, { onClick: () => upload(provider, item.action), children: item.label }, item.action))) })] }))] })] })] }), jsxRuntimeExports.jsx("div", { className: "px-3 pb-3", children: jsxRuntimeExports.jsx(FilesTree, { id: `${provider}-files`, items: displayItems, selectedIds: state.selectedIds, onSelectedIdsChange: (selectedIds) => setProvider(provider, { selectedIds }), openedFolderIds: state.openedIds, onOpenedFolderIdsChange: (openedIds) => setProvider(provider, { openedIds }), onItemOpenChange: (item, isOpen) => {
36797
+ return (jsxRuntimeExports.jsxs("section", { className: "flex min-h-0 min-w-0 flex-1 flex-col", "aria-label": `${providerName} files`, children: [jsxRuntimeExports.jsxs("header", { className: "shrink-0 px-4 pt-4", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [isCrowdin ? (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-8 shrink-0" })) : (jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "size-8 shrink-0 object-contain" })), jsxRuntimeExports.jsx("h2", { className: "min-w-0 flex-1 truncate text-base font-semibold", children: providerName }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": `Reload ${providerName} files`, title: `Reload ${providerName} files`, disabled: state.loading, onClick: () => onRefreshFilesList(isCrowdin ? { refreshCrowdin: true } : { refreshIntegration: true }), children: state.loading ? jsxRuntimeExports.jsx(Spinner, {}) : jsxRuntimeExports.jsx(RefreshCw, {}) })] }), jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: isCrowdin
36798
+ ? `Select content for synchronization to ${name}`
36799
+ : 'Select content for synchronization to Crowdin' })] }), jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-2 px-4 py-3", children: [jsxRuntimeExports.jsxs(InputGroup, { className: "min-w-52 flex-1 sm:max-w-80", children: [jsxRuntimeExports.jsx(InputGroupAddon, { children: jsxRuntimeExports.jsx(Search, {}) }), jsxRuntimeExports.jsx(InputGroupInput, { value: state.search, onChange: (event) => changeSearch(provider, event.target.value), placeholder: isCrowdin ? 'Search Crowdin files' : `Search ${name} files`, "aria-label": isCrowdin ? 'Search Crowdin files' : `Search ${name} files` }), state.search && (jsxRuntimeExports.jsx(InputGroupAddon, { align: "inline-end", children: jsxRuntimeExports.jsx(InputGroupButton, { size: "icon-xs", "aria-label": "Clear search", onClick: () => clearSearch(provider), children: jsxRuntimeExports.jsx(X, {}) }) }))] }), isCrowdin && (filtering === null || filtering === void 0 ? void 0 : filtering.crowdinLanguages) && languages.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: languageFilterSections, values: { languages: filteredLanguageIds }, onValuesChange: (values) => { var _a; return setFilteredLanguageIds((_a = values.languages) !== null && _a !== void 0 ? _a : []); } })), !isCrowdin && integrationFilterSections.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: integrationFilterSections, values: integrationFilterValues, onValuesChange: setIntegrationFilterValues })), jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [scheduleEnabled(provider) && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [state.syncSettingsLoading && jsxRuntimeExports.jsx(Spinner, { className: "mx-1" }), hasSyncOption && (jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Disable Auto Sync", disabled: state.syncSettingsLoading, onClick: () => disableSync(provider), children: [jsxRuntimeExports.jsx(RefreshCwOff, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Disable Auto Sync" })] })), jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Enable Auto Sync", disabled: syncDisabled(provider) || state.syncSettingsLoading, onClick: () => schedule(provider), children: [jsxRuntimeExports.jsx(RotateCw, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Enable Auto Sync" })] })] })), jsxRuntimeExports.jsxs(ButtonGroup, { children: [jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: syncDisabled(provider) || anyProcess, onClick: () => upload(provider), children: [syncing && jsxRuntimeExports.jsx(Spinner, {}), "Sync to", isCrowdin ? (jsxRuntimeExports.jsx("img", { src: logo, alt: name, className: "size-4 object-contain" })) : (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }))] }), menuItems.length > 0 && (jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "icon-sm", disabled: syncDisabled(provider) || anyProcess, children: [jsxRuntimeExports.jsx(ChevronDown, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "More synchronization actions" })] }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-80 min-w-60", children: menuItems.map((item) => (jsxRuntimeExports.jsx(DropdownMenuItem, { onClick: () => upload(provider, item.action), children: item.label }, item.action))) })] }))] })] })] }), jsxRuntimeExports.jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: jsxRuntimeExports.jsx(FilesTree, { id: `${provider}-files`, items: displayItems, selectedIds: state.selectedIds, onSelectedIdsChange: (selectedIds) => setProvider(provider, { selectedIds }), openedFolderIds: state.openedIds, onOpenedFolderIdsChange: (openedIds) => setProvider(provider, { openedIds }), onItemOpenChange: (item, isOpen) => {
36763
36800
  var _a;
36764
36801
  if (isOpen && (integrationOneLevelFetching || isCrowdin)) {
36765
36802
  onFolderToggle({
@@ -36770,13 +36807,13 @@ Defaulting to \`null\`.`;
36770
36807
  recursion: false,
36771
36808
  });
36772
36809
  }
36773
- }, assumeFoldersHaveChildren: !isCrowdin && Boolean(integrationOneLevelFetching), isItemSelectable: isSelectableTreeItem, onLoadMore: (item) => onLoadMore(item.original), loadingItemIds: loadMoreLoadingIds, searchQuery: state.search, loading: state.loading, maxHeight: "clamp(280px, 42vh, 440px)", emptyTitle: state.search ? 'No matching files' : `No ${providerName} files`, emptyDescription: isCrowdin
36810
+ }, assumeFoldersHaveChildren: !isCrowdin && Boolean(integrationOneLevelFetching), isItemSelectable: isSelectableTreeItem, onLoadMore: (item) => onLoadMore(item.original), loadingItemIds: loadMoreLoadingIds, searchQuery: state.appliedSearch, loading: state.loading, fill: true, emptyTitle: state.appliedSearch ? 'No matching files' : `No ${providerName} files`, emptyDescription: isCrowdin
36774
36811
  ? 'Select content on the right and sync it to Crowdin.'
36775
36812
  : 'Reload the file list or adjust your search.', renderItemName: renderItemName(provider), renderItemMeta: renderMeta(provider), itemActions: (item) => actionItems(provider, item.original) }) })] }));
36776
36813
  };
36777
36814
  // Exclusive, not CSS-toggled: each panel owns a tree keyed `${provider}-files`,
36778
36815
  // so mounting both layouts would duplicate those DOM ids.
36779
- return (jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: jsxRuntimeExports.jsx(Card, { className: "relative mt-3 gap-0 overflow-hidden py-0", children: isMobile ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "border-b p-3", children: jsxRuntimeExports.jsx(Tabs, { value: activeProvider, onValueChange: (value) => setActiveProvider(value), children: jsxRuntimeExports.jsxs(TabsList, { className: "w-full", children: [jsxRuntimeExports.jsxs(TabsTrigger, { value: "crowdin", className: "flex-1", children: [jsxRuntimeExports.jsx(Languages, {}), " Crowdin"] }), jsxRuntimeExports.jsxs(TabsTrigger, { value: "integration", className: "flex-1", children: [jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "size-4 object-contain" }), " ", name] })] }) }) }), panel(activeProvider)] })) : (jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 divide-x", children: [panel('crowdin'), panel('integration')] })) }) }));
36816
+ return (jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: jsxRuntimeExports.jsx(Card, { className: "relative mt-3 flex min-h-[480px] flex-1 flex-col gap-0 overflow-hidden py-0", children: isMobile ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "shrink-0 border-b p-3", children: jsxRuntimeExports.jsx(Tabs, { value: activeProvider, onValueChange: (value) => setActiveProvider(value), children: jsxRuntimeExports.jsxs(TabsList, { className: "w-full", children: [jsxRuntimeExports.jsxs(TabsTrigger, { value: "crowdin", className: "flex-1", children: [jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }), " Crowdin"] }), jsxRuntimeExports.jsxs(TabsTrigger, { value: "integration", className: "flex-1", children: [jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "size-4 object-contain" }), " ", name] })] }) }) }), panel(activeProvider)] })) : (jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 grid-cols-2 divide-x", children: [panel('crowdin'), panel('integration')] })) }) }));
36780
36817
  });
36781
36818
 
36782
36819
  function Select({ ...props }) {
@@ -36833,11 +36870,11 @@ Defaulting to \`null\`.`;
36833
36870
  onSelect(error);
36834
36871
  }
36835
36872
  };
36836
- return (jsxRuntimeExports.jsxs("div", { "data-slot": "user-errors-table", className: "overflow-hidden rounded-lg border bg-card text-card-foreground", children: [jsxRuntimeExports.jsx("div", { "data-slot": "table-toolbar", className: "border-b p-4", children: jsxRuntimeExports.jsxs("div", { className: "relative max-w-md", children: [jsxRuntimeExports.jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground" }), jsxRuntimeExports.jsx(Input, { value: searchText, onChange: (event) => onOptionsChange({ searchText: event.target.value, currentPage: 1 }), className: "h-9 pl-9", placeholder: "Search by action or message", "aria-label": "Search error logs by action or message" })] }) }), jsxRuntimeExports.jsxs(Table, { children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { className: "hover:bg-transparent", children: [jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", "aria-sort": isSortedAsc ? 'ascending' : 'descending', children: jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", className: "-ml-2", onClick: () => onOptionsChange({ isSortedAsc: !isSortedAsc, currentPage: 1 }), "aria-label": `Sort by date ${isSortedAsc ? 'descending' : 'ascending'}`, children: ["Date", isSortedAsc ? (jsxRuntimeExports.jsx(ArrowUp, { "aria-hidden": "true" })) : (jsxRuntimeExports.jsx(ArrowDown, { "aria-hidden": "true" }))] }) }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Action" }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Message" })] }) }), jsxRuntimeExports.jsx(TableBody, { "aria-busy": isLoading, children: isLoading ? (Array.from({ length: 3 }).map((_, index) => (jsxRuntimeExports.jsx(TableRow, { children: [0, 1, 2].map((cell) => (jsxRuntimeExports.jsxs(TableCell, { className: "h-12 px-4", children: [index === 0 && cell === 0 && (jsxRuntimeExports.jsx("span", { className: "sr-only", role: "status", children: "Loading error logs" })), jsxRuntimeExports.jsx("div", { className: "h-4 max-w-48 animate-pulse rounded bg-muted" })] }, cell))) }, index)))) : errors.length > 0 ? (errors.map((error) => (jsxRuntimeExports.jsxs(TableRow, { tabIndex: 0, className: "cursor-pointer focus-visible:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset", onClick: () => onSelect(error), onKeyDown: (event) => handleRowKeyDown(event, error), "aria-label": `Open error details for ${error.action} on ${error.formattedDate}`, children: [jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 font-medium whitespace-normal", children: error.formattedDate }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 whitespace-normal", children: error.action }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 max-w-0 px-4 whitespace-normal", children: jsxRuntimeExports.jsx("span", { className: "line-clamp-2 break-words", children: error.message }) })] }, error.id)))) : (jsxRuntimeExports.jsx(TableRow, { className: "hover:bg-transparent", children: jsxRuntimeExports.jsx(TableCell, { colSpan: 3, className: "h-32 text-center text-muted-foreground", children: searchText ? 'No error logs match your search.' : 'No error logs found.' }) })) })] }), jsxRuntimeExports.jsxs("div", { "data-slot": "table-pagination", className: "flex flex-col gap-3 border-t px-4 py-2 sm:flex-row sm:items-center sm:justify-end", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [jsxRuntimeExports.jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: "Rows per page" }), jsxRuntimeExports.jsxs(Select, { value: String(rowsPerPage), onValueChange: (value) => onOptionsChange({ rowsPerPage: Number(value), currentPage: 1 }), children: [jsxRuntimeExports.jsx(SelectTrigger, { className: "w-18", "aria-label": "Rows per page", children: jsxRuntimeExports.jsx(SelectValue, {}) }), jsxRuntimeExports.jsx(SelectContent, { align: "end", children: rowsPerPageOptions.map((option) => (jsxRuntimeExports.jsx(SelectItem, { value: String(option), children: option }, option))) })] })] }), jsxRuntimeExports.jsxs("p", { className: "m-0 min-w-24 text-sm text-muted-foreground", "aria-live": "polite", children: [firstVisibleRow, "-", lastVisibleRow, " of ", total] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: 1 }), disabled: currentPage === 1, "aria-label": "Go to first page", children: jsxRuntimeExports.jsx(ChevronsLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.max(1, currentPage - 1) }), disabled: currentPage === 1, "aria-label": "Go to previous page", children: jsxRuntimeExports.jsx(ChevronLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.min(pageCount, currentPage + 1) }), disabled: currentPage === pageCount, "aria-label": "Go to next page", children: jsxRuntimeExports.jsx(ChevronRight, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: pageCount }), disabled: currentPage === pageCount, "aria-label": "Go to last page", children: jsxRuntimeExports.jsx(ChevronsRight, {}) })] })] })] }));
36873
+ return (jsxRuntimeExports.jsxs("div", { "data-slot": "user-errors-table", className: "overflow-hidden rounded-lg border bg-card text-card-foreground", children: [jsxRuntimeExports.jsx("div", { "data-slot": "table-toolbar", className: "border-b p-4", children: jsxRuntimeExports.jsxs("div", { className: "relative max-w-md", children: [jsxRuntimeExports.jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground" }), jsxRuntimeExports.jsx(Input, { value: searchText, onChange: (event) => onOptionsChange({ searchText: event.target.value, currentPage: 1 }), className: "h-9 pl-9", placeholder: "Search by action or message", "aria-label": "Search logs by action or message" })] }) }), jsxRuntimeExports.jsxs(Table, { children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { className: "hover:bg-transparent", children: [jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", "aria-sort": isSortedAsc ? 'ascending' : 'descending', children: jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", className: "-ml-2", onClick: () => onOptionsChange({ isSortedAsc: !isSortedAsc, currentPage: 1 }), "aria-label": `Sort by date ${isSortedAsc ? 'descending' : 'ascending'}`, children: ["Date", isSortedAsc ? (jsxRuntimeExports.jsx(ArrowUp, { "aria-hidden": "true" })) : (jsxRuntimeExports.jsx(ArrowDown, { "aria-hidden": "true" }))] }) }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Action" }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Message" })] }) }), jsxRuntimeExports.jsx(TableBody, { "aria-busy": isLoading, children: isLoading ? (Array.from({ length: 3 }).map((_, index) => (jsxRuntimeExports.jsx(TableRow, { children: [0, 1, 2].map((cell) => (jsxRuntimeExports.jsxs(TableCell, { className: "h-12 px-4", children: [index === 0 && cell === 0 && (jsxRuntimeExports.jsx("span", { className: "sr-only", role: "status", children: "Loading logs" })), jsxRuntimeExports.jsx("div", { className: "h-4 max-w-48 animate-pulse rounded bg-muted" })] }, cell))) }, index)))) : errors.length > 0 ? (errors.map((error) => (jsxRuntimeExports.jsxs(TableRow, { tabIndex: 0, className: "cursor-pointer focus-visible:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset", onClick: () => onSelect(error), onKeyDown: (event) => handleRowKeyDown(event, error), "aria-label": `Open log details for ${error.action} on ${error.formattedDate}`, children: [jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 font-medium whitespace-normal", children: error.formattedDate }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 whitespace-normal", children: error.action }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 max-w-0 px-4 whitespace-normal", children: jsxRuntimeExports.jsx("span", { className: "line-clamp-2 break-words", children: error.message }) })] }, error.id)))) : (jsxRuntimeExports.jsx(TableRow, { className: "hover:bg-transparent", children: jsxRuntimeExports.jsx(TableCell, { colSpan: 3, className: "h-32 text-center text-muted-foreground", children: searchText ? 'No logs match your search.' : 'No logs found.' }) })) })] }), jsxRuntimeExports.jsxs("div", { "data-slot": "table-pagination", className: "flex flex-col gap-3 border-t px-4 py-2 sm:flex-row sm:items-center sm:justify-end", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [jsxRuntimeExports.jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: "Rows per page" }), jsxRuntimeExports.jsxs(Select, { value: String(rowsPerPage), onValueChange: (value) => onOptionsChange({ rowsPerPage: Number(value), currentPage: 1 }), children: [jsxRuntimeExports.jsx(SelectTrigger, { className: "w-18", "aria-label": "Rows per page", children: jsxRuntimeExports.jsx(SelectValue, {}) }), jsxRuntimeExports.jsx(SelectContent, { align: "end", children: rowsPerPageOptions.map((option) => (jsxRuntimeExports.jsx(SelectItem, { value: String(option), children: option }, option))) })] })] }), jsxRuntimeExports.jsxs("p", { className: "m-0 min-w-24 text-sm text-muted-foreground", "aria-live": "polite", children: [firstVisibleRow, "-", lastVisibleRow, " of ", total] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: 1 }), disabled: currentPage === 1, "aria-label": "Go to first page", children: jsxRuntimeExports.jsx(ChevronsLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.max(1, currentPage - 1) }), disabled: currentPage === 1, "aria-label": "Go to previous page", children: jsxRuntimeExports.jsx(ChevronLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.min(pageCount, currentPage + 1) }), disabled: currentPage === pageCount, "aria-label": "Go to next page", children: jsxRuntimeExports.jsx(ChevronRight, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: pageCount }), disabled: currentPage === pageCount, "aria-label": "Go to last page", children: jsxRuntimeExports.jsx(ChevronsRight, {}) })] })] })] }));
36837
36874
  };
36838
36875
 
36839
36876
  const IntegrationView = ({ appComponentRef, userErrors, isUserErrorsLoading, userErrorsTotal, userErrorsCurrentPage, userErrorsRowsPerPage, userErrorsSearchText, userErrorsIsSortedAsc, onSelectUserError, onUserErrorsOptionsChange, isErrorLogsVisible, ...integrationProps }) => {
36840
- return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsx(SimpleIntegration, { ref: appComponentRef, ...integrationProps }) }), jsxRuntimeExports.jsxs("div", { id: "user-errors", style: { display: isErrorLogsVisible ? undefined : 'none' }, children: [jsxRuntimeExports.jsx(UserErrorsTable, { errors: userErrors, isLoading: isUserErrorsLoading, total: userErrorsTotal, currentPage: userErrorsCurrentPage, rowsPerPage: userErrorsRowsPerPage, searchText: userErrorsSearchText, isSortedAsc: userErrorsIsSortedAsc, onSelect: onSelectUserError, onOptionsChange: onUserErrorsOptionsChange }), jsxRuntimeExports.jsx(AppAlert, { className: "mt-4", children: "This table displays the most recent error logs from the past month. Logs older than one month will be automatically deleted." })] })] }));
36877
+ return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "flex min-h-0 flex-1 flex-col", style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsx(SimpleIntegration, { ref: appComponentRef, ...integrationProps }) }), jsxRuntimeExports.jsxs("div", { id: "user-errors", style: { display: isErrorLogsVisible ? undefined : 'none' }, children: [jsxRuntimeExports.jsx(UserErrorsTable, { errors: userErrors, isLoading: isUserErrorsLoading, total: userErrorsTotal, currentPage: userErrorsCurrentPage, rowsPerPage: userErrorsRowsPerPage, searchText: userErrorsSearchText, isSortedAsc: userErrorsIsSortedAsc, onSelect: onSelectUserError, onOptionsChange: onUserErrorsOptionsChange }), jsxRuntimeExports.jsx(AppAlert, { className: "mt-4", children: "This table displays the most recent logs from the past month. Logs older than one month will be automatically deleted." })] })] }));
36841
36878
  };
36842
36879
 
36843
36880
  function Progress({ className, value, ...props }) {
@@ -36931,26 +36968,18 @@ Defaulting to \`null\`.`;
36931
36968
  }) }))] }));
36932
36969
  });
36933
36970
 
36934
- const TopBar = ({ notice, isNoticeVisible, checkSubscription, subscriptionInfo, isErrorLogsVisible, isManager, infoModal, hasSettings, isOwner, onCloseNotice, onShowIntegration, onShowErrorLogs, onShowPermissions, onOpenInfoModal, onOpenSettings, onLogout, }) => {
36971
+ const TopBar = ({ notice, isNoticeVisible, checkSubscription, subscriptionInfo, isErrorLogsVisible, isManager, infoModal, onCloseNotice, onShowIntegration, onShowErrorLogs, onShowPermissions, onOpenInfoModal, onOpenSettings, }) => {
36935
36972
  const isMobile = useIsMobile();
36936
36973
  const actions = [
36937
36974
  ...(isManager ? [{ key: 'share', label: 'Share', icon: Link, onClick: onShowPermissions }] : []),
36938
36975
  ...(infoModal ? [{ key: 'info', label: infoModal.title, icon: Info, onClick: onOpenInfoModal }] : []),
36939
- ...(hasSettings ? [{ key: 'settings', label: 'Settings', icon: Settings, onClick: onOpenSettings }] : []),
36940
- {
36941
- key: 'logout',
36942
- label: 'Log out',
36943
- icon: CircleUserRound,
36944
- onClick: onLogout,
36945
- disabled: !isOwner,
36946
- title: !isOwner ? 'Only the owner can log out' : undefined,
36947
- },
36976
+ { key: 'settings', label: 'Settings', icon: Settings, onClick: onOpenSettings },
36948
36977
  ];
36949
- return (jsxRuntimeExports.jsxs("div", { className: "mb-2.5 text-right", children: [notice && isNoticeVisible && (jsxRuntimeExports.jsxs(AppAlert, { id: "notice", title: notice.title, hideIcon: !notice.icon, variant: getAlertVariant(notice.type), className: "mb-3 pr-12 text-left", children: [jsxRuntimeExports.jsx("p", { className: "m-0", dangerouslySetInnerHTML: { __html: notice.content } }), notice.close && (jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Close notice", onClick: () => onCloseNotice('notice'), className: "absolute right-1 top-1", children: jsxRuntimeExports.jsx(X, {}) }))] })), checkSubscription && subscriptionInfo && (jsxRuntimeExports.jsx(AppAlert, { id: "subscription-info", hideIcon: true, variant: "warning", className: "mb-3", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center", children: [jsxRuntimeExports.jsxs("p", { className: "m-0", children: ["Your trial expires in ", subscriptionInfo.daysLeft, " days."] }), jsxRuntimeExports.jsx(Button, { className: "ml-2", variant: "default", onClick: () => {
36978
+ return (jsxRuntimeExports.jsxs("div", { className: "mb-2.5 text-right", children: [notice && isNoticeVisible && (jsxRuntimeExports.jsxs(AppAlert, { id: "notice", title: notice.title, hideIcon: !notice.icon, variant: getAlertVariant(notice.type), className: "mb-3 pr-12 text-left", children: [jsxRuntimeExports.jsx("div", { className: "html-content", dangerouslySetInnerHTML: { __html: notice.content } }), notice.close && (jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Close notice", onClick: () => onCloseNotice('notice'), className: "absolute right-1 top-1", children: jsxRuntimeExports.jsx(X, {}) }))] })), checkSubscription && subscriptionInfo && (jsxRuntimeExports.jsx(AppAlert, { id: "subscription-info", hideIcon: true, variant: "warning", className: "mb-3", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center", children: [jsxRuntimeExports.jsxs("p", { className: "m-0", children: ["Your trial expires in ", subscriptionInfo.daysLeft, " days."] }), jsxRuntimeExports.jsx(Button, { className: "ml-2", variant: "default", onClick: () => {
36950
36979
  if (subscriptionInfo === null || subscriptionInfo === void 0 ? void 0 : subscriptionInfo.subscribeLink) {
36951
36980
  window.open(subscriptionInfo.subscribeLink, '_blank', 'noopener,noreferrer');
36952
36981
  }
36953
- }, children: "Subscribe" })] }) })), jsxRuntimeExports.jsxs("div", { id: "buttons", className: "flex w-full items-center gap-2", children: [jsxRuntimeExports.jsxs("div", { className: "mr-auto shrink-0", children: [jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? undefined : 'none' }, children: jsxRuntimeExports.jsxs(Button, { id: "show-integration-btn", variant: "outline", onClick: onShowIntegration, children: [jsxRuntimeExports.jsx(ArrowLeft, {}), "Integration"] }) }), jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsxs(Button, { id: "show-error-logs-btn", variant: "outline", onClick: onShowErrorLogs, children: [jsxRuntimeExports.jsx(List$1, {}), "Error logs"] }) })] }), isMobile ? (
36982
+ }, children: "Subscribe" })] }) })), jsxRuntimeExports.jsxs("div", { id: "buttons", className: "flex w-full items-center gap-2", children: [jsxRuntimeExports.jsxs("div", { className: "mr-auto shrink-0", children: [jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? undefined : 'none' }, children: jsxRuntimeExports.jsxs(Button, { id: "show-integration-btn", variant: "outline", onClick: onShowIntegration, children: [jsxRuntimeExports.jsx(ArrowLeft, {}), "Integration"] }) }), jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsxs(Button, { id: "show-error-logs-btn", variant: "outline", onClick: onShowErrorLogs, children: [jsxRuntimeExports.jsx(List$1, {}), "Logs"] }) })] }), isMobile ? (
36954
36983
  // Labelled buttons cannot fit a phone width, and the row does not
36955
36984
  // wrap - left as-is they widen the whole page into a sideways scroll.
36956
36985
  jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", "aria-label": "More actions", children: jsxRuntimeExports.jsx(Ellipsis, {}) }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-[calc(100vw-2rem)] min-w-48", children: actions.map((action) => (jsxRuntimeExports.jsxs(DropdownMenuItem, { disabled: action.disabled, onClick: action.onClick, children: [jsxRuntimeExports.jsx(action.icon, {}), jsxRuntimeExports.jsx("span", { className: "truncate", children: action.label })] }, action.key))) })] })) : (actions.map((action) => (jsxRuntimeExports.jsxs(Button, { variant: "outline", className: "min-w-0", disabled: action.disabled, title: action.title, onClick: action.onClick, children: [jsxRuntimeExports.jsx(action.icon, {}), jsxRuntimeExports.jsx("span", { className: "truncate", children: action.label })] }, action.key))))] })] }));
@@ -37724,6 +37753,8 @@ Defaulting to \`null\`.`;
37724
37753
  }, []);
37725
37754
  function handleRefreshFilesList(detail) {
37726
37755
  if (detail.refreshIntegration) {
37756
+ savedIntegrationData.current = null;
37757
+ currentOpenedFolders.current = null;
37727
37758
  getIntegrationData({ hardReload: true });
37728
37759
  }
37729
37760
  else if (detail.refreshCrowdin) {
@@ -37760,9 +37791,11 @@ Defaulting to \`null\`.`;
37760
37791
  if (isEmptySearch && savedIntegrationData.current && hasLoadMoreElements.current) {
37761
37792
  appComponent.current.setIntegrationFilesData(savedIntegrationData.current);
37762
37793
  appComponent.current.setIntegrationOpenedFolders(currentOpenedFolders.current);
37794
+ savedIntegrationData.current = null;
37795
+ currentOpenedFolders.current = null;
37763
37796
  return;
37764
37797
  }
37765
- if (!isEmptySearch && hasLoadMoreElements.current) {
37798
+ if (!isEmptySearch && hasLoadMoreElements.current && !savedIntegrationData.current) {
37766
37799
  savedIntegrationData.current = await appComponent.current.getIntegrationFilesData();
37767
37800
  currentOpenedFolders.current = await appComponent.current.getIntegrationOpenedFolders();
37768
37801
  }
@@ -38108,7 +38141,7 @@ Defaulting to \`null\`.`;
38108
38141
  async function getActiveJobs() {
38109
38142
  try {
38110
38143
  const restParams = await checkOrigin();
38111
- const jobs = await checkResponse(await fetch(`api/all-jobs${restParams}`));
38144
+ const jobs = await checkResponse(await fetch(`api/all-jobs${restParams}&finished=false&limit=100`));
38112
38145
  if (!Array.isArray(jobs)) {
38113
38146
  return;
38114
38147
  }
@@ -38419,6 +38452,9 @@ Defaulting to \`null\`.`;
38419
38452
  function Dialog({ ...props }) {
38420
38453
  return jsxRuntimeExports.jsx(Dialog$1, { "data-slot": "dialog", ...props });
38421
38454
  }
38455
+ function DialogTrigger({ ...props }) {
38456
+ return jsxRuntimeExports.jsx(DialogTrigger$1, { "data-slot": "dialog-trigger", ...props });
38457
+ }
38422
38458
  function DialogPortal({ ...props }) {
38423
38459
  return jsxRuntimeExports.jsx(DialogPortal$1, { "data-slot": "dialog-portal", ...props });
38424
38460
  }
@@ -49134,7 +49170,7 @@ Defaulting to \`null\`.`;
49134
49170
  return reactExports.useRef(null);
49135
49171
  }
49136
49172
 
49137
- const AppDialog = reactExports.forwardRef(({ id, title, width = '70', showCloseButton = true, children, footer, className, onClose }, ref) => {
49173
+ const AppDialog = reactExports.forwardRef(({ id, title, description, width = '70', showCloseButton = true, children, footer, className, onClose }, ref) => {
49138
49174
  const [isOpen, setIsOpen] = reactExports.useState(false);
49139
49175
  const [portalContainer, setPortalContainer] = reactExports.useState(null);
49140
49176
  const contentRef = reactExports.useRef(null);
@@ -49158,7 +49194,7 @@ Defaulting to \`null\`.`;
49158
49194
  var _a;
49159
49195
  event.preventDefault();
49160
49196
  (_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.focus();
49161
- }, className: cn('max-h-[calc(100dvh-2rem)] grid-rows-[auto_minmax(0,1fr)_auto] overflow-visible', widthClassName, className), children: jsxRuntimeExports.jsxs(ComboboxPortalContainerProvider, { container: portalContainer, children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "shrink-0", children: [jsxRuntimeExports.jsx(DialogTitle, { children: title || 'Details' }), jsxRuntimeExports.jsx(DialogDescription, { className: "sr-only", children: typeof title === 'string' ? `${title} dialog` : 'Dialog details' })] }), jsxRuntimeExports.jsx(ScrollArea, { type: "auto", className: "-mr-6 -ml-1 h-full min-h-0 min-w-0", children: jsxRuntimeExports.jsx("div", { className: "min-w-0 overflow-x-hidden py-1 pr-6 pl-1", children: children }) }), footer && (jsxRuntimeExports.jsx(DialogFooter, { className: "mx-0 mb-0 shrink-0 rounded-none border-t-0 bg-transparent p-0", children: footer })), jsxRuntimeExports.jsx("div", { ref: setPortalContainer, className: "contents" })] }) }) }));
49197
+ }, className: cn('max-h-[calc(100dvh-2rem)] grid-rows-[auto_minmax(0,1fr)_auto] overflow-visible', widthClassName, className), children: jsxRuntimeExports.jsxs(ComboboxPortalContainerProvider, { container: portalContainer, children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "shrink-0", children: [jsxRuntimeExports.jsx(DialogTitle, { children: title || 'Details' }), jsxRuntimeExports.jsx(DialogDescription, { className: cn(!description && 'sr-only'), children: description !== null && description !== void 0 ? description : (typeof title === 'string' ? `${title} dialog` : 'Dialog details') })] }), jsxRuntimeExports.jsx(ScrollArea, { type: "auto", className: "-mr-6 -ml-1 h-full min-h-0 min-w-0", children: jsxRuntimeExports.jsx("div", { className: "min-w-0 overflow-x-hidden py-1 pr-6 pl-1", children: children }) }), footer && (jsxRuntimeExports.jsx(DialogFooter, { className: "mx-0 mb-0 shrink-0 rounded-none border-t-0 bg-transparent p-0", children: footer })), jsxRuntimeExports.jsx("div", { ref: setPortalContainer, className: "contents" })] }) }) }));
49162
49198
  });
49163
49199
  AppDialog.displayName = 'AppDialog';
49164
49200
 
@@ -49265,14 +49301,14 @@ Defaulting to \`null\`.`;
49265
49301
  };
49266
49302
 
49267
49303
  const InfoModal = ({ modalRef, infoModal }) => {
49268
- return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "info-modal", width: "50", title: infoModal.title, children: jsxRuntimeExports.jsx("div", { dangerouslySetInnerHTML: { __html: infoModal.content } }) }));
49304
+ return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "info-modal", width: "50", title: infoModal.title, children: jsxRuntimeExports.jsx("div", { className: "html-content text-sm leading-relaxed", dangerouslySetInnerHTML: { __html: infoModal.content } }) }));
49269
49305
  };
49270
49306
 
49271
49307
  function Switch({ className, size = 'default', ...props }) {
49272
49308
  return (jsxRuntimeExports.jsx(Switch$1, { "data-slot": "switch", "data-size": size, className: cn('peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80', className), ...props, children: jsxRuntimeExports.jsx(SwitchThumb, { "data-slot": "switch-thumb", className: cn('pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground') }) }));
49273
49309
  }
49274
49310
 
49275
- const FieldShell = reactExports.forwardRef(({ label, helpText, helpTextHtml, htmlFor, errorText, className, children, ...props }, ref) => (jsxRuntimeExports.jsxs(Field, { ref: ref, "data-invalid": Boolean(errorText) || undefined, className: className, ...props, children: [label && jsxRuntimeExports.jsx(FieldLabel, { htmlFor: htmlFor, children: label }), children, helpText && jsxRuntimeExports.jsx(FieldDescription, { children: helpText }), helpTextHtml && jsxRuntimeExports.jsx(FieldDescription, { dangerouslySetInnerHTML: { __html: helpTextHtml } }), jsxRuntimeExports.jsx(FieldError, { errors: errorText ? [{ message: errorText }] : undefined })] })));
49311
+ const FieldShell = reactExports.forwardRef(({ label, helpText, helpTextHtml, htmlFor, errorText, className, children, ...props }, ref) => (jsxRuntimeExports.jsxs(Field, { ref: ref, "data-invalid": Boolean(errorText) || undefined, className: className, ...props, children: [label && jsxRuntimeExports.jsx(FieldLabel, { htmlFor: htmlFor, children: label }), children, helpText && jsxRuntimeExports.jsx(FieldDescription, { children: helpText }), helpTextHtml && (jsxRuntimeExports.jsx(FieldDescription, { className: "html-content [&>a]:no-underline [&>a:hover]:underline", dangerouslySetInnerHTML: { __html: helpTextHtml } })), jsxRuntimeExports.jsx(FieldError, { errors: errorText ? [{ message: errorText }] : undefined })] })));
49276
49312
  FieldShell.displayName = 'FieldShell';
49277
49313
  const FormInput = reactExports.forwardRef(({ id, label, helpText, helpTextHtml, containerClassName, errorText, withCopyButton, value, 'data-dependency': dataDependency, ...props }, ref) => (jsxRuntimeExports.jsx(FieldShell, { label: label, helpText: helpText, helpTextHtml: helpTextHtml, htmlFor: id, errorText: errorText, className: containerClassName, "data-dependency": dataDependency, children: jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [jsxRuntimeExports.jsx(Input, { ref: ref, id: id, value: value, "aria-invalid": Boolean(errorText) || undefined, ...props }), withCopyButton && (jsxRuntimeExports.jsx(Button, { type: "button", size: "icon", variant: "outline", "aria-label": `Copy ${label || 'value'}`, onClick: () => {
49278
49314
  var _a;
@@ -49415,7 +49451,7 @@ Defaulting to \`null\`.`;
49415
49451
  return (jsxRuntimeExports.jsx("div", { className: row.isWarning ? 'mt-1 text-xs text-destructive' : 'mt-1 text-xs text-muted-foreground', children: row.description }));
49416
49452
  }
49417
49453
  const PermissionsModal = ({ modalRef, isLoading, permissionUserOptions, selectedUsers, isConfirmVisible, permissionsSummary, hasOrganization, zenModeUrl, saveDisabled, onUsersChange, onSave, }) => {
49418
- return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "permissions-modal", title: "Share", footer: jsxRuntimeExports.jsx(Button, { id: "confirm-users-btn", disabled: saveDisabled, onClick: onSave, children: "Save" }), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-background/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx(UsersMultiSelect, { options: permissionUserOptions, value: selectedUsers, disabled: isLoading, onValueChange: onUsersChange }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx("div", { className: isConfirmVisible ? 'mt-4' : 'hidden', children: jsxRuntimeExports.jsxs(Table, { className: "min-w-[640px] table-fixed", children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableHead, { className: "w-[40%] px-4", children: "Access" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[35%] px-4", children: "Users" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[25%] px-4 text-right", children: "Upcoming changes" })] }) }), jsxRuntimeExports.jsxs(TableBody, { children: [hasOrganization && (jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Registration in Organization" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) &&
49454
+ return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "permissions-modal", title: "Share", description: "Invite people who manage content and give them access to this integration, so they can send new content for translation as soon as it's added.", footer: jsxRuntimeExports.jsx(Button, { id: "confirm-users-btn", disabled: saveDisabled, onClick: onSave, children: "Save" }), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-background/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx(UsersMultiSelect, { options: permissionUserOptions, value: selectedUsers, disabled: isLoading, onValueChange: onUsersChange }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx("div", { className: isConfirmVisible ? 'mt-4' : 'hidden', children: jsxRuntimeExports.jsxs(Table, { className: "min-w-[640px] table-fixed", children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableHead, { className: "w-[40%] px-4", children: "Access" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[35%] px-4", children: "Users" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[25%] px-4 text-right", children: "Upcoming changes" })] }) }), jsxRuntimeExports.jsxs(TableBody, { children: [hasOrganization && (jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Registration in Organization" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) &&
49419
49455
  renderPermissionStatus(permissionsSummary.organization.status) })] })), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Project Manager Access" }) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.project) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.project) &&
49420
49456
  renderPermissionStatus(permissionsSummary.project.status) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Application Visibility Access" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings) &&
49421
49457
  renderPermissionStatus(permissionsSummary.applicationSettings.status) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Access to the Integration" }), jsxRuntimeExports.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "This provides access to sync files and modify the current integration settings." })] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationCredentials) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationCredentials) &&
@@ -49429,7 +49465,7 @@ Defaulting to \`null\`.`;
49429
49465
  function renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors, suffix = 'settings') {
49430
49466
  var _a;
49431
49467
  if (!field.key) {
49432
- return field.labelHtml ? (jsxRuntimeExports.jsx("p", { className: "m-0 text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), dangerouslySetInnerHTML: { __html: field.labelHtml } })) : (jsxRuntimeExports.jsx("p", { className: "m-0 text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), children: field.label }));
49468
+ return field.labelHtml ? (jsxRuntimeExports.jsx("div", { className: "html-content text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), dangerouslySetInnerHTML: { __html: field.labelHtml } })) : (jsxRuntimeExports.jsx("p", { className: "m-0 text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), children: field.label }));
49433
49469
  }
49434
49470
  const commonProps = {
49435
49471
  id: `${field.key}-${suffix}`,
@@ -49456,16 +49492,43 @@ Defaulting to \`null\`.`;
49456
49492
  return null;
49457
49493
  }
49458
49494
  }
49459
- const SettingsModal = ({ modalRef, isLoading, configurationFields, isSaveDisabled, settingsFieldChange, registerSettingsField, fieldErrors, onSave, }) => {
49460
- return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "settings-modal", width: "65", title: "Settings", footer: jsxRuntimeExports.jsx(Button, { id: "settings-save-btn", disabled: isSaveDisabled, onClick: onSave, children: "Save" }), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-white/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsx("div", { id: "modal-content", children: jsxRuntimeExports.jsxs(Tabs, { defaultValue: "tab-0", children: [jsxRuntimeExports.jsx(TabsList, { children: configurationFields.map((tab, tabIndex) => (jsxRuntimeExports.jsx(TabsTrigger, { value: `tab-${tabIndex}`, children: tab.name }, tab.name))) }), configurationFields.map((tab, tabIndex) => (
49461
- // The form is ref-driven, so an unmounted panel drops its fields from
49462
- // both fillSettingsForm and the save payload. forceMount also renders
49463
- // inactive panels *visible*, hence the explicit hiding.
49464
- jsxRuntimeExports.jsx(TabsContent, { value: `tab-${tabIndex}`, forceMount: true, className: "data-[state=inactive]:hidden", children: jsxRuntimeExports.jsx(FieldGroup, { children: tab.fields.map((field, fieldIndex) => (jsxRuntimeExports.jsx(reactExports.Fragment, { children: renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors) }, field.key || `${tabIndex}-${fieldIndex}`))) }) }, tab.name)))] }) })] }));
49495
+ const DisconnectSection = ({ name, isOwner, hasAutoSync, isDisconnecting, onDisconnect, }) => {
49496
+ const [isOpen, setIsOpen] = reactExports.useState(false);
49497
+ return (jsxRuntimeExports.jsxs("div", { id: "disconnect-section", className: "flex flex-col gap-4 rounded-lg border border-destructive/20 bg-destructive/5 p-4 sm:flex-row sm:items-center", children: [jsxRuntimeExports.jsx(TriangleAlert, { className: "hidden size-5 shrink-0 self-start text-destructive sm:block" }), jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm font-medium text-destructive", children: "Disconnect integration" }), jsxRuntimeExports.jsx("p", { className: "m-0 text-sm text-muted-foreground", children: isOwner
49498
+ ? `Disconnects ${name} and removes its saved settings for this project.${hasAutoSync ? ' Auto Sync will stop.' : ''}`
49499
+ : 'Only the integration owner can disconnect it.' })] }), jsxRuntimeExports.jsxs(Dialog, { open: isOpen, onOpenChange: (open) => !isDisconnecting && setIsOpen(open), children: [jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: jsxRuntimeExports.jsx(Button, { id: "disconnect-btn", variant: "destructive", disabled: !isOwner, className: "shrink-0 self-start sm:self-auto", children: "Disconnect" }) }), jsxRuntimeExports.jsxs(DialogContent, { role: "alertdialog", showCloseButton: false, className: "sm:max-w-md", children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "items-center text-center sm:items-start sm:text-left", children: [jsxRuntimeExports.jsx("div", { className: "mb-2 flex size-10 items-center justify-center rounded-full bg-destructive/10", children: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-5 text-destructive" }) }), jsxRuntimeExports.jsxs(DialogTitle, { children: ["Disconnect ", name, "?"] }), jsxRuntimeExports.jsxs(DialogDescription, { children: [name, " settings", hasAutoSync ? ', Auto Sync selections,' : '', " and logs for this project will be deleted. To use ", name, " again, you'll need to reconnect and set it up again."] })] }), jsxRuntimeExports.jsxs(DialogFooter, { children: [jsxRuntimeExports.jsx(Button, { variant: "outline", disabled: isDisconnecting, onClick: () => setIsOpen(false), children: "Cancel" }), jsxRuntimeExports.jsxs(Button, { id: "disconnect-confirm-btn", variant: "destructive", disabled: isDisconnecting, onClick: onDisconnect, children: [isDisconnecting && jsxRuntimeExports.jsx(Spinner, {}), "Disconnect"] })] })] })] })] }));
49500
+ };
49501
+ const SettingsModal = ({ modalRef, isLoading, configurationFields, isSaveDisabled, settingsFieldChange, registerSettingsField, fieldErrors, onSave, name, isOwner, hasAutoSync, isDisconnecting, onDisconnect, }) => {
49502
+ const hasFields = configurationFields.length > 0;
49503
+ const disconnectSection = (jsxRuntimeExports.jsx(DisconnectSection, { name: name, isOwner: isOwner, hasAutoSync: hasAutoSync, isDisconnecting: isDisconnecting, onDisconnect: onDisconnect }));
49504
+ const contentRef = reactExports.useRef(null);
49505
+ const observerRef = reactExports.useRef(null);
49506
+ const [contentHeight, setContentHeight] = reactExports.useState();
49507
+ // Animate height on tab switch
49508
+ const measureRef = reactExports.useCallback((node) => {
49509
+ var _a;
49510
+ contentRef.current = node;
49511
+ (_a = observerRef.current) === null || _a === void 0 ? void 0 : _a.disconnect();
49512
+ setContentHeight(undefined);
49513
+ if (!node || typeof ResizeObserver === 'undefined') {
49514
+ return;
49515
+ }
49516
+ observerRef.current = new ResizeObserver(() => setContentHeight(node.offsetHeight));
49517
+ observerRef.current.observe(node);
49518
+ }, []);
49519
+ return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "settings-modal", width: "65", title: "Settings", className: "top-[5dvh] max-h-[90dvh] translate-y-0", footer: hasFields && (jsxRuntimeExports.jsx(Button, { id: "settings-save-btn", disabled: isSaveDisabled, onClick: onSave, children: "Save" })), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-white/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsx("div", { className: "-m-1 overflow-hidden transition-[height] duration-200 ease-out motion-reduce:transition-none", style: contentHeight === undefined ? undefined : { height: contentHeight }, children: jsxRuntimeExports.jsxs("div", { id: "modal-content", ref: measureRef, className: "p-1", children: [!hasFields && disconnectSection, jsxRuntimeExports.jsxs(Tabs, { className: hasFields ? undefined : 'hidden', defaultValue: "tab-0", onValueChange: () => {
49520
+ var _a;
49521
+ const viewport = (_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.closest('[data-radix-scroll-area-viewport]');
49522
+ if (viewport) {
49523
+ viewport.scrollTop = 0;
49524
+ }
49525
+ }, children: [jsxRuntimeExports.jsx(TabsList, { children: configurationFields.map((tab, tabIndex) => (jsxRuntimeExports.jsx(TabsTrigger, { value: `tab-${tabIndex}`, children: tab.name }, tab.name))) }), configurationFields.map((tab, tabIndex) => (
49526
+ // forceMount: fields are ref-driven
49527
+ jsxRuntimeExports.jsxs(TabsContent, { value: `tab-${tabIndex}`, forceMount: true, className: "data-[state=inactive]:hidden", children: [jsxRuntimeExports.jsx(FieldGroup, { children: tab.fields.map((field, fieldIndex) => (jsxRuntimeExports.jsx(reactExports.Fragment, { children: renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors) }, field.key || `${tabIndex}-${fieldIndex}`))) }), tabIndex === 0 && jsxRuntimeExports.jsx("div", { className: "mt-8", children: disconnectSection })] }, tab.name)))] })] }) })] }));
49465
49528
  };
49466
49529
 
49467
- const SubscriptionModal = ({ modalRef, subscriptionLink, name, onLogout }) => {
49468
- return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "subscription-modal", width: "50", showCloseButton: false, footer: jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Button, { variant: "default", onClick: () => { var _a; return window.open((_a = subscriptionLink.current) !== null && _a !== void 0 ? _a : '', '_blank', 'noopener,noreferrer'); }, children: "Subscribe" }), jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: () => window.open('https://crowdin.com/contacts', '_blank', 'noopener,noreferrer'), children: "Contact us" }), jsxRuntimeExports.jsx(Button, { variant: "secondary", onClick: onLogout, children: "Log out" })] }), children: jsxRuntimeExports.jsxs(AppAlert, { variant: "warning", children: ["Subscribe to continue using the ", name, " app."] }) }));
49530
+ const SubscriptionModal = ({ modalRef, subscriptionLink, name, isDisconnecting, onLogout, }) => {
49531
+ return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "subscription-modal", width: "50", showCloseButton: false, footer: jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Button, { variant: "default", onClick: () => { var _a; return window.open((_a = subscriptionLink.current) !== null && _a !== void 0 ? _a : '', '_blank', 'noopener,noreferrer'); }, children: "Subscribe" }), jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: () => window.open('https://crowdin.com/contacts', '_blank', 'noopener,noreferrer'), children: "Contact us" }), jsxRuntimeExports.jsxs(Button, { variant: "secondary", disabled: isDisconnecting, onClick: onLogout, children: [isDisconnecting && jsxRuntimeExports.jsx(Spinner, {}), "Disconnect"] })] }), children: jsxRuntimeExports.jsxs(AppAlert, { variant: "warning", children: ["Subscribe to continue using the ", name, " app."] }) }));
49469
49532
  };
49470
49533
 
49471
49534
  function isJSON(string) {
@@ -49549,6 +49612,7 @@ Defaulting to \`null\`.`;
49549
49612
  const subscriptionLink = reactExports.useRef('');
49550
49613
  const refreshDependencies = useFieldDependencies(configurationFields);
49551
49614
  const [isNoticeVisible, setIsNoticeVisible] = reactExports.useState(false);
49615
+ const [isDisconnecting, setIsDisconnecting] = reactExports.useState(false);
49552
49616
  const [subscriptionInfo, setSubscriptionInfo] = reactExports.useState(null);
49553
49617
  const [isErrorLogsVisible, setIsErrorLogsVisible] = reactExports.useState(false);
49554
49618
  const [userErrors, setUserErrors] = reactExports.useState([]);
@@ -49602,7 +49666,6 @@ Defaulting to \`null\`.`;
49602
49666
  if (event.keyCode === 27) {
49603
49667
  closeModal(permissionsModalRef.current);
49604
49668
  closeModal(infoModalRef.current);
49605
- closeModal(settingsModalRef.current);
49606
49669
  closeModal(scheduleModalRef.current);
49607
49670
  if (syncOps.languageModalRef.current) {
49608
49671
  closeModal(syncOps.languageModalRef.current);
@@ -49642,6 +49705,8 @@ Defaulting to \`null\`.`;
49642
49705
  }
49643
49706
  }
49644
49707
  async function integrationLogout() {
49708
+ // not reset on success: the page reloads
49709
+ setIsDisconnecting(true);
49645
49710
  try {
49646
49711
  const queryParams = await checkOrigin();
49647
49712
  await checkResponse(await fetch(`api/logout${queryParams}`, { method: 'POST' }));
@@ -49649,7 +49714,8 @@ Defaulting to \`null\`.`;
49649
49714
  localStorage.removeItem(`revised_${name}`);
49650
49715
  }
49651
49716
  catch (e) {
49652
- catchRejection(e, e.error || 'Looks like you are not logged in');
49717
+ setIsDisconnecting(false);
49718
+ catchRejection(e, e.error || "Can't disconnect the integration");
49653
49719
  }
49654
49720
  }
49655
49721
  function closeAlert(suffix) {
@@ -49678,7 +49744,7 @@ Defaulting to \`null\`.`;
49678
49744
  }
49679
49745
  catch (e) {
49680
49746
  if (requestId === userErrorsRequestId.current) {
49681
- catchRejection(e, "Can't fetch error logs");
49747
+ catchRejection(e, "Can't fetch logs");
49682
49748
  }
49683
49749
  }
49684
49750
  finally {
@@ -49744,10 +49810,10 @@ Defaulting to \`null\`.`;
49744
49810
  function showIntegration() {
49745
49811
  setIsErrorLogsVisible(false);
49746
49812
  }
49747
- return (jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-[1420px] px-6 py-4", children: [jsxRuntimeExports.jsx(TopBar, { notice: notice, isNoticeVisible: isNoticeVisible, checkSubscription: checkSubscription, subscriptionInfo: subscriptionInfo, isErrorLogsVisible: isErrorLogsVisible, isManager: isManager, infoModal: infoModal, hasSettings: !!configurationFields, isOwner: isOwner, onCloseNotice: closeAlert, onShowIntegration: showIntegration, onShowErrorLogs: showErrorLogs, onShowPermissions: permissions.showPermissionsDialog, onOpenInfoModal: () => openModal(infoModalRef.current), onOpenSettings: () => {
49813
+ return (jsxRuntimeExports.jsxs("div", { className: cn('flex flex-col', isErrorLogsVisible ? 'min-h-full' : 'h-full'), children: [jsxRuntimeExports.jsxs("div", { className: "mx-auto flex min-h-0 w-full max-w-[1420px] flex-1 flex-col px-6 py-4", children: [jsxRuntimeExports.jsx(TopBar, { notice: notice, isNoticeVisible: isNoticeVisible, checkSubscription: checkSubscription, subscriptionInfo: subscriptionInfo, isErrorLogsVisible: isErrorLogsVisible, isManager: isManager, infoModal: infoModal, onCloseNotice: closeAlert, onShowIntegration: showIntegration, onShowErrorLogs: showErrorLogs, onShowPermissions: permissions.showPermissionsDialog, onOpenInfoModal: () => openModal(infoModalRef.current), onOpenSettings: () => {
49748
49814
  openModal(settingsModalRef.current);
49749
49815
  setTimeout(settings.fillSettingsForm, 0);
49750
- }, onLogout: integrationLogout }), jsxRuntimeExports.jsx(IntegrationView, { appComponentRef: appComponent, userErrors: userErrors, isUserErrorsLoading: isUserErrorsLoading, userErrorsTotal: userErrorsTotal, userErrorsCurrentPage: userErrorsCurrentPage, userErrorsRowsPerPage: userErrorsRowsPerPage, userErrorsSearchText: userErrorsSearchText, userErrorsIsSortedAsc: userErrorsIsSortedAsc, onSelectUserError: openUserErrorDetail, onUserErrorsOptionsChange: onUserErrorsOptionsChange, name: name, isErrorLogsVisible: isErrorLogsVisible, syncNewElements: syncNewElements, withCronSync: withCronSync, webhooks: webhooks, integrationOneLevelFetching: integrationOneLevelFetching, integrationSearchListener: integrationSearchListener, filtering: filtering, integrationButtonMenuItems: integrationButtonMenuItems, crowdinButtonMenuItems: crowdinButtonMenuItems, onRefreshFilesList: syncOps.handleRefreshFilesList, onFolderToggle: syncOps.handleFolderToggle, onUploadFilesToCrowdin: (detail) => syncOps.uploadFilesToCrowdin({ detail }), onUploadFilesToIntegration: (detail) => syncOps.uploadFilesToIntegration({ detail }), onLoadMore: syncOps.handleLoadMore, onIntegrationFilterChange: syncOps.handleIntegrationFilterChange, onIntegrationScheduleSync: (detail) => schedule.setIntegrationScheduleSync({ detail }), onCrowdinScheduleSync: (detail) => schedule.setCrowdinScheduleSync({ detail }), onIntegrationDisableSync: (detail) => schedule.disableIntegrationSync({ detail }), onCrowdinDisableSync: (detail) => schedule.disableCrowdinSync({ detail }) })] }), jsxRuntimeExports.jsx(Toaster, {}), jsxRuntimeExports.jsx(AsyncProgress, { ref: asyncProgressRef, onCancelJob: syncOps.cancelJob }), jsxRuntimeExports.jsx(SubscriptionModal, { modalRef: subscriptionModal, subscriptionLink: subscriptionLink, name: name, onLogout: integrationLogout }), jsxRuntimeExports.jsx(PermissionsModal, { modalRef: permissionsModalRef, isLoading: permissions.isLoading, permissionUserOptions: permissions.permissionUserOptions, selectedUsers: permissions.permissionsSelectedUsers, isConfirmVisible: permissions.isPermissionsConfirmVisible, permissionsSummary: permissions.permissionsSummary, hasOrganization: hasOrganization, zenModeUrl: zenModeUrl, saveDisabled: !permissions.isPermissionsLoaded, onUsersChange: permissions.checkUsers, onSave: permissions.inviteUsers }), excludedTargetLanguages && (jsxRuntimeExports.jsx(ExcludedLanguagesModal, { modalRef: syncOps.languageModalRef, languageSelectRef: syncOps.languageSelectRef, languageModalState: syncOps.languageModalState, onUpdateTargetLanguages: syncOps.updateCrowdinFilesTargetLanguages, onSyncToCrowdin: syncOps.uploadFilesToCrowdinWithExcludedLanguages })), infoModal && jsxRuntimeExports.jsx(InfoModal, { modalRef: infoModalRef, infoModal: infoModal }), configurationFields && (jsxRuntimeExports.jsx(SettingsModal, { modalRef: settingsModalRef, isLoading: settings.isLoading, configurationFields: configurationFields, isSaveDisabled: settings.isSettingsSaveDisabled, settingsFieldChange: settings.settingsFieldChange, registerSettingsField: settings.registerSettingsField, fieldErrors: settings.fieldErrors, onSave: settings.saveSettings })), ((syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.crowdin) || (syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.integration)) && (jsxRuntimeExports.jsx(ScheduleModal, { modalRef: scheduleModalRef, selectedFilesCheckboxRef: schedule.selectedFilesCheckboxRef, allFolderFilesCheckboxRef: schedule.allFolderFilesCheckboxRef, newFilesCheckboxRef: schedule.newFilesCheckboxRef, scheduleModalState: schedule.scheduleModalState, isSaveDisabled: schedule.isScheduleSaveDisabled, onChangeOptions: schedule.onChangeAutoSynchronizationOptions, onSave: schedule.saveScheduleSync })), jsxRuntimeExports.jsx(UserErrorDetailModal, { modalRef: userErrorDetailModalRef, selectedUserError: selectedUserError, onClose: onUserErrorDetailClose })] }));
49816
+ } }), jsxRuntimeExports.jsx(IntegrationView, { appComponentRef: appComponent, userErrors: userErrors, isUserErrorsLoading: isUserErrorsLoading, userErrorsTotal: userErrorsTotal, userErrorsCurrentPage: userErrorsCurrentPage, userErrorsRowsPerPage: userErrorsRowsPerPage, userErrorsSearchText: userErrorsSearchText, userErrorsIsSortedAsc: userErrorsIsSortedAsc, onSelectUserError: openUserErrorDetail, onUserErrorsOptionsChange: onUserErrorsOptionsChange, name: name, isErrorLogsVisible: isErrorLogsVisible, syncNewElements: syncNewElements, withCronSync: withCronSync, webhooks: webhooks, integrationOneLevelFetching: integrationOneLevelFetching, integrationSearchListener: integrationSearchListener, filtering: filtering, integrationButtonMenuItems: integrationButtonMenuItems, crowdinButtonMenuItems: crowdinButtonMenuItems, onRefreshFilesList: syncOps.handleRefreshFilesList, onFolderToggle: syncOps.handleFolderToggle, onUploadFilesToCrowdin: (detail) => syncOps.uploadFilesToCrowdin({ detail }), onUploadFilesToIntegration: (detail) => syncOps.uploadFilesToIntegration({ detail }), onLoadMore: syncOps.handleLoadMore, onIntegrationFilterChange: syncOps.handleIntegrationFilterChange, onIntegrationScheduleSync: (detail) => schedule.setIntegrationScheduleSync({ detail }), onCrowdinScheduleSync: (detail) => schedule.setCrowdinScheduleSync({ detail }), onIntegrationDisableSync: (detail) => schedule.disableIntegrationSync({ detail }), onCrowdinDisableSync: (detail) => schedule.disableCrowdinSync({ detail }) })] }), jsxRuntimeExports.jsx(Toaster, {}), jsxRuntimeExports.jsx(AsyncProgress, { ref: asyncProgressRef, onCancelJob: syncOps.cancelJob }), jsxRuntimeExports.jsx(SubscriptionModal, { modalRef: subscriptionModal, subscriptionLink: subscriptionLink, name: name, isDisconnecting: isDisconnecting, onLogout: integrationLogout }), jsxRuntimeExports.jsx(PermissionsModal, { modalRef: permissionsModalRef, isLoading: permissions.isLoading, permissionUserOptions: permissions.permissionUserOptions, selectedUsers: permissions.permissionsSelectedUsers, isConfirmVisible: permissions.isPermissionsConfirmVisible, permissionsSummary: permissions.permissionsSummary, hasOrganization: hasOrganization, zenModeUrl: zenModeUrl, saveDisabled: !permissions.isPermissionsLoaded, onUsersChange: permissions.checkUsers, onSave: permissions.inviteUsers }), excludedTargetLanguages && (jsxRuntimeExports.jsx(ExcludedLanguagesModal, { modalRef: syncOps.languageModalRef, languageSelectRef: syncOps.languageSelectRef, languageModalState: syncOps.languageModalState, onUpdateTargetLanguages: syncOps.updateCrowdinFilesTargetLanguages, onSyncToCrowdin: syncOps.uploadFilesToCrowdinWithExcludedLanguages })), infoModal && jsxRuntimeExports.jsx(InfoModal, { modalRef: infoModalRef, infoModal: infoModal }), jsxRuntimeExports.jsx(SettingsModal, { modalRef: settingsModalRef, isLoading: settings.isLoading, configurationFields: configurationFields !== null && configurationFields !== void 0 ? configurationFields : [], isSaveDisabled: settings.isSettingsSaveDisabled, settingsFieldChange: settings.settingsFieldChange, registerSettingsField: settings.registerSettingsField, fieldErrors: settings.fieldErrors, onSave: settings.saveSettings, name: name, isOwner: isOwner, hasAutoSync: !!(withCronSync || webhooks), isDisconnecting: isDisconnecting, onDisconnect: integrationLogout }), ((syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.crowdin) || (syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.integration)) && (jsxRuntimeExports.jsx(ScheduleModal, { modalRef: scheduleModalRef, selectedFilesCheckboxRef: schedule.selectedFilesCheckboxRef, allFolderFilesCheckboxRef: schedule.allFolderFilesCheckboxRef, newFilesCheckboxRef: schedule.newFilesCheckboxRef, scheduleModalState: schedule.scheduleModalState, isSaveDisabled: schedule.isScheduleSaveDisabled, onChangeOptions: schedule.onChangeAutoSynchronizationOptions, onSave: schedule.saveScheduleSync })), jsxRuntimeExports.jsx(UserErrorDetailModal, { modalRef: userErrorDetailModalRef, selectedUserError: selectedUserError, onClose: onUserErrorDetailClose })] }));
49751
49817
  };
49752
49818
 
49753
49819
  initializeCrowdinIframeContext();