@crowdin/app-project-module 3.2.1 → 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
  }
@@ -35533,7 +35538,8 @@ Defaulting to \`null\`.`;
35533
35538
  visited.add(item.id);
35534
35539
  const children = (_a = model.childrenByParentId.get(item.id)) !== null && _a !== void 0 ? _a : [];
35535
35540
  result.push({ item, level, hasChildren: children.length > 0 });
35536
- if (query || openedIds.has(item.id)) {
35541
+ // search auto-expands folders, but language rows stay under user control
35542
+ if ((query && item.nodeType !== 'file') || openedIds.has(item.id)) {
35537
35543
  children.forEach((child) => visit(child, level + 1));
35538
35544
  }
35539
35545
  };
@@ -35745,9 +35751,12 @@ Defaulting to \`null\`.`;
35745
35751
  if (!queryActive) {
35746
35752
  return [...openedFolderIds];
35747
35753
  }
35754
+ const openedIds = new Set(openedFolderIds);
35748
35755
  return visibleItems
35749
- .filter(({ item, hasChildren }) => Boolean(hasChildren ||
35750
- (assumeFoldersHaveChildren && (item.nodeType === 'branch' || item.nodeType === 'folder'))))
35756
+ .filter(({ item, hasChildren }) => item.nodeType === 'file'
35757
+ ? openedIds.has(item.id)
35758
+ : Boolean(hasChildren ||
35759
+ (assumeFoldersHaveChildren && (item.nodeType === 'branch' || item.nodeType === 'folder'))))
35751
35760
  .map(({ item }) => item.id);
35752
35761
  }, [assumeFoldersHaveChildren, openedFolderIds, queryActive, visibleItems]);
35753
35762
  const expandedItemsRef = reactExports.useRef(expandedItems);
@@ -35886,7 +35895,7 @@ Defaulting to \`null\`.`;
35886
35895
  function FilesTreeSkeleton() {
35887
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))) }));
35888
35897
  }
35889
- 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, }) {
35890
35899
  const model = reactExports.useMemo(() => buildFilesTreeModel(items), [items]);
35891
35900
  const isInteractionDisabled = disabled || loading;
35892
35901
  const { tree, items: headlessItems, getSelectionState, } = useFilesTree({
@@ -35912,7 +35921,9 @@ Defaulting to \`null\`.`;
35912
35921
  const allVisibleSelected = selectableVisibleIds.length > 0 && selectableVisibleIds.every((itemId) => getSelectionState(itemId) === true);
35913
35922
  const someVisibleSelected = selectableVisibleIds.some((itemId) => getSelectionState(itemId) !== false);
35914
35923
  const selectAllState = allVisibleSelected ? true : someVisibleSelected ? 'indeterminate' : false;
35915
- 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) => {
35916
35927
  var _a, _b, _c, _d, _e;
35917
35928
  const item = headlessItem.getItemData();
35918
35929
  const level = headlessItem.getItemMeta().level;
@@ -36026,6 +36037,30 @@ Defaulting to \`null\`.`;
36026
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" })] }) }));
36027
36038
  }
36028
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
+
36029
36064
  const MOBILE_BREAKPOINT = 768;
36030
36065
  function useIsMobile() {
36031
36066
  const [isMobile, setIsMobile] = reactExports.useState(undefined);
@@ -36158,6 +36193,7 @@ Defaulting to \`null\`.`;
36158
36193
  return parsed.filter((item) => Boolean(item) && typeof item.label === 'string' && typeof item.action === 'string');
36159
36194
  }
36160
36195
 
36196
+ const SEARCH_DEBOUNCE = 300;
36161
36197
  // Stable identity: an inline arrow would invalidate useFilesTree's memoised map.
36162
36198
  function isSelectableTreeItem(item) {
36163
36199
  return item.nodeType !== 'load-more';
@@ -36167,6 +36203,7 @@ Defaulting to \`null\`.`;
36167
36203
  selectedIds: [],
36168
36204
  openedIds: [],
36169
36205
  search: '',
36206
+ appliedSearch: '',
36170
36207
  loading: true,
36171
36208
  syncSettingsLoading: false,
36172
36209
  };
@@ -36407,7 +36444,6 @@ Defaulting to \`null\`.`;
36407
36444
  getOpenedFolders: async () => providersRef.current[provider].openedIds,
36408
36445
  setOpenedFolders: async (ids) => setProvider(provider, { openedIds: ids.map(String) }),
36409
36446
  getFilesToDisplay: async () => providersRef.current[provider].items,
36410
- hasSearchText: async () => Boolean(providersRef.current[provider].search.trim()),
36411
36447
  setLoadMoreLoading: async (id, loading) => {
36412
36448
  const stringId = String(id);
36413
36449
  setLoadMoreLoadingIds((current) => loading
@@ -36721,6 +36757,22 @@ Defaulting to \`null\`.`;
36721
36757
  }
36722
36758
  return actions;
36723
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
+ };
36724
36776
  const renderItemName = (provider) => (item) => {
36725
36777
  const source = item.original;
36726
36778
  if (provider !== 'crowdin' || !source.isLanguage) {
@@ -36742,20 +36794,9 @@ Defaulting to \`null\`.`;
36742
36794
  // Derived, never stored: as state it went stale whenever items changed without a
36743
36795
  // selection change - disableSync cleared the markers but left the button live.
36744
36796
  const hasSyncOption = hasSyncMetadata(displayItems, state.selectedIds);
36745
- 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
36746
- ? `Select content for synchronization to ${name}`
36747
- : '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) => {
36748
- const search = event.target.value;
36749
- setProvider(provider, { search });
36750
- if (!isCrowdin && integrationSearchListener) {
36751
- onIntegrationFilterChange(search);
36752
- }
36753
- }, 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: () => {
36754
- setProvider(provider, { search: '' });
36755
- if (!isCrowdin && integrationSearchListener) {
36756
- onIntegrationFilterChange('');
36757
- }
36758
- }, 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) => {
36759
36800
  var _a;
36760
36801
  if (isOpen && (integrationOneLevelFetching || isCrowdin)) {
36761
36802
  onFolderToggle({
@@ -36766,13 +36807,13 @@ Defaulting to \`null\`.`;
36766
36807
  recursion: false,
36767
36808
  });
36768
36809
  }
36769
- }, 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
36770
36811
  ? 'Select content on the right and sync it to Crowdin.'
36771
36812
  : 'Reload the file list or adjust your search.', renderItemName: renderItemName(provider), renderItemMeta: renderMeta(provider), itemActions: (item) => actionItems(provider, item.original) }) })] }));
