simonduerr commited on
Commit
b61753c
1 Parent(s): 39f4bdf

Upload folder using huggingface_hub

Browse files
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ FROM python:3.9
3
+
4
+ WORKDIR /code
5
+
6
+ COPY --link --chown=1000 . .
7
+
8
+ RUN mkdir -p /tmp/cache/
9
+ RUN chmod a+rwx -R /tmp/cache/
10
+ ENV TRANSFORMERS_CACHE=/tmp/cache/
11
+
12
+ RUN pip install --no-cache-dir -r requirements.txt
13
+
14
+ ENV PYTHONUNBUFFERED=1 GRADIO_ALLOW_FLAGGING=never GRADIO_NUM_PORTS=1 GRADIO_SERVER_NAME=0.0.0.0 GRADIO_SERVER_PORT=7860 SYSTEM=spaces
15
+
16
+ CMD ["python", "space.py"]
README.md CHANGED
@@ -1,10 +1,17 @@
 
1
  ---
2
- title: Gradio Cofoldinginput
3
- emoji:
4
  colorFrom: yellow
5
- colorTo: purple
6
  sdk: docker
7
  pinned: false
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
1
+
2
  ---
3
+ tags: [gradio-custom-component,gradio-template-Textbox]
4
+ title: gradio_cofoldinginput V0.0.2
5
  colorFrom: yellow
6
+ colorTo: pink
7
  sdk: docker
8
  pinned: false
9
+ license: apache-2.0
10
  ---
11
 
12
+
13
+ # Name: gradio_cofoldinginput
14
+
15
+ Description: Component to enter protein and DNA sequences + small molecules for cofolding
16
+
17
+ Install with: pip install gradio_cofoldinginput
__init__.py ADDED
File without changes
__pycache__/__init__.cpython-310.pyc ADDED
Binary file (150 Bytes). View file
 
__pycache__/app.cpython-310.pyc ADDED
Binary file (617 Bytes). View file
 
app.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import gradio as gr
3
+ from gradio_cofoldinginput import CofoldingInput
4
+
5
+ import json
6
+
7
+
8
+ def predict(input):
9
+ input = json.dumps(input)
10
+ return input
11
+
12
+ with gr.Blocks() as demo:
13
+ inp=CofoldingInput(label="Input")
14
+
15
+ # preinput = {"chains": [
16
+ # {
17
+ # "class": "DNA",
18
+ # "sequence": "ATGCGT",
19
+ # "chain": "A"
20
+ # }
21
+ # ], "covMods":[]
22
+ # }
23
+ # inp2=CofoldingInput(preinput, label="Input prefilled")
24
+ btn = gr.Button("Submit")
25
+ out = gr.HTML()
26
+
27
+ btn.click(predict, inputs=[inp], outputs=[out])
28
+
29
+ if __name__ == "__main__":
30
+ demo.launch()
css.css ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ html {
2
+ font-family: Inter;
3
+ font-size: 16px;
4
+ font-weight: 400;
5
+ line-height: 1.5;
6
+ -webkit-text-size-adjust: 100%;
7
+ background: #fff;
8
+ color: #323232;
9
+ -webkit-font-smoothing: antialiased;
10
+ -moz-osx-font-smoothing: grayscale;
11
+ text-rendering: optimizeLegibility;
12
+ }
13
+
14
+ :root {
15
+ --space: 1;
16
+ --vspace: calc(var(--space) * 1rem);
17
+ --vspace-0: calc(3 * var(--space) * 1rem);
18
+ --vspace-1: calc(2 * var(--space) * 1rem);
19
+ --vspace-2: calc(1.5 * var(--space) * 1rem);
20
+ --vspace-3: calc(0.5 * var(--space) * 1rem);
21
+ }
22
+
23
+ .app {
24
+ max-width: 748px !important;
25
+ }
26
+
27
+ .prose p {
28
+ margin: var(--vspace) 0;
29
+ line-height: var(--vspace * 2);
30
+ font-size: 1rem;
31
+ }
32
+
33
+ code {
34
+ font-family: "Inconsolata", sans-serif;
35
+ font-size: 16px;
36
+ }
37
+
38
+ h1,
39
+ h1 code {
40
+ font-weight: 400;
41
+ line-height: calc(2.5 / var(--space) * var(--vspace));
42
+ }
43
+
44
+ h1 code {
45
+ background: none;
46
+ border: none;
47
+ letter-spacing: 0.05em;
48
+ padding-bottom: 5px;
49
+ position: relative;
50
+ padding: 0;
51
+ }
52
+
53
+ h2 {
54
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
55
+ line-height: 1em;
56
+ }
57
+
58
+ h3,
59
+ h3 code {
60
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
61
+ line-height: 1em;
62
+ }
63
+
64
+ h4,
65
+ h5,
66
+ h6 {
67
+ margin: var(--vspace-3) 0 var(--vspace-3) 0;
68
+ line-height: var(--vspace);
69
+ }
70
+
71
+ .bigtitle,
72
+ h1,
73
+ h1 code {
74
+ font-size: calc(8px * 4.5);
75
+ word-break: break-word;
76
+ }
77
+
78
+ .title,
79
+ h2,
80
+ h2 code {
81
+ font-size: calc(8px * 3.375);
82
+ font-weight: lighter;
83
+ word-break: break-word;
84
+ border: none;
85
+ background: none;
86
+ }
87
+
88
+ .subheading1,
89
+ h3,
90
+ h3 code {
91
+ font-size: calc(8px * 1.8);
92
+ font-weight: 600;
93
+ border: none;
94
+ background: none;
95
+ letter-spacing: 0.1em;
96
+ text-transform: uppercase;
97
+ }
98
+
99
+ h2 code {
100
+ padding: 0;
101
+ position: relative;
102
+ letter-spacing: 0.05em;
103
+ }
104
+
105
+ blockquote {
106
+ font-size: calc(8px * 1.1667);
107
+ font-style: italic;
108
+ line-height: calc(1.1667 * var(--vspace));
109
+ margin: var(--vspace-2) var(--vspace-2);
110
+ }
111
+
112
+ .subheading2,
113
+ h4 {
114
+ font-size: calc(8px * 1.4292);
115
+ text-transform: uppercase;
116
+ font-weight: 600;
117
+ }
118
+
119
+ .subheading3,
120
+ h5 {
121
+ font-size: calc(8px * 1.2917);
122
+ line-height: calc(1.2917 * var(--vspace));
123
+
124
+ font-weight: lighter;
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.15em;
127
+ }
128
+
129
+ h6 {
130
+ font-size: calc(8px * 1.1667);
131
+ font-size: 1.1667em;
132
+ font-weight: normal;
133
+ font-style: italic;
134
+ font-family: "le-monde-livre-classic-byol", serif !important;
135
+ letter-spacing: 0px !important;
136
+ }
137
+
138
+ #start .md > *:first-child {
139
+ margin-top: 0;
140
+ }
141
+
142
+ h2 + h3 {
143
+ margin-top: 0;
144
+ }
145
+
146
+ .md hr {
147
+ border: none;
148
+ border-top: 1px solid var(--block-border-color);
149
+ margin: var(--vspace-2) 0 var(--vspace-2) 0;
150
+ }
151
+ .prose ul {
152
+ margin: var(--vspace-2) 0 var(--vspace-1) 0;
153
+ }
154
+
155
+ .gap {
156
+ gap: 0;
157
+ }
heme.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"m":[{"a":[{"x":-2.161,"y":-0.125,"z":0.49},{"x":1.458,"y":-3.419,"z":0.306},{"x":4.701,"y":0.169,"z":-0.069},{"x":1.075,"y":3.46,"z":0.018},{"x":-1.436,"y":-1.305,"z":0.38},{"x":-2.015,"y":-2.587,"z":0.32},{"x":-1.009,"y":-3.5,"z":0.27},{"x":0.216,"y":-2.803,"z":0.298},{"x":-1.175,"y":-4.996,"z":0.197},{"x":-3.49,"y":-2.893,"z":0.314},{"x":-3.998,"y":-2.926,"z":-1.129},{"x":-5.473,"y":-3.232,"z":-1.136},{"x":-6.059,"y":-3.405,"z":-0.094,"l":"O"},{"x":-6.137,"y":-3.311,"z":-2.3,"l":"O"},{"x":2.664,"y":-2.707,"z":0.308},{"x":3.937,"y":-3.328,"z":0.418},{"x":4.874,"y":-2.341,"z":0.314},{"x":4.117,"y":-1.079,"z":0.139},{"x":4.203,"y":-4.798,"z":0.613},{"x":6.339,"y":-2.497,"z":0.365},{"x":6.935,"y":-3.419,"z":-0.385},{"x":3.964,"y":1.345,"z":-0.174},{"x":4.531,"y":2.601,"z":-0.445},{"x":3.51,"y":3.536,"z":-0.437},{"x":2.304,"y":2.846,"z":-0.139},{"x":5.991,"y":2.88,"z":-0.697},{"x":3.649,"y":4.981,"z":-0.692},{"x":4.201,"y":5.407,"z":-1.823},{"x":-0.102,"y":2.753,"z":0.298},{"x":-1.382,"y":3.388,"z":0.641},{"x":-2.283,"y":2.389,"z":0.774},{"x":-1.561,"y":1.137,"z":0.511},{"x":-1.639,"y":4.863,"z":0.811},{"x":-3.741,"y":2.532,"z":1.123},{"x":-4.573,"y":2.563,"z":-0.16},{"x":-6.032,"y":2.706,"z":0.189},{"x":-6.372,"y":2.776,"z":1.347,"l":"O"},{"x":-6.954,"y":2.755,"z":-0.785,"l":"O"},{"x":-0.068,"y":-1.456,"z":0.321,"l":"N"},{"x":2.82,"y":-1.386,"z":0.207,"l":"N"},{"x":2.604,"y":1.506,"z":-0.033,"l":"N"},{"x":-0.276,"y":1.431,"z":0.298,"l":"N"},{"x":1.01,"y":0.157,"z":-0.06,"l":"Fe"},{"x":1.498,"y":-4.508,"z":0.309,"l":"H"},{"x":5.786,"y":0.229,"z":-0.153,"l":"H"},{"x":1.018,"y":4.543,"z":-0.083,"l":"H"},{"x":-1.22,"y":-5.306,"z":-0.847,"l":"H"},{"x":-0.328,"y":-5.48,"z":0.683,"l":"H"},{"x":-2.097,"y":-5.285,"z":0.702,"l":"H"},{"x":-3.662,"y":-3.862,"z":0.782,"l":"H"},{"x":-4.024,"y":-2.121,"z":0.869,"l":"H"},{"x":-3.825,"y":-1.956,"z":-1.597,"l":"H"},{"x":-3.464,"y":-3.697,"z":-1.684,"l":"H"},{"x":3.256,"y":-5.336,"z":0.66,"l":"H"},{"x":4.794,"y":-5.175,"z":-0.222,"l":"H"},{"x":4.752,"y":-4.948,"z":1.543,"l":"H"},{"x":6.927,"y":-1.863,"z":1.011,"l":"H"},{"x":7.994,"y":-3.6,"z":-0.277,"l":"H"},{"x":6.36,"y":-3.987,"z":-1.102,"l":"H"},{"x":6.554,"y":1.949,"z":-0.639,"l":"H"},{"x":6.11,"y":3.316,"z":-1.689,"l":"H"},{"x":6.362,"y":3.578,"z":0.053,"l":"H"},{"x":3.303,"y":5.694,"z":0.042,"l":"H"},{"x":4.614,"y":4.696,"z":-2.523,"l":"H"},{"x":4.235,"y":6.464,"z":-2.043,"l":"H"},{"x":-0.715,"y":5.415,"z":0.639,"l":"H"},{"x":-2.394,"y":5.185,"z":0.094,"l":"H"},{"x":-1.994,"y":5.055,"z":1.824,"l":"H"},{"x":-4.052,"y":1.687,"z":1.738,"l":"H"},{"x":-3.893,"y":3.459,"z":1.677,"l":"H"},{"x":-4.262,"y":3.408,"z":-0.775,"l":"H"},{"x":-4.421,"y":1.636,"z":-0.714,"l":"H"},{"x":-7.082,"y":-3.51,"z":-2.254,"l":"H"},{"x":-7.877,"y":2.847,"z":-0.512,"l":"H"},{"x":-3.246,"y":-0.188,"z":0.567,"l":"H"}],"b":[{"b":0,"e":4},{"b":0,"e":31,"o":2},{"b":0,"e":74},{"b":1,"e":7},{"b":1,"e":14,"o":2},{"b":1,"e":43},{"b":2,"e":17},{"b":2,"e":21,"o":2},{"b":2,"e":44},{"b":3,"e":24,"o":2},{"b":3,"e":28},{"b":3,"e":45},{"b":4,"e":5,"o":2},{"b":4,"e":38},{"b":5,"e":6},{"b":5,"e":9},{"b":6,"e":7,"o":2},{"b":6,"e":8},{"b":7,"e":38},{"b":8,"e":46},{"b":8,"e":47},{"b":8,"e":48},{"b":9,"e":10},{"b":9,"e":49},{"b":9,"e":50},{"b":10,"e":11},{"b":10,"e":51},{"b":10,"e":52},{"b":11,"e":12,"o":2},{"b":11,"e":13},{"b":13,"e":72},{"b":14,"e":15},{"b":14,"e":39},{"b":15,"e":16,"o":2},{"b":15,"e":18},{"b":16,"e":17},{"b":16,"e":19},{"b":17,"e":39,"o":2},{"b":18,"e":53},{"b":18,"e":54},{"b":18,"e":55},{"b":19,"e":20,"o":2},{"b":19,"e":56},{"b":20,"e":57},{"b":20,"e":58},{"b":21,"e":22},{"b":21,"e":40},{"b":22,"e":23,"o":2},{"b":22,"e":25},{"b":23,"e":24},{"b":23,"e":26},{"b":24,"e":40},{"b":25,"e":59},{"b":25,"e":60},{"b":25,"e":61},{"b":26,"e":27,"o":2},{"b":26,"e":62},{"b":27,"e":63},{"b":27,"e":64},{"b":28,"e":29},{"b":28,"e":41,"o":2},{"b":29,"e":30,"o":2},{"b":29,"e":32},{"b":30,"e":31},{"b":30,"e":33},{"b":31,"e":41},{"b":32,"e":65},{"b":32,"e":66},{"b":32,"e":67},{"b":33,"e":34},{"b":33,"e":68},{"b":33,"e":69},{"b":34,"e":35},{"b":34,"e":70},{"b":34,"e":71},{"b":35,"e":36,"o":2},{"b":35,"e":37},{"b":37,"e":73},{"b":38,"e":42},{"b":39,"e":42},{"b":40,"e":42},{"b":41,"e":42}]}]}
heme.sdf ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ OpenBabel03282415433D
3
+
4
+ 75 82 0 0 0 0 0 0 0 0999 V2000
5
+ -2.1610 -0.1250 0.4900 C 0 0 0 0 0 0 0 0 0 0 0 0
6
+ 1.4580 -3.4190 0.3060 C 0 0 0 0 0 0 0 0 0 0 0 0
7
+ 4.7010 0.1690 -0.0690 C 0 0 0 0 0 0 0 0 0 0 0 0
8
+ 1.0750 3.4600 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0
9
+ -1.4360 -1.3050 0.3800 C 0 0 0 0 0 0 0 0 0 0 0 0
10
+ -2.0150 -2.5870 0.3200 C 0 0 0 0 0 0 0 0 0 0 0 0
11
+ -1.0090 -3.5000 0.2700 C 0 0 0 0 0 0 0 0 0 0 0 0
12
+ 0.2160 -2.8030 0.2980 C 0 0 0 0 0 0 0 0 0 0 0 0
13
+ -1.1750 -4.9960 0.1970 C 0 0 0 0 0 0 0 0 0 0 0 0
14
+ -3.4900 -2.8930 0.3140 C 0 0 0 0 0 0 0 0 0 0 0 0
15
+ -3.9980 -2.9260 -1.1290 C 0 0 0 0 0 0 0 0 0 0 0 0
16
+ -5.4730 -3.2320 -1.1360 C 0 0 0 0 0 0 0 0 0 0 0 0
17
+ -6.0590 -3.4050 -0.0940 O 0 0 0 0 0 0 0 0 0 0 0 0
18
+ -6.1370 -3.3110 -2.3000 O 0 0 0 0 0 0 0 0 0 0 0 0
19
+ 2.6640 -2.7070 0.3080 C 0 0 0 0 0 0 0 0 0 0 0 0
20
+ 3.9370 -3.3280 0.4180 C 0 0 0 0 0 0 0 0 0 0 0 0
21
+ 4.8740 -2.3410 0.3140 C 0 0 0 0 0 0 0 0 0 0 0 0
22
+ 4.1170 -1.0790 0.1390 C 0 0 0 0 0 0 0 0 0 0 0 0
23
+ 4.2030 -4.7980 0.6130 C 0 0 0 0 0 0 0 0 0 0 0 0
24
+ 6.3390 -2.4970 0.3650 C 0 0 0 0 0 0 0 0 0 0 0 0
25
+ 6.9350 -3.4190 -0.3850 C 0 0 0 0 0 0 0 0 0 0 0 0
26
+ 3.9640 1.3450 -0.1740 C 0 0 0 0 0 0 0 0 0 0 0 0
27
+ 4.5310 2.6010 -0.4450 C 0 0 0 0 0 0 0 0 0 0 0 0
28
+ 3.5100 3.5360 -0.4370 C 0 0 0 0 0 0 0 0 0 0 0 0
29
+ 2.3040 2.8460 -0.1390 C 0 0 0 0 0 0 0 0 0 0 0 0
30
+ 5.9910 2.8800 -0.6970 C 0 0 0 0 0 0 0 0 0 0 0 0
31
+ 3.6490 4.9810 -0.6920 C 0 0 0 0 0 0 0 0 0 0 0 0
32
+ 4.2010 5.4070 -1.8230 C 0 0 0 0 0 0 0 0 0 0 0 0
33
+ -0.1020 2.7530 0.2980 C 0 0 0 0 0 0 0 0 0 0 0 0
34
+ -1.3820 3.3880 0.6410 C 0 0 0 0 0 0 0 0 0 0 0 0
35
+ -2.2830 2.3890 0.7740 C 0 0 0 0 0 0 0 0 0 0 0 0
36
+ -1.5610 1.1370 0.5110 C 0 0 0 0 0 0 0 0 0 0 0 0
37
+ -1.6390 4.8630 0.8110 C 0 0 0 0 0 0 0 0 0 0 0 0
38
+ -3.7410 2.5320 1.1230 C 0 0 0 0 0 0 0 0 0 0 0 0
39
+ -4.5730 2.5630 -0.1600 C 0 0 0 0 0 0 0 0 0 0 0 0
40
+ -6.0320 2.7060 0.1890 C 0 0 0 0 0 0 0 0 0 0 0 0
41
+ -6.3720 2.7760 1.3470 O 0 0 0 0 0 0 0 0 0 0 0 0
42
+ -6.9540 2.7550 -0.7850 O 0 0 0 0 0 0 0 0 0 0 0 0
43
+ -0.0680 -1.4560 0.3210 N 0 0 0 0 0 0 0 0 0 0 0 0
44
+ 2.8200 -1.3860 0.2070 N 0 0 0 0 0 4 0 0 0 0 0 0
45
+ 2.6040 1.5060 -0.0330 N 0 0 0 0 0 0 0 0 0 0 0 0
46
+ -0.2760 1.4310 0.2980 N 0 0 0 0 0 4 0 0 0 0 0 0
47
+ 1.0100 0.1570 -0.0600 Fe 0 0 1 0 0 0 0 0 0 0 0 0
48
+ 1.4980 -4.5080 0.3090 H 0 0 0 0 0 0 0 0 0 0 0 0
49
+ 5.7860 0.2290 -0.1530 H 0 0 0 0 0 0 0 0 0 0 0 0
50
+ 1.0180 4.5430 -0.0830 H 0 0 0 0 0 0 0 0 0 0 0 0
51
+ -1.2200 -5.3060 -0.8470 H 0 0 0 0 0 0 0 0 0 0 0 0
52
+ -0.3280 -5.4800 0.6830 H 0 0 0 0 0 0 0 0 0 0 0 0
53
+ -2.0970 -5.2850 0.7020 H 0 0 0 0 0 0 0 0 0 0 0 0
54
+ -3.6620 -3.8620 0.7820 H 0 0 0 0 0 0 0 0 0 0 0 0
55
+ -4.0240 -2.1210 0.8690 H 0 0 0 0 0 0 0 0 0 0 0 0
56
+ -3.8250 -1.9560 -1.5970 H 0 0 0 0 0 0 0 0 0 0 0 0
57
+ -3.4640 -3.6970 -1.6840 H 0 0 0 0 0 0 0 0 0 0 0 0
58
+ 3.2560 -5.3360 0.6600 H 0 0 0 0 0 0 0 0 0 0 0 0
59
+ 4.7940 -5.1750 -0.2220 H 0 0 0 0 0 0 0 0 0 0 0 0
60
+ 4.7520 -4.9480 1.5430 H 0 0 0 0 0 0 0 0 0 0 0 0
61
+ 6.9270 -1.8630 1.0110 H 0 0 0 0 0 0 0 0 0 0 0 0
62
+ 7.9940 -3.6000 -0.2770 H 0 0 0 0 0 0 0 0 0 0 0 0
63
+ 6.3600 -3.9870 -1.1020 H 0 0 0 0 0 0 0 0 0 0 0 0
64
+ 6.5540 1.9490 -0.6390 H 0 0 0 0 0 0 0 0 0 0 0 0
65
+ 6.1100 3.3160 -1.6890 H 0 0 0 0 0 0 0 0 0 0 0 0
66
+ 6.3620 3.5780 0.0530 H 0 0 0 0 0 0 0 0 0 0 0 0
67
+ 3.3030 5.6940 0.0420 H 0 0 0 0 0 0 0 0 0 0 0 0
68
+ 4.6140 4.6960 -2.5230 H 0 0 0 0 0 0 0 0 0 0 0 0
69
+ 4.2350 6.4640 -2.0430 H 0 0 0 0 0 0 0 0 0 0 0 0
70
+ -0.7150 5.4150 0.6390 H 0 0 0 0 0 0 0 0 0 0 0 0
71
+ -2.3940 5.1850 0.0940 H 0 0 0 0 0 0 0 0 0 0 0 0
72
+ -1.9940 5.0550 1.8240 H 0 0 0 0 0 0 0 0 0 0 0 0
73
+ -4.0520 1.6870 1.7380 H 0 0 0 0 0 0 0 0 0 0 0 0
74
+ -3.8930 3.4590 1.6770 H 0 0 0 0 0 0 0 0 0 0 0 0
75
+ -4.2620 3.4080 -0.7750 H 0 0 0 0 0 0 0 0 0 0 0 0
76
+ -4.4210 1.6360 -0.7140 H 0 0 0 0 0 0 0 0 0 0 0 0
77
+ -7.0820 -3.5100 -2.2540 H 0 0 0 0 0 0 0 0 0 0 0 0
78
+ -7.8770 2.8470 -0.5120 H 0 0 0 0 0 0 0 0 0 0 0 0
79
+ -3.2460 -0.1880 0.5670 H 0 0 0 0 0 0 0 0 0 0 0 0
80
+ 1 5 1 0 0 0 0
81
+ 1 32 2 0 0 0 0
82
+ 1 75 1 0 0 0 0
83
+ 2 8 1 0 0 0 0
84
+ 2 15 2 0 0 0 0
85
+ 2 44 1 0 0 0 0
86
+ 3 18 1 0 0 0 0
87
+ 3 22 2 0 0 0 0
88
+ 3 45 1 0 0 0 0
89
+ 4 25 2 0 0 0 0
90
+ 4 29 1 0 0 0 0
91
+ 4 46 1 0 0 0 0
92
+ 5 6 2 0 0 0 0
93
+ 5 39 1 0 0 0 0
94
+ 6 7 1 0 0 0 0
95
+ 6 10 1 0 0 0 0
96
+ 7 8 2 0 0 0 0
97
+ 7 9 1 0 0 0 0
98
+ 8 39 1 0 0 0 0
99
+ 9 47 1 0 0 0 0
100
+ 9 48 1 0 0 0 0
101
+ 9 49 1 0 0 0 0
102
+ 10 11 1 0 0 0 0
103
+ 10 50 1 0 0 0 0
104
+ 10 51 1 0 0 0 0
105
+ 11 12 1 0 0 0 0
106
+ 11 52 1 0 0 0 0
107
+ 11 53 1 0 0 0 0
108
+ 12 13 2 0 0 0 0
109
+ 12 14 1 0 0 0 0
110
+ 14 73 1 0 0 0 0
111
+ 15 16 1 0 0 0 0
112
+ 15 40 1 0 0 0 0
113
+ 16 17 2 0 0 0 0
114
+ 16 19 1 0 0 0 0
115
+ 17 18 1 0 0 0 0
116
+ 17 20 1 0 0 0 0
117
+ 18 40 2 0 0 0 0
118
+ 19 54 1 0 0 0 0
119
+ 19 55 1 0 0 0 0
120
+ 19 56 1 0 0 0 0
121
+ 20 21 2 0 0 0 0
122
+ 20 57 1 0 0 0 0
123
+ 21 58 1 0 0 0 0
124
+ 21 59 1 0 0 0 0
125
+ 22 23 1 0 0 0 0
126
+ 22 41 1 0 0 0 0
127
+ 23 24 2 0 0 0 0
128
+ 23 26 1 0 0 0 0
129
+ 24 25 1 0 0 0 0
130
+ 24 27 1 0 0 0 0
131
+ 25 41 1 0 0 0 0
132
+ 26 60 1 0 0 0 0
133
+ 26 61 1 0 0 0 0
134
+ 26 62 1 0 0 0 0
135
+ 27 28 2 0 0 0 0
136
+ 27 63 1 0 0 0 0
137
+ 28 64 1 0 0 0 0
138
+ 28 65 1 0 0 0 0
139
+ 29 30 1 0 0 0 0
140
+ 29 42 2 0 0 0 0
141
+ 30 31 2 0 0 0 0
142
+ 30 33 1 0 0 0 0
143
+ 31 32 1 0 0 0 0
144
+ 31 34 1 0 0 0 0
145
+ 32 42 1 0 0 0 0
146
+ 33 66 1 0 0 0 0
147
+ 33 67 1 0 0 0 0
148
+ 33 68 1 0 0 0 0
149
+ 34 35 1 0 0 0 0
150
+ 34 69 1 0 0 0 0
151
+ 34 70 1 0 0 0 0
152
+ 35 36 1 0 0 0 0
153
+ 35 71 1 0 0 0 0
154
+ 35 72 1 0 0 0 0
155
+ 36 37 2 0 0 0 0
156
+ 36 38 1 0 0 0 0
157
+ 38 74 1 0 0 0 0
158
+ 40 43 1 0 0 0 0
159
+ 41 43 1 0 0 0 0
160
+ 42 43 1 0 0 0 0
161
+ 43 39 1 6 0 0 0
162
+ M END
163
+ $$$$
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ gradio_cofoldinginput-0.0.2-py3-none-any.whl
space.py ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import gradio as gr
3
+ from app import demo as app
4
+ import os
5
+
6
+ _docs = {'CofoldingInput': {'description': 'Creates a textarea for user to enter string input or display string output.\n', 'members': {'__init__': {'value': {'type': 'dict | None', 'default': '{"chains": [], "covMods": []}', 'description': 'list of items.'}, 'label': {'type': 'str | None', 'default': 'None', 'description': 'The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.'}, 'info': {'type': 'str | None', 'default': 'None', 'description': 'additional component description.'}, 'every': {'type': 'float | None', 'default': 'None', 'description': "If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute."}, 'show_label': {'type': 'bool | None', 'default': 'None', 'description': 'if True, will display label.'}, 'container': {'type': 'bool', 'default': 'True', 'description': 'If True, will place the component in a container - providing some extra padding around the border.'}, 'scale': {'type': 'int | None', 'default': 'None', 'description': 'relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.'}, 'min_width': {'type': 'int', 'default': '160', 'description': 'minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.'}, 'interactive': {'type': 'bool | None', 'default': 'None', 'description': 'if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output.'}, 'visible': {'type': 'bool', 'default': 'True', 'description': 'If False, component will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'autofocus': {'type': 'bool', 'default': 'False', 'description': 'If True, will focus on the textbox when the page loads. Use this carefully, as it can cause usability issues for sighted and non-sighted users.'}, 'autoscroll': {'type': 'bool', 'default': 'True', 'description': None}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {'value': {'type': 'dict | None', 'description': 'Expects a {str} returned from function and sets textarea value to it.'}}, 'preprocess': {}}, 'events': {'change': {'type': None, 'default': None, 'description': 'Triggered when the value of the CofoldingInput changes either because of user input (e.g. a user types in a textbox) OR because of a function update (e.g. an image receives a value from the output of an event trigger). See `.input()` for a listener that is only triggered by user input.'}, 'input': {'type': None, 'default': None, 'description': 'This listener is triggered when the user changes the value of the CofoldingInput.'}, 'select': {'type': None, 'default': None, 'description': 'Event listener for when the user selects or deselects the CofoldingInput. Uses event data gradio.SelectData to carry `value` referring to the label of the CofoldingInput, and `selected` to refer to state of the CofoldingInput. See EventData documentation on how to use this event data'}, 'submit': {'type': None, 'default': None, 'description': 'This listener is triggered when the user presses the Enter key while the CofoldingInput is focused.'}, 'focus': {'type': None, 'default': None, 'description': 'This listener is triggered when the CofoldingInput is focused.'}, 'blur': {'type': None, 'default': None, 'description': 'This listener is triggered when the CofoldingInput is unfocused/blurred.'}}}, '__meta__': {'additional_interfaces': {}, 'user_fn_refs': {'CofoldingInput': []}}}
7
+
8
+ abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
+
10
+ with gr.Blocks(
11
+ css=abs_path,
12
+ theme=gr.themes.Default(
13
+ font_mono=[
14
+ gr.themes.GoogleFont("Inconsolata"),
15
+ "monospace",
16
+ ],
17
+ ),
18
+ ) as demo:
19
+ gr.Markdown(
20
+ """
21
+ # `gradio_cofoldinginput`
22
+
23
+ <div style="display: flex; gap: 7px;">
24
+ <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.2%20-%20orange">
25
+ </div>
26
+
27
+ Component to enter protein and DNA sequences + small molecules for cofolding
28
+ """, elem_classes=["md-custom"], header_links=True)
29
+ app.render()
30
+ gr.Markdown(
31
+ """
32
+ ## Installation
33
+
34
+ ```bash
35
+ pip install gradio_cofoldinginput
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ ```python
41
+
42
+ import gradio as gr
43
+ from gradio_cofoldinginput import CofoldingInput
44
+
45
+ import json
46
+
47
+
48
+ def predict(input):
49
+ input = json.dumps(input)
50
+ return input
51
+
52
+ with gr.Blocks() as demo:
53
+ inp=CofoldingInput(label="Input")
54
+
55
+ # preinput = {"chains": [
56
+ # {
57
+ # "class": "DNA",
58
+ # "sequence": "ATGCGT",
59
+ # "chain": "A"
60
+ # }
61
+ # ], "covMods":[]
62
+ # }
63
+ # inp2=CofoldingInput(preinput, label="Input prefilled")
64
+ btn = gr.Button("Submit")
65
+ out = gr.HTML()
66
+
67
+ btn.click(predict, inputs=[inp], outputs=[out])
68
+
69
+ if __name__ == "__main__":
70
+ demo.launch()
71
+
72
+ ```
73
+ """, elem_classes=["md-custom"], header_links=True)
74
+
75
+
76
+ gr.Markdown("""
77
+ ## `CofoldingInput`
78
+
79
+ ### Initialization
80
+ """, elem_classes=["md-custom"], header_links=True)
81
+
82
+ gr.ParamViewer(value=_docs["CofoldingInput"]["members"]["__init__"], linkify=[])
83
+
84
+
85
+ gr.Markdown("### Events")
86
+ gr.ParamViewer(value=_docs["CofoldingInput"]["events"], linkify=['Event'])
87
+
88
+
89
+
90
+
91
+ gr.Markdown("""
92
+
93
+ ### User function
94
+
95
+ The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both).
96
+
97
+ - When used as an Input, the component only impacts the input signature of the user function.
98
+ - When used as an output, the component only impacts the return signature of the user function.
99
+
100
+ The code snippet below is accurate in cases where the component is used as both an input and an output.
101
+
102
+ - **As output:** Should return, expects a {str} returned from function and sets textarea value to it.
103
+
104
+ ```python
105
+ def predict(
106
+ value: Unknown
107
+ ) -> dict | None:
108
+ return value
109
+ ```
110
+ """, elem_classes=["md-custom", "CofoldingInput-user-fn"], header_links=True)
111
+
112
+
113
+
114
+
115
+ demo.load(None, js=r"""function() {
116
+ const refs = {};
117
+ const user_fn_refs = {
118
+ CofoldingInput: [], };
119
+ requestAnimationFrame(() => {
120
+
121
+ Object.entries(user_fn_refs).forEach(([key, refs]) => {
122
+ if (refs.length > 0) {
123
+ const el = document.querySelector(`.${key}-user-fn`);
124
+ if (!el) return;
125
+ refs.forEach(ref => {
126
+ el.innerHTML = el.innerHTML.replace(
127
+ new RegExp("\\b"+ref+"\\b", "g"),
128
+ `<a href="#h-${ref.toLowerCase()}">${ref}</a>`
129
+ );
130
+ })
131
+ }
132
+ })
133
+
134
+ Object.entries(refs).forEach(([key, refs]) => {
135
+ if (refs.length > 0) {
136
+ const el = document.querySelector(`.${key}`);
137
+ if (!el) return;
138
+ refs.forEach(ref => {
139
+ el.innerHTML = el.innerHTML.replace(
140
+ new RegExp("\\b"+ref+"\\b", "g"),
141
+ `<a href="#h-${ref.toLowerCase()}">${ref}</a>`
142
+ );
143
+ })
144
+ }
145
+ })
146
+ })
147
+ }
148
+
149
+ """)
150
+
151
+ demo.launch()
src/.gitignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ .eggs/
2
+ dist/
3
+ *.pyc
4
+ __pycache__/
5
+ *.py[cod]
6
+ *$py.class
7
+ __tmp/*
8
+ *.pyi
9
+ node_modules
src/README.md ADDED
@@ -0,0 +1,290 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # `gradio_cofoldinginput`
3
+ <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.2%20-%20orange">
4
+
5
+ Component to enter protein and DNA sequences + small molecules for cofolding
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pip install gradio_cofoldinginput
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```python
16
+
17
+ import gradio as gr
18
+ from gradio_cofoldinginput import CofoldingInput
19
+
20
+ import json
21
+
22
+
23
+ def predict(input):
24
+ input = json.dumps(input)
25
+ return input
26
+
27
+ with gr.Blocks() as demo:
28
+ inp=CofoldingInput(label="Input")
29
+
30
+ # preinput = {"chains": [
31
+ # {
32
+ # "class": "DNA",
33
+ # "sequence": "ATGCGT",
34
+ # "chain": "A"
35
+ # }
36
+ # ], "covMods":[]
37
+ # }
38
+ # inp2=CofoldingInput(preinput, label="Input prefilled")
39
+ btn = gr.Button("Submit")
40
+ out = gr.HTML()
41
+
42
+ btn.click(predict, inputs=[inp], outputs=[out])
43
+
44
+ if __name__ == "__main__":
45
+ demo.launch()
46
+
47
+ ```
48
+
49
+ ## `CofoldingInput`
50
+
51
+ ### Initialization
52
+
53
+ <table>
54
+ <thead>
55
+ <tr>
56
+ <th align="left">name</th>
57
+ <th align="left" style="width: 25%;">type</th>
58
+ <th align="left">default</th>
59
+ <th align="left">description</th>
60
+ </tr>
61
+ </thead>
62
+ <tbody>
63
+ <tr>
64
+ <td align="left"><code>value</code></td>
65
+ <td align="left" style="width: 25%;">
66
+
67
+ ```python
68
+ dict | None
69
+ ```
70
+
71
+ </td>
72
+ <td align="left"><code>{"chains": [], "covMods": []}</code></td>
73
+ <td align="left">list of items.</td>
74
+ </tr>
75
+
76
+ <tr>
77
+ <td align="left"><code>label</code></td>
78
+ <td align="left" style="width: 25%;">
79
+
80
+ ```python
81
+ str | None
82
+ ```
83
+
84
+ </td>
85
+ <td align="left"><code>None</code></td>
86
+ <td align="left">The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.</td>
87
+ </tr>
88
+
89
+ <tr>
90
+ <td align="left"><code>info</code></td>
91
+ <td align="left" style="width: 25%;">
92
+
93
+ ```python
94
+ str | None
95
+ ```
96
+
97
+ </td>
98
+ <td align="left"><code>None</code></td>
99
+ <td align="left">additional component description.</td>
100
+ </tr>
101
+
102
+ <tr>
103
+ <td align="left"><code>every</code></td>
104
+ <td align="left" style="width: 25%;">
105
+
106
+ ```python
107
+ float | None
108
+ ```
109
+
110
+ </td>
111
+ <td align="left"><code>None</code></td>
112
+ <td align="left">If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.</td>
113
+ </tr>
114
+
115
+ <tr>
116
+ <td align="left"><code>show_label</code></td>
117
+ <td align="left" style="width: 25%;">
118
+
119
+ ```python
120
+ bool | None
121
+ ```
122
+
123
+ </td>
124
+ <td align="left"><code>None</code></td>
125
+ <td align="left">if True, will display label.</td>
126
+ </tr>
127
+
128
+ <tr>
129
+ <td align="left"><code>container</code></td>
130
+ <td align="left" style="width: 25%;">
131
+
132
+ ```python
133
+ bool
134
+ ```
135
+
136
+ </td>
137
+ <td align="left"><code>True</code></td>
138
+ <td align="left">If True, will place the component in a container - providing some extra padding around the border.</td>
139
+ </tr>
140
+
141
+ <tr>
142
+ <td align="left"><code>scale</code></td>
143
+ <td align="left" style="width: 25%;">
144
+
145
+ ```python
146
+ int | None
147
+ ```
148
+
149
+ </td>
150
+ <td align="left"><code>None</code></td>
151
+ <td align="left">relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.</td>
152
+ </tr>
153
+
154
+ <tr>
155
+ <td align="left"><code>min_width</code></td>
156
+ <td align="left" style="width: 25%;">
157
+
158
+ ```python
159
+ int
160
+ ```
161
+
162
+ </td>
163
+ <td align="left"><code>160</code></td>
164
+ <td align="left">minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.</td>
165
+ </tr>
166
+
167
+ <tr>
168
+ <td align="left"><code>interactive</code></td>
169
+ <td align="left" style="width: 25%;">
170
+
171
+ ```python
172
+ bool | None
173
+ ```
174
+
175
+ </td>
176
+ <td align="left"><code>None</code></td>
177
+ <td align="left">if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output.</td>
178
+ </tr>
179
+
180
+ <tr>
181
+ <td align="left"><code>visible</code></td>
182
+ <td align="left" style="width: 25%;">
183
+
184
+ ```python
185
+ bool
186
+ ```
187
+
188
+ </td>
189
+ <td align="left"><code>True</code></td>
190
+ <td align="left">If False, component will be hidden.</td>
191
+ </tr>
192
+
193
+ <tr>
194
+ <td align="left"><code>elem_id</code></td>
195
+ <td align="left" style="width: 25%;">
196
+
197
+ ```python
198
+ str | None
199
+ ```
200
+
201
+ </td>
202
+ <td align="left"><code>None</code></td>
203
+ <td align="left">An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.</td>
204
+ </tr>
205
+
206
+ <tr>
207
+ <td align="left"><code>autofocus</code></td>
208
+ <td align="left" style="width: 25%;">
209
+
210
+ ```python
211
+ bool
212
+ ```
213
+
214
+ </td>
215
+ <td align="left"><code>False</code></td>
216
+ <td align="left">If True, will focus on the textbox when the page loads. Use this carefully, as it can cause usability issues for sighted and non-sighted users.</td>
217
+ </tr>
218
+
219
+ <tr>
220
+ <td align="left"><code>autoscroll</code></td>
221
+ <td align="left" style="width: 25%;">
222
+
223
+ ```python
224
+ bool
225
+ ```
226
+
227
+ </td>
228
+ <td align="left"><code>True</code></td>
229
+ <td align="left">None</td>
230
+ </tr>
231
+
232
+ <tr>
233
+ <td align="left"><code>elem_classes</code></td>
234
+ <td align="left" style="width: 25%;">
235
+
236
+ ```python
237
+ list[str] | str | None
238
+ ```
239
+
240
+ </td>
241
+ <td align="left"><code>None</code></td>
242
+ <td align="left">An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.</td>
243
+ </tr>
244
+
245
+ <tr>
246
+ <td align="left"><code>render</code></td>
247
+ <td align="left" style="width: 25%;">
248
+
249
+ ```python
250
+ bool
251
+ ```
252
+
253
+ </td>
254
+ <td align="left"><code>True</code></td>
255
+ <td align="left">If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.</td>
256
+ </tr>
257
+ </tbody></table>
258
+
259
+
260
+ ### Events
261
+
262
+ | name | description |
263
+ |:-----|:------------|
264
+ | `change` | Triggered when the value of the CofoldingInput changes either because of user input (e.g. a user types in a textbox) OR because of a function update (e.g. an image receives a value from the output of an event trigger). See `.input()` for a listener that is only triggered by user input. |
265
+ | `input` | This listener is triggered when the user changes the value of the CofoldingInput. |
266
+ | `select` | Event listener for when the user selects or deselects the CofoldingInput. Uses event data gradio.SelectData to carry `value` referring to the label of the CofoldingInput, and `selected` to refer to state of the CofoldingInput. See EventData documentation on how to use this event data |
267
+ | `submit` | This listener is triggered when the user presses the Enter key while the CofoldingInput is focused. |
268
+ | `focus` | This listener is triggered when the CofoldingInput is focused. |
269
+ | `blur` | This listener is triggered when the CofoldingInput is unfocused/blurred. |
270
+
271
+
272
+
273
+ ### User function
274
+
275
+ The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both).
276
+
277
+ - When used as an Input, the component only impacts the input signature of the user function.
278
+ - When used as an output, the component only impacts the return signature of the user function.
279
+
280
+ The code snippet below is accurate in cases where the component is used as both an input and an output.
281
+
282
+ - **As input:** Should return, expects a {str} returned from function and sets textarea value to it.
283
+
284
+ ```python
285
+ def predict(
286
+ value: Unknown
287
+ ) -> dict | None:
288
+ return value
289
+ ```
290
+
src/backend/gradio_cofoldinginput/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+
2
+ from .cofoldinginput import CofoldingInput
3
+
4
+ __all__ = ['CofoldingInput']
src/backend/gradio_cofoldinginput/cofoldinginput.py ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """gr.Textbox() component."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Callable, Literal
6
+
7
+ from gradio_client.documentation import document
8
+
9
+ from gradio.components.base import FormComponent
10
+ from gradio.events import Events
11
+
12
+
13
+
14
+ class CofoldingInput(FormComponent):
15
+ """
16
+ Creates a textarea for user to enter string input or display string output.
17
+
18
+ Demos: hello_world, diff_texts, sentence_builder
19
+ Guides: creating-a-chatbot, real-time-speech-recognition
20
+ """
21
+
22
+ EVENTS = [
23
+ Events.change,
24
+ Events.input,
25
+ Events.select,
26
+ Events.submit,
27
+ Events.focus,
28
+ Events.blur,
29
+ ]
30
+
31
+ def __init__(
32
+ self,
33
+ value: dict | None = {"chains": [], "covMods": []},
34
+ *,
35
+ label: str | None = None,
36
+ info: str | None = None,
37
+ every: float | None = None,
38
+ show_label: bool | None = None,
39
+ container: bool = True,
40
+ scale: int | None = None,
41
+ min_width: int = 160,
42
+ interactive: bool | None = None,
43
+ visible: bool = True,
44
+ elem_id: str | None = None,
45
+ autofocus: bool = False,
46
+ autoscroll: bool = True,
47
+ elem_classes: list[str] | str | None = None,
48
+ render: bool = True,
49
+ ):
50
+ """
51
+ Parameters:
52
+ value: list of items.
53
+ label: The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.
54
+ info: additional component description.
55
+ every: If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
56
+ show_label: if True, will display label.
57
+ container: If True, will place the component in a container - providing some extra padding around the border.
58
+ scale: relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.
59
+ min_width: minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
60
+ interactive: if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output.
61
+ visible: If False, component will be hidden.
62
+ autofocus: If True, will focus on the textbox when the page loads. Use this carefully, as it can cause usability issues for sighted and non-sighted users.
63
+ elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
64
+ elem_classes: An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
65
+ render: If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.
66
+ type: The type of textbox. One of: 'text', 'password', 'email', Default is 'text'.
67
+ """
68
+
69
+ self.autofocus = autofocus
70
+ self.autoscroll = autoscroll
71
+ super().__init__(
72
+ label=label,
73
+ info=info,
74
+ every=every,
75
+ show_label=show_label,
76
+ container=container,
77
+ scale=scale,
78
+ min_width=min_width,
79
+ interactive=interactive,
80
+ visible=visible,
81
+ elem_id=elem_id,
82
+ elem_classes=elem_classes,
83
+ render=render,
84
+ value=value,
85
+ )
86
+
87
+ def preprocess(self, payload):
88
+ """
89
+ Parameters:
90
+ payload: the text entered in the textarea.
91
+ Returns:
92
+ returns list
93
+ """
94
+ return None if payload is None else dict(payload)
95
+
96
+ def postprocess(self, value: dict | None) -> dict | None:
97
+ """
98
+ Parameters:
99
+ value: Expects a {str} returned from function and sets textarea value to it.
100
+ Returns:
101
+ The value to display in the textarea.
102
+ """
103
+ return None if value is None else dict(value)
104
+
105
+ def api_info(self) -> dict[str, Any]:
106
+ """
107
+ A JSON-schema representation of the value that the `preprocess` expects and the `postprocess` returns.
108
+ """
109
+ return {
110
+ "type": {},
111
+ "description": "Any valid json",
112
+ }
113
+
114
+ def example_payload(self) -> Any:
115
+ return []
116
+
117
+ def example_value(self) -> Any:
118
+ return []
src/backend/gradio_cofoldinginput/cofoldinginput.pyi ADDED
@@ -0,0 +1,370 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """gr.Textbox() component."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Callable, Literal
6
+
7
+ from gradio_client.documentation import document
8
+
9
+ from gradio.components.base import FormComponent
10
+ from gradio.events import Events
11
+
12
+
13
+ class CofoldingInput(FormComponent):
14
+ """
15
+ Creates a textarea for user to enter string input or display string output.
16
+
17
+ Demos: hello_world, diff_texts, sentence_builder
18
+ Guides: creating-a-chatbot, real-time-speech-recognition
19
+ """
20
+
21
+ EVENTS = [
22
+ Events.change,
23
+ Events.input,
24
+ Events.select,
25
+ Events.submit,
26
+ Events.focus,
27
+ Events.blur,
28
+ ]
29
+
30
+ def __init__(
31
+ self,
32
+ value: dict | None = {"chains": [], "covMods": []},
33
+ *,
34
+ label: str | None = None,
35
+ info: str | None = None,
36
+ every: float | None = None,
37
+ show_label: bool | None = None,
38
+ container: bool = True,
39
+ scale: int | None = None,
40
+ min_width: int = 160,
41
+ interactive: bool | None = None,
42
+ visible: bool = True,
43
+ elem_id: str | None = None,
44
+ autofocus: bool = False,
45
+ autoscroll: bool = True,
46
+ elem_classes: list[str] | str | None = None,
47
+ render: bool = True,
48
+ ):
49
+ """
50
+ Parameters:
51
+ value: list of items.
52
+ label: The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.
53
+ info: additional component description.
54
+ every: If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
55
+ show_label: if True, will display label.
56
+ container: If True, will place the component in a container - providing some extra padding around the border.
57
+ scale: relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.
58
+ min_width: minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
59
+ interactive: if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output.
60
+ visible: If False, component will be hidden.
61
+ autofocus: If True, will focus on the textbox when the page loads. Use this carefully, as it can cause usability issues for sighted and non-sighted users.
62
+ elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
63
+ elem_classes: An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
64
+ render: If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.
65
+ type: The type of textbox. One of: 'text', 'password', 'email', Default is 'text'.
66
+ """
67
+
68
+ self.autofocus = autofocus
69
+ self.autoscroll = autoscroll
70
+ super().__init__(
71
+ label=label,
72
+ info=info,
73
+ every=every,
74
+ show_label=show_label,
75
+ container=container,
76
+ scale=scale,
77
+ min_width=min_width,
78
+ interactive=interactive,
79
+ visible=visible,
80
+ elem_id=elem_id,
81
+ elem_classes=elem_classes,
82
+ render=render,
83
+ value=value,
84
+ )
85
+
86
+ def preprocess(self, payload):
87
+ """
88
+ Parameters:
89
+ payload: the text entered in the textarea.
90
+ Returns:
91
+ returns list
92
+ """
93
+ return None if payload is None else dict(payload)
94
+
95
+ def postprocess(self, value: dict | None) -> dict | None:
96
+ """
97
+ Parameters:
98
+ value: Expects a {str} returned from function and sets textarea value to it.
99
+ Returns:
100
+ The value to display in the textarea.
101
+ """
102
+ return None if value is None else dict(value)
103
+
104
+ def api_info(self) -> dict[str, Any]:
105
+ """
106
+ A JSON-schema representation of the value that the `preprocess` expects and the `postprocess` returns.
107
+ """
108
+ return {
109
+ "type": {},
110
+ "description": "Any valid json",
111
+ }
112
+
113
+ def example_payload(self) -> Any:
114
+ return []
115
+
116
+ def example_value(self) -> Any:
117
+ return []
118
+
119
+
120
+ def change(self,
121
+ fn: Callable | None,
122
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
123
+ outputs: Component | Sequence[Component] | None = None,
124
+ api_name: str | None | Literal[False] = None,
125
+ scroll_to_output: bool = False,
126
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
127
+ queue: bool | None = None,
128
+ batch: bool = False,
129
+ max_batch_size: int = 4,
130
+ preprocess: bool = True,
131
+ postprocess: bool = True,
132
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
133
+ every: float | None = None,
134
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
135
+ js: str | None = None,
136
+ concurrency_limit: int | None | Literal["default"] = "default",
137
+ concurrency_id: str | None = None,
138
+ show_api: bool = True) -> Dependency:
139
+ """
140
+ Parameters:
141
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
142
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
143
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
144
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
145
+ scroll_to_output: If True, will scroll to output component on completion
146
+ show_progress: If True, will show progress animation while pending
147
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
148
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
149
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
150
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
151
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
152
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
153
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
154
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
155
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
156
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
157
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
158
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
159
+ """
160
+ ...
161
+
162
+ def input(self,
163
+ fn: Callable | None,
164
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
165
+ outputs: Component | Sequence[Component] | None = None,
166
+ api_name: str | None | Literal[False] = None,
167
+ scroll_to_output: bool = False,
168
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
169
+ queue: bool | None = None,
170
+ batch: bool = False,
171
+ max_batch_size: int = 4,
172
+ preprocess: bool = True,
173
+ postprocess: bool = True,
174
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
175
+ every: float | None = None,
176
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
177
+ js: str | None = None,
178
+ concurrency_limit: int | None | Literal["default"] = "default",
179
+ concurrency_id: str | None = None,
180
+ show_api: bool = True) -> Dependency:
181
+ """
182
+ Parameters:
183
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
184
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
185
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
186
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
187
+ scroll_to_output: If True, will scroll to output component on completion
188
+ show_progress: If True, will show progress animation while pending
189
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
190
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
191
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
192
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
193
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
194
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
195
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
196
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
197
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
198
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
199
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
200
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
201
+ """
202
+ ...
203
+
204
+ def select(self,
205
+ fn: Callable | None,
206
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
207
+ outputs: Component | Sequence[Component] | None = None,
208
+ api_name: str | None | Literal[False] = None,
209
+ scroll_to_output: bool = False,
210
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
211
+ queue: bool | None = None,
212
+ batch: bool = False,
213
+ max_batch_size: int = 4,
214
+ preprocess: bool = True,
215
+ postprocess: bool = True,
216
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
217
+ every: float | None = None,
218
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
219
+ js: str | None = None,
220
+ concurrency_limit: int | None | Literal["default"] = "default",
221
+ concurrency_id: str | None = None,
222
+ show_api: bool = True) -> Dependency:
223
+ """
224
+ Parameters:
225
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
226
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
227
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
228
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
229
+ scroll_to_output: If True, will scroll to output component on completion
230
+ show_progress: If True, will show progress animation while pending
231
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
232
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
233
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
234
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
235
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
236
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
237
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
238
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
239
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
240
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
241
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
242
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
243
+ """
244
+ ...
245
+
246
+ def submit(self,
247
+ fn: Callable | None,
248
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
249
+ outputs: Component | Sequence[Component] | None = None,
250
+ api_name: str | None | Literal[False] = None,
251
+ scroll_to_output: bool = False,
252
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
253
+ queue: bool | None = None,
254
+ batch: bool = False,
255
+ max_batch_size: int = 4,
256
+ preprocess: bool = True,
257
+ postprocess: bool = True,
258
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
259
+ every: float | None = None,
260
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
261
+ js: str | None = None,
262
+ concurrency_limit: int | None | Literal["default"] = "default",
263
+ concurrency_id: str | None = None,
264
+ show_api: bool = True) -> Dependency:
265
+ """
266
+ Parameters:
267
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
268
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
269
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
270
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
271
+ scroll_to_output: If True, will scroll to output component on completion
272
+ show_progress: If True, will show progress animation while pending
273
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
274
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
275
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
276
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
277
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
278
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
279
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
280
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
281
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
282
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
283
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
284
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
285
+ """
286
+ ...
287
+
288
+ def focus(self,
289
+ fn: Callable | None,
290
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
291
+ outputs: Component | Sequence[Component] | None = None,
292
+ api_name: str | None | Literal[False] = None,
293
+ scroll_to_output: bool = False,
294
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
295
+ queue: bool | None = None,
296
+ batch: bool = False,
297
+ max_batch_size: int = 4,
298
+ preprocess: bool = True,
299
+ postprocess: bool = True,
300
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
301
+ every: float | None = None,
302
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
303
+ js: str | None = None,
304
+ concurrency_limit: int | None | Literal["default"] = "default",
305
+ concurrency_id: str | None = None,
306
+ show_api: bool = True) -> Dependency:
307
+ """
308
+ Parameters:
309
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
310
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
311
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
312
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
313
+ scroll_to_output: If True, will scroll to output component on completion
314
+ show_progress: If True, will show progress animation while pending
315
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
316
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
317
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
318
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
319
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
320
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
321
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
322
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
323
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
324
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
325
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
326
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
327
+ """
328
+ ...
329
+
330
+ def blur(self,
331
+ fn: Callable | None,
332
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
333
+ outputs: Component | Sequence[Component] | None = None,
334
+ api_name: str | None | Literal[False] = None,
335
+ scroll_to_output: bool = False,
336
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
337
+ queue: bool | None = None,
338
+ batch: bool = False,
339
+ max_batch_size: int = 4,
340
+ preprocess: bool = True,
341
+ postprocess: bool = True,
342
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
343
+ every: float | None = None,
344
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
345
+ js: str | None = None,
346
+ concurrency_limit: int | None | Literal["default"] = "default",
347
+ concurrency_id: str | None = None,
348
+ show_api: bool = True) -> Dependency:
349
+ """
350
+ Parameters:
351
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
352
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
353
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
354
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
355
+ scroll_to_output: If True, will scroll to output component on completion
356
+ show_progress: If True, will show progress animation while pending
357
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
358
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
359
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
360
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
361
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
362
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
363
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
364
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
365
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
366
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
367
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
368
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
369
+ """
370
+ ...
src/backend/gradio_cofoldinginput/templates/component/index.js ADDED
The diff for this file is too large to render. See raw diff
 
src/backend/gradio_cofoldinginput/templates/component/style.css ADDED
@@ -0,0 +1 @@
 
 
1
+ .block.svelte-1t38q2d{position:relative;margin:0;box-shadow:var(--block-shadow);border-width:var(--block-border-width);border-color:var(--block-border-color);border-radius:var(--block-radius);background:var(--block-background-fill);width:100%;line-height:var(--line-sm)}.block.border_focus.svelte-1t38q2d{border-color:var(--color-accent)}.padded.svelte-1t38q2d{padding:var(--block-padding)}.hidden.svelte-1t38q2d{display:none}.hide-container.svelte-1t38q2d{margin:0;box-shadow:none;--block-border-width:0;background:transparent;padding:0;overflow:visible}div.svelte-1hnfib2{margin-bottom:var(--spacing-lg);color:var(--block-info-text-color);font-weight:var(--block-info-text-weight);font-size:var(--block-info-text-size);line-height:var(--line-sm)}span.has-info.svelte-22c38v{margin-bottom:var(--spacing-xs)}span.svelte-22c38v:not(.has-info){margin-bottom:var(--spacing-lg)}span.svelte-22c38v{display:inline-block;position:relative;z-index:var(--layer-4);border:solid var(--block-title-border-width) var(--block-title-border-color);border-radius:var(--block-title-radius);background:var(--block-title-background-fill);padding:var(--block-title-padding);color:var(--block-title-text-color);font-weight:var(--block-title-text-weight);font-size:var(--block-title-text-size);line-height:var(--line-sm)}.hide.svelte-22c38v{margin:0;height:0}label.svelte-9gxdi0{display:inline-flex;align-items:center;z-index:var(--layer-2);box-shadow:var(--block-label-shadow);border:var(--block-label-border-width) solid var(--border-color-primary);border-top:none;border-left:none;border-radius:var(--block-label-radius);background:var(--block-label-background-fill);padding:var(--block-label-padding);pointer-events:none;color:var(--block-label-text-color);font-weight:var(--block-label-text-weight);font-size:var(--block-label-text-size);line-height:var(--line-sm)}.gr-group label.svelte-9gxdi0{border-top-left-radius:0}label.float.svelte-9gxdi0{position:absolute;top:var(--block-label-margin);left:var(--block-label-margin)}label.svelte-9gxdi0:not(.float){position:static;margin-top:var(--block-label-margin);margin-left:var(--block-label-margin)}.hide.svelte-9gxdi0{height:0}span.svelte-9gxdi0{opacity:.8;margin-right:var(--size-2);width:calc(var(--block-label-text-size) - 1px);height:calc(var(--block-label-text-size) - 1px)}.hide-label.svelte-9gxdi0{box-shadow:none;border-width:0;background:transparent;overflow:visible}button.svelte-lpi64a{display:flex;justify-content:center;align-items:center;gap:1px;z-index:var(--layer-2);border-radius:var(--radius-sm);color:var(--block-label-text-color);border:1px solid transparent}button[disabled].svelte-lpi64a{opacity:.5;box-shadow:none}button[disabled].svelte-lpi64a:hover{cursor:not-allowed}.padded.svelte-lpi64a{padding:2px;background:var(--bg-color);box-shadow:var(--shadow-drop);border:1px solid var(--button-secondary-border-color)}button.svelte-lpi64a:hover,button.highlight.svelte-lpi64a{cursor:pointer;color:var(--color-accent)}.padded.svelte-lpi64a:hover{border:2px solid var(--button-secondary-border-color-hover);padding:1px;color:var(--block-label-text-color)}span.svelte-lpi64a{padding:0 1px;font-size:10px}div.svelte-lpi64a{padding:2px;display:flex;align-items:flex-end}.small.svelte-lpi64a{width:14px;height:14px}.large.svelte-lpi64a{width:22px;height:22px}.pending.svelte-lpi64a{animation:svelte-lpi64a-flash .5s infinite}@keyframes svelte-lpi64a-flash{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.transparent.svelte-lpi64a{background:transparent;border:none;box-shadow:none}.empty.svelte-3w3rth{display:flex;justify-content:center;align-items:center;margin-top:calc(0px - var(--size-6));height:var(--size-full)}.icon.svelte-3w3rth{opacity:.5;height:var(--size-5);color:var(--body-text-color)}.small.svelte-3w3rth{min-height:calc(var(--size-32) - 20px)}.large.svelte-3w3rth{min-height:calc(var(--size-64) - 20px)}.unpadded_box.svelte-3w3rth{margin-top:0}.small_parent.svelte-3w3rth{min-height:100%!important}.dropdown-arrow.svelte-145leq6{fill:currentColor}.wrap.svelte-kzcjhc{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:var(--size-60);color:var(--block-label-text-color);line-height:var(--line-md);height:100%;padding-top:var(--size-3)}.or.svelte-kzcjhc{color:var(--body-text-color-subdued);display:flex}.icon-wrap.svelte-kzcjhc{width:30px;margin-bottom:var(--spacing-lg)}@media (--screen-md){.wrap.svelte-kzcjhc{font-size:var(--text-lg)}}.hovered.svelte-kzcjhc{color:var(--color-accent)}div.svelte-ipfyu7{border-top:1px solid transparent;display:flex;max-height:100%;justify-content:center;gap:var(--spacing-sm);height:auto;align-items:flex-end;padding-bottom:var(--spacing-xl);color:var(--block-label-text-color);flex-shrink:0;width:95%}.show_border.svelte-ipfyu7{border-top:1px solid var(--block-border-color);margin-top:var(--spacing-xxl);box-shadow:var(--shadow-drop)}.source-selection.svelte-1jp3vgd{display:flex;align-items:center;justify-content:center;border-top:1px solid var(--border-color-primary);width:95%;bottom:0;left:0;right:0;margin-left:auto;margin-right:auto}.icon.svelte-1jp3vgd{width:22px;height:22px;margin:var(--spacing-lg) var(--spacing-xs);padding:var(--spacing-xs);color:var(--neutral-400);border-radius:var(--radius-md)}.selected.svelte-1jp3vgd{color:var(--color-accent)}.icon.svelte-1jp3vgd:hover,.icon.svelte-1jp3vgd:focus{color:var(--color-accent)}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:before,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:before,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:after{--tw-content:""}button.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{text-transform:none}button.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{-webkit-appearance:button;background-color:transparent;background-image:none}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:-moz-focusring{outline:auto}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:-moz-ui-invalid{box-shadow:none}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx::-webkit-inner-spin-button,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx::-webkit-outer-spin-button{height:auto}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx::-webkit-search-decoration{-webkit-appearance:none}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}button.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{cursor:pointer}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:disabled{cursor:default}svg.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{display:block;vertical-align:middle}.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:before,.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx: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: }.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx::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: }.block.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{display:block}.flex.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{display:flex}.h-4.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{height:1rem}.w-4.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{width:1rem}.items-center.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{align-items:center}.justify-center.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{justify-content:center}.space-x-2.svelte-8wrmgx>.svelte-8wrmgx:not([hidden])~.svelte-8wrmgx:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.px-4.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{padding-left:1rem;padding-right:1rem}.py-2.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx{padding-top:.5rem;padding-bottom:.5rem}.hover\:bg-gray-100.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}@media (prefers-color-scheme: dark){.dark\:hover\:bg-gray-600.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.dark\:hover\:text-white.svelte-8wrmgx.svelte-8wrmgx.svelte-8wrmgx:hover{--tw-text-opacity:1;color:#fff}}.svelte-8wrmgx,.svelte-8wrmgx:before,.svelte-8wrmgx:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-8wrmgx:before,.svelte-8wrmgx:after{--tw-content:""}button.svelte-8wrmgx,input.svelte-8wrmgx{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button.svelte-8wrmgx{text-transform:none}button.svelte-8wrmgx,[type=button].svelte-8wrmgx,[type=submit].svelte-8wrmgx{-webkit-appearance:button;background-color:transparent;background-image:none}.svelte-8wrmgx:-moz-focusring{outline:auto}.svelte-8wrmgx:-moz-ui-invalid{box-shadow:none}.svelte-8wrmgx::-webkit-inner-spin-button,.svelte-8wrmgx::-webkit-outer-spin-button{height:auto}[type=search].svelte-8wrmgx{-webkit-appearance:textfield;outline-offset:-2px}.svelte-8wrmgx::-webkit-search-decoration{-webkit-appearance:none}.svelte-8wrmgx::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}ul.svelte-8wrmgx{list-style:none;margin:0;padding:0}input.svelte-8wrmgx::placeholder{opacity:1;color:#9ca3af}button.svelte-8wrmgx{cursor:pointer}.svelte-8wrmgx:disabled{cursor:default}svg.svelte-8wrmgx{display:block;vertical-align:middle}.svelte-8wrmgx,.svelte-8wrmgx:before,.svelte-8wrmgx: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: }.svelte-8wrmgx::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: }.sr-only.svelte-8wrmgx{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.absolute.svelte-8wrmgx{position:absolute}.relative.svelte-8wrmgx{position:relative}.end-0.svelte-8wrmgx{inset-inline-end:0px}.top-0.svelte-8wrmgx{top:0}.z-10.svelte-8wrmgx{z-index:10}.z-20.svelte-8wrmgx{z-index:20}.mx-auto.svelte-8wrmgx{margin-left:auto;margin-right:auto}.my-2.svelte-8wrmgx{margin-top:.5rem;margin-bottom:.5rem}.mb-2.svelte-8wrmgx{margin-bottom:.5rem}.block.svelte-8wrmgx{display:block}.flex.svelte-8wrmgx{display:flex}.inline-flex.svelte-8wrmgx{display:inline-flex}.hidden.svelte-8wrmgx{display:none}.h-4.svelte-8wrmgx{height:1rem}.h-full.svelte-8wrmgx{height:100%}.w-4.svelte-8wrmgx{width:1rem}.w-44.svelte-8wrmgx{width:11rem}.w-full.svelte-8wrmgx{width:100%}.max-w-lg.svelte-8wrmgx{max-width:32rem}.flex-shrink-0.svelte-8wrmgx{flex-shrink:0}.items-center.svelte-8wrmgx{align-items:center}.rounded-lg.svelte-8wrmgx{border-radius:.5rem}.rounded-e-lg.svelte-8wrmgx{border-start-end-radius:.5rem;border-end-end-radius:.5rem}.rounded-s-lg.svelte-8wrmgx{border-start-start-radius:.5rem;border-end-start-radius:.5rem}.border.svelte-8wrmgx{border-width:1px}.border-s-2.svelte-8wrmgx{border-inline-start-width:2px}.border-blue-700.svelte-8wrmgx{--tw-border-opacity:1;border-color:rgb(29 78 216 / var(--tw-border-opacity))}.border-gray-300.svelte-8wrmgx{--tw-border-opacity:1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-s-gray-50.svelte-8wrmgx{--tw-border-opacity:1;border-inline-start-color:rgb(249 250 251 / var(--tw-border-opacity))}.bg-blue-700.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.bg-gray-100.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-50.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.bg-white.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-2\.5.svelte-8wrmgx{padding:.625rem}.px-4.svelte-8wrmgx{padding-left:1rem;padding-right:1rem}.py-2.svelte-8wrmgx{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5.svelte-8wrmgx{padding-top:.625rem;padding-bottom:.625rem}.text-center.svelte-8wrmgx{text-align:center}.text-sm.svelte-8wrmgx{font-size:.875rem;line-height:1.25rem}.font-medium.svelte-8wrmgx{font-weight:500}.text-gray-700.svelte-8wrmgx{--tw-text-opacity:1;color:#374151}.text-gray-900.svelte-8wrmgx{--tw-text-opacity:1;color:#111827}.text-white.svelte-8wrmgx{--tw-text-opacity:1;color:#fff}.shadow.svelte-8wrmgx{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:bg-blue-800.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175 / var(--tw-bg-opacity))}.hover\:bg-gray-100.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:bg-gray-200.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.focus\:border-blue-500.svelte-8wrmgx:focus{--tw-border-opacity:1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.focus\:outline-none.svelte-8wrmgx:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4.svelte-8wrmgx:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-300.svelte-8wrmgx:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253 / var(--tw-ring-opacity))}.focus\:ring-blue-500.svelte-8wrmgx:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246 / var(--tw-ring-opacity))}.focus\:ring-gray-100.svelte-8wrmgx:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246 / var(--tw-ring-opacity))}@media (prefers-color-scheme: dark){.dark\:border-gray-600.svelte-8wrmgx{--tw-border-opacity:1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.dark\:border-s-gray-700.svelte-8wrmgx{--tw-border-opacity:1;border-inline-start-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:bg-blue-600.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.dark\:bg-gray-700.svelte-8wrmgx{--tw-bg-opacity:1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:text-gray-200.svelte-8wrmgx{--tw-text-opacity:1;color:#e5e7eb}.dark\:text-white.svelte-8wrmgx{--tw-text-opacity:1;color:#fff}.dark\:placeholder-gray-400.svelte-8wrmgx::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:hover\:bg-blue-700.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.dark\:hover\:bg-gray-600.svelte-8wrmgx:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.dark\:hover\:text-white.svelte-8wrmgx:hover{--tw-text-opacity:1;color:#fff}.dark\:focus\:border-blue-500.svelte-8wrmgx:focus{--tw-border-opacity:1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.dark\:focus\:ring-blue-800.svelte-8wrmgx:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175 / var(--tw-ring-opacity))}.dark\:focus\:ring-gray-700.svelte-8wrmgx:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81 / var(--tw-ring-opacity))}}.svelte-hhspdt.svelte-hhspdt,.svelte-hhspdt.svelte-hhspdt:before,.svelte-hhspdt.svelte-hhspdt:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-hhspdt.svelte-hhspdt:before,.svelte-hhspdt.svelte-hhspdt:after{--tw-content:""}.svelte-hhspdt.svelte-hhspdt:-moz-focusring{outline:auto}.svelte-hhspdt.svelte-hhspdt:-moz-ui-invalid{box-shadow:none}.svelte-hhspdt.svelte-hhspdt::-webkit-inner-spin-button,.svelte-hhspdt.svelte-hhspdt::-webkit-outer-spin-button{height:auto}.svelte-hhspdt.svelte-hhspdt::-webkit-search-decoration{-webkit-appearance:none}.svelte-hhspdt.svelte-hhspdt::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.svelte-hhspdt.svelte-hhspdt:disabled{cursor:default}.svelte-hhspdt.svelte-hhspdt,.svelte-hhspdt.svelte-hhspdt:before,.svelte-hhspdt.svelte-hhspdt: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: }.svelte-hhspdt.svelte-hhspdt::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: }.inline-block.svelte-hhspdt.svelte-hhspdt{display:inline-block}.inline.svelte-hhspdt.svelte-hhspdt{display:inline}.w-full.svelte-hhspdt.svelte-hhspdt{width:100%}.cursor-pointer.svelte-hhspdt.svelte-hhspdt{cursor:pointer}.p-0\.5.svelte-hhspdt.svelte-hhspdt{padding:.125rem}.text-center.svelte-hhspdt.svelte-hhspdt{text-align:center}.text-xs.svelte-hhspdt.svelte-hhspdt{font-size:.75rem;line-height:1rem}.sequence_container.svelte-hhspdt.svelte-hhspdt{overflow-wrap:anywhere;counter-reset:sequence}.sequence_container.svelte-hhspdt .sequence__chunk.svelte-hhspdt{display:inline-block;margin:.1rem 0 1rem 1rem;position:relative;white-space:nowrap}.sequence_container.svelte-hhspdt .sequence__chunk.svelte-hhspdt:not(:last-child):before{content:counter(sequence);counter-increment:sequence 10;position:absolute;top:-.8em;right:0;opacity:.5;font-weight:700}.sequence__chunk.svelte-hhspdt span.svelte-hhspdt{padding:0 .05rem}.hover\:font-bold.svelte-hhspdt.svelte-hhspdt:hover{font-weight:700}.active.svelte-1jhdl43{background:#fff;border-radius:9999px;color:#ea580c}.mol-canvas.svelte-1jhdl43{width:200px;height:200px;margin:0 auto}.mol-wrapper.svelte-1jhdl43{width:100%;display:flex;justify-content:center}.svelte-1jhdl43,.svelte-1jhdl43:before,.svelte-1jhdl43:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-1jhdl43:before,.svelte-1jhdl43:after{--tw-content:""}table.svelte-1jhdl43{text-indent:0;border-color:inherit;border-collapse:collapse}button.svelte-1jhdl43{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.svelte-1jhdl43{text-transform:none}button.svelte-1jhdl43{-webkit-appearance:button;background-color:transparent;background-image:none}.svelte-1jhdl43:-moz-focusring{outline:auto}.svelte-1jhdl43:-moz-ui-invalid{box-shadow:none}.svelte-1jhdl43::-webkit-inner-spin-button,.svelte-1jhdl43::-webkit-outer-spin-button{height:auto}.svelte-1jhdl43::-webkit-search-decoration{-webkit-appearance:none}.svelte-1jhdl43::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}button.svelte-1jhdl43{cursor:pointer}.svelte-1jhdl43:disabled{cursor:default}svg.svelte-1jhdl43{display:block;vertical-align:middle}.svelte-1jhdl43,.svelte-1jhdl43:before,.svelte-1jhdl43: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: }.svelte-1jhdl43::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: }.relative.svelte-1jhdl43{position:relative}.mx-1.svelte-1jhdl43{margin-left:.25rem;margin-right:.25rem}.mb-2.svelte-1jhdl43{margin-bottom:.5rem}.mt-3.svelte-1jhdl43{margin-top:.75rem}.flex.svelte-1jhdl43{display:flex}.h-4.svelte-1jhdl43{height:1rem}.w-1\/2.svelte-1jhdl43{width:50%}.w-4.svelte-1jhdl43{width:1rem}.w-full.svelte-1jhdl43{width:100%}.flex-col.svelte-1jhdl43{flex-direction:column}.items-center.svelte-1jhdl43{align-items:center}.justify-center.svelte-1jhdl43{justify-content:center}.overflow-x-auto.svelte-1jhdl43{overflow-x:auto}.whitespace-nowrap.svelte-1jhdl43{white-space:nowrap}.rounded-full.svelte-1jhdl43{border-radius:9999px}.rounded-l-full.svelte-1jhdl43{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-r-full.svelte-1jhdl43{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.border-2.svelte-1jhdl43{border-width:2px}.border-b.svelte-1jhdl43{border-bottom-width:1px}.border-gray-200.svelte-1jhdl43{--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.bg-gray-200.svelte-1jhdl43{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.bg-gray-50.svelte-1jhdl43{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.bg-white.svelte-1jhdl43{--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.px-4.svelte-1jhdl43{padding-left:1rem;padding-right:1rem}.px-6.svelte-1jhdl43{padding-left:1.5rem;padding-right:1.5rem}.py-2.svelte-1jhdl43{padding-top:.5rem;padding-bottom:.5rem}.py-3.svelte-1jhdl43{padding-top:.75rem;padding-bottom:.75rem}.py-4.svelte-1jhdl43{padding-top:1rem;padding-bottom:1rem}.text-left.svelte-1jhdl43{text-align:left}.text-center.svelte-1jhdl43{text-align:center}.text-right.svelte-1jhdl43{text-align:right}.font-mono.svelte-1jhdl43{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-lg.svelte-1jhdl43{font-size:1.125rem;line-height:1.75rem}.text-sm.svelte-1jhdl43{font-size:.875rem;line-height:1.25rem}.text-xs.svelte-1jhdl43{font-size:.75rem;line-height:1rem}.font-medium.svelte-1jhdl43{font-weight:500}.uppercase.svelte-1jhdl43{text-transform:uppercase}.leading-none.svelte-1jhdl43{line-height:1}.text-gray-500.svelte-1jhdl43{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-700.svelte-1jhdl43{--tw-text-opacity:1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-900.svelte-1jhdl43{--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity))}.transition-colors.svelte-1jhdl43{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300.svelte-1jhdl43{transition-duration:.3s}.ease-in.svelte-1jhdl43{transition-timing-function:cubic-bezier(.4,0,1,1)}.hover\:text-orange-600.svelte-1jhdl43:hover{--tw-text-opacity:1;color:rgb(234 88 12 / var(--tw-text-opacity))}.focus\:text-orange-600.svelte-1jhdl43:focus{--tw-text-opacity:1;color:rgb(234 88 12 / var(--tw-text-opacity))}.focus\:outline-none.svelte-1jhdl43:focus{outline:2px solid transparent;outline-offset:2px}.rtl\:text-right.svelte-1jhdl43:where([dir=rtl],[dir=rtl] *){text-align:right}@media (prefers-color-scheme: dark){.dark\:border-gray-700.svelte-1jhdl43{--tw-border-opacity:1;border-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:bg-gray-700.svelte-1jhdl43{--tw-bg-opacity:1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:bg-gray-800.svelte-1jhdl43{--tw-bg-opacity:1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.dark\:text-gray-400.svelte-1jhdl43{--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity))}.dark\:text-white.svelte-1jhdl43{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:before,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:before,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:after{--tw-content:""}h2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,h4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-size:inherit;font-weight:inherit}button.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,input.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,select.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,textarea.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{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.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,select.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{text-transform:none}button.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,input.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:where([type=button]),input.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:where([type=reset]),input.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:-moz-focusring{outline:auto}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:-moz-ui-invalid{box-shadow:none}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::-webkit-inner-spin-button,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::-webkit-outer-spin-button{height:auto}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::-webkit-search-decoration{-webkit-appearance:none}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}h2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,h4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,p.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{margin:0}textarea.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{resize:vertical}input.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::placeholder,textarea.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::placeholder{opacity:1;color:#9ca3af}button.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{cursor:pointer}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:disabled{cursor:default}svg.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:block;vertical-align:middle}.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:before,.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t: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: }.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::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: }.collapse.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{visibility:collapse}.relative.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{position:relative}.my-2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{margin-top:.5rem;margin-bottom:.5rem}.mb-2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{margin-bottom:.5rem}.mt-1.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{margin-top:.25rem}.block.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:block}.flex.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:flex}.inline-flex.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:inline-flex}.grid.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:grid}.hidden.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{display:none}.h-10.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{height:2.5rem}.h-3.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{height:.75rem}.h-4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{height:1rem}.w-10.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:2.5rem}.w-2\/5.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:40%}.w-3.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:.75rem}.w-3\/5.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:60%}.w-4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:1rem}.w-8.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:2rem}.w-full.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{width:100%}.shrink-0.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{flex-shrink:0}.-rotate-90.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-rotate:-90deg;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))}.rotate-180.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-rotate:180deg;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))}.cursor-pointer.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{cursor:pointer}.grid-cols-3.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{flex-direction:column}.items-center.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{align-items:center}.justify-center.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{justify-content:center}.justify-between.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{justify-content:space-between}.gap-3.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{gap:.75rem}.space-x-2.svelte-fryf3t>.svelte-fryf3t:not([hidden])~.svelte-fryf3t:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.divide-x.svelte-fryf3t>.svelte-fryf3t:not([hidden])~.svelte-fryf3t:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.overflow-hidden.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{overflow:hidden}.whitespace-nowrap.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{white-space:nowrap}.rounded.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-radius:.25rem}.rounded-full.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-radius:9999px}.rounded-lg.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-radius:.5rem}.border.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-width:1px}.border-b-0.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-bottom-width:0px}.border-t-0.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{border-top-width:0px}.border-gray-200.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-gray-300.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-border-opacity:1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.bg-blue-200.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(191 219 254 / var(--tw-bg-opacity))}.bg-gray-50.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.bg-green-100.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(220 252 231 / var(--tw-bg-opacity))}.bg-orange-200.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(254 215 170 / var(--tw-bg-opacity))}.bg-violet-100.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(237 233 254 / var(--tw-bg-opacity))}.bg-yellow-100.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(254 249 195 / var(--tw-bg-opacity))}.p-1.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding:.25rem}.p-10.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding:2.5rem}.p-2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding:.5rem}.p-2\.5.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding:.625rem}.p-5.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding:1.25rem}.px-2.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding-left:.5rem;padding-right:.5rem}.px-3.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{padding-left:.75rem;padding-right:.75rem}.text-center.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{text-align:center}.font-mono.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-base.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-size:1rem;line-height:1.5rem}.text-sm.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-size:.875rem;line-height:1.25rem}.text-xl.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-size:1.25rem;line-height:1.75rem}.text-xs.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-size:.75rem;line-height:1rem}.font-bold.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-weight:700}.font-medium.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-weight:500}.font-semibold.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{font-weight:600}.text-blue-800.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(30 64 175 / var(--tw-text-opacity))}.text-gray-400.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-500.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-800.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-gray-900.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-red-800.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(153 27 27 / var(--tw-text-opacity))}.hover\:bg-gray-100.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.focus\:border-blue-500.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-border-opacity:1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.focus\:outline-none.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246 / var(--tw-ring-opacity))}.focus\:ring-gray-200.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235 / var(--tw-ring-opacity))}.rtl\:text-right.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:where([dir=rtl],[dir=rtl] *){text-align:right}@media (prefers-color-scheme: dark){.dark\:border-gray-600.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-border-opacity:1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.dark\:border-gray-700.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-border-opacity:1;border-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:bg-gray-600.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.dark\:bg-gray-700.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:bg-gray-900.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-bg-opacity:1;background-color:rgb(17 24 39 / var(--tw-bg-opacity))}.dark\:text-gray-300.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\:text-gray-400.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity))}.dark\:text-white.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:placeholder-gray-400.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:hover\:bg-gray-800.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.dark\:focus\:border-blue-500.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-border-opacity:1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.dark\:focus\:ring-blue-500.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246 / var(--tw-ring-opacity))}.dark\:focus\:ring-gray-800.svelte-fryf3t.svelte-fryf3t.svelte-fryf3t:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55 / var(--tw-ring-opacity))}}.svelte-13zuw1o,.svelte-13zuw1o:before,.svelte-13zuw1o:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}.svelte-13zuw1o:before,.svelte-13zuw1o:after{--tw-content:""}:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-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}.svelte-13zuw1o:-moz-focusring{outline:auto}.svelte-13zuw1o:-moz-ui-invalid{box-shadow:none}.svelte-13zuw1o::-webkit-inner-spin-button,.svelte-13zuw1o::-webkit-outer-spin-button{height:auto}.svelte-13zuw1o::-webkit-search-decoration{-webkit-appearance:none}.svelte-13zuw1o::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.svelte-13zuw1o:disabled{cursor:default}.svelte-13zuw1o,.svelte-13zuw1o:before,.svelte-13zuw1o: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: }.svelte-13zuw1o::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: }.my-2.svelte-13zuw1o{margin-top:.5rem;margin-bottom:.5rem}.my-8.svelte-13zuw1o{margin-top:2rem;margin-bottom:2rem}.w-full.svelte-13zuw1o{width:100%}.text-center.svelte-13zuw1o{text-align:center}.text-gray-400.svelte-13zuw1o{--tw-text-opacity:1;color:#9ca3af}.text-gray-600.svelte-13zuw1o{--tw-text-opacity:1;color:#4b5563}svg.svelte-43sxxs.svelte-43sxxs{width:var(--size-20);height:var(--size-20)}svg.svelte-43sxxs path.svelte-43sxxs{fill:var(--loader-color)}div.svelte-43sxxs.svelte-43sxxs{z-index:var(--layer-2)}.margin.svelte-43sxxs.svelte-43sxxs{margin:var(--size-4)}.wrap.svelte-1yserjw.svelte-1yserjw{display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:var(--layer-top);transition:opacity .1s ease-in-out;border-radius:var(--block-radius);background:var(--block-background-fill);padding:0 var(--size-6);max-height:var(--size-screen-h);overflow:hidden;pointer-events:none}.wrap.center.svelte-1yserjw.svelte-1yserjw{top:0;right:0;left:0}.wrap.default.svelte-1yserjw.svelte-1yserjw{top:0;right:0;bottom:0;left:0}.hide.svelte-1yserjw.svelte-1yserjw{opacity:0;pointer-events:none}.generating.svelte-1yserjw.svelte-1yserjw{animation:svelte-1yserjw-pulse 2s cubic-bezier(.4,0,.6,1) infinite;border:2px solid var(--color-accent);background:transparent;z-index:var(--layer-1)}.translucent.svelte-1yserjw.svelte-1yserjw{background:none}@keyframes svelte-1yserjw-pulse{0%,to{opacity:1}50%{opacity:.5}}.loading.svelte-1yserjw.svelte-1yserjw{z-index:var(--layer-2);color:var(--body-text-color)}.eta-bar.svelte-1yserjw.svelte-1yserjw{position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:left;opacity:.8;z-index:var(--layer-1);transition:10ms;background:var(--background-fill-secondary)}.progress-bar-wrap.svelte-1yserjw.svelte-1yserjw{border:1px solid var(--border-color-primary);background:var(--background-fill-primary);width:55.5%;height:var(--size-4)}.progress-bar.svelte-1yserjw.svelte-1yserjw{transform-origin:left;background-color:var(--loader-color);width:var(--size-full);height:var(--size-full)}.progress-level.svelte-1yserjw.svelte-1yserjw{display:flex;flex-direction:column;align-items:center;gap:1;z-index:var(--layer-2);width:var(--size-full)}.progress-level-inner.svelte-1yserjw.svelte-1yserjw{margin:var(--size-2) auto;color:var(--body-text-color);font-size:var(--text-sm);font-family:var(--font-mono)}.meta-text.svelte-1yserjw.svelte-1yserjw{position:absolute;top:0;right:0;z-index:var(--layer-2);padding:var(--size-1) var(--size-2);font-size:var(--text-sm);font-family:var(--font-mono)}.meta-text-center.svelte-1yserjw.svelte-1yserjw{display:flex;position:absolute;top:0;right:0;justify-content:center;align-items:center;transform:translateY(var(--size-6));z-index:var(--layer-2);padding:var(--size-1) var(--size-2);font-size:var(--text-sm);font-family:var(--font-mono);text-align:center}.error.svelte-1yserjw.svelte-1yserjw{box-shadow:var(--shadow-drop);border:solid 1px var(--error-border-color);border-radius:var(--radius-full);background:var(--error-background-fill);padding-right:var(--size-4);padding-left:var(--size-4);color:var(--error-text-color);font-weight:var(--weight-semibold);font-size:var(--text-lg);line-height:var(--line-lg);font-family:var(--font)}.minimal.svelte-1yserjw .progress-text.svelte-1yserjw{background:var(--block-background-fill)}.border.svelte-1yserjw.svelte-1yserjw{border:1px solid var(--border-color-primary)}.toast-body.svelte-solcu7{display:flex;position:relative;right:0;left:0;align-items:center;margin:var(--size-6) var(--size-4);margin:auto;border-radius:var(--container-radius);overflow:hidden;pointer-events:auto}.toast-body.error.svelte-solcu7{border:1px solid var(--color-red-700);background:var(--color-red-50)}.dark .toast-body.error.svelte-solcu7{border:1px solid var(--color-red-500);background-color:var(--color-grey-950)}.toast-body.warning.svelte-solcu7{border:1px solid var(--color-yellow-700);background:var(--color-yellow-50)}.dark .toast-body.warning.svelte-solcu7{border:1px solid var(--color-yellow-500);background-color:var(--color-grey-950)}.toast-body.info.svelte-solcu7{border:1px solid var(--color-grey-700);background:var(--color-grey-50)}.dark .toast-body.info.svelte-solcu7{border:1px solid var(--color-grey-500);background-color:var(--color-grey-950)}.toast-title.svelte-solcu7{display:flex;align-items:center;font-weight:var(--weight-bold);font-size:var(--text-lg);line-height:var(--line-sm);text-transform:capitalize}.toast-title.error.svelte-solcu7{color:var(--color-red-700)}.dark .toast-title.error.svelte-solcu7{color:var(--color-red-50)}.toast-title.warning.svelte-solcu7{color:var(--color-yellow-700)}.dark .toast-title.warning.svelte-solcu7{color:var(--color-yellow-50)}.toast-title.info.svelte-solcu7{color:var(--color-grey-700)}.dark .toast-title.info.svelte-solcu7{color:var(--color-grey-50)}.toast-close.svelte-solcu7{margin:0 var(--size-3);border-radius:var(--size-3);padding:0px var(--size-1-5);font-size:var(--size-5);line-height:var(--size-5)}.toast-close.error.svelte-solcu7{color:var(--color-red-700)}.dark .toast-close.error.svelte-solcu7{color:var(--color-red-500)}.toast-close.warning.svelte-solcu7{color:var(--color-yellow-700)}.dark .toast-close.warning.svelte-solcu7{color:var(--color-yellow-500)}.toast-close.info.svelte-solcu7{color:var(--color-grey-700)}.dark .toast-close.info.svelte-solcu7{color:var(--color-grey-500)}.toast-text.svelte-solcu7{font-size:var(--text-lg)}.toast-text.error.svelte-solcu7{color:var(--color-red-700)}.dark .toast-text.error.svelte-solcu7{color:var(--color-red-50)}.toast-text.warning.svelte-solcu7{color:var(--color-yellow-700)}.dark .toast-text.warning.svelte-solcu7{color:var(--color-yellow-50)}.toast-text.info.svelte-solcu7{color:var(--color-grey-700)}.dark .toast-text.info.svelte-solcu7{color:var(--color-grey-50)}.toast-details.svelte-solcu7{margin:var(--size-3) var(--size-3) var(--size-3) 0;width:100%}.toast-icon.svelte-solcu7{display:flex;position:absolute;position:relative;flex-shrink:0;justify-content:center;align-items:center;margin:var(--size-2);border-radius:var(--radius-full);padding:var(--size-1);padding-left:calc(var(--size-1) - 1px);width:35px;height:35px}.toast-icon.error.svelte-solcu7{color:var(--color-red-700)}.dark .toast-icon.error.svelte-solcu7{color:var(--color-red-500)}.toast-icon.warning.svelte-solcu7{color:var(--color-yellow-700)}.dark .toast-icon.warning.svelte-solcu7{color:var(--color-yellow-500)}.toast-icon.info.svelte-solcu7{color:var(--color-grey-700)}.dark .toast-icon.info.svelte-solcu7{color:var(--color-grey-500)}@keyframes svelte-solcu7-countdown{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.timer.svelte-solcu7{position:absolute;bottom:0;left:0;transform-origin:0 0;animation:svelte-solcu7-countdown 10s linear forwards;width:100%;height:var(--size-1)}.timer.error.svelte-solcu7{background:var(--color-red-700)}.dark .timer.error.svelte-solcu7{background:var(--color-red-500)}.timer.warning.svelte-solcu7{background:var(--color-yellow-700)}.dark .timer.warning.svelte-solcu7{background:var(--color-yellow-500)}.timer.info.svelte-solcu7{background:var(--color-grey-700)}.dark .timer.info.svelte-solcu7{background:var(--color-grey-500)}.toast-wrap.svelte-gatr8h{display:flex;position:fixed;top:var(--size-4);right:var(--size-4);flex-direction:column;align-items:end;gap:var(--size-2);z-index:var(--layer-top);width:calc(100% - var(--size-8))}@media (--screen-sm){.toast-wrap.svelte-gatr8h{width:calc(var(--size-96) + var(--size-10))}}.gallery.svelte-84cxb8{padding:var(--size-1) var(--size-2)}div.svelte-84cxb8{overflow:hidden;min-width:var(--local-text-width);white-space:nowrap}label.svelte-18tqgac.svelte-18tqgac{display:block;width:100%}input.svelte-18tqgac.svelte-18tqgac,textarea.svelte-18tqgac.svelte-18tqgac{display:block;position:relative;outline:none!important;box-shadow:var(--input-shadow);background:var(--input-background-fill);padding:var(--input-padding);width:100%;color:var(--body-text-color);font-weight:var(--input-text-weight);font-size:var(--input-text-size);line-height:var(--line-sm);border:none}label.svelte-18tqgac.svelte-18tqgac:not(.container),label.svelte-18tqgac:not(.container)>input.svelte-18tqgac,label.svelte-18tqgac:not(.container)>textarea.svelte-18tqgac{height:100%}.container.svelte-18tqgac>input.svelte-18tqgac,.container.svelte-18tqgac>textarea.svelte-18tqgac{border:var(--input-border-width) solid var(--input-border-color);border-radius:var(--input-radius)}input.svelte-18tqgac.svelte-18tqgac:disabled,textarea.svelte-18tqgac.svelte-18tqgac:disabled{-webkit-text-fill-color:var(--body-text-color);-webkit-opacity:1;opacity:1}input.svelte-18tqgac.svelte-18tqgac:focus,textarea.svelte-18tqgac.svelte-18tqgac:focus{box-shadow:var(--input-shadow-focus);border-color:var(--input-border-color-focus)}input.svelte-18tqgac.svelte-18tqgac::placeholder,textarea.svelte-18tqgac.svelte-18tqgac::placeholder{color:var(--input-placeholder-color)}button.svelte-18tqgac.svelte-18tqgac{display:flex;position:absolute;top:var(--block-label-margin);right:var(--block-label-margin);align-items:center;box-shadow:var(--shadow-drop);border:1px solid var(--color-border-primary);border-top:none;border-right:none;border-radius:var(--block-label-right-radius);background:var(--block-label-background-fill);padding:5px;width:22px;height:22px;overflow:hidden;color:var(--block-label-color);font:var(--font-sans);font-size:var(--button-small-text-size)}
src/backend/gradio_cofoldinginput/templates/example/index.js ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const {
2
+ SvelteComponent: y,
3
+ add_iframe_resize_listener: b,
4
+ add_render_callback: v,
5
+ append: m,
6
+ attr: h,
7
+ binding_callbacks: p,
8
+ detach: w,
9
+ element: z,
10
+ init: k,
11
+ insert: E,
12
+ noop: c,
13
+ safe_not_equal: S,
14
+ set_data: q,
15
+ text: C,
16
+ toggle_class: r
17
+ } = window.__gradio__svelte__internal, { onMount: M } = window.__gradio__svelte__internal;
18
+ function P(t) {
19
+ let e, n = (
20
+ /*value*/
21
+ (t[0] ? (
22
+ /*value*/
23
+ t[0]
24
+ ) : "") + ""
25
+ ), _, d;
26
+ return {
27
+ c() {
28
+ e = z("div"), _ = C(n), h(e, "class", "svelte-84cxb8"), v(() => (
29
+ /*div_elementresize_handler*/
30
+ t[5].call(e)
31
+ )), r(
32
+ e,
33
+ "table",
34
+ /*type*/
35
+ t[1] === "table"
36
+ ), r(
37
+ e,
38
+ "gallery",
39
+ /*type*/
40
+ t[1] === "gallery"
41
+ ), r(
42
+ e,
43
+ "selected",
44
+ /*selected*/
45
+ t[2]
46
+ );
47
+ },
48
+ m(l, s) {
49
+ E(l, e, s), m(e, _), d = b(
50
+ e,
51
+ /*div_elementresize_handler*/
52
+ t[5].bind(e)
53
+ ), t[6](e);
54
+ },
55
+ p(l, [s]) {
56
+ s & /*value*/
57
+ 1 && n !== (n = /*value*/
58
+ (l[0] ? (
59
+ /*value*/
60
+ l[0]
61
+ ) : "") + "") && q(_, n), s & /*type*/
62
+ 2 && r(
63
+ e,
64
+ "table",
65
+ /*type*/
66
+ l[1] === "table"
67
+ ), s & /*type*/
68
+ 2 && r(
69
+ e,
70
+ "gallery",
71
+ /*type*/
72
+ l[1] === "gallery"
73
+ ), s & /*selected*/
74
+ 4 && r(
75
+ e,
76
+ "selected",
77
+ /*selected*/
78
+ l[2]
79
+ );
80
+ },
81
+ i: c,
82
+ o: c,
83
+ d(l) {
84
+ l && w(e), d(), t[6](null);
85
+ }
86
+ };
87
+ }
88
+ function W(t, e, n) {
89
+ let { value: _ } = e, { type: d } = e, { selected: l = !1 } = e, s, a;
90
+ function f(i, u) {
91
+ !i || !u || (a.style.setProperty("--local-text-width", `${u < 150 ? u : 200}px`), n(4, a.style.whiteSpace = "unset", a));
92
+ }
93
+ M(() => {
94
+ f(a, s);
95
+ });
96
+ function o() {
97
+ s = this.clientWidth, n(3, s);
98
+ }
99
+ function g(i) {
100
+ p[i ? "unshift" : "push"](() => {
101
+ a = i, n(4, a);
102
+ });
103
+ }
104
+ return t.$$set = (i) => {
105
+ "value" in i && n(0, _ = i.value), "type" in i && n(1, d = i.type), "selected" in i && n(2, l = i.selected);
106
+ }, [_, d, l, s, a, o, g];
107
+ }
108
+ class j extends y {
109
+ constructor(e) {
110
+ super(), k(this, e, W, P, S, { value: 0, type: 1, selected: 2 });
111
+ }
112
+ }
113
+ export {
114
+ j as default
115
+ };
src/backend/gradio_cofoldinginput/templates/example/style.css ADDED
@@ -0,0 +1 @@
 
 
1
+ .gallery.svelte-84cxb8{padding:var(--size-1) var(--size-2)}div.svelte-84cxb8{overflow:hidden;min-width:var(--local-text-width);white-space:nowrap}
src/demo/__init__.py ADDED
File without changes
src/demo/app.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import gradio as gr
3
+ from gradio_cofoldinginput import CofoldingInput
4
+
5
+ import json
6
+
7
+
8
+ def predict(input):
9
+ input = json.dumps(input)
10
+ return input
11
+
12
+ with gr.Blocks() as demo:
13
+ inp=CofoldingInput(label="Input")
14
+
15
+ # preinput = {"chains": [
16
+ # {
17
+ # "class": "DNA",
18
+ # "sequence": "ATGCGT",
19
+ # "chain": "A"
20
+ # }
21
+ # ], "covMods":[]
22
+ # }
23
+ # inp2=CofoldingInput(preinput, label="Input prefilled")
24
+ btn = gr.Button("Submit")
25
+ out = gr.HTML()
26
+
27
+ btn.click(predict, inputs=[inp], outputs=[out])
28
+
29
+ if __name__ == "__main__":
30
+ demo.launch()
src/demo/css.css ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ html {
2
+ font-family: Inter;
3
+ font-size: 16px;
4
+ font-weight: 400;
5
+ line-height: 1.5;
6
+ -webkit-text-size-adjust: 100%;
7
+ background: #fff;
8
+ color: #323232;
9
+ -webkit-font-smoothing: antialiased;
10
+ -moz-osx-font-smoothing: grayscale;
11
+ text-rendering: optimizeLegibility;
12
+ }
13
+
14
+ :root {
15
+ --space: 1;
16
+ --vspace: calc(var(--space) * 1rem);
17
+ --vspace-0: calc(3 * var(--space) * 1rem);
18
+ --vspace-1: calc(2 * var(--space) * 1rem);
19
+ --vspace-2: calc(1.5 * var(--space) * 1rem);
20
+ --vspace-3: calc(0.5 * var(--space) * 1rem);
21
+ }
22
+
23
+ .app {
24
+ max-width: 748px !important;
25
+ }
26
+
27
+ .prose p {
28
+ margin: var(--vspace) 0;
29
+ line-height: var(--vspace * 2);
30
+ font-size: 1rem;
31
+ }
32
+
33
+ code {
34
+ font-family: "Inconsolata", sans-serif;
35
+ font-size: 16px;
36
+ }
37
+
38
+ h1,
39
+ h1 code {
40
+ font-weight: 400;
41
+ line-height: calc(2.5 / var(--space) * var(--vspace));
42
+ }
43
+
44
+ h1 code {
45
+ background: none;
46
+ border: none;
47
+ letter-spacing: 0.05em;
48
+ padding-bottom: 5px;
49
+ position: relative;
50
+ padding: 0;
51
+ }
52
+
53
+ h2 {
54
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
55
+ line-height: 1em;
56
+ }
57
+
58
+ h3,
59
+ h3 code {
60
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
61
+ line-height: 1em;
62
+ }
63
+
64
+ h4,
65
+ h5,
66
+ h6 {
67
+ margin: var(--vspace-3) 0 var(--vspace-3) 0;
68
+ line-height: var(--vspace);
69
+ }
70
+
71
+ .bigtitle,
72
+ h1,
73
+ h1 code {
74
+ font-size: calc(8px * 4.5);
75
+ word-break: break-word;
76
+ }
77
+
78
+ .title,
79
+ h2,
80
+ h2 code {
81
+ font-size: calc(8px * 3.375);
82
+ font-weight: lighter;
83
+ word-break: break-word;
84
+ border: none;
85
+ background: none;
86
+ }
87
+
88
+ .subheading1,
89
+ h3,
90
+ h3 code {
91
+ font-size: calc(8px * 1.8);
92
+ font-weight: 600;
93
+ border: none;
94
+ background: none;
95
+ letter-spacing: 0.1em;
96
+ text-transform: uppercase;
97
+ }
98
+
99
+ h2 code {
100
+ padding: 0;
101
+ position: relative;
102
+ letter-spacing: 0.05em;
103
+ }
104
+
105
+ blockquote {
106
+ font-size: calc(8px * 1.1667);
107
+ font-style: italic;
108
+ line-height: calc(1.1667 * var(--vspace));
109
+ margin: var(--vspace-2) var(--vspace-2);
110
+ }
111
+
112
+ .subheading2,
113
+ h4 {
114
+ font-size: calc(8px * 1.4292);
115
+ text-transform: uppercase;
116
+ font-weight: 600;
117
+ }
118
+
119
+ .subheading3,
120
+ h5 {
121
+ font-size: calc(8px * 1.2917);
122
+ line-height: calc(1.2917 * var(--vspace));
123
+
124
+ font-weight: lighter;
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.15em;
127
+ }
128
+
129
+ h6 {
130
+ font-size: calc(8px * 1.1667);
131
+ font-size: 1.1667em;
132
+ font-weight: normal;
133
+ font-style: italic;
134
+ font-family: "le-monde-livre-classic-byol", serif !important;
135
+ letter-spacing: 0px !important;
136
+ }
137
+
138
+ #start .md > *:first-child {
139
+ margin-top: 0;
140
+ }
141
+
142
+ h2 + h3 {
143
+ margin-top: 0;
144
+ }
145
+
146
+ .md hr {
147
+ border: none;
148
+ border-top: 1px solid var(--block-border-color);
149
+ margin: var(--vspace-2) 0 var(--vspace-2) 0;
150
+ }
151
+ .prose ul {
152
+ margin: var(--vspace-2) 0 var(--vspace-1) 0;
153
+ }
154
+
155
+ .gap {
156
+ gap: 0;
157
+ }
src/demo/heme.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"m":[{"a":[{"x":-2.161,"y":-0.125,"z":0.49},{"x":1.458,"y":-3.419,"z":0.306},{"x":4.701,"y":0.169,"z":-0.069},{"x":1.075,"y":3.46,"z":0.018},{"x":-1.436,"y":-1.305,"z":0.38},{"x":-2.015,"y":-2.587,"z":0.32},{"x":-1.009,"y":-3.5,"z":0.27},{"x":0.216,"y":-2.803,"z":0.298},{"x":-1.175,"y":-4.996,"z":0.197},{"x":-3.49,"y":-2.893,"z":0.314},{"x":-3.998,"y":-2.926,"z":-1.129},{"x":-5.473,"y":-3.232,"z":-1.136},{"x":-6.059,"y":-3.405,"z":-0.094,"l":"O"},{"x":-6.137,"y":-3.311,"z":-2.3,"l":"O"},{"x":2.664,"y":-2.707,"z":0.308},{"x":3.937,"y":-3.328,"z":0.418},{"x":4.874,"y":-2.341,"z":0.314},{"x":4.117,"y":-1.079,"z":0.139},{"x":4.203,"y":-4.798,"z":0.613},{"x":6.339,"y":-2.497,"z":0.365},{"x":6.935,"y":-3.419,"z":-0.385},{"x":3.964,"y":1.345,"z":-0.174},{"x":4.531,"y":2.601,"z":-0.445},{"x":3.51,"y":3.536,"z":-0.437},{"x":2.304,"y":2.846,"z":-0.139},{"x":5.991,"y":2.88,"z":-0.697},{"x":3.649,"y":4.981,"z":-0.692},{"x":4.201,"y":5.407,"z":-1.823},{"x":-0.102,"y":2.753,"z":0.298},{"x":-1.382,"y":3.388,"z":0.641},{"x":-2.283,"y":2.389,"z":0.774},{"x":-1.561,"y":1.137,"z":0.511},{"x":-1.639,"y":4.863,"z":0.811},{"x":-3.741,"y":2.532,"z":1.123},{"x":-4.573,"y":2.563,"z":-0.16},{"x":-6.032,"y":2.706,"z":0.189},{"x":-6.372,"y":2.776,"z":1.347,"l":"O"},{"x":-6.954,"y":2.755,"z":-0.785,"l":"O"},{"x":-0.068,"y":-1.456,"z":0.321,"l":"N"},{"x":2.82,"y":-1.386,"z":0.207,"l":"N"},{"x":2.604,"y":1.506,"z":-0.033,"l":"N"},{"x":-0.276,"y":1.431,"z":0.298,"l":"N"},{"x":1.01,"y":0.157,"z":-0.06,"l":"Fe"},{"x":1.498,"y":-4.508,"z":0.309,"l":"H"},{"x":5.786,"y":0.229,"z":-0.153,"l":"H"},{"x":1.018,"y":4.543,"z":-0.083,"l":"H"},{"x":-1.22,"y":-5.306,"z":-0.847,"l":"H"},{"x":-0.328,"y":-5.48,"z":0.683,"l":"H"},{"x":-2.097,"y":-5.285,"z":0.702,"l":"H"},{"x":-3.662,"y":-3.862,"z":0.782,"l":"H"},{"x":-4.024,"y":-2.121,"z":0.869,"l":"H"},{"x":-3.825,"y":-1.956,"z":-1.597,"l":"H"},{"x":-3.464,"y":-3.697,"z":-1.684,"l":"H"},{"x":3.256,"y":-5.336,"z":0.66,"l":"H"},{"x":4.794,"y":-5.175,"z":-0.222,"l":"H"},{"x":4.752,"y":-4.948,"z":1.543,"l":"H"},{"x":6.927,"y":-1.863,"z":1.011,"l":"H"},{"x":7.994,"y":-3.6,"z":-0.277,"l":"H"},{"x":6.36,"y":-3.987,"z":-1.102,"l":"H"},{"x":6.554,"y":1.949,"z":-0.639,"l":"H"},{"x":6.11,"y":3.316,"z":-1.689,"l":"H"},{"x":6.362,"y":3.578,"z":0.053,"l":"H"},{"x":3.303,"y":5.694,"z":0.042,"l":"H"},{"x":4.614,"y":4.696,"z":-2.523,"l":"H"},{"x":4.235,"y":6.464,"z":-2.043,"l":"H"},{"x":-0.715,"y":5.415,"z":0.639,"l":"H"},{"x":-2.394,"y":5.185,"z":0.094,"l":"H"},{"x":-1.994,"y":5.055,"z":1.824,"l":"H"},{"x":-4.052,"y":1.687,"z":1.738,"l":"H"},{"x":-3.893,"y":3.459,"z":1.677,"l":"H"},{"x":-4.262,"y":3.408,"z":-0.775,"l":"H"},{"x":-4.421,"y":1.636,"z":-0.714,"l":"H"},{"x":-7.082,"y":-3.51,"z":-2.254,"l":"H"},{"x":-7.877,"y":2.847,"z":-0.512,"l":"H"},{"x":-3.246,"y":-0.188,"z":0.567,"l":"H"}],"b":[{"b":0,"e":4},{"b":0,"e":31,"o":2},{"b":0,"e":74},{"b":1,"e":7},{"b":1,"e":14,"o":2},{"b":1,"e":43},{"b":2,"e":17},{"b":2,"e":21,"o":2},{"b":2,"e":44},{"b":3,"e":24,"o":2},{"b":3,"e":28},{"b":3,"e":45},{"b":4,"e":5,"o":2},{"b":4,"e":38},{"b":5,"e":6},{"b":5,"e":9},{"b":6,"e":7,"o":2},{"b":6,"e":8},{"b":7,"e":38},{"b":8,"e":46},{"b":8,"e":47},{"b":8,"e":48},{"b":9,"e":10},{"b":9,"e":49},{"b":9,"e":50},{"b":10,"e":11},{"b":10,"e":51},{"b":10,"e":52},{"b":11,"e":12,"o":2},{"b":11,"e":13},{"b":13,"e":72},{"b":14,"e":15},{"b":14,"e":39},{"b":15,"e":16,"o":2},{"b":15,"e":18},{"b":16,"e":17},{"b":16,"e":19},{"b":17,"e":39,"o":2},{"b":18,"e":53},{"b":18,"e":54},{"b":18,"e":55},{"b":19,"e":20,"o":2},{"b":19,"e":56},{"b":20,"e":57},{"b":20,"e":58},{"b":21,"e":22},{"b":21,"e":40},{"b":22,"e":23,"o":2},{"b":22,"e":25},{"b":23,"e":24},{"b":23,"e":26},{"b":24,"e":40},{"b":25,"e":59},{"b":25,"e":60},{"b":25,"e":61},{"b":26,"e":27,"o":2},{"b":26,"e":62},{"b":27,"e":63},{"b":27,"e":64},{"b":28,"e":29},{"b":28,"e":41,"o":2},{"b":29,"e":30,"o":2},{"b":29,"e":32},{"b":30,"e":31},{"b":30,"e":33},{"b":31,"e":41},{"b":32,"e":65},{"b":32,"e":66},{"b":32,"e":67},{"b":33,"e":34},{"b":33,"e":68},{"b":33,"e":69},{"b":34,"e":35},{"b":34,"e":70},{"b":34,"e":71},{"b":35,"e":36,"o":2},{"b":35,"e":37},{"b":37,"e":73},{"b":38,"e":42},{"b":39,"e":42},{"b":40,"e":42},{"b":41,"e":42}]}]}
src/demo/heme.sdf ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ OpenBabel03282415433D
3
+
4
+ 75 82 0 0 0 0 0 0 0 0999 V2000
5
+ -2.1610 -0.1250 0.4900 C 0 0 0 0 0 0 0 0 0 0 0 0
6
+ 1.4580 -3.4190 0.3060 C 0 0 0 0 0 0 0 0 0 0 0 0
7
+ 4.7010 0.1690 -0.0690 C 0 0 0 0 0 0 0 0 0 0 0 0
8
+ 1.0750 3.4600 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0
9
+ -1.4360 -1.3050 0.3800 C 0 0 0 0 0 0 0 0 0 0 0 0
10
+ -2.0150 -2.5870 0.3200 C 0 0 0 0 0 0 0 0 0 0 0 0
11
+ -1.0090 -3.5000 0.2700 C 0 0 0 0 0 0 0 0 0 0 0 0
12
+ 0.2160 -2.8030 0.2980 C 0 0 0 0 0 0 0 0 0 0 0 0
13
+ -1.1750 -4.9960 0.1970 C 0 0 0 0 0 0 0 0 0 0 0 0
14
+ -3.4900 -2.8930 0.3140 C 0 0 0 0 0 0 0 0 0 0 0 0
15
+ -3.9980 -2.9260 -1.1290 C 0 0 0 0 0 0 0 0 0 0 0 0
16
+ -5.4730 -3.2320 -1.1360 C 0 0 0 0 0 0 0 0 0 0 0 0
17
+ -6.0590 -3.4050 -0.0940 O 0 0 0 0 0 0 0 0 0 0 0 0
18
+ -6.1370 -3.3110 -2.3000 O 0 0 0 0 0 0 0 0 0 0 0 0
19
+ 2.6640 -2.7070 0.3080 C 0 0 0 0 0 0 0 0 0 0 0 0
20
+ 3.9370 -3.3280 0.4180 C 0 0 0 0 0 0 0 0 0 0 0 0
21
+ 4.8740 -2.3410 0.3140 C 0 0 0 0 0 0 0 0 0 0 0 0
22
+ 4.1170 -1.0790 0.1390 C 0 0 0 0 0 0 0 0 0 0 0 0
23
+ 4.2030 -4.7980 0.6130 C 0 0 0 0 0 0 0 0 0 0 0 0
24
+ 6.3390 -2.4970 0.3650 C 0 0 0 0 0 0 0 0 0 0 0 0
25
+ 6.9350 -3.4190 -0.3850 C 0 0 0 0 0 0 0 0 0 0 0 0
26
+ 3.9640 1.3450 -0.1740 C 0 0 0 0 0 0 0 0 0 0 0 0
27
+ 4.5310 2.6010 -0.4450 C 0 0 0 0 0 0 0 0 0 0 0 0
28
+ 3.5100 3.5360 -0.4370 C 0 0 0 0 0 0 0 0 0 0 0 0
29
+ 2.3040 2.8460 -0.1390 C 0 0 0 0 0 0 0 0 0 0 0 0
30
+ 5.9910 2.8800 -0.6970 C 0 0 0 0 0 0 0 0 0 0 0 0
31
+ 3.6490 4.9810 -0.6920 C 0 0 0 0 0 0 0 0 0 0 0 0
32
+ 4.2010 5.4070 -1.8230 C 0 0 0 0 0 0 0 0 0 0 0 0
33
+ -0.1020 2.7530 0.2980 C 0 0 0 0 0 0 0 0 0 0 0 0
34
+ -1.3820 3.3880 0.6410 C 0 0 0 0 0 0 0 0 0 0 0 0
35
+ -2.2830 2.3890 0.7740 C 0 0 0 0 0 0 0 0 0 0 0 0
36
+ -1.5610 1.1370 0.5110 C 0 0 0 0 0 0 0 0 0 0 0 0
37
+ -1.6390 4.8630 0.8110 C 0 0 0 0 0 0 0 0 0 0 0 0
38
+ -3.7410 2.5320 1.1230 C 0 0 0 0 0 0 0 0 0 0 0 0
39
+ -4.5730 2.5630 -0.1600 C 0 0 0 0 0 0 0 0 0 0 0 0
40
+ -6.0320 2.7060 0.1890 C 0 0 0 0 0 0 0 0 0 0 0 0
41
+ -6.3720 2.7760 1.3470 O 0 0 0 0 0 0 0 0 0 0 0 0
42
+ -6.9540 2.7550 -0.7850 O 0 0 0 0 0 0 0 0 0 0 0 0
43
+ -0.0680 -1.4560 0.3210 N 0 0 0 0 0 0 0 0 0 0 0 0
44
+ 2.8200 -1.3860 0.2070 N 0 0 0 0 0 4 0 0 0 0 0 0
45
+ 2.6040 1.5060 -0.0330 N 0 0 0 0 0 0 0 0 0 0 0 0
46
+ -0.2760 1.4310 0.2980 N 0 0 0 0 0 4 0 0 0 0 0 0
47
+ 1.0100 0.1570 -0.0600 Fe 0 0 1 0 0 0 0 0 0 0 0 0
48
+ 1.4980 -4.5080 0.3090 H 0 0 0 0 0 0 0 0 0 0 0 0
49
+ 5.7860 0.2290 -0.1530 H 0 0 0 0 0 0 0 0 0 0 0 0
50
+ 1.0180 4.5430 -0.0830 H 0 0 0 0 0 0 0 0 0 0 0 0
51
+ -1.2200 -5.3060 -0.8470 H 0 0 0 0 0 0 0 0 0 0 0 0
52
+ -0.3280 -5.4800 0.6830 H 0 0 0 0 0 0 0 0 0 0 0 0
53
+ -2.0970 -5.2850 0.7020 H 0 0 0 0 0 0 0 0 0 0 0 0
54
+ -3.6620 -3.8620 0.7820 H 0 0 0 0 0 0 0 0 0 0 0 0
55
+ -4.0240 -2.1210 0.8690 H 0 0 0 0 0 0 0 0 0 0 0 0
56
+ -3.8250 -1.9560 -1.5970 H 0 0 0 0 0 0 0 0 0 0 0 0
57
+ -3.4640 -3.6970 -1.6840 H 0 0 0 0 0 0 0 0 0 0 0 0
58
+ 3.2560 -5.3360 0.6600 H 0 0 0 0 0 0 0 0 0 0 0 0
59
+ 4.7940 -5.1750 -0.2220 H 0 0 0 0 0 0 0 0 0 0 0 0
60
+ 4.7520 -4.9480 1.5430 H 0 0 0 0 0 0 0 0 0 0 0 0
61
+ 6.9270 -1.8630 1.0110 H 0 0 0 0 0 0 0 0 0 0 0 0
62
+ 7.9940 -3.6000 -0.2770 H 0 0 0 0 0 0 0 0 0 0 0 0
63
+ 6.3600 -3.9870 -1.1020 H 0 0 0 0 0 0 0 0 0 0 0 0
64
+ 6.5540 1.9490 -0.6390 H 0 0 0 0 0 0 0 0 0 0 0 0
65
+ 6.1100 3.3160 -1.6890 H 0 0 0 0 0 0 0 0 0 0 0 0
66
+ 6.3620 3.5780 0.0530 H 0 0 0 0 0 0 0 0 0 0 0 0
67
+ 3.3030 5.6940 0.0420 H 0 0 0 0 0 0 0 0 0 0 0 0
68
+ 4.6140 4.6960 -2.5230 H 0 0 0 0 0 0 0 0 0 0 0 0
69
+ 4.2350 6.4640 -2.0430 H 0 0 0 0 0 0 0 0 0 0 0 0
70
+ -0.7150 5.4150 0.6390 H 0 0 0 0 0 0 0 0 0 0 0 0
71
+ -2.3940 5.1850 0.0940 H 0 0 0 0 0 0 0 0 0 0 0 0
72
+ -1.9940 5.0550 1.8240 H 0 0 0 0 0 0 0 0 0 0 0 0
73
+ -4.0520 1.6870 1.7380 H 0 0 0 0 0 0 0 0 0 0 0 0
74
+ -3.8930 3.4590 1.6770 H 0 0 0 0 0 0 0 0 0 0 0 0
75
+ -4.2620 3.4080 -0.7750 H 0 0 0 0 0 0 0 0 0 0 0 0
76
+ -4.4210 1.6360 -0.7140 H 0 0 0 0 0 0 0 0 0 0 0 0
77
+ -7.0820 -3.5100 -2.2540 H 0 0 0 0 0 0 0 0 0 0 0 0
78
+ -7.8770 2.8470 -0.5120 H 0 0 0 0 0 0 0 0 0 0 0 0
79
+ -3.2460 -0.1880 0.5670 H 0 0 0 0 0 0 0 0 0 0 0 0
80
+ 1 5 1 0 0 0 0
81
+ 1 32 2 0 0 0 0
82
+ 1 75 1 0 0 0 0
83
+ 2 8 1 0 0 0 0
84
+ 2 15 2 0 0 0 0
85
+ 2 44 1 0 0 0 0
86
+ 3 18 1 0 0 0 0
87
+ 3 22 2 0 0 0 0
88
+ 3 45 1 0 0 0 0
89
+ 4 25 2 0 0 0 0
90
+ 4 29 1 0 0 0 0
91
+ 4 46 1 0 0 0 0
92
+ 5 6 2 0 0 0 0
93
+ 5 39 1 0 0 0 0
94
+ 6 7 1 0 0 0 0
95
+ 6 10 1 0 0 0 0
96
+ 7 8 2 0 0 0 0
97
+ 7 9 1 0 0 0 0
98
+ 8 39 1 0 0 0 0
99
+ 9 47 1 0 0 0 0
100
+ 9 48 1 0 0 0 0
101
+ 9 49 1 0 0 0 0
102
+ 10 11 1 0 0 0 0
103
+ 10 50 1 0 0 0 0
104
+ 10 51 1 0 0 0 0
105
+ 11 12 1 0 0 0 0
106
+ 11 52 1 0 0 0 0
107
+ 11 53 1 0 0 0 0
108
+ 12 13 2 0 0 0 0
109
+ 12 14 1 0 0 0 0
110
+ 14 73 1 0 0 0 0
111
+ 15 16 1 0 0 0 0
112
+ 15 40 1 0 0 0 0
113
+ 16 17 2 0 0 0 0
114
+ 16 19 1 0 0 0 0
115
+ 17 18 1 0 0 0 0
116
+ 17 20 1 0 0 0 0
117
+ 18 40 2 0 0 0 0
118
+ 19 54 1 0 0 0 0
119
+ 19 55 1 0 0 0 0
120
+ 19 56 1 0 0 0 0
121
+ 20 21 2 0 0 0 0
122
+ 20 57 1 0 0 0 0
123
+ 21 58 1 0 0 0 0
124
+ 21 59 1 0 0 0 0
125
+ 22 23 1 0 0 0 0
126
+ 22 41 1 0 0 0 0
127
+ 23 24 2 0 0 0 0
128
+ 23 26 1 0 0 0 0
129
+ 24 25 1 0 0 0 0
130
+ 24 27 1 0 0 0 0
131
+ 25 41 1 0 0 0 0
132
+ 26 60 1 0 0 0 0
133
+ 26 61 1 0 0 0 0
134
+ 26 62 1 0 0 0 0
135
+ 27 28 2 0 0 0 0
136
+ 27 63 1 0 0 0 0
137
+ 28 64 1 0 0 0 0
138
+ 28 65 1 0 0 0 0
139
+ 29 30 1 0 0 0 0
140
+ 29 42 2 0 0 0 0
141
+ 30 31 2 0 0 0 0
142
+ 30 33 1 0 0 0 0
143
+ 31 32 1 0 0 0 0
144
+ 31 34 1 0 0 0 0
145
+ 32 42 1 0 0 0 0
146
+ 33 66 1 0 0 0 0
147
+ 33 67 1 0 0 0 0
148
+ 33 68 1 0 0 0 0
149
+ 34 35 1 0 0 0 0
150
+ 34 69 1 0 0 0 0
151
+ 34 70 1 0 0 0 0
152
+ 35 36 1 0 0 0 0
153
+ 35 71 1 0 0 0 0
154
+ 35 72 1 0 0 0 0
155
+ 36 37 2 0 0 0 0
156
+ 36 38 1 0 0 0 0
157
+ 38 74 1 0 0 0 0
158
+ 40 43 1 0 0 0 0
159
+ 41 43 1 0 0 0 0
160
+ 42 43 1 0 0 0 0
161
+ 43 39 1 6 0 0 0
162
+ M END
163
+ $$$$
src/demo/space.py ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import gradio as gr
3
+ from app import demo as app
4
+ import os
5
+
6
+ _docs = {'CofoldingInput': {'description': 'Creates a textarea for user to enter string input or display string output.\n', 'members': {'__init__': {'value': {'type': 'dict | None', 'default': '{"chains": [], "covMods": []}', 'description': 'list of items.'}, 'label': {'type': 'str | None', 'default': 'None', 'description': 'The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.'}, 'info': {'type': 'str | None', 'default': 'None', 'description': 'additional component description.'}, 'every': {'type': 'float | None', 'default': 'None', 'description': "If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute."}, 'show_label': {'type': 'bool | None', 'default': 'None', 'description': 'if True, will display label.'}, 'container': {'type': 'bool', 'default': 'True', 'description': 'If True, will place the component in a container - providing some extra padding around the border.'}, 'scale': {'type': 'int | None', 'default': 'None', 'description': 'relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.'}, 'min_width': {'type': 'int', 'default': '160', 'description': 'minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.'}, 'interactive': {'type': 'bool | None', 'default': 'None', 'description': 'if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output.'}, 'visible': {'type': 'bool', 'default': 'True', 'description': 'If False, component will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'autofocus': {'type': 'bool', 'default': 'False', 'description': 'If True, will focus on the textbox when the page loads. Use this carefully, as it can cause usability issues for sighted and non-sighted users.'}, 'autoscroll': {'type': 'bool', 'default': 'True', 'description': None}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {'value': {'type': 'dict | None', 'description': 'Expects a {str} returned from function and sets textarea value to it.'}}, 'preprocess': {}}, 'events': {'change': {'type': None, 'default': None, 'description': 'Triggered when the value of the CofoldingInput changes either because of user input (e.g. a user types in a textbox) OR because of a function update (e.g. an image receives a value from the output of an event trigger). See `.input()` for a listener that is only triggered by user input.'}, 'input': {'type': None, 'default': None, 'description': 'This listener is triggered when the user changes the value of the CofoldingInput.'}, 'select': {'type': None, 'default': None, 'description': 'Event listener for when the user selects or deselects the CofoldingInput. Uses event data gradio.SelectData to carry `value` referring to the label of the CofoldingInput, and `selected` to refer to state of the CofoldingInput. See EventData documentation on how to use this event data'}, 'submit': {'type': None, 'default': None, 'description': 'This listener is triggered when the user presses the Enter key while the CofoldingInput is focused.'}, 'focus': {'type': None, 'default': None, 'description': 'This listener is triggered when the CofoldingInput is focused.'}, 'blur': {'type': None, 'default': None, 'description': 'This listener is triggered when the CofoldingInput is unfocused/blurred.'}}}, '__meta__': {'additional_interfaces': {}, 'user_fn_refs': {'CofoldingInput': []}}}
7
+
8
+ abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
+
10
+ with gr.Blocks(
11
+ css=abs_path,
12
+ theme=gr.themes.Default(
13
+ font_mono=[
14
+ gr.themes.GoogleFont("Inconsolata"),
15
+ "monospace",
16
+ ],
17
+ ),
18
+ ) as demo:
19
+ gr.Markdown(
20
+ """
21
+ # `gradio_cofoldinginput`
22
+
23
+ <div style="display: flex; gap: 7px;">
24
+ <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.2%20-%20orange">
25
+ </div>
26
+
27
+ Component to enter protein and DNA sequences + small molecules for cofolding
28
+ """, elem_classes=["md-custom"], header_links=True)
29
+ app.render()
30
+ gr.Markdown(
31
+ """
32
+ ## Installation
33
+
34
+ ```bash
35
+ pip install gradio_cofoldinginput
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ ```python
41
+
42
+ import gradio as gr
43
+ from gradio_cofoldinginput import CofoldingInput
44
+
45
+ import json
46
+
47
+
48
+ def predict(input):
49
+ input = json.dumps(input)
50
+ return input
51
+
52
+ with gr.Blocks() as demo:
53
+ inp=CofoldingInput(label="Input")
54
+
55
+ # preinput = {"chains": [
56
+ # {
57
+ # "class": "DNA",
58
+ # "sequence": "ATGCGT",
59
+ # "chain": "A"
60
+ # }
61
+ # ], "covMods":[]
62
+ # }
63
+ # inp2=CofoldingInput(preinput, label="Input prefilled")
64
+ btn = gr.Button("Submit")
65
+ out = gr.HTML()
66
+
67
+ btn.click(predict, inputs=[inp], outputs=[out])
68
+
69
+ if __name__ == "__main__":
70
+ demo.launch()
71
+
72
+ ```
73
+ """, elem_classes=["md-custom"], header_links=True)
74
+
75
+
76
+ gr.Markdown("""
77
+ ## `CofoldingInput`
78
+
79
+ ### Initialization
80
+ """, elem_classes=["md-custom"], header_links=True)
81
+
82
+ gr.ParamViewer(value=_docs["CofoldingInput"]["members"]["__init__"], linkify=[])
83
+
84
+
85
+ gr.Markdown("### Events")
86
+ gr.ParamViewer(value=_docs["CofoldingInput"]["events"], linkify=['Event'])
87
+
88
+
89
+
90
+
91
+ gr.Markdown("""
92
+
93
+ ### User function
94
+
95
+ The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both).
96
+
97
+ - When used as an Input, the component only impacts the input signature of the user function.
98
+ - When used as an output, the component only impacts the return signature of the user function.
99
+
100
+ The code snippet below is accurate in cases where the component is used as both an input and an output.
101
+
102
+ - **As output:** Should return, expects a {str} returned from function and sets textarea value to it.
103
+
104
+ ```python
105
+ def predict(
106
+ value: Unknown
107
+ ) -> dict | None:
108
+ return value
109
+ ```
110
+ """, elem_classes=["md-custom", "CofoldingInput-user-fn"], header_links=True)
111
+
112
+
113
+
114
+
115
+ demo.load(None, js=r"""function() {
116
+ const refs = {};
117
+ const user_fn_refs = {
118
+ CofoldingInput: [], };
119
+ requestAnimationFrame(() => {
120
+
121
+ Object.entries(user_fn_refs).forEach(([key, refs]) => {
122
+ if (refs.length > 0) {
123
+ const el = document.querySelector(`.${key}-user-fn`);
124
+ if (!el) return;
125
+ refs.forEach(ref => {
126
+ el.innerHTML = el.innerHTML.replace(
127
+ new RegExp("\\b"+ref+"\\b", "g"),
128
+ `<a href="#h-${ref.toLowerCase()}">${ref}</a>`
129
+ );
130
+ })
131
+ }
132
+ })
133
+
134
+ Object.entries(refs).forEach(([key, refs]) => {
135
+ if (refs.length > 0) {
136
+ const el = document.querySelector(`.${key}`);
137
+ if (!el) return;
138
+ refs.forEach(ref => {
139
+ el.innerHTML = el.innerHTML.replace(
140
+ new RegExp("\\b"+ref+"\\b", "g"),
141
+ `<a href="#h-${ref.toLowerCase()}">${ref}</a>`
142
+ );
143
+ })
144
+ }
145
+ })
146
+ })
147
+ }
148
+
149
+ """)
150
+
151
+ demo.launch()
src/frontend/Example.svelte ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+
4
+ export let value: string | null;
5
+ export let type: "gallery" | "table";
6
+ export let selected = false;
7
+
8
+ let size: number;
9
+ let el: HTMLDivElement;
10
+
11
+ function set_styles(element: HTMLElement, el_width: number): void {
12
+ if (!element || !el_width) return;
13
+ el.style.setProperty(
14
+ "--local-text-width",
15
+ `${el_width < 150 ? el_width : 200}px`
16
+ );
17
+ el.style.whiteSpace = "unset";
18
+ }
19
+
20
+ onMount(() => {
21
+ set_styles(el, size);
22
+ });
23
+ </script>
24
+
25
+ <div
26
+ bind:clientWidth={size}
27
+ bind:this={el}
28
+ class:table={type === "table"}
29
+ class:gallery={type === "gallery"}
30
+ class:selected
31
+ >
32
+ {value ? value : ""}
33
+ </div>
34
+
35
+ <style>
36
+ .gallery {
37
+ padding: var(--size-1) var(--size-2);
38
+ }
39
+
40
+ div {
41
+ overflow: hidden;
42
+ min-width: var(--local-text-width);
43
+
44
+ white-space: nowrap;
45
+ }
46
+ </style>
src/frontend/Index.svelte ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svelte:options accessors={true} />
2
+
3
+ <script context="module" lang="ts">
4
+ export { default as BaseTextbox } from "./shared/Textbox.svelte";
5
+ export { default as BaseExample } from "./Example.svelte";
6
+ </script>
7
+
8
+ <script lang="ts">
9
+ import { onMount } from "svelte";
10
+ import type { Gradio, SelectData } from "@gradio/utils";
11
+ import { BlockTitle } from "@gradio/atoms";
12
+
13
+ import SequenceInput from "./shared/SequenceInput.svelte";
14
+ import { Block } from "@gradio/atoms";
15
+ import { StatusTracker } from "@gradio/statustracker";
16
+ import type { LoadingStatus } from "@gradio/statustracker";
17
+
18
+ export let gradio: Gradio<{
19
+ change: string;
20
+ submit: never;
21
+ blur: never;
22
+ select: SelectData;
23
+ input: never;
24
+ focus: never;
25
+ }>;
26
+ export let label = "CofoldingInput";
27
+ export let info: string | undefined = undefined;
28
+ export let elem_id = "";
29
+ export let elem_classes: string[] = [];
30
+ export let visible = true;
31
+ export let value = { chains: [], covMods: [] };
32
+ export let show_label: boolean;
33
+ export let container = true;
34
+ export let scale: number | null = null;
35
+ export let min_width: number | undefined = undefined;
36
+ export let loading_status: LoadingStatus | undefined = undefined;
37
+
38
+ function syncValue(event) {
39
+ //remove empty values and open attributes
40
+ let entries = event.detail.map((entry) =>
41
+ Object.fromEntries(
42
+ Object.entries(entry).filter(
43
+ ([key, value]) => key !== "open" && value !== ""
44
+ )
45
+ )
46
+ );
47
+ value["chains"] = entries;
48
+ }
49
+
50
+ function syncCovMod(event) {
51
+ value["covMods"] = event.detail;
52
+ }
53
+
54
+ onMount(() => {});
55
+ </script>
56
+
57
+ <Block
58
+ {visible}
59
+ {elem_id}
60
+ {elem_classes}
61
+ {scale}
62
+ {min_width}
63
+ allow_overflow={false}
64
+ padding={container}
65
+ >
66
+ {#if loading_status}
67
+ <StatusTracker
68
+ autoscroll={gradio.autoscroll}
69
+ i18n={gradio.i18n}
70
+ {...loading_status}
71
+ />
72
+ {/if}
73
+
74
+ <BlockTitle {show_label} {info}>{label}</BlockTitle>
75
+
76
+ <SequenceInput
77
+ bind:value
78
+ on:updateVals={syncValue}
79
+ on:updateCovMod={syncCovMod}
80
+ />
81
+ </Block>
src/frontend/package-lock.json ADDED
@@ -0,0 +1,1697 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "gradio_cofoldinginput",
3
+ "version": "0.4.12",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "gradio_cofoldinginput",
9
+ "version": "0.4.12",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@gradio/atoms": "0.5.3",
13
+ "@gradio/icons": "0.3.3",
14
+ "@gradio/statustracker": "0.4.8",
15
+ "@gradio/utils": "0.3.0",
16
+ "3dmol": "^2.1.0"
17
+ }
18
+ },
19
+ "node_modules/@ampproject/remapping": {
20
+ "version": "2.3.0",
21
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
22
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
23
+ "peer": true,
24
+ "dependencies": {
25
+ "@jridgewell/gen-mapping": "^0.3.5",
26
+ "@jridgewell/trace-mapping": "^0.3.24"
27
+ },
28
+ "engines": {
29
+ "node": ">=6.0.0"
30
+ }
31
+ },
32
+ "node_modules/@esbuild/aix-ppc64": {
33
+ "version": "0.19.12",
34
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
35
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
36
+ "cpu": [
37
+ "ppc64"
38
+ ],
39
+ "optional": true,
40
+ "os": [
41
+ "aix"
42
+ ],
43
+ "engines": {
44
+ "node": ">=12"
45
+ }
46
+ },
47
+ "node_modules/@esbuild/android-arm": {
48
+ "version": "0.19.12",
49
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
50
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
51
+ "cpu": [
52
+ "arm"
53
+ ],
54
+ "optional": true,
55
+ "os": [
56
+ "android"
57
+ ],
58
+ "engines": {
59
+ "node": ">=12"
60
+ }
61
+ },
62
+ "node_modules/@esbuild/android-arm64": {
63
+ "version": "0.19.12",
64
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
65
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
66
+ "cpu": [
67
+ "arm64"
68
+ ],
69
+ "optional": true,
70
+ "os": [
71
+ "android"
72
+ ],
73
+ "engines": {
74
+ "node": ">=12"
75
+ }
76
+ },
77
+ "node_modules/@esbuild/android-x64": {
78
+ "version": "0.19.12",
79
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
80
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
81
+ "cpu": [
82
+ "x64"
83
+ ],
84
+ "optional": true,
85
+ "os": [
86
+ "android"
87
+ ],
88
+ "engines": {
89
+ "node": ">=12"
90
+ }
91
+ },
92
+ "node_modules/@esbuild/darwin-arm64": {
93
+ "version": "0.19.12",
94
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
95
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
96
+ "cpu": [
97
+ "arm64"
98
+ ],
99
+ "optional": true,
100
+ "os": [
101
+ "darwin"
102
+ ],
103
+ "engines": {
104
+ "node": ">=12"
105
+ }
106
+ },
107
+ "node_modules/@esbuild/darwin-x64": {
108
+ "version": "0.19.12",
109
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
110
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
111
+ "cpu": [
112
+ "x64"
113
+ ],
114
+ "optional": true,
115
+ "os": [
116
+ "darwin"
117
+ ],
118
+ "engines": {
119
+ "node": ">=12"
120
+ }
121
+ },
122
+ "node_modules/@esbuild/freebsd-arm64": {
123
+ "version": "0.19.12",
124
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
125
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
126
+ "cpu": [
127
+ "arm64"
128
+ ],
129
+ "optional": true,
130
+ "os": [
131
+ "freebsd"
132
+ ],
133
+ "engines": {
134
+ "node": ">=12"
135
+ }
136
+ },
137
+ "node_modules/@esbuild/freebsd-x64": {
138
+ "version": "0.19.12",
139
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
140
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
141
+ "cpu": [
142
+ "x64"
143
+ ],
144
+ "optional": true,
145
+ "os": [
146
+ "freebsd"
147
+ ],
148
+ "engines": {
149
+ "node": ">=12"
150
+ }
151
+ },
152
+ "node_modules/@esbuild/linux-arm": {
153
+ "version": "0.19.12",
154
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
155
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
156
+ "cpu": [
157
+ "arm"
158
+ ],
159
+ "optional": true,
160
+ "os": [
161
+ "linux"
162
+ ],
163
+ "engines": {
164
+ "node": ">=12"
165
+ }
166
+ },
167
+ "node_modules/@esbuild/linux-arm64": {
168
+ "version": "0.19.12",
169
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
170
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
171
+ "cpu": [
172
+ "arm64"
173
+ ],
174
+ "optional": true,
175
+ "os": [
176
+ "linux"
177
+ ],
178
+ "engines": {
179
+ "node": ">=12"
180
+ }
181
+ },
182
+ "node_modules/@esbuild/linux-ia32": {
183
+ "version": "0.19.12",
184
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
185
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
186
+ "cpu": [
187
+ "ia32"
188
+ ],
189
+ "optional": true,
190
+ "os": [
191
+ "linux"
192
+ ],
193
+ "engines": {
194
+ "node": ">=12"
195
+ }
196
+ },
197
+ "node_modules/@esbuild/linux-loong64": {
198
+ "version": "0.19.12",
199
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
200
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
201
+ "cpu": [
202
+ "loong64"
203
+ ],
204
+ "optional": true,
205
+ "os": [
206
+ "linux"
207
+ ],
208
+ "engines": {
209
+ "node": ">=12"
210
+ }
211
+ },
212
+ "node_modules/@esbuild/linux-mips64el": {
213
+ "version": "0.19.12",
214
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
215
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
216
+ "cpu": [
217
+ "mips64el"
218
+ ],
219
+ "optional": true,
220
+ "os": [
221
+ "linux"
222
+ ],
223
+ "engines": {
224
+ "node": ">=12"
225
+ }
226
+ },
227
+ "node_modules/@esbuild/linux-ppc64": {
228
+ "version": "0.19.12",
229
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
230
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
231
+ "cpu": [
232
+ "ppc64"
233
+ ],
234
+ "optional": true,
235
+ "os": [
236
+ "linux"
237
+ ],
238
+ "engines": {
239
+ "node": ">=12"
240
+ }
241
+ },
242
+ "node_modules/@esbuild/linux-riscv64": {
243
+ "version": "0.19.12",
244
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
245
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
246
+ "cpu": [
247
+ "riscv64"
248
+ ],
249
+ "optional": true,
250
+ "os": [
251
+ "linux"
252
+ ],
253
+ "engines": {
254
+ "node": ">=12"
255
+ }
256
+ },
257
+ "node_modules/@esbuild/linux-s390x": {
258
+ "version": "0.19.12",
259
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
260
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
261
+ "cpu": [
262
+ "s390x"
263
+ ],
264
+ "optional": true,
265
+ "os": [
266
+ "linux"
267
+ ],
268
+ "engines": {
269
+ "node": ">=12"
270
+ }
271
+ },
272
+ "node_modules/@esbuild/linux-x64": {
273
+ "version": "0.19.12",
274
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
275
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
276
+ "cpu": [
277
+ "x64"
278
+ ],
279
+ "optional": true,
280
+ "os": [
281
+ "linux"
282
+ ],
283
+ "engines": {
284
+ "node": ">=12"
285
+ }
286
+ },
287
+ "node_modules/@esbuild/netbsd-x64": {
288
+ "version": "0.19.12",
289
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
290
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
291
+ "cpu": [
292
+ "x64"
293
+ ],
294
+ "optional": true,
295
+ "os": [
296
+ "netbsd"
297
+ ],
298
+ "engines": {
299
+ "node": ">=12"
300
+ }
301
+ },
302
+ "node_modules/@esbuild/openbsd-x64": {
303
+ "version": "0.19.12",
304
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
305
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
306
+ "cpu": [
307
+ "x64"
308
+ ],
309
+ "optional": true,
310
+ "os": [
311
+ "openbsd"
312
+ ],
313
+ "engines": {
314
+ "node": ">=12"
315
+ }
316
+ },
317
+ "node_modules/@esbuild/sunos-x64": {
318
+ "version": "0.19.12",
319
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
320
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
321
+ "cpu": [
322
+ "x64"
323
+ ],
324
+ "optional": true,
325
+ "os": [
326
+ "sunos"
327
+ ],
328
+ "engines": {
329
+ "node": ">=12"
330
+ }
331
+ },
332
+ "node_modules/@esbuild/win32-arm64": {
333
+ "version": "0.19.12",
334
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
335
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
336
+ "cpu": [
337
+ "arm64"
338
+ ],
339
+ "optional": true,
340
+ "os": [
341
+ "win32"
342
+ ],
343
+ "engines": {
344
+ "node": ">=12"
345
+ }
346
+ },
347
+ "node_modules/@esbuild/win32-ia32": {
348
+ "version": "0.19.12",
349
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
350
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
351
+ "cpu": [
352
+ "ia32"
353
+ ],
354
+ "optional": true,
355
+ "os": [
356
+ "win32"
357
+ ],
358
+ "engines": {
359
+ "node": ">=12"
360
+ }
361
+ },
362
+ "node_modules/@esbuild/win32-x64": {
363
+ "version": "0.19.12",
364
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
365
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
366
+ "cpu": [
367
+ "x64"
368
+ ],
369
+ "optional": true,
370
+ "os": [
371
+ "win32"
372
+ ],
373
+ "engines": {
374
+ "node": ">=12"
375
+ }
376
+ },
377
+ "node_modules/@formatjs/ecma402-abstract": {
378
+ "version": "1.11.4",
379
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
380
+ "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
381
+ "dependencies": {
382
+ "@formatjs/intl-localematcher": "0.2.25",
383
+ "tslib": "^2.1.0"
384
+ }
385
+ },
386
+ "node_modules/@formatjs/fast-memoize": {
387
+ "version": "1.2.1",
388
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz",
389
+ "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==",
390
+ "dependencies": {
391
+ "tslib": "^2.1.0"
392
+ }
393
+ },
394
+ "node_modules/@formatjs/icu-messageformat-parser": {
395
+ "version": "2.1.0",
396
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz",
397
+ "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==",
398
+ "dependencies": {
399
+ "@formatjs/ecma402-abstract": "1.11.4",
400
+ "@formatjs/icu-skeleton-parser": "1.3.6",
401
+ "tslib": "^2.1.0"
402
+ }
403
+ },
404
+ "node_modules/@formatjs/icu-skeleton-parser": {
405
+ "version": "1.3.6",
406
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz",
407
+ "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==",
408
+ "dependencies": {
409
+ "@formatjs/ecma402-abstract": "1.11.4",
410
+ "tslib": "^2.1.0"
411
+ }
412
+ },
413
+ "node_modules/@formatjs/intl-localematcher": {
414
+ "version": "0.2.25",
415
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
416
+ "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
417
+ "dependencies": {
418
+ "tslib": "^2.1.0"
419
+ }
420
+ },
421
+ "node_modules/@gradio/atoms": {
422
+ "version": "0.5.3",
423
+ "resolved": "https://registry.npmjs.org/@gradio/atoms/-/atoms-0.5.3.tgz",
424
+ "integrity": "sha512-1HZgmhbAPzCYt6muyttrJi/P5zXTnD3kVMgneXuDd2j9qB21kSqzshmpnPcvDO3lO0vro55HuxgH22PJ1XHWqg==",
425
+ "dependencies": {
426
+ "@gradio/icons": "^0.3.3",
427
+ "@gradio/utils": "^0.3.0"
428
+ }
429
+ },
430
+ "node_modules/@gradio/column": {
431
+ "version": "0.1.0",
432
+ "resolved": "https://registry.npmjs.org/@gradio/column/-/column-0.1.0.tgz",
433
+ "integrity": "sha512-P24nqqVnMXBaDA1f/zSN5HZRho4PxP8Dq+7VltPHlmxIEiZYik2AJ4J0LeuIha34FDO0guu/16evdrpvGIUAfw=="
434
+ },
435
+ "node_modules/@gradio/icons": {
436
+ "version": "0.3.3",
437
+ "resolved": "https://registry.npmjs.org/@gradio/icons/-/icons-0.3.3.tgz",
438
+ "integrity": "sha512-UFTHpjzFJVwaRzZsdslWxnKUPGgtVeErmUGzrG9di4Vn0oHn1FgHt1Yr2SVu4lO3JI/r2u3H49tb6iax4U9HjA=="
439
+ },
440
+ "node_modules/@gradio/statustracker": {
441
+ "version": "0.4.8",
442
+ "resolved": "https://registry.npmjs.org/@gradio/statustracker/-/statustracker-0.4.8.tgz",
443
+ "integrity": "sha512-B/SN7T9BbcdzPrWYfKVxwy3e4u85MS+DAZSeuXgPbAL5n5QravCtvNW7zwkUWb0OlBloaglN3Y7K3M8l1hR5qg==",
444
+ "dependencies": {
445
+ "@gradio/atoms": "^0.5.3",
446
+ "@gradio/column": "^0.1.0",
447
+ "@gradio/icons": "^0.3.3",
448
+ "@gradio/utils": "^0.3.0"
449
+ }
450
+ },
451
+ "node_modules/@gradio/theme": {
452
+ "version": "0.2.0",
453
+ "resolved": "https://registry.npmjs.org/@gradio/theme/-/theme-0.2.0.tgz",
454
+ "integrity": "sha512-33c68Nk7oRXLn08OxPfjcPm7S4tXGOUV1I1bVgzdM2YV5o1QBOS1GEnXPZPu/CEYPePLMB6bsDwffrLEyLGWVQ=="
455
+ },
456
+ "node_modules/@gradio/utils": {
457
+ "version": "0.3.0",
458
+ "resolved": "https://registry.npmjs.org/@gradio/utils/-/utils-0.3.0.tgz",
459
+ "integrity": "sha512-VxP0h7UoWazkdSB875ChvTXWamBwMguuRc+8OyQFZjdj14lcqLEQuj54es3FDBpXOp5GMLFh48Q5FLLjYxMgSg==",
460
+ "dependencies": {
461
+ "@gradio/theme": "^0.2.0",
462
+ "svelte-i18n": "^3.6.0"
463
+ }
464
+ },
465
+ "node_modules/@jridgewell/gen-mapping": {
466
+ "version": "0.3.5",
467
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
468
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
469
+ "peer": true,
470
+ "dependencies": {
471
+ "@jridgewell/set-array": "^1.2.1",
472
+ "@jridgewell/sourcemap-codec": "^1.4.10",
473
+ "@jridgewell/trace-mapping": "^0.3.24"
474
+ },
475
+ "engines": {
476
+ "node": ">=6.0.0"
477
+ }
478
+ },
479
+ "node_modules/@jridgewell/resolve-uri": {
480
+ "version": "3.1.2",
481
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
482
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
483
+ "peer": true,
484
+ "engines": {
485
+ "node": ">=6.0.0"
486
+ }
487
+ },
488
+ "node_modules/@jridgewell/set-array": {
489
+ "version": "1.2.1",
490
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
491
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
492
+ "peer": true,
493
+ "engines": {
494
+ "node": ">=6.0.0"
495
+ }
496
+ },
497
+ "node_modules/@jridgewell/sourcemap-codec": {
498
+ "version": "1.4.15",
499
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
500
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
501
+ "peer": true
502
+ },
503
+ "node_modules/@jridgewell/trace-mapping": {
504
+ "version": "0.3.25",
505
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
506
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
507
+ "peer": true,
508
+ "dependencies": {
509
+ "@jridgewell/resolve-uri": "^3.1.0",
510
+ "@jridgewell/sourcemap-codec": "^1.4.14"
511
+ }
512
+ },
513
+ "node_modules/@types/estree": {
514
+ "version": "1.0.5",
515
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
516
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
517
+ "peer": true
518
+ },
519
+ "node_modules/3dmol": {
520
+ "version": "2.1.0",
521
+ "resolved": "https://registry.npmjs.org/3dmol/-/3dmol-2.1.0.tgz",
522
+ "integrity": "sha512-w1pfTR8+pDtOpxbGDrBWCbOXiTBqLhHO/OQ5xK3nD4trM0OTPCl8opaTl2iyCfwFRUbqmd2I4Qtjw7x9Boe+OA==",
523
+ "dependencies": {
524
+ "iobuffer": "^5.3.1",
525
+ "netcdfjs": "^3.0.0",
526
+ "pako": "^2.1.0",
527
+ "upng-js": "^2.1.0"
528
+ },
529
+ "engines": {
530
+ "node": ">=16.16.0",
531
+ "npm": ">=8.11"
532
+ }
533
+ },
534
+ "node_modules/acorn": {
535
+ "version": "8.11.3",
536
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
537
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
538
+ "peer": true,
539
+ "bin": {
540
+ "acorn": "bin/acorn"
541
+ },
542
+ "engines": {
543
+ "node": ">=0.4.0"
544
+ }
545
+ },
546
+ "node_modules/aria-query": {
547
+ "version": "5.3.0",
548
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
549
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
550
+ "peer": true,
551
+ "dependencies": {
552
+ "dequal": "^2.0.3"
553
+ }
554
+ },
555
+ "node_modules/axobject-query": {
556
+ "version": "4.0.0",
557
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
558
+ "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
559
+ "peer": true,
560
+ "dependencies": {
561
+ "dequal": "^2.0.3"
562
+ }
563
+ },
564
+ "node_modules/cli-color": {
565
+ "version": "2.0.4",
566
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
567
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
568
+ "dependencies": {
569
+ "d": "^1.0.1",
570
+ "es5-ext": "^0.10.64",
571
+ "es6-iterator": "^2.0.3",
572
+ "memoizee": "^0.4.15",
573
+ "timers-ext": "^0.1.7"
574
+ },
575
+ "engines": {
576
+ "node": ">=0.10"
577
+ }
578
+ },
579
+ "node_modules/code-red": {
580
+ "version": "1.0.4",
581
+ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
582
+ "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
583
+ "peer": true,
584
+ "dependencies": {
585
+ "@jridgewell/sourcemap-codec": "^1.4.15",
586
+ "@types/estree": "^1.0.1",
587
+ "acorn": "^8.10.0",
588
+ "estree-walker": "^3.0.3",
589
+ "periscopic": "^3.1.0"
590
+ }
591
+ },
592
+ "node_modules/css-tree": {
593
+ "version": "2.3.1",
594
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
595
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
596
+ "peer": true,
597
+ "dependencies": {
598
+ "mdn-data": "2.0.30",
599
+ "source-map-js": "^1.0.1"
600
+ },
601
+ "engines": {
602
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
603
+ }
604
+ },
605
+ "node_modules/d": {
606
+ "version": "1.0.2",
607
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
608
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
609
+ "dependencies": {
610
+ "es5-ext": "^0.10.64",
611
+ "type": "^2.7.2"
612
+ },
613
+ "engines": {
614
+ "node": ">=0.12"
615
+ }
616
+ },
617
+ "node_modules/deepmerge": {
618
+ "version": "4.3.1",
619
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
620
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
621
+ "engines": {
622
+ "node": ">=0.10.0"
623
+ }
624
+ },
625
+ "node_modules/dequal": {
626
+ "version": "2.0.3",
627
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
628
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
629
+ "peer": true,
630
+ "engines": {
631
+ "node": ">=6"
632
+ }
633
+ },
634
+ "node_modules/es5-ext": {
635
+ "version": "0.10.64",
636
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
637
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
638
+ "hasInstallScript": true,
639
+ "dependencies": {
640
+ "es6-iterator": "^2.0.3",
641
+ "es6-symbol": "^3.1.3",
642
+ "esniff": "^2.0.1",
643
+ "next-tick": "^1.1.0"
644
+ },
645
+ "engines": {
646
+ "node": ">=0.10"
647
+ }
648
+ },
649
+ "node_modules/es6-iterator": {
650
+ "version": "2.0.3",
651
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
652
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
653
+ "dependencies": {
654
+ "d": "1",
655
+ "es5-ext": "^0.10.35",
656
+ "es6-symbol": "^3.1.1"
657
+ }
658
+ },
659
+ "node_modules/es6-symbol": {
660
+ "version": "3.1.4",
661
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
662
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
663
+ "dependencies": {
664
+ "d": "^1.0.2",
665
+ "ext": "^1.7.0"
666
+ },
667
+ "engines": {
668
+ "node": ">=0.12"
669
+ }
670
+ },
671
+ "node_modules/es6-weak-map": {
672
+ "version": "2.0.3",
673
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
674
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
675
+ "dependencies": {
676
+ "d": "1",
677
+ "es5-ext": "^0.10.46",
678
+ "es6-iterator": "^2.0.3",
679
+ "es6-symbol": "^3.1.1"
680
+ }
681
+ },
682
+ "node_modules/esbuild": {
683
+ "version": "0.19.12",
684
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
685
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
686
+ "hasInstallScript": true,
687
+ "bin": {
688
+ "esbuild": "bin/esbuild"
689
+ },
690
+ "engines": {
691
+ "node": ">=12"
692
+ },
693
+ "optionalDependencies": {
694
+ "@esbuild/aix-ppc64": "0.19.12",
695
+ "@esbuild/android-arm": "0.19.12",
696
+ "@esbuild/android-arm64": "0.19.12",
697
+ "@esbuild/android-x64": "0.19.12",
698
+ "@esbuild/darwin-arm64": "0.19.12",
699
+ "@esbuild/darwin-x64": "0.19.12",
700
+ "@esbuild/freebsd-arm64": "0.19.12",
701
+ "@esbuild/freebsd-x64": "0.19.12",
702
+ "@esbuild/linux-arm": "0.19.12",
703
+ "@esbuild/linux-arm64": "0.19.12",
704
+ "@esbuild/linux-ia32": "0.19.12",
705
+ "@esbuild/linux-loong64": "0.19.12",
706
+ "@esbuild/linux-mips64el": "0.19.12",
707
+ "@esbuild/linux-ppc64": "0.19.12",
708
+ "@esbuild/linux-riscv64": "0.19.12",
709
+ "@esbuild/linux-s390x": "0.19.12",
710
+ "@esbuild/linux-x64": "0.19.12",
711
+ "@esbuild/netbsd-x64": "0.19.12",
712
+ "@esbuild/openbsd-x64": "0.19.12",
713
+ "@esbuild/sunos-x64": "0.19.12",
714
+ "@esbuild/win32-arm64": "0.19.12",
715
+ "@esbuild/win32-ia32": "0.19.12",
716
+ "@esbuild/win32-x64": "0.19.12"
717
+ }
718
+ },
719
+ "node_modules/esniff": {
720
+ "version": "2.0.1",
721
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
722
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
723
+ "dependencies": {
724
+ "d": "^1.0.1",
725
+ "es5-ext": "^0.10.62",
726
+ "event-emitter": "^0.3.5",
727
+ "type": "^2.7.2"
728
+ },
729
+ "engines": {
730
+ "node": ">=0.10"
731
+ }
732
+ },
733
+ "node_modules/estree-walker": {
734
+ "version": "3.0.3",
735
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
736
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
737
+ "peer": true,
738
+ "dependencies": {
739
+ "@types/estree": "^1.0.0"
740
+ }
741
+ },
742
+ "node_modules/event-emitter": {
743
+ "version": "0.3.5",
744
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
745
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
746
+ "dependencies": {
747
+ "d": "1",
748
+ "es5-ext": "~0.10.14"
749
+ }
750
+ },
751
+ "node_modules/ext": {
752
+ "version": "1.7.0",
753
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
754
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
755
+ "dependencies": {
756
+ "type": "^2.7.2"
757
+ }
758
+ },
759
+ "node_modules/globalyzer": {
760
+ "version": "0.1.0",
761
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
762
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
763
+ },
764
+ "node_modules/globrex": {
765
+ "version": "0.1.2",
766
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
767
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
768
+ },
769
+ "node_modules/intl-messageformat": {
770
+ "version": "9.13.0",
771
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz",
772
+ "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==",
773
+ "dependencies": {
774
+ "@formatjs/ecma402-abstract": "1.11.4",
775
+ "@formatjs/fast-memoize": "1.2.1",
776
+ "@formatjs/icu-messageformat-parser": "2.1.0",
777
+ "tslib": "^2.1.0"
778
+ }
779
+ },
780
+ "node_modules/iobuffer": {
781
+ "version": "5.3.2",
782
+ "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.3.2.tgz",
783
+ "integrity": "sha512-kO3CjNfLZ9t+tHxAMd+Xk4v3D/31E91rMs1dHrm7ikEQrlZ8mLDbQ4z3tZfDM48zOkReas2jx8MWSAmN9+c8Fw=="
784
+ },
785
+ "node_modules/is-promise": {
786
+ "version": "2.2.2",
787
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
788
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
789
+ },
790
+ "node_modules/is-reference": {
791
+ "version": "3.0.2",
792
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
793
+ "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
794
+ "peer": true,
795
+ "dependencies": {
796
+ "@types/estree": "*"
797
+ }
798
+ },
799
+ "node_modules/locate-character": {
800
+ "version": "3.0.0",
801
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
802
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
803
+ "peer": true
804
+ },
805
+ "node_modules/lru-queue": {
806
+ "version": "0.1.0",
807
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
808
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
809
+ "dependencies": {
810
+ "es5-ext": "~0.10.2"
811
+ }
812
+ },
813
+ "node_modules/magic-string": {
814
+ "version": "0.30.8",
815
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
816
+ "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
817
+ "peer": true,
818
+ "dependencies": {
819
+ "@jridgewell/sourcemap-codec": "^1.4.15"
820
+ },
821
+ "engines": {
822
+ "node": ">=12"
823
+ }
824
+ },
825
+ "node_modules/mdn-data": {
826
+ "version": "2.0.30",
827
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
828
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
829
+ "peer": true
830
+ },
831
+ "node_modules/memoizee": {
832
+ "version": "0.4.15",
833
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
834
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
835
+ "dependencies": {
836
+ "d": "^1.0.1",
837
+ "es5-ext": "^0.10.53",
838
+ "es6-weak-map": "^2.0.3",
839
+ "event-emitter": "^0.3.5",
840
+ "is-promise": "^2.2.2",
841
+ "lru-queue": "^0.1.0",
842
+ "next-tick": "^1.1.0",
843
+ "timers-ext": "^0.1.7"
844
+ }
845
+ },
846
+ "node_modules/mri": {
847
+ "version": "1.2.0",
848
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
849
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
850
+ "engines": {
851
+ "node": ">=4"
852
+ }
853
+ },
854
+ "node_modules/netcdfjs": {
855
+ "version": "3.0.0",
856
+ "resolved": "https://registry.npmjs.org/netcdfjs/-/netcdfjs-3.0.0.tgz",
857
+ "integrity": "sha512-LOvT8KkC308qtpUkcBPiCMBtii7ZQCN6LxcVheWgyUeZ6DQWcpSRFV9dcVXLj/2eHZ/bre9tV5HTH4Sf93vrFw==",
858
+ "dependencies": {
859
+ "iobuffer": "^5.3.2"
860
+ }
861
+ },
862
+ "node_modules/next-tick": {
863
+ "version": "1.1.0",
864
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
865
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
866
+ },
867
+ "node_modules/pako": {
868
+ "version": "2.1.0",
869
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
870
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
871
+ },
872
+ "node_modules/periscopic": {
873
+ "version": "3.1.0",
874
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
875
+ "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
876
+ "peer": true,
877
+ "dependencies": {
878
+ "@types/estree": "^1.0.0",
879
+ "estree-walker": "^3.0.0",
880
+ "is-reference": "^3.0.0"
881
+ }
882
+ },
883
+ "node_modules/sade": {
884
+ "version": "1.8.1",
885
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
886
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
887
+ "dependencies": {
888
+ "mri": "^1.1.0"
889
+ },
890
+ "engines": {
891
+ "node": ">=6"
892
+ }
893
+ },
894
+ "node_modules/source-map-js": {
895
+ "version": "1.2.0",
896
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
897
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
898
+ "peer": true,
899
+ "engines": {
900
+ "node": ">=0.10.0"
901
+ }
902
+ },
903
+ "node_modules/svelte": {
904
+ "version": "4.2.12",
905
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
906
+ "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
907
+ "peer": true,
908
+ "dependencies": {
909
+ "@ampproject/remapping": "^2.2.1",
910
+ "@jridgewell/sourcemap-codec": "^1.4.15",
911
+ "@jridgewell/trace-mapping": "^0.3.18",
912
+ "@types/estree": "^1.0.1",
913
+ "acorn": "^8.9.0",
914
+ "aria-query": "^5.3.0",
915
+ "axobject-query": "^4.0.0",
916
+ "code-red": "^1.0.3",
917
+ "css-tree": "^2.3.1",
918
+ "estree-walker": "^3.0.3",
919
+ "is-reference": "^3.0.1",
920
+ "locate-character": "^3.0.0",
921
+ "magic-string": "^0.30.4",
922
+ "periscopic": "^3.1.0"
923
+ },
924
+ "engines": {
925
+ "node": ">=16"
926
+ }
927
+ },
928
+ "node_modules/svelte-i18n": {
929
+ "version": "3.7.4",
930
+ "resolved": "https://registry.npmjs.org/svelte-i18n/-/svelte-i18n-3.7.4.tgz",
931
+ "integrity": "sha512-yGRCNo+eBT4cPuU7IVsYTYjxB7I2V8qgUZPlHnNctJj5IgbJgV78flsRzpjZ/8iUYZrS49oCt7uxlU3AZv/N5Q==",
932
+ "dependencies": {
933
+ "cli-color": "^2.0.3",
934
+ "deepmerge": "^4.2.2",
935
+ "esbuild": "^0.19.2",
936
+ "estree-walker": "^2",
937
+ "intl-messageformat": "^9.13.0",
938
+ "sade": "^1.8.1",
939
+ "tiny-glob": "^0.2.9"
940
+ },
941
+ "bin": {
942
+ "svelte-i18n": "dist/cli.js"
943
+ },
944
+ "engines": {
945
+ "node": ">= 16"
946
+ },
947
+ "peerDependencies": {
948
+ "svelte": "^3 || ^4"
949
+ }
950
+ },
951
+ "node_modules/svelte-i18n/node_modules/estree-walker": {
952
+ "version": "2.0.2",
953
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
954
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
955
+ },
956
+ "node_modules/timers-ext": {
957
+ "version": "0.1.7",
958
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
959
+ "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
960
+ "dependencies": {
961
+ "es5-ext": "~0.10.46",
962
+ "next-tick": "1"
963
+ }
964
+ },
965
+ "node_modules/tiny-glob": {
966
+ "version": "0.2.9",
967
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
968
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
969
+ "dependencies": {
970
+ "globalyzer": "0.1.0",
971
+ "globrex": "^0.1.2"
972
+ }
973
+ },
974
+ "node_modules/tslib": {
975
+ "version": "2.6.2",
976
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
977
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
978
+ },
979
+ "node_modules/type": {
980
+ "version": "2.7.2",
981
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
982
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
983
+ },
984
+ "node_modules/upng-js": {
985
+ "version": "2.1.0",
986
+ "resolved": "https://registry.npmjs.org/upng-js/-/upng-js-2.1.0.tgz",
987
+ "integrity": "sha512-d3xzZzpMP64YkjP5pr8gNyvBt7dLk/uGI67EctzDuVp4lCZyVMo0aJO6l/VDlgbInJYDY6cnClLoBp29eKWI6g==",
988
+ "dependencies": {
989
+ "pako": "^1.0.5"
990
+ }
991
+ },
992
+ "node_modules/upng-js/node_modules/pako": {
993
+ "version": "1.0.11",
994
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
995
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
996
+ }
997
+ },
998
+ "dependencies": {
999
+ "@ampproject/remapping": {
1000
+ "version": "2.3.0",
1001
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
1002
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
1003
+ "peer": true,
1004
+ "requires": {
1005
+ "@jridgewell/gen-mapping": "^0.3.5",
1006
+ "@jridgewell/trace-mapping": "^0.3.24"
1007
+ }
1008
+ },
1009
+ "@esbuild/aix-ppc64": {
1010
+ "version": "0.19.12",
1011
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
1012
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
1013
+ "optional": true
1014
+ },
1015
+ "@esbuild/android-arm": {
1016
+ "version": "0.19.12",
1017
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
1018
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
1019
+ "optional": true
1020
+ },
1021
+ "@esbuild/android-arm64": {
1022
+ "version": "0.19.12",
1023
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
1024
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
1025
+ "optional": true
1026
+ },
1027
+ "@esbuild/android-x64": {
1028
+ "version": "0.19.12",
1029
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
1030
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
1031
+ "optional": true
1032
+ },
1033
+ "@esbuild/darwin-arm64": {
1034
+ "version": "0.19.12",
1035
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
1036
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
1037
+ "optional": true
1038
+ },
1039
+ "@esbuild/darwin-x64": {
1040
+ "version": "0.19.12",
1041
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
1042
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
1043
+ "optional": true
1044
+ },
1045
+ "@esbuild/freebsd-arm64": {
1046
+ "version": "0.19.12",
1047
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
1048
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
1049
+ "optional": true
1050
+ },
1051
+ "@esbuild/freebsd-x64": {
1052
+ "version": "0.19.12",
1053
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
1054
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
1055
+ "optional": true
1056
+ },
1057
+ "@esbuild/linux-arm": {
1058
+ "version": "0.19.12",
1059
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
1060
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
1061
+ "optional": true
1062
+ },
1063
+ "@esbuild/linux-arm64": {
1064
+ "version": "0.19.12",
1065
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
1066
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
1067
+ "optional": true
1068
+ },
1069
+ "@esbuild/linux-ia32": {
1070
+ "version": "0.19.12",
1071
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
1072
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
1073
+ "optional": true
1074
+ },
1075
+ "@esbuild/linux-loong64": {
1076
+ "version": "0.19.12",
1077
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
1078
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
1079
+ "optional": true
1080
+ },
1081
+ "@esbuild/linux-mips64el": {
1082
+ "version": "0.19.12",
1083
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
1084
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
1085
+ "optional": true
1086
+ },
1087
+ "@esbuild/linux-ppc64": {
1088
+ "version": "0.19.12",
1089
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
1090
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
1091
+ "optional": true
1092
+ },
1093
+ "@esbuild/linux-riscv64": {
1094
+ "version": "0.19.12",
1095
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
1096
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
1097
+ "optional": true
1098
+ },
1099
+ "@esbuild/linux-s390x": {
1100
+ "version": "0.19.12",
1101
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
1102
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
1103
+ "optional": true
1104
+ },
1105
+ "@esbuild/linux-x64": {
1106
+ "version": "0.19.12",
1107
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
1108
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
1109
+ "optional": true
1110
+ },
1111
+ "@esbuild/netbsd-x64": {
1112
+ "version": "0.19.12",
1113
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
1114
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
1115
+ "optional": true
1116
+ },
1117
+ "@esbuild/openbsd-x64": {
1118
+ "version": "0.19.12",
1119
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
1120
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
1121
+ "optional": true
1122
+ },
1123
+ "@esbuild/sunos-x64": {
1124
+ "version": "0.19.12",
1125
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
1126
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
1127
+ "optional": true
1128
+ },
1129
+ "@esbuild/win32-arm64": {
1130
+ "version": "0.19.12",
1131
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
1132
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
1133
+ "optional": true
1134
+ },
1135
+ "@esbuild/win32-ia32": {
1136
+ "version": "0.19.12",
1137
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
1138
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
1139
+ "optional": true
1140
+ },
1141
+ "@esbuild/win32-x64": {
1142
+ "version": "0.19.12",
1143
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
1144
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
1145
+ "optional": true
1146
+ },
1147
+ "@formatjs/ecma402-abstract": {
1148
+ "version": "1.11.4",
1149
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
1150
+ "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
1151
+ "requires": {
1152
+ "@formatjs/intl-localematcher": "0.2.25",
1153
+ "tslib": "^2.1.0"
1154
+ }
1155
+ },
1156
+ "@formatjs/fast-memoize": {
1157
+ "version": "1.2.1",
1158
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz",
1159
+ "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==",
1160
+ "requires": {
1161
+ "tslib": "^2.1.0"
1162
+ }
1163
+ },
1164
+ "@formatjs/icu-messageformat-parser": {
1165
+ "version": "2.1.0",
1166
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz",
1167
+ "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==",
1168
+ "requires": {
1169
+ "@formatjs/ecma402-abstract": "1.11.4",
1170
+ "@formatjs/icu-skeleton-parser": "1.3.6",
1171
+ "tslib": "^2.1.0"
1172
+ }
1173
+ },
1174
+ "@formatjs/icu-skeleton-parser": {
1175
+ "version": "1.3.6",
1176
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz",
1177
+ "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==",
1178
+ "requires": {
1179
+ "@formatjs/ecma402-abstract": "1.11.4",
1180
+ "tslib": "^2.1.0"
1181
+ }
1182
+ },
1183
+ "@formatjs/intl-localematcher": {
1184
+ "version": "0.2.25",
1185
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
1186
+ "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
1187
+ "requires": {
1188
+ "tslib": "^2.1.0"
1189
+ }
1190
+ },
1191
+ "@gradio/atoms": {
1192
+ "version": "0.5.3",
1193
+ "resolved": "https://registry.npmjs.org/@gradio/atoms/-/atoms-0.5.3.tgz",
1194
+ "integrity": "sha512-1HZgmhbAPzCYt6muyttrJi/P5zXTnD3kVMgneXuDd2j9qB21kSqzshmpnPcvDO3lO0vro55HuxgH22PJ1XHWqg==",
1195
+ "requires": {
1196
+ "@gradio/icons": "^0.3.3",
1197
+ "@gradio/utils": "^0.3.0"
1198
+ }
1199
+ },
1200
+ "@gradio/column": {
1201
+ "version": "0.1.0",
1202
+ "resolved": "https://registry.npmjs.org/@gradio/column/-/column-0.1.0.tgz",
1203
+ "integrity": "sha512-P24nqqVnMXBaDA1f/zSN5HZRho4PxP8Dq+7VltPHlmxIEiZYik2AJ4J0LeuIha34FDO0guu/16evdrpvGIUAfw=="
1204
+ },
1205
+ "@gradio/icons": {
1206
+ "version": "0.3.3",
1207
+ "resolved": "https://registry.npmjs.org/@gradio/icons/-/icons-0.3.3.tgz",
1208
+ "integrity": "sha512-UFTHpjzFJVwaRzZsdslWxnKUPGgtVeErmUGzrG9di4Vn0oHn1FgHt1Yr2SVu4lO3JI/r2u3H49tb6iax4U9HjA=="
1209
+ },
1210
+ "@gradio/statustracker": {
1211
+ "version": "0.4.8",
1212
+ "resolved": "https://registry.npmjs.org/@gradio/statustracker/-/statustracker-0.4.8.tgz",
1213
+ "integrity": "sha512-B/SN7T9BbcdzPrWYfKVxwy3e4u85MS+DAZSeuXgPbAL5n5QravCtvNW7zwkUWb0OlBloaglN3Y7K3M8l1hR5qg==",
1214
+ "requires": {
1215
+ "@gradio/atoms": "^0.5.3",
1216
+ "@gradio/column": "^0.1.0",
1217
+ "@gradio/icons": "^0.3.3",
1218
+ "@gradio/utils": "^0.3.0"
1219
+ }
1220
+ },
1221
+ "@gradio/theme": {
1222
+ "version": "0.2.0",
1223
+ "resolved": "https://registry.npmjs.org/@gradio/theme/-/theme-0.2.0.tgz",
1224
+ "integrity": "sha512-33c68Nk7oRXLn08OxPfjcPm7S4tXGOUV1I1bVgzdM2YV5o1QBOS1GEnXPZPu/CEYPePLMB6bsDwffrLEyLGWVQ=="
1225
+ },
1226
+ "@gradio/utils": {
1227
+ "version": "0.3.0",
1228
+ "resolved": "https://registry.npmjs.org/@gradio/utils/-/utils-0.3.0.tgz",
1229
+ "integrity": "sha512-VxP0h7UoWazkdSB875ChvTXWamBwMguuRc+8OyQFZjdj14lcqLEQuj54es3FDBpXOp5GMLFh48Q5FLLjYxMgSg==",
1230
+ "requires": {
1231
+ "@gradio/theme": "^0.2.0",
1232
+ "svelte-i18n": "^3.6.0"
1233
+ }
1234
+ },
1235
+ "@jridgewell/gen-mapping": {
1236
+ "version": "0.3.5",
1237
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
1238
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
1239
+ "peer": true,
1240
+ "requires": {
1241
+ "@jridgewell/set-array": "^1.2.1",
1242
+ "@jridgewell/sourcemap-codec": "^1.4.10",
1243
+ "@jridgewell/trace-mapping": "^0.3.24"
1244
+ }
1245
+ },
1246
+ "@jridgewell/resolve-uri": {
1247
+ "version": "3.1.2",
1248
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1249
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1250
+ "peer": true
1251
+ },
1252
+ "@jridgewell/set-array": {
1253
+ "version": "1.2.1",
1254
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
1255
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
1256
+ "peer": true
1257
+ },
1258
+ "@jridgewell/sourcemap-codec": {
1259
+ "version": "1.4.15",
1260
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
1261
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
1262
+ "peer": true
1263
+ },
1264
+ "@jridgewell/trace-mapping": {
1265
+ "version": "0.3.25",
1266
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
1267
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
1268
+ "peer": true,
1269
+ "requires": {
1270
+ "@jridgewell/resolve-uri": "^3.1.0",
1271
+ "@jridgewell/sourcemap-codec": "^1.4.14"
1272
+ }
1273
+ },
1274
+ "@types/estree": {
1275
+ "version": "1.0.5",
1276
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
1277
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
1278
+ "peer": true
1279
+ },
1280
+ "3dmol": {
1281
+ "version": "2.1.0",
1282
+ "resolved": "https://registry.npmjs.org/3dmol/-/3dmol-2.1.0.tgz",
1283
+ "integrity": "sha512-w1pfTR8+pDtOpxbGDrBWCbOXiTBqLhHO/OQ5xK3nD4trM0OTPCl8opaTl2iyCfwFRUbqmd2I4Qtjw7x9Boe+OA==",
1284
+ "requires": {
1285
+ "iobuffer": "^5.3.1",
1286
+ "netcdfjs": "^3.0.0",
1287
+ "pako": "^2.1.0",
1288
+ "upng-js": "^2.1.0"
1289
+ }
1290
+ },
1291
+ "acorn": {
1292
+ "version": "8.11.3",
1293
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
1294
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
1295
+ "peer": true
1296
+ },
1297
+ "aria-query": {
1298
+ "version": "5.3.0",
1299
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
1300
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
1301
+ "peer": true,
1302
+ "requires": {
1303
+ "dequal": "^2.0.3"
1304
+ }
1305
+ },
1306
+ "axobject-query": {
1307
+ "version": "4.0.0",
1308
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
1309
+ "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
1310
+ "peer": true,
1311
+ "requires": {
1312
+ "dequal": "^2.0.3"
1313
+ }
1314
+ },
1315
+ "cli-color": {
1316
+ "version": "2.0.4",
1317
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
1318
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
1319
+ "requires": {
1320
+ "d": "^1.0.1",
1321
+ "es5-ext": "^0.10.64",
1322
+ "es6-iterator": "^2.0.3",
1323
+ "memoizee": "^0.4.15",
1324
+ "timers-ext": "^0.1.7"
1325
+ }
1326
+ },
1327
+ "code-red": {
1328
+ "version": "1.0.4",
1329
+ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
1330
+ "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
1331
+ "peer": true,
1332
+ "requires": {
1333
+ "@jridgewell/sourcemap-codec": "^1.4.15",
1334
+ "@types/estree": "^1.0.1",
1335
+ "acorn": "^8.10.0",
1336
+ "estree-walker": "^3.0.3",
1337
+ "periscopic": "^3.1.0"
1338
+ }
1339
+ },
1340
+ "css-tree": {
1341
+ "version": "2.3.1",
1342
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
1343
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
1344
+ "peer": true,
1345
+ "requires": {
1346
+ "mdn-data": "2.0.30",
1347
+ "source-map-js": "^1.0.1"
1348
+ }
1349
+ },
1350
+ "d": {
1351
+ "version": "1.0.2",
1352
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
1353
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
1354
+ "requires": {
1355
+ "es5-ext": "^0.10.64",
1356
+ "type": "^2.7.2"
1357
+ }
1358
+ },
1359
+ "deepmerge": {
1360
+ "version": "4.3.1",
1361
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
1362
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
1363
+ },
1364
+ "dequal": {
1365
+ "version": "2.0.3",
1366
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
1367
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
1368
+ "peer": true
1369
+ },
1370
+ "es5-ext": {
1371
+ "version": "0.10.64",
1372
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
1373
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
1374
+ "requires": {
1375
+ "es6-iterator": "^2.0.3",
1376
+ "es6-symbol": "^3.1.3",
1377
+ "esniff": "^2.0.1",
1378
+ "next-tick": "^1.1.0"
1379
+ }
1380
+ },
1381
+ "es6-iterator": {
1382
+ "version": "2.0.3",
1383
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
1384
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
1385
+ "requires": {
1386
+ "d": "1",
1387
+ "es5-ext": "^0.10.35",
1388
+ "es6-symbol": "^3.1.1"
1389
+ }
1390
+ },
1391
+ "es6-symbol": {
1392
+ "version": "3.1.4",
1393
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
1394
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
1395
+ "requires": {
1396
+ "d": "^1.0.2",
1397
+ "ext": "^1.7.0"
1398
+ }
1399
+ },
1400
+ "es6-weak-map": {
1401
+ "version": "2.0.3",
1402
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
1403
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
1404
+ "requires": {
1405
+ "d": "1",
1406
+ "es5-ext": "^0.10.46",
1407
+ "es6-iterator": "^2.0.3",
1408
+ "es6-symbol": "^3.1.1"
1409
+ }
1410
+ },
1411
+ "esbuild": {
1412
+ "version": "0.19.12",
1413
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
1414
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
1415
+ "requires": {
1416
+ "@esbuild/aix-ppc64": "0.19.12",
1417
+ "@esbuild/android-arm": "0.19.12",
1418
+ "@esbuild/android-arm64": "0.19.12",
1419
+ "@esbuild/android-x64": "0.19.12",
1420
+ "@esbuild/darwin-arm64": "0.19.12",
1421
+ "@esbuild/darwin-x64": "0.19.12",
1422
+ "@esbuild/freebsd-arm64": "0.19.12",
1423
+ "@esbuild/freebsd-x64": "0.19.12",
1424
+ "@esbuild/linux-arm": "0.19.12",
1425
+ "@esbuild/linux-arm64": "0.19.12",
1426
+ "@esbuild/linux-ia32": "0.19.12",
1427
+ "@esbuild/linux-loong64": "0.19.12",
1428
+ "@esbuild/linux-mips64el": "0.19.12",
1429
+ "@esbuild/linux-ppc64": "0.19.12",
1430
+ "@esbuild/linux-riscv64": "0.19.12",
1431
+ "@esbuild/linux-s390x": "0.19.12",
1432
+ "@esbuild/linux-x64": "0.19.12",
1433
+ "@esbuild/netbsd-x64": "0.19.12",
1434
+ "@esbuild/openbsd-x64": "0.19.12",
1435
+ "@esbuild/sunos-x64": "0.19.12",
1436
+ "@esbuild/win32-arm64": "0.19.12",
1437
+ "@esbuild/win32-ia32": "0.19.12",
1438
+ "@esbuild/win32-x64": "0.19.12"
1439
+ }
1440
+ },
1441
+ "esniff": {
1442
+ "version": "2.0.1",
1443
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
1444
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
1445
+ "requires": {
1446
+ "d": "^1.0.1",
1447
+ "es5-ext": "^0.10.62",
1448
+ "event-emitter": "^0.3.5",
1449
+ "type": "^2.7.2"
1450
+ }
1451
+ },
1452
+ "estree-walker": {
1453
+ "version": "3.0.3",
1454
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1455
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1456
+ "peer": true,
1457
+ "requires": {
1458
+ "@types/estree": "^1.0.0"
1459
+ }
1460
+ },
1461
+ "event-emitter": {
1462
+ "version": "0.3.5",
1463
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
1464
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
1465
+ "requires": {
1466
+ "d": "1",
1467
+ "es5-ext": "~0.10.14"
1468
+ }
1469
+ },
1470
+ "ext": {
1471
+ "version": "1.7.0",
1472
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
1473
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
1474
+ "requires": {
1475
+ "type": "^2.7.2"
1476
+ }
1477
+ },
1478
+ "globalyzer": {
1479
+ "version": "0.1.0",
1480
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
1481
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
1482
+ },
1483
+ "globrex": {
1484
+ "version": "0.1.2",
1485
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
1486
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
1487
+ },
1488
+ "intl-messageformat": {
1489
+ "version": "9.13.0",
1490
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz",
1491
+ "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==",
1492
+ "requires": {
1493
+ "@formatjs/ecma402-abstract": "1.11.4",
1494
+ "@formatjs/fast-memoize": "1.2.1",
1495
+ "@formatjs/icu-messageformat-parser": "2.1.0",
1496
+ "tslib": "^2.1.0"
1497
+ }
1498
+ },
1499
+ "iobuffer": {
1500
+ "version": "5.3.2",
1501
+ "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.3.2.tgz",
1502
+ "integrity": "sha512-kO3CjNfLZ9t+tHxAMd+Xk4v3D/31E91rMs1dHrm7ikEQrlZ8mLDbQ4z3tZfDM48zOkReas2jx8MWSAmN9+c8Fw=="
1503
+ },
1504
+ "is-promise": {
1505
+ "version": "2.2.2",
1506
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
1507
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
1508
+ },
1509
+ "is-reference": {
1510
+ "version": "3.0.2",
1511
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
1512
+ "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
1513
+ "peer": true,
1514
+ "requires": {
1515
+ "@types/estree": "*"
1516
+ }
1517
+ },
1518
+ "locate-character": {
1519
+ "version": "3.0.0",
1520
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
1521
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
1522
+ "peer": true
1523
+ },
1524
+ "lru-queue": {
1525
+ "version": "0.1.0",
1526
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
1527
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
1528
+ "requires": {
1529
+ "es5-ext": "~0.10.2"
1530
+ }
1531
+ },
1532
+ "magic-string": {
1533
+ "version": "0.30.8",
1534
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
1535
+ "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
1536
+ "peer": true,
1537
+ "requires": {
1538
+ "@jridgewell/sourcemap-codec": "^1.4.15"
1539
+ }
1540
+ },
1541
+ "mdn-data": {
1542
+ "version": "2.0.30",
1543
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
1544
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
1545
+ "peer": true
1546
+ },
1547
+ "memoizee": {
1548
+ "version": "0.4.15",
1549
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
1550
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
1551
+ "requires": {
1552
+ "d": "^1.0.1",
1553
+ "es5-ext": "^0.10.53",
1554
+ "es6-weak-map": "^2.0.3",
1555
+ "event-emitter": "^0.3.5",
1556
+ "is-promise": "^2.2.2",
1557
+ "lru-queue": "^0.1.0",
1558
+ "next-tick": "^1.1.0",
1559
+ "timers-ext": "^0.1.7"
1560
+ }
1561
+ },
1562
+ "mri": {
1563
+ "version": "1.2.0",
1564
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
1565
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
1566
+ },
1567
+ "netcdfjs": {
1568
+ "version": "3.0.0",
1569
+ "resolved": "https://registry.npmjs.org/netcdfjs/-/netcdfjs-3.0.0.tgz",
1570
+ "integrity": "sha512-LOvT8KkC308qtpUkcBPiCMBtii7ZQCN6LxcVheWgyUeZ6DQWcpSRFV9dcVXLj/2eHZ/bre9tV5HTH4Sf93vrFw==",
1571
+ "requires": {
1572
+ "iobuffer": "^5.3.2"
1573
+ }
1574
+ },
1575
+ "next-tick": {
1576
+ "version": "1.1.0",
1577
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
1578
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
1579
+ },
1580
+ "pako": {
1581
+ "version": "2.1.0",
1582
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
1583
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
1584
+ },
1585
+ "periscopic": {
1586
+ "version": "3.1.0",
1587
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
1588
+ "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
1589
+ "peer": true,
1590
+ "requires": {
1591
+ "@types/estree": "^1.0.0",
1592
+ "estree-walker": "^3.0.0",
1593
+ "is-reference": "^3.0.0"
1594
+ }
1595
+ },
1596
+ "sade": {
1597
+ "version": "1.8.1",
1598
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
1599
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
1600
+ "requires": {
1601
+ "mri": "^1.1.0"
1602
+ }
1603
+ },
1604
+ "source-map-js": {
1605
+ "version": "1.2.0",
1606
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
1607
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
1608
+ "peer": true
1609
+ },
1610
+ "svelte": {
1611
+ "version": "4.2.12",
1612
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
1613
+ "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
1614
+ "peer": true,
1615
+ "requires": {
1616
+ "@ampproject/remapping": "^2.2.1",
1617
+ "@jridgewell/sourcemap-codec": "^1.4.15",
1618
+ "@jridgewell/trace-mapping": "^0.3.18",
1619
+ "@types/estree": "^1.0.1",
1620
+ "acorn": "^8.9.0",
1621
+ "aria-query": "^5.3.0",
1622
+ "axobject-query": "^4.0.0",
1623
+ "code-red": "^1.0.3",
1624
+ "css-tree": "^2.3.1",
1625
+ "estree-walker": "^3.0.3",
1626
+ "is-reference": "^3.0.1",
1627
+ "locate-character": "^3.0.0",
1628
+ "magic-string": "^0.30.4",
1629
+ "periscopic": "^3.1.0"
1630
+ }
1631
+ },
1632
+ "svelte-i18n": {
1633
+ "version": "3.7.4",
1634
+ "resolved": "https://registry.npmjs.org/svelte-i18n/-/svelte-i18n-3.7.4.tgz",
1635
+ "integrity": "sha512-yGRCNo+eBT4cPuU7IVsYTYjxB7I2V8qgUZPlHnNctJj5IgbJgV78flsRzpjZ/8iUYZrS49oCt7uxlU3AZv/N5Q==",
1636
+ "requires": {
1637
+ "cli-color": "^2.0.3",
1638
+ "deepmerge": "^4.2.2",
1639
+ "esbuild": "^0.19.2",
1640
+ "estree-walker": "^2",
1641
+ "intl-messageformat": "^9.13.0",
1642
+ "sade": "^1.8.1",
1643
+ "tiny-glob": "^0.2.9"
1644
+ },
1645
+ "dependencies": {
1646
+ "estree-walker": {
1647
+ "version": "2.0.2",
1648
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1649
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
1650
+ }
1651
+ }
1652
+ },
1653
+ "timers-ext": {
1654
+ "version": "0.1.7",
1655
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
1656
+ "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
1657
+ "requires": {
1658
+ "es5-ext": "~0.10.46",
1659
+ "next-tick": "1"
1660
+ }
1661
+ },
1662
+ "tiny-glob": {
1663
+ "version": "0.2.9",
1664
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
1665
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
1666
+ "requires": {
1667
+ "globalyzer": "0.1.0",
1668
+ "globrex": "^0.1.2"
1669
+ }
1670
+ },
1671
+ "tslib": {
1672
+ "version": "2.6.2",
1673
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1674
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
1675
+ },
1676
+ "type": {
1677
+ "version": "2.7.2",
1678
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
1679
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
1680
+ },
1681
+ "upng-js": {
1682
+ "version": "2.1.0",
1683
+ "resolved": "https://registry.npmjs.org/upng-js/-/upng-js-2.1.0.tgz",
1684
+ "integrity": "sha512-d3xzZzpMP64YkjP5pr8gNyvBt7dLk/uGI67EctzDuVp4lCZyVMo0aJO6l/VDlgbInJYDY6cnClLoBp29eKWI6g==",
1685
+ "requires": {
1686
+ "pako": "^1.0.5"
1687
+ },
1688
+ "dependencies": {
1689
+ "pako": {
1690
+ "version": "1.0.11",
1691
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
1692
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
1693
+ }
1694
+ }
1695
+ }
1696
+ }
1697
+ }
src/frontend/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "gradio_cofoldinginput",
3
+ "version": "0.4.12",
4
+ "description": "Gradio UI packages",
5
+ "type": "module",
6
+ "author": "",
7
+ "license": "ISC",
8
+ "private": false,
9
+ "main_changeset": true,
10
+ "main": "Index.svelte",
11
+ "exports": {
12
+ ".": "./Index.svelte",
13
+ "./example": "./Example.svelte",
14
+ "./package.json": "./package.json"
15
+ },
16
+ "dependencies": {
17
+ "@gradio/atoms": "0.5.3",
18
+ "@gradio/icons": "0.3.3",
19
+ "@gradio/statustracker": "0.4.8",
20
+ "@gradio/utils": "0.3.0",
21
+ "3dmol": "^2.1.0"
22
+ }
23
+ }
src/frontend/shared/Accordion.svelte ADDED
@@ -0,0 +1,1694 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script>
2
+ import { createEventDispatcher } from "svelte";
3
+
4
+ import Sequence from "./Sequence.svelte";
5
+ import SearchInput from "./SearchInput.svelte";
6
+ import Molecule from "./Molecule.svelte";
7
+
8
+ const dispatch = createEventDispatcher();
9
+
10
+ export let vals = [];
11
+
12
+ export let covMods = [];
13
+
14
+ let showCovModVals = [];
15
+ $: {
16
+ if (covMods) {
17
+ // iterate over each val
18
+ showCovModVals = vals.map((val) => {
19
+ // check if val is in covMods and return index in CovMods or null
20
+ return covMods.findIndex((covMod) => covMod.ligand === val.chain);
21
+ // if index is not -1 return true else false
22
+
23
+ // return covMods.some((covMod) => covMod.ligand === val.chain);
24
+ });
25
+
26
+ // dispatch("updateCovMod", covMods);
27
+ }
28
+ }
29
+
30
+ let labels = {
31
+ DNA: "NA sequence",
32
+ RNA: "NA sequence",
33
+ protein: "Protein sequence",
34
+ ligand: "Small molecule",
35
+ };
36
+
37
+ let colorCode = {
38
+ DNA: "bg-green-200 text-blue-800",
39
+ RNA: "bg-green-200 text-blue-800",
40
+ protein: "bg-blue-200 text-blue-800",
41
+ ligand: "bg-orange-200 text-blue-800",
42
+ };
43
+
44
+ let metals = [
45
+ "ZN",
46
+ "MG",
47
+ "CA",
48
+ "FE",
49
+ "NA",
50
+ "K",
51
+ "CL",
52
+ "CU",
53
+ "MN",
54
+ "CO",
55
+ "NI",
56
+ ];
57
+
58
+ let proteinChains = [];
59
+
60
+ $: proteinChains = vals
61
+ .filter((val) => val.class === "protein")
62
+ .map((val) => val.chain);
63
+
64
+ let ligandChains = [];
65
+
66
+ $: ligandChains = vals
67
+ .filter((val) => val.class === "ligand")
68
+ .map((val) => val.chain);
69
+
70
+ let residue_atoms = {
71
+ A: ["C", "CA", "CB", "N", "O"],
72
+ R: ["C", "CA", "CB", "CG", "CD", "CZ", "N", "NE", "O", "NH1", "NH2"],
73
+ D: ["C", "CA", "CB", "CG", "N", "O", "OD1", "OD2"],
74
+ N: ["C", "CA", "CB", "CG", "N", "ND2", "O", "OD1"],
75
+ C: ["C", "CA", "CB", "N", "O", "SG"],
76
+ E: ["C", "CA", "CB", "CG", "CD", "N", "O", "OE1", "OE2"],
77
+ N: ["C", "CA", "CB", "CG", "CD", "N", "NE2", "O", "OE1"],
78
+ G: ["C", "CA", "N", "O"],
79
+ H: ["C", "CA", "CB", "CG", "CD2", "CE1", "N", "ND1", "NE2", "O"],
80
+ I: ["C", "CA", "CB", "CG1", "CG2", "CD1", "N", "O"],
81
+ L: ["C", "CA", "CB", "CG", "CD1", "CD2", "N", "O"],
82
+ K: ["C", "CA", "CB", "CG", "CD", "CE", "N", "NZ", "O"],
83
+ M: ["C", "CA", "CB", "CG", "CE", "N", "O", "SD"],
84
+ F: ["C", "CA", "CB", "CG", "CD1", "CD2", "CE1", "CE2", "CZ", "N", "O"],
85
+ P: ["C", "CA", "CB", "CG", "CD", "N", "O"],
86
+ S: ["C", "CA", "CB", "N", "O", "OG"],
87
+ T: ["C", "CA", "CB", "CG2", "N", "O", "OG1"],
88
+ W: [
89
+ "C",
90
+ "CA",
91
+ "CB",
92
+ "CG",
93
+ "CD1",
94
+ "CD2",
95
+ "CE2",
96
+ "CE3",
97
+ "CZ2",
98
+ "CZ3",
99
+ "CH2",
100
+ "N",
101
+ "NE1",
102
+ "O",
103
+ ],
104
+ Y: [
105
+ "C",
106
+ "CA",
107
+ "CB",
108
+ "CG",
109
+ "CD1",
110
+ "CD2",
111
+ "CE1",
112
+ "CE2",
113
+ "CZ",
114
+ "N",
115
+ "O",
116
+ "OH",
117
+ ],
118
+ V: ["C", "CA", "CB", "CG1", "CG2", "N", "O"],
119
+ };
120
+
121
+ let resmap = {
122
+ H: "HIS",
123
+ A: "ALA",
124
+ R: "ARG",
125
+ N: "ASN",
126
+ D: "ASP",
127
+ C: "CYS",
128
+ E: "GLU",
129
+ Q: "GLN",
130
+ G: "GLY",
131
+ H: "HIS",
132
+ I: "ILE",
133
+ L: "LEU",
134
+ K: "LYS",
135
+ M: "MET",
136
+ F: "PHE",
137
+ P: "PRO",
138
+ S: "SER",
139
+ T: "THR",
140
+ W: "TRP",
141
+ Y: "TYR",
142
+ V: "VAL",
143
+ };
144
+
145
+ function getResAtoms(covMod) {
146
+ // get sequence of matching protein chain
147
+ let seq = vals.find((val) => val.chain === covMod.protein).sequence;
148
+
149
+ //do something if sequence is too short
150
+ if (seq.length < covMod.residue) {
151
+ alert("Residue number is too high");
152
+ return [];
153
+ }
154
+ // get residue
155
+ let residue = seq[covMod.residue - 1];
156
+ // get atoms
157
+ return residue_atoms[residue];
158
+ }
159
+
160
+ function getResname(covMod) {
161
+ // get sequence of matching protein chain
162
+ let seq = vals.find((val) => val.chain === covMod.protein).sequence;
163
+ // get residue
164
+ let residue = seq[covMod.residue - 1];
165
+ // get atoms
166
+ return resmap[residue];
167
+ }
168
+
169
+ function updateMol(event) {
170
+ let index = event.detail.index;
171
+ covMods[index].mol = event.detail.mol;
172
+ covMods[index].attachmentIndex = event.detail.attachmentIndex;
173
+ covMods[index].deleteIndexes = event.detail.deleteIndexes;
174
+
175
+ dispatch("updateCovMod", covMods);
176
+ }
177
+
178
+ function handleMessage(event) {
179
+ // fetch sdf content from https://files.rcsb.org/ligands/download/{name}_ideal.sdf
180
+ // alert(event.detail.text);
181
+
182
+ fetch(
183
+ `https://files.rcsb.org/ligands/download/${event.detail.text}_ideal.sdf`
184
+ )
185
+ .then((response) => {
186
+ if (!response.ok) {
187
+ // Check if the status code is 200
188
+ throw new Error("Network response was not ok");
189
+ }
190
+ return response.text();
191
+ })
192
+ .then((data) => {
193
+ dispatch("updateVals", {
194
+ sdf: data,
195
+ index: event.detail.index,
196
+ close: true,
197
+ });
198
+ })
199
+ .catch((error) => {
200
+ alert("Error fetching sdf file");
201
+ });
202
+ }
203
+ </script>
204
+
205
+ <div id="accordion-collapse" data-accordion="collapse">
206
+ {#each vals as item, i}
207
+ <h2 id={`accordion-collapse-heading-${i}`}>
208
+ <button
209
+ type="button"
210
+ class="flex items-center justify-between w-full p-5 font-medium rtl:text-right text-gray-500 border border-gray-200 dark:border-gray-700 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 gap-3"
211
+ data-accordion-target={`#accordion-collapse-body-${i}`}
212
+ class:rounded-t-xl={i === 0}
213
+ class:rounded-b-xl={i == vals.length - 1}
214
+ class:border-b-0={i != vals.length - 1}
215
+ aria-expanded={item.open}
216
+ aria-controls={`accordion-collapse-body-${i}`}
217
+ on:click={() => (item.open = !item.open)}
218
+ >
219
+ <div>
220
+ <span
221
+ class="inline-flex items-center justify-center p-1 px-2 text-xs font-semibold rounded-full {colorCode[
222
+ item.class
223
+ ]}"
224
+ >
225
+ {item.chain}
226
+ </span>
227
+ <span>{labels[item.class]}</span>
228
+ <span class="px-2 text-gray-800 font-bold">
229
+ {#if !item.open && item.class === "ligand"}
230
+ {#if metals.includes(item.name)}
231
+ {item.name}
232
+ {:else}
233
+ {item.smiles}
234
+ {/if}
235
+ {/if}
236
+ </span>
237
+ </div>
238
+
239
+ <div class="flex items-center space-x-2">
240
+ <svg
241
+ data-slot="icon"
242
+ fill="none"
243
+ stroke-width="3"
244
+ stroke="currentColor"
245
+ viewBox="0 0 24 24"
246
+ xmlns="http://www.w3.org/2000/svg"
247
+ aria-hidden="true"
248
+ class="w-4 h-4 text-red-800"
249
+ on:click={(e) => {
250
+ dispatch("removeVal", i);
251
+ }}
252
+ >
253
+ <path
254
+ stroke-linecap="round"
255
+ stroke-linejoin="round"
256
+ d="M6 18 18 6M6 6l12 12"
257
+ ></path>
258
+ </svg>
259
+
260
+ <svg
261
+ data-accordion-icon
262
+ class="w-3 h-3 shrink-0"
263
+ class:rotate-180={item.open}
264
+ class:-rotate-90={!item.open}
265
+ aria-hidden="true"
266
+ xmlns="http://www.w3.org/2000/svg"
267
+ fill="none"
268
+ viewBox="0 0 10 6"
269
+ >
270
+ <path
271
+ stroke="currentColor"
272
+ stroke-linecap="round"
273
+ stroke-linejoin="round"
274
+ stroke-width="2"
275
+ d="M9 5 5 1 1 5"
276
+ />
277
+ </svg>
278
+ </div>
279
+ </button>
280
+ </h2>
281
+
282
+ {#if item.open}
283
+ <div
284
+ id={`accordion-collapse-body-${i}`}
285
+ aria-labelledby={`accordion-collapse-heading-${i}`}
286
+ >
287
+ <div
288
+ class="p-5 border border-t-0 border-gray-200 dark:border-gray-700 dark:bg-gray-900"
289
+ >
290
+ {#if ["DNA", "RNA", "protein"].includes(item.class)}
291
+ <textarea
292
+ id="message"
293
+ rows="4"
294
+ class="block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
295
+ placeholder="MSAVGH..."
296
+ value={item.sequence}
297
+ on:input={(e) => {
298
+ // vals[i].sequence = e.target.value;
299
+ dispatch("updateVals", { sequence: e.target.value, index: i });
300
+ }}
301
+ ></textarea>
302
+ {:else if item.class === "ligand"}
303
+ <textarea
304
+ rows="1"
305
+ class="block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
306
+ placeholder="SMILES like CCC ..."
307
+ value={item.smiles}
308
+ on:input={(e) => {
309
+ // vals[i].sequence = e.target.value;
310
+ dispatch("updateVals", { smiles: e.target.value, index: i });
311
+ }}
312
+ ></textarea>
313
+
314
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
315
+
316
+ <SearchInput
317
+ database="rcsb-3ligand"
318
+ index={i}
319
+ on:triggerFetch={handleMessage}
320
+ />
321
+
322
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
323
+
324
+ <textarea
325
+ rows="3"
326
+ class="block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
327
+ placeholder="SDF format 3D molecule ..."
328
+ value={item.sdf}
329
+ on:input={(e) => {
330
+ // vals[i].sequence = e.target.value;
331
+ dispatch("updateVals", { sdf: e.target.value, index: i });
332
+ }}
333
+ ></textarea>
334
+
335
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
336
+
337
+ <div class="text-center text-gray-600 font-bold mb-2">
338
+ Metal ion
339
+ </div>
340
+
341
+ <div class="flex justify-center space-x-2">
342
+ {#each metals as metal}
343
+ <button
344
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden rounded-full dark:bg-gray-600"
345
+ class:bg-blue-200={item.name === metal}
346
+ class:bg-violet-100={item.name !== metal}
347
+ on:click={() =>
348
+ dispatch("updateVals", { name: metal, index: i })}
349
+ >
350
+ <span class="font-medium text-gray-600 dark:text-gray-300"
351
+ >{metal}</span
352
+ >
353
+ </button>
354
+ {/each}
355
+ </div>
356
+ {/if}
357
+
358
+ <!-- <div class="text-center text-gray-400 w-full my-2">- or -</div>
359
+
360
+ <label
361
+ class="block mb-2 text-sm font-medium text-gray-900 dark:text-white hidden"
362
+ for="file_input">Upload file</label
363
+ >
364
+ <input
365
+ class="block w-full text-sm text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400"
366
+ aria-describedby="file_input_help"
367
+ id="file_input"
368
+ type="file"
369
+ />
370
+ <p
371
+ class="mt-1 text-sm text-gray-500 dark:text-gray-300"
372
+ id="file_input_help"
373
+ >
374
+ .fasta files
375
+ </p> -->
376
+ </div>
377
+ </div>
378
+ {/if}
379
+ {#if !item.open}
380
+ {#if ["DNA", "RNA", "protein"].includes(item.class)}
381
+ <div
382
+ id={`accordion-collapse-body-${i}`}
383
+ aria-labelledby={`accordion-collapse-heading-${i}`}
384
+ >
385
+ <div
386
+ class="p-5 border border-t-0 border-gray-200 dark:border-gray-700"
387
+ class:border-b-0={i != vals.length - 1}
388
+ >
389
+ {#if item.sequence !== ""}
390
+ <Sequence seq={item.sequence} />
391
+ {/if}
392
+ </div>
393
+ </div>
394
+ {:else if item.class === "ligand"}
395
+ {#if item.sdf !== ""}
396
+ <div
397
+ class="p-5 border border-t-0 border-gray-200 dark:border-gray-700"
398
+ class:border-b-0={i != vals.length - 1}
399
+ >
400
+ <div class="relative">
401
+ <Molecule
402
+ molvalue={item.sdf}
403
+ showCovMod={showCovModVals[i]}
404
+ on:updateMol={updateMol}
405
+ />
406
+ </div>
407
+ </div>
408
+ <!-- {:else if metals.includes(item.name)}
409
+ {item.name}
410
+ {:else}
411
+ {item.smiles} -->
412
+ {/if}
413
+ {/if}
414
+ {/if}
415
+ {/each}
416
+
417
+ <div class="p-5 border border-t-0 border-gray-200 dark:border-gray-700">
418
+ {#if covMods.length > 0}
419
+ <h4 class="text-center font-bold text-xl">Covalent Modification</h4>
420
+ {#each covMods as covMod, i}
421
+ <div class="flex p-10">
422
+ <div class="flex divide-x rounded border p-1">
423
+ <div class="w-3/5 flex-col px-2">
424
+ <div class="flex justify-center">
425
+ <span class="text-base font-medium text-gray-900">Protein</span>
426
+ </div>
427
+ <div class="grid grid-cols-4 font-bold">
428
+ <span>Chain</span>
429
+ <span>Residue</span>
430
+ <span>Atom</span>
431
+ <span>Chirality</span>
432
+ </div>
433
+ <div class="grid grid-cols-4">
434
+ <select
435
+ name=""
436
+ id=""
437
+ bind:value={covMods[i].protein}
438
+ on:change={() => dispatch("updateCovMod", covMods)}
439
+ >
440
+ {#each proteinChains as chain}
441
+ <option value={chain}>{chain}</option>
442
+ {/each}
443
+ </select>
444
+ <input
445
+ type="text"
446
+ placeholder="residue "
447
+ class="px-3"
448
+ value={covMod.residue}
449
+ on:input={(e) => {
450
+ covMods[i].residue = e.target.value;
451
+ dispatch("updateCovMod", covMods);
452
+ }}
453
+ />
454
+
455
+ <select
456
+ name=""
457
+ id=""
458
+ bind:value={covMods[i].atom}
459
+ on:change={() => dispatch("updateCovMod", covMods)}
460
+ >
461
+ {#if covMod.residue != ""}
462
+ {#each getResAtoms(covMod) as atom}}
463
+ <option value={atom}>{getResname(covMod)}:{atom}</option>
464
+ {/each}
465
+ {:else}
466
+ <option disabled></option>
467
+ {/if}
468
+ </select>
469
+
470
+ <select
471
+ name=""
472
+ id=""
473
+ bind:value={covMods[i].protein_symmetry}
474
+ on:change={() => dispatch("updateCovMod", covMods)}
475
+ >
476
+ <option value="">no chirality defined</option>
477
+ <option value="CW">CW</option>
478
+ <option value="CCW">CCW</option>
479
+ </select>
480
+ </div>
481
+ </div>
482
+
483
+ <div class="w-2/5 px-2">
484
+ <div class="flex-col p-1">
485
+ <div class="flex justify-center">
486
+ <span
487
+ class="w-full whitespace-nowrap text-center text-base font-medium text-gray-900"
488
+ >Small molecule</span
489
+ >
490
+ </div>
491
+ <div class="grid grid-cols-3 font-bold">
492
+ <span>Chain</span>
493
+ <span title="click on atom in structure">Atom index </span>
494
+
495
+ <span>Chirality</span>
496
+ </div>
497
+ <div class="grid grid-cols-3">
498
+ <select
499
+ name=""
500
+ id=""
501
+ title="click on atom in structure"
502
+ bind:value={covMods[i].ligand}
503
+ on:change={() => dispatch("updateCovMod", covMods)}
504
+ >
505
+ {#each ligandChains as chain}
506
+ <option value={chain} selected={chain === covMod.ligand}
507
+ >{chain}</option
508
+ >
509
+ {/each}
510
+ </select>
511
+ <div>
512
+ {#if covMod.attachmentIndex}
513
+ <p class="font-mono">index {covMod.attachmentIndex}</p>
514
+ {:else}
515
+ <p class="font-mono">click on atom</p>
516
+ {/if}
517
+ </div>
518
+
519
+ <select
520
+ name=""
521
+ id=""
522
+ bind:value={covMods[i].ligand_symmetry}
523
+ on:change={() => dispatch("updateCovMod", covMods)}
524
+ >
525
+ <option value="">no chirality defined</option>
526
+ <option value="CW">CW</option>
527
+ <option value="CCW">CCW</option>
528
+ </select>
529
+ </div>
530
+ </div>
531
+ </div>
532
+ </div>
533
+
534
+ <div class="flex items-center p-2">
535
+ <svg
536
+ data-slot="icon"
537
+ fill="none"
538
+ stroke-width="2"
539
+ stroke="currentColor"
540
+ viewBox="0 0 24 24"
541
+ xmlns="http://www.w3.org/2000/svg"
542
+ aria-hidden="true"
543
+ class="w-8 h-8 text-red-800 cursor-pointer"
544
+ on:click={(e) => {
545
+ dispatch("removeCovMod", i);
546
+ }}
547
+ >
548
+ <path
549
+ stroke-linecap="round"
550
+ stroke-linejoin="round"
551
+ d="M6 18 18 6M6 6l12 12"
552
+ ></path>
553
+ </svg>
554
+ </div>
555
+ </div>
556
+ {/each}
557
+ {/if}
558
+ </div>
559
+ <!--
560
+ <h2 id="accordion-collapse-heading-2">
561
+ <button
562
+ type="button"
563
+ class="flex items-center justify-between w-full p-5 font-medium rtl:text-right text-gray-500 border border-b-0 border-gray-200 focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-800 dark:border-gray-700 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 gap-3"
564
+ data-accordion-target="#accordion-collapse-body-2"
565
+ aria-expanded="false"
566
+ aria-controls="accordion-collapse-body-2"
567
+ >
568
+ <div>
569
+ <span
570
+ class="inline-flex items-center justify-center p-1 px-2 text-xs font-semibold text-blue-800 bg-blue-200 rounded-full"
571
+ >
572
+ A
573
+ </span>
574
+ <span>NA sequence</span>
575
+ </div>
576
+ <svg
577
+ data-accordion-icon
578
+ class="w-3 h-3 -rotate-90 shrink-0"
579
+ aria-hidden="true"
580
+ xmlns="http://www.w3.org/2000/svg"
581
+ fill="none"
582
+ viewBox="0 0 10 6"
583
+ >
584
+ <path
585
+ stroke="currentColor"
586
+ stroke-linecap="round"
587
+ stroke-linejoin="round"
588
+ stroke-width="2"
589
+ d="M9 5 5 1 1 5"
590
+ />
591
+ </svg>
592
+ </button>
593
+ <div class="px-2">
594
+ <Sequence />
595
+ </div>
596
+ </h2>
597
+
598
+ <div
599
+ id="accordion-collapse-body-2"
600
+ class="hidden"
601
+ aria-labelledby="accordion-collapse-heading-2"
602
+ >
603
+ <div
604
+ class="p-5 border border-b-0 border-gray-200 dark:border-gray-700"
605
+ ></div>
606
+ </div>
607
+ <h2 id="accordion-collapse-heading-3">
608
+ <button
609
+ type="button"
610
+ class="flex items-center justify-between w-full p-5 font-medium rtl:text-right text-gray-500 border border-gray-200 focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-800 dark:border-gray-700 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 gap-3"
611
+ data-accordion-target="#accordion-collapse-body-3"
612
+ aria-expanded="false"
613
+ aria-controls="accordion-collapse-body-3"
614
+ >
615
+ <div>
616
+ <span
617
+ class="inline-flex items-center justify-center p-1 px-2 text-xs font-semibold text-blue-800 bg-orange-200 rounded-full"
618
+ >
619
+ C
620
+ </span>
621
+ <span>Small molecule</span>
622
+ </div>
623
+ <svg
624
+ data-accordion-icon
625
+ class="w-3 h-3 rotate-180 shrink-0"
626
+ aria-hidden="true"
627
+ xmlns="http://www.w3.org/2000/svg"
628
+ fill="none"
629
+ viewBox="0 0 10 6"
630
+ >
631
+ <path
632
+ stroke="currentColor"
633
+ stroke-linecap="round"
634
+ stroke-linejoin="round"
635
+ stroke-width="2"
636
+ d="M9 5 5 1 1 5"
637
+ />
638
+ </svg>
639
+ </button>
640
+ </h2>
641
+ <div
642
+ id="accordion-collapse-body-3"
643
+ aria-labelledby="accordion-collapse-heading-3"
644
+ >
645
+ <div class="p-5 border border-t-0 border-gray-200 dark:border-gray-700">
646
+ <label
647
+ class="block mb-2 text-sm font-medium text-gray-900 dark:text-white"
648
+ for="file_input">Upload file</label
649
+ >
650
+ <input
651
+ class="block w-full text-sm text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400"
652
+ aria-describedby="file_input_help"
653
+ id="file_input"
654
+ type="file"
655
+ />
656
+ <p
657
+ class="mt-1 text-sm text-gray-500 dark:text-gray-300"
658
+ id="file_input_help"
659
+ >
660
+ SVG, PNG, JPG or GIF (MAX. 800x400px).
661
+ </p>
662
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
663
+
664
+ <textarea
665
+ id="message"
666
+ rows="4"
667
+ class="block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
668
+ placeholder="SMILES like CCC ..."
669
+ ></textarea>
670
+
671
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
672
+
673
+ <SearchInput database="rcsb-3ligand" />
674
+
675
+ <div class="text-center text-gray-400 w-full my-2">- or -</div>
676
+
677
+ <div class="text-center text-gray-600 font-bold mb-2">Metal ion</div>
678
+ <div class="flex justify-center space-x-2">
679
+ <div
680
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden bg-violet-100 rounded-full dark:bg-gray-600"
681
+ >
682
+ <span class="font-medium text-gray-600 dark:text-gray-300">ZN</span>
683
+ </div>
684
+
685
+ <div
686
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden bg-green-100 rounded-full dark:bg-gray-600"
687
+ >
688
+ <span class="font-medium text-gray-600 dark:text-gray-300">MG</span>
689
+ </div>
690
+
691
+ <div
692
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden bg-green-100 rounded-full dark:bg-gray-600"
693
+ >
694
+ <span class="font-medium text-gray-600 dark:text-gray-300">CA</span>
695
+ </div>
696
+
697
+ <div
698
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden bg-violet-100 rounded-full dark:bg-gray-600"
699
+ >
700
+ <span class="font-medium text-gray-600 dark:text-gray-300">FE</span>
701
+ </div>
702
+
703
+ <div
704
+ class="relative inline-flex items-center justify-center w-10 h-10 overflow-hidden bg-yellow-100 rounded-full dark:bg-gray-600"
705
+ >
706
+ <span class="font-medium text-gray-600 dark:text-gray-300">NA</span>
707
+ </div>
708
+ </div>
709
+ </div>
710
+ </div>
711
+
712
+ -->
713
+ </div>
714
+
715
+ <style>
716
+ /*
717
+ ! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com
718
+ */
719
+
720
+ /*
721
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
722
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
723
+ */
724
+
725
+ *,
726
+ ::before,
727
+ ::after {
728
+ box-sizing: border-box;
729
+ /* 1 */
730
+ border-width: 0;
731
+ /* 2 */
732
+ border-style: solid;
733
+ /* 2 */
734
+ border-color: #e5e7eb;
735
+ /* 2 */
736
+ }
737
+
738
+ ::before,
739
+ ::after {
740
+ --tw-content: "";
741
+ }
742
+
743
+ /*
744
+ 1. Use a consistent sensible line-height in all browsers.
745
+ 2. Prevent adjustments of font size after orientation changes in iOS.
746
+ 3. Use a more readable tab size.
747
+ 4. Use the user's configured `sans` font-family by default.
748
+ 5. Use the user's configured `sans` font-feature-settings by default.
749
+ 6. Use the user's configured `sans` font-variation-settings by default.
750
+ 7. Disable tap highlights on iOS
751
+ */
752
+
753
+ html,
754
+ :host {
755
+ line-height: 1.5;
756
+ /* 1 */
757
+ -webkit-text-size-adjust: 100%;
758
+ /* 2 */
759
+ -moz-tab-size: 4;
760
+ /* 3 */
761
+ tab-size: 4;
762
+ /* 3 */
763
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
764
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
765
+ /* 4 */
766
+ font-feature-settings: normal;
767
+ /* 5 */
768
+ font-variation-settings: normal;
769
+ /* 6 */
770
+ -webkit-tap-highlight-color: transparent;
771
+ /* 7 */
772
+ }
773
+
774
+ /*
775
+ 1. Remove the margin in all browsers.
776
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
777
+ */
778
+
779
+ body {
780
+ margin: 0;
781
+ /* 1 */
782
+ line-height: inherit;
783
+ /* 2 */
784
+ }
785
+
786
+ /*
787
+ 1. Add the correct height in Firefox.
788
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
789
+ 3. Ensure horizontal rules are visible by default.
790
+ */
791
+
792
+ hr {
793
+ height: 0;
794
+ /* 1 */
795
+ color: inherit;
796
+ /* 2 */
797
+ border-top-width: 1px;
798
+ /* 3 */
799
+ }
800
+
801
+ /*
802
+ Add the correct text decoration in Chrome, Edge, and Safari.
803
+ */
804
+
805
+ abbr:where([title]) {
806
+ text-decoration: underline dotted;
807
+ }
808
+
809
+ /*
810
+ Remove the default font size and weight for headings.
811
+ */
812
+
813
+ h1,
814
+ h2,
815
+ h3,
816
+ h4,
817
+ h5,
818
+ h6 {
819
+ font-size: inherit;
820
+ font-weight: inherit;
821
+ }
822
+
823
+ /*
824
+ Reset links to optimize for opt-in styling instead of opt-out.
825
+ */
826
+
827
+ a {
828
+ color: inherit;
829
+ text-decoration: inherit;
830
+ }
831
+
832
+ /*
833
+ Add the correct font weight in Edge and Safari.
834
+ */
835
+
836
+ b,
837
+ strong {
838
+ font-weight: bolder;
839
+ }
840
+
841
+ /*
842
+ 1. Use the user's configured `mono` font-family by default.
843
+ 2. Use the user's configured `mono` font-feature-settings by default.
844
+ 3. Use the user's configured `mono` font-variation-settings by default.
845
+ 4. Correct the odd `em` font sizing in all browsers.
846
+ */
847
+
848
+ code,
849
+ kbd,
850
+ samp,
851
+ pre {
852
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
853
+ "Liberation Mono", "Courier New", monospace;
854
+ /* 1 */
855
+ font-feature-settings: normal;
856
+ /* 2 */
857
+ font-variation-settings: normal;
858
+ /* 3 */
859
+ font-size: 1em;
860
+ /* 4 */
861
+ }
862
+
863
+ /*
864
+ Add the correct font size in all browsers.
865
+ */
866
+
867
+ small {
868
+ font-size: 80%;
869
+ }
870
+
871
+ /*
872
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
873
+ */
874
+
875
+ sub,
876
+ sup {
877
+ font-size: 75%;
878
+ line-height: 0;
879
+ position: relative;
880
+ vertical-align: baseline;
881
+ }
882
+
883
+ sub {
884
+ bottom: -0.25em;
885
+ }
886
+
887
+ sup {
888
+ top: -0.5em;
889
+ }
890
+
891
+ /*
892
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
893
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
894
+ 3. Remove gaps between table borders by default.
895
+ */
896
+
897
+ table {
898
+ text-indent: 0;
899
+ /* 1 */
900
+ border-color: inherit;
901
+ /* 2 */
902
+ border-collapse: collapse;
903
+ /* 3 */
904
+ }
905
+
906
+ /*
907
+ 1. Change the font styles in all browsers.
908
+ 2. Remove the margin in Firefox and Safari.
909
+ 3. Remove default padding in all browsers.
910
+ */
911
+
912
+ button,
913
+ input,
914
+ optgroup,
915
+ select,
916
+ textarea {
917
+ font-family: inherit;
918
+ /* 1 */
919
+ font-feature-settings: inherit;
920
+ /* 1 */
921
+ font-variation-settings: inherit;
922
+ /* 1 */
923
+ font-size: 100%;
924
+ /* 1 */
925
+ font-weight: inherit;
926
+ /* 1 */
927
+ line-height: inherit;
928
+ /* 1 */
929
+ letter-spacing: inherit;
930
+ /* 1 */
931
+ color: inherit;
932
+ /* 1 */
933
+ margin: 0;
934
+ /* 2 */
935
+ padding: 0;
936
+ /* 3 */
937
+ }
938
+
939
+ /*
940
+ Remove the inheritance of text transform in Edge and Firefox.
941
+ */
942
+
943
+ button,
944
+ select {
945
+ text-transform: none;
946
+ }
947
+
948
+ /*
949
+ 1. Correct the inability to style clickable types in iOS and Safari.
950
+ 2. Remove default button styles.
951
+ */
952
+
953
+ button,
954
+ input:where([type="button"]),
955
+ input:where([type="reset"]),
956
+ input:where([type="submit"]) {
957
+ -webkit-appearance: button;
958
+ /* 1 */
959
+ background-color: transparent;
960
+ /* 2 */
961
+ background-image: none;
962
+ /* 2 */
963
+ }
964
+
965
+ /*
966
+ Use the modern Firefox focus style for all focusable elements.
967
+ */
968
+
969
+ :-moz-focusring {
970
+ outline: auto;
971
+ }
972
+
973
+ /*
974
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
975
+ */
976
+
977
+ :-moz-ui-invalid {
978
+ box-shadow: none;
979
+ }
980
+
981
+ /*
982
+ Add the correct vertical alignment in Chrome and Firefox.
983
+ */
984
+
985
+ progress {
986
+ vertical-align: baseline;
987
+ }
988
+
989
+ /*
990
+ Correct the cursor style of increment and decrement buttons in Safari.
991
+ */
992
+
993
+ ::-webkit-inner-spin-button,
994
+ ::-webkit-outer-spin-button {
995
+ height: auto;
996
+ }
997
+
998
+ /*
999
+ 1. Correct the odd appearance in Chrome and Safari.
1000
+ 2. Correct the outline style in Safari.
1001
+ */
1002
+
1003
+ [type="search"] {
1004
+ -webkit-appearance: textfield;
1005
+ /* 1 */
1006
+ outline-offset: -2px;
1007
+ /* 2 */
1008
+ }
1009
+
1010
+ /*
1011
+ Remove the inner padding in Chrome and Safari on macOS.
1012
+ */
1013
+
1014
+ ::-webkit-search-decoration {
1015
+ -webkit-appearance: none;
1016
+ }
1017
+
1018
+ /*
1019
+ 1. Correct the inability to style clickable types in iOS and Safari.
1020
+ 2. Change font properties to `inherit` in Safari.
1021
+ */
1022
+
1023
+ ::-webkit-file-upload-button {
1024
+ -webkit-appearance: button;
1025
+ /* 1 */
1026
+ font: inherit;
1027
+ /* 2 */
1028
+ }
1029
+
1030
+ /*
1031
+ Add the correct display in Chrome and Safari.
1032
+ */
1033
+
1034
+ summary {
1035
+ display: list-item;
1036
+ }
1037
+
1038
+ /*
1039
+ Removes the default spacing and border for appropriate elements.
1040
+ */
1041
+
1042
+ blockquote,
1043
+ dl,
1044
+ dd,
1045
+ h1,
1046
+ h2,
1047
+ h3,
1048
+ h4,
1049
+ h5,
1050
+ h6,
1051
+ hr,
1052
+ figure,
1053
+ p,
1054
+ pre {
1055
+ margin: 0;
1056
+ }
1057
+
1058
+ fieldset {
1059
+ margin: 0;
1060
+ padding: 0;
1061
+ }
1062
+
1063
+ legend {
1064
+ padding: 0;
1065
+ }
1066
+
1067
+ ol,
1068
+ ul,
1069
+ menu {
1070
+ list-style: none;
1071
+ margin: 0;
1072
+ padding: 0;
1073
+ }
1074
+
1075
+ /*
1076
+ Reset default styling for dialogs.
1077
+ */
1078
+
1079
+ dialog {
1080
+ padding: 0;
1081
+ }
1082
+
1083
+ /*
1084
+ Prevent resizing textareas horizontally by default.
1085
+ */
1086
+
1087
+ textarea {
1088
+ resize: vertical;
1089
+ }
1090
+
1091
+ /*
1092
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
1093
+ 2. Set the default placeholder color to the user's configured gray 400 color.
1094
+ */
1095
+
1096
+ input::placeholder,
1097
+ textarea::placeholder {
1098
+ opacity: 1;
1099
+ /* 1 */
1100
+ color: #9ca3af;
1101
+ /* 2 */
1102
+ }
1103
+
1104
+ /*
1105
+ Set the default cursor for buttons.
1106
+ */
1107
+
1108
+ button,
1109
+ [role="button"] {
1110
+ cursor: pointer;
1111
+ }
1112
+
1113
+ /*
1114
+ Make sure disabled buttons don't get the pointer cursor.
1115
+ */
1116
+
1117
+ :disabled {
1118
+ cursor: default;
1119
+ }
1120
+
1121
+ /*
1122
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
1123
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
1124
+ This can trigger a poorly considered lint error in some tools but is included by design.
1125
+ */
1126
+
1127
+ img,
1128
+ svg,
1129
+ video,
1130
+ canvas,
1131
+ audio,
1132
+ iframe,
1133
+ embed,
1134
+ object {
1135
+ display: block;
1136
+ /* 1 */
1137
+ vertical-align: middle;
1138
+ /* 2 */
1139
+ }
1140
+
1141
+ /*
1142
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
1143
+ */
1144
+
1145
+ img,
1146
+ video {
1147
+ max-width: 100%;
1148
+ height: auto;
1149
+ }
1150
+
1151
+ /* Make elements with the HTML hidden attribute stay hidden by default */
1152
+
1153
+ [hidden] {
1154
+ display: none;
1155
+ }
1156
+
1157
+ *,
1158
+ ::before,
1159
+ ::after {
1160
+ --tw-border-spacing-x: 0;
1161
+ --tw-border-spacing-y: 0;
1162
+ --tw-translate-x: 0;
1163
+ --tw-translate-y: 0;
1164
+ --tw-rotate: 0;
1165
+ --tw-skew-x: 0;
1166
+ --tw-skew-y: 0;
1167
+ --tw-scale-x: 1;
1168
+ --tw-scale-y: 1;
1169
+ --tw-pan-x: ;
1170
+ --tw-pan-y: ;
1171
+ --tw-pinch-zoom: ;
1172
+ --tw-scroll-snap-strictness: proximity;
1173
+ --tw-gradient-from-position: ;
1174
+ --tw-gradient-via-position: ;
1175
+ --tw-gradient-to-position: ;
1176
+ --tw-ordinal: ;
1177
+ --tw-slashed-zero: ;
1178
+ --tw-numeric-figure: ;
1179
+ --tw-numeric-spacing: ;
1180
+ --tw-numeric-fraction: ;
1181
+ --tw-ring-inset: ;
1182
+ --tw-ring-offset-width: 0px;
1183
+ --tw-ring-offset-color: #fff;
1184
+ --tw-ring-color: rgb(59 130 246 / 0.5);
1185
+ --tw-ring-offset-shadow: 0 0 #0000;
1186
+ --tw-ring-shadow: 0 0 #0000;
1187
+ --tw-shadow: 0 0 #0000;
1188
+ --tw-shadow-colored: 0 0 #0000;
1189
+ --tw-blur: ;
1190
+ --tw-brightness: ;
1191
+ --tw-contrast: ;
1192
+ --tw-grayscale: ;
1193
+ --tw-hue-rotate: ;
1194
+ --tw-invert: ;
1195
+ --tw-saturate: ;
1196
+ --tw-sepia: ;
1197
+ --tw-drop-shadow: ;
1198
+ --tw-backdrop-blur: ;
1199
+ --tw-backdrop-brightness: ;
1200
+ --tw-backdrop-contrast: ;
1201
+ --tw-backdrop-grayscale: ;
1202
+ --tw-backdrop-hue-rotate: ;
1203
+ --tw-backdrop-invert: ;
1204
+ --tw-backdrop-opacity: ;
1205
+ --tw-backdrop-saturate: ;
1206
+ --tw-backdrop-sepia: ;
1207
+ --tw-contain-size: ;
1208
+ --tw-contain-layout: ;
1209
+ --tw-contain-paint: ;
1210
+ --tw-contain-style:
1211
+ ;
1212
+ }
1213
+
1214
+ ::backdrop {
1215
+ --tw-border-spacing-x: 0;
1216
+ --tw-border-spacing-y: 0;
1217
+ --tw-translate-x: 0;
1218
+ --tw-translate-y: 0;
1219
+ --tw-rotate: 0;
1220
+ --tw-skew-x: 0;
1221
+ --tw-skew-y: 0;
1222
+ --tw-scale-x: 1;
1223
+ --tw-scale-y: 1;
1224
+ --tw-pan-x: ;
1225
+ --tw-pan-y: ;
1226
+ --tw-pinch-zoom: ;
1227
+ --tw-scroll-snap-strictness: proximity;
1228
+ --tw-gradient-from-position: ;
1229
+ --tw-gradient-via-position: ;
1230
+ --tw-gradient-to-position: ;
1231
+ --tw-ordinal: ;
1232
+ --tw-slashed-zero: ;
1233
+ --tw-numeric-figure: ;
1234
+ --tw-numeric-spacing: ;
1235
+ --tw-numeric-fraction: ;
1236
+ --tw-ring-inset: ;
1237
+ --tw-ring-offset-width: 0px;
1238
+ --tw-ring-offset-color: #fff;
1239
+ --tw-ring-color: rgb(59 130 246 / 0.5);
1240
+ --tw-ring-offset-shadow: 0 0 #0000;
1241
+ --tw-ring-shadow: 0 0 #0000;
1242
+ --tw-shadow: 0 0 #0000;
1243
+ --tw-shadow-colored: 0 0 #0000;
1244
+ --tw-blur: ;
1245
+ --tw-brightness: ;
1246
+ --tw-contrast: ;
1247
+ --tw-grayscale: ;
1248
+ --tw-hue-rotate: ;
1249
+ --tw-invert: ;
1250
+ --tw-saturate: ;
1251
+ --tw-sepia: ;
1252
+ --tw-drop-shadow: ;
1253
+ --tw-backdrop-blur: ;
1254
+ --tw-backdrop-brightness: ;
1255
+ --tw-backdrop-contrast: ;
1256
+ --tw-backdrop-grayscale: ;
1257
+ --tw-backdrop-hue-rotate: ;
1258
+ --tw-backdrop-invert: ;
1259
+ --tw-backdrop-opacity: ;
1260
+ --tw-backdrop-saturate: ;
1261
+ --tw-backdrop-sepia: ;
1262
+ --tw-contain-size: ;
1263
+ --tw-contain-layout: ;
1264
+ --tw-contain-paint: ;
1265
+ --tw-contain-style:
1266
+ ;
1267
+ }
1268
+
1269
+ .collapse {
1270
+ visibility: collapse;
1271
+ }
1272
+
1273
+ .relative {
1274
+ position: relative;
1275
+ }
1276
+
1277
+ .my-2 {
1278
+ margin-top: 0.5rem;
1279
+ margin-bottom: 0.5rem;
1280
+ }
1281
+
1282
+ .mb-2 {
1283
+ margin-bottom: 0.5rem;
1284
+ }
1285
+
1286
+ .mt-1 {
1287
+ margin-top: 0.25rem;
1288
+ }
1289
+
1290
+ .block {
1291
+ display: block;
1292
+ }
1293
+
1294
+ .flex {
1295
+ display: flex;
1296
+ }
1297
+
1298
+ .inline-flex {
1299
+ display: inline-flex;
1300
+ }
1301
+
1302
+ .grid {
1303
+ display: grid;
1304
+ }
1305
+
1306
+ .hidden {
1307
+ display: none;
1308
+ }
1309
+
1310
+ .h-10 {
1311
+ height: 2.5rem;
1312
+ }
1313
+
1314
+ .h-3 {
1315
+ height: 0.75rem;
1316
+ }
1317
+
1318
+ .h-4 {
1319
+ height: 1rem;
1320
+ }
1321
+
1322
+ .w-10 {
1323
+ width: 2.5rem;
1324
+ }
1325
+
1326
+ .w-2\/5 {
1327
+ width: 40%;
1328
+ }
1329
+
1330
+ .w-3 {
1331
+ width: 0.75rem;
1332
+ }
1333
+
1334
+ .w-3\/5 {
1335
+ width: 60%;
1336
+ }
1337
+
1338
+ .w-4 {
1339
+ width: 1rem;
1340
+ }
1341
+
1342
+ .w-8 {
1343
+ width: 2rem;
1344
+ }
1345
+
1346
+ .w-full {
1347
+ width: 100%;
1348
+ }
1349
+
1350
+ .shrink-0 {
1351
+ flex-shrink: 0;
1352
+ }
1353
+
1354
+ .-rotate-90 {
1355
+ --tw-rotate: -90deg;
1356
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
1357
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
1358
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1359
+ }
1360
+
1361
+ .rotate-180 {
1362
+ --tw-rotate: 180deg;
1363
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
1364
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
1365
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1366
+ }
1367
+
1368
+ .cursor-pointer {
1369
+ cursor: pointer;
1370
+ }
1371
+
1372
+ .grid-cols-3 {
1373
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1374
+ }
1375
+
1376
+ .grid-cols-4 {
1377
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1378
+ }
1379
+
1380
+ .flex-col {
1381
+ flex-direction: column;
1382
+ }
1383
+
1384
+ .items-center {
1385
+ align-items: center;
1386
+ }
1387
+
1388
+ .justify-center {
1389
+ justify-content: center;
1390
+ }
1391
+
1392
+ .justify-between {
1393
+ justify-content: space-between;
1394
+ }
1395
+
1396
+ .gap-3 {
1397
+ gap: 0.75rem;
1398
+ }
1399
+
1400
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
1401
+ --tw-space-x-reverse: 0;
1402
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
1403
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
1404
+ }
1405
+
1406
+ .divide-x > :not([hidden]) ~ :not([hidden]) {
1407
+ --tw-divide-x-reverse: 0;
1408
+ border-right-width: calc(1px * var(--tw-divide-x-reverse));
1409
+ border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
1410
+ }
1411
+
1412
+ .overflow-hidden {
1413
+ overflow: hidden;
1414
+ }
1415
+
1416
+ .whitespace-nowrap {
1417
+ white-space: nowrap;
1418
+ }
1419
+
1420
+ .rounded {
1421
+ border-radius: 0.25rem;
1422
+ }
1423
+
1424
+ .rounded-full {
1425
+ border-radius: 9999px;
1426
+ }
1427
+
1428
+ .rounded-lg {
1429
+ border-radius: 0.5rem;
1430
+ }
1431
+
1432
+ .border {
1433
+ border-width: 1px;
1434
+ }
1435
+
1436
+ .border-b-0 {
1437
+ border-bottom-width: 0px;
1438
+ }
1439
+
1440
+ .border-t-0 {
1441
+ border-top-width: 0px;
1442
+ }
1443
+
1444
+ .border-gray-200 {
1445
+ --tw-border-opacity: 1;
1446
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
1447
+ }
1448
+
1449
+ .border-gray-300 {
1450
+ --tw-border-opacity: 1;
1451
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
1452
+ }
1453
+
1454
+ .bg-blue-200 {
1455
+ --tw-bg-opacity: 1;
1456
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
1457
+ }
1458
+
1459
+ .bg-gray-50 {
1460
+ --tw-bg-opacity: 1;
1461
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
1462
+ }
1463
+
1464
+ .bg-green-100 {
1465
+ --tw-bg-opacity: 1;
1466
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
1467
+ }
1468
+
1469
+ .bg-orange-200 {
1470
+ --tw-bg-opacity: 1;
1471
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
1472
+ }
1473
+
1474
+ .bg-violet-100 {
1475
+ --tw-bg-opacity: 1;
1476
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
1477
+ }
1478
+
1479
+ .bg-yellow-100 {
1480
+ --tw-bg-opacity: 1;
1481
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
1482
+ }
1483
+
1484
+ .p-1 {
1485
+ padding: 0.25rem;
1486
+ }
1487
+
1488
+ .p-10 {
1489
+ padding: 2.5rem;
1490
+ }
1491
+
1492
+ .p-2 {
1493
+ padding: 0.5rem;
1494
+ }
1495
+
1496
+ .p-2\.5 {
1497
+ padding: 0.625rem;
1498
+ }
1499
+
1500
+ .p-5 {
1501
+ padding: 1.25rem;
1502
+ }
1503
+
1504
+ .px-2 {
1505
+ padding-left: 0.5rem;
1506
+ padding-right: 0.5rem;
1507
+ }
1508
+
1509
+ .px-3 {
1510
+ padding-left: 0.75rem;
1511
+ padding-right: 0.75rem;
1512
+ }
1513
+
1514
+ .text-center {
1515
+ text-align: center;
1516
+ }
1517
+
1518
+ .font-mono {
1519
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
1520
+ "Liberation Mono", "Courier New", monospace;
1521
+ }
1522
+
1523
+ .text-base {
1524
+ font-size: 1rem;
1525
+ line-height: 1.5rem;
1526
+ }
1527
+
1528
+ .text-sm {
1529
+ font-size: 0.875rem;
1530
+ line-height: 1.25rem;
1531
+ }
1532
+
1533
+ .text-xl {
1534
+ font-size: 1.25rem;
1535
+ line-height: 1.75rem;
1536
+ }
1537
+
1538
+ .text-xs {
1539
+ font-size: 0.75rem;
1540
+ line-height: 1rem;
1541
+ }
1542
+
1543
+ .font-bold {
1544
+ font-weight: 700;
1545
+ }
1546
+
1547
+ .font-medium {
1548
+ font-weight: 500;
1549
+ }
1550
+
1551
+ .font-semibold {
1552
+ font-weight: 600;
1553
+ }
1554
+
1555
+ .text-blue-800 {
1556
+ --tw-text-opacity: 1;
1557
+ color: rgb(30 64 175 / var(--tw-text-opacity));
1558
+ }
1559
+
1560
+ .text-gray-400 {
1561
+ --tw-text-opacity: 1;
1562
+ color: rgb(156 163 175 / var(--tw-text-opacity));
1563
+ }
1564
+
1565
+ .text-gray-500 {
1566
+ --tw-text-opacity: 1;
1567
+ color: rgb(107 114 128 / var(--tw-text-opacity));
1568
+ }
1569
+
1570
+ .text-gray-600 {
1571
+ --tw-text-opacity: 1;
1572
+ color: rgb(75 85 99 / var(--tw-text-opacity));
1573
+ }
1574
+
1575
+ .text-gray-800 {
1576
+ --tw-text-opacity: 1;
1577
+ color: rgb(31 41 55 / var(--tw-text-opacity));
1578
+ }
1579
+
1580
+ .text-gray-900 {
1581
+ --tw-text-opacity: 1;
1582
+ color: rgb(17 24 39 / var(--tw-text-opacity));
1583
+ }
1584
+
1585
+ .text-red-800 {
1586
+ --tw-text-opacity: 1;
1587
+ color: rgb(153 27 27 / var(--tw-text-opacity));
1588
+ }
1589
+
1590
+ .hover\:bg-gray-100:hover {
1591
+ --tw-bg-opacity: 1;
1592
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1593
+ }
1594
+
1595
+ .focus\:border-blue-500:focus {
1596
+ --tw-border-opacity: 1;
1597
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1598
+ }
1599
+
1600
+ .focus\:outline-none:focus {
1601
+ outline: 2px solid transparent;
1602
+ outline-offset: 2px;
1603
+ }
1604
+
1605
+ .focus\:ring-4:focus {
1606
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1607
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1608
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1609
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1610
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1611
+ var(--tw-shadow, 0 0 #0000);
1612
+ }
1613
+
1614
+ .focus\:ring-blue-500:focus {
1615
+ --tw-ring-opacity: 1;
1616
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1617
+ }
1618
+
1619
+ .focus\:ring-gray-200:focus {
1620
+ --tw-ring-opacity: 1;
1621
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1622
+ }
1623
+
1624
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1625
+ text-align: right;
1626
+ }
1627
+
1628
+ @media (prefers-color-scheme: dark) {
1629
+ .dark\:border-gray-600 {
1630
+ --tw-border-opacity: 1;
1631
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1632
+ }
1633
+
1634
+ .dark\:border-gray-700 {
1635
+ --tw-border-opacity: 1;
1636
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1637
+ }
1638
+
1639
+ .dark\:bg-gray-600 {
1640
+ --tw-bg-opacity: 1;
1641
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1642
+ }
1643
+
1644
+ .dark\:bg-gray-700 {
1645
+ --tw-bg-opacity: 1;
1646
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1647
+ }
1648
+
1649
+ .dark\:bg-gray-900 {
1650
+ --tw-bg-opacity: 1;
1651
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1652
+ }
1653
+
1654
+ .dark\:text-gray-300 {
1655
+ --tw-text-opacity: 1;
1656
+ color: rgb(209 213 219 / var(--tw-text-opacity));
1657
+ }
1658
+
1659
+ .dark\:text-gray-400 {
1660
+ --tw-text-opacity: 1;
1661
+ color: rgb(156 163 175 / var(--tw-text-opacity));
1662
+ }
1663
+
1664
+ .dark\:text-white {
1665
+ --tw-text-opacity: 1;
1666
+ color: rgb(255 255 255 / var(--tw-text-opacity));
1667
+ }
1668
+
1669
+ .dark\:placeholder-gray-400::placeholder {
1670
+ --tw-placeholder-opacity: 1;
1671
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1672
+ }
1673
+
1674
+ .dark\:hover\:bg-gray-800:hover {
1675
+ --tw-bg-opacity: 1;
1676
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1677
+ }
1678
+
1679
+ .dark\:focus\:border-blue-500:focus {
1680
+ --tw-border-opacity: 1;
1681
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1682
+ }
1683
+
1684
+ .dark\:focus\:ring-blue-500:focus {
1685
+ --tw-ring-opacity: 1;
1686
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1687
+ }
1688
+
1689
+ .dark\:focus\:ring-gray-800:focus {
1690
+ --tw-ring-opacity: 1;
1691
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1692
+ }
1693
+ }
1694
+ </style>
src/frontend/shared/Button.svelte ADDED
@@ -0,0 +1,1438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script>
2
+ import { createEventDispatcher } from "svelte";
3
+
4
+ const dispatch = createEventDispatcher();
5
+ export let vals = [];
6
+ function addNewChain(type) {
7
+ dispatch("addNewChain", {
8
+ type: type,
9
+ });
10
+ }
11
+ function addCovalentModification() {
12
+ dispatch("addCovalentModification");
13
+ }
14
+
15
+ let displayCovMod = false;
16
+ // check if vals contains at least one protein and one ligand with sdf set
17
+ $: {
18
+ displayCovMod =
19
+ vals.filter((val) => val.class === "protein" && val.sequence.length > 0)
20
+ .length > 0 &&
21
+ vals.filter((val) => val.class === "ligand" && val.sdf != "").length > 0;
22
+ }
23
+ </script>
24
+
25
+ <div>
26
+ <div class="flex justify-center mt-2">
27
+ <button
28
+ class="flex items-center space-x-2 block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
29
+ on:click={() => {
30
+ addNewChain("protein");
31
+ }}
32
+ >
33
+ <svg
34
+ data-slot="icon"
35
+ fill="none"
36
+ stroke-width="1.5"
37
+ stroke="currentColor"
38
+ viewBox="0 0 24 24"
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ aria-hidden="true"
41
+ class="w-4 h-4"
42
+ >
43
+ <path
44
+ stroke-linecap="round"
45
+ stroke-linejoin="round"
46
+ d="M12 9v6m3-3H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
47
+ ></path>
48
+ </svg>
49
+
50
+ <span> Protein</span></button
51
+ >
52
+
53
+ <button
54
+ class="flex items-center space-x-2 block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
55
+ on:click={() => {
56
+ addNewChain("DNA");
57
+ }}
58
+ >
59
+ <svg
60
+ data-slot="icon"
61
+ fill="none"
62
+ stroke-width="1.5"
63
+ stroke="currentColor"
64
+ viewBox="0 0 24 24"
65
+ xmlns="http://www.w3.org/2000/svg"
66
+ aria-hidden="true"
67
+ class="w-4 h-4"
68
+ >
69
+ <path
70
+ stroke-linecap="round"
71
+ stroke-linejoin="round"
72
+ d="M12 9v6m3-3H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
73
+ ></path>
74
+ </svg>
75
+
76
+ <span> Nucleic acid</span></button
77
+ >
78
+
79
+ <button
80
+ class="flex items-center space-x-2 block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
81
+ on:click={() => {
82
+ addNewChain("ligand");
83
+ }}
84
+ >
85
+ <svg
86
+ data-slot="icon"
87
+ fill="none"
88
+ stroke-width="1.5"
89
+ stroke="currentColor"
90
+ viewBox="0 0 24 24"
91
+ xmlns="http://www.w3.org/2000/svg"
92
+ aria-hidden="true"
93
+ class="w-4 h-4"
94
+ >
95
+ <path
96
+ stroke-linecap="round"
97
+ stroke-linejoin="round"
98
+ d="M12 9v6m3-3H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
99
+ ></path>
100
+ </svg>
101
+
102
+ <span> Small molecule</span></button
103
+ >
104
+
105
+ {#if displayCovMod}
106
+ <button
107
+ class="flex items-center space-x-2 block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
108
+ on:click={() => {
109
+ addCovalentModification();
110
+ }}
111
+ >
112
+ <svg
113
+ data-slot="icon"
114
+ fill="none"
115
+ stroke-width="1.5"
116
+ stroke="currentColor"
117
+ viewBox="0 0 24 24"
118
+ xmlns="http://www.w3.org/2000/svg"
119
+ aria-hidden="true"
120
+ class="w-4 h-4"
121
+ >
122
+ <path
123
+ stroke-linecap="round"
124
+ stroke-linejoin="round"
125
+ d="M12 9v6m3-3H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
126
+ ></path>
127
+ </svg>
128
+
129
+ <span> Covalent modifcation</span></button
130
+ >
131
+ {/if}
132
+ </div>
133
+ </div>
134
+
135
+ <style>
136
+ /*
137
+ ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
138
+ */
139
+
140
+ /*
141
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
142
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
143
+ */
144
+
145
+ *,
146
+ ::before,
147
+ ::after {
148
+ box-sizing: border-box;
149
+ /* 1 */
150
+ border-width: 0;
151
+ /* 2 */
152
+ border-style: solid;
153
+ /* 2 */
154
+ border-color: #e5e7eb;
155
+ /* 2 */
156
+ }
157
+
158
+ ::before,
159
+ ::after {
160
+ --tw-content: "";
161
+ }
162
+
163
+ /*
164
+ 1. Use a consistent sensible line-height in all browsers.
165
+ 2. Prevent adjustments of font size after orientation changes in iOS.
166
+ 3. Use a more readable tab size.
167
+ 4. Use the user's configured `sans` font-family by default.
168
+ 5. Use the user's configured `sans` font-feature-settings by default.
169
+ 6. Use the user's configured `sans` font-variation-settings by default.
170
+ 7. Disable tap highlights on iOS
171
+ */
172
+
173
+ html,
174
+ :host {
175
+ line-height: 1.5;
176
+ /* 1 */
177
+ -webkit-text-size-adjust: 100%;
178
+ /* 2 */
179
+ -moz-tab-size: 4;
180
+ /* 3 */
181
+ tab-size: 4;
182
+ /* 3 */
183
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
184
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
185
+ /* 4 */
186
+ font-feature-settings: normal;
187
+ /* 5 */
188
+ font-variation-settings: normal;
189
+ /* 6 */
190
+ -webkit-tap-highlight-color: transparent;
191
+ /* 7 */
192
+ }
193
+
194
+ /*
195
+ 1. Remove the margin in all browsers.
196
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
197
+ */
198
+
199
+ body {
200
+ margin: 0;
201
+ /* 1 */
202
+ line-height: inherit;
203
+ /* 2 */
204
+ }
205
+
206
+ /*
207
+ 1. Add the correct height in Firefox.
208
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
209
+ 3. Ensure horizontal rules are visible by default.
210
+ */
211
+
212
+ hr {
213
+ height: 0;
214
+ /* 1 */
215
+ color: inherit;
216
+ /* 2 */
217
+ border-top-width: 1px;
218
+ /* 3 */
219
+ }
220
+
221
+ /*
222
+ Add the correct text decoration in Chrome, Edge, and Safari.
223
+ */
224
+
225
+ abbr:where([title]) {
226
+ text-decoration: underline dotted;
227
+ }
228
+
229
+ /*
230
+ Remove the default font size and weight for headings.
231
+ */
232
+
233
+ h1,
234
+ h2,
235
+ h3,
236
+ h4,
237
+ h5,
238
+ h6 {
239
+ font-size: inherit;
240
+ font-weight: inherit;
241
+ }
242
+
243
+ /*
244
+ Reset links to optimize for opt-in styling instead of opt-out.
245
+ */
246
+
247
+ a {
248
+ color: inherit;
249
+ text-decoration: inherit;
250
+ }
251
+
252
+ /*
253
+ Add the correct font weight in Edge and Safari.
254
+ */
255
+
256
+ b,
257
+ strong {
258
+ font-weight: bolder;
259
+ }
260
+
261
+ /*
262
+ 1. Use the user's configured `mono` font-family by default.
263
+ 2. Use the user's configured `mono` font-feature-settings by default.
264
+ 3. Use the user's configured `mono` font-variation-settings by default.
265
+ 4. Correct the odd `em` font sizing in all browsers.
266
+ */
267
+
268
+ code,
269
+ kbd,
270
+ samp,
271
+ pre {
272
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
273
+ "Liberation Mono", "Courier New", monospace;
274
+ /* 1 */
275
+ font-feature-settings: normal;
276
+ /* 2 */
277
+ font-variation-settings: normal;
278
+ /* 3 */
279
+ font-size: 1em;
280
+ /* 4 */
281
+ }
282
+
283
+ /*
284
+ Add the correct font size in all browsers.
285
+ */
286
+
287
+ small {
288
+ font-size: 80%;
289
+ }
290
+
291
+ /*
292
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
293
+ */
294
+
295
+ sub,
296
+ sup {
297
+ font-size: 75%;
298
+ line-height: 0;
299
+ position: relative;
300
+ vertical-align: baseline;
301
+ }
302
+
303
+ sub {
304
+ bottom: -0.25em;
305
+ }
306
+
307
+ sup {
308
+ top: -0.5em;
309
+ }
310
+
311
+ /*
312
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
313
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
314
+ 3. Remove gaps between table borders by default.
315
+ */
316
+
317
+ table {
318
+ text-indent: 0;
319
+ /* 1 */
320
+ border-color: inherit;
321
+ /* 2 */
322
+ border-collapse: collapse;
323
+ /* 3 */
324
+ }
325
+
326
+ /*
327
+ 1. Change the font styles in all browsers.
328
+ 2. Remove the margin in Firefox and Safari.
329
+ 3. Remove default padding in all browsers.
330
+ */
331
+
332
+ button,
333
+ input,
334
+ optgroup,
335
+ select,
336
+ textarea {
337
+ font-family: inherit;
338
+ /* 1 */
339
+ font-feature-settings: inherit;
340
+ /* 1 */
341
+ font-variation-settings: inherit;
342
+ /* 1 */
343
+ font-size: 100%;
344
+ /* 1 */
345
+ font-weight: inherit;
346
+ /* 1 */
347
+ line-height: inherit;
348
+ /* 1 */
349
+ color: inherit;
350
+ /* 1 */
351
+ margin: 0;
352
+ /* 2 */
353
+ padding: 0;
354
+ /* 3 */
355
+ }
356
+
357
+ /*
358
+ Remove the inheritance of text transform in Edge and Firefox.
359
+ */
360
+
361
+ button,
362
+ select {
363
+ text-transform: none;
364
+ }
365
+
366
+ /*
367
+ 1. Correct the inability to style clickable types in iOS and Safari.
368
+ 2. Remove default button styles.
369
+ */
370
+
371
+ button,
372
+ [type="button"],
373
+ [type="reset"],
374
+ [type="submit"] {
375
+ -webkit-appearance: button;
376
+ /* 1 */
377
+ background-color: transparent;
378
+ /* 2 */
379
+ background-image: none;
380
+ /* 2 */
381
+ }
382
+
383
+ /*
384
+ Use the modern Firefox focus style for all focusable elements.
385
+ */
386
+
387
+ :-moz-focusring {
388
+ outline: auto;
389
+ }
390
+
391
+ /*
392
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
393
+ */
394
+
395
+ :-moz-ui-invalid {
396
+ box-shadow: none;
397
+ }
398
+
399
+ /*
400
+ Add the correct vertical alignment in Chrome and Firefox.
401
+ */
402
+
403
+ progress {
404
+ vertical-align: baseline;
405
+ }
406
+
407
+ /*
408
+ Correct the cursor style of increment and decrement buttons in Safari.
409
+ */
410
+
411
+ ::-webkit-inner-spin-button,
412
+ ::-webkit-outer-spin-button {
413
+ height: auto;
414
+ }
415
+
416
+ /*
417
+ 1. Correct the odd appearance in Chrome and Safari.
418
+ 2. Correct the outline style in Safari.
419
+ */
420
+
421
+ [type="search"] {
422
+ -webkit-appearance: textfield;
423
+ /* 1 */
424
+ outline-offset: -2px;
425
+ /* 2 */
426
+ }
427
+
428
+ /*
429
+ Remove the inner padding in Chrome and Safari on macOS.
430
+ */
431
+
432
+ ::-webkit-search-decoration {
433
+ -webkit-appearance: none;
434
+ }
435
+
436
+ /*
437
+ 1. Correct the inability to style clickable types in iOS and Safari.
438
+ 2. Change font properties to `inherit` in Safari.
439
+ */
440
+
441
+ ::-webkit-file-upload-button {
442
+ -webkit-appearance: button;
443
+ /* 1 */
444
+ font: inherit;
445
+ /* 2 */
446
+ }
447
+
448
+ /*
449
+ Add the correct display in Chrome and Safari.
450
+ */
451
+
452
+ summary {
453
+ display: list-item;
454
+ }
455
+
456
+ /*
457
+ Removes the default spacing and border for appropriate elements.
458
+ */
459
+
460
+ blockquote,
461
+ dl,
462
+ dd,
463
+ h1,
464
+ h2,
465
+ h3,
466
+ h4,
467
+ h5,
468
+ h6,
469
+ hr,
470
+ figure,
471
+ p,
472
+ pre {
473
+ margin: 0;
474
+ }
475
+
476
+ fieldset {
477
+ margin: 0;
478
+ padding: 0;
479
+ }
480
+
481
+ legend {
482
+ padding: 0;
483
+ }
484
+
485
+ ol,
486
+ ul,
487
+ menu {
488
+ list-style: none;
489
+ margin: 0;
490
+ padding: 0;
491
+ }
492
+
493
+ /*
494
+ Reset default styling for dialogs.
495
+ */
496
+
497
+ dialog {
498
+ padding: 0;
499
+ }
500
+
501
+ /*
502
+ Prevent resizing textareas horizontally by default.
503
+ */
504
+
505
+ textarea {
506
+ resize: vertical;
507
+ }
508
+
509
+ /*
510
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
511
+ 2. Set the default placeholder color to the user's configured gray 400 color.
512
+ */
513
+
514
+ input::placeholder,
515
+ textarea::placeholder {
516
+ opacity: 1;
517
+ /* 1 */
518
+ color: #9ca3af;
519
+ /* 2 */
520
+ }
521
+
522
+ /*
523
+ Set the default cursor for buttons.
524
+ */
525
+
526
+ button,
527
+ [role="button"] {
528
+ cursor: pointer;
529
+ }
530
+
531
+ /*
532
+ Make sure disabled buttons don't get the pointer cursor.
533
+ */
534
+
535
+ :disabled {
536
+ cursor: default;
537
+ }
538
+
539
+ /*
540
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
541
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
542
+ This can trigger a poorly considered lint error in some tools but is included by design.
543
+ */
544
+
545
+ img,
546
+ svg,
547
+ video,
548
+ canvas,
549
+ audio,
550
+ iframe,
551
+ embed,
552
+ object {
553
+ display: block;
554
+ /* 1 */
555
+ vertical-align: middle;
556
+ /* 2 */
557
+ }
558
+
559
+ /*
560
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
561
+ */
562
+
563
+ img,
564
+ video {
565
+ max-width: 100%;
566
+ height: auto;
567
+ }
568
+
569
+ /* Make elements with the HTML hidden attribute stay hidden by default */
570
+
571
+ [hidden] {
572
+ display: none;
573
+ }
574
+
575
+ *,
576
+ ::before,
577
+ ::after {
578
+ --tw-border-spacing-x: 0;
579
+ --tw-border-spacing-y: 0;
580
+ --tw-translate-x: 0;
581
+ --tw-translate-y: 0;
582
+ --tw-rotate: 0;
583
+ --tw-skew-x: 0;
584
+ --tw-skew-y: 0;
585
+ --tw-scale-x: 1;
586
+ --tw-scale-y: 1;
587
+ --tw-pan-x: ;
588
+ --tw-pan-y: ;
589
+ --tw-pinch-zoom: ;
590
+ --tw-scroll-snap-strictness: proximity;
591
+ --tw-gradient-from-position: ;
592
+ --tw-gradient-via-position: ;
593
+ --tw-gradient-to-position: ;
594
+ --tw-ordinal: ;
595
+ --tw-slashed-zero: ;
596
+ --tw-numeric-figure: ;
597
+ --tw-numeric-spacing: ;
598
+ --tw-numeric-fraction: ;
599
+ --tw-ring-inset: ;
600
+ --tw-ring-offset-width: 0px;
601
+ --tw-ring-offset-color: #fff;
602
+ --tw-ring-color: rgb(59 130 246 / 0.5);
603
+ --tw-ring-offset-shadow: 0 0 #0000;
604
+ --tw-ring-shadow: 0 0 #0000;
605
+ --tw-shadow: 0 0 #0000;
606
+ --tw-shadow-colored: 0 0 #0000;
607
+ --tw-blur: ;
608
+ --tw-brightness: ;
609
+ --tw-contrast: ;
610
+ --tw-grayscale: ;
611
+ --tw-hue-rotate: ;
612
+ --tw-invert: ;
613
+ --tw-saturate: ;
614
+ --tw-sepia: ;
615
+ --tw-drop-shadow: ;
616
+ --tw-backdrop-blur: ;
617
+ --tw-backdrop-brightness: ;
618
+ --tw-backdrop-contrast: ;
619
+ --tw-backdrop-grayscale: ;
620
+ --tw-backdrop-hue-rotate: ;
621
+ --tw-backdrop-invert: ;
622
+ --tw-backdrop-opacity: ;
623
+ --tw-backdrop-saturate: ;
624
+ --tw-backdrop-sepia: ;
625
+ }
626
+
627
+ ::backdrop {
628
+ --tw-border-spacing-x: 0;
629
+ --tw-border-spacing-y: 0;
630
+ --tw-translate-x: 0;
631
+ --tw-translate-y: 0;
632
+ --tw-rotate: 0;
633
+ --tw-skew-x: 0;
634
+ --tw-skew-y: 0;
635
+ --tw-scale-x: 1;
636
+ --tw-scale-y: 1;
637
+ --tw-pan-x: ;
638
+ --tw-pan-y: ;
639
+ --tw-pinch-zoom: ;
640
+ --tw-scroll-snap-strictness: proximity;
641
+ --tw-gradient-from-position: ;
642
+ --tw-gradient-via-position: ;
643
+ --tw-gradient-to-position: ;
644
+ --tw-ordinal: ;
645
+ --tw-slashed-zero: ;
646
+ --tw-numeric-figure: ;
647
+ --tw-numeric-spacing: ;
648
+ --tw-numeric-fraction: ;
649
+ --tw-ring-inset: ;
650
+ --tw-ring-offset-width: 0px;
651
+ --tw-ring-offset-color: #fff;
652
+ --tw-ring-color: rgb(59 130 246 / 0.5);
653
+ --tw-ring-offset-shadow: 0 0 #0000;
654
+ --tw-ring-shadow: 0 0 #0000;
655
+ --tw-shadow: 0 0 #0000;
656
+ --tw-shadow-colored: 0 0 #0000;
657
+ --tw-blur: ;
658
+ --tw-brightness: ;
659
+ --tw-contrast: ;
660
+ --tw-grayscale: ;
661
+ --tw-hue-rotate: ;
662
+ --tw-invert: ;
663
+ --tw-saturate: ;
664
+ --tw-sepia: ;
665
+ --tw-drop-shadow: ;
666
+ --tw-backdrop-blur: ;
667
+ --tw-backdrop-brightness: ;
668
+ --tw-backdrop-contrast: ;
669
+ --tw-backdrop-grayscale: ;
670
+ --tw-backdrop-hue-rotate: ;
671
+ --tw-backdrop-invert: ;
672
+ --tw-backdrop-opacity: ;
673
+ --tw-backdrop-saturate: ;
674
+ --tw-backdrop-sepia: ;
675
+ }
676
+
677
+ .sr-only {
678
+ position: absolute;
679
+ width: 1px;
680
+ height: 1px;
681
+ padding: 0;
682
+ margin: -1px;
683
+ overflow: hidden;
684
+ clip: rect(0, 0, 0, 0);
685
+ white-space: nowrap;
686
+ border-width: 0;
687
+ }
688
+
689
+ .collapse {
690
+ visibility: collapse;
691
+ }
692
+
693
+ .absolute {
694
+ position: absolute;
695
+ }
696
+
697
+ .relative {
698
+ position: relative;
699
+ }
700
+
701
+ .inset-0 {
702
+ inset: 0px;
703
+ }
704
+
705
+ .end-0 {
706
+ inset-inline-end: 0px;
707
+ }
708
+
709
+ .top-0 {
710
+ top: 0px;
711
+ }
712
+
713
+ .z-10 {
714
+ z-index: 10;
715
+ }
716
+
717
+ .z-20 {
718
+ z-index: 20;
719
+ }
720
+
721
+ .mx-10 {
722
+ margin-left: 2.5rem;
723
+ margin-right: 2.5rem;
724
+ }
725
+
726
+ .mx-auto {
727
+ margin-left: auto;
728
+ margin-right: auto;
729
+ }
730
+
731
+ .my-2 {
732
+ margin-top: 0.5rem;
733
+ margin-bottom: 0.5rem;
734
+ }
735
+
736
+ .mb-10 {
737
+ margin-bottom: 2.5rem;
738
+ }
739
+
740
+ .mb-2 {
741
+ margin-bottom: 0.5rem;
742
+ }
743
+
744
+ .ms-2 {
745
+ margin-inline-start: 0.5rem;
746
+ }
747
+
748
+ .ms-2\.5 {
749
+ margin-inline-start: 0.625rem;
750
+ }
751
+
752
+ .ms-3 {
753
+ margin-inline-start: 0.75rem;
754
+ }
755
+
756
+ .mt-1 {
757
+ margin-top: 0.25rem;
758
+ }
759
+
760
+ .mt-6 {
761
+ margin-top: 1.5rem;
762
+ }
763
+
764
+ .block {
765
+ display: block;
766
+ }
767
+
768
+ .inline-block {
769
+ display: inline-block;
770
+ }
771
+
772
+ .inline {
773
+ display: inline;
774
+ }
775
+
776
+ .flex {
777
+ display: flex;
778
+ }
779
+
780
+ .inline-flex {
781
+ display: inline-flex;
782
+ }
783
+
784
+ .hidden {
785
+ display: none;
786
+ }
787
+
788
+ .h-10 {
789
+ height: 2.5rem;
790
+ }
791
+
792
+ .h-2 {
793
+ height: 0.5rem;
794
+ }
795
+
796
+ .h-2\.5 {
797
+ height: 0.625rem;
798
+ }
799
+
800
+ .h-3 {
801
+ height: 0.75rem;
802
+ }
803
+
804
+ .h-4 {
805
+ height: 1rem;
806
+ }
807
+
808
+ .h-6 {
809
+ height: 1.5rem;
810
+ }
811
+
812
+ .h-full {
813
+ height: 100%;
814
+ }
815
+
816
+ .min-h-screen {
817
+ min-height: 100vh;
818
+ }
819
+
820
+ .w-1\/3 {
821
+ width: 33.333333%;
822
+ }
823
+
824
+ .w-10 {
825
+ width: 2.5rem;
826
+ }
827
+
828
+ .w-2 {
829
+ width: 0.5rem;
830
+ }
831
+
832
+ .w-2\.5 {
833
+ width: 0.625rem;
834
+ }
835
+
836
+ .w-3 {
837
+ width: 0.75rem;
838
+ }
839
+
840
+ .w-4 {
841
+ width: 1rem;
842
+ }
843
+
844
+ .w-44 {
845
+ width: 11rem;
846
+ }
847
+
848
+ .w-6 {
849
+ width: 1.5rem;
850
+ }
851
+
852
+ .w-full {
853
+ width: 100%;
854
+ }
855
+
856
+ .max-w-lg {
857
+ max-width: 32rem;
858
+ }
859
+
860
+ .flex-shrink-0 {
861
+ flex-shrink: 0;
862
+ }
863
+
864
+ .shrink-0 {
865
+ flex-shrink: 0;
866
+ }
867
+
868
+ .-rotate-90 {
869
+ --tw-rotate: -90deg;
870
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
871
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
872
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
873
+ }
874
+
875
+ .rotate-180 {
876
+ --tw-rotate: 180deg;
877
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
878
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
879
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
880
+ }
881
+
882
+ .cursor-pointer {
883
+ cursor: pointer;
884
+ }
885
+
886
+ .flex-col {
887
+ flex-direction: column;
888
+ }
889
+
890
+ .items-center {
891
+ align-items: center;
892
+ }
893
+
894
+ .justify-center {
895
+ justify-content: center;
896
+ }
897
+
898
+ .justify-between {
899
+ justify-content: space-between;
900
+ }
901
+
902
+ .gap-3 {
903
+ gap: 0.75rem;
904
+ }
905
+
906
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
907
+ --tw-space-x-reverse: 0;
908
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
909
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
910
+ }
911
+
912
+ .divide-y > :not([hidden]) ~ :not([hidden]) {
913
+ --tw-divide-y-reverse: 0;
914
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
915
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
916
+ }
917
+
918
+ .divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
919
+ --tw-divide-opacity: 1;
920
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
921
+ }
922
+
923
+ .overflow-hidden {
924
+ overflow: hidden;
925
+ }
926
+
927
+ .whitespace-nowrap {
928
+ white-space: nowrap;
929
+ }
930
+
931
+ .rounded-full {
932
+ border-radius: 9999px;
933
+ }
934
+
935
+ .rounded-lg {
936
+ border-radius: 0.5rem;
937
+ }
938
+
939
+ .rounded-e-lg {
940
+ border-start-end-radius: 0.5rem;
941
+ border-end-end-radius: 0.5rem;
942
+ }
943
+
944
+ .rounded-s-lg {
945
+ border-start-start-radius: 0.5rem;
946
+ border-end-start-radius: 0.5rem;
947
+ }
948
+
949
+ .rounded-t-xl {
950
+ border-top-left-radius: 0.75rem;
951
+ border-top-right-radius: 0.75rem;
952
+ }
953
+
954
+ .border {
955
+ border-width: 1px;
956
+ }
957
+
958
+ .border-b-0 {
959
+ border-bottom-width: 0px;
960
+ }
961
+
962
+ .border-s-2 {
963
+ border-inline-start-width: 2px;
964
+ }
965
+
966
+ .border-t-0 {
967
+ border-top-width: 0px;
968
+ }
969
+
970
+ .border-blue-700 {
971
+ --tw-border-opacity: 1;
972
+ border-color: rgb(29 78 216 / var(--tw-border-opacity));
973
+ }
974
+
975
+ .border-gray-200 {
976
+ --tw-border-opacity: 1;
977
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
978
+ }
979
+
980
+ .border-gray-300 {
981
+ --tw-border-opacity: 1;
982
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
983
+ }
984
+
985
+ .border-s-gray-50 {
986
+ --tw-border-opacity: 1;
987
+ border-inline-start-color: rgb(249 250 251 / var(--tw-border-opacity));
988
+ }
989
+
990
+ .bg-blue-200 {
991
+ --tw-bg-opacity: 1;
992
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
993
+ }
994
+
995
+ .bg-blue-700 {
996
+ --tw-bg-opacity: 1;
997
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
998
+ }
999
+
1000
+ .bg-gray-100 {
1001
+ --tw-bg-opacity: 1;
1002
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1003
+ }
1004
+
1005
+ .bg-gray-50 {
1006
+ --tw-bg-opacity: 1;
1007
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
1008
+ }
1009
+
1010
+ .bg-green-100 {
1011
+ --tw-bg-opacity: 1;
1012
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
1013
+ }
1014
+
1015
+ .bg-green-200 {
1016
+ --tw-bg-opacity: 1;
1017
+ background-color: rgb(187 247 208 / var(--tw-bg-opacity));
1018
+ }
1019
+
1020
+ .bg-orange-200 {
1021
+ --tw-bg-opacity: 1;
1022
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
1023
+ }
1024
+
1025
+ .bg-violet-100 {
1026
+ --tw-bg-opacity: 1;
1027
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
1028
+ }
1029
+
1030
+ .bg-white {
1031
+ --tw-bg-opacity: 1;
1032
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1033
+ }
1034
+
1035
+ .bg-yellow-100 {
1036
+ --tw-bg-opacity: 1;
1037
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
1038
+ }
1039
+
1040
+ .bg-\[url\(\/img\/grid\.svg\)\] {
1041
+ background-image: url(/img/grid.svg);
1042
+ }
1043
+
1044
+ .bg-center {
1045
+ background-position: center;
1046
+ }
1047
+
1048
+ .p-0 {
1049
+ padding: 0px;
1050
+ }
1051
+
1052
+ .p-0\.5 {
1053
+ padding: 0.125rem;
1054
+ }
1055
+
1056
+ .p-1 {
1057
+ padding: 0.25rem;
1058
+ }
1059
+
1060
+ .p-2 {
1061
+ padding: 0.5rem;
1062
+ }
1063
+
1064
+ .p-2\.5 {
1065
+ padding: 0.625rem;
1066
+ }
1067
+
1068
+ .p-5 {
1069
+ padding: 1.25rem;
1070
+ }
1071
+
1072
+ .px-2 {
1073
+ padding-left: 0.5rem;
1074
+ padding-right: 0.5rem;
1075
+ }
1076
+
1077
+ .px-4 {
1078
+ padding-left: 1rem;
1079
+ padding-right: 1rem;
1080
+ }
1081
+
1082
+ .px-5 {
1083
+ padding-left: 1.25rem;
1084
+ padding-right: 1.25rem;
1085
+ }
1086
+
1087
+ .px-6 {
1088
+ padding-left: 1.5rem;
1089
+ padding-right: 1.5rem;
1090
+ }
1091
+
1092
+ .py-2 {
1093
+ padding-top: 0.5rem;
1094
+ padding-bottom: 0.5rem;
1095
+ }
1096
+
1097
+ .py-2\.5 {
1098
+ padding-top: 0.625rem;
1099
+ padding-bottom: 0.625rem;
1100
+ }
1101
+
1102
+ .py-6 {
1103
+ padding-top: 1.5rem;
1104
+ padding-bottom: 1.5rem;
1105
+ }
1106
+
1107
+ .pb-2 {
1108
+ padding-bottom: 0.5rem;
1109
+ }
1110
+
1111
+ .pb-8 {
1112
+ padding-bottom: 2rem;
1113
+ }
1114
+
1115
+ .pt-10 {
1116
+ padding-top: 2.5rem;
1117
+ }
1118
+
1119
+ .text-center {
1120
+ text-align: center;
1121
+ }
1122
+
1123
+ .text-sm {
1124
+ font-size: 0.875rem;
1125
+ line-height: 1.25rem;
1126
+ }
1127
+
1128
+ .text-xs {
1129
+ font-size: 0.75rem;
1130
+ line-height: 1rem;
1131
+ }
1132
+
1133
+ .font-bold {
1134
+ font-weight: 700;
1135
+ }
1136
+
1137
+ .font-medium {
1138
+ font-weight: 500;
1139
+ }
1140
+
1141
+ .font-semibold {
1142
+ font-weight: 600;
1143
+ }
1144
+
1145
+ .text-blue-800 {
1146
+ --tw-text-opacity: 1;
1147
+ color: rgb(30 64 175);
1148
+ }
1149
+
1150
+ .text-gray-400 {
1151
+ --tw-text-opacity: 1;
1152
+ color: rgb(156 163 175);
1153
+ }
1154
+
1155
+ .text-gray-500 {
1156
+ --tw-text-opacity: 1;
1157
+ color: rgb(107 114 128);
1158
+ }
1159
+
1160
+ .text-gray-600 {
1161
+ --tw-text-opacity: 1;
1162
+ color: rgb(75 85 99);
1163
+ }
1164
+
1165
+ .text-gray-700 {
1166
+ --tw-text-opacity: 1;
1167
+ color: rgb(55 65 81);
1168
+ }
1169
+
1170
+ .text-gray-900 {
1171
+ --tw-text-opacity: 1;
1172
+ color: rgb(17 24 39);
1173
+ }
1174
+
1175
+ .text-white {
1176
+ --tw-text-opacity: 1;
1177
+ color: rgb(255 255 255);
1178
+ }
1179
+
1180
+ .shadow {
1181
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1182
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
1183
+ 0 1px 2px -1px var(--tw-shadow-color);
1184
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1185
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1186
+ }
1187
+
1188
+ .shadow-xl {
1189
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
1190
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
1191
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),
1192
+ 0 8px 10px -6px var(--tw-shadow-color);
1193
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1194
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1195
+ }
1196
+
1197
+ .ring-1 {
1198
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1199
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1200
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1201
+ calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1202
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1203
+ var(--tw-shadow, 0 0 #0000);
1204
+ }
1205
+
1206
+ .ring-gray-900\/5 {
1207
+ --tw-ring-color: rgb(17 24 39 / 0.05);
1208
+ }
1209
+
1210
+ .sequence_container {
1211
+ overflow-wrap: anywhere;
1212
+ counter-reset: sequence;
1213
+ }
1214
+
1215
+ .sequence_container .sequence__chunk {
1216
+ display: inline-block;
1217
+ margin: 0.1rem 0 1rem 1rem;
1218
+ /* width: 10ch; */
1219
+ position: relative;
1220
+ white-space: nowrap;
1221
+ }
1222
+
1223
+ .sequence_container .sequence__chunk:not(:last-child):before,
1224
+ .sequence_container .sequence__chunk--display-last:before {
1225
+ content: counter(sequence);
1226
+ counter-increment: sequence 10;
1227
+ position: absolute;
1228
+ top: -0.8em;
1229
+ right: 0;
1230
+ opacity: 0.5;
1231
+ font-weight: bold;
1232
+ }
1233
+
1234
+ .sequence-container .sequence__chunk::after {
1235
+ content: "";
1236
+ position: absolute;
1237
+ bottom: 0;
1238
+ left: 0;
1239
+ right: 0;
1240
+ transform-origin: left;
1241
+ transform: scaleX(0.1);
1242
+ box-shadow: var(--box-shadow);
1243
+ }
1244
+
1245
+ .sequence__chunk span {
1246
+ padding: 0 0.05rem;
1247
+ }
1248
+
1249
+ .hover\:bg-blue-800:hover {
1250
+ --tw-bg-opacity: 1;
1251
+ background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1252
+ }
1253
+
1254
+ .hover\:bg-gray-100:hover {
1255
+ --tw-bg-opacity: 1;
1256
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1257
+ }
1258
+
1259
+ .hover\:bg-gray-200:hover {
1260
+ --tw-bg-opacity: 1;
1261
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1262
+ }
1263
+
1264
+ .hover\:font-bold:hover {
1265
+ font-weight: 700;
1266
+ }
1267
+
1268
+ .focus\:border-blue-500:focus {
1269
+ --tw-border-opacity: 1;
1270
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1271
+ }
1272
+
1273
+ .focus\:outline-none:focus {
1274
+ outline: 2px solid transparent;
1275
+ outline-offset: 2px;
1276
+ }
1277
+
1278
+ .focus\:ring-4:focus {
1279
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1280
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1281
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1282
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1283
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1284
+ var(--tw-shadow, 0 0 #0000);
1285
+ }
1286
+
1287
+ .focus\:ring-blue-300:focus {
1288
+ --tw-ring-opacity: 1;
1289
+ --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1290
+ }
1291
+
1292
+ .focus\:ring-blue-500:focus {
1293
+ --tw-ring-opacity: 1;
1294
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1295
+ }
1296
+
1297
+ .focus\:ring-gray-100:focus {
1298
+ --tw-ring-opacity: 1;
1299
+ --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity));
1300
+ }
1301
+
1302
+ .focus\:ring-gray-200:focus {
1303
+ --tw-ring-opacity: 1;
1304
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1305
+ }
1306
+
1307
+ @media (min-width: 640px) {
1308
+ .sm\:mx-auto {
1309
+ margin-left: auto;
1310
+ margin-right: auto;
1311
+ }
1312
+
1313
+ .sm\:rounded-lg {
1314
+ border-radius: 0.5rem;
1315
+ }
1316
+
1317
+ .sm\:px-10 {
1318
+ padding-left: 2.5rem;
1319
+ padding-right: 2.5rem;
1320
+ }
1321
+
1322
+ .sm\:py-12 {
1323
+ padding-top: 3rem;
1324
+ padding-bottom: 3rem;
1325
+ }
1326
+ }
1327
+
1328
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1329
+ text-align: right;
1330
+ }
1331
+
1332
+ @media (prefers-color-scheme: dark) {
1333
+ .dark\:border-gray-600 {
1334
+ --tw-border-opacity: 1;
1335
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1336
+ }
1337
+
1338
+ .dark\:border-gray-700 {
1339
+ --tw-border-opacity: 1;
1340
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1341
+ }
1342
+
1343
+ .dark\:border-s-gray-700 {
1344
+ --tw-border-opacity: 1;
1345
+ border-inline-start-color: rgb(55 65 81 / var(--tw-border-opacity));
1346
+ }
1347
+
1348
+ .dark\:bg-blue-600 {
1349
+ --tw-bg-opacity: 1;
1350
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1351
+ }
1352
+
1353
+ .dark\:bg-gray-600 {
1354
+ --tw-bg-opacity: 1;
1355
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1356
+ }
1357
+
1358
+ .dark\:bg-gray-700 {
1359
+ --tw-bg-opacity: 1;
1360
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1361
+ }
1362
+
1363
+ .dark\:bg-gray-900 {
1364
+ --tw-bg-opacity: 1;
1365
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1366
+ }
1367
+
1368
+ .dark\:text-gray-200 {
1369
+ --tw-text-opacity: 1;
1370
+ color: rgb(229 231 235);
1371
+ }
1372
+
1373
+ .dark\:text-gray-300 {
1374
+ --tw-text-opacity: 1;
1375
+ color: rgb(209 213 219);
1376
+ }
1377
+
1378
+ .dark\:text-gray-400 {
1379
+ --tw-text-opacity: 1;
1380
+ color: rgb(156 163 175);
1381
+ }
1382
+
1383
+ .dark\:text-white {
1384
+ --tw-text-opacity: 1;
1385
+ color: rgb(255 255 255);
1386
+ }
1387
+
1388
+ .dark\:placeholder-gray-400::placeholder {
1389
+ --tw-placeholder-opacity: 1;
1390
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1391
+ }
1392
+
1393
+ .dark\:hover\:bg-blue-700:hover {
1394
+ --tw-bg-opacity: 1;
1395
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1396
+ }
1397
+
1398
+ .dark\:hover\:bg-gray-600:hover {
1399
+ --tw-bg-opacity: 1;
1400
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1401
+ }
1402
+
1403
+ .dark\:hover\:bg-gray-800:hover {
1404
+ --tw-bg-opacity: 1;
1405
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1406
+ }
1407
+
1408
+ .dark\:hover\:text-white:hover {
1409
+ --tw-text-opacity: 1;
1410
+ color: rgb(255 255 255);
1411
+ }
1412
+
1413
+ .dark\:focus\:border-blue-500:focus {
1414
+ --tw-border-opacity: 1;
1415
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1416
+ }
1417
+
1418
+ .dark\:focus\:ring-blue-500:focus {
1419
+ --tw-ring-opacity: 1;
1420
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1421
+ }
1422
+
1423
+ .dark\:focus\:ring-blue-800:focus {
1424
+ --tw-ring-opacity: 1;
1425
+ --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1426
+ }
1427
+
1428
+ .dark\:focus\:ring-gray-700:focus {
1429
+ --tw-ring-opacity: 1;
1430
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
1431
+ }
1432
+
1433
+ .dark\:focus\:ring-gray-800:focus {
1434
+ --tw-ring-opacity: 1;
1435
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1436
+ }
1437
+ }
1438
+ </style>
src/frontend/shared/Molecule.svelte ADDED
@@ -0,0 +1,1029 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script>
2
+ import { createEventDispatcher, afterUpdate } from "svelte";
3
+
4
+ const dispatch = createEventDispatcher();
5
+ import Dmol from "3dmol";
6
+
7
+ // export let whichCovMod = 0;
8
+
9
+ let viewer = null;
10
+
11
+ let attachmentIndex = null;
12
+ let deleteIndexes = [];
13
+
14
+ let mode = "attach";
15
+
16
+ function updateReps(viewer) {
17
+ viewer.setStyle({ stick: {} });
18
+ if (showCovMod > -1) {
19
+ if (attachmentIndex !== null) {
20
+ viewer.addStyle(
21
+ { index: attachmentIndex },
22
+ { sphere: { color: "blue", scale: 0.5 } }
23
+ );
24
+ }
25
+
26
+ viewer.addStyle(
27
+ { index: deleteIndexes },
28
+ { sphere: { color: "red", scale: 0.5 } }
29
+ );
30
+
31
+ dispatch("updateMol", {
32
+ attachmentIndex: attachmentIndex,
33
+ deleteIndexes: deleteIndexes,
34
+ index: showCovMod,
35
+ mol: viewer.exportJSON(),
36
+ });
37
+ }
38
+ }
39
+ function initializeMoleculeViewer(molecule, container) {
40
+ let viewer = Dmol.createViewer(container, {});
41
+ viewer.addModel(molecule, "sdf");
42
+ updateReps(viewer);
43
+ viewer.setBackgroundColor("white");
44
+ viewer.zoomTo();
45
+
46
+ viewer
47
+ .getModel(0)
48
+ .setClickable({}, true, function (atom, viewer, event, container) {
49
+ if (showCovMod > -1) {
50
+ if (mode === "attach") {
51
+ attachmentIndex = atom.serial;
52
+ } else {
53
+ if (deleteIndexes.includes(atom.serial)) {
54
+ deleteIndexes = deleteIndexes.filter(
55
+ (index) => index !== atom.serial
56
+ );
57
+ } else {
58
+ deleteIndexes.push(atom.serial);
59
+ }
60
+ deleteIndexes = deleteIndexes;
61
+ updateReps(viewer);
62
+ }
63
+ }
64
+ });
65
+ viewer.render();
66
+
67
+ return viewer;
68
+ }
69
+ export let molvalue = "";
70
+ export let showCovMod = -1;
71
+ let molcontainer = null;
72
+ afterUpdate(() => {
73
+ viewer = initializeMoleculeViewer(molvalue, molcontainer);
74
+ });
75
+ </script>
76
+
77
+ <div class="mol-wrapper">
78
+ <div class="relative">
79
+ <div class="mol-canvas" bind:this={molcontainer}></div>
80
+ </div>
81
+ <div class="flex flex-col justify-center">
82
+ {#if showCovMod > -1}
83
+ <div class="w-full text-center text-lg mb-2">Covalent Modification</div>
84
+ <div class="flex items-center space-x-2 justify-center mb-2 text-xs">
85
+ <svg
86
+ data-slot="icon"
87
+ fill="none"
88
+ stroke-width="1.5"
89
+ class="w-4 h-4"
90
+ stroke="currentColor"
91
+ viewBox="0 0 24 24"
92
+ xmlns="http://www.w3.org/2000/svg"
93
+ aria-hidden="true"
94
+ >
95
+ <path
96
+ stroke-linecap="round"
97
+ stroke-linejoin="round"
98
+ d="M15.042 21.672 13.684 16.6m0 0-2.51 2.225.569-9.47 5.227 7.917-3.286-.672Zm-7.518-.267A8.25 8.25 0 1 1 20.25 10.5M8.288 14.212A5.25 5.25 0 1 1 17.25 10.5"
99
+ ></path>
100
+ </svg> <span class="px-2">click on atoms in viewer to select them</span>
101
+ </div>
102
+ <div
103
+ class="flex rounded-full border-2 border-gray-200 bg-gray-200 text-sm leading-none text-gray-500"
104
+ >
105
+ <button
106
+ class="w-1/2 flex items-center rounded-l-full px-4 py-2 transition-colors duration-300 ease-in hover:text-orange-600 focus:text-orange-600 focus:outline-none"
107
+ id="attach"
108
+ class:active={mode === "attach"}
109
+ on:click={() => (mode = "attach")}
110
+ >
111
+ <svg
112
+ xmlns="http://www.w3.org/2000/svg"
113
+ fill="none"
114
+ viewBox="0 0 24 24"
115
+ stroke-width="1.5"
116
+ stroke="currentColor"
117
+ class="mx-1 h-4 w-4"
118
+ >
119
+ <path
120
+ stroke-linecap="round"
121
+ stroke-linejoin="round"
122
+ d="m18.375 12.739-7.693 7.693a4.5 4.5 0 0 1-6.364-6.364l10.94-10.94A3 3 0 1 1 19.5 7.372L8.552 18.32m.009-.01-.01.01m5.699-9.941-7.81 7.81a1.5 1.5 0 0 0 2.112 2.13"
123
+ />
124
+ </svg>
125
+
126
+ <span>Attachment atom</span>
127
+ </button>
128
+ <button
129
+ class="w-1/2 flex items-center rounded-r-full px-4 py-2 transition-colors duration-300 ease-in hover:text-orange-600 focus:text-orange-600 focus:outline-none"
130
+ id="delete"
131
+ class:active={mode === "delete"}
132
+ on:click={() => (mode = "delete")}
133
+ >
134
+ <svg
135
+ xmlns="http://www.w3.org/2000/svg"
136
+ fill="none"
137
+ viewBox="0 0 24 24"
138
+ stroke-width="1.5"
139
+ stroke="currentColor"
140
+ class="mx-1 h-4 w-4"
141
+ >
142
+ <path
143
+ stroke-linecap="round"
144
+ stroke-linejoin="round"
145
+ d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
146
+ />
147
+ </svg>
148
+
149
+ <span>Atoms to delete</span>
150
+ </button>
151
+ </div>
152
+
153
+ <div class="relative overflow-x-auto mt-3">
154
+ <table
155
+ class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400"
156
+ >
157
+ <thead
158
+ class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400"
159
+ >
160
+ <tr>
161
+ <th scope="col" class="px-6 py-3"> </th>
162
+ <th scope="col" class="px-6 py-3"> index </th>
163
+ </tr>
164
+ </thead>
165
+ <tbody>
166
+ <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
167
+ <th
168
+ scope="row"
169
+ class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white text-right"
170
+ >
171
+ Attachment atom
172
+ </th>
173
+ <td class="px-6 py-4 font-mono">
174
+ {#if attachmentIndex !== null}
175
+ {attachmentIndex}
176
+ {:else}
177
+ not selected
178
+ {/if}
179
+ </td>
180
+ </tr>
181
+
182
+ <tr class="bg-white dark:bg-gray-800">
183
+ <th
184
+ scope="row"
185
+ class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white text-right"
186
+ >
187
+ Deleted atoms
188
+ </th>
189
+ <td class="px-6 py-4 font-mono">
190
+ {#if deleteIndexes.length > 0}
191
+ {deleteIndexes.join(", ")}
192
+ {:else}
193
+ no atoms are deleted
194
+ {/if}
195
+ </td>
196
+ </tr>
197
+ </tbody>
198
+ </table>
199
+ </div>
200
+ {/if}
201
+ </div>
202
+ </div>
203
+
204
+ <style>
205
+ .active {
206
+ background: white;
207
+ border-radius: 9999px;
208
+ color: rgb(234, 88, 12);
209
+ }
210
+ .mol-canvas {
211
+ width: 200px;
212
+ height: 200px;
213
+ margin: 0 auto;
214
+ }
215
+ .mol-wrapper {
216
+ width: 100%;
217
+ display: flex;
218
+ justify-content: center;
219
+ }
220
+ /*
221
+ ! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com
222
+ */
223
+
224
+ /*
225
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
226
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
227
+ */
228
+
229
+ *,
230
+ ::before,
231
+ ::after {
232
+ box-sizing: border-box;
233
+ /* 1 */
234
+ border-width: 0;
235
+ /* 2 */
236
+ border-style: solid;
237
+ /* 2 */
238
+ border-color: #e5e7eb;
239
+ /* 2 */
240
+ }
241
+
242
+ ::before,
243
+ ::after {
244
+ --tw-content: "";
245
+ }
246
+
247
+ /*
248
+ 1. Use a consistent sensible line-height in all browsers.
249
+ 2. Prevent adjustments of font size after orientation changes in iOS.
250
+ 3. Use a more readable tab size.
251
+ 4. Use the user's configured `sans` font-family by default.
252
+ 5. Use the user's configured `sans` font-feature-settings by default.
253
+ 6. Use the user's configured `sans` font-variation-settings by default.
254
+ 7. Disable tap highlights on iOS
255
+ */
256
+
257
+ html,
258
+ :host {
259
+ line-height: 1.5;
260
+ /* 1 */
261
+ -webkit-text-size-adjust: 100%;
262
+ /* 2 */
263
+ -moz-tab-size: 4;
264
+ /* 3 */
265
+ tab-size: 4;
266
+ /* 3 */
267
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
268
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
269
+ /* 4 */
270
+ font-feature-settings: normal;
271
+ /* 5 */
272
+ font-variation-settings: normal;
273
+ /* 6 */
274
+ -webkit-tap-highlight-color: transparent;
275
+ /* 7 */
276
+ }
277
+
278
+ /*
279
+ 1. Remove the margin in all browsers.
280
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
281
+ */
282
+
283
+ body {
284
+ margin: 0;
285
+ /* 1 */
286
+ line-height: inherit;
287
+ /* 2 */
288
+ }
289
+
290
+ /*
291
+ 1. Add the correct height in Firefox.
292
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
293
+ 3. Ensure horizontal rules are visible by default.
294
+ */
295
+
296
+ hr {
297
+ height: 0;
298
+ /* 1 */
299
+ color: inherit;
300
+ /* 2 */
301
+ border-top-width: 1px;
302
+ /* 3 */
303
+ }
304
+
305
+ /*
306
+ Add the correct text decoration in Chrome, Edge, and Safari.
307
+ */
308
+
309
+ abbr:where([title]) {
310
+ text-decoration: underline dotted;
311
+ }
312
+
313
+ /*
314
+ Remove the default font size and weight for headings.
315
+ */
316
+
317
+ h1,
318
+ h2,
319
+ h3,
320
+ h4,
321
+ h5,
322
+ h6 {
323
+ font-size: inherit;
324
+ font-weight: inherit;
325
+ }
326
+
327
+ /*
328
+ Reset links to optimize for opt-in styling instead of opt-out.
329
+ */
330
+
331
+ a {
332
+ color: inherit;
333
+ text-decoration: inherit;
334
+ }
335
+
336
+ /*
337
+ Add the correct font weight in Edge and Safari.
338
+ */
339
+
340
+ b,
341
+ strong {
342
+ font-weight: bolder;
343
+ }
344
+
345
+ /*
346
+ 1. Use the user's configured `mono` font-family by default.
347
+ 2. Use the user's configured `mono` font-feature-settings by default.
348
+ 3. Use the user's configured `mono` font-variation-settings by default.
349
+ 4. Correct the odd `em` font sizing in all browsers.
350
+ */
351
+
352
+ code,
353
+ kbd,
354
+ samp,
355
+ pre {
356
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
357
+ "Liberation Mono", "Courier New", monospace;
358
+ /* 1 */
359
+ font-feature-settings: normal;
360
+ /* 2 */
361
+ font-variation-settings: normal;
362
+ /* 3 */
363
+ font-size: 1em;
364
+ /* 4 */
365
+ }
366
+
367
+ /*
368
+ Add the correct font size in all browsers.
369
+ */
370
+
371
+ small {
372
+ font-size: 80%;
373
+ }
374
+
375
+ /*
376
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
377
+ */
378
+
379
+ sub,
380
+ sup {
381
+ font-size: 75%;
382
+ line-height: 0;
383
+ position: relative;
384
+ vertical-align: baseline;
385
+ }
386
+
387
+ sub {
388
+ bottom: -0.25em;
389
+ }
390
+
391
+ sup {
392
+ top: -0.5em;
393
+ }
394
+
395
+ /*
396
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
397
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
398
+ 3. Remove gaps between table borders by default.
399
+ */
400
+
401
+ table {
402
+ text-indent: 0;
403
+ /* 1 */
404
+ border-color: inherit;
405
+ /* 2 */
406
+ border-collapse: collapse;
407
+ /* 3 */
408
+ }
409
+
410
+ /*
411
+ 1. Change the font styles in all browsers.
412
+ 2. Remove the margin in Firefox and Safari.
413
+ 3. Remove default padding in all browsers.
414
+ */
415
+
416
+ button,
417
+ input,
418
+ optgroup,
419
+ select,
420
+ textarea {
421
+ font-family: inherit;
422
+ /* 1 */
423
+ font-feature-settings: inherit;
424
+ /* 1 */
425
+ font-variation-settings: inherit;
426
+ /* 1 */
427
+ font-size: 100%;
428
+ /* 1 */
429
+ font-weight: inherit;
430
+ /* 1 */
431
+ line-height: inherit;
432
+ /* 1 */
433
+ letter-spacing: inherit;
434
+ /* 1 */
435
+ color: inherit;
436
+ /* 1 */
437
+ margin: 0;
438
+ /* 2 */
439
+ padding: 0;
440
+ /* 3 */
441
+ }
442
+
443
+ /*
444
+ Remove the inheritance of text transform in Edge and Firefox.
445
+ */
446
+
447
+ button,
448
+ select {
449
+ text-transform: none;
450
+ }
451
+
452
+ /*
453
+ 1. Correct the inability to style clickable types in iOS and Safari.
454
+ 2. Remove default button styles.
455
+ */
456
+
457
+ button,
458
+ input:where([type="button"]),
459
+ input:where([type="reset"]),
460
+ input:where([type="submit"]) {
461
+ -webkit-appearance: button;
462
+ /* 1 */
463
+ background-color: transparent;
464
+ /* 2 */
465
+ background-image: none;
466
+ /* 2 */
467
+ }
468
+
469
+ /*
470
+ Use the modern Firefox focus style for all focusable elements.
471
+ */
472
+
473
+ :-moz-focusring {
474
+ outline: auto;
475
+ }
476
+
477
+ /*
478
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
479
+ */
480
+
481
+ :-moz-ui-invalid {
482
+ box-shadow: none;
483
+ }
484
+
485
+ /*
486
+ Add the correct vertical alignment in Chrome and Firefox.
487
+ */
488
+
489
+ progress {
490
+ vertical-align: baseline;
491
+ }
492
+
493
+ /*
494
+ Correct the cursor style of increment and decrement buttons in Safari.
495
+ */
496
+
497
+ ::-webkit-inner-spin-button,
498
+ ::-webkit-outer-spin-button {
499
+ height: auto;
500
+ }
501
+
502
+ /*
503
+ 1. Correct the odd appearance in Chrome and Safari.
504
+ 2. Correct the outline style in Safari.
505
+ */
506
+
507
+ [type="search"] {
508
+ -webkit-appearance: textfield;
509
+ /* 1 */
510
+ outline-offset: -2px;
511
+ /* 2 */
512
+ }
513
+
514
+ /*
515
+ Remove the inner padding in Chrome and Safari on macOS.
516
+ */
517
+
518
+ ::-webkit-search-decoration {
519
+ -webkit-appearance: none;
520
+ }
521
+
522
+ /*
523
+ 1. Correct the inability to style clickable types in iOS and Safari.
524
+ 2. Change font properties to `inherit` in Safari.
525
+ */
526
+
527
+ ::-webkit-file-upload-button {
528
+ -webkit-appearance: button;
529
+ /* 1 */
530
+ font: inherit;
531
+ /* 2 */
532
+ }
533
+
534
+ /*
535
+ Add the correct display in Chrome and Safari.
536
+ */
537
+
538
+ summary {
539
+ display: list-item;
540
+ }
541
+
542
+ /*
543
+ Removes the default spacing and border for appropriate elements.
544
+ */
545
+
546
+ blockquote,
547
+ dl,
548
+ dd,
549
+ h1,
550
+ h2,
551
+ h3,
552
+ h4,
553
+ h5,
554
+ h6,
555
+ hr,
556
+ figure,
557
+ p,
558
+ pre {
559
+ margin: 0;
560
+ }
561
+
562
+ fieldset {
563
+ margin: 0;
564
+ padding: 0;
565
+ }
566
+
567
+ legend {
568
+ padding: 0;
569
+ }
570
+
571
+ ol,
572
+ ul,
573
+ menu {
574
+ list-style: none;
575
+ margin: 0;
576
+ padding: 0;
577
+ }
578
+
579
+ /*
580
+ Reset default styling for dialogs.
581
+ */
582
+
583
+ dialog {
584
+ padding: 0;
585
+ }
586
+
587
+ /*
588
+ Prevent resizing textareas horizontally by default.
589
+ */
590
+
591
+ textarea {
592
+ resize: vertical;
593
+ }
594
+
595
+ /*
596
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
597
+ 2. Set the default placeholder color to the user's configured gray 400 color.
598
+ */
599
+
600
+ input::placeholder,
601
+ textarea::placeholder {
602
+ opacity: 1;
603
+ /* 1 */
604
+ color: #9ca3af;
605
+ /* 2 */
606
+ }
607
+
608
+ /*
609
+ Set the default cursor for buttons.
610
+ */
611
+
612
+ button,
613
+ [role="button"] {
614
+ cursor: pointer;
615
+ }
616
+
617
+ /*
618
+ Make sure disabled buttons don't get the pointer cursor.
619
+ */
620
+
621
+ :disabled {
622
+ cursor: default;
623
+ }
624
+
625
+ /*
626
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
627
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
628
+ This can trigger a poorly considered lint error in some tools but is included by design.
629
+ */
630
+
631
+ img,
632
+ svg,
633
+ video,
634
+ canvas,
635
+ audio,
636
+ iframe,
637
+ embed,
638
+ object {
639
+ display: block;
640
+ /* 1 */
641
+ vertical-align: middle;
642
+ /* 2 */
643
+ }
644
+
645
+ /*
646
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
647
+ */
648
+
649
+ img,
650
+ video {
651
+ max-width: 100%;
652
+ height: auto;
653
+ }
654
+
655
+ /* Make elements with the HTML hidden attribute stay hidden by default */
656
+
657
+ [hidden] {
658
+ display: none;
659
+ }
660
+
661
+ *,
662
+ ::before,
663
+ ::after {
664
+ --tw-border-spacing-x: 0;
665
+ --tw-border-spacing-y: 0;
666
+ --tw-translate-x: 0;
667
+ --tw-translate-y: 0;
668
+ --tw-rotate: 0;
669
+ --tw-skew-x: 0;
670
+ --tw-skew-y: 0;
671
+ --tw-scale-x: 1;
672
+ --tw-scale-y: 1;
673
+ --tw-pan-x: ;
674
+ --tw-pan-y: ;
675
+ --tw-pinch-zoom: ;
676
+ --tw-scroll-snap-strictness: proximity;
677
+ --tw-gradient-from-position: ;
678
+ --tw-gradient-via-position: ;
679
+ --tw-gradient-to-position: ;
680
+ --tw-ordinal: ;
681
+ --tw-slashed-zero: ;
682
+ --tw-numeric-figure: ;
683
+ --tw-numeric-spacing: ;
684
+ --tw-numeric-fraction: ;
685
+ --tw-ring-inset: ;
686
+ --tw-ring-offset-width: 0px;
687
+ --tw-ring-offset-color: #fff;
688
+ --tw-ring-color: rgb(59 130 246 / 0.5);
689
+ --tw-ring-offset-shadow: 0 0 #0000;
690
+ --tw-ring-shadow: 0 0 #0000;
691
+ --tw-shadow: 0 0 #0000;
692
+ --tw-shadow-colored: 0 0 #0000;
693
+ --tw-blur: ;
694
+ --tw-brightness: ;
695
+ --tw-contrast: ;
696
+ --tw-grayscale: ;
697
+ --tw-hue-rotate: ;
698
+ --tw-invert: ;
699
+ --tw-saturate: ;
700
+ --tw-sepia: ;
701
+ --tw-drop-shadow: ;
702
+ --tw-backdrop-blur: ;
703
+ --tw-backdrop-brightness: ;
704
+ --tw-backdrop-contrast: ;
705
+ --tw-backdrop-grayscale: ;
706
+ --tw-backdrop-hue-rotate: ;
707
+ --tw-backdrop-invert: ;
708
+ --tw-backdrop-opacity: ;
709
+ --tw-backdrop-saturate: ;
710
+ --tw-backdrop-sepia: ;
711
+ --tw-contain-size: ;
712
+ --tw-contain-layout: ;
713
+ --tw-contain-paint: ;
714
+ --tw-contain-style:
715
+ ;
716
+ }
717
+
718
+ ::backdrop {
719
+ --tw-border-spacing-x: 0;
720
+ --tw-border-spacing-y: 0;
721
+ --tw-translate-x: 0;
722
+ --tw-translate-y: 0;
723
+ --tw-rotate: 0;
724
+ --tw-skew-x: 0;
725
+ --tw-skew-y: 0;
726
+ --tw-scale-x: 1;
727
+ --tw-scale-y: 1;
728
+ --tw-pan-x: ;
729
+ --tw-pan-y: ;
730
+ --tw-pinch-zoom: ;
731
+ --tw-scroll-snap-strictness: proximity;
732
+ --tw-gradient-from-position: ;
733
+ --tw-gradient-via-position: ;
734
+ --tw-gradient-to-position: ;
735
+ --tw-ordinal: ;
736
+ --tw-slashed-zero: ;
737
+ --tw-numeric-figure: ;
738
+ --tw-numeric-spacing: ;
739
+ --tw-numeric-fraction: ;
740
+ --tw-ring-inset: ;
741
+ --tw-ring-offset-width: 0px;
742
+ --tw-ring-offset-color: #fff;
743
+ --tw-ring-color: rgb(59 130 246 / 0.5);
744
+ --tw-ring-offset-shadow: 0 0 #0000;
745
+ --tw-ring-shadow: 0 0 #0000;
746
+ --tw-shadow: 0 0 #0000;
747
+ --tw-shadow-colored: 0 0 #0000;
748
+ --tw-blur: ;
749
+ --tw-brightness: ;
750
+ --tw-contrast: ;
751
+ --tw-grayscale: ;
752
+ --tw-hue-rotate: ;
753
+ --tw-invert: ;
754
+ --tw-saturate: ;
755
+ --tw-sepia: ;
756
+ --tw-drop-shadow: ;
757
+ --tw-backdrop-blur: ;
758
+ --tw-backdrop-brightness: ;
759
+ --tw-backdrop-contrast: ;
760
+ --tw-backdrop-grayscale: ;
761
+ --tw-backdrop-hue-rotate: ;
762
+ --tw-backdrop-invert: ;
763
+ --tw-backdrop-opacity: ;
764
+ --tw-backdrop-saturate: ;
765
+ --tw-backdrop-sepia: ;
766
+ --tw-contain-size: ;
767
+ --tw-contain-layout: ;
768
+ --tw-contain-paint: ;
769
+ --tw-contain-style:
770
+ ;
771
+ }
772
+
773
+ .relative {
774
+ position: relative;
775
+ }
776
+
777
+ .mx-1 {
778
+ margin-left: 0.25rem;
779
+ margin-right: 0.25rem;
780
+ }
781
+
782
+ .mb-2 {
783
+ margin-bottom: 0.5rem;
784
+ }
785
+
786
+ .mt-3 {
787
+ margin-top: 0.75rem;
788
+ }
789
+
790
+ .flex {
791
+ display: flex;
792
+ }
793
+
794
+ .table {
795
+ display: table;
796
+ }
797
+
798
+ .grid {
799
+ display: grid;
800
+ }
801
+
802
+ .h-4 {
803
+ height: 1rem;
804
+ }
805
+
806
+ .w-1\/2 {
807
+ width: 50%;
808
+ }
809
+
810
+ .w-4 {
811
+ width: 1rem;
812
+ }
813
+
814
+ .w-full {
815
+ width: 100%;
816
+ }
817
+
818
+ .flex-col {
819
+ flex-direction: column;
820
+ }
821
+
822
+ .items-center {
823
+ align-items: center;
824
+ }
825
+
826
+ .justify-center {
827
+ justify-content: center;
828
+ }
829
+
830
+ .overflow-x-auto {
831
+ overflow-x: auto;
832
+ }
833
+
834
+ .whitespace-nowrap {
835
+ white-space: nowrap;
836
+ }
837
+
838
+ .rounded-full {
839
+ border-radius: 9999px;
840
+ }
841
+
842
+ .rounded-l-full {
843
+ border-top-left-radius: 9999px;
844
+ border-bottom-left-radius: 9999px;
845
+ }
846
+
847
+ .rounded-r-full {
848
+ border-top-right-radius: 9999px;
849
+ border-bottom-right-radius: 9999px;
850
+ }
851
+
852
+ .border-2 {
853
+ border-width: 2px;
854
+ }
855
+
856
+ .border-b {
857
+ border-bottom-width: 1px;
858
+ }
859
+
860
+ .border-gray-200 {
861
+ --tw-border-opacity: 1;
862
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
863
+ }
864
+
865
+ .bg-gray-200 {
866
+ --tw-bg-opacity: 1;
867
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
868
+ }
869
+
870
+ .bg-gray-50 {
871
+ --tw-bg-opacity: 1;
872
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
873
+ }
874
+
875
+ .bg-white {
876
+ --tw-bg-opacity: 1;
877
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
878
+ }
879
+
880
+ .px-4 {
881
+ padding-left: 1rem;
882
+ padding-right: 1rem;
883
+ }
884
+
885
+ .px-6 {
886
+ padding-left: 1.5rem;
887
+ padding-right: 1.5rem;
888
+ }
889
+
890
+ .py-2 {
891
+ padding-top: 0.5rem;
892
+ padding-bottom: 0.5rem;
893
+ }
894
+
895
+ .py-3 {
896
+ padding-top: 0.75rem;
897
+ padding-bottom: 0.75rem;
898
+ }
899
+
900
+ .py-4 {
901
+ padding-top: 1rem;
902
+ padding-bottom: 1rem;
903
+ }
904
+
905
+ .text-left {
906
+ text-align: left;
907
+ }
908
+
909
+ .text-center {
910
+ text-align: center;
911
+ }
912
+
913
+ .text-right {
914
+ text-align: right;
915
+ }
916
+
917
+ .font-mono {
918
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
919
+ "Liberation Mono", "Courier New", monospace;
920
+ }
921
+
922
+ .text-lg {
923
+ font-size: 1.125rem;
924
+ line-height: 1.75rem;
925
+ }
926
+
927
+ .text-sm {
928
+ font-size: 0.875rem;
929
+ line-height: 1.25rem;
930
+ }
931
+
932
+ .text-xs {
933
+ font-size: 0.75rem;
934
+ line-height: 1rem;
935
+ }
936
+
937
+ .font-medium {
938
+ font-weight: 500;
939
+ }
940
+
941
+ .uppercase {
942
+ text-transform: uppercase;
943
+ }
944
+
945
+ .leading-none {
946
+ line-height: 1;
947
+ }
948
+
949
+ .text-blue-400 {
950
+ --tw-text-opacity: 1;
951
+ color: rgb(96 165 250 / var(--tw-text-opacity));
952
+ }
953
+
954
+ .text-gray-500 {
955
+ --tw-text-opacity: 1;
956
+ color: rgb(107 114 128 / var(--tw-text-opacity));
957
+ }
958
+
959
+ .text-gray-700 {
960
+ --tw-text-opacity: 1;
961
+ color: rgb(55 65 81 / var(--tw-text-opacity));
962
+ }
963
+
964
+ .text-gray-900 {
965
+ --tw-text-opacity: 1;
966
+ color: rgb(17 24 39 / var(--tw-text-opacity));
967
+ }
968
+
969
+ .transition-colors {
970
+ transition-property: color, background-color, border-color,
971
+ text-decoration-color, fill, stroke;
972
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
973
+ transition-duration: 150ms;
974
+ }
975
+
976
+ .duration-300 {
977
+ transition-duration: 300ms;
978
+ }
979
+
980
+ .ease-in {
981
+ transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
982
+ }
983
+
984
+ .hover\:text-orange-600:hover {
985
+ --tw-text-opacity: 1;
986
+ color: rgb(234 88 12 / var(--tw-text-opacity));
987
+ }
988
+
989
+ .focus\:text-orange-600:focus {
990
+ --tw-text-opacity: 1;
991
+ color: rgb(234 88 12 / var(--tw-text-opacity));
992
+ }
993
+
994
+ .focus\:outline-none:focus {
995
+ outline: 2px solid transparent;
996
+ outline-offset: 2px;
997
+ }
998
+
999
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1000
+ text-align: right;
1001
+ }
1002
+
1003
+ @media (prefers-color-scheme: dark) {
1004
+ .dark\:border-gray-700 {
1005
+ --tw-border-opacity: 1;
1006
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1007
+ }
1008
+
1009
+ .dark\:bg-gray-700 {
1010
+ --tw-bg-opacity: 1;
1011
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1012
+ }
1013
+
1014
+ .dark\:bg-gray-800 {
1015
+ --tw-bg-opacity: 1;
1016
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1017
+ }
1018
+
1019
+ .dark\:text-gray-400 {
1020
+ --tw-text-opacity: 1;
1021
+ color: rgb(156 163 175 / var(--tw-text-opacity));
1022
+ }
1023
+
1024
+ .dark\:text-white {
1025
+ --tw-text-opacity: 1;
1026
+ color: rgb(255 255 255 / var(--tw-text-opacity));
1027
+ }
1028
+ }
1029
+ </style>
src/frontend/shared/SearchInput.svelte ADDED
@@ -0,0 +1,1422 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script>
2
+ import { createEventDispatcher } from "svelte";
3
+
4
+ const dispatch = createEventDispatcher();
5
+
6
+ export let database = "rcsb-bioass";
7
+ export let index = 0;
8
+ let databases = {
9
+ "rcsb-3ligand": "RCSB 3-Letter Codes",
10
+ pubchem: "Pubchem",
11
+ "rcsb-bioass": "RCSB BioAssembly",
12
+ };
13
+
14
+ let placeholder = {
15
+ "rcsb-3ligand": "e.g HEM, ZN, K, GOL ...",
16
+ pubchem: "molecule name",
17
+ "rcsb-bioass": "4 Letter PDB Code",
18
+ };
19
+
20
+ let currentSel = database;
21
+ let searchInput = "";
22
+
23
+ function triggerFetch() {
24
+ dispatch("triggerFetch", {
25
+ text: searchInput,
26
+ database: currentSel,
27
+ index: index,
28
+ });
29
+ }
30
+ </script>
31
+
32
+ <form class="max-w-lg mx-auto mb-2 my-2">
33
+ <div class="flex">
34
+ <label
35
+ for="search-dropdown"
36
+ class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white"
37
+ >Search</label
38
+ >
39
+ <button
40
+ id="dropdown-button"
41
+ data-dropdown-toggle="dropdown"
42
+ class="flex-shrink-0 z-10 inline-flex items-center py-2.5 px-4 text-sm font-medium text-center text-gray-900 bg-gray-100 border border-gray-300 rounded-s-lg hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600 dark:focus:ring-gray-700 dark:text-white dark:border-gray-600"
43
+ type="button"
44
+ >{databases[currentSel]}
45
+ <!-- <svg
46
+ class="w-2.5 h-2.5 ms-2.5"
47
+ aria-hidden="true"
48
+ xmlns="http://www.w3.org/2000/svg"
49
+ fill="none"
50
+ viewBox="0 0 10 6"
51
+ >
52
+ <path
53
+ stroke="currentColor"
54
+ stroke-linecap="round"
55
+ stroke-linejoin="round"
56
+ stroke-width="2"
57
+ d="m1 1 4 4 4-4"
58
+ />
59
+ </svg> -->
60
+ </button>
61
+ <div
62
+ id="dropdown"
63
+ class="z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700"
64
+ >
65
+ <ul
66
+ class="py-2 text-sm text-gray-700 dark:text-gray-200"
67
+ aria-labelledby="dropdown-button"
68
+ >
69
+ <li>
70
+ <button
71
+ type="button"
72
+ class="inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
73
+ >Pubchem</button
74
+ >
75
+ </li>
76
+ <li>
77
+ <button
78
+ type="button"
79
+ class="inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
80
+ >RCSB 3 Letter code</button
81
+ >
82
+ </li>
83
+ </ul>
84
+ </div>
85
+ <div class="relative w-full">
86
+ <input
87
+ type="search"
88
+ id="search-dropdown"
89
+ class="block p-2.5 w-full z-20 text-sm text-gray-900 bg-gray-50 rounded-e-lg border-s-gray-50 border-s-2 border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-s-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:border-blue-500"
90
+ placeholder={placeholder[currentSel]}
91
+ on:input={(e) => (searchInput = e.target.value)}
92
+ />
93
+ <button
94
+ type="submit"
95
+ class="absolute top-0 end-0 p-2.5 text-sm font-medium h-full text-white bg-blue-700 rounded-e-lg border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
96
+ on:click|preventDefault={triggerFetch}
97
+ >
98
+ <svg
99
+ class="w-4 h-4"
100
+ aria-hidden="true"
101
+ xmlns="http://www.w3.org/2000/svg"
102
+ fill="none"
103
+ viewBox="0 0 20 20"
104
+ >
105
+ <path
106
+ stroke="currentColor"
107
+ stroke-linecap="round"
108
+ stroke-linejoin="round"
109
+ stroke-width="2"
110
+ d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"
111
+ />
112
+ </svg>
113
+ <span class="sr-only">Search</span>
114
+ </button>
115
+ </div>
116
+ </div>
117
+ </form>
118
+
119
+ <style>
120
+ /*
121
+ ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
122
+ */
123
+
124
+ /*
125
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
126
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
127
+ */
128
+
129
+ *,
130
+ ::before,
131
+ ::after {
132
+ box-sizing: border-box;
133
+ /* 1 */
134
+ border-width: 0;
135
+ /* 2 */
136
+ border-style: solid;
137
+ /* 2 */
138
+ border-color: #e5e7eb;
139
+ /* 2 */
140
+ }
141
+
142
+ ::before,
143
+ ::after {
144
+ --tw-content: "";
145
+ }
146
+
147
+ /*
148
+ 1. Use a consistent sensible line-height in all browsers.
149
+ 2. Prevent adjustments of font size after orientation changes in iOS.
150
+ 3. Use a more readable tab size.
151
+ 4. Use the user's configured `sans` font-family by default.
152
+ 5. Use the user's configured `sans` font-feature-settings by default.
153
+ 6. Use the user's configured `sans` font-variation-settings by default.
154
+ 7. Disable tap highlights on iOS
155
+ */
156
+
157
+ html,
158
+ :host {
159
+ line-height: 1.5;
160
+ /* 1 */
161
+ -webkit-text-size-adjust: 100%;
162
+ /* 2 */
163
+ -moz-tab-size: 4;
164
+ /* 3 */
165
+ tab-size: 4;
166
+ /* 3 */
167
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
168
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
169
+ /* 4 */
170
+ font-feature-settings: normal;
171
+ /* 5 */
172
+ font-variation-settings: normal;
173
+ /* 6 */
174
+ -webkit-tap-highlight-color: transparent;
175
+ /* 7 */
176
+ }
177
+
178
+ /*
179
+ 1. Remove the margin in all browsers.
180
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
181
+ */
182
+
183
+ body {
184
+ margin: 0;
185
+ /* 1 */
186
+ line-height: inherit;
187
+ /* 2 */
188
+ }
189
+
190
+ /*
191
+ 1. Add the correct height in Firefox.
192
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
193
+ 3. Ensure horizontal rules are visible by default.
194
+ */
195
+
196
+ hr {
197
+ height: 0;
198
+ /* 1 */
199
+ color: inherit;
200
+ /* 2 */
201
+ border-top-width: 1px;
202
+ /* 3 */
203
+ }
204
+
205
+ /*
206
+ Add the correct text decoration in Chrome, Edge, and Safari.
207
+ */
208
+
209
+ abbr:where([title]) {
210
+ text-decoration: underline dotted;
211
+ }
212
+
213
+ /*
214
+ Remove the default font size and weight for headings.
215
+ */
216
+
217
+ h1,
218
+ h2,
219
+ h3,
220
+ h4,
221
+ h5,
222
+ h6 {
223
+ font-size: inherit;
224
+ font-weight: inherit;
225
+ }
226
+
227
+ /*
228
+ Reset links to optimize for opt-in styling instead of opt-out.
229
+ */
230
+
231
+ a {
232
+ color: inherit;
233
+ text-decoration: inherit;
234
+ }
235
+
236
+ /*
237
+ Add the correct font weight in Edge and Safari.
238
+ */
239
+
240
+ b,
241
+ strong {
242
+ font-weight: bolder;
243
+ }
244
+
245
+ /*
246
+ 1. Use the user's configured `mono` font-family by default.
247
+ 2. Use the user's configured `mono` font-feature-settings by default.
248
+ 3. Use the user's configured `mono` font-variation-settings by default.
249
+ 4. Correct the odd `em` font sizing in all browsers.
250
+ */
251
+
252
+ code,
253
+ kbd,
254
+ samp,
255
+ pre {
256
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
257
+ "Liberation Mono", "Courier New", monospace;
258
+ /* 1 */
259
+ font-feature-settings: normal;
260
+ /* 2 */
261
+ font-variation-settings: normal;
262
+ /* 3 */
263
+ font-size: 1em;
264
+ /* 4 */
265
+ }
266
+
267
+ /*
268
+ Add the correct font size in all browsers.
269
+ */
270
+
271
+ small {
272
+ font-size: 80%;
273
+ }
274
+
275
+ /*
276
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
277
+ */
278
+
279
+ sub,
280
+ sup {
281
+ font-size: 75%;
282
+ line-height: 0;
283
+ position: relative;
284
+ vertical-align: baseline;
285
+ }
286
+
287
+ sub {
288
+ bottom: -0.25em;
289
+ }
290
+
291
+ sup {
292
+ top: -0.5em;
293
+ }
294
+
295
+ /*
296
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
297
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
298
+ 3. Remove gaps between table borders by default.
299
+ */
300
+
301
+ table {
302
+ text-indent: 0;
303
+ /* 1 */
304
+ border-color: inherit;
305
+ /* 2 */
306
+ border-collapse: collapse;
307
+ /* 3 */
308
+ }
309
+
310
+ /*
311
+ 1. Change the font styles in all browsers.
312
+ 2. Remove the margin in Firefox and Safari.
313
+ 3. Remove default padding in all browsers.
314
+ */
315
+
316
+ button,
317
+ input,
318
+ optgroup,
319
+ select,
320
+ textarea {
321
+ font-family: inherit;
322
+ /* 1 */
323
+ font-feature-settings: inherit;
324
+ /* 1 */
325
+ font-variation-settings: inherit;
326
+ /* 1 */
327
+ font-size: 100%;
328
+ /* 1 */
329
+ font-weight: inherit;
330
+ /* 1 */
331
+ line-height: inherit;
332
+ /* 1 */
333
+ color: inherit;
334
+ /* 1 */
335
+ margin: 0;
336
+ /* 2 */
337
+ padding: 0;
338
+ /* 3 */
339
+ }
340
+
341
+ /*
342
+ Remove the inheritance of text transform in Edge and Firefox.
343
+ */
344
+
345
+ button,
346
+ select {
347
+ text-transform: none;
348
+ }
349
+
350
+ /*
351
+ 1. Correct the inability to style clickable types in iOS and Safari.
352
+ 2. Remove default button styles.
353
+ */
354
+
355
+ button,
356
+ [type="button"],
357
+ [type="reset"],
358
+ [type="submit"] {
359
+ -webkit-appearance: button;
360
+ /* 1 */
361
+ background-color: transparent;
362
+ /* 2 */
363
+ background-image: none;
364
+ /* 2 */
365
+ }
366
+
367
+ /*
368
+ Use the modern Firefox focus style for all focusable elements.
369
+ */
370
+
371
+ :-moz-focusring {
372
+ outline: auto;
373
+ }
374
+
375
+ /*
376
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
377
+ */
378
+
379
+ :-moz-ui-invalid {
380
+ box-shadow: none;
381
+ }
382
+
383
+ /*
384
+ Add the correct vertical alignment in Chrome and Firefox.
385
+ */
386
+
387
+ progress {
388
+ vertical-align: baseline;
389
+ }
390
+
391
+ /*
392
+ Correct the cursor style of increment and decrement buttons in Safari.
393
+ */
394
+
395
+ ::-webkit-inner-spin-button,
396
+ ::-webkit-outer-spin-button {
397
+ height: auto;
398
+ }
399
+
400
+ /*
401
+ 1. Correct the odd appearance in Chrome and Safari.
402
+ 2. Correct the outline style in Safari.
403
+ */
404
+
405
+ [type="search"] {
406
+ -webkit-appearance: textfield;
407
+ /* 1 */
408
+ outline-offset: -2px;
409
+ /* 2 */
410
+ }
411
+
412
+ /*
413
+ Remove the inner padding in Chrome and Safari on macOS.
414
+ */
415
+
416
+ ::-webkit-search-decoration {
417
+ -webkit-appearance: none;
418
+ }
419
+
420
+ /*
421
+ 1. Correct the inability to style clickable types in iOS and Safari.
422
+ 2. Change font properties to `inherit` in Safari.
423
+ */
424
+
425
+ ::-webkit-file-upload-button {
426
+ -webkit-appearance: button;
427
+ /* 1 */
428
+ font: inherit;
429
+ /* 2 */
430
+ }
431
+
432
+ /*
433
+ Add the correct display in Chrome and Safari.
434
+ */
435
+
436
+ summary {
437
+ display: list-item;
438
+ }
439
+
440
+ /*
441
+ Removes the default spacing and border for appropriate elements.
442
+ */
443
+
444
+ blockquote,
445
+ dl,
446
+ dd,
447
+ h1,
448
+ h2,
449
+ h3,
450
+ h4,
451
+ h5,
452
+ h6,
453
+ hr,
454
+ figure,
455
+ p,
456
+ pre {
457
+ margin: 0;
458
+ }
459
+
460
+ fieldset {
461
+ margin: 0;
462
+ padding: 0;
463
+ }
464
+
465
+ legend {
466
+ padding: 0;
467
+ }
468
+
469
+ ol,
470
+ ul,
471
+ menu {
472
+ list-style: none;
473
+ margin: 0;
474
+ padding: 0;
475
+ }
476
+
477
+ /*
478
+ Reset default styling for dialogs.
479
+ */
480
+
481
+ dialog {
482
+ padding: 0;
483
+ }
484
+
485
+ /*
486
+ Prevent resizing textareas horizontally by default.
487
+ */
488
+
489
+ textarea {
490
+ resize: vertical;
491
+ }
492
+
493
+ /*
494
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
495
+ 2. Set the default placeholder color to the user's configured gray 400 color.
496
+ */
497
+
498
+ input::placeholder,
499
+ textarea::placeholder {
500
+ opacity: 1;
501
+ /* 1 */
502
+ color: #9ca3af;
503
+ /* 2 */
504
+ }
505
+
506
+ /*
507
+ Set the default cursor for buttons.
508
+ */
509
+
510
+ button,
511
+ [role="button"] {
512
+ cursor: pointer;
513
+ }
514
+
515
+ /*
516
+ Make sure disabled buttons don't get the pointer cursor.
517
+ */
518
+
519
+ :disabled {
520
+ cursor: default;
521
+ }
522
+
523
+ /*
524
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
525
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
526
+ This can trigger a poorly considered lint error in some tools but is included by design.
527
+ */
528
+
529
+ img,
530
+ svg,
531
+ video,
532
+ canvas,
533
+ audio,
534
+ iframe,
535
+ embed,
536
+ object {
537
+ display: block;
538
+ /* 1 */
539
+ vertical-align: middle;
540
+ /* 2 */
541
+ }
542
+
543
+ /*
544
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
545
+ */
546
+
547
+ img,
548
+ video {
549
+ max-width: 100%;
550
+ height: auto;
551
+ }
552
+
553
+ /* Make elements with the HTML hidden attribute stay hidden by default */
554
+
555
+ [hidden] {
556
+ display: none;
557
+ }
558
+
559
+ *,
560
+ ::before,
561
+ ::after {
562
+ --tw-border-spacing-x: 0;
563
+ --tw-border-spacing-y: 0;
564
+ --tw-translate-x: 0;
565
+ --tw-translate-y: 0;
566
+ --tw-rotate: 0;
567
+ --tw-skew-x: 0;
568
+ --tw-skew-y: 0;
569
+ --tw-scale-x: 1;
570
+ --tw-scale-y: 1;
571
+ --tw-pan-x: ;
572
+ --tw-pan-y: ;
573
+ --tw-pinch-zoom: ;
574
+ --tw-scroll-snap-strictness: proximity;
575
+ --tw-gradient-from-position: ;
576
+ --tw-gradient-via-position: ;
577
+ --tw-gradient-to-position: ;
578
+ --tw-ordinal: ;
579
+ --tw-slashed-zero: ;
580
+ --tw-numeric-figure: ;
581
+ --tw-numeric-spacing: ;
582
+ --tw-numeric-fraction: ;
583
+ --tw-ring-inset: ;
584
+ --tw-ring-offset-width: 0px;
585
+ --tw-ring-offset-color: #fff;
586
+ --tw-ring-color: rgb(59 130 246 / 0.5);
587
+ --tw-ring-offset-shadow: 0 0 #0000;
588
+ --tw-ring-shadow: 0 0 #0000;
589
+ --tw-shadow: 0 0 #0000;
590
+ --tw-shadow-colored: 0 0 #0000;
591
+ --tw-blur: ;
592
+ --tw-brightness: ;
593
+ --tw-contrast: ;
594
+ --tw-grayscale: ;
595
+ --tw-hue-rotate: ;
596
+ --tw-invert: ;
597
+ --tw-saturate: ;
598
+ --tw-sepia: ;
599
+ --tw-drop-shadow: ;
600
+ --tw-backdrop-blur: ;
601
+ --tw-backdrop-brightness: ;
602
+ --tw-backdrop-contrast: ;
603
+ --tw-backdrop-grayscale: ;
604
+ --tw-backdrop-hue-rotate: ;
605
+ --tw-backdrop-invert: ;
606
+ --tw-backdrop-opacity: ;
607
+ --tw-backdrop-saturate: ;
608
+ --tw-backdrop-sepia: ;
609
+ }
610
+
611
+ ::backdrop {
612
+ --tw-border-spacing-x: 0;
613
+ --tw-border-spacing-y: 0;
614
+ --tw-translate-x: 0;
615
+ --tw-translate-y: 0;
616
+ --tw-rotate: 0;
617
+ --tw-skew-x: 0;
618
+ --tw-skew-y: 0;
619
+ --tw-scale-x: 1;
620
+ --tw-scale-y: 1;
621
+ --tw-pan-x: ;
622
+ --tw-pan-y: ;
623
+ --tw-pinch-zoom: ;
624
+ --tw-scroll-snap-strictness: proximity;
625
+ --tw-gradient-from-position: ;
626
+ --tw-gradient-via-position: ;
627
+ --tw-gradient-to-position: ;
628
+ --tw-ordinal: ;
629
+ --tw-slashed-zero: ;
630
+ --tw-numeric-figure: ;
631
+ --tw-numeric-spacing: ;
632
+ --tw-numeric-fraction: ;
633
+ --tw-ring-inset: ;
634
+ --tw-ring-offset-width: 0px;
635
+ --tw-ring-offset-color: #fff;
636
+ --tw-ring-color: rgb(59 130 246 / 0.5);
637
+ --tw-ring-offset-shadow: 0 0 #0000;
638
+ --tw-ring-shadow: 0 0 #0000;
639
+ --tw-shadow: 0 0 #0000;
640
+ --tw-shadow-colored: 0 0 #0000;
641
+ --tw-blur: ;
642
+ --tw-brightness: ;
643
+ --tw-contrast: ;
644
+ --tw-grayscale: ;
645
+ --tw-hue-rotate: ;
646
+ --tw-invert: ;
647
+ --tw-saturate: ;
648
+ --tw-sepia: ;
649
+ --tw-drop-shadow: ;
650
+ --tw-backdrop-blur: ;
651
+ --tw-backdrop-brightness: ;
652
+ --tw-backdrop-contrast: ;
653
+ --tw-backdrop-grayscale: ;
654
+ --tw-backdrop-hue-rotate: ;
655
+ --tw-backdrop-invert: ;
656
+ --tw-backdrop-opacity: ;
657
+ --tw-backdrop-saturate: ;
658
+ --tw-backdrop-sepia: ;
659
+ }
660
+
661
+ .sr-only {
662
+ position: absolute;
663
+ width: 1px;
664
+ height: 1px;
665
+ padding: 0;
666
+ margin: -1px;
667
+ overflow: hidden;
668
+ clip: rect(0, 0, 0, 0);
669
+ white-space: nowrap;
670
+ border-width: 0;
671
+ }
672
+
673
+ .collapse {
674
+ visibility: collapse;
675
+ }
676
+
677
+ .absolute {
678
+ position: absolute;
679
+ }
680
+
681
+ .relative {
682
+ position: relative;
683
+ }
684
+
685
+ .inset-0 {
686
+ inset: 0px;
687
+ }
688
+
689
+ .end-0 {
690
+ inset-inline-end: 0px;
691
+ }
692
+
693
+ .top-0 {
694
+ top: 0px;
695
+ }
696
+
697
+ .z-10 {
698
+ z-index: 10;
699
+ }
700
+
701
+ .z-20 {
702
+ z-index: 20;
703
+ }
704
+
705
+ .mx-10 {
706
+ margin-left: 2.5rem;
707
+ margin-right: 2.5rem;
708
+ }
709
+
710
+ .mx-auto {
711
+ margin-left: auto;
712
+ margin-right: auto;
713
+ }
714
+
715
+ .my-2 {
716
+ margin-top: 0.5rem;
717
+ margin-bottom: 0.5rem;
718
+ }
719
+
720
+ .mb-10 {
721
+ margin-bottom: 2.5rem;
722
+ }
723
+
724
+ .mb-2 {
725
+ margin-bottom: 0.5rem;
726
+ }
727
+
728
+ .ms-2 {
729
+ margin-inline-start: 0.5rem;
730
+ }
731
+
732
+ .ms-2\.5 {
733
+ margin-inline-start: 0.625rem;
734
+ }
735
+
736
+ .ms-3 {
737
+ margin-inline-start: 0.75rem;
738
+ }
739
+
740
+ .mt-1 {
741
+ margin-top: 0.25rem;
742
+ }
743
+
744
+ .mt-6 {
745
+ margin-top: 1.5rem;
746
+ }
747
+
748
+ .block {
749
+ display: block;
750
+ }
751
+
752
+ .inline-block {
753
+ display: inline-block;
754
+ }
755
+
756
+ .inline {
757
+ display: inline;
758
+ }
759
+
760
+ .flex {
761
+ display: flex;
762
+ }
763
+
764
+ .inline-flex {
765
+ display: inline-flex;
766
+ }
767
+
768
+ .hidden {
769
+ display: none;
770
+ }
771
+
772
+ .h-10 {
773
+ height: 2.5rem;
774
+ }
775
+
776
+ .h-2 {
777
+ height: 0.5rem;
778
+ }
779
+
780
+ .h-2\.5 {
781
+ height: 0.625rem;
782
+ }
783
+
784
+ .h-3 {
785
+ height: 0.75rem;
786
+ }
787
+
788
+ .h-4 {
789
+ height: 1rem;
790
+ }
791
+
792
+ .h-6 {
793
+ height: 1.5rem;
794
+ }
795
+
796
+ .h-full {
797
+ height: 100%;
798
+ }
799
+
800
+ .min-h-screen {
801
+ min-height: 100vh;
802
+ }
803
+
804
+ .w-1\/3 {
805
+ width: 33.333333%;
806
+ }
807
+
808
+ .w-10 {
809
+ width: 2.5rem;
810
+ }
811
+
812
+ .w-2 {
813
+ width: 0.5rem;
814
+ }
815
+
816
+ .w-2\.5 {
817
+ width: 0.625rem;
818
+ }
819
+
820
+ .w-3 {
821
+ width: 0.75rem;
822
+ }
823
+
824
+ .w-4 {
825
+ width: 1rem;
826
+ }
827
+
828
+ .w-44 {
829
+ width: 11rem;
830
+ }
831
+
832
+ .w-6 {
833
+ width: 1.5rem;
834
+ }
835
+
836
+ .w-full {
837
+ width: 100%;
838
+ }
839
+
840
+ .max-w-lg {
841
+ max-width: 32rem;
842
+ }
843
+
844
+ .flex-shrink-0 {
845
+ flex-shrink: 0;
846
+ }
847
+
848
+ .shrink-0 {
849
+ flex-shrink: 0;
850
+ }
851
+
852
+ .-rotate-90 {
853
+ --tw-rotate: -90deg;
854
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
855
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
856
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
857
+ }
858
+
859
+ .rotate-180 {
860
+ --tw-rotate: 180deg;
861
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
862
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
863
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
864
+ }
865
+
866
+ .cursor-pointer {
867
+ cursor: pointer;
868
+ }
869
+
870
+ .flex-col {
871
+ flex-direction: column;
872
+ }
873
+
874
+ .items-center {
875
+ align-items: center;
876
+ }
877
+
878
+ .justify-center {
879
+ justify-content: center;
880
+ }
881
+
882
+ .justify-between {
883
+ justify-content: space-between;
884
+ }
885
+
886
+ .gap-3 {
887
+ gap: 0.75rem;
888
+ }
889
+
890
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
891
+ --tw-space-x-reverse: 0;
892
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
893
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
894
+ }
895
+
896
+ .divide-y > :not([hidden]) ~ :not([hidden]) {
897
+ --tw-divide-y-reverse: 0;
898
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
899
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
900
+ }
901
+
902
+ .divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
903
+ --tw-divide-opacity: 1;
904
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
905
+ }
906
+
907
+ .overflow-hidden {
908
+ overflow: hidden;
909
+ }
910
+
911
+ .whitespace-nowrap {
912
+ white-space: nowrap;
913
+ }
914
+
915
+ .rounded-full {
916
+ border-radius: 9999px;
917
+ }
918
+
919
+ .rounded-lg {
920
+ border-radius: 0.5rem;
921
+ }
922
+
923
+ .rounded-e-lg {
924
+ border-start-end-radius: 0.5rem;
925
+ border-end-end-radius: 0.5rem;
926
+ }
927
+
928
+ .rounded-s-lg {
929
+ border-start-start-radius: 0.5rem;
930
+ border-end-start-radius: 0.5rem;
931
+ }
932
+
933
+ .rounded-t-xl {
934
+ border-top-left-radius: 0.75rem;
935
+ border-top-right-radius: 0.75rem;
936
+ }
937
+
938
+ .border {
939
+ border-width: 1px;
940
+ }
941
+
942
+ .border-b-0 {
943
+ border-bottom-width: 0px;
944
+ }
945
+
946
+ .border-s-2 {
947
+ border-inline-start-width: 2px;
948
+ }
949
+
950
+ .border-t-0 {
951
+ border-top-width: 0px;
952
+ }
953
+
954
+ .border-blue-700 {
955
+ --tw-border-opacity: 1;
956
+ border-color: rgb(29 78 216 / var(--tw-border-opacity));
957
+ }
958
+
959
+ .border-gray-200 {
960
+ --tw-border-opacity: 1;
961
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
962
+ }
963
+
964
+ .border-gray-300 {
965
+ --tw-border-opacity: 1;
966
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
967
+ }
968
+
969
+ .border-s-gray-50 {
970
+ --tw-border-opacity: 1;
971
+ border-inline-start-color: rgb(249 250 251 / var(--tw-border-opacity));
972
+ }
973
+
974
+ .bg-blue-200 {
975
+ --tw-bg-opacity: 1;
976
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
977
+ }
978
+
979
+ .bg-blue-700 {
980
+ --tw-bg-opacity: 1;
981
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
982
+ }
983
+
984
+ .bg-gray-100 {
985
+ --tw-bg-opacity: 1;
986
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
987
+ }
988
+
989
+ .bg-gray-50 {
990
+ --tw-bg-opacity: 1;
991
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
992
+ }
993
+
994
+ .bg-green-100 {
995
+ --tw-bg-opacity: 1;
996
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
997
+ }
998
+
999
+ .bg-green-200 {
1000
+ --tw-bg-opacity: 1;
1001
+ background-color: rgb(187 247 208 / var(--tw-bg-opacity));
1002
+ }
1003
+
1004
+ .bg-orange-200 {
1005
+ --tw-bg-opacity: 1;
1006
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
1007
+ }
1008
+
1009
+ .bg-violet-100 {
1010
+ --tw-bg-opacity: 1;
1011
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
1012
+ }
1013
+
1014
+ .bg-white {
1015
+ --tw-bg-opacity: 1;
1016
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1017
+ }
1018
+
1019
+ .bg-yellow-100 {
1020
+ --tw-bg-opacity: 1;
1021
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
1022
+ }
1023
+
1024
+ .bg-\[url\(\/img\/grid\.svg\)\] {
1025
+ background-image: url(/img/grid.svg);
1026
+ }
1027
+
1028
+ .bg-center {
1029
+ background-position: center;
1030
+ }
1031
+
1032
+ .p-0 {
1033
+ padding: 0px;
1034
+ }
1035
+
1036
+ .p-0\.5 {
1037
+ padding: 0.125rem;
1038
+ }
1039
+
1040
+ .p-1 {
1041
+ padding: 0.25rem;
1042
+ }
1043
+
1044
+ .p-2 {
1045
+ padding: 0.5rem;
1046
+ }
1047
+
1048
+ .p-2\.5 {
1049
+ padding: 0.625rem;
1050
+ }
1051
+
1052
+ .p-5 {
1053
+ padding: 1.25rem;
1054
+ }
1055
+
1056
+ .px-2 {
1057
+ padding-left: 0.5rem;
1058
+ padding-right: 0.5rem;
1059
+ }
1060
+
1061
+ .px-4 {
1062
+ padding-left: 1rem;
1063
+ padding-right: 1rem;
1064
+ }
1065
+
1066
+ .px-5 {
1067
+ padding-left: 1.25rem;
1068
+ padding-right: 1.25rem;
1069
+ }
1070
+
1071
+ .px-6 {
1072
+ padding-left: 1.5rem;
1073
+ padding-right: 1.5rem;
1074
+ }
1075
+
1076
+ .py-2 {
1077
+ padding-top: 0.5rem;
1078
+ padding-bottom: 0.5rem;
1079
+ }
1080
+
1081
+ .py-2\.5 {
1082
+ padding-top: 0.625rem;
1083
+ padding-bottom: 0.625rem;
1084
+ }
1085
+
1086
+ .py-6 {
1087
+ padding-top: 1.5rem;
1088
+ padding-bottom: 1.5rem;
1089
+ }
1090
+
1091
+ .pb-2 {
1092
+ padding-bottom: 0.5rem;
1093
+ }
1094
+
1095
+ .pb-8 {
1096
+ padding-bottom: 2rem;
1097
+ }
1098
+
1099
+ .pt-10 {
1100
+ padding-top: 2.5rem;
1101
+ }
1102
+
1103
+ .text-center {
1104
+ text-align: center;
1105
+ }
1106
+
1107
+ .text-sm {
1108
+ font-size: 0.875rem;
1109
+ line-height: 1.25rem;
1110
+ }
1111
+
1112
+ .text-xs {
1113
+ font-size: 0.75rem;
1114
+ line-height: 1rem;
1115
+ }
1116
+
1117
+ .font-bold {
1118
+ font-weight: 700;
1119
+ }
1120
+
1121
+ .font-medium {
1122
+ font-weight: 500;
1123
+ }
1124
+
1125
+ .font-semibold {
1126
+ font-weight: 600;
1127
+ }
1128
+
1129
+ .text-blue-800 {
1130
+ --tw-text-opacity: 1;
1131
+ color: rgb(30 64 175);
1132
+ }
1133
+
1134
+ .text-gray-400 {
1135
+ --tw-text-opacity: 1;
1136
+ color: rgb(156 163 175);
1137
+ }
1138
+
1139
+ .text-gray-500 {
1140
+ --tw-text-opacity: 1;
1141
+ color: rgb(107 114 128);
1142
+ }
1143
+
1144
+ .text-gray-600 {
1145
+ --tw-text-opacity: 1;
1146
+ color: rgb(75 85 99);
1147
+ }
1148
+
1149
+ .text-gray-700 {
1150
+ --tw-text-opacity: 1;
1151
+ color: rgb(55 65 81);
1152
+ }
1153
+
1154
+ .text-gray-900 {
1155
+ --tw-text-opacity: 1;
1156
+ color: rgb(17 24 39);
1157
+ }
1158
+
1159
+ .text-white {
1160
+ --tw-text-opacity: 1;
1161
+ color: rgb(255 255 255);
1162
+ }
1163
+
1164
+ .shadow {
1165
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1166
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
1167
+ 0 1px 2px -1px var(--tw-shadow-color);
1168
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1169
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1170
+ }
1171
+
1172
+ .shadow-xl {
1173
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
1174
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
1175
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),
1176
+ 0 8px 10px -6px var(--tw-shadow-color);
1177
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1178
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1179
+ }
1180
+
1181
+ .ring-1 {
1182
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1183
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1184
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1185
+ calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1186
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1187
+ var(--tw-shadow, 0 0 #0000);
1188
+ }
1189
+
1190
+ .ring-gray-900\/5 {
1191
+ --tw-ring-color: rgb(17 24 39 / 0.05);
1192
+ }
1193
+
1194
+ .sequence_container {
1195
+ overflow-wrap: anywhere;
1196
+ counter-reset: sequence;
1197
+ }
1198
+
1199
+ .sequence_container .sequence__chunk {
1200
+ display: inline-block;
1201
+ margin: 0.1rem 0 1rem 1rem;
1202
+ /* width: 10ch; */
1203
+ position: relative;
1204
+ white-space: nowrap;
1205
+ }
1206
+
1207
+ .sequence_container .sequence__chunk:not(:last-child):before,
1208
+ .sequence_container .sequence__chunk--display-last:before {
1209
+ content: counter(sequence);
1210
+ counter-increment: sequence 10;
1211
+ position: absolute;
1212
+ top: -0.8em;
1213
+ right: 0;
1214
+ opacity: 0.5;
1215
+ font-weight: bold;
1216
+ }
1217
+
1218
+ .sequence-container .sequence__chunk::after {
1219
+ content: "";
1220
+ position: absolute;
1221
+ bottom: 0;
1222
+ left: 0;
1223
+ right: 0;
1224
+ transform-origin: left;
1225
+ transform: scaleX(0.1);
1226
+ box-shadow: var(--box-shadow);
1227
+ }
1228
+
1229
+ .sequence__chunk span {
1230
+ padding: 0 0.05rem;
1231
+ }
1232
+
1233
+ .hover\:bg-blue-800:hover {
1234
+ --tw-bg-opacity: 1;
1235
+ background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1236
+ }
1237
+
1238
+ .hover\:bg-gray-100:hover {
1239
+ --tw-bg-opacity: 1;
1240
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1241
+ }
1242
+
1243
+ .hover\:bg-gray-200:hover {
1244
+ --tw-bg-opacity: 1;
1245
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1246
+ }
1247
+
1248
+ .hover\:font-bold:hover {
1249
+ font-weight: 700;
1250
+ }
1251
+
1252
+ .focus\:border-blue-500:focus {
1253
+ --tw-border-opacity: 1;
1254
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1255
+ }
1256
+
1257
+ .focus\:outline-none:focus {
1258
+ outline: 2px solid transparent;
1259
+ outline-offset: 2px;
1260
+ }
1261
+
1262
+ .focus\:ring-4:focus {
1263
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1264
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1265
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1266
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1267
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1268
+ var(--tw-shadow, 0 0 #0000);
1269
+ }
1270
+
1271
+ .focus\:ring-blue-300:focus {
1272
+ --tw-ring-opacity: 1;
1273
+ --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1274
+ }
1275
+
1276
+ .focus\:ring-blue-500:focus {
1277
+ --tw-ring-opacity: 1;
1278
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1279
+ }
1280
+
1281
+ .focus\:ring-gray-100:focus {
1282
+ --tw-ring-opacity: 1;
1283
+ --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity));
1284
+ }
1285
+
1286
+ .focus\:ring-gray-200:focus {
1287
+ --tw-ring-opacity: 1;
1288
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1289
+ }
1290
+
1291
+ @media (min-width: 640px) {
1292
+ .sm\:mx-auto {
1293
+ margin-left: auto;
1294
+ margin-right: auto;
1295
+ }
1296
+
1297
+ .sm\:rounded-lg {
1298
+ border-radius: 0.5rem;
1299
+ }
1300
+
1301
+ .sm\:px-10 {
1302
+ padding-left: 2.5rem;
1303
+ padding-right: 2.5rem;
1304
+ }
1305
+
1306
+ .sm\:py-12 {
1307
+ padding-top: 3rem;
1308
+ padding-bottom: 3rem;
1309
+ }
1310
+ }
1311
+
1312
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1313
+ text-align: right;
1314
+ }
1315
+
1316
+ @media (prefers-color-scheme: dark) {
1317
+ .dark\:border-gray-600 {
1318
+ --tw-border-opacity: 1;
1319
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1320
+ }
1321
+
1322
+ .dark\:border-gray-700 {
1323
+ --tw-border-opacity: 1;
1324
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1325
+ }
1326
+
1327
+ .dark\:border-s-gray-700 {
1328
+ --tw-border-opacity: 1;
1329
+ border-inline-start-color: rgb(55 65 81 / var(--tw-border-opacity));
1330
+ }
1331
+
1332
+ .dark\:bg-blue-600 {
1333
+ --tw-bg-opacity: 1;
1334
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1335
+ }
1336
+
1337
+ .dark\:bg-gray-600 {
1338
+ --tw-bg-opacity: 1;
1339
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1340
+ }
1341
+
1342
+ .dark\:bg-gray-700 {
1343
+ --tw-bg-opacity: 1;
1344
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1345
+ }
1346
+
1347
+ .dark\:bg-gray-900 {
1348
+ --tw-bg-opacity: 1;
1349
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1350
+ }
1351
+
1352
+ .dark\:text-gray-200 {
1353
+ --tw-text-opacity: 1;
1354
+ color: rgb(229 231 235);
1355
+ }
1356
+
1357
+ .dark\:text-gray-300 {
1358
+ --tw-text-opacity: 1;
1359
+ color: rgb(209 213 219);
1360
+ }
1361
+
1362
+ .dark\:text-gray-400 {
1363
+ --tw-text-opacity: 1;
1364
+ color: rgb(156 163 175);
1365
+ }
1366
+
1367
+ .dark\:text-white {
1368
+ --tw-text-opacity: 1;
1369
+ color: rgb(255 255 255);
1370
+ }
1371
+
1372
+ .dark\:placeholder-gray-400::placeholder {
1373
+ --tw-placeholder-opacity: 1;
1374
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1375
+ }
1376
+
1377
+ .dark\:hover\:bg-blue-700:hover {
1378
+ --tw-bg-opacity: 1;
1379
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1380
+ }
1381
+
1382
+ .dark\:hover\:bg-gray-600:hover {
1383
+ --tw-bg-opacity: 1;
1384
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1385
+ }
1386
+
1387
+ .dark\:hover\:bg-gray-800:hover {
1388
+ --tw-bg-opacity: 1;
1389
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1390
+ }
1391
+
1392
+ .dark\:hover\:text-white:hover {
1393
+ --tw-text-opacity: 1;
1394
+ color: rgb(255 255 255);
1395
+ }
1396
+
1397
+ .dark\:focus\:border-blue-500:focus {
1398
+ --tw-border-opacity: 1;
1399
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1400
+ }
1401
+
1402
+ .dark\:focus\:ring-blue-500:focus {
1403
+ --tw-ring-opacity: 1;
1404
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1405
+ }
1406
+
1407
+ .dark\:focus\:ring-blue-800:focus {
1408
+ --tw-ring-opacity: 1;
1409
+ --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1410
+ }
1411
+
1412
+ .dark\:focus\:ring-gray-700:focus {
1413
+ --tw-ring-opacity: 1;
1414
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
1415
+ }
1416
+
1417
+ .dark\:focus\:ring-gray-800:focus {
1418
+ --tw-ring-opacity: 1;
1419
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1420
+ }
1421
+ }
1422
+ </style>
src/frontend/shared/Sequence.svelte ADDED
@@ -0,0 +1,1336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script>
2
+ export let seq = "";
3
+
4
+ // convert sequence into chunked array of 10
5
+
6
+ let chunked_seq = seq.match(/.{1,10}/g);
7
+
8
+ // store residue index of each residue per chunk
9
+ let chunk_ids = chunked_seq.map((chunk, i) => {
10
+ return chunk.split("").map((_, j) => {
11
+ return i * 10 + j + 1;
12
+ });
13
+ });
14
+ </script>
15
+
16
+ <div class="sequence_container text-xs">
17
+ {#each chunked_seq as chunk, i}
18
+ <div class="sequence__chunk">
19
+ {#each chunk as letter, j}
20
+ <span
21
+ class="p-0.1 text-center w-full inline hover:font-bold cursor-pointer item-selectable ds-selectable"
22
+ style="font-family: monospace;"
23
+ >
24
+ <div class="inline-block p-0.5" title="residue {chunk_ids[i][j]}">
25
+ {letter}
26
+ </div>
27
+ </span>
28
+ {/each}
29
+ </div>
30
+ {/each}
31
+ </div>
32
+
33
+ <style>
34
+ /*
35
+ ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
36
+ */
37
+
38
+ /*
39
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
40
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
41
+ */
42
+
43
+ *,
44
+ ::before,
45
+ ::after {
46
+ box-sizing: border-box;
47
+ /* 1 */
48
+ border-width: 0;
49
+ /* 2 */
50
+ border-style: solid;
51
+ /* 2 */
52
+ border-color: #e5e7eb;
53
+ /* 2 */
54
+ }
55
+
56
+ ::before,
57
+ ::after {
58
+ --tw-content: "";
59
+ }
60
+
61
+ /*
62
+ 1. Use a consistent sensible line-height in all browsers.
63
+ 2. Prevent adjustments of font size after orientation changes in iOS.
64
+ 3. Use a more readable tab size.
65
+ 4. Use the user's configured `sans` font-family by default.
66
+ 5. Use the user's configured `sans` font-feature-settings by default.
67
+ 6. Use the user's configured `sans` font-variation-settings by default.
68
+ 7. Disable tap highlights on iOS
69
+ */
70
+
71
+ html,
72
+ :host {
73
+ line-height: 1.5;
74
+ /* 1 */
75
+ -webkit-text-size-adjust: 100%;
76
+ /* 2 */
77
+ -moz-tab-size: 4;
78
+ /* 3 */
79
+ tab-size: 4;
80
+ /* 3 */
81
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
82
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
83
+ /* 4 */
84
+ font-feature-settings: normal;
85
+ /* 5 */
86
+ font-variation-settings: normal;
87
+ /* 6 */
88
+ -webkit-tap-highlight-color: transparent;
89
+ /* 7 */
90
+ }
91
+
92
+ /*
93
+ 1. Remove the margin in all browsers.
94
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
95
+ */
96
+
97
+ body {
98
+ margin: 0;
99
+ /* 1 */
100
+ line-height: inherit;
101
+ /* 2 */
102
+ }
103
+
104
+ /*
105
+ 1. Add the correct height in Firefox.
106
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
107
+ 3. Ensure horizontal rules are visible by default.
108
+ */
109
+
110
+ hr {
111
+ height: 0;
112
+ /* 1 */
113
+ color: inherit;
114
+ /* 2 */
115
+ border-top-width: 1px;
116
+ /* 3 */
117
+ }
118
+
119
+ /*
120
+ Add the correct text decoration in Chrome, Edge, and Safari.
121
+ */
122
+
123
+ abbr:where([title]) {
124
+ text-decoration: underline dotted;
125
+ }
126
+
127
+ /*
128
+ Remove the default font size and weight for headings.
129
+ */
130
+
131
+ h1,
132
+ h2,
133
+ h3,
134
+ h4,
135
+ h5,
136
+ h6 {
137
+ font-size: inherit;
138
+ font-weight: inherit;
139
+ }
140
+
141
+ /*
142
+ Reset links to optimize for opt-in styling instead of opt-out.
143
+ */
144
+
145
+ a {
146
+ color: inherit;
147
+ text-decoration: inherit;
148
+ }
149
+
150
+ /*
151
+ Add the correct font weight in Edge and Safari.
152
+ */
153
+
154
+ b,
155
+ strong {
156
+ font-weight: bolder;
157
+ }
158
+
159
+ /*
160
+ 1. Use the user's configured `mono` font-family by default.
161
+ 2. Use the user's configured `mono` font-feature-settings by default.
162
+ 3. Use the user's configured `mono` font-variation-settings by default.
163
+ 4. Correct the odd `em` font sizing in all browsers.
164
+ */
165
+
166
+ code,
167
+ kbd,
168
+ samp,
169
+ pre {
170
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
171
+ "Liberation Mono", "Courier New", monospace;
172
+ /* 1 */
173
+ font-feature-settings: normal;
174
+ /* 2 */
175
+ font-variation-settings: normal;
176
+ /* 3 */
177
+ font-size: 1em;
178
+ /* 4 */
179
+ }
180
+
181
+ /*
182
+ Add the correct font size in all browsers.
183
+ */
184
+
185
+ small {
186
+ font-size: 80%;
187
+ }
188
+
189
+ /*
190
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
191
+ */
192
+
193
+ sub,
194
+ sup {
195
+ font-size: 75%;
196
+ line-height: 0;
197
+ position: relative;
198
+ vertical-align: baseline;
199
+ }
200
+
201
+ sub {
202
+ bottom: -0.25em;
203
+ }
204
+
205
+ sup {
206
+ top: -0.5em;
207
+ }
208
+
209
+ /*
210
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
211
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
212
+ 3. Remove gaps between table borders by default.
213
+ */
214
+
215
+ table {
216
+ text-indent: 0;
217
+ /* 1 */
218
+ border-color: inherit;
219
+ /* 2 */
220
+ border-collapse: collapse;
221
+ /* 3 */
222
+ }
223
+
224
+ /*
225
+ 1. Change the font styles in all browsers.
226
+ 2. Remove the margin in Firefox and Safari.
227
+ 3. Remove default padding in all browsers.
228
+ */
229
+
230
+ button,
231
+ input,
232
+ optgroup,
233
+ select,
234
+ textarea {
235
+ font-family: inherit;
236
+ /* 1 */
237
+ font-feature-settings: inherit;
238
+ /* 1 */
239
+ font-variation-settings: inherit;
240
+ /* 1 */
241
+ font-size: 100%;
242
+ /* 1 */
243
+ font-weight: inherit;
244
+ /* 1 */
245
+ line-height: inherit;
246
+ /* 1 */
247
+ color: inherit;
248
+ /* 1 */
249
+ margin: 0;
250
+ /* 2 */
251
+ padding: 0;
252
+ /* 3 */
253
+ }
254
+
255
+ /*
256
+ Remove the inheritance of text transform in Edge and Firefox.
257
+ */
258
+
259
+ button,
260
+ select {
261
+ text-transform: none;
262
+ }
263
+
264
+ /*
265
+ 1. Correct the inability to style clickable types in iOS and Safari.
266
+ 2. Remove default button styles.
267
+ */
268
+
269
+ button,
270
+ [type="button"],
271
+ [type="reset"],
272
+ [type="submit"] {
273
+ -webkit-appearance: button;
274
+ /* 1 */
275
+ background-color: transparent;
276
+ /* 2 */
277
+ background-image: none;
278
+ /* 2 */
279
+ }
280
+
281
+ /*
282
+ Use the modern Firefox focus style for all focusable elements.
283
+ */
284
+
285
+ :-moz-focusring {
286
+ outline: auto;
287
+ }
288
+
289
+ /*
290
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
291
+ */
292
+
293
+ :-moz-ui-invalid {
294
+ box-shadow: none;
295
+ }
296
+
297
+ /*
298
+ Add the correct vertical alignment in Chrome and Firefox.
299
+ */
300
+
301
+ progress {
302
+ vertical-align: baseline;
303
+ }
304
+
305
+ /*
306
+ Correct the cursor style of increment and decrement buttons in Safari.
307
+ */
308
+
309
+ ::-webkit-inner-spin-button,
310
+ ::-webkit-outer-spin-button {
311
+ height: auto;
312
+ }
313
+
314
+ /*
315
+ 1. Correct the odd appearance in Chrome and Safari.
316
+ 2. Correct the outline style in Safari.
317
+ */
318
+
319
+ [type="search"] {
320
+ -webkit-appearance: textfield;
321
+ /* 1 */
322
+ outline-offset: -2px;
323
+ /* 2 */
324
+ }
325
+
326
+ /*
327
+ Remove the inner padding in Chrome and Safari on macOS.
328
+ */
329
+
330
+ ::-webkit-search-decoration {
331
+ -webkit-appearance: none;
332
+ }
333
+
334
+ /*
335
+ 1. Correct the inability to style clickable types in iOS and Safari.
336
+ 2. Change font properties to `inherit` in Safari.
337
+ */
338
+
339
+ ::-webkit-file-upload-button {
340
+ -webkit-appearance: button;
341
+ /* 1 */
342
+ font: inherit;
343
+ /* 2 */
344
+ }
345
+
346
+ /*
347
+ Add the correct display in Chrome and Safari.
348
+ */
349
+
350
+ summary {
351
+ display: list-item;
352
+ }
353
+
354
+ /*
355
+ Removes the default spacing and border for appropriate elements.
356
+ */
357
+
358
+ blockquote,
359
+ dl,
360
+ dd,
361
+ h1,
362
+ h2,
363
+ h3,
364
+ h4,
365
+ h5,
366
+ h6,
367
+ hr,
368
+ figure,
369
+ p,
370
+ pre {
371
+ margin: 0;
372
+ }
373
+
374
+ fieldset {
375
+ margin: 0;
376
+ padding: 0;
377
+ }
378
+
379
+ legend {
380
+ padding: 0;
381
+ }
382
+
383
+ ol,
384
+ ul,
385
+ menu {
386
+ list-style: none;
387
+ margin: 0;
388
+ padding: 0;
389
+ }
390
+
391
+ /*
392
+ Reset default styling for dialogs.
393
+ */
394
+
395
+ dialog {
396
+ padding: 0;
397
+ }
398
+
399
+ /*
400
+ Prevent resizing textareas horizontally by default.
401
+ */
402
+
403
+ textarea {
404
+ resize: vertical;
405
+ }
406
+
407
+ /*
408
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
409
+ 2. Set the default placeholder color to the user's configured gray 400 color.
410
+ */
411
+
412
+ input::placeholder,
413
+ textarea::placeholder {
414
+ opacity: 1;
415
+ /* 1 */
416
+ color: #9ca3af;
417
+ /* 2 */
418
+ }
419
+
420
+ /*
421
+ Set the default cursor for buttons.
422
+ */
423
+
424
+ button,
425
+ [role="button"] {
426
+ cursor: pointer;
427
+ }
428
+
429
+ /*
430
+ Make sure disabled buttons don't get the pointer cursor.
431
+ */
432
+
433
+ :disabled {
434
+ cursor: default;
435
+ }
436
+
437
+ /*
438
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
439
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
440
+ This can trigger a poorly considered lint error in some tools but is included by design.
441
+ */
442
+
443
+ img,
444
+ svg,
445
+ video,
446
+ canvas,
447
+ audio,
448
+ iframe,
449
+ embed,
450
+ object {
451
+ display: block;
452
+ /* 1 */
453
+ vertical-align: middle;
454
+ /* 2 */
455
+ }
456
+
457
+ /*
458
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
459
+ */
460
+
461
+ img,
462
+ video {
463
+ max-width: 100%;
464
+ height: auto;
465
+ }
466
+
467
+ /* Make elements with the HTML hidden attribute stay hidden by default */
468
+
469
+ [hidden] {
470
+ display: none;
471
+ }
472
+
473
+ *,
474
+ ::before,
475
+ ::after {
476
+ --tw-border-spacing-x: 0;
477
+ --tw-border-spacing-y: 0;
478
+ --tw-translate-x: 0;
479
+ --tw-translate-y: 0;
480
+ --tw-rotate: 0;
481
+ --tw-skew-x: 0;
482
+ --tw-skew-y: 0;
483
+ --tw-scale-x: 1;
484
+ --tw-scale-y: 1;
485
+ --tw-pan-x: ;
486
+ --tw-pan-y: ;
487
+ --tw-pinch-zoom: ;
488
+ --tw-scroll-snap-strictness: proximity;
489
+ --tw-gradient-from-position: ;
490
+ --tw-gradient-via-position: ;
491
+ --tw-gradient-to-position: ;
492
+ --tw-ordinal: ;
493
+ --tw-slashed-zero: ;
494
+ --tw-numeric-figure: ;
495
+ --tw-numeric-spacing: ;
496
+ --tw-numeric-fraction: ;
497
+ --tw-ring-inset: ;
498
+ --tw-ring-offset-width: 0px;
499
+ --tw-ring-offset-color: #fff;
500
+ --tw-ring-color: rgb(59 130 246 / 0.5);
501
+ --tw-ring-offset-shadow: 0 0 #0000;
502
+ --tw-ring-shadow: 0 0 #0000;
503
+ --tw-shadow: 0 0 #0000;
504
+ --tw-shadow-colored: 0 0 #0000;
505
+ --tw-blur: ;
506
+ --tw-brightness: ;
507
+ --tw-contrast: ;
508
+ --tw-grayscale: ;
509
+ --tw-hue-rotate: ;
510
+ --tw-invert: ;
511
+ --tw-saturate: ;
512
+ --tw-sepia: ;
513
+ --tw-drop-shadow: ;
514
+ --tw-backdrop-blur: ;
515
+ --tw-backdrop-brightness: ;
516
+ --tw-backdrop-contrast: ;
517
+ --tw-backdrop-grayscale: ;
518
+ --tw-backdrop-hue-rotate: ;
519
+ --tw-backdrop-invert: ;
520
+ --tw-backdrop-opacity: ;
521
+ --tw-backdrop-saturate: ;
522
+ --tw-backdrop-sepia: ;
523
+ }
524
+
525
+ ::backdrop {
526
+ --tw-border-spacing-x: 0;
527
+ --tw-border-spacing-y: 0;
528
+ --tw-translate-x: 0;
529
+ --tw-translate-y: 0;
530
+ --tw-rotate: 0;
531
+ --tw-skew-x: 0;
532
+ --tw-skew-y: 0;
533
+ --tw-scale-x: 1;
534
+ --tw-scale-y: 1;
535
+ --tw-pan-x: ;
536
+ --tw-pan-y: ;
537
+ --tw-pinch-zoom: ;
538
+ --tw-scroll-snap-strictness: proximity;
539
+ --tw-gradient-from-position: ;
540
+ --tw-gradient-via-position: ;
541
+ --tw-gradient-to-position: ;
542
+ --tw-ordinal: ;
543
+ --tw-slashed-zero: ;
544
+ --tw-numeric-figure: ;
545
+ --tw-numeric-spacing: ;
546
+ --tw-numeric-fraction: ;
547
+ --tw-ring-inset: ;
548
+ --tw-ring-offset-width: 0px;
549
+ --tw-ring-offset-color: #fff;
550
+ --tw-ring-color: rgb(59 130 246 / 0.5);
551
+ --tw-ring-offset-shadow: 0 0 #0000;
552
+ --tw-ring-shadow: 0 0 #0000;
553
+ --tw-shadow: 0 0 #0000;
554
+ --tw-shadow-colored: 0 0 #0000;
555
+ --tw-blur: ;
556
+ --tw-brightness: ;
557
+ --tw-contrast: ;
558
+ --tw-grayscale: ;
559
+ --tw-hue-rotate: ;
560
+ --tw-invert: ;
561
+ --tw-saturate: ;
562
+ --tw-sepia: ;
563
+ --tw-drop-shadow: ;
564
+ --tw-backdrop-blur: ;
565
+ --tw-backdrop-brightness: ;
566
+ --tw-backdrop-contrast: ;
567
+ --tw-backdrop-grayscale: ;
568
+ --tw-backdrop-hue-rotate: ;
569
+ --tw-backdrop-invert: ;
570
+ --tw-backdrop-opacity: ;
571
+ --tw-backdrop-saturate: ;
572
+ --tw-backdrop-sepia: ;
573
+ }
574
+
575
+ .sr-only {
576
+ position: absolute;
577
+ width: 1px;
578
+ height: 1px;
579
+ padding: 0;
580
+ margin: -1px;
581
+ overflow: hidden;
582
+ clip: rect(0, 0, 0, 0);
583
+ white-space: nowrap;
584
+ border-width: 0;
585
+ }
586
+
587
+ .collapse {
588
+ visibility: collapse;
589
+ }
590
+
591
+ .absolute {
592
+ position: absolute;
593
+ }
594
+
595
+ .relative {
596
+ position: relative;
597
+ }
598
+
599
+ .inset-0 {
600
+ inset: 0px;
601
+ }
602
+
603
+ .end-0 {
604
+ inset-inline-end: 0px;
605
+ }
606
+
607
+ .top-0 {
608
+ top: 0px;
609
+ }
610
+
611
+ .z-10 {
612
+ z-index: 10;
613
+ }
614
+
615
+ .z-20 {
616
+ z-index: 20;
617
+ }
618
+
619
+ .mx-10 {
620
+ margin-left: 2.5rem;
621
+ margin-right: 2.5rem;
622
+ }
623
+
624
+ .mx-auto {
625
+ margin-left: auto;
626
+ margin-right: auto;
627
+ }
628
+
629
+ .my-2 {
630
+ margin-top: 0.5rem;
631
+ margin-bottom: 0.5rem;
632
+ }
633
+
634
+ .mb-10 {
635
+ margin-bottom: 2.5rem;
636
+ }
637
+
638
+ .mb-2 {
639
+ margin-bottom: 0.5rem;
640
+ }
641
+
642
+ .ms-2 {
643
+ margin-inline-start: 0.5rem;
644
+ }
645
+
646
+ .ms-2\.5 {
647
+ margin-inline-start: 0.625rem;
648
+ }
649
+
650
+ .ms-3 {
651
+ margin-inline-start: 0.75rem;
652
+ }
653
+
654
+ .mt-1 {
655
+ margin-top: 0.25rem;
656
+ }
657
+
658
+ .mt-6 {
659
+ margin-top: 1.5rem;
660
+ }
661
+
662
+ .block {
663
+ display: block;
664
+ }
665
+
666
+ .inline-block {
667
+ display: inline-block;
668
+ }
669
+
670
+ .inline {
671
+ display: inline;
672
+ }
673
+
674
+ .flex {
675
+ display: flex;
676
+ }
677
+
678
+ .inline-flex {
679
+ display: inline-flex;
680
+ }
681
+
682
+ .hidden {
683
+ display: none;
684
+ }
685
+
686
+ .h-10 {
687
+ height: 2.5rem;
688
+ }
689
+
690
+ .h-2 {
691
+ height: 0.5rem;
692
+ }
693
+
694
+ .h-2\.5 {
695
+ height: 0.625rem;
696
+ }
697
+
698
+ .h-3 {
699
+ height: 0.75rem;
700
+ }
701
+
702
+ .h-4 {
703
+ height: 1rem;
704
+ }
705
+
706
+ .h-6 {
707
+ height: 1.5rem;
708
+ }
709
+
710
+ .h-full {
711
+ height: 100%;
712
+ }
713
+
714
+ .min-h-screen {
715
+ min-height: 100vh;
716
+ }
717
+
718
+ .w-1\/3 {
719
+ width: 33.333333%;
720
+ }
721
+
722
+ .w-10 {
723
+ width: 2.5rem;
724
+ }
725
+
726
+ .w-2 {
727
+ width: 0.5rem;
728
+ }
729
+
730
+ .w-2\.5 {
731
+ width: 0.625rem;
732
+ }
733
+
734
+ .w-3 {
735
+ width: 0.75rem;
736
+ }
737
+
738
+ .w-4 {
739
+ width: 1rem;
740
+ }
741
+
742
+ .w-44 {
743
+ width: 11rem;
744
+ }
745
+
746
+ .w-6 {
747
+ width: 1.5rem;
748
+ }
749
+
750
+ .w-full {
751
+ width: 100%;
752
+ }
753
+
754
+ .max-w-lg {
755
+ max-width: 32rem;
756
+ }
757
+
758
+ .flex-shrink-0 {
759
+ flex-shrink: 0;
760
+ }
761
+
762
+ .shrink-0 {
763
+ flex-shrink: 0;
764
+ }
765
+
766
+ .-rotate-90 {
767
+ --tw-rotate: -90deg;
768
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
769
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
770
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
771
+ }
772
+
773
+ .rotate-180 {
774
+ --tw-rotate: 180deg;
775
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
776
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
777
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
778
+ }
779
+
780
+ .cursor-pointer {
781
+ cursor: pointer;
782
+ }
783
+
784
+ .flex-col {
785
+ flex-direction: column;
786
+ }
787
+
788
+ .items-center {
789
+ align-items: center;
790
+ }
791
+
792
+ .justify-center {
793
+ justify-content: center;
794
+ }
795
+
796
+ .justify-between {
797
+ justify-content: space-between;
798
+ }
799
+
800
+ .gap-3 {
801
+ gap: 0.75rem;
802
+ }
803
+
804
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
805
+ --tw-space-x-reverse: 0;
806
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
807
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
808
+ }
809
+
810
+ .divide-y > :not([hidden]) ~ :not([hidden]) {
811
+ --tw-divide-y-reverse: 0;
812
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
813
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
814
+ }
815
+
816
+ .divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
817
+ --tw-divide-opacity: 1;
818
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
819
+ }
820
+
821
+ .overflow-hidden {
822
+ overflow: hidden;
823
+ }
824
+
825
+ .whitespace-nowrap {
826
+ white-space: nowrap;
827
+ }
828
+
829
+ .rounded-full {
830
+ border-radius: 9999px;
831
+ }
832
+
833
+ .rounded-lg {
834
+ border-radius: 0.5rem;
835
+ }
836
+
837
+ .rounded-e-lg {
838
+ border-start-end-radius: 0.5rem;
839
+ border-end-end-radius: 0.5rem;
840
+ }
841
+
842
+ .rounded-s-lg {
843
+ border-start-start-radius: 0.5rem;
844
+ border-end-start-radius: 0.5rem;
845
+ }
846
+
847
+ .rounded-t-xl {
848
+ border-top-left-radius: 0.75rem;
849
+ border-top-right-radius: 0.75rem;
850
+ }
851
+
852
+ .border {
853
+ border-width: 1px;
854
+ }
855
+
856
+ .border-b-0 {
857
+ border-bottom-width: 0px;
858
+ }
859
+
860
+ .border-s-2 {
861
+ border-inline-start-width: 2px;
862
+ }
863
+
864
+ .border-t-0 {
865
+ border-top-width: 0px;
866
+ }
867
+
868
+ .border-blue-700 {
869
+ --tw-border-opacity: 1;
870
+ border-color: rgb(29 78 216 / var(--tw-border-opacity));
871
+ }
872
+
873
+ .border-gray-200 {
874
+ --tw-border-opacity: 1;
875
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
876
+ }
877
+
878
+ .border-gray-300 {
879
+ --tw-border-opacity: 1;
880
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
881
+ }
882
+
883
+ .border-s-gray-50 {
884
+ --tw-border-opacity: 1;
885
+ border-inline-start-color: rgb(249 250 251 / var(--tw-border-opacity));
886
+ }
887
+
888
+ .bg-blue-200 {
889
+ --tw-bg-opacity: 1;
890
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
891
+ }
892
+
893
+ .bg-blue-700 {
894
+ --tw-bg-opacity: 1;
895
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
896
+ }
897
+
898
+ .bg-gray-100 {
899
+ --tw-bg-opacity: 1;
900
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
901
+ }
902
+
903
+ .bg-gray-50 {
904
+ --tw-bg-opacity: 1;
905
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
906
+ }
907
+
908
+ .bg-green-100 {
909
+ --tw-bg-opacity: 1;
910
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
911
+ }
912
+
913
+ .bg-green-200 {
914
+ --tw-bg-opacity: 1;
915
+ background-color: rgb(187 247 208 / var(--tw-bg-opacity));
916
+ }
917
+
918
+ .bg-orange-200 {
919
+ --tw-bg-opacity: 1;
920
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
921
+ }
922
+
923
+ .bg-violet-100 {
924
+ --tw-bg-opacity: 1;
925
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
926
+ }
927
+
928
+ .bg-white {
929
+ --tw-bg-opacity: 1;
930
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
931
+ }
932
+
933
+ .bg-yellow-100 {
934
+ --tw-bg-opacity: 1;
935
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
936
+ }
937
+
938
+ .bg-\[url\(\/img\/grid\.svg\)\] {
939
+ background-image: url(/img/grid.svg);
940
+ }
941
+
942
+ .bg-center {
943
+ background-position: center;
944
+ }
945
+
946
+ .p-0 {
947
+ padding: 0px;
948
+ }
949
+
950
+ .p-0\.5 {
951
+ padding: 0.125rem;
952
+ }
953
+
954
+ .p-1 {
955
+ padding: 0.25rem;
956
+ }
957
+
958
+ .p-2 {
959
+ padding: 0.5rem;
960
+ }
961
+
962
+ .p-2\.5 {
963
+ padding: 0.625rem;
964
+ }
965
+
966
+ .p-5 {
967
+ padding: 1.25rem;
968
+ }
969
+
970
+ .px-2 {
971
+ padding-left: 0.5rem;
972
+ padding-right: 0.5rem;
973
+ }
974
+
975
+ .px-4 {
976
+ padding-left: 1rem;
977
+ padding-right: 1rem;
978
+ }
979
+
980
+ .px-5 {
981
+ padding-left: 1.25rem;
982
+ padding-right: 1.25rem;
983
+ }
984
+
985
+ .px-6 {
986
+ padding-left: 1.5rem;
987
+ padding-right: 1.5rem;
988
+ }
989
+
990
+ .py-2 {
991
+ padding-top: 0.5rem;
992
+ padding-bottom: 0.5rem;
993
+ }
994
+
995
+ .py-2\.5 {
996
+ padding-top: 0.625rem;
997
+ padding-bottom: 0.625rem;
998
+ }
999
+
1000
+ .py-6 {
1001
+ padding-top: 1.5rem;
1002
+ padding-bottom: 1.5rem;
1003
+ }
1004
+
1005
+ .pb-2 {
1006
+ padding-bottom: 0.5rem;
1007
+ }
1008
+
1009
+ .pb-8 {
1010
+ padding-bottom: 2rem;
1011
+ }
1012
+
1013
+ .pt-10 {
1014
+ padding-top: 2.5rem;
1015
+ }
1016
+
1017
+ .text-center {
1018
+ text-align: center;
1019
+ }
1020
+
1021
+ .text-sm {
1022
+ font-size: 0.875rem;
1023
+ line-height: 1.25rem;
1024
+ }
1025
+
1026
+ .text-xs {
1027
+ font-size: 0.75rem;
1028
+ line-height: 1rem;
1029
+ }
1030
+
1031
+ .font-bold {
1032
+ font-weight: 700;
1033
+ }
1034
+
1035
+ .font-medium {
1036
+ font-weight: 500;
1037
+ }
1038
+
1039
+ .font-semibold {
1040
+ font-weight: 600;
1041
+ }
1042
+
1043
+ .text-blue-800 {
1044
+ --tw-text-opacity: 1;
1045
+ color: rgb(30 64 175);
1046
+ }
1047
+
1048
+ .text-gray-400 {
1049
+ --tw-text-opacity: 1;
1050
+ color: rgb(156 163 175);
1051
+ }
1052
+
1053
+ .text-gray-500 {
1054
+ --tw-text-opacity: 1;
1055
+ color: rgb(107 114 128);
1056
+ }
1057
+
1058
+ .text-gray-600 {
1059
+ --tw-text-opacity: 1;
1060
+ color: rgb(75 85 99);
1061
+ }
1062
+
1063
+ .text-gray-700 {
1064
+ --tw-text-opacity: 1;
1065
+ color: rgb(55 65 81);
1066
+ }
1067
+
1068
+ .text-gray-900 {
1069
+ --tw-text-opacity: 1;
1070
+ color: rgb(17 24 39);
1071
+ }
1072
+
1073
+ .text-white {
1074
+ --tw-text-opacity: 1;
1075
+ color: rgb(255 255 255);
1076
+ }
1077
+
1078
+ .shadow {
1079
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1080
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
1081
+ 0 1px 2px -1px var(--tw-shadow-color);
1082
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1083
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1084
+ }
1085
+
1086
+ .shadow-xl {
1087
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
1088
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
1089
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),
1090
+ 0 8px 10px -6px var(--tw-shadow-color);
1091
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1092
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1093
+ }
1094
+
1095
+ .ring-1 {
1096
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1097
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1098
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1099
+ calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1100
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1101
+ var(--tw-shadow, 0 0 #0000);
1102
+ }
1103
+
1104
+ .ring-gray-900\/5 {
1105
+ --tw-ring-color: rgb(17 24 39 / 0.05);
1106
+ }
1107
+
1108
+ .sequence_container {
1109
+ overflow-wrap: anywhere;
1110
+ counter-reset: sequence;
1111
+ }
1112
+
1113
+ .sequence_container .sequence__chunk {
1114
+ display: inline-block;
1115
+ margin: 0.1rem 0 1rem 1rem;
1116
+ /* width: 10ch; */
1117
+ position: relative;
1118
+ white-space: nowrap;
1119
+ }
1120
+
1121
+ .sequence_container .sequence__chunk:not(:last-child):before,
1122
+ .sequence_container .sequence__chunk--display-last:before {
1123
+ content: counter(sequence);
1124
+ counter-increment: sequence 10;
1125
+ position: absolute;
1126
+ top: -0.8em;
1127
+ right: 0;
1128
+ opacity: 0.5;
1129
+ font-weight: bold;
1130
+ }
1131
+
1132
+ .sequence-container .sequence__chunk::after {
1133
+ content: "";
1134
+ position: absolute;
1135
+ bottom: 0;
1136
+ left: 0;
1137
+ right: 0;
1138
+ transform-origin: left;
1139
+ transform: scaleX(0.1);
1140
+ box-shadow: var(--box-shadow);
1141
+ }
1142
+
1143
+ .sequence__chunk span {
1144
+ padding: 0 0.05rem;
1145
+ }
1146
+
1147
+ .hover\:bg-blue-800:hover {
1148
+ --tw-bg-opacity: 1;
1149
+ background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1150
+ }
1151
+
1152
+ .hover\:bg-gray-100:hover {
1153
+ --tw-bg-opacity: 1;
1154
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1155
+ }
1156
+
1157
+ .hover\:bg-gray-200:hover {
1158
+ --tw-bg-opacity: 1;
1159
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1160
+ }
1161
+
1162
+ .hover\:font-bold:hover {
1163
+ font-weight: 700;
1164
+ }
1165
+
1166
+ .focus\:border-blue-500:focus {
1167
+ --tw-border-opacity: 1;
1168
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1169
+ }
1170
+
1171
+ .focus\:outline-none:focus {
1172
+ outline: 2px solid transparent;
1173
+ outline-offset: 2px;
1174
+ }
1175
+
1176
+ .focus\:ring-4:focus {
1177
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1178
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1179
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1180
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1181
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1182
+ var(--tw-shadow, 0 0 #0000);
1183
+ }
1184
+
1185
+ .focus\:ring-blue-300:focus {
1186
+ --tw-ring-opacity: 1;
1187
+ --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1188
+ }
1189
+
1190
+ .focus\:ring-blue-500:focus {
1191
+ --tw-ring-opacity: 1;
1192
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1193
+ }
1194
+
1195
+ .focus\:ring-gray-100:focus {
1196
+ --tw-ring-opacity: 1;
1197
+ --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity));
1198
+ }
1199
+
1200
+ .focus\:ring-gray-200:focus {
1201
+ --tw-ring-opacity: 1;
1202
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1203
+ }
1204
+
1205
+ @media (min-width: 640px) {
1206
+ .sm\:mx-auto {
1207
+ margin-left: auto;
1208
+ margin-right: auto;
1209
+ }
1210
+
1211
+ .sm\:rounded-lg {
1212
+ border-radius: 0.5rem;
1213
+ }
1214
+
1215
+ .sm\:px-10 {
1216
+ padding-left: 2.5rem;
1217
+ padding-right: 2.5rem;
1218
+ }
1219
+
1220
+ .sm\:py-12 {
1221
+ padding-top: 3rem;
1222
+ padding-bottom: 3rem;
1223
+ }
1224
+ }
1225
+
1226
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1227
+ text-align: right;
1228
+ }
1229
+
1230
+ @media (prefers-color-scheme: dark) {
1231
+ .dark\:border-gray-600 {
1232
+ --tw-border-opacity: 1;
1233
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1234
+ }
1235
+
1236
+ .dark\:border-gray-700 {
1237
+ --tw-border-opacity: 1;
1238
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1239
+ }
1240
+
1241
+ .dark\:border-s-gray-700 {
1242
+ --tw-border-opacity: 1;
1243
+ border-inline-start-color: rgb(55 65 81 / var(--tw-border-opacity));
1244
+ }
1245
+
1246
+ .dark\:bg-blue-600 {
1247
+ --tw-bg-opacity: 1;
1248
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1249
+ }
1250
+
1251
+ .dark\:bg-gray-600 {
1252
+ --tw-bg-opacity: 1;
1253
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1254
+ }
1255
+
1256
+ .dark\:bg-gray-700 {
1257
+ --tw-bg-opacity: 1;
1258
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1259
+ }
1260
+
1261
+ .dark\:bg-gray-900 {
1262
+ --tw-bg-opacity: 1;
1263
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1264
+ }
1265
+
1266
+ .dark\:text-gray-200 {
1267
+ --tw-text-opacity: 1;
1268
+ color: rgb(229 231 235);
1269
+ }
1270
+
1271
+ .dark\:text-gray-300 {
1272
+ --tw-text-opacity: 1;
1273
+ color: rgb(209 213 219);
1274
+ }
1275
+
1276
+ .dark\:text-gray-400 {
1277
+ --tw-text-opacity: 1;
1278
+ color: rgb(156 163 175);
1279
+ }
1280
+
1281
+ .dark\:text-white {
1282
+ --tw-text-opacity: 1;
1283
+ color: rgb(255 255 255);
1284
+ }
1285
+
1286
+ .dark\:placeholder-gray-400::placeholder {
1287
+ --tw-placeholder-opacity: 1;
1288
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1289
+ }
1290
+
1291
+ .dark\:hover\:bg-blue-700:hover {
1292
+ --tw-bg-opacity: 1;
1293
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1294
+ }
1295
+
1296
+ .dark\:hover\:bg-gray-600:hover {
1297
+ --tw-bg-opacity: 1;
1298
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1299
+ }
1300
+
1301
+ .dark\:hover\:bg-gray-800:hover {
1302
+ --tw-bg-opacity: 1;
1303
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1304
+ }
1305
+
1306
+ .dark\:hover\:text-white:hover {
1307
+ --tw-text-opacity: 1;
1308
+ color: rgb(255 255 255);
1309
+ }
1310
+
1311
+ .dark\:focus\:border-blue-500:focus {
1312
+ --tw-border-opacity: 1;
1313
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1314
+ }
1315
+
1316
+ .dark\:focus\:ring-blue-500:focus {
1317
+ --tw-ring-opacity: 1;
1318
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1319
+ }
1320
+
1321
+ .dark\:focus\:ring-blue-800:focus {
1322
+ --tw-ring-opacity: 1;
1323
+ --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1324
+ }
1325
+
1326
+ .dark\:focus\:ring-gray-700:focus {
1327
+ --tw-ring-opacity: 1;
1328
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
1329
+ }
1330
+
1331
+ .dark\:focus\:ring-gray-800:focus {
1332
+ --tw-ring-opacity: 1;
1333
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1334
+ }
1335
+ }
1336
+ </style>
src/frontend/shared/SequenceInput.svelte ADDED
@@ -0,0 +1,1699 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svelte:options accessors={true} />
2
+
3
+ <script>
4
+ import { tick } from "svelte";
5
+
6
+ import Btn from "./Button.svelte";
7
+ import SearchInput from "./SearchInput.svelte";
8
+
9
+ import Accordion from "./Accordion.svelte";
10
+ import { createEventDispatcher, onMount, afterUpdate } from "svelte";
11
+
12
+ export let value = { chains: [], covMods: [] };
13
+
14
+ const dispatch = createEventDispatcher();
15
+
16
+ let metals = [
17
+ "ZN",
18
+ "MG",
19
+ "CA",
20
+ "FE",
21
+ "NA",
22
+ "K",
23
+ "CL",
24
+ "CU",
25
+ "MN",
26
+ "CO",
27
+ "NI",
28
+ ];
29
+
30
+ async function getSDF(id) {
31
+ let sdf = await fetch(
32
+ `https://files.rcsb.org/ligands/download/${id}_ideal.sdf`
33
+ )
34
+ .then((response) => {
35
+ if (!response.ok) {
36
+ // Check if the status code is 200
37
+ throw new Error("Network response was not ok");
38
+ }
39
+ return response.text();
40
+ })
41
+ .catch((error) => {
42
+ alert("Error fetching sdf file");
43
+ });
44
+ // console.log(sdf);
45
+ return sdf;
46
+ }
47
+
48
+ function nextChainTemp(currentChain) {
49
+ if (currentChain == "") {
50
+ return "A";
51
+ }
52
+ let nextChain = "";
53
+ if (currentChain == "Z") {
54
+ nextChain = "AA";
55
+ } else if (currentChain.length > 1 && currentChain.slice(-1) === "Z") {
56
+ nextChain = String.fromCharCode(currentChain.charCodeAt(0) + 1) + "A";
57
+ } else {
58
+ nextChain =
59
+ currentChain.slice(0, -1) +
60
+ String.fromCharCode(currentChain.slice(-1).charCodeAt(0) + 1);
61
+ }
62
+ return nextChain;
63
+ }
64
+ async function handleMessage(event) {
65
+ let pdbId = event.detail.text;
66
+ //convert to lowercase
67
+ pdbId = pdbId.toLowerCase();
68
+ let bioAssemblyInfo = await importBioAssembly(pdbId);
69
+ // console.log(bioAssemblyInfo);
70
+ // convert assembly info to vals
71
+ let tempVals = [];
72
+ let nextChain = "";
73
+
74
+ let promise = await Promise.all(
75
+ bioAssemblyInfo.map(async (entity) => {
76
+ if (["DNA", "RNA", "protein"].includes(entity.class)) {
77
+ for (let i = 0; i < entity.count; i++) {
78
+ nextChain = nextChainTemp(nextChain);
79
+ tempVals.push({
80
+ class: entity.class,
81
+ name: "",
82
+ smiles: "",
83
+ sdf: "",
84
+ sequence: entity.entityInfo,
85
+ open: false,
86
+ chain: nextChain,
87
+ });
88
+ await tick();
89
+ }
90
+ } else if (entity.class === "ligand") {
91
+ let name = "";
92
+ let sdf = "";
93
+ if (metals.includes(entity.entityInfo)) {
94
+ name = entity.entityInfo;
95
+ } else {
96
+ sdf = await getSDF(entity.entityInfo);
97
+ }
98
+ for (let i = 0; i < entity.count; i++) {
99
+ nextChain = nextChainTemp(nextChain);
100
+ tempVals.push({
101
+ class: entity.class,
102
+ name: name,
103
+ smiles: "",
104
+ sdf: sdf,
105
+ sequence: "",
106
+ open: false,
107
+ chain: nextChain,
108
+ });
109
+ }
110
+ await tick();
111
+ }
112
+ })
113
+ );
114
+ vals = tempVals;
115
+ dispatch("updateVals", vals);
116
+ }
117
+
118
+ let vals = [];
119
+ let covMods = [];
120
+
121
+ function update(event) {
122
+ // vals[event.detail.index].open = event.detail.open;
123
+ if (event.detail.sequence !== undefined) {
124
+ vals[event.detail.index].sequence = event.detail.sequence;
125
+ }
126
+ if (event.detail.name !== undefined) {
127
+ vals[event.detail.index].name = event.detail.name;
128
+ vals[event.detail.index].open = event.detail.open;
129
+ vals[event.detail.index].sdf = "";
130
+ vals[event.detail.index].smiles = "";
131
+ }
132
+ if (event.detail.smiles !== undefined) {
133
+ vals[event.detail.index].smiles = event.detail.smiles;
134
+ vals[event.detail.index].sdf = "";
135
+ vals[event.detail.index].name = "";
136
+ }
137
+ if (event.detail.sdf !== undefined) {
138
+ if (event.detail.close == true) {
139
+ vals[event.detail.index].open = false;
140
+ }
141
+ vals[event.detail.index].sdf = event.detail.sdf;
142
+ vals[event.detail.index].name = "";
143
+ vals[event.detail.index].smiles = "";
144
+ }
145
+ dispatch("updateVals", vals);
146
+ }
147
+
148
+ function getNextChainLetter() {
149
+ let highestChainLetter = "A";
150
+ for (let val of vals) {
151
+ if (val.chain > highestChainLetter) {
152
+ highestChainLetter = val.chain;
153
+ }
154
+ }
155
+
156
+ // Increment the highest chain letter to get the next chain letter
157
+ let nextChainLetter = "";
158
+ if (highestChainLetter < "Z") {
159
+ nextChainLetter = String.fromCharCode(
160
+ highestChainLetter.charCodeAt(0) + 1
161
+ );
162
+ } else {
163
+ let lastChar = highestChainLetter.slice(-1);
164
+ if (lastChar < "Z") {
165
+ nextChainLetter =
166
+ highestChainLetter.slice(0, -1) +
167
+ String.fromCharCode(lastChar.charCodeAt(0) + 1);
168
+ } else {
169
+ nextChainLetter = highestChainLetter + "A";
170
+ }
171
+ }
172
+
173
+ return nextChainLetter;
174
+ }
175
+
176
+ function insertChain(event) {
177
+ // what chain to add next
178
+ let nextChainLetter = getNextChainLetter();
179
+ vals.push({
180
+ class: event.detail.type,
181
+ name: "",
182
+ smiles: "",
183
+ sdf: "",
184
+ sequence: "",
185
+ open: true,
186
+ chain: nextChainLetter,
187
+ });
188
+ vals = vals;
189
+ // console.log(vals);
190
+ }
191
+
192
+ function remove(event) {
193
+ vals.splice(event.detail, 1);
194
+ vals = vals;
195
+ }
196
+
197
+ async function fetchMolecules(pdbId) {
198
+ const url = `https://www.ebi.ac.uk/pdbe/api/pdb/entry/molecules/${pdbId}`;
199
+ try {
200
+ const response = await fetch(url);
201
+ if (!response.ok) {
202
+ throw new Error(
203
+ `Error fetching molecules for PDB ID ${pdbId}: ${response.statusText}`
204
+ );
205
+ }
206
+ const data = await response.json();
207
+ return data;
208
+ } catch (error) {
209
+ console.error("Error fetching molecules:", error);
210
+ }
211
+ }
212
+
213
+ async function fetchXmlText(url) {
214
+ try {
215
+ const response = await fetch(url);
216
+ if (!response.ok) {
217
+ throw new Error(`Error fetching XML: ${response.statusText}`);
218
+ }
219
+ const textData = await response.text();
220
+ return textData;
221
+ } catch (error) {
222
+ console.error("Error fetching XML:", error);
223
+ }
224
+ }
225
+
226
+ // Function to parse a single assembly element
227
+ function parseAssembly(assemblyElement) {
228
+ const assembly = {
229
+ id: assemblyElement.getAttribute("id"),
230
+ composition: assemblyElement.getAttribute("composition"),
231
+ molecularWeight: assemblyElement.getAttribute("molecular_weight"),
232
+ name: assemblyElement.getAttribute("name"),
233
+ };
234
+ const entities = [];
235
+ assemblyElement.querySelectorAll("entity").forEach((entityElement) => {
236
+ entities.push({
237
+ chainIds: entityElement.getAttribute("chain_ids"),
238
+ class: entityElement.getAttribute("class"),
239
+ count: entityElement.getAttribute("count"),
240
+ entityId: Number(entityElement.getAttribute("entity_id")), // Added entityId
241
+ });
242
+ });
243
+ assembly.entities = entities;
244
+ return assembly;
245
+ }
246
+
247
+ function extractEntityInfo(entity, moleculeData) {
248
+ if (
249
+ entity.class === "DNA" ||
250
+ entity.class === "RNA" ||
251
+ entity.class === "protein"
252
+ ) {
253
+ // find the entry in moleculedata that matches the entity ID
254
+ const matchingEntity = moleculeData.find(
255
+ (molecule) => molecule.entity_id === entity["entityId"]
256
+ );
257
+ if (matchingEntity) {
258
+ return matchingEntity.sequence;
259
+ }
260
+ } else {
261
+ const matchingEntity = moleculeData.find(
262
+ (molecule) => molecule.entity_id === entity["entityId"]
263
+ );
264
+ if (matchingEntity) {
265
+ // return the sequence of the matching entity
266
+ return matchingEntity.chem_comp_ids[0];
267
+ }
268
+ }
269
+ }
270
+
271
+ function importBioAssembly(pdbId) {
272
+ const moleculeData = fetchMolecules(pdbId)
273
+ .then((data) => {
274
+ return data;
275
+ })
276
+ .catch((error) => {
277
+ console.error("Error:", error);
278
+ });
279
+
280
+ // Example usage
281
+ const xmlUrl = `https://www.ebi.ac.uk/pdbe/static/entry/${pdbId}-assembly.xml`;
282
+ const assemblies = fetchXmlText(xmlUrl).then((data) => {
283
+ // Parse the entire assembly list
284
+ const assemblyList = [];
285
+ const parser = new DOMParser();
286
+ const doc = parser.parseFromString(data, "text/xml");
287
+ const assemblyElements = doc.querySelectorAll("assembly");
288
+ assemblyElements.forEach((assemblyElement) => {
289
+ assemblyList.push(parseAssembly(assemblyElement));
290
+ });
291
+
292
+ return assemblyList;
293
+ });
294
+
295
+ // wait for both fetches to complete
296
+ let result = Promise.all([moleculeData, assemblies]).then(
297
+ ([moleculeData, assemblies]) => {
298
+ let bioAssemblyInfo = [];
299
+
300
+ let assembly = assemblies[0];
301
+ assembly.entities.forEach((entity) => {
302
+ const entityInfo = extractEntityInfo(entity, moleculeData[pdbId]);
303
+ bioAssemblyInfo.push({
304
+ class: entity.class,
305
+ entityInfo: entityInfo,
306
+ count: entity.count,
307
+ });
308
+ });
309
+
310
+ return bioAssemblyInfo;
311
+ }
312
+ );
313
+ return result;
314
+ }
315
+ let display = false;
316
+
317
+ function addCovMod(event) {
318
+ let firstProteinChain = vals.find((val) => val.class === "protein").chain;
319
+
320
+ if (firstProteinChain === undefined) {
321
+ alert("Please add a protein chain first");
322
+ return;
323
+ }
324
+ let firstLigandChain = vals.find((val) => val.class === "ligand").chain;
325
+
326
+ if (firstLigandChain === undefined) {
327
+ alert("Please add a ligand chain first");
328
+ return;
329
+ }
330
+ let covMod = {
331
+ protein: firstProteinChain,
332
+ residue: "1",
333
+ atom: "N",
334
+ protein_symmetry: "CW",
335
+ ligand: firstLigandChain,
336
+ attachmentIndex: 1,
337
+ deleteIndexes: [],
338
+ ligand_symmetry: "CW",
339
+ };
340
+ covMods.push(covMod);
341
+ covMods = covMods;
342
+ vals = vals;
343
+ dispatch("updateCovMod", covMods);
344
+ }
345
+
346
+ function removeCovMod(event) {
347
+ covMods.splice(event.detail, 1);
348
+ covMods = covMods;
349
+ }
350
+ function syncCovMod(event) {
351
+ covMods = event.detail;
352
+ dispatch("updateCovMod", covMods);
353
+ }
354
+
355
+ onMount(async () => {
356
+ vals = value["chains"];
357
+ covMods = value["covMods"];
358
+ // vals = value["chains"];
359
+ });
360
+ </script>
361
+
362
+ {#if vals != undefined}
363
+ {#if vals.length > 0}
364
+ <Accordion
365
+ {vals}
366
+ {covMods}
367
+ on:updateVals={update}
368
+ on:removeVal={remove}
369
+ on:removeCovMod={removeCovMod}
370
+ on:updateCovMod={syncCovMod}
371
+ />
372
+ {:else}
373
+ <div class="my-8 text-center text-gray-600">Empty input</div>
374
+
375
+ <div class="text-center text-gray-400">
376
+ You can import a protein from the PDB
377
+ </div>
378
+ <SearchInput database="rcsb-bioass" on:triggerFetch={handleMessage} />
379
+
380
+ <div class="text-center text-gray-400 w-full my-2">
381
+ - or create the input from scratch -
382
+ </div>
383
+ {/if}
384
+ {/if}
385
+ <Btn
386
+ {vals}
387
+ on:addNewChain={insertChain}
388
+ on:addCovalentModification={addCovMod}
389
+ />
390
+
391
+ <style>
392
+ /*
393
+ ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
394
+ */
395
+
396
+ /*
397
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
398
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
399
+ */
400
+
401
+ *,
402
+ ::before,
403
+ ::after {
404
+ box-sizing: border-box;
405
+ /* 1 */
406
+ border-width: 0;
407
+ /* 2 */
408
+ border-style: solid;
409
+ /* 2 */
410
+ border-color: #e5e7eb;
411
+ /* 2 */
412
+ }
413
+
414
+ ::before,
415
+ ::after {
416
+ --tw-content: "";
417
+ }
418
+
419
+ /*
420
+ 1. Use a consistent sensible line-height in all browsers.
421
+ 2. Prevent adjustments of font size after orientation changes in iOS.
422
+ 3. Use a more readable tab size.
423
+ 4. Use the user's configured `sans` font-family by default.
424
+ 5. Use the user's configured `sans` font-feature-settings by default.
425
+ 6. Use the user's configured `sans` font-variation-settings by default.
426
+ 7. Disable tap highlights on iOS
427
+ */
428
+
429
+ html,
430
+ :host {
431
+ line-height: 1.5;
432
+ /* 1 */
433
+ -webkit-text-size-adjust: 100%;
434
+ /* 2 */
435
+ -moz-tab-size: 4;
436
+ /* 3 */
437
+ tab-size: 4;
438
+ /* 3 */
439
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
440
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
441
+ /* 4 */
442
+ font-feature-settings: normal;
443
+ /* 5 */
444
+ font-variation-settings: normal;
445
+ /* 6 */
446
+ -webkit-tap-highlight-color: transparent;
447
+ /* 7 */
448
+ }
449
+
450
+ /*
451
+ 1. Remove the margin in all browsers.
452
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
453
+ */
454
+
455
+ body {
456
+ margin: 0;
457
+ /* 1 */
458
+ line-height: inherit;
459
+ /* 2 */
460
+ }
461
+
462
+ /*
463
+ 1. Add the correct height in Firefox.
464
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
465
+ 3. Ensure horizontal rules are visible by default.
466
+ */
467
+
468
+ hr {
469
+ height: 0;
470
+ /* 1 */
471
+ color: inherit;
472
+ /* 2 */
473
+ border-top-width: 1px;
474
+ /* 3 */
475
+ }
476
+
477
+ /*
478
+ Add the correct text decoration in Chrome, Edge, and Safari.
479
+ */
480
+
481
+ abbr:where([title]) {
482
+ text-decoration: underline dotted;
483
+ }
484
+
485
+ /*
486
+ Remove the default font size and weight for headings.
487
+ */
488
+
489
+ h1,
490
+ h2,
491
+ h3,
492
+ h4,
493
+ h5,
494
+ h6 {
495
+ font-size: inherit;
496
+ font-weight: inherit;
497
+ }
498
+
499
+ /*
500
+ Reset links to optimize for opt-in styling instead of opt-out.
501
+ */
502
+
503
+ a {
504
+ color: inherit;
505
+ text-decoration: inherit;
506
+ }
507
+
508
+ /*
509
+ Add the correct font weight in Edge and Safari.
510
+ */
511
+
512
+ b,
513
+ strong {
514
+ font-weight: bolder;
515
+ }
516
+
517
+ /*
518
+ 1. Use the user's configured `mono` font-family by default.
519
+ 2. Use the user's configured `mono` font-feature-settings by default.
520
+ 3. Use the user's configured `mono` font-variation-settings by default.
521
+ 4. Correct the odd `em` font sizing in all browsers.
522
+ */
523
+
524
+ code,
525
+ kbd,
526
+ samp,
527
+ pre {
528
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
529
+ "Liberation Mono", "Courier New", monospace;
530
+ /* 1 */
531
+ font-feature-settings: normal;
532
+ /* 2 */
533
+ font-variation-settings: normal;
534
+ /* 3 */
535
+ font-size: 1em;
536
+ /* 4 */
537
+ }
538
+
539
+ /*
540
+ Add the correct font size in all browsers.
541
+ */
542
+
543
+ small {
544
+ font-size: 80%;
545
+ }
546
+
547
+ /*
548
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
549
+ */
550
+
551
+ sub,
552
+ sup {
553
+ font-size: 75%;
554
+ line-height: 0;
555
+ position: relative;
556
+ vertical-align: baseline;
557
+ }
558
+
559
+ sub {
560
+ bottom: -0.25em;
561
+ }
562
+
563
+ sup {
564
+ top: -0.5em;
565
+ }
566
+
567
+ /*
568
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
569
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
570
+ 3. Remove gaps between table borders by default.
571
+ */
572
+
573
+ table {
574
+ text-indent: 0;
575
+ /* 1 */
576
+ border-color: inherit;
577
+ /* 2 */
578
+ border-collapse: collapse;
579
+ /* 3 */
580
+ }
581
+
582
+ /*
583
+ 1. Change the font styles in all browsers.
584
+ 2. Remove the margin in Firefox and Safari.
585
+ 3. Remove default padding in all browsers.
586
+ */
587
+
588
+ button,
589
+ input,
590
+ optgroup,
591
+ select,
592
+ textarea {
593
+ font-family: inherit;
594
+ /* 1 */
595
+ font-feature-settings: inherit;
596
+ /* 1 */
597
+ font-variation-settings: inherit;
598
+ /* 1 */
599
+ font-size: 100%;
600
+ /* 1 */
601
+ font-weight: inherit;
602
+ /* 1 */
603
+ line-height: inherit;
604
+ /* 1 */
605
+ color: inherit;
606
+ /* 1 */
607
+ margin: 0;
608
+ /* 2 */
609
+ padding: 0;
610
+ /* 3 */
611
+ }
612
+
613
+ /*
614
+ Remove the inheritance of text transform in Edge and Firefox.
615
+ */
616
+
617
+ button,
618
+ select {
619
+ text-transform: none;
620
+ }
621
+
622
+ /*
623
+ 1. Correct the inability to style clickable types in iOS and Safari.
624
+ 2. Remove default button styles.
625
+ */
626
+
627
+ button,
628
+ [type="button"],
629
+ [type="reset"],
630
+ [type="submit"] {
631
+ -webkit-appearance: button;
632
+ /* 1 */
633
+ background-color: transparent;
634
+ /* 2 */
635
+ background-image: none;
636
+ /* 2 */
637
+ }
638
+
639
+ /*
640
+ Use the modern Firefox focus style for all focusable elements.
641
+ */
642
+
643
+ :-moz-focusring {
644
+ outline: auto;
645
+ }
646
+
647
+ /*
648
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
649
+ */
650
+
651
+ :-moz-ui-invalid {
652
+ box-shadow: none;
653
+ }
654
+
655
+ /*
656
+ Add the correct vertical alignment in Chrome and Firefox.
657
+ */
658
+
659
+ progress {
660
+ vertical-align: baseline;
661
+ }
662
+
663
+ /*
664
+ Correct the cursor style of increment and decrement buttons in Safari.
665
+ */
666
+
667
+ ::-webkit-inner-spin-button,
668
+ ::-webkit-outer-spin-button {
669
+ height: auto;
670
+ }
671
+
672
+ /*
673
+ 1. Correct the odd appearance in Chrome and Safari.
674
+ 2. Correct the outline style in Safari.
675
+ */
676
+
677
+ [type="search"] {
678
+ -webkit-appearance: textfield;
679
+ /* 1 */
680
+ outline-offset: -2px;
681
+ /* 2 */
682
+ }
683
+
684
+ /*
685
+ Remove the inner padding in Chrome and Safari on macOS.
686
+ */
687
+
688
+ ::-webkit-search-decoration {
689
+ -webkit-appearance: none;
690
+ }
691
+
692
+ /*
693
+ 1. Correct the inability to style clickable types in iOS and Safari.
694
+ 2. Change font properties to `inherit` in Safari.
695
+ */
696
+
697
+ ::-webkit-file-upload-button {
698
+ -webkit-appearance: button;
699
+ /* 1 */
700
+ font: inherit;
701
+ /* 2 */
702
+ }
703
+
704
+ /*
705
+ Add the correct display in Chrome and Safari.
706
+ */
707
+
708
+ summary {
709
+ display: list-item;
710
+ }
711
+
712
+ /*
713
+ Removes the default spacing and border for appropriate elements.
714
+ */
715
+
716
+ blockquote,
717
+ dl,
718
+ dd,
719
+ h1,
720
+ h2,
721
+ h3,
722
+ h4,
723
+ h5,
724
+ h6,
725
+ hr,
726
+ figure,
727
+ p,
728
+ pre {
729
+ margin: 0;
730
+ }
731
+
732
+ fieldset {
733
+ margin: 0;
734
+ padding: 0;
735
+ }
736
+
737
+ legend {
738
+ padding: 0;
739
+ }
740
+
741
+ ol,
742
+ ul,
743
+ menu {
744
+ list-style: none;
745
+ margin: 0;
746
+ padding: 0;
747
+ }
748
+
749
+ /*
750
+ Reset default styling for dialogs.
751
+ */
752
+
753
+ dialog {
754
+ padding: 0;
755
+ }
756
+
757
+ /*
758
+ Prevent resizing textareas horizontally by default.
759
+ */
760
+
761
+ textarea {
762
+ resize: vertical;
763
+ }
764
+
765
+ /*
766
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
767
+ 2. Set the default placeholder color to the user's configured gray 400 color.
768
+ */
769
+
770
+ input::placeholder,
771
+ textarea::placeholder {
772
+ opacity: 1;
773
+ /* 1 */
774
+ color: #9ca3af;
775
+ /* 2 */
776
+ }
777
+
778
+ /*
779
+ Set the default cursor for buttons.
780
+ */
781
+
782
+ button,
783
+ [role="button"] {
784
+ cursor: pointer;
785
+ }
786
+
787
+ /*
788
+ Make sure disabled buttons don't get the pointer cursor.
789
+ */
790
+
791
+ :disabled {
792
+ cursor: default;
793
+ }
794
+
795
+ /*
796
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
797
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
798
+ This can trigger a poorly considered lint error in some tools but is included by design.
799
+ */
800
+
801
+ img,
802
+ svg,
803
+ video,
804
+ canvas,
805
+ audio,
806
+ iframe,
807
+ embed,
808
+ object {
809
+ display: block;
810
+ /* 1 */
811
+ vertical-align: middle;
812
+ /* 2 */
813
+ }
814
+
815
+ /*
816
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
817
+ */
818
+
819
+ img,
820
+ video {
821
+ max-width: 100%;
822
+ height: auto;
823
+ }
824
+
825
+ /* Make elements with the HTML hidden attribute stay hidden by default */
826
+
827
+ [hidden] {
828
+ display: none;
829
+ }
830
+
831
+ *,
832
+ ::before,
833
+ ::after {
834
+ --tw-border-spacing-x: 0;
835
+ --tw-border-spacing-y: 0;
836
+ --tw-translate-x: 0;
837
+ --tw-translate-y: 0;
838
+ --tw-rotate: 0;
839
+ --tw-skew-x: 0;
840
+ --tw-skew-y: 0;
841
+ --tw-scale-x: 1;
842
+ --tw-scale-y: 1;
843
+ --tw-pan-x: ;
844
+ --tw-pan-y: ;
845
+ --tw-pinch-zoom: ;
846
+ --tw-scroll-snap-strictness: proximity;
847
+ --tw-gradient-from-position: ;
848
+ --tw-gradient-via-position: ;
849
+ --tw-gradient-to-position: ;
850
+ --tw-ordinal: ;
851
+ --tw-slashed-zero: ;
852
+ --tw-numeric-figure: ;
853
+ --tw-numeric-spacing: ;
854
+ --tw-numeric-fraction: ;
855
+ --tw-ring-inset: ;
856
+ --tw-ring-offset-width: 0px;
857
+ --tw-ring-offset-color: #fff;
858
+ --tw-ring-color: rgb(59 130 246 / 0.5);
859
+ --tw-ring-offset-shadow: 0 0 #0000;
860
+ --tw-ring-shadow: 0 0 #0000;
861
+ --tw-shadow: 0 0 #0000;
862
+ --tw-shadow-colored: 0 0 #0000;
863
+ --tw-blur: ;
864
+ --tw-brightness: ;
865
+ --tw-contrast: ;
866
+ --tw-grayscale: ;
867
+ --tw-hue-rotate: ;
868
+ --tw-invert: ;
869
+ --tw-saturate: ;
870
+ --tw-sepia: ;
871
+ --tw-drop-shadow: ;
872
+ --tw-backdrop-blur: ;
873
+ --tw-backdrop-brightness: ;
874
+ --tw-backdrop-contrast: ;
875
+ --tw-backdrop-grayscale: ;
876
+ --tw-backdrop-hue-rotate: ;
877
+ --tw-backdrop-invert: ;
878
+ --tw-backdrop-opacity: ;
879
+ --tw-backdrop-saturate: ;
880
+ --tw-backdrop-sepia: ;
881
+ }
882
+
883
+ ::backdrop {
884
+ --tw-border-spacing-x: 0;
885
+ --tw-border-spacing-y: 0;
886
+ --tw-translate-x: 0;
887
+ --tw-translate-y: 0;
888
+ --tw-rotate: 0;
889
+ --tw-skew-x: 0;
890
+ --tw-skew-y: 0;
891
+ --tw-scale-x: 1;
892
+ --tw-scale-y: 1;
893
+ --tw-pan-x: ;
894
+ --tw-pan-y: ;
895
+ --tw-pinch-zoom: ;
896
+ --tw-scroll-snap-strictness: proximity;
897
+ --tw-gradient-from-position: ;
898
+ --tw-gradient-via-position: ;
899
+ --tw-gradient-to-position: ;
900
+ --tw-ordinal: ;
901
+ --tw-slashed-zero: ;
902
+ --tw-numeric-figure: ;
903
+ --tw-numeric-spacing: ;
904
+ --tw-numeric-fraction: ;
905
+ --tw-ring-inset: ;
906
+ --tw-ring-offset-width: 0px;
907
+ --tw-ring-offset-color: #fff;
908
+ --tw-ring-color: rgb(59 130 246 / 0.5);
909
+ --tw-ring-offset-shadow: 0 0 #0000;
910
+ --tw-ring-shadow: 0 0 #0000;
911
+ --tw-shadow: 0 0 #0000;
912
+ --tw-shadow-colored: 0 0 #0000;
913
+ --tw-blur: ;
914
+ --tw-brightness: ;
915
+ --tw-contrast: ;
916
+ --tw-grayscale: ;
917
+ --tw-hue-rotate: ;
918
+ --tw-invert: ;
919
+ --tw-saturate: ;
920
+ --tw-sepia: ;
921
+ --tw-drop-shadow: ;
922
+ --tw-backdrop-blur: ;
923
+ --tw-backdrop-brightness: ;
924
+ --tw-backdrop-contrast: ;
925
+ --tw-backdrop-grayscale: ;
926
+ --tw-backdrop-hue-rotate: ;
927
+ --tw-backdrop-invert: ;
928
+ --tw-backdrop-opacity: ;
929
+ --tw-backdrop-saturate: ;
930
+ --tw-backdrop-sepia: ;
931
+ }
932
+
933
+ .sr-only {
934
+ position: absolute;
935
+ width: 1px;
936
+ height: 1px;
937
+ padding: 0;
938
+ margin: -1px;
939
+ overflow: hidden;
940
+ clip: rect(0, 0, 0, 0);
941
+ white-space: nowrap;
942
+ border-width: 0;
943
+ }
944
+
945
+ .collapse {
946
+ visibility: collapse;
947
+ }
948
+
949
+ .absolute {
950
+ position: absolute;
951
+ }
952
+
953
+ .relative {
954
+ position: relative;
955
+ }
956
+
957
+ .inset-0 {
958
+ inset: 0px;
959
+ }
960
+
961
+ .end-0 {
962
+ inset-inline-end: 0px;
963
+ }
964
+
965
+ .top-0 {
966
+ top: 0px;
967
+ }
968
+
969
+ .z-10 {
970
+ z-index: 10;
971
+ }
972
+
973
+ .z-20 {
974
+ z-index: 20;
975
+ }
976
+
977
+ .mx-10 {
978
+ margin-left: 2.5rem;
979
+ margin-right: 2.5rem;
980
+ }
981
+
982
+ .mx-auto {
983
+ margin-left: auto;
984
+ margin-right: auto;
985
+ }
986
+
987
+ .my-2 {
988
+ margin-top: 0.5rem;
989
+ margin-bottom: 0.5rem;
990
+ }
991
+
992
+ .my-8 {
993
+ margin-top: 2rem;
994
+ margin-bottom: 2rem;
995
+ }
996
+
997
+ .mb-10 {
998
+ margin-bottom: 2.5rem;
999
+ }
1000
+
1001
+ .mb-2 {
1002
+ margin-bottom: 0.5rem;
1003
+ }
1004
+
1005
+ .ms-2 {
1006
+ margin-inline-start: 0.5rem;
1007
+ }
1008
+
1009
+ .ms-2\.5 {
1010
+ margin-inline-start: 0.625rem;
1011
+ }
1012
+
1013
+ .ms-3 {
1014
+ margin-inline-start: 0.75rem;
1015
+ }
1016
+
1017
+ .mt-1 {
1018
+ margin-top: 0.25rem;
1019
+ }
1020
+
1021
+ .mt-6 {
1022
+ margin-top: 1.5rem;
1023
+ }
1024
+
1025
+ .block {
1026
+ display: block;
1027
+ }
1028
+
1029
+ .inline-block {
1030
+ display: inline-block;
1031
+ }
1032
+
1033
+ .inline {
1034
+ display: inline;
1035
+ }
1036
+
1037
+ .flex {
1038
+ display: flex;
1039
+ }
1040
+
1041
+ .inline-flex {
1042
+ display: inline-flex;
1043
+ }
1044
+
1045
+ .hidden {
1046
+ display: none;
1047
+ }
1048
+
1049
+ .h-10 {
1050
+ height: 2.5rem;
1051
+ }
1052
+
1053
+ .h-2 {
1054
+ height: 0.5rem;
1055
+ }
1056
+
1057
+ .h-2\.5 {
1058
+ height: 0.625rem;
1059
+ }
1060
+
1061
+ .h-3 {
1062
+ height: 0.75rem;
1063
+ }
1064
+
1065
+ .h-4 {
1066
+ height: 1rem;
1067
+ }
1068
+
1069
+ .h-6 {
1070
+ height: 1.5rem;
1071
+ }
1072
+
1073
+ .h-full {
1074
+ height: 100%;
1075
+ }
1076
+
1077
+ .min-h-screen {
1078
+ min-height: 100vh;
1079
+ }
1080
+
1081
+ .w-1\/3 {
1082
+ width: 33.333333%;
1083
+ }
1084
+
1085
+ .w-10 {
1086
+ width: 2.5rem;
1087
+ }
1088
+
1089
+ .w-2 {
1090
+ width: 0.5rem;
1091
+ }
1092
+
1093
+ .w-2\.5 {
1094
+ width: 0.625rem;
1095
+ }
1096
+
1097
+ .w-3 {
1098
+ width: 0.75rem;
1099
+ }
1100
+
1101
+ .w-4 {
1102
+ width: 1rem;
1103
+ }
1104
+
1105
+ .w-44 {
1106
+ width: 11rem;
1107
+ }
1108
+
1109
+ .w-6 {
1110
+ width: 1.5rem;
1111
+ }
1112
+
1113
+ .w-full {
1114
+ width: 100%;
1115
+ }
1116
+
1117
+ .max-w-lg {
1118
+ max-width: 32rem;
1119
+ }
1120
+
1121
+ .flex-shrink-0 {
1122
+ flex-shrink: 0;
1123
+ }
1124
+
1125
+ .shrink-0 {
1126
+ flex-shrink: 0;
1127
+ }
1128
+
1129
+ .-rotate-90 {
1130
+ --tw-rotate: -90deg;
1131
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
1132
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
1133
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1134
+ }
1135
+
1136
+ .rotate-180 {
1137
+ --tw-rotate: 180deg;
1138
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
1139
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
1140
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1141
+ }
1142
+
1143
+ .cursor-pointer {
1144
+ cursor: pointer;
1145
+ }
1146
+
1147
+ .flex-col {
1148
+ flex-direction: column;
1149
+ }
1150
+
1151
+ .items-center {
1152
+ align-items: center;
1153
+ }
1154
+
1155
+ .justify-center {
1156
+ justify-content: center;
1157
+ }
1158
+
1159
+ .justify-between {
1160
+ justify-content: space-between;
1161
+ }
1162
+
1163
+ .gap-3 {
1164
+ gap: 0.75rem;
1165
+ }
1166
+
1167
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
1168
+ --tw-space-x-reverse: 0;
1169
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
1170
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
1171
+ }
1172
+
1173
+ .divide-y > :not([hidden]) ~ :not([hidden]) {
1174
+ --tw-divide-y-reverse: 0;
1175
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
1176
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
1177
+ }
1178
+
1179
+ .divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
1180
+ --tw-divide-opacity: 1;
1181
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
1182
+ }
1183
+
1184
+ .overflow-hidden {
1185
+ overflow: hidden;
1186
+ }
1187
+
1188
+ .whitespace-nowrap {
1189
+ white-space: nowrap;
1190
+ }
1191
+
1192
+ .rounded-full {
1193
+ border-radius: 9999px;
1194
+ }
1195
+
1196
+ .rounded-lg {
1197
+ border-radius: 0.5rem;
1198
+ }
1199
+
1200
+ .rounded-e-lg {
1201
+ border-start-end-radius: 0.5rem;
1202
+ border-end-end-radius: 0.5rem;
1203
+ }
1204
+
1205
+ .rounded-s-lg {
1206
+ border-start-start-radius: 0.5rem;
1207
+ border-end-start-radius: 0.5rem;
1208
+ }
1209
+
1210
+ .rounded-t-xl {
1211
+ border-top-left-radius: 0.75rem;
1212
+ border-top-right-radius: 0.75rem;
1213
+ }
1214
+
1215
+ .border {
1216
+ border-width: 1px;
1217
+ }
1218
+
1219
+ .border-b-0 {
1220
+ border-bottom-width: 0px;
1221
+ }
1222
+
1223
+ .border-s-2 {
1224
+ border-inline-start-width: 2px;
1225
+ }
1226
+
1227
+ .border-t-0 {
1228
+ border-top-width: 0px;
1229
+ }
1230
+
1231
+ .border-blue-700 {
1232
+ --tw-border-opacity: 1;
1233
+ border-color: rgb(29 78 216 / var(--tw-border-opacity));
1234
+ }
1235
+
1236
+ .border-gray-200 {
1237
+ --tw-border-opacity: 1;
1238
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
1239
+ }
1240
+
1241
+ .border-gray-300 {
1242
+ --tw-border-opacity: 1;
1243
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
1244
+ }
1245
+
1246
+ .border-s-gray-50 {
1247
+ --tw-border-opacity: 1;
1248
+ border-inline-start-color: rgb(249 250 251 / var(--tw-border-opacity));
1249
+ }
1250
+
1251
+ .bg-blue-200 {
1252
+ --tw-bg-opacity: 1;
1253
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
1254
+ }
1255
+
1256
+ .bg-blue-700 {
1257
+ --tw-bg-opacity: 1;
1258
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1259
+ }
1260
+
1261
+ .bg-gray-100 {
1262
+ --tw-bg-opacity: 1;
1263
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1264
+ }
1265
+
1266
+ .bg-gray-50 {
1267
+ --tw-bg-opacity: 1;
1268
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
1269
+ }
1270
+
1271
+ .bg-green-100 {
1272
+ --tw-bg-opacity: 1;
1273
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
1274
+ }
1275
+
1276
+ .bg-green-200 {
1277
+ --tw-bg-opacity: 1;
1278
+ background-color: rgb(187 247 208 / var(--tw-bg-opacity));
1279
+ }
1280
+
1281
+ .bg-orange-200 {
1282
+ --tw-bg-opacity: 1;
1283
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
1284
+ }
1285
+
1286
+ .bg-violet-100 {
1287
+ --tw-bg-opacity: 1;
1288
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
1289
+ }
1290
+
1291
+ .bg-white {
1292
+ --tw-bg-opacity: 1;
1293
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1294
+ }
1295
+
1296
+ .bg-yellow-100 {
1297
+ --tw-bg-opacity: 1;
1298
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
1299
+ }
1300
+
1301
+ .bg-\[url\(\/img\/grid\.svg\)\] {
1302
+ background-image: url(/img/grid.svg);
1303
+ }
1304
+
1305
+ .bg-center {
1306
+ background-position: center;
1307
+ }
1308
+
1309
+ .p-0 {
1310
+ padding: 0px;
1311
+ }
1312
+
1313
+ .p-0\.5 {
1314
+ padding: 0.125rem;
1315
+ }
1316
+
1317
+ .p-1 {
1318
+ padding: 0.25rem;
1319
+ }
1320
+
1321
+ .p-2 {
1322
+ padding: 0.5rem;
1323
+ }
1324
+
1325
+ .p-2\.5 {
1326
+ padding: 0.625rem;
1327
+ }
1328
+
1329
+ .p-5 {
1330
+ padding: 1.25rem;
1331
+ }
1332
+
1333
+ .px-2 {
1334
+ padding-left: 0.5rem;
1335
+ padding-right: 0.5rem;
1336
+ }
1337
+
1338
+ .px-4 {
1339
+ padding-left: 1rem;
1340
+ padding-right: 1rem;
1341
+ }
1342
+
1343
+ .px-5 {
1344
+ padding-left: 1.25rem;
1345
+ padding-right: 1.25rem;
1346
+ }
1347
+
1348
+ .px-6 {
1349
+ padding-left: 1.5rem;
1350
+ padding-right: 1.5rem;
1351
+ }
1352
+
1353
+ .py-2 {
1354
+ padding-top: 0.5rem;
1355
+ padding-bottom: 0.5rem;
1356
+ }
1357
+
1358
+ .py-2\.5 {
1359
+ padding-top: 0.625rem;
1360
+ padding-bottom: 0.625rem;
1361
+ }
1362
+
1363
+ .py-6 {
1364
+ padding-top: 1.5rem;
1365
+ padding-bottom: 1.5rem;
1366
+ }
1367
+
1368
+ .pb-2 {
1369
+ padding-bottom: 0.5rem;
1370
+ }
1371
+
1372
+ .pb-8 {
1373
+ padding-bottom: 2rem;
1374
+ }
1375
+
1376
+ .pt-10 {
1377
+ padding-top: 2.5rem;
1378
+ }
1379
+
1380
+ .text-center {
1381
+ text-align: center;
1382
+ }
1383
+
1384
+ .text-sm {
1385
+ font-size: 0.875rem;
1386
+ line-height: 1.25rem;
1387
+ }
1388
+
1389
+ .text-xs {
1390
+ font-size: 0.75rem;
1391
+ line-height: 1rem;
1392
+ }
1393
+
1394
+ .font-bold {
1395
+ font-weight: 700;
1396
+ }
1397
+
1398
+ .font-medium {
1399
+ font-weight: 500;
1400
+ }
1401
+
1402
+ .font-semibold {
1403
+ font-weight: 600;
1404
+ }
1405
+
1406
+ .text-blue-800 {
1407
+ --tw-text-opacity: 1;
1408
+ color: rgb(30 64 175);
1409
+ }
1410
+
1411
+ .text-gray-400 {
1412
+ --tw-text-opacity: 1;
1413
+ color: rgb(156 163 175);
1414
+ }
1415
+
1416
+ .text-gray-500 {
1417
+ --tw-text-opacity: 1;
1418
+ color: rgb(107 114 128);
1419
+ }
1420
+
1421
+ .text-gray-600 {
1422
+ --tw-text-opacity: 1;
1423
+ color: rgb(75 85 99);
1424
+ }
1425
+
1426
+ .text-gray-700 {
1427
+ --tw-text-opacity: 1;
1428
+ color: rgb(55 65 81);
1429
+ }
1430
+
1431
+ .text-gray-900 {
1432
+ --tw-text-opacity: 1;
1433
+ color: rgb(17 24 39);
1434
+ }
1435
+
1436
+ .text-white {
1437
+ --tw-text-opacity: 1;
1438
+ color: rgb(255 255 255);
1439
+ }
1440
+
1441
+ .shadow {
1442
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1443
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
1444
+ 0 1px 2px -1px var(--tw-shadow-color);
1445
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1446
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1447
+ }
1448
+
1449
+ .shadow-xl {
1450
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
1451
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
1452
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),
1453
+ 0 8px 10px -6px var(--tw-shadow-color);
1454
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1455
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1456
+ }
1457
+
1458
+ .ring-1 {
1459
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1460
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1461
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1462
+ calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1463
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1464
+ var(--tw-shadow, 0 0 #0000);
1465
+ }
1466
+
1467
+ .ring-gray-900\/5 {
1468
+ --tw-ring-color: rgb(17 24 39 / 0.05);
1469
+ }
1470
+
1471
+ .sequence_container {
1472
+ overflow-wrap: anywhere;
1473
+ counter-reset: sequence;
1474
+ }
1475
+
1476
+ .sequence_container .sequence__chunk {
1477
+ display: inline-block;
1478
+ margin: 0.1rem 0 1rem 1rem;
1479
+ /* width: 10ch; */
1480
+ position: relative;
1481
+ white-space: nowrap;
1482
+ }
1483
+
1484
+ .sequence_container .sequence__chunk:not(:last-child):before,
1485
+ .sequence_container .sequence__chunk--display-last:before {
1486
+ content: counter(sequence);
1487
+ counter-increment: sequence 10;
1488
+ position: absolute;
1489
+ top: -0.8em;
1490
+ right: 0;
1491
+ opacity: 0.5;
1492
+ font-weight: bold;
1493
+ }
1494
+
1495
+ .sequence-container .sequence__chunk::after {
1496
+ content: "";
1497
+ position: absolute;
1498
+ bottom: 0;
1499
+ left: 0;
1500
+ right: 0;
1501
+ transform-origin: left;
1502
+ transform: scaleX(0.1);
1503
+ box-shadow: var(--box-shadow);
1504
+ }
1505
+
1506
+ .sequence__chunk span {
1507
+ padding: 0 0.05rem;
1508
+ }
1509
+
1510
+ .hover\:bg-blue-800:hover {
1511
+ --tw-bg-opacity: 1;
1512
+ background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1513
+ }
1514
+
1515
+ .hover\:bg-gray-100:hover {
1516
+ --tw-bg-opacity: 1;
1517
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1518
+ }
1519
+
1520
+ .hover\:bg-gray-200:hover {
1521
+ --tw-bg-opacity: 1;
1522
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1523
+ }
1524
+
1525
+ .hover\:font-bold:hover {
1526
+ font-weight: 700;
1527
+ }
1528
+
1529
+ .focus\:border-blue-500:focus {
1530
+ --tw-border-opacity: 1;
1531
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1532
+ }
1533
+
1534
+ .focus\:outline-none:focus {
1535
+ outline: 2px solid transparent;
1536
+ outline-offset: 2px;
1537
+ }
1538
+
1539
+ .focus\:ring-4:focus {
1540
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1541
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1542
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1543
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1544
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1545
+ var(--tw-shadow, 0 0 #0000);
1546
+ }
1547
+
1548
+ .focus\:ring-blue-300:focus {
1549
+ --tw-ring-opacity: 1;
1550
+ --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1551
+ }
1552
+
1553
+ .focus\:ring-blue-500:focus {
1554
+ --tw-ring-opacity: 1;
1555
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1556
+ }
1557
+
1558
+ .focus\:ring-gray-100:focus {
1559
+ --tw-ring-opacity: 1;
1560
+ --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity));
1561
+ }
1562
+
1563
+ .focus\:ring-gray-200:focus {
1564
+ --tw-ring-opacity: 1;
1565
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1566
+ }
1567
+
1568
+ @media (min-width: 640px) {
1569
+ .sm\:mx-auto {
1570
+ margin-left: auto;
1571
+ margin-right: auto;
1572
+ }
1573
+
1574
+ .sm\:rounded-lg {
1575
+ border-radius: 0.5rem;
1576
+ }
1577
+
1578
+ .sm\:px-10 {
1579
+ padding-left: 2.5rem;
1580
+ padding-right: 2.5rem;
1581
+ }
1582
+
1583
+ .sm\:py-12 {
1584
+ padding-top: 3rem;
1585
+ padding-bottom: 3rem;
1586
+ }
1587
+ }
1588
+
1589
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1590
+ text-align: right;
1591
+ }
1592
+
1593
+ @media (prefers-color-scheme: dark) {
1594
+ .dark\:border-gray-600 {
1595
+ --tw-border-opacity: 1;
1596
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1597
+ }
1598
+
1599
+ .dark\:border-gray-700 {
1600
+ --tw-border-opacity: 1;
1601
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1602
+ }
1603
+
1604
+ .dark\:border-s-gray-700 {
1605
+ --tw-border-opacity: 1;
1606
+ border-inline-start-color: rgb(55 65 81 / var(--tw-border-opacity));
1607
+ }
1608
+
1609
+ .dark\:bg-blue-600 {
1610
+ --tw-bg-opacity: 1;
1611
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1612
+ }
1613
+
1614
+ .dark\:bg-gray-600 {
1615
+ --tw-bg-opacity: 1;
1616
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1617
+ }
1618
+
1619
+ .dark\:bg-gray-700 {
1620
+ --tw-bg-opacity: 1;
1621
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1622
+ }
1623
+
1624
+ .dark\:bg-gray-900 {
1625
+ --tw-bg-opacity: 1;
1626
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1627
+ }
1628
+
1629
+ .dark\:text-gray-200 {
1630
+ --tw-text-opacity: 1;
1631
+ color: rgb(229 231 235);
1632
+ }
1633
+
1634
+ .dark\:text-gray-300 {
1635
+ --tw-text-opacity: 1;
1636
+ color: rgb(209 213 219);
1637
+ }
1638
+
1639
+ .dark\:text-gray-400 {
1640
+ --tw-text-opacity: 1;
1641
+ color: rgb(156 163 175);
1642
+ }
1643
+
1644
+ .dark\:text-white {
1645
+ --tw-text-opacity: 1;
1646
+ color: rgb(255 255 255);
1647
+ }
1648
+
1649
+ .dark\:placeholder-gray-400::placeholder {
1650
+ --tw-placeholder-opacity: 1;
1651
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1652
+ }
1653
+
1654
+ .dark\:hover\:bg-blue-700:hover {
1655
+ --tw-bg-opacity: 1;
1656
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1657
+ }
1658
+
1659
+ .dark\:hover\:bg-gray-600:hover {
1660
+ --tw-bg-opacity: 1;
1661
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1662
+ }
1663
+
1664
+ .dark\:hover\:bg-gray-800:hover {
1665
+ --tw-bg-opacity: 1;
1666
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1667
+ }
1668
+
1669
+ .dark\:hover\:text-white:hover {
1670
+ --tw-text-opacity: 1;
1671
+ color: rgb(255 255 255);
1672
+ }
1673
+
1674
+ .dark\:focus\:border-blue-500:focus {
1675
+ --tw-border-opacity: 1;
1676
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1677
+ }
1678
+
1679
+ .dark\:focus\:ring-blue-500:focus {
1680
+ --tw-ring-opacity: 1;
1681
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1682
+ }
1683
+
1684
+ .dark\:focus\:ring-blue-800:focus {
1685
+ --tw-ring-opacity: 1;
1686
+ --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1687
+ }
1688
+
1689
+ .dark\:focus\:ring-gray-700:focus {
1690
+ --tw-ring-opacity: 1;
1691
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
1692
+ }
1693
+
1694
+ .dark\:focus\:ring-gray-800:focus {
1695
+ --tw-ring-opacity: 1;
1696
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1697
+ }
1698
+ }
1699
+ </style>
src/frontend/shared/Textbox.svelte ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import {
3
+ beforeUpdate,
4
+ afterUpdate,
5
+ createEventDispatcher,
6
+ tick
7
+ } from "svelte";
8
+ import { BlockTitle } from "@gradio/atoms";
9
+ import { Copy, Check } from "@gradio/icons";
10
+ import { fade } from "svelte/transition";
11
+ import type { SelectData } from "@gradio/utils";
12
+
13
+ export let value = "";
14
+ export let value_is_output = false;
15
+ export let lines = 1;
16
+ export let placeholder = "Type here...";
17
+ export let label: string;
18
+ export let info: string | undefined = undefined;
19
+ export let disabled = false;
20
+ export let show_label = true;
21
+ export let container = true;
22
+ export let max_lines: number;
23
+ export let type: "text" | "password" | "email" = "text";
24
+ export let show_copy_button = false;
25
+ export let rtl = false;
26
+ export let autofocus = false;
27
+ export let text_align: "left" | "right" | undefined = undefined;
28
+ export let autoscroll = true;
29
+
30
+ let el: HTMLTextAreaElement | HTMLInputElement;
31
+ let copied = false;
32
+ let timer: NodeJS.Timeout;
33
+ let can_scroll: boolean;
34
+ let previous_scroll_top = 0;
35
+ let user_has_scrolled_up = false;
36
+
37
+ $: value, el && lines !== max_lines && resize({ target: el });
38
+
39
+ $: if (value === null) value = "";
40
+
41
+ const dispatch = createEventDispatcher<{
42
+ change: string;
43
+ submit: undefined;
44
+ blur: undefined;
45
+ select: SelectData;
46
+ input: undefined;
47
+ focus: undefined;
48
+ }>();
49
+
50
+ beforeUpdate(() => {
51
+ can_scroll = el && el.offsetHeight + el.scrollTop > el.scrollHeight - 100;
52
+ });
53
+
54
+ const scroll = (): void => {
55
+ if (can_scroll && autoscroll && !user_has_scrolled_up) {
56
+ el.scrollTo(0, el.scrollHeight);
57
+ }
58
+ };
59
+
60
+ function handle_change(): void {
61
+ dispatch("change", value);
62
+ if (!value_is_output) {
63
+ dispatch("input");
64
+ }
65
+ }
66
+ afterUpdate(() => {
67
+ if (autofocus) {
68
+ el.focus();
69
+ }
70
+ if (can_scroll && autoscroll) {
71
+ scroll();
72
+ }
73
+ value_is_output = false;
74
+ });
75
+ $: value, handle_change();
76
+
77
+ async function handle_copy(): Promise<void> {
78
+ if ("clipboard" in navigator) {
79
+ await navigator.clipboard.writeText(value);
80
+ copy_feedback();
81
+ }
82
+ }
83
+
84
+ function copy_feedback(): void {
85
+ copied = true;
86
+ if (timer) clearTimeout(timer);
87
+ timer = setTimeout(() => {
88
+ copied = false;
89
+ }, 1000);
90
+ }
91
+
92
+ function handle_select(event: Event): void {
93
+ const target: HTMLTextAreaElement | HTMLInputElement = event.target as
94
+ | HTMLTextAreaElement
95
+ | HTMLInputElement;
96
+ const text = target.value;
97
+ const index: [number, number] = [
98
+ target.selectionStart as number,
99
+ target.selectionEnd as number
100
+ ];
101
+ dispatch("select", { value: text.substring(...index), index: index });
102
+ }
103
+
104
+ async function handle_keypress(e: KeyboardEvent): Promise<void> {
105
+ await tick();
106
+ if (e.key === "Enter" && e.shiftKey && lines > 1) {
107
+ e.preventDefault();
108
+ dispatch("submit");
109
+ } else if (
110
+ e.key === "Enter" &&
111
+ !e.shiftKey &&
112
+ lines === 1 &&
113
+ max_lines >= 1
114
+ ) {
115
+ e.preventDefault();
116
+ dispatch("submit");
117
+ }
118
+ }
119
+
120
+ function handle_scroll(event: Event): void {
121
+ const target = event.target as HTMLElement;
122
+ const current_scroll_top = target.scrollTop;
123
+ if (current_scroll_top < previous_scroll_top) {
124
+ user_has_scrolled_up = true;
125
+ }
126
+ previous_scroll_top = current_scroll_top;
127
+
128
+ const max_scroll_top = target.scrollHeight - target.clientHeight;
129
+ const user_has_scrolled_to_bottom = current_scroll_top >= max_scroll_top;
130
+ if (user_has_scrolled_to_bottom) {
131
+ user_has_scrolled_up = false;
132
+ }
133
+ }
134
+
135
+ async function resize(
136
+ event: Event | { target: HTMLTextAreaElement | HTMLInputElement }
137
+ ): Promise<void> {
138
+ await tick();
139
+ if (lines === max_lines) return;
140
+
141
+ let max =
142
+ max_lines === undefined
143
+ ? false
144
+ : max_lines === undefined // default
145
+ ? 21 * 11
146
+ : 21 * (max_lines + 1);
147
+ let min = 21 * (lines + 1);
148
+
149
+ const target = event.target as HTMLTextAreaElement;
150
+ target.style.height = "1px";
151
+
152
+ let scroll_height;
153
+ if (max && target.scrollHeight > max) {
154
+ scroll_height = max;
155
+ } else if (target.scrollHeight < min) {
156
+ scroll_height = min;
157
+ } else {
158
+ scroll_height = target.scrollHeight;
159
+ }
160
+
161
+ target.style.height = `${scroll_height}px`;
162
+ }
163
+
164
+ function text_area_resize(
165
+ _el: HTMLTextAreaElement,
166
+ _value: string
167
+ ): any | undefined {
168
+ if (lines === max_lines) return;
169
+ _el.style.overflowY = "scroll";
170
+ _el.addEventListener("input", resize);
171
+
172
+ if (!_value.trim()) return;
173
+ resize({ target: _el });
174
+
175
+ return {
176
+ destroy: () => _el.removeEventListener("input", resize)
177
+ };
178
+ }
179
+ </script>
180
+
181
+ <!-- svelte-ignore a11y-autofocus -->
182
+ <label class:container>
183
+ <BlockTitle {show_label} {info}>{label}</BlockTitle>
184
+
185
+ {#if lines === 1 && max_lines === 1}
186
+ {#if type === "text"}
187
+ <input
188
+ data-testid="textbox"
189
+ type="text"
190
+ class="scroll-hide"
191
+ dir={rtl ? "rtl" : "ltr"}
192
+ bind:value
193
+ bind:this={el}
194
+ {placeholder}
195
+ {disabled}
196
+ {autofocus}
197
+ on:keypress={handle_keypress}
198
+ on:blur
199
+ on:select={handle_select}
200
+ on:focus
201
+ style={text_align ? "text-align: " + text_align : ""}
202
+ />
203
+ {:else if type === "password"}
204
+ <input
205
+ data-testid="password"
206
+ type="password"
207
+ class="scroll-hide"
208
+ bind:value
209
+ bind:this={el}
210
+ {placeholder}
211
+ {disabled}
212
+ {autofocus}
213
+ on:keypress={handle_keypress}
214
+ on:blur
215
+ on:select={handle_select}
216
+ on:focus
217
+ autocomplete=""
218
+ />
219
+ {:else if type === "email"}
220
+ <input
221
+ data-testid="textbox"
222
+ type="email"
223
+ class="scroll-hide"
224
+ bind:value
225
+ bind:this={el}
226
+ {placeholder}
227
+ {disabled}
228
+ {autofocus}
229
+ on:keypress={handle_keypress}
230
+ on:blur
231
+ on:select={handle_select}
232
+ on:focus
233
+ autocomplete="email"
234
+ />
235
+ {/if}
236
+ {:else}
237
+ {#if show_label && show_copy_button}
238
+ {#if copied}
239
+ <button
240
+ in:fade={{ duration: 300 }}
241
+ aria-label="Copied"
242
+ aria-roledescription="Text copied"><Check /></button
243
+ >
244
+ {:else}
245
+ <button
246
+ on:click={handle_copy}
247
+ aria-label="Copy"
248
+ aria-roledescription="Copy text"><Copy /></button
249
+ >
250
+ {/if}
251
+ {/if}
252
+ <textarea
253
+ data-testid="textbox"
254
+ use:text_area_resize={value}
255
+ class="scroll-hide"
256
+ dir={rtl ? "rtl" : "ltr"}
257
+ bind:value
258
+ bind:this={el}
259
+ {placeholder}
260
+ rows={lines}
261
+ {disabled}
262
+ {autofocus}
263
+ on:keypress={handle_keypress}
264
+ on:blur
265
+ on:select={handle_select}
266
+ on:focus
267
+ on:scroll={handle_scroll}
268
+ style={text_align ? "text-align: " + text_align : ""}
269
+ />
270
+ {/if}
271
+ </label>
272
+
273
+ <style>
274
+ label {
275
+ display: block;
276
+ width: 100%;
277
+ }
278
+
279
+ input,
280
+ textarea {
281
+ display: block;
282
+ position: relative;
283
+ outline: none !important;
284
+ box-shadow: var(--input-shadow);
285
+ background: var(--input-background-fill);
286
+ padding: var(--input-padding);
287
+ width: 100%;
288
+ color: var(--body-text-color);
289
+ font-weight: var(--input-text-weight);
290
+ font-size: var(--input-text-size);
291
+ line-height: var(--line-sm);
292
+ border: none;
293
+ }
294
+ label:not(.container),
295
+ label:not(.container) > input,
296
+ label:not(.container) > textarea {
297
+ height: 100%;
298
+ }
299
+ .container > input,
300
+ .container > textarea {
301
+ border: var(--input-border-width) solid var(--input-border-color);
302
+ border-radius: var(--input-radius);
303
+ }
304
+ input:disabled,
305
+ textarea:disabled {
306
+ -webkit-text-fill-color: var(--body-text-color);
307
+ -webkit-opacity: 1;
308
+ opacity: 1;
309
+ }
310
+
311
+ input:focus,
312
+ textarea:focus {
313
+ box-shadow: var(--input-shadow-focus);
314
+ border-color: var(--input-border-color-focus);
315
+ }
316
+
317
+ input::placeholder,
318
+ textarea::placeholder {
319
+ color: var(--input-placeholder-color);
320
+ }
321
+ button {
322
+ display: flex;
323
+ position: absolute;
324
+ top: var(--block-label-margin);
325
+ right: var(--block-label-margin);
326
+ align-items: center;
327
+ box-shadow: var(--shadow-drop);
328
+ border: 1px solid var(--color-border-primary);
329
+ border-top: none;
330
+ border-right: none;
331
+ border-radius: var(--block-label-right-radius);
332
+ background: var(--block-label-background-fill);
333
+ padding: 5px;
334
+ width: 22px;
335
+ height: 22px;
336
+ overflow: hidden;
337
+ color: var(--block-label-color);
338
+ font: var(--font-sans);
339
+ font-size: var(--button-small-text-size);
340
+ }
341
+ </style>
src/frontend/shared/style.css ADDED
@@ -0,0 +1,1302 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
3
+ */
4
+
5
+ /*
6
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
7
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
8
+ */
9
+
10
+ *,
11
+ ::before,
12
+ ::after {
13
+ box-sizing: border-box;
14
+ /* 1 */
15
+ border-width: 0;
16
+ /* 2 */
17
+ border-style: solid;
18
+ /* 2 */
19
+ border-color: #e5e7eb;
20
+ /* 2 */
21
+ }
22
+
23
+ ::before,
24
+ ::after {
25
+ --tw-content: "";
26
+ }
27
+
28
+ /*
29
+ 1. Use a consistent sensible line-height in all browsers.
30
+ 2. Prevent adjustments of font size after orientation changes in iOS.
31
+ 3. Use a more readable tab size.
32
+ 4. Use the user's configured `sans` font-family by default.
33
+ 5. Use the user's configured `sans` font-feature-settings by default.
34
+ 6. Use the user's configured `sans` font-variation-settings by default.
35
+ 7. Disable tap highlights on iOS
36
+ */
37
+
38
+ html,
39
+ :host {
40
+ line-height: 1.5;
41
+ /* 1 */
42
+ -webkit-text-size-adjust: 100%;
43
+ /* 2 */
44
+ -moz-tab-size: 4;
45
+ /* 3 */
46
+ tab-size: 4;
47
+ /* 3 */
48
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
49
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
50
+ /* 4 */
51
+ font-feature-settings: normal;
52
+ /* 5 */
53
+ font-variation-settings: normal;
54
+ /* 6 */
55
+ -webkit-tap-highlight-color: transparent;
56
+ /* 7 */
57
+ }
58
+
59
+ /*
60
+ 1. Remove the margin in all browsers.
61
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
62
+ */
63
+
64
+ body {
65
+ margin: 0;
66
+ /* 1 */
67
+ line-height: inherit;
68
+ /* 2 */
69
+ }
70
+
71
+ /*
72
+ 1. Add the correct height in Firefox.
73
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
74
+ 3. Ensure horizontal rules are visible by default.
75
+ */
76
+
77
+ hr {
78
+ height: 0;
79
+ /* 1 */
80
+ color: inherit;
81
+ /* 2 */
82
+ border-top-width: 1px;
83
+ /* 3 */
84
+ }
85
+
86
+ /*
87
+ Add the correct text decoration in Chrome, Edge, and Safari.
88
+ */
89
+
90
+ abbr:where([title]) {
91
+ text-decoration: underline dotted;
92
+ }
93
+
94
+ /*
95
+ Remove the default font size and weight for headings.
96
+ */
97
+
98
+ h1,
99
+ h2,
100
+ h3,
101
+ h4,
102
+ h5,
103
+ h6 {
104
+ font-size: inherit;
105
+ font-weight: inherit;
106
+ }
107
+
108
+ /*
109
+ Reset links to optimize for opt-in styling instead of opt-out.
110
+ */
111
+
112
+ a {
113
+ color: inherit;
114
+ text-decoration: inherit;
115
+ }
116
+
117
+ /*
118
+ Add the correct font weight in Edge and Safari.
119
+ */
120
+
121
+ b,
122
+ strong {
123
+ font-weight: bolder;
124
+ }
125
+
126
+ /*
127
+ 1. Use the user's configured `mono` font-family by default.
128
+ 2. Use the user's configured `mono` font-feature-settings by default.
129
+ 3. Use the user's configured `mono` font-variation-settings by default.
130
+ 4. Correct the odd `em` font sizing in all browsers.
131
+ */
132
+
133
+ code,
134
+ kbd,
135
+ samp,
136
+ pre {
137
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
138
+ "Liberation Mono", "Courier New", monospace;
139
+ /* 1 */
140
+ font-feature-settings: normal;
141
+ /* 2 */
142
+ font-variation-settings: normal;
143
+ /* 3 */
144
+ font-size: 1em;
145
+ /* 4 */
146
+ }
147
+
148
+ /*
149
+ Add the correct font size in all browsers.
150
+ */
151
+
152
+ small {
153
+ font-size: 80%;
154
+ }
155
+
156
+ /*
157
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
158
+ */
159
+
160
+ sub,
161
+ sup {
162
+ font-size: 75%;
163
+ line-height: 0;
164
+ position: relative;
165
+ vertical-align: baseline;
166
+ }
167
+
168
+ sub {
169
+ bottom: -0.25em;
170
+ }
171
+
172
+ sup {
173
+ top: -0.5em;
174
+ }
175
+
176
+ /*
177
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
178
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
179
+ 3. Remove gaps between table borders by default.
180
+ */
181
+
182
+ table {
183
+ text-indent: 0;
184
+ /* 1 */
185
+ border-color: inherit;
186
+ /* 2 */
187
+ border-collapse: collapse;
188
+ /* 3 */
189
+ }
190
+
191
+ /*
192
+ 1. Change the font styles in all browsers.
193
+ 2. Remove the margin in Firefox and Safari.
194
+ 3. Remove default padding in all browsers.
195
+ */
196
+
197
+ button,
198
+ input,
199
+ optgroup,
200
+ select,
201
+ textarea {
202
+ font-family: inherit;
203
+ /* 1 */
204
+ font-feature-settings: inherit;
205
+ /* 1 */
206
+ font-variation-settings: inherit;
207
+ /* 1 */
208
+ font-size: 100%;
209
+ /* 1 */
210
+ font-weight: inherit;
211
+ /* 1 */
212
+ line-height: inherit;
213
+ /* 1 */
214
+ color: inherit;
215
+ /* 1 */
216
+ margin: 0;
217
+ /* 2 */
218
+ padding: 0;
219
+ /* 3 */
220
+ }
221
+
222
+ /*
223
+ Remove the inheritance of text transform in Edge and Firefox.
224
+ */
225
+
226
+ button,
227
+ select {
228
+ text-transform: none;
229
+ }
230
+
231
+ /*
232
+ 1. Correct the inability to style clickable types in iOS and Safari.
233
+ 2. Remove default button styles.
234
+ */
235
+
236
+ button,
237
+ [type="button"],
238
+ [type="reset"],
239
+ [type="submit"] {
240
+ -webkit-appearance: button;
241
+ /* 1 */
242
+ background-color: transparent;
243
+ /* 2 */
244
+ background-image: none;
245
+ /* 2 */
246
+ }
247
+
248
+ /*
249
+ Use the modern Firefox focus style for all focusable elements.
250
+ */
251
+
252
+ :-moz-focusring {
253
+ outline: auto;
254
+ }
255
+
256
+ /*
257
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
258
+ */
259
+
260
+ :-moz-ui-invalid {
261
+ box-shadow: none;
262
+ }
263
+
264
+ /*
265
+ Add the correct vertical alignment in Chrome and Firefox.
266
+ */
267
+
268
+ progress {
269
+ vertical-align: baseline;
270
+ }
271
+
272
+ /*
273
+ Correct the cursor style of increment and decrement buttons in Safari.
274
+ */
275
+
276
+ ::-webkit-inner-spin-button,
277
+ ::-webkit-outer-spin-button {
278
+ height: auto;
279
+ }
280
+
281
+ /*
282
+ 1. Correct the odd appearance in Chrome and Safari.
283
+ 2. Correct the outline style in Safari.
284
+ */
285
+
286
+ [type="search"] {
287
+ -webkit-appearance: textfield;
288
+ /* 1 */
289
+ outline-offset: -2px;
290
+ /* 2 */
291
+ }
292
+
293
+ /*
294
+ Remove the inner padding in Chrome and Safari on macOS.
295
+ */
296
+
297
+ ::-webkit-search-decoration {
298
+ -webkit-appearance: none;
299
+ }
300
+
301
+ /*
302
+ 1. Correct the inability to style clickable types in iOS and Safari.
303
+ 2. Change font properties to `inherit` in Safari.
304
+ */
305
+
306
+ ::-webkit-file-upload-button {
307
+ -webkit-appearance: button;
308
+ /* 1 */
309
+ font: inherit;
310
+ /* 2 */
311
+ }
312
+
313
+ /*
314
+ Add the correct display in Chrome and Safari.
315
+ */
316
+
317
+ summary {
318
+ display: list-item;
319
+ }
320
+
321
+ /*
322
+ Removes the default spacing and border for appropriate elements.
323
+ */
324
+
325
+ blockquote,
326
+ dl,
327
+ dd,
328
+ h1,
329
+ h2,
330
+ h3,
331
+ h4,
332
+ h5,
333
+ h6,
334
+ hr,
335
+ figure,
336
+ p,
337
+ pre {
338
+ margin: 0;
339
+ }
340
+
341
+ fieldset {
342
+ margin: 0;
343
+ padding: 0;
344
+ }
345
+
346
+ legend {
347
+ padding: 0;
348
+ }
349
+
350
+ ol,
351
+ ul,
352
+ menu {
353
+ list-style: none;
354
+ margin: 0;
355
+ padding: 0;
356
+ }
357
+
358
+ /*
359
+ Reset default styling for dialogs.
360
+ */
361
+
362
+ dialog {
363
+ padding: 0;
364
+ }
365
+
366
+ /*
367
+ Prevent resizing textareas horizontally by default.
368
+ */
369
+
370
+ textarea {
371
+ resize: vertical;
372
+ }
373
+
374
+ /*
375
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
376
+ 2. Set the default placeholder color to the user's configured gray 400 color.
377
+ */
378
+
379
+ input::placeholder,
380
+ textarea::placeholder {
381
+ opacity: 1;
382
+ /* 1 */
383
+ color: #9ca3af;
384
+ /* 2 */
385
+ }
386
+
387
+ /*
388
+ Set the default cursor for buttons.
389
+ */
390
+
391
+ button,
392
+ [role="button"] {
393
+ cursor: pointer;
394
+ }
395
+
396
+ /*
397
+ Make sure disabled buttons don't get the pointer cursor.
398
+ */
399
+
400
+ :disabled {
401
+ cursor: default;
402
+ }
403
+
404
+ /*
405
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
406
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
407
+ This can trigger a poorly considered lint error in some tools but is included by design.
408
+ */
409
+
410
+ img,
411
+ svg,
412
+ video,
413
+ canvas,
414
+ audio,
415
+ iframe,
416
+ embed,
417
+ object {
418
+ display: block;
419
+ /* 1 */
420
+ vertical-align: middle;
421
+ /* 2 */
422
+ }
423
+
424
+ /*
425
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
426
+ */
427
+
428
+ img,
429
+ video {
430
+ max-width: 100%;
431
+ height: auto;
432
+ }
433
+
434
+ /* Make elements with the HTML hidden attribute stay hidden by default */
435
+
436
+ [hidden] {
437
+ display: none;
438
+ }
439
+
440
+ *,
441
+ ::before,
442
+ ::after {
443
+ --tw-border-spacing-x: 0;
444
+ --tw-border-spacing-y: 0;
445
+ --tw-translate-x: 0;
446
+ --tw-translate-y: 0;
447
+ --tw-rotate: 0;
448
+ --tw-skew-x: 0;
449
+ --tw-skew-y: 0;
450
+ --tw-scale-x: 1;
451
+ --tw-scale-y: 1;
452
+ --tw-pan-x: ;
453
+ --tw-pan-y: ;
454
+ --tw-pinch-zoom: ;
455
+ --tw-scroll-snap-strictness: proximity;
456
+ --tw-gradient-from-position: ;
457
+ --tw-gradient-via-position: ;
458
+ --tw-gradient-to-position: ;
459
+ --tw-ordinal: ;
460
+ --tw-slashed-zero: ;
461
+ --tw-numeric-figure: ;
462
+ --tw-numeric-spacing: ;
463
+ --tw-numeric-fraction: ;
464
+ --tw-ring-inset: ;
465
+ --tw-ring-offset-width: 0px;
466
+ --tw-ring-offset-color: #fff;
467
+ --tw-ring-color: rgb(59 130 246 / 0.5);
468
+ --tw-ring-offset-shadow: 0 0 #0000;
469
+ --tw-ring-shadow: 0 0 #0000;
470
+ --tw-shadow: 0 0 #0000;
471
+ --tw-shadow-colored: 0 0 #0000;
472
+ --tw-blur: ;
473
+ --tw-brightness: ;
474
+ --tw-contrast: ;
475
+ --tw-grayscale: ;
476
+ --tw-hue-rotate: ;
477
+ --tw-invert: ;
478
+ --tw-saturate: ;
479
+ --tw-sepia: ;
480
+ --tw-drop-shadow: ;
481
+ --tw-backdrop-blur: ;
482
+ --tw-backdrop-brightness: ;
483
+ --tw-backdrop-contrast: ;
484
+ --tw-backdrop-grayscale: ;
485
+ --tw-backdrop-hue-rotate: ;
486
+ --tw-backdrop-invert: ;
487
+ --tw-backdrop-opacity: ;
488
+ --tw-backdrop-saturate: ;
489
+ --tw-backdrop-sepia: ;
490
+ }
491
+
492
+ ::backdrop {
493
+ --tw-border-spacing-x: 0;
494
+ --tw-border-spacing-y: 0;
495
+ --tw-translate-x: 0;
496
+ --tw-translate-y: 0;
497
+ --tw-rotate: 0;
498
+ --tw-skew-x: 0;
499
+ --tw-skew-y: 0;
500
+ --tw-scale-x: 1;
501
+ --tw-scale-y: 1;
502
+ --tw-pan-x: ;
503
+ --tw-pan-y: ;
504
+ --tw-pinch-zoom: ;
505
+ --tw-scroll-snap-strictness: proximity;
506
+ --tw-gradient-from-position: ;
507
+ --tw-gradient-via-position: ;
508
+ --tw-gradient-to-position: ;
509
+ --tw-ordinal: ;
510
+ --tw-slashed-zero: ;
511
+ --tw-numeric-figure: ;
512
+ --tw-numeric-spacing: ;
513
+ --tw-numeric-fraction: ;
514
+ --tw-ring-inset: ;
515
+ --tw-ring-offset-width: 0px;
516
+ --tw-ring-offset-color: #fff;
517
+ --tw-ring-color: rgb(59 130 246 / 0.5);
518
+ --tw-ring-offset-shadow: 0 0 #0000;
519
+ --tw-ring-shadow: 0 0 #0000;
520
+ --tw-shadow: 0 0 #0000;
521
+ --tw-shadow-colored: 0 0 #0000;
522
+ --tw-blur: ;
523
+ --tw-brightness: ;
524
+ --tw-contrast: ;
525
+ --tw-grayscale: ;
526
+ --tw-hue-rotate: ;
527
+ --tw-invert: ;
528
+ --tw-saturate: ;
529
+ --tw-sepia: ;
530
+ --tw-drop-shadow: ;
531
+ --tw-backdrop-blur: ;
532
+ --tw-backdrop-brightness: ;
533
+ --tw-backdrop-contrast: ;
534
+ --tw-backdrop-grayscale: ;
535
+ --tw-backdrop-hue-rotate: ;
536
+ --tw-backdrop-invert: ;
537
+ --tw-backdrop-opacity: ;
538
+ --tw-backdrop-saturate: ;
539
+ --tw-backdrop-sepia: ;
540
+ }
541
+
542
+ .sr-only {
543
+ position: absolute;
544
+ width: 1px;
545
+ height: 1px;
546
+ padding: 0;
547
+ margin: -1px;
548
+ overflow: hidden;
549
+ clip: rect(0, 0, 0, 0);
550
+ white-space: nowrap;
551
+ border-width: 0;
552
+ }
553
+
554
+ .collapse {
555
+ visibility: collapse;
556
+ }
557
+
558
+ .absolute {
559
+ position: absolute;
560
+ }
561
+
562
+ .relative {
563
+ position: relative;
564
+ }
565
+
566
+ .inset-0 {
567
+ inset: 0px;
568
+ }
569
+
570
+ .end-0 {
571
+ inset-inline-end: 0px;
572
+ }
573
+
574
+ .top-0 {
575
+ top: 0px;
576
+ }
577
+
578
+ .z-10 {
579
+ z-index: 10;
580
+ }
581
+
582
+ .z-20 {
583
+ z-index: 20;
584
+ }
585
+
586
+ .mx-10 {
587
+ margin-left: 2.5rem;
588
+ margin-right: 2.5rem;
589
+ }
590
+
591
+ .mx-auto {
592
+ margin-left: auto;
593
+ margin-right: auto;
594
+ }
595
+
596
+ .my-2 {
597
+ margin-top: 0.5rem;
598
+ margin-bottom: 0.5rem;
599
+ }
600
+
601
+ .mb-10 {
602
+ margin-bottom: 2.5rem;
603
+ }
604
+
605
+ .mb-2 {
606
+ margin-bottom: 0.5rem;
607
+ }
608
+
609
+ .ms-2 {
610
+ margin-inline-start: 0.5rem;
611
+ }
612
+
613
+ .ms-2\.5 {
614
+ margin-inline-start: 0.625rem;
615
+ }
616
+
617
+ .ms-3 {
618
+ margin-inline-start: 0.75rem;
619
+ }
620
+
621
+ .mt-1 {
622
+ margin-top: 0.25rem;
623
+ }
624
+
625
+ .mt-6 {
626
+ margin-top: 1.5rem;
627
+ }
628
+
629
+ .block {
630
+ display: block;
631
+ }
632
+
633
+ .inline-block {
634
+ display: inline-block;
635
+ }
636
+
637
+ .inline {
638
+ display: inline;
639
+ }
640
+
641
+ .flex {
642
+ display: flex;
643
+ }
644
+
645
+ .inline-flex {
646
+ display: inline-flex;
647
+ }
648
+
649
+ .hidden {
650
+ display: none;
651
+ }
652
+
653
+ .h-10 {
654
+ height: 2.5rem;
655
+ }
656
+
657
+ .h-2 {
658
+ height: 0.5rem;
659
+ }
660
+
661
+ .h-2\.5 {
662
+ height: 0.625rem;
663
+ }
664
+
665
+ .h-3 {
666
+ height: 0.75rem;
667
+ }
668
+
669
+ .h-4 {
670
+ height: 1rem;
671
+ }
672
+
673
+ .h-6 {
674
+ height: 1.5rem;
675
+ }
676
+
677
+ .h-full {
678
+ height: 100%;
679
+ }
680
+
681
+ .min-h-screen {
682
+ min-height: 100vh;
683
+ }
684
+
685
+ .w-1\/3 {
686
+ width: 33.333333%;
687
+ }
688
+
689
+ .w-10 {
690
+ width: 2.5rem;
691
+ }
692
+
693
+ .w-2 {
694
+ width: 0.5rem;
695
+ }
696
+
697
+ .w-2\.5 {
698
+ width: 0.625rem;
699
+ }
700
+
701
+ .w-3 {
702
+ width: 0.75rem;
703
+ }
704
+
705
+ .w-4 {
706
+ width: 1rem;
707
+ }
708
+
709
+ .w-44 {
710
+ width: 11rem;
711
+ }
712
+
713
+ .w-6 {
714
+ width: 1.5rem;
715
+ }
716
+
717
+ .w-full {
718
+ width: 100%;
719
+ }
720
+
721
+ .max-w-lg {
722
+ max-width: 32rem;
723
+ }
724
+
725
+ .flex-shrink-0 {
726
+ flex-shrink: 0;
727
+ }
728
+
729
+ .shrink-0 {
730
+ flex-shrink: 0;
731
+ }
732
+
733
+ .-rotate-90 {
734
+ --tw-rotate: -90deg;
735
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
736
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
737
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
738
+ }
739
+
740
+ .rotate-180 {
741
+ --tw-rotate: 180deg;
742
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
743
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
744
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
745
+ }
746
+
747
+ .cursor-pointer {
748
+ cursor: pointer;
749
+ }
750
+
751
+ .flex-col {
752
+ flex-direction: column;
753
+ }
754
+
755
+ .items-center {
756
+ align-items: center;
757
+ }
758
+
759
+ .justify-center {
760
+ justify-content: center;
761
+ }
762
+
763
+ .justify-between {
764
+ justify-content: space-between;
765
+ }
766
+
767
+ .gap-3 {
768
+ gap: 0.75rem;
769
+ }
770
+
771
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) {
772
+ --tw-space-x-reverse: 0;
773
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
774
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
775
+ }
776
+
777
+ .divide-y > :not([hidden]) ~ :not([hidden]) {
778
+ --tw-divide-y-reverse: 0;
779
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
780
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
781
+ }
782
+
783
+ .divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
784
+ --tw-divide-opacity: 1;
785
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
786
+ }
787
+
788
+ .overflow-hidden {
789
+ overflow: hidden;
790
+ }
791
+
792
+ .whitespace-nowrap {
793
+ white-space: nowrap;
794
+ }
795
+
796
+ .rounded-full {
797
+ border-radius: 9999px;
798
+ }
799
+
800
+ .rounded-lg {
801
+ border-radius: 0.5rem;
802
+ }
803
+
804
+ .rounded-e-lg {
805
+ border-start-end-radius: 0.5rem;
806
+ border-end-end-radius: 0.5rem;
807
+ }
808
+
809
+ .rounded-s-lg {
810
+ border-start-start-radius: 0.5rem;
811
+ border-end-start-radius: 0.5rem;
812
+ }
813
+
814
+ .rounded-t-xl {
815
+ border-top-left-radius: 0.75rem;
816
+ border-top-right-radius: 0.75rem;
817
+ }
818
+
819
+ .border {
820
+ border-width: 1px;
821
+ }
822
+
823
+ .border-b-0 {
824
+ border-bottom-width: 0px;
825
+ }
826
+
827
+ .border-s-2 {
828
+ border-inline-start-width: 2px;
829
+ }
830
+
831
+ .border-t-0 {
832
+ border-top-width: 0px;
833
+ }
834
+
835
+ .border-blue-700 {
836
+ --tw-border-opacity: 1;
837
+ border-color: rgb(29 78 216 / var(--tw-border-opacity));
838
+ }
839
+
840
+ .border-gray-200 {
841
+ --tw-border-opacity: 1;
842
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
843
+ }
844
+
845
+ .border-gray-300 {
846
+ --tw-border-opacity: 1;
847
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
848
+ }
849
+
850
+ .border-s-gray-50 {
851
+ --tw-border-opacity: 1;
852
+ border-inline-start-color: rgb(249 250 251 / var(--tw-border-opacity));
853
+ }
854
+
855
+ .bg-blue-200 {
856
+ --tw-bg-opacity: 1;
857
+ background-color: rgb(191 219 254 / var(--tw-bg-opacity));
858
+ }
859
+
860
+ .bg-blue-700 {
861
+ --tw-bg-opacity: 1;
862
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
863
+ }
864
+
865
+ .bg-gray-100 {
866
+ --tw-bg-opacity: 1;
867
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
868
+ }
869
+
870
+ .bg-gray-50 {
871
+ --tw-bg-opacity: 1;
872
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
873
+ }
874
+
875
+ .bg-green-100 {
876
+ --tw-bg-opacity: 1;
877
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
878
+ }
879
+
880
+ .bg-green-200 {
881
+ --tw-bg-opacity: 1;
882
+ background-color: rgb(187 247 208 / var(--tw-bg-opacity));
883
+ }
884
+
885
+ .bg-orange-200 {
886
+ --tw-bg-opacity: 1;
887
+ background-color: rgb(254 215 170 / var(--tw-bg-opacity));
888
+ }
889
+
890
+ .bg-violet-100 {
891
+ --tw-bg-opacity: 1;
892
+ background-color: rgb(237 233 254 / var(--tw-bg-opacity));
893
+ }
894
+
895
+ .bg-white {
896
+ --tw-bg-opacity: 1;
897
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
898
+ }
899
+
900
+ .bg-yellow-100 {
901
+ --tw-bg-opacity: 1;
902
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
903
+ }
904
+
905
+ .bg-\[url\(\/img\/grid\.svg\)\] {
906
+ background-image: url(/img/grid.svg);
907
+ }
908
+
909
+ .bg-center {
910
+ background-position: center;
911
+ }
912
+
913
+ .p-0 {
914
+ padding: 0px;
915
+ }
916
+
917
+ .p-0\.5 {
918
+ padding: 0.125rem;
919
+ }
920
+
921
+ .p-1 {
922
+ padding: 0.25rem;
923
+ }
924
+
925
+ .p-2 {
926
+ padding: 0.5rem;
927
+ }
928
+
929
+ .p-2\.5 {
930
+ padding: 0.625rem;
931
+ }
932
+
933
+ .p-5 {
934
+ padding: 1.25rem;
935
+ }
936
+
937
+ .px-2 {
938
+ padding-left: 0.5rem;
939
+ padding-right: 0.5rem;
940
+ }
941
+
942
+ .px-4 {
943
+ padding-left: 1rem;
944
+ padding-right: 1rem;
945
+ }
946
+
947
+ .px-5 {
948
+ padding-left: 1.25rem;
949
+ padding-right: 1.25rem;
950
+ }
951
+
952
+ .px-6 {
953
+ padding-left: 1.5rem;
954
+ padding-right: 1.5rem;
955
+ }
956
+
957
+ .py-2 {
958
+ padding-top: 0.5rem;
959
+ padding-bottom: 0.5rem;
960
+ }
961
+
962
+ .py-2\.5 {
963
+ padding-top: 0.625rem;
964
+ padding-bottom: 0.625rem;
965
+ }
966
+
967
+ .py-6 {
968
+ padding-top: 1.5rem;
969
+ padding-bottom: 1.5rem;
970
+ }
971
+
972
+ .pb-2 {
973
+ padding-bottom: 0.5rem;
974
+ }
975
+
976
+ .pb-8 {
977
+ padding-bottom: 2rem;
978
+ }
979
+
980
+ .pt-10 {
981
+ padding-top: 2.5rem;
982
+ }
983
+
984
+ .text-center {
985
+ text-align: center;
986
+ }
987
+
988
+ .text-sm {
989
+ font-size: 0.875rem;
990
+ line-height: 1.25rem;
991
+ }
992
+
993
+ .text-xs {
994
+ font-size: 0.75rem;
995
+ line-height: 1rem;
996
+ }
997
+
998
+ .font-bold {
999
+ font-weight: 700;
1000
+ }
1001
+
1002
+ .font-medium {
1003
+ font-weight: 500;
1004
+ }
1005
+
1006
+ .font-semibold {
1007
+ font-weight: 600;
1008
+ }
1009
+
1010
+ .text-blue-800 {
1011
+ --tw-text-opacity: 1;
1012
+ color: rgb(30 64 175);
1013
+ }
1014
+
1015
+ .text-gray-400 {
1016
+ --tw-text-opacity: 1;
1017
+ color: rgb(156 163 175);
1018
+ }
1019
+
1020
+ .text-gray-500 {
1021
+ --tw-text-opacity: 1;
1022
+ color: rgb(107 114 128);
1023
+ }
1024
+
1025
+ .text-gray-600 {
1026
+ --tw-text-opacity: 1;
1027
+ color: rgb(75 85 99);
1028
+ }
1029
+
1030
+ .text-gray-700 {
1031
+ --tw-text-opacity: 1;
1032
+ color: rgb(55 65 81);
1033
+ }
1034
+
1035
+ .text-gray-900 {
1036
+ --tw-text-opacity: 1;
1037
+ color: rgb(17 24 39);
1038
+ }
1039
+
1040
+ .text-white {
1041
+ --tw-text-opacity: 1;
1042
+ color: rgb(255 255 255);
1043
+ }
1044
+
1045
+ .shadow {
1046
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1047
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
1048
+ 0 1px 2px -1px var(--tw-shadow-color);
1049
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1050
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1051
+ }
1052
+
1053
+ .shadow-xl {
1054
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
1055
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
1056
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),
1057
+ 0 8px 10px -6px var(--tw-shadow-color);
1058
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
1059
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1060
+ }
1061
+
1062
+ .ring-1 {
1063
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1064
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1065
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1066
+ calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1067
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1068
+ var(--tw-shadow, 0 0 #0000);
1069
+ }
1070
+
1071
+ .ring-gray-900\/5 {
1072
+ --tw-ring-color: rgb(17 24 39 / 0.05);
1073
+ }
1074
+
1075
+ .sequence_container {
1076
+ overflow-wrap: anywhere;
1077
+ counter-reset: sequence;
1078
+ }
1079
+
1080
+ .sequence_container .sequence__chunk {
1081
+ display: inline-block;
1082
+ margin: 0.1rem 0 1rem 1rem;
1083
+ /* width: 10ch; */
1084
+ position: relative;
1085
+ white-space: nowrap;
1086
+ }
1087
+
1088
+ .sequence_container .sequence__chunk:not(:last-child):before,
1089
+ .sequence_container .sequence__chunk--display-last:before {
1090
+ content: counter(sequence);
1091
+ counter-increment: sequence 10;
1092
+ position: absolute;
1093
+ top: -0.8em;
1094
+ right: 0;
1095
+ opacity: 0.5;
1096
+ font-weight: bold;
1097
+ }
1098
+
1099
+ .sequence-container .sequence__chunk::after {
1100
+ content: "";
1101
+ position: absolute;
1102
+ bottom: 0;
1103
+ left: 0;
1104
+ right: 0;
1105
+ transform-origin: left;
1106
+ transform: scaleX(0.1);
1107
+ box-shadow: var(--box-shadow);
1108
+ }
1109
+
1110
+ .sequence__chunk span {
1111
+ padding: 0 0.05rem;
1112
+ }
1113
+
1114
+ .hover\:bg-blue-800:hover {
1115
+ --tw-bg-opacity: 1;
1116
+ background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1117
+ }
1118
+
1119
+ .hover\:bg-gray-100:hover {
1120
+ --tw-bg-opacity: 1;
1121
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1122
+ }
1123
+
1124
+ .hover\:bg-gray-200:hover {
1125
+ --tw-bg-opacity: 1;
1126
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1127
+ }
1128
+
1129
+ .hover\:font-bold:hover {
1130
+ font-weight: 700;
1131
+ }
1132
+
1133
+ .focus\:border-blue-500:focus {
1134
+ --tw-border-opacity: 1;
1135
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1136
+ }
1137
+
1138
+ .focus\:outline-none:focus {
1139
+ outline: 2px solid transparent;
1140
+ outline-offset: 2px;
1141
+ }
1142
+
1143
+ .focus\:ring-4:focus {
1144
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
1145
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1146
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
1147
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1148
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
1149
+ var(--tw-shadow, 0 0 #0000);
1150
+ }
1151
+
1152
+ .focus\:ring-blue-300:focus {
1153
+ --tw-ring-opacity: 1;
1154
+ --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1155
+ }
1156
+
1157
+ .focus\:ring-blue-500:focus {
1158
+ --tw-ring-opacity: 1;
1159
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1160
+ }
1161
+
1162
+ .focus\:ring-gray-100:focus {
1163
+ --tw-ring-opacity: 1;
1164
+ --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity));
1165
+ }
1166
+
1167
+ .focus\:ring-gray-200:focus {
1168
+ --tw-ring-opacity: 1;
1169
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
1170
+ }
1171
+
1172
+ @media (min-width: 640px) {
1173
+ .sm\:mx-auto {
1174
+ margin-left: auto;
1175
+ margin-right: auto;
1176
+ }
1177
+
1178
+ .sm\:rounded-lg {
1179
+ border-radius: 0.5rem;
1180
+ }
1181
+
1182
+ .sm\:px-10 {
1183
+ padding-left: 2.5rem;
1184
+ padding-right: 2.5rem;
1185
+ }
1186
+
1187
+ .sm\:py-12 {
1188
+ padding-top: 3rem;
1189
+ padding-bottom: 3rem;
1190
+ }
1191
+ }
1192
+
1193
+ .rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
1194
+ text-align: right;
1195
+ }
1196
+
1197
+ @media (prefers-color-scheme: dark) {
1198
+ .dark\:border-gray-600 {
1199
+ --tw-border-opacity: 1;
1200
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1201
+ }
1202
+
1203
+ .dark\:border-gray-700 {
1204
+ --tw-border-opacity: 1;
1205
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
1206
+ }
1207
+
1208
+ .dark\:border-s-gray-700 {
1209
+ --tw-border-opacity: 1;
1210
+ border-inline-start-color: rgb(55 65 81 / var(--tw-border-opacity));
1211
+ }
1212
+
1213
+ .dark\:bg-blue-600 {
1214
+ --tw-bg-opacity: 1;
1215
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1216
+ }
1217
+
1218
+ .dark\:bg-gray-600 {
1219
+ --tw-bg-opacity: 1;
1220
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1221
+ }
1222
+
1223
+ .dark\:bg-gray-700 {
1224
+ --tw-bg-opacity: 1;
1225
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1226
+ }
1227
+
1228
+ .dark\:bg-gray-900 {
1229
+ --tw-bg-opacity: 1;
1230
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
1231
+ }
1232
+
1233
+ .dark\:text-gray-200 {
1234
+ --tw-text-opacity: 1;
1235
+ color: rgb(229 231 235);
1236
+ }
1237
+
1238
+ .dark\:text-gray-300 {
1239
+ --tw-text-opacity: 1;
1240
+ color: rgb(209 213 219);
1241
+ }
1242
+
1243
+ .dark\:text-gray-400 {
1244
+ --tw-text-opacity: 1;
1245
+ color: rgb(156 163 175);
1246
+ }
1247
+
1248
+ .dark\:text-white {
1249
+ --tw-text-opacity: 1;
1250
+ color: rgb(255 255 255);
1251
+ }
1252
+
1253
+ .dark\:placeholder-gray-400::placeholder {
1254
+ --tw-placeholder-opacity: 1;
1255
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1256
+ }
1257
+
1258
+ .dark\:hover\:bg-blue-700:hover {
1259
+ --tw-bg-opacity: 1;
1260
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1261
+ }
1262
+
1263
+ .dark\:hover\:bg-gray-600:hover {
1264
+ --tw-bg-opacity: 1;
1265
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
1266
+ }
1267
+
1268
+ .dark\:hover\:bg-gray-800:hover {
1269
+ --tw-bg-opacity: 1;
1270
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1271
+ }
1272
+
1273
+ .dark\:hover\:text-white:hover {
1274
+ --tw-text-opacity: 1;
1275
+ color: rgb(255 255 255);
1276
+ }
1277
+
1278
+ .dark\:focus\:border-blue-500:focus {
1279
+ --tw-border-opacity: 1;
1280
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
1281
+ }
1282
+
1283
+ .dark\:focus\:ring-blue-500:focus {
1284
+ --tw-ring-opacity: 1;
1285
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
1286
+ }
1287
+
1288
+ .dark\:focus\:ring-blue-800:focus {
1289
+ --tw-ring-opacity: 1;
1290
+ --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1291
+ }
1292
+
1293
+ .dark\:focus\:ring-gray-700:focus {
1294
+ --tw-ring-opacity: 1;
1295
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
1296
+ }
1297
+
1298
+ .dark\:focus\:ring-gray-800:focus {
1299
+ --tw-ring-opacity: 1;
1300
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
1301
+ }
1302
+ }
src/heme.sdf ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ OpenBabel03292410433D
3
+
4
+ 75 82 0 0 0 0 0 0 0 0999 V2000
5
+ -0.1081 -0.0063 0.0245 C 0 0 0 0 0 0 0 0 0 0 0 0
6
+ 0.0729 -0.1709 0.0153 C 0 0 0 0 0 0 0 0 0 0 0 0
7
+ 0.2350 0.0085 -0.0035 C 0 0 0 0 0 0 0 0 0 0 0 0
8
+ 0.0537 0.1730 0.0009 C 0 0 0 0 0 0 0 0 0 0 0 0
9
+ -0.0718 -0.0653 0.0190 C 0 0 0 0 0 0 0 0 0 0 0 0
10
+ -0.1008 -0.1294 0.0160 C 0 0 0 0 0 0 0 0 0 0 0 0
11
+ -0.0504 -0.1750 0.0135 C 0 0 0 0 0 0 0 0 0 0 0 0
12
+ 0.0108 -0.1401 0.0149 C 0 0 0 0 0 0 0 0 0 0 0 0
13
+ -0.0588 -0.2498 0.0099 C 0 0 0 0 0 0 0 0 0 0 0 0
14
+ -0.1745 -0.1447 0.0157 C 0 0 0 0 0 0 0 0 0 0 0 0
15
+ -0.1999 -0.1463 -0.0565 C 0 0 0 0 0 0 0 0 0 0 0 0
16
+ -0.2737 -0.1616 -0.0568 C 0 0 0 0 0 0 0 0 0 0 0 0
17
+ -0.3029 -0.1702 -0.0047 O 0 0 0 0 0 0 0 0 0 0 0 0
18
+ -0.3068 -0.1656 -0.1150 O 0 0 0 0 0 0 0 0 0 0 0 0
19
+ 0.1332 -0.1353 0.0154 C 0 0 0 0 0 0 0 0 0 0 0 0
20
+ 0.1968 -0.1664 0.0209 C 0 0 0 0 0 0 0 0 0 0 0 0
21
+ 0.2437 -0.1171 0.0157 C 0 0 0 0 0 0 0 0 0 0 0 0
22
+ 0.2059 -0.0539 0.0070 C 0 0 0 0 0 0 0 0 0 0 0 0
23
+ 0.2102 -0.2399 0.0307 C 0 0 0 0 0 0 0 0 0 0 0 0
24
+ 0.3170 -0.1248 0.0182 C 0 0 0 0 0 0 0 0 0 0 0 0
25
+ 0.3468 -0.1709 -0.0192 C 0 0 0 0 0 0 0 0 0 0 0 0
26
+ 0.1982 0.0673 -0.0087 C 0 0 0 0 0 0 0 0 0 0 0 0
27
+ 0.2265 0.1300 -0.0222 C 0 0 0 0 0 0 0 0 0 0 0 0
28
+ 0.1755 0.1768 -0.0219 C 0 0 0 0 0 0 0 0 0 0 0 0
29
+ 0.1152 0.1423 -0.0070 C 0 0 0 0 0 0 0 0 0 0 0 0
30
+ 0.2995 0.1440 -0.0348 C 0 0 0 0 0 0 0 0 0 0 0 0
31
+ 0.1825 0.2490 -0.0346 C 0 0 0 0 0 0 0 0 0 0 0 0
32
+ 0.2100 0.2703 -0.0911 C 0 0 0 0 0 0 0 0 0 0 0 0
33
+ -0.0051 0.1376 0.0149 C 0 0 0 0 0 0 0 0 0 0 0 0
34
+ -0.0691 0.1694 0.0321 C 0 0 0 0 0 0 0 0 0 0 0 0
35
+ -0.1142 0.1194 0.0387 C 0 0 0 0 0 0 0 0 0 0 0 0
36
+ -0.0780 0.0568 0.0255 C 0 0 0 0 0 0 0 0 0 0 0 0
37
+ -0.0819 0.2432 0.0406 C 0 0 0 0 0 0 0 0 0 0 0 0
38
+ -0.1870 0.1266 0.0561 C 0 0 0 0 0 0 0 0 0 0 0 0
39
+ -0.2287 0.1282 -0.0080 C 0 0 0 0 0 0 0 0 0 0 0 0
40
+ -0.3016 0.1353 0.0095 C 0 0 0 0 0 0 0 0 0 0 0 0
41
+ -0.3186 0.1388 0.0673 O 0 0 0 0 0 0 0 0 0 0 0 0
42
+ -0.3477 0.1377 -0.0393 O 0 0 0 0 0 0 0 0 0 0 0 0
43
+ -0.0034 -0.0728 0.0161 N 0 0 0 0 0 0 0 0 0 0 0 0
44
+ 0.1410 -0.0693 0.0103 N 0 0 0 0 0 4 0 0 0 0 0 0
45
+ 0.1302 0.0753 -0.0016 N 0 0 0 0 0 0 0 0 0 0 0 0
46
+ -0.0138 0.0716 0.0149 N 0 0 0 0 0 4 0 0 0 0 0 0
47
+ 0.0505 0.0078 -0.0030 Fe 0 0 1 0 0 0 0 0 0 0 0 0
48
+ 0.0749 -0.2254 0.0155 H 0 0 0 0 0 0 0 0 0 0 0 0
49
+ 0.2893 0.0115 -0.0076 H 0 0 0 0 0 0 0 0 0 0 0 0
50
+ 0.0509 0.2272 -0.0042 H 0 0 0 0 0 0 0 0 0 0 0 0
51
+ -0.0610 -0.2653 -0.0423 H 0 0 0 0 0 0 0 0 0 0 0 0
52
+ -0.0164 -0.2740 0.0341 H 0 0 0 0 0 0 0 0 0 0 0 0
53
+ -0.1048 -0.2642 0.0351 H 0 0 0 0 0 0 0 0 0 0 0 0
54
+ -0.1831 -0.1931 0.0391 H 0 0 0 0 0 0 0 0 0 0 0 0
55
+ -0.2012 -0.1061 0.0435 H 0 0 0 0 0 0 0 0 0 0 0 0
56
+ -0.1913 -0.0978 -0.0799 H 0 0 0 0 0 0 0 0 0 0 0 0
57
+ -0.1732 -0.1849 -0.0842 H 0 0 0 0 0 0 0 0 0 0 0 0
58
+ 0.1628 -0.2668 0.0330 H 0 0 0 0 0 0 0 0 0 0 0 0
59
+ 0.2397 -0.2587 -0.0111 H 0 0 0 0 0 0 0 0 0 0 0 0
60
+ 0.2376 -0.2474 0.0771 H 0 0 0 0 0 0 0 0 0 0 0 0
61
+ 0.3463 -0.0931 0.0505 H 0 0 0 0 0 0 0 0 0 0 0 0
62
+ 0.3997 -0.1800 -0.0139 H 0 0 0 0 0 0 0 0 0 0 0 0
63
+ 0.3180 -0.1993 -0.0551 H 0 0 0 0 0 0 0 0 0 0 0 0
64
+ 0.3277 0.0975 -0.0319 H 0 0 0 0 0 0 0 0 0 0 0 0
65
+ 0.3055 0.1658 -0.0844 H 0 0 0 0 0 0 0 0 0 0 0 0
66
+ 0.3181 0.1789 0.0027 H 0 0 0 0 0 0 0 0 0 0 0 0
67
+ 0.1651 0.2847 0.0021 H 0 0 0 0 0 0 0 0 0 0 0 0
68
+ 0.2307 0.2348 -0.1262 H 0 0 0 0 0 0 0 0 0 0 0 0
69
+ 0.2118 0.3232 -0.1022 H 0 0 0 0 0 0 0 0 0 0 0 0
70
+ -0.0357 0.2707 0.0319 H 0 0 0 0 0 0 0 0 0 0 0 0
71
+ -0.1197 0.2592 0.0047 H 0 0 0 0 0 0 0 0 0 0 0 0
72
+ -0.0997 0.2527 0.0912 H 0 0 0 0 0 0 0 0 0 0 0 0
73
+ -0.2026 0.0844 0.0869 H 0 0 0 0 0 0 0 0 0 0 0 0
74
+ -0.1946 0.1729 0.0839 H 0 0 0 0 0 0 0 0 0 0 0 0
75
+ -0.2131 0.1704 -0.0387 H 0 0 0 0 0 0 0 0 0 0 0 0
76
+ -0.2211 0.0818 -0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0
77
+ -0.3541 -0.1755 -0.1127 H 0 0 0 0 0 0 0 0 0 0 0 0
78
+ -0.3938 0.1424 -0.0256 H 0 0 0 0 0 0 0 0 0 0 0 0
79
+ -0.1623 -0.0094 0.0283 H 0 0 0 0 0 0 0 0 0 0 0 0
80
+ 1 5 1 0 0 0 0
81
+ 1 32 2 0 0 0 0
82
+ 1 75 1 0 0 0 0
83
+ 2 8 1 0 0 0 0
84
+ 2 15 2 0 0 0 0
85
+ 2 44 1 0 0 0 0
86
+ 3 18 1 0 0 0 0
87
+ 3 22 2 0 0 0 0
88
+ 3 45 1 0 0 0 0
89
+ 4 25 2 0 0 0 0
90
+ 4 29 1 0 0 0 0
91
+ 4 46 1 0 0 0 0
92
+ 5 6 2 0 0 0 0
93
+ 5 39 1 0 0 0 0
94
+ 6 7 1 0 0 0 0
95
+ 6 10 1 0 0 0 0
96
+ 7 8 2 0 0 0 0
97
+ 7 9 1 0 0 0 0
98
+ 8 39 1 0 0 0 0
99
+ 9 47 1 0 0 0 0
100
+ 9 48 1 0 0 0 0
101
+ 9 49 1 0 0 0 0
102
+ 10 11 1 0 0 0 0
103
+ 10 50 1 0 0 0 0
104
+ 10 51 1 0 0 0 0
105
+ 11 12 1 0 0 0 0
106
+ 11 52 1 0 0 0 0
107
+ 11 53 1 0 0 0 0
108
+ 12 13 2 0 0 0 0
109
+ 12 14 1 0 0 0 0
110
+ 14 73 1 0 0 0 0
111
+ 15 16 1 0 0 0 0
112
+ 15 40 1 0 0 0 0
113
+ 16 17 2 0 0 0 0
114
+ 16 19 1 0 0 0 0
115
+ 17 18 1 0 0 0 0
116
+ 17 20 1 0 0 0 0
117
+ 18 40 2 0 0 0 0
118
+ 19 54 1 0 0 0 0
119
+ 19 55 1 0 0 0 0
120
+ 19 56 1 0 0 0 0
121
+ 20 21 2 0 0 0 0
122
+ 20 57 1 0 0 0 0
123
+ 21 58 1 0 0 0 0
124
+ 21 59 1 0 0 0 0
125
+ 22 23 1 0 0 0 0
126
+ 22 41 1 0 0 0 0
127
+ 23 24 2 0 0 0 0
128
+ 23 26 1 0 0 0 0
129
+ 24 25 1 0 0 0 0
130
+ 24 27 1 0 0 0 0
131
+ 25 41 1 0 0 0 0
132
+ 26 60 1 0 0 0 0
133
+ 26 61 1 0 0 0 0
134
+ 26 62 1 0 0 0 0
135
+ 27 28 2 0 0 0 0
136
+ 27 63 1 0 0 0 0
137
+ 28 64 1 0 0 0 0
138
+ 28 65 1 0 0 0 0
139
+ 29 30 1 0 0 0 0
140
+ 29 42 2 0 0 0 0
141
+ 30 31 2 0 0 0 0
142
+ 30 33 1 0 0 0 0
143
+ 31 32 1 0 0 0 0
144
+ 31 34 1 0 0 0 0
145
+ 32 42 1 0 0 0 0
146
+ 33 66 1 0 0 0 0
147
+ 33 67 1 0 0 0 0
148
+ 33 68 1 0 0 0 0
149
+ 34 35 1 0 0 0 0
150
+ 34 69 1 0 0 0 0
151
+ 34 70 1 0 0 0 0
152
+ 35 36 1 0 0 0 0
153
+ 35 71 1 0 0 0 0
154
+ 35 72 1 0 0 0 0
155
+ 36 37 2 0 0 0 0
156
+ 36 38 1 0 0 0 0
157
+ 38 74 1 0 0 0 0
158
+ 40 43 1 0 0 0 0
159
+ 41 43 1 0 0 0 0
160
+ 42 43 1 0 0 0 0
161
+ 43 39 1 6 0 0 0
162
+ M END
163
+ $$$$
src/pyproject.toml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [build-system]
2
+ requires = [
3
+ "hatchling",
4
+ "hatch-requirements-txt",
5
+ "hatch-fancy-pypi-readme>=22.5.0",
6
+ ]
7
+ build-backend = "hatchling.build"
8
+
9
+ [project]
10
+ name = "gradio_cofoldinginput"
11
+ version = "0.0.2"
12
+ description = "Component to enter protein and DNA sequences + small molecules for cofolding"
13
+ readme = "README.md"
14
+ license = "MIT"
15
+ requires-python = ">=3.8"
16
+ authors = [{ name = "YOUR NAME", email = "YOUREMAIL@domain.com" }]
17
+ keywords = ["gradio-custom-component", "gradio-template-Textbox"]
18
+ # Add dependencies here
19
+ dependencies = ["gradio>=4.0,<5.0"]
20
+ classifiers = [
21
+ 'Development Status :: 3 - Alpha',
22
+ 'License :: OSI Approved :: Apache Software License',
23
+ 'Operating System :: OS Independent',
24
+ 'Programming Language :: Python :: 3',
25
+ 'Programming Language :: Python :: 3 :: Only',
26
+ 'Programming Language :: Python :: 3.8',
27
+ 'Programming Language :: Python :: 3.9',
28
+ 'Programming Language :: Python :: 3.10',
29
+ 'Programming Language :: Python :: 3.11',
30
+ 'Topic :: Scientific/Engineering',
31
+ 'Topic :: Scientific/Engineering :: Artificial Intelligence',
32
+ 'Topic :: Scientific/Engineering :: Visualization',
33
+ ]
34
+
35
+ [project.optional-dependencies]
36
+ dev = ["build", "twine"]
37
+
38
+ [tool.hatch.build]
39
+ artifacts = ["/backend/gradio_cofoldinginput/templates", "*.pyi", "backend/gradio_cofoldinginput/templates", "backend/gradio_cofoldinginput/templates", "backend/gradio_cofoldinginput/templates", "backend/gradio_cofoldinginput/templates", "backend/gradio_cofoldinginput/templates"]
40
+
41
+ [tool.hatch.build.targets.wheel]
42
+ packages = ["/backend/gradio_cofoldinginput"]