@rozenite/network-activity-plugin 1.9.0 → 1.10.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/devtools/App.html +2 -2
  3. package/dist/devtools/assets/{App-m6xge0az.css → App-CUXU0mup.css} +152 -2
  4. package/dist/devtools/assets/{App-hSoryVpJ.js → App-DsimzJvx.js} +6827 -970
  5. package/dist/react-native/chunks/boot-recording.cjs +138 -14
  6. package/dist/react-native/chunks/boot-recording.js +138 -14
  7. package/dist/react-native/chunks/get-nitro-module.cjs +4 -1
  8. package/dist/react-native/chunks/get-nitro-module.js +4 -1
  9. package/dist/react-native/chunks/useNetworkActivityDevTools.require.cjs +20 -1
  10. package/dist/react-native/chunks/useNetworkActivityDevTools.require.js +20 -1
  11. package/dist/react-native/index.d.ts +37 -1
  12. package/dist/rozenite.json +1 -1
  13. package/dist/sdk/index.d.ts +37 -1
  14. package/package.json +12 -7
  15. package/src/react-native/agent/use-network-activity-agent-tools.ts +22 -4
  16. package/src/react-native/http/__tests__/http-utils.test.ts +228 -0
  17. package/src/react-native/http/http-utils.ts +208 -25
  18. package/src/react-native/network-inspector.ts +2 -2
  19. package/src/react-native/nitro-fetch/get-nitro-module.ts +5 -1
  20. package/src/react-native/nitro-fetch/nitro-network-inspector.ts +8 -2
  21. package/src/shared/http-events.ts +40 -1
  22. package/src/ui/components/CodeBlock.tsx +45 -1
  23. package/src/ui/components/FilterBar.tsx +366 -58
  24. package/src/ui/components/HexView.tsx +54 -0
  25. package/src/ui/components/MetadataCard.tsx +95 -0
  26. package/src/ui/components/RequestList.tsx +192 -34
  27. package/src/ui/components/SidePanel.tsx +42 -1
  28. package/src/ui/components/ViewToggle.tsx +44 -0
  29. package/src/ui/components/XmlTree.tsx +160 -0
  30. package/src/ui/components/__tests__/CodeBlock.test.tsx +89 -0
  31. package/src/ui/components/__tests__/HexView.test.tsx +41 -0
  32. package/src/ui/components/__tests__/MetadataCard.test.tsx +107 -0
  33. package/src/ui/components/__tests__/ViewToggle.test.tsx +80 -0
  34. package/src/ui/components/__tests__/XmlTree.test.tsx +149 -0
  35. package/src/ui/response-renderers/__tests__/binary-too-large.test.tsx +56 -0
  36. package/src/ui/response-renderers/__tests__/binary.test.tsx +96 -0
  37. package/src/ui/response-renderers/__tests__/dispatch.test.ts +124 -0
  38. package/src/ui/response-renderers/__tests__/html.test.tsx +101 -0
  39. package/src/ui/response-renderers/__tests__/image.test.tsx +73 -0
  40. package/src/ui/response-renderers/__tests__/json.test.tsx +95 -0
  41. package/src/ui/response-renderers/__tests__/svg.test.tsx +46 -0
  42. package/src/ui/response-renderers/__tests__/xml.test.tsx +100 -0
  43. package/src/ui/response-renderers/binary-too-large.tsx +36 -0
  44. package/src/ui/response-renderers/binary.tsx +31 -0
  45. package/src/ui/response-renderers/empty.tsx +14 -0
  46. package/src/ui/response-renderers/html.tsx +36 -0
  47. package/src/ui/response-renderers/image.tsx +37 -0
  48. package/src/ui/response-renderers/index.ts +55 -0
  49. package/src/ui/response-renderers/json.tsx +40 -0
  50. package/src/ui/response-renderers/svg.tsx +27 -0
  51. package/src/ui/response-renderers/text-fallback.tsx +14 -0
  52. package/src/ui/response-renderers/types.ts +38 -0
  53. package/src/ui/response-renderers/unknown.tsx +18 -0
  54. package/src/ui/response-renderers/xml.tsx +46 -0
  55. package/src/ui/state/derived.ts +12 -0
  56. package/src/ui/state/model.ts +6 -1
  57. package/src/ui/state/store.ts +39 -2
  58. package/src/ui/tabs/InitiatorTab.tsx +230 -0
  59. package/src/ui/tabs/ResponseTab.tsx +80 -97
  60. package/src/ui/tabs/__tests__/ResponseTab.test.tsx +102 -0
  61. package/src/ui/utils/__tests__/download.test.ts +115 -0
  62. package/src/ui/utils/__tests__/hex.test.ts +84 -0
  63. package/src/ui/utils/__tests__/symbolication.test.ts +207 -0
  64. package/src/ui/utils/download.ts +154 -0
  65. package/src/ui/utils/hex.ts +59 -0
  66. package/src/ui/utils/initiator.ts +136 -0
  67. package/src/ui/utils/symbolication.ts +248 -0
  68. package/src/ui/views/InspectorView.tsx +8 -5
  69. package/src/utils/__tests__/getContentTypeMimeType.test.ts +34 -0
  70. package/src/utils/getContentTypeMimeType.ts +14 -0
  71. package/vite.config.ts +5 -1
  72. package/vitest.setup.ts +31 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # @rozenite/network-activity-plugin
