@raketa-cloud/admin 1.8.17 → 1.8.19

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.
Files changed (59) hide show
  1. package/dist/application.css +288 -11
  2. package/package.json +8 -6
  3. package/src/handlers/resources/ReportsAPIHandler.js +27 -0
  4. package/src/handlers/resources/ResourcesHandler.js +16 -0
  5. package/src/helpers/content_tasks_helper.js +1 -1
  6. package/src/helpers/reports/cwv.js +217 -0
  7. package/src/helpers/reports/googleAuth.js +149 -0
  8. package/src/helpers/reports/quick-insights.js +294 -0
  9. package/src/helpers/reports/reportsUtils.js +181 -0
  10. package/src/index.js +8 -0
  11. package/src/localCache.js +112 -0
  12. package/src/report/analytics.js +107 -0
  13. package/src/report/reports.js +390 -0
  14. package/src/routeAssets.js +74 -0
  15. package/src/routeResourceModule.js +24 -0
  16. package/src/routeStandard.js +7 -1
  17. package/src/styles/application.css +1 -1
  18. package/src/tests/handlers/RedirectsHandler.test/notes.test.js +56 -0
  19. package/src/tests/handlers/_shared/SettingsHandler.test/global_variables.test.js +54 -0
  20. package/src/tests/handlers/categories/update_defaults.test.js +35 -0
  21. package/src/tests/handlers/content_tasks/ContentTasksHandler.test/editors.test.js +29 -0
  22. package/src/tests/handlers/resource_revisions/PublishesHandler.test/schedule.test.js +137 -0
  23. package/src/tests/handlers/resource_revisions/TagHandler.test/default_locale_tags.test.js +162 -0
  24. package/src/tests/handlers/resource_revisions/WidgetHandler.test/defaults.test.js +61 -0
  25. package/src/tests/handlers/resources/DeletesHandler.test/no_redirect.test.js +55 -0
  26. package/src/tests/handlers/resources/ReportsAPIHandler.test/show.test.js +156 -0
  27. package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +8 -0
  28. package/src/tests/handlers/resources/ResourcesHandler.test/show_reports.test.js +94 -0
  29. package/src/tests/handlers/resources/TranslationsHandler.test/edge_cases.test.js +211 -0
  30. package/src/tests/helpers/CSVExportHelper.branches.test.js +57 -0
  31. package/src/tests/helpers/FormBuilder.branches.test.js +151 -0
  32. package/src/tests/helpers/HTMLBuilder.test.js +51 -0
  33. package/src/tests/helpers/content_tasks_helper.test.js +1 -1
  34. package/src/tests/helpers/historyUtils.branches.test.js +36 -0
  35. package/src/tests/helpers/reports/cwv.test.js +239 -0
  36. package/src/tests/helpers/reports/quick-insights.test.js +593 -0
  37. package/src/tests/helpers/reports/reportsUtils.test.js +425 -0
  38. package/src/tests/helpers/utils.test.js +37 -0
  39. package/src/tests/helpers/view_helpers.test.js +87 -0
  40. package/src/tests/index.test.js +74 -0
  41. package/src/tests/localCache.test.js +236 -0
  42. package/src/tests/report/analytics.test.js +230 -0
  43. package/src/tests/report/reports.test.js +831 -0
  44. package/src/tests/routeAssets.test.js +120 -0
  45. package/src/tests/routeResourceModule.test.js +99 -2
  46. package/src/tests/routeStandard.test.js +3 -3
  47. package/src/tests/support/fakeDom.js +164 -0
  48. package/src/views/content_tasks/index.ejs +2 -2
  49. package/src/views/resources/_shared/_core_web_vitals.ejs +27 -0
  50. package/src/views/resources/_shared/_quick_insights.ejs +64 -0
  51. package/src/views/resources/_shared/_scheduled_revisions.ejs +88 -0
  52. package/src/views/resources/_shared/_title.ejs +16 -12
  53. package/src/views/resources/_shared/_toolbar.ejs +11 -21
  54. package/src/views/resources/_shared/_traffic_chart.ejs +27 -0
  55. package/src/views/resources/_shared/_translations_strip.ejs +13 -25
  56. package/src/views/resources/_shared/_vital_meter.ejs +54 -0
  57. package/src/views/resources/index.ejs +1 -1
  58. package/src/views/resources/show.ejs +88 -98
  59. package/src/views/resources/translations/create_form.ejs +14 -5
