@rozenite/controls-plugin 1.4.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.
@@ -0,0 +1,16 @@
1
+
2
+ 
3
+ > @rozenite/controls-plugin@0.0.0 build /Users/szymon.chmal/Projects/rn-devtools/packages/controls-plugin
4
+ > rozenite build
5
+
6
+ ┌ Rozenite
7
+ [?25l│
8
+
9
+ ◒ Cleaning output directory◐ Cleaning output directory◇ Output directory cleaned
10
+ [?25h[?25l│
11
+ ◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels◓ Building panels◑ Building panels◒ Building panels◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels.◓ Building panels.◑ Building panels.◒ Building panels.◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels..◓ Building panels..◑ Building panels..◒ Building panels..◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels...◑ Building panels...◒ Building panels...◐ Building panels...◓ Building panels◇ Panels built
12
+ [?25h[?25l│
13
+ ◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point...◐ Building React Native entry point...◓ Building React Native entry point...◑ Building React Native entry point...◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point◐ Building React Native entry point◓ Building React Native entry point◑ Building React Native entry point◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point.◐ Building React Native entry point.◓ Building React Native entry point.◑ Building React Native entry point.◒ Building React Native entry point..◐ Building React Native entry point..◓ Building React Native entry point..◑ Building React Native entry point..◒ Building React Native entry point..◐ Building React Native entry point..◇ React Native entry point built
14
+ [?25h│
15
+ └ Plugin built successfully
16
+
@@ -0,0 +1,4 @@
1
+
2
+ > @rozenite/controls-plugin@0.0.0 lint /Users/szymon.chmal/Projects/rn-devtools/packages/controls-plugin
3
+ > eslint .
4
+
@@ -0,0 +1,4 @@
1
+
2
+ > @rozenite/controls-plugin@0.0.0 typecheck /Users/szymon.chmal/Projects/rn-devtools/packages/controls-plugin
3
+ > tsc -p tsconfig.json --noEmit
4
+
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Szymon Chmal
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ ![rozenite-banner](https://www.rozenite.dev/rozenite-banner.jpg)
2
+
3
+ ### A Rozenite plugin for exposing app-defined controls directly in React Native DevTools.
4
+
5
+ The Controls Plugin lets you create a custom control panel for your app inside Rozenite. You define sections and items on the device, then use DevTools to read runtime values, flip toggles, switch options, submit text input, and trigger actions without building extra debug screens.
6
+
7
+ ![Controls Plugin](https://rozenite.dev/controls-plugin.png)
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @rozenite/controls-plugin
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```ts
18
+ import { createSection, useRozeniteControlsPlugin } from '@rozenite/controls-plugin';
19
+ import { useMemo, useState } from 'react';
20
+
21
+ function App() {
22
+ const [verboseLogging, setVerboseLogging] = useState(false);
23
+ const [environment, setEnvironment] = useState('local');
24
+ const [releaseLabel, setReleaseLabel] = useState('build-001');
25
+
26
+ const sections = useMemo(
27
+ () => [
28
+ createSection({
29
+ id: 'runtime-status',
30
+ title: 'Runtime Status',
31
+ items: [
32
+ {
33
+ id: 'current-environment',
34
+ type: 'text',
35
+ title: 'Environment',
36
+ value: environment,
37
+ },
38
+ {
39
+ id: 'verbose-logging',
40
+ type: 'toggle',
41
+ title: 'Verbose Logging',
42
+ value: verboseLogging,
43
+ onUpdate: setVerboseLogging,
44
+ },
45
+ {
46
+ id: 'environment-selector',
47
+ type: 'select',
48
+ title: 'Environment',
49
+ value: environment,
50
+ options: [
51
+ { label: 'Local', value: 'local' },
52
+ { label: 'Staging', value: 'staging' },
53
+ { label: 'Production', value: 'production' },
54
+ ],
55
+ onUpdate: setEnvironment,
56
+ },
57
+ {
58
+ id: 'release-label',
59
+ type: 'input',
60
+ title: 'Release Label',
61
+ value: releaseLabel,
62
+ placeholder: 'build-001',
63
+ applyLabel: 'Apply',
64
+ onUpdate: setReleaseLabel,
65
+ },
66
+ {
67
+ id: 'reset-session',
68
+ type: 'button',
69
+ title: 'Reset Session',
70
+ actionLabel: 'Reset',
71
+ onPress: () => {
72
+ setVerboseLogging(false);
73
+ setEnvironment('local');
74
+ setReleaseLabel('build-001');
75
+ },
76
+ },
77
+ ],
78
+ }),
79
+ ],
80
+ [environment, releaseLabel, verboseLogging]
81
+ );
82
+
83
+ useRozeniteControlsPlugin({ sections });
84
+
85
+ return <YourApp />;
86
+ }
87
+ ```
88
+
89
+ ## Supported Controls
90
+
91
+ - `text`: Show read-only runtime values such as current environment, build label, or connection status.
92
+ - `toggle`: Enable or disable boolean flags from DevTools.
93
+ - `select`: Switch between predefined options such as backend targets or feature variants.
94
+ - `input`: Edit text values and apply them from DevTools.
95
+ - `button`: Trigger one-off actions such as reset, sync, refetch, or clear cache.
96
+
97
+ ## Organizing the Panel
98
+
99
+ Group related controls into sections so the panel stays readable as your app grows:
100
+
101
+ - Use one section for read-only diagnostics and another for mutable settings.
102
+ - Keep labels short and descriptive so they scan well in DevTools.
103
+ - Add `description` when a control changes app behavior in a non-obvious way.
104
+ - Use stable `id` values so controls remain predictable across reloads.
105
+
106
+ ## Validation and Disabled States
107
+
108
+ Controls can guide users toward safe actions:
109
+
110
+ - Use `validate` to block invalid values and show a clear error message in DevTools.
111
+ - Use `disabled` when a control should be visible but unavailable in the current state.
112
+ - For text input, `applyLabel` can make the action clearer than a generic submit button.
113
+
114
+ ## Notes
115
+
116
+ - The panel appears in React Native DevTools as `Controls`.
117
+ - Updates flow both ways: local state changes are reflected in DevTools, and DevTools actions update the device.
118
+ - The hook is disabled in production builds.
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 0 0% 3.9%;--card: 0 0% 100%;--card-foreground: 0 0% 3.9%;--popover: 0 0% 100%;--popover-foreground: 0 0% 3.9%;--primary: 0 0% 9%;--primary-foreground: 0 0% 98%;--secondary: 0 0% 96.1%;--secondary-foreground: 0 0% 9%;--muted: 0 0% 96.1%;--muted-foreground: 0 0% 45.1%;--accent: 0 0% 96.1%;--accent-foreground: 0 0% 9%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 0 0% 14.9%;--input: 0 0% 14.9%;--ring: 0 0% 83.1%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.relative{position:relative}.mt-1{margin-top:.25rem}.flex{display:flex}.inline-flex{display:inline-flex}.h-6{height:1.5rem}.h-screen{height:100vh}.w-11{width:2.75rem}.min-w-0{min-width:0px}.min-w-\[160px\]{min-width:160px}.min-w-\[240px\]{min-width:240px}.max-w-\[50\%\]{max-width:50%}.flex-1{flex:1 1 0%}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(31 41 55 / var(--tw-divide-opacity, 1))}.overflow-auto{overflow:auto}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-dashed{border-style:dashed}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-violet-500\/60{border-color:#8b5cf699}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-800\/80{background-color:#1f2937cc}.bg-gray-800\/90{background-color:#1f2937e6}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-gray-950\/80{background-color:#030712cc}.bg-violet-500\/10{background-color:#8b5cf61a}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-right{text-align:right}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-violet-100{--tw-text-opacity: 1;color:rgb(237 233 254 / var(--tw-text-opacity, 1))}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/10{--tw-shadow-color: rgb(0 0 0 / .1);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#1f2937;border-radius:4px}::-webkit-scrollbar-thumb{background:#374151;border-radius:4px;border:1px solid #1f2937}::-webkit-scrollbar-thumb:hover{background:#4b5563}::-webkit-scrollbar-thumb:active{background:#6b7280}::-webkit-scrollbar-corner{background:#1f2937}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.hover\:bg-violet-500\/20:hover{background-color:#8b5cf633}.focus\:border-violet-500:focus{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-gray-700:disabled{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.disabled\:bg-gray-800:disabled{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.disabled\:text-gray-500:disabled{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.peer:checked~.peer-checked\:bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:after\:translate-x-5:after{content:var(--tw-content);--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}