2
2
 
3
+ ## 1.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#271](https://github.com/callstackincubator/rozenite/pull/271) [`3a77ccf`](https://github.com/callstackincubator/rozenite/commit/3a77ccfce710a45c674c7cd05ca9a7f6aa422f4f) Thanks [@burczu](https://github.com/burczu)! - Image responses now render inline in the Network Activity panel. PNG, JPEG, GIF, WebP, and SVG show up as previews under a new Preview/Raw sub-tab. The Raw tab shows Content-Type and decoded size; for SVG, the Raw tab shows the source XML. Image responses above an in-capture 5 MB cap show a "Response too large for preview" message instead of crossing the bridge.
8
+
9
+ Adds a Preview/Raw axis that subsequent response-viewer improvements (rendered HTML, formatted XML, JSON Raw, ...) will extend. The toggle is adaptive — hidden for formats with only one meaningful view. The user's last toggle choice sticks across responses within a panel session.
10
+
11
+ The `response-body` bridge event's wire shape is extended additively to a discriminated union (`string | { kind: 'binary'; base64 } | { kind: 'binary-too-large'; size } | null`). Existing consumers that only handle the string variant continue to work unchanged.
12
+
13
+ - [#266](https://github.com/callstackincubator/rozenite/pull/266) [`3adbe11`](https://github.com/callstackincubator/rozenite/commit/3adbe117d38b00455b864a60bdc86b3cd151cbab) Thanks [@draggie](https://github.com/draggie)! - Add advanced request filters to Network Activity.
14
+
15
+ - [#263](https://github.com/callstackincubator/rozenite/pull/263) [`340b779`](https://github.com/callstackincubator/rozenite/commit/340b779c43b43702959dd9a29ed77041b73b970c) Thanks [@draggie](https://github.com/draggie)! - Show source-mapped request initiator details in Network Activity.
16
+
17
+ - [#274](https://github.com/callstackincubator/rozenite/pull/274) [`032ff3e`](https://github.com/callstackincubator/rozenite/commit/032ff3eb9795c7cb0c747d52b73d341a2871185e) Thanks [@burczu](https://github.com/burczu)! - Non-image binary responses now render with a metadata card + virtualized hex viewer, replacing the "Binary content not shown" placeholder. PDFs, fonts, audio, video, archives, and `application/octet-stream` payloads show their bytes in the classic offset / hex / ASCII layout, with a Download button on the metadata card that saves the file using a sensibly-derived name (`Content-Disposition` filename → URL last segment → `response.<ext>` from a small content-type map).
18
+
19
+ Image responses get the same upgrade in their Raw tab — was metadata-only, now metadata + hex view + Download.
20
+
21
+ The `getResponseBody` capture widens to cover everything that isn't text: arraybuffer responses and non-text non-image blobs now arrive at the panel as base64-encoded binary via the existing wire union, with chunked encoding so large payloads don't blow up `String.fromCharCode`. The 5 MB cap continues to apply uniformly; oversized responses surface as "Response too large for preview" with the Download button disabled.
22
+
23
+ Post-this-release invariant: `body === null` on the wire means only "the plugin could not read the body at all" — every other shape arrives as a typed variant of the discriminated union.
24
+
25
+ - [#279](https://github.com/callstackincubator/rozenite/pull/279) [`571d273`](https://github.com/callstackincubator/rozenite/commit/571d2730a570016c60b018f7523945aaee03e15a) Thanks [@burczu](https://github.com/burczu)! - Virtualize large code blocks in the Network Activity panel.
26
+
27
+ Text response bodies above 50,000 characters now render inside a virtualized 500 px scrollable window instead of an unbounded `<pre>` element. Smaller bodies and tree views (JSON, XML) are unaffected. This keeps the panel snappy on multi-megabyte responses (pretty-printed JSON, minified bundles served as text, large logs) without truncating any content.
28
+
29
+ - [#275](https://github.com/callstackincubator/rozenite/pull/275) [`c18dc0f`](https://github.com/callstackincubator/rozenite/commit/c18dc0fb335f4fc472b8392f5e6af72e658edde6) Thanks [@burczu](https://github.com/burczu)! - Render HTML responses in the Network Activity panel via a sandboxed iframe. The Preview tab shows the page with `sandbox=""` (scripts blocked) and a Content-Security-Policy that disallows external subresources (no outbound requests to images, stylesheets, or fonts referenced by the captured HTML). The Raw tab shows the HTML source.
30
+
31
+ - [#277](https://github.com/callstackincubator/rozenite/pull/277) [`e82fa22`](https://github.com/callstackincubator/rozenite/commit/e82fa2201d6e68c0e300a08c2bc49b640aa6fd69) Thanks [@burczu](https://github.com/burczu)! - Render XML responses in the Network Activity panel and add a Raw view to JSON responses.
32
+
33
+ XML responses (`application/xml`, `text/xml`, and RFC 7303 composite types like `application/atom+xml`, `application/rss+xml`, `application/soap+xml`, `application/xhtml+xml`, ...) now render as a collapsible tree with copy affordances on elements, text, and CDATA values in the Preview tab; the Raw tab shows the XML source verbatim. Malformed XML falls back to source with a warning. The capture path was also extended so `application/xml` and `+xml` composite bodies actually reach the panel — previously they were dropped on the wire.
34
+
35
+ JSON responses gain a Preview/Raw toggle: Preview keeps the existing tree, Raw shows the body pretty-printed with 2-space indent regardless of how the wire response was formatted, so minified JSON is readable without leaving the panel.
36
+
37
+ ### Patch Changes
38
+
39
+ - [#273](https://github.com/callstackincubator/rozenite/pull/273) [`60a157e`](https://github.com/callstackincubator/rozenite/commit/60a157e4eb3a2b894bafa50decc1e04eb8b19374) Thanks [@V3RON](https://github.com/V3RON)! - Resolve the optional `react-native-nitro-fetch` dependency before React Native finishes initializing so Metro 0.82 does not show an error overlay when the package is not installed.
40
+
41
+ - Updated dependencies []:
42
+ - @rozenite/agent-bridge@1.10.0
43
+ - @rozenite/agent-shared@1.10.0
44
+ - @rozenite/plugin-bridge@1.10.0
45
+
3
46
  ## 1.9.0
4
47
 
5
48
  ### Patch Changes
@@ -22,8 +22,8 @@
22
22
  <script>
23
23
  var __ROZENITE_PANEL__ = true;
24
24
  </script>
25
- <script type="module" crossorigin src="../devtools/assets/App-hSoryVpJ.js"></script>
26
- <link rel="stylesheet" crossorigin href="../devtools/assets/App-m6xge0az.css">
25
+ <script type="module" crossorigin src="../devtools/assets/App-DsimzJvx.js"></script>
26
+ <link rel="stylesheet" crossorigin href="../devtools/assets/App-CUXU0mup.css">
27
27
  </head>
28
28
  <body>
29
29
  <div id="root"></div>
@@ -541,6 +541,45 @@ video {
541
541
  background-color: hsl(var(--background));
542
542
  color: hsl(var(--foreground));
543
543
  }
544
+ .container {
545
+ width: 100%;
546
+ }
547
+ @media (min-width: 640px) {
548
+
549
+ .container {
550
+ max-width: 640px;
551
+ }
552
+ }
553
+ @media (min-width: 768px) {
554
+
555
+ .container {
556
+ max-width: 768px;
557
+ }
558
+ }
559
+ @media (min-width: 1024px) {
560
+
561
+ .container {
562
+ max-width: 1024px;
563
+ }
564
+ }
565
+ @media (min-width: 1280px) {
566
+
567
+ .container {
568
+ max-width: 1280px;
569
+ }
570
+ }
571
+ @media (min-width: 1536px) {
572
+
573
+ .container {
574
+ max-width: 1536px;
575
+ }
576
+ }
577
+ .visible {
578
+ visibility: visible;
579
+ }
580
+ .collapse {
581
+ visibility: collapse;
582
+ }
544
583
  .absolute {
545
584
  position: absolute;
546
585
  }
@@ -579,6 +618,9 @@ video {
579
618
  margin-top: 0.25rem;
580
619
  margin-bottom: 0.25rem;
581
620
  }
621
+ .-ml-5 {
622
+ margin-left: -1.25rem;
623
+ }
582
624
  .mb-2 {
583
625
  margin-bottom: 0.5rem;
584
626
  }
@@ -609,15 +651,24 @@ video {
609
651
  .ms-2 {
610
652
  margin-inline-start: 0.5rem;
611
653
  }
654
+ .mt-0\.5 {
655
+ margin-top: 0.125rem;
656
+ }
612
657
  .mt-1 {
613
658
  margin-top: 0.25rem;
614
659
  }
615
660
  .mt-2 {
616
661
  margin-top: 0.5rem;
617
662
  }
663
+ .block {
664
+ display: block;
665
+ }
618
666
  .inline-block {
619
667
  display: inline-block;
620
668
  }
669
+ .inline {
670
+ display: inline;
671
+ }
621
672
  .flex {
622
673
  display: flex;
623
674
  }
@@ -630,6 +681,9 @@ video {
630
681
  .grid {
631
682
  display: grid;
632
683
  }
684
+ .hidden {
685
+ display: none;
686
+ }
633
687
  .h-10 {
634
688
  height: 2.5rem;
635
689
  }
@@ -669,6 +723,9 @@ video {
669
723
  .h-\[1px\] {
670
724
  height: 1px;
671
725
  }
726
+ .h-\[500px\] {
727
+ height: 500px;
728
+ }
672
729
  .h-full {
673
730
  height: 100%;
674
731
  }
@@ -681,6 +738,9 @@ video {
681
738
  .max-h-96 {
682
739
  max-height: 24rem;
683
740
  }
741
+ .max-h-\[400px\] {
742
+ max-height: 400px;
743
+ }
684
744
  .min-h-0 {
685
745
  min-height: 0px;
686
746
  }
@@ -714,6 +774,9 @@ video {
714
774
  .w-8 {
715
775
  width: 2rem;
716
776
  }
777
+ .w-80 {
778
+ width: 20rem;
779
+ }
717
780
  .w-\[1px\] {
718
781
  width: 1px;
719
782
  }
@@ -729,6 +792,9 @@ video {
729
792
  .max-w-24 {
730
793
  max-width: 6rem;
731
794
  }
795
+ .max-w-full {
796
+ max-width: 100%;
797
+ }
732
798
  .max-w-xs {
733
799
  max-width: 20rem;
734
800
  }
@@ -772,11 +838,17 @@ video {
772
838
  -moz-user-select: none;
773
839
  user-select: none;
774
840
  }
841
+ .grid-cols-1 {
842
+ grid-template-columns: repeat(1, minmax(0, 1fr));
843
+ }
775
844
  .grid-cols-2 {
776
845
  grid-template-columns: repeat(2, minmax(0, 1fr));
777
846
  }
778
- .grid-cols-5 {
779
- grid-template-columns: repeat(5, minmax(0, 1fr));
847
+ .grid-cols-4 {
848
+ grid-template-columns: repeat(4, minmax(0, 1fr));
849
+ }
850
+ .grid-cols-6 {
851
+ grid-template-columns: repeat(6, minmax(0, 1fr));
780
852
  }
781
853
  .grid-cols-\[minmax\(7rem\2c 25\%\)_minmax\(3rem\2c 1fr\)\] {
782
854
  grid-template-columns: minmax(7rem,25%) minmax(3rem,1fr);
@@ -784,6 +856,9 @@ video {
784
856
  .flex-col {
785
857
  flex-direction: column;
786
858
  }
859
+ .items-start {
860
+ align-items: flex-start;
861
+ }
787
862
  .items-center {
788
863
  align-items: center;
789
864
  }
@@ -799,6 +874,9 @@ video {
799
874
  .gap-2 {
800
875
  gap: 0.5rem;
801
876
  }
877
+ .gap-3 {
878
+ gap: 0.75rem;
879
+ }
802
880
  .gap-4 {
803
881
  gap: 1rem;
804
882
  }
@@ -846,6 +924,9 @@ video {
846
924
  .overflow-y-auto {
847
925
  overflow-y: auto;
848
926
  }
927
+ .overscroll-contain {
928
+ overscroll-behavior: contain;
929
+ }
849
930
  .truncate {
850
931
  overflow: hidden;
851
932
  text-overflow: ellipsis;
@@ -921,9 +1002,16 @@ video {
921
1002
  --tw-border-opacity: 1;
922
1003
  border-color: rgb(192 132 252 / var(--tw-border-opacity, 1));
923
1004
  }
1005
+ .border-red-900\/70 {
1006
+ border-color: rgb(127 29 29 / 0.7);
1007
+ }
924
1008
  .border-transparent {
925
1009
  border-color: transparent;
926
1010
  }
1011
+ .border-violet-500 {
1012
+ --tw-border-opacity: 1;
1013
+ border-color: rgb(139 92 246 / var(--tw-border-opacity, 1));
1014
+ }
927
1015
  .border-yellow-400 {
928
1016
  --tw-border-opacity: 1;
929
1017
  border-color: rgb(250 204 21 / var(--tw-border-opacity, 1));
@@ -937,6 +1025,9 @@ video {
937
1025
  .bg-background {
938
1026
  background-color: hsl(var(--background));
939
1027
  }
1028
+ .bg-blue-500\/30 {
1029
+ background-color: rgb(59 130 246 / 0.3);
1030
+ }
940
1031
  .bg-blue-600 {
941
1032
  --tw-bg-opacity: 1;
942
1033
  background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
@@ -965,10 +1056,17 @@ video {
965
1056
  --tw-bg-opacity: 1;
966
1057
  background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));
967
1058
  }
1059
+ .bg-gray-800\/60 {
1060
+ background-color: rgb(31 41 55 / 0.6);
1061
+ }
968
1062
  .bg-gray-900 {
969
1063
  --tw-bg-opacity: 1;
970
1064
  background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
971
1065
  }
1066
+ .bg-gray-950 {
1067
+ --tw-bg-opacity: 1;
1068
+ background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1));
1069
+ }
972
1070
  .bg-green-600 {
973
1071
  --tw-bg-opacity: 1;
974
1072
  background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));
@@ -991,6 +1089,9 @@ video {
991
1089
  --tw-bg-opacity: 1;
992
1090
  background-color: rgb(147 51 234 / var(--tw-bg-opacity, 1));
993
1091
  }
1092
+ .bg-red-950\/30 {
1093
+ background-color: rgb(69 10 10 / 0.3);
1094
+ }
994
1095
  .bg-secondary {
995
1096
  background-color: hsl(var(--secondary));
996
1097
  }
@@ -998,6 +1099,10 @@ video {
998
1099
  --tw-bg-opacity: 1;
999
1100
  background-color: rgb(196 181 253 / var(--tw-bg-opacity, 1));
1000
1101
  }
1102
+ .bg-white {
1103
+ --tw-bg-opacity: 1;
1104
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
1105
+ }
1001
1106
  .bg-yellow-600 {
1002
1107
  --tw-bg-opacity: 1;
1003
1108
  background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1));
@@ -1005,6 +1110,10 @@ video {
1005
1110
  .fill-current {
1006
1111
  fill: currentColor;
1007
1112
  }
1113
+ .object-contain {
1114
+ -o-object-fit: contain;
1115
+ object-fit: contain;
1116
+ }
1008
1117
  .p-0 {
1009
1118
  padding: 0px;
1010
1119
  }
@@ -1023,6 +1132,10 @@ video {
1023
1132
  .p-\[1px\] {
1024
1133
  padding: 1px;
1025
1134
  }
1135
+ .px-1 {
1136
+ padding-left: 0.25rem;
1137
+ padding-right: 0.25rem;
1138
+ }
1026
1139
  .px-1\.5 {
1027
1140
  padding-left: 0.375rem;
1028
1141
  padding-right: 0.375rem;
@@ -1115,12 +1228,23 @@ video {
1115
1228
  .italic {
1116
1229
  font-style: italic;
1117
1230
  }
1231
+ .leading-snug {
1232
+ line-height: 1.375;
1233
+ }
1118
1234
  .tracking-wide {
1119
1235
  letter-spacing: 0.025em;
1120
1236
  }
1121
1237
  .tracking-widest {
1122
1238
  letter-spacing: 0.1em;
1123
1239
  }
1240
+ .text-amber-400 {
1241
+ --tw-text-opacity: 1;
1242
+ color: rgb(251 191 36 / var(--tw-text-opacity, 1));
1243
+ }
1244
+ .text-blue-100 {
1245
+ --tw-text-opacity: 1;
1246
+ color: rgb(219 234 254 / var(--tw-text-opacity, 1));
1247
+ }
1124
1248
  .text-blue-300 {
1125
1249
  --tw-text-opacity: 1;
1126
1250
  color: rgb(147 197 253 / var(--tw-text-opacity, 1));
@@ -1196,6 +1320,14 @@ video {
1196
1320
  --tw-text-opacity: 1;
1197
1321
  color: rgb(168 85 247 / var(--tw-text-opacity, 1));
1198
1322
  }
1323
+ .text-red-200 {
1324
+ --tw-text-opacity: 1;
1325
+ color: rgb(254 202 202 / var(--tw-text-opacity, 1));
1326
+ }
1327
+ .text-red-300 {
1328
+ --tw-text-opacity: 1;
1329
+ color: rgb(252 165 165 / var(--tw-text-opacity, 1));
1330
+ }
1199
1331
  .text-red-400 {
1200
1332
  --tw-text-opacity: 1;
1201
1333
  color: rgb(248 113 113 / var(--tw-text-opacity, 1));
@@ -1207,6 +1339,10 @@ video {
1207
1339
  .text-secondary-foreground {
1208
1340
  color: hsl(var(--secondary-foreground));
1209
1341
  }
1342
+ .text-violet-200 {
1343
+ --tw-text-opacity: 1;
1344
+ color: rgb(221 214 254 / var(--tw-text-opacity, 1));
1345
+ }
1210
1346
  .text-violet-300 {
1211
1347
  --tw-text-opacity: 1;
1212
1348
  color: rgb(196 181 253 / var(--tw-text-opacity, 1));
@@ -1304,6 +1440,14 @@ video {
1304
1440
  --tw-text-opacity: 1;
1305
1441
  color: rgb(156 163 175 / var(--tw-text-opacity, 1));
1306
1442
  }
1443
+ .placeholder\:text-gray-500::-moz-placeholder {
1444
+ --tw-text-opacity: 1;
1445
+ color: rgb(107 114 128 / var(--tw-text-opacity, 1));
1446
+ }
1447
+ .placeholder\:text-gray-500::placeholder {
1448
+ --tw-text-opacity: 1;
1449
+ color: rgb(107 114 128 / var(--tw-text-opacity, 1));
1450
+ }
1307
1451
  .placeholder\:text-muted-foreground::-moz-placeholder {
1308
1452
  color: hsl(var(--muted-foreground));
1309
1453
  }
@@ -1339,6 +1483,9 @@ video {
1339
1483
  .hover\:bg-secondary\/80:hover {
1340
1484
  background-color: hsl(var(--secondary) / 0.8);
1341
1485
  }
1486
+ .hover\:bg-violet-900\/40:hover {
1487
+ background-color: rgb(76 29 149 / 0.4);
1488
+ }
1342
1489
  .hover\:text-accent-foreground:hover {
1343
1490
  color: hsl(var(--accent-foreground));
1344
1491
  }
@@ -1416,6 +1563,9 @@ video {
1416
1563
  .disabled\:opacity-50:disabled {
1417
1564
  opacity: 0.5;
1418
1565
  }
1566
+ .disabled\:hover\:bg-transparent:hover:disabled {
1567
+ background-color: transparent;
1568
+ }
1419
1569
  .group:hover .group-hover\:opacity-100 {
1420
1570
  opacity: 1;
1421
1571
  }