36772
36813
  };
36773
36814
  // Exclusive, not CSS-toggled: each panel owns a tree keyed `${provider}-files`,
36774
36815
  // so mounting both layouts would duplicate those DOM ids.
36775
- 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')] })) }) }));
36776
36817
  });
36777
36818
 
36778
36819
  function Select({ ...props }) {
@@ -36829,11 +36870,11 @@ Defaulting to \`null\`.`;
36829
36870
  onSelect(error);
36830
36871
  }
36831
36872
  };
36832
- 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, {}) })] })] })] }));
36833
36874
  };
36834
36875
 
36835
36876
  const IntegrationView = ({ appComponentRef, userErrors, isUserErrorsLoading, userErrorsTotal, userErrorsCurrentPage, userErrorsRowsPerPage, userErrorsSearchText, userErrorsIsSortedAsc, onSelectUserError, onUserErrorsOptionsChange, isErrorLogsVisible, ...integrationProps }) => {
36836
- 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." })] })] }));
36837
36878
  };
36838
36879
 
36839
36880
  function Progress({ className, value, ...props }) {
@@ -36927,26 +36968,18 @@ Defaulting to \`null\`.`;
36927
36968
  }) }))] }));
36928
36969
  });
36929
36970
 
36930
- 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, }) => {
36931
36972
  const isMobile = useIsMobile();
36932
36973
  const actions = [
36933
36974
  ...(isManager ? [{ key: 'share', label: 'Share', icon: Link, onClick: onShowPermissions }] : []),
36934
36975
  ...(infoModal ? [{ key: 'info', label: infoModal.title, icon: Info, onClick: onOpenInfoModal }] : []),
36935
- ...(hasSettings ? [{ key: 'settings', label: 'Settings', icon: Settings, onClick: onOpenSettings }] : []),
36936
- {
36937
- key: 'logout',
36938
- label: 'Log out',
36939
- icon: CircleUserRound,
36940
- onClick: onLogout,
36941
- disabled: !isOwner,
36942
- title: !isOwner ? 'Only the owner can log out' : undefined,
36943
- },
36976
+ { key: 'settings', label: 'Settings', icon: Settings, onClick: onOpenSettings },
36944
36977
  ];
36945
- 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: () => {
36946
36979
  if (subscriptionInfo === null || subscriptionInfo === void 0 ? void 0 : subscriptionInfo.subscribeLink) {
36947
36980
  window.open(subscriptionInfo.subscribeLink, '_blank', 'noopener,noreferrer');
36948
36981
  }
36949
- }, 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 ? (
36950
36983
  // Labelled buttons cannot fit a phone width, and the row does not
36951
36984
  // wrap - left as-is they widen the whole page into a sideways scroll.
36952
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))))] })] }));
@@ -37720,6 +37753,8 @@ Defaulting to \`null\`.`;
37720
37753
  }, []);