@@ -749,6 +749,40 @@ select {
749
749
  --tw-contain-style: ;
750
750
  }
751
751
 
752
+ .container {
753
+ width: 100%;
754
+ }
755
+
756
+ @media (min-width: 640px) {
757
+ .container {
758
+ max-width: 640px;
759
+ }
760
+ }
761
+
762
+ @media (min-width: 768px) {
763
+ .container {
764
+ max-width: 768px;
765
+ }
766
+ }
767
+
768
+ @media (min-width: 1024px) {
769
+ .container {
770
+ max-width: 1024px;
771
+ }
772
+ }
773
+
774
+ @media (min-width: 1280px) {
775
+ .container {
776
+ max-width: 1280px;
777
+ }
778
+ }
779
+
780
+ @media (min-width: 1536px) {
781
+ .container {
782
+ max-width: 1536px;
783
+ }
784
+ }
785
+
752
786
  /* Utils */
753
787
 
754
788
  .chip {
@@ -1494,7 +1528,6 @@ select {
1494
1528
 
1495
1529
  .page-title {
1496
1530
  margin-top: 1.5rem;
1497
- margin-bottom: 1.5rem;
1498
1531
  display: flex;
1499
1532
  align-items: center;
1500
1533
  justify-content: space-between;
@@ -1570,6 +1603,18 @@ select {
1570
1603
  visibility: visible;
1571
1604
  }
1572
1605
 
1606
+ .invisible {
1607
+ visibility: hidden;
1608
+ }
1609
+
1610
+ .collapse {
1611
+ visibility: collapse;
1612
+ }
1613
+
1614
+ .static {
1615
+ position: static;
1616
+ }
1617
+
1573
1618
  .absolute {
1574
1619
  position: absolute;
1575
1620
  }
@@ -1582,6 +1627,10 @@ select {
1582
1627
  position: sticky;
1583
1628
  }
1584
1629
 
1630
+ .inset-0 {
1631
+ inset: 0px;
1632
+ }
1633
+
1585
1634
  .-right-0 {
1586
1635
  right: -0px;
1587
1636
  }
@@ -1654,21 +1703,11 @@ select {
1654
1703
  z-index: 50;
1655
1704
  }
1656
1705
 
1657
- .-my-4 {
1658
- margin-top: -1rem;
1659
- margin-bottom: -1rem;
1660
- }
1661
-
1662
1706
  .my-4 {
1663
1707
  margin-top: 1rem;
1664
1708
  margin-bottom: 1rem;
1665
1709
  }
1666
1710
 
1667
- .my-8 {
1668
- margin-top: 2rem;
1669
- margin-bottom: 2rem;
1670
- }
1671
-
1672
1711
  .mb-0 {
1673
1712
  margin-bottom: 0px;
1674
1713
  }
@@ -1697,6 +1736,14 @@ select {
1697
1736
  margin-bottom: 1.5rem;
1698
1737
  }
1699
1738
 
1739
+ .ml-1 {
1740
+ margin-left: 0.25rem;
1741
+ }
1742
+
1743
+ .ml-1\.5 {
1744
+ margin-left: 0.375rem;
1745
+ }
1746
+
1700
1747
  .ml-10 {
1701
1748
  margin-left: 2.5rem;
1702
1749
  }
@@ -1717,6 +1764,10 @@ select {
1717
1764
  margin-top: 0.5rem;
1718
1765
  }
1719
1766
 
1767
+ .mt-3 {
1768
+ margin-top: 0.75rem;
1769
+ }
1770
+
1720
1771
  .mt-4 {
1721
1772
  margin-top: 1rem;
1722
1773
  }
@@ -1771,6 +1822,16 @@ select {
1771
1822
  height: 3.5rem;
1772
1823
  }
1773
1824
 
1825
+ .size-3 {
1826
+ width: 0.75rem;
1827
+ height: 0.75rem;
1828
+ }
1829
+
1830
+ .size-3\.5 {
1831
+ width: 0.875rem;
1832
+ height: 0.875rem;
1833
+ }
1834
+
1774
1835
  .size-4 {
1775
1836
  width: 1rem;
1776
1837
  height: 1rem;
@@ -1791,10 +1852,18 @@ select {
1791
1852
  height: 2rem;
1792
1853
  }
1793
1854
 
1855
+ .h-2 {
1856
+ height: 0.5rem;
1857
+ }
1858
+
1794
1859
  .h-3 {
1795
1860
  height: 0.75rem;
1796
1861
  }
1797
1862
 
1863
+ .h-4 {
1864
+ height: 1rem;
1865
+ }
1866
+
1798
1867
  .h-5 {
1799
1868
  height: 1.25rem;
1800
1869
  }
@@ -1803,6 +1872,10 @@ select {
1803
1872
  height: 2.25rem;
1804
1873
  }
1805
1874
 
1875
+ .h-\[320px\] {
1876
+ height: 320px;
1877
+ }
1878
+
1806
1879
  .h-\[calc\(100vh-56px\)\] {
1807
1880
  height: calc(100vh - 56px);
1808
1881
  }
@@ -1840,6 +1913,14 @@ select {
1840
1913
  width: 4rem;
1841
1914
  }
1842
1915
 
1916
+ .w-2 {
1917
+ width: 0.5rem;
1918
+ }
1919
+
1920
+ .w-2\.5 {
1921
+ width: 0.625rem;
1922
+ }
1923
+
1843
1924
  .w-3 {
1844
1925
  width: 0.75rem;
1845
1926
  }
@@ -1884,6 +1965,11 @@ select {
1884
1965
  flex: none;
1885
1966
  }
1886
1967
 
1968
+ .-translate-x-1\/2 {
1969
+ --tw-translate-x: -50%;
1970
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1971
+ }
1972
+
1887
1973
  .rotate-180 {
1888
1974
  --tw-rotate: 180deg;
1889
1975
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -1904,6 +1990,16 @@ select {
1904
1990
  animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
1905
1991
  }
1906
1992
 
1993
+ @keyframes spin {
1994
+ to {
1995
+ transform: rotate(360deg);
1996
+ }
1997
+ }
1998
+
1999
+ .animate-spin {
2000
+ animation: spin 1s linear infinite;
2001
+ }
2002
+
1907
2003
  .cursor-not-allowed {
1908
2004
  cursor: not-allowed;
1909
2005
  }
@@ -1912,6 +2008,14 @@ select {
1912
2008
  cursor: pointer;
1913
2009
  }
1914
2010
 
2011
+ .grid-cols-1 {
2012
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2013
+ }
2014
+
2015
+ .grid-cols-2 {
2016
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2017
+ }
2018
+
1915
2019
  .flex-col {
1916
2020
  flex-direction: column;
1917
2021
  }
@@ -1960,6 +2064,10 @@ select {
1960
2064
  gap: 1rem;
1961
2065
  }
1962
2066
 
2067
+ .gap-6 {
2068
+ gap: 1.5rem;
2069
+ }
2070
+
1963
2071
  .overflow-hidden {
1964
2072
  overflow: hidden;
1965
2073
  }
@@ -1990,6 +2098,10 @@ select {
1990
2098
  border-radius: 9999px;
1991
2099
  }
1992
2100
 
2101
+ .rounded-xl {
2102
+ border-radius: 0.75rem;
2103
+ }
2104
+
1993
2105
  .rounded-l {
1994
2106
  border-top-left-radius: 0.25rem;
1995
2107
  border-bottom-left-radius: 0.25rem;
@@ -1999,6 +2111,10 @@ select {
1999
2111
  border-width: 1px;
2000
2112
  }
2001
2113
 
2114
+ .border-2 {
2115
+ border-width: 2px;
2116
+ }
2117
+
2002
2118
  .border-\[2px\] {
2003
2119
  border-width: 2px;
2004
2120
  }
@@ -2029,6 +2145,11 @@ select {
2029
2145
  border-color: rgb(240 240 248 / var(--tw-border-opacity));
2030
2146
  }
2031
2147
 
2148
+ .border-neutral-200 {
2149
+ --tw-border-opacity: 1;
2150
+ border-color: rgb(229 229 229 / var(--tw-border-opacity));
2151
+ }
2152
+
2032
2153
  .border-neutral-300 {
2033
2154
  --tw-border-opacity: 1;
2034
2155
  border-color: rgb(212 212 212 / var(--tw-border-opacity));
@@ -2039,15 +2160,34 @@ select {
2039
2160
  border-color: rgba(var(--primary), var(--tw-border-opacity));
2040
2161
  }
2041
2162
 
2163
+ .border-raketa-primary\/20 {
2164
+ border-color: rgba(var(--primary), 0.2);
2165
+ }
2166
+
2042
2167
  .border-transparent {
2043
2168
  border-color: transparent;
2044
2169
  }
2045
2170
 
2171
+ .border-yellow-500 {
2172
+ --tw-border-opacity: 1;
2173
+ border-color: rgb(234 179 8 / var(--tw-border-opacity));
2174
+ }
2175
+
2176
+ .border-t-raketa-primary {
2177
+ --tw-border-opacity: 1;
2178
+ border-top-color: rgba(var(--primary), var(--tw-border-opacity));
2179
+ }
2180
+
2046
2181
  .bg-\[\#F7F7FC\] {
2047
2182
  --tw-bg-opacity: 1;
2048
2183
  background-color: rgb(247 247 252 / var(--tw-bg-opacity));
2049
2184
  }
2050
2185
 
2186
+ .bg-amber-500 {
2187
+ --tw-bg-opacity: 1;
2188
+ background-color: rgb(245 158 11 / var(--tw-bg-opacity));
2189
+ }
2190
+
2051
2191
  .bg-black {
2052
2192
  --tw-bg-opacity: 1;
2053
2193
  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
@@ -2063,6 +2203,16 @@ select {
2063
2203
  background-color: rgb(209 250 229 / var(--tw-bg-opacity));
2064
2204
  }
2065
2205
 
2206
+ .bg-emerald-500 {
2207
+ --tw-bg-opacity: 1;
2208
+ background-color: rgb(16 185 129 / var(--tw-bg-opacity));
2209
+ }
2210
+
2211
+ .bg-mono-25 {
2212
+ --tw-bg-opacity: 1;
2213
+ background-color: rgb(234 234 234 / var(--tw-bg-opacity));
2214
+ }
2215
+
2066
2216
  .bg-orange-100 {
2067
2217
  --tw-bg-opacity: 1;
2068
2218
  background-color: rgb(255 237 213 / var(--tw-bg-opacity));
@@ -2082,6 +2232,10 @@ select {
2082
2232
  background-color: rgba(var(--primary), var(--tw-bg-opacity));
2083
2233
  }
2084
2234
 
2235
+ .bg-raketa-primary\/10 {
2236
+ background-color: rgba(var(--primary), 0.1);
2237
+ }
2238
+
2085
2239
  .bg-raketa-primary\/5 {
2086
2240
  background-color: rgba(var(--primary), 0.05);
2087
2241
  }
@@ -2091,11 +2245,21 @@ select {
2091
2245
  background-color: rgb(254 226 226 / var(--tw-bg-opacity));
2092
2246
  }
2093
2247
 
2248
+ .bg-red-500 {
2249
+ --tw-bg-opacity: 1;
2250
+ background-color: rgb(239 68 68 / var(--tw-bg-opacity));
2251
+ }
2252
+
2094
2253
  .bg-white {
2095
2254
  --tw-bg-opacity: 1;
2096
2255
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
2097
2256
  }
2098
2257
 
2258
+ .bg-yellow-400 {
2259
+ --tw-bg-opacity: 1;
2260
+ background-color: rgb(250 204 21 / var(--tw-bg-opacity));
2261
+ }
2262
+
2099
2263
  .fill-\[\#34a853\] {
2100
2264
  fill: #34a853;
2101
2265
  }
@@ -2124,6 +2288,14 @@ select {
2124
2288
  padding: 1rem;
2125
2289
  }
2126
2290
 
2291
+ .p-5 {
2292
+ padding: 1.25rem;
2293
+ }
2294
+
2295
+ .p-6 {
2296
+ padding: 1.5rem;
2297
+ }
2298
+
2127
2299
  .px-3 {
2128
2300
  padding-left: 0.75rem;
2129
2301
  padding-right: 0.75rem;
@@ -2187,6 +2359,14 @@ select {
2187
2359
  padding-top: 0.25rem;
2188
2360
  }
2189
2361
 
2362
+ .pt-2 {
2363
+ padding-top: 0.5rem;
2364
+ }
2365
+
2366
+ .pt-6 {
2367
+ padding-top: 1.5rem;
2368
+ }
2369
+
2190
2370
  .text-center {
2191
2371
  text-align: center;
2192
2372
  }
@@ -2196,11 +2376,24 @@ select {
2196
2376
  line-height: 2.25rem;
2197
2377
  }
2198
2378
 
2379
+ .text-\[10px\] {
2380
+ font-size: 10px;
2381
+ }
2382
+
2383
+ .text-\[11px\] {
2384
+ font-size: 11px;
2385
+ }
2386
+
2199
2387
  .text-sm {
2200
2388
  font-size: 0.875rem;
2201
2389
  line-height: 1.25rem;
2202
2390
  }
2203
2391
 
2392
+ .text-xl {
2393
+ font-size: 1.25rem;
2394
+ line-height: 1.75rem;
2395
+ }
2396
+
2204
2397
  .text-xs {
2205
2398
  font-size: 0.75rem;
2206
2399
  line-height: 1rem;
@@ -2214,6 +2407,10 @@ select {
2214
2407
  font-weight: 500;
2215
2408
  }
2216
2409
 
2410
+ .font-normal {
2411
+ font-weight: 400;
2412
+ }
2413
+
2217
2414
  .font-semibold {
2218
2415
  font-weight: 600;
2219
2416
  }
@@ -2234,6 +2431,10 @@ select {
2234
2431
  font-style: italic;
2235
2432
  }
2236
2433
 
2434
+ .leading-tight {
2435
+ line-height: 1.25;
2436
+ }
2437
+
2237
2438
  .tracking-wider {
2238
2439
  letter-spacing: 0.05em;
2239
2440
  }
@@ -2243,11 +2444,21 @@ select {
2243
2444
  color: rgb(60 64 67 / var(--tw-text-opacity));
2244
2445
  }
2245
2446
 
2447
+ .text-amber-500 {
2448
+ --tw-text-opacity: 1;
2449
+ color: rgb(245 158 11 / var(--tw-text-opacity));
2450
+ }
2451
+
2246
2452
  .text-blue-700 {
2247
2453
  --tw-text-opacity: 1;
2248
2454
  color: rgb(29 78 216 / var(--tw-text-opacity));
2249
2455
  }
2250
2456
 
2457
+ .text-emerald-500 {
2458
+ --tw-text-opacity: 1;
2459
+ color: rgb(16 185 129 / var(--tw-text-opacity));
2460
+ }
2461
+
2251
2462
  .text-emerald-600 {
2252
2463
  --tw-text-opacity: 1;
2253
2464
  color: rgb(5 150 105 / var(--tw-text-opacity));
@@ -2263,6 +2474,11 @@ select {
2263
2474
  color: rgb(156 163 175 / var(--tw-text-opacity));
2264
2475
  }
2265
2476
 
2477
+ .text-orange-500 {
2478
+ --tw-text-opacity: 1;
2479
+ color: rgb(249 115 22 / var(--tw-text-opacity));
2480
+ }
2481
+
2266
2482
  .text-orange-700 {
2267
2483
  --tw-text-opacity: 1;
2268
2484
  color: rgb(194 65 12 / var(--tw-text-opacity));
@@ -2359,6 +2575,11 @@ select {
2359
2575
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
2360
2576
  }
2361
2577
 
2578
+ .grayscale {
2579
+ --tw-grayscale: grayscale(100%);
2580
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
2581
+ }
2582
+
2362
2583
  .filter {
2363
2584
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
2364
2585
  }
@@ -3149,6 +3370,10 @@ body {
3149
3370
  background-color: rgba(var(--primary), var(--tw-bg-opacity));
3150
3371
  }
3151
3372
 
3373
+ .hover\:bg-raketa-primary\/20:hover {
3374
+ background-color: rgba(var(--primary), 0.2);
3375
+ }
3376
+
3152
3377
  .hover\:text-raketa-foreground:hover {
3153
3378
  --tw-text-opacity: 1;
3154
3379
  color: rgba(var(--foreground), var(--tw-text-opacity));
@@ -3213,6 +3438,10 @@ body {
3213
3438
  }
3214
3439
 
3215
3440
  @media (min-width: 768px) {
3441
+ .md\:grid-cols-2 {
3442
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3443
+ }
3444
+
3216
3445
  .md\:grid-cols-3 {
3217
3446
  grid-template-columns: repeat(3, minmax(0, 1fr));
3218
3447
  }
@@ -3234,6 +3463,42 @@ body {
3234
3463
  .lg\:grid-cols-3 {
3235
3464
  grid-template-columns: repeat(3, minmax(0, 1fr));
3236
3465
  }
3466
+
3467
+ .lg\:grid-cols-4 {
3468
+ grid-template-columns: repeat(4, minmax(0, 1fr));
3469
+ }
3470
+
3471
+ .lg\:grid-cols-5 {
3472
+ grid-template-columns: repeat(5, minmax(0, 1fr));
3473
+ }
3474
+
3475
+ .lg\:gap-0 {
3476
+ gap: 0px;
3477
+ }
3478
+
3479
+ .lg\:divide-x > :not([hidden]) ~ :not([hidden]) {
3480
+ --tw-divide-x-reverse: 0;
3481
+ border-right-width: calc(1px * var(--tw-divide-x-reverse));
3482
+ border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
3483
+ }
3484
+
3485
+ .lg\:divide-neutral-200 > :not([hidden]) ~ :not([hidden]) {
3486
+ --tw-divide-opacity: 1;
3487
+ border-color: rgb(229 229 229 / var(--tw-divide-opacity));
3488
+ }
3489
+
3490
+ .lg\:px-5 {
3491
+ padding-left: 1.25rem;
3492
+ padding-right: 1.25rem;
3493
+ }
3494
+
3495
+ .lg\:first\:pl-0:first-child {
3496
+ padding-left: 0px;
3497
+ }
3498
+
3499
+ .lg\:last\:pr-0:last-child {
3500
+ padding-right: 0px;
3501
+ }
3237
3502
  }
3238
3503
 
3239
3504
  .dark\:border-neutral-500:where(.dark, .dark *) {
@@ -3254,6 +3519,11 @@ body {
3254
3519
  background-color: rgb(6 78 59 / 0.5);
3255
3520
  }
3256
3521
 
3522
+ .dark\:bg-neutral-800:where(.dark, .dark *) {
3523
+ --tw-bg-opacity: 1;
3524
+ background-color: rgb(38 38 38 / var(--tw-bg-opacity));
3525
+ }
3526
+
3257
3527
  .dark\:bg-orange-900\/50:where(.dark, .dark *) {
3258
3528
  background-color: rgb(124 45 18 / 0.5);
3259
3529
  }
@@ -3295,3 +3565,10 @@ body {
3295
3565
  --tw-bg-opacity: 1;
3296
3566
  background-color: rgb(64 64 64 / var(--tw-bg-opacity));
3297
3567
  }
3568
+
3569
+ @media (min-width: 1024px) {
3570
+ .dark\:lg\:divide-neutral-700:where(.dark, .dark *) > :not([hidden]) ~ :not([hidden]) {
3571
+ --tw-divide-opacity: 1;
3572
+ border-color: rgb(64 64 64 / var(--tw-divide-opacity));
3573
+ }
3574
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "1.8.17",
3
+ "version": "1.8.19",
4
4
  "main": "src/index.js",
5
5
  "files": [
6
6
  "src/",
@@ -21,17 +21,19 @@
21
21
  "@tailwindcss/forms": "0.5.7",
22
22
  "@tailwindcss/typography": "0.5.13",
23
23
  "@types/node": "24.10.1",
24
- "babel-jest": "^29.7.0",
25
- "jest": "^29.7.0",
26
- "jest-environment-node": "^29.7.0",
24
+ "babel-jest": "29.7.0",
25
+ "jest": "29.7.0",
26
+ "jest-environment-node": "29.7.0",
27
27
  "tailwindcss": "3.4.4",
28
28
  "typescript": "5.9.3"
29
29
  },
30
30
  "dependencies": {
31
31
  "@hono/node-server": "2.0.12",
32
- "ejs": "^6.0.1",
32
+ "chart.js": "4.5.1",
33
+ "ejs": "6.0.1",
33
34
  "graphql-request": "7.4.0",
34
- "hono": "4.12.32"
35
+ "hono": "4.12.34",
36
+ "lru-cache": "11.5.2"
35
37
  },
36
38
  "overrides": {
37
39
  "error-ex": "1.3.4"
@@ -0,0 +1,27 @@
1
+ import { resourceReports } from "../../helpers/reports/reportsUtils";
2
+
3
+ // Nothing is cached here: the upstream calls cache themselves per page (GA and
4
+ // CrUX, 3 hours each), so a second cache of the assembled payload would only
5
+ // hold the resource's own publish dates back for the same 3 hours.
6
+ const show = async (ctx) => {
7
+ const { id } = ctx.params;
8
+ const { resourceType } = ctx.resourceConfig;
9
+
10
+ const resource = await ctx.client.resources.find(
11
+ id,
12
+ ctx.locale,
13
+ resourceType,
14
+ );
15
+
16
+ if (!resource) {
17
+ throw new Error(`Missing ${resourceType} #${id}`);
18
+ }
19
+
20
+ // Either side comes back null when it isn't configured and { error } when its
21
+ // request failed, so there is nothing left for this handler to fall back to.
22
+ return {
23
+ json: await resourceReports(ctx, resource, resourceType),
24
+ };
25
+ };
26
+
27
+ export default { show };
@@ -1,3 +1,6 @@
1
+ import { CWV_METRICS } from "../../helpers/reports/cwv";
2
+ import { reportsAvailability } from "../../helpers/reports/reportsUtils";
3
+
1
4
  const index = async (ctx) => {
2
5
  const { resourceType } = ctx.resourceConfig;
3
6
 
@@ -58,9 +61,22 @@ const show = async (ctx) => {
58
61
  resourceType,
59
62
  );
60
63
 
64
+ // The reports are fetched client-side from the JSON endpoint below — GA and
65
+ // CrUX round-trips used to hold up this render.
66
+ const available = reportsAvailability(ctx);
67
+
61
68
  return {
62
69
  assigns: {
63
70
  resource,
71
+ reports: {
72
+ insights: available.insights,
73
+ webVitals: available.webVitals,
74
+ path:
75
+ available.insights || available.webVitals
76
+ ? `/${ctx.locale}/report/${resourceTypePlural}/${resource.id}`
77
+ : null,
78
+ vitalsMeta: available.webVitals ? CWV_METRICS : [],
79
+ },
64
80
  revisions: revisions.list,
65
81
  changes: changes,
66
82
  _translations: Object.keys(ctx.locales)
@@ -1,5 +1,5 @@
1
1
  const WORKFLOWS_MAP = {
2
- lokalise_to_ai_rt_hum: "Lokalise: AI translation & Human review",
2
+ lokalise_to_ai_rt_hum: "Lokalise: AI translation (DeepL) & Human review",
3
3
  lokalise_tt_hum: "Lokalise: Human translation",
4
4
  lokalise_tt_ai: "Lokalise: AI translation",
5
5
  };