37721
37754
  function handleRefreshFilesList(detail) {
37722
37755
  if (detail.refreshIntegration) {
37756
+ savedIntegrationData.current = null;
37757
+ currentOpenedFolders.current = null;
37723
37758
  getIntegrationData({ hardReload: true });
37724
37759
  }
37725
37760
  else if (detail.refreshCrowdin) {
@@ -37756,9 +37791,11 @@ Defaulting to \`null\`.`;
37756
37791
  if (isEmptySearch && savedIntegrationData.current && hasLoadMoreElements.current) {
37757
37792
  appComponent.current.setIntegrationFilesData(savedIntegrationData.current);
37758
37793
  appComponent.current.setIntegrationOpenedFolders(currentOpenedFolders.current);
37794
+ savedIntegrationData.current = null;
37795
+ currentOpenedFolders.current = null;
37759
37796
  return;
37760
37797
  }
37761
- if (!isEmptySearch && hasLoadMoreElements.current) {
37798
+ if (!isEmptySearch && hasLoadMoreElements.current && !savedIntegrationData.current) {
37762
37799
  savedIntegrationData.current = await appComponent.current.getIntegrationFilesData();
37763
37800
  currentOpenedFolders.current = await appComponent.current.getIntegrationOpenedFolders();
37764
37801
  }
@@ -38104,7 +38141,7 @@ Defaulting to \`null\`.`;
38104
38141
  async function getActiveJobs() {
38105
38142
  try {
38106
38143
  const restParams = await checkOrigin();
38107
- 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`));
38108
38145
  if (!Array.isArray(jobs)) {
38109
38146
  return;
38110
38147
  }
@@ -38415,6 +38452,9 @@ Defaulting to \`null\`.`;
38415
38452
  function Dialog({ ...props }) {
38416
38453
  return jsxRuntimeExports.jsx(Dialog$1, { "data-slot": "dialog", ...props });
38417
38454
  }
38455
+ function DialogTrigger({ ...props }) {
38456
+ return jsxRuntimeExports.jsx(DialogTrigger$1, { "data-slot": "dialog-trigger", ...props });
38457
+ }
38418
38458
  function DialogPortal({ ...props }) {
38419
38459
  return jsxRuntimeExports.jsx(DialogPortal$1, { "data-slot": "dialog-portal", ...props });
38420
38460
  }
@@ -49130,7 +49170,7 @@ Defaulting to \`null\`.`;
49130
49170
  return reactExports.useRef(null);
49131
49171
  }
49132
49172
 
49133
- 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) => {
49134
49174
  const [isOpen, setIsOpen] = reactExports.useState(false);
49135
49175
  const [portalContainer, setPortalContainer] = reactExports.useState(null);
49136
49176
  const contentRef = reactExports.useRef(null);
@@ -49154,7 +49194,7 @@ Defaulting to \`null\`.`;
49154
49194
  var _a;
49155
49195
  event.preventDefault();
49156
49196
  (_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.focus();
49157
- }, 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" })] }) }) }));
49158
49198
  });
49159
49199
  AppDialog.displayName = 'AppDialog';
49160
49200
 
@@ -49261,14 +49301,14 @@ Defaulting to \`null\`.`;
49261
49301
  };
49262
49302
 
49263
49303
  const InfoModal = ({ modalRef, infoModal }) => {
49264
- 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 } }) }));
49265
49305
  };
49266
49306
 
49267
49307
  function Switch({ className, size = 'default', ...props }) {
49268
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') }) }));
49269
49309
  }
49270
49310
 
49271
- 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 })] })));
49272
49312
  FieldShell.displayName = 'FieldShell';
49273
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: () => {
49274
49314
  var _a;
@@ -49411,7 +49451,7 @@ Defaulting to \`null\`.`;
49411
49451
  return (jsxRuntimeExports.jsx("div", { className: row.isWarning ? 'mt-1 text-xs text-destructive' : 'mt-1 text-xs text-muted-foreground', children: row.description }));
49412
49452
  }
49413
49453
  const PermissionsModal = ({ modalRef, isLoading, permissionUserOptions, selectedUsers, isConfirmVisible, permissionsSummary, hasOrganization, zenModeUrl, saveDisabled, onUsersChange, onSave, }) => {
49414
- 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) &&
49415
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) &&
49416
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) &&
49417
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) &&
@@ -49425,7 +49465,7 @@ Defaulting to \`null\`.`;
49425
49465
  function renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors, suffix = 'settings') {
49426
49466
  var _a;
49427
49467
  if (!field.key) {
49428
- 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 }));
49429
49469
  }
49430
49470
  const commonProps = {
49431
49471
  id: `${field.key}-${suffix}`,
@@ -49452,16 +49492,43 @@ Defaulting to \`null\`.`;
49452
49492
  return null;
49453
49493
  }
49454
49494
  }
49455
- const SettingsModal = ({ modalRef, isLoading, configurationFields, isSaveDisabled, settingsFieldChange, registerSettingsField, fieldErrors, onSave, }) => {
49456
- 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) => (
49457
- // The form is ref-driven, so an unmounted panel drops its fields from
49458
- // both fillSettingsForm and the save payload. forceMount also renders
49459
- // inactive panels *visible*, hence the explicit hiding.
49460
- 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)))] })] }) })] }));
49461
49528
  };
49462
49529
 
49463
- const SubscriptionModal = ({ modalRef, subscriptionLink, name, onLogout }) => {
49464
- 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."] }) }));
49465
49532
  };
49466
49533
 
49467
49534
  function isJSON(string) {
@@ -49545,6 +49612,7 @@ Defaulting to \`null\`.`;
49545
49612
  const subscriptionLink = reactExports.useRef('');
49546
49613
  const refreshDependencies = useFieldDependencies(configurationFields);
49547
49614
  const [isNoticeVisible, setIsNoticeVisible] = reactExports.useState(false);
49615
+ const [isDisconnecting, setIsDisconnecting] = reactExports.useState(false);
49548
49616
  const [subscriptionInfo, setSubscriptionInfo] = reactExports.useState(null);
49549
49617
  const [isErrorLogsVisible, setIsErrorLogsVisible] = reactExports.useState(false);
49550
49618
  const [userErrors, setUserErrors] = reactExports.useState([]);
@@ -49598,7 +49666,6 @@ Defaulting to \`null\`.`;
49598
49666
  if (event.keyCode === 27) {
49599
49667
  closeModal(permissionsModalRef.current);
49600
49668
  closeModal(infoModalRef.current);
49601
- closeModal(settingsModalRef.current);
49602
49669
  closeModal(scheduleModalRef.current);
49603
49670
  if (syncOps.languageModalRef.current) {
49604
49671
  closeModal(syncOps.languageModalRef.current);
@@ -49638,6 +49705,8 @@ Defaulting to \`null\`.`;
49638
49705
  }
49639
49706
  }
49640
49707
  async function integrationLogout() {
49708
+ // not reset on success: the page reloads
49709
+ setIsDisconnecting(true);
49641
49710
  try {
49642
49711
  const queryParams = await checkOrigin();
49643
49712
  await checkResponse(await fetch(`api/logout${queryParams}`, { method: 'POST' }));
@@ -49645,7 +49714,8 @@ Defaulting to \`null\`.`;
49645
49714
  localStorage.removeItem(`revised_${name}`);
49646
49715
  }
49647
49716
  catch (e) {
49648
- catchRejection(e, e.error || 'Looks like you are not logged in');
49717
+ setIsDisconnecting(false);
49718
+ catchRejection(e, e.error || "Can't disconnect the integration");
49649
49719
  }
49650
49720
  }
49651
49721
  function closeAlert(suffix) {
@@ -49674,7 +49744,7 @@ Defaulting to \`null\`.`;
49674
49744
  }
49675
49745
  catch (e) {
49676
49746
  if (requestId === userErrorsRequestId.current) {
49677
- catchRejection(e, "Can't fetch error logs");
49747
+ catchRejection(e, "Can't fetch logs");
49678
49748
  }
49679
49749
  }
49680
49750
  finally {
@@ -49740,10 +49810,10 @@ Defaulting to \`null\`.`;
49740
49810
  function showIntegration() {
49741
49811
  setIsErrorLogsVisible(false);
49742
49812
  }
49743
- 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: () => {
49744
49814
  openModal(settingsModalRef.current);
49745
49815
  setTimeout(settings.fillSettingsForm, 0);
49746
- }, 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 })] }));
49747
49817
  };
49748
49818
 
49749
49819
  initializeCrowdinIframeContext();