LucaVivona commited on
Commit
98c2891
β€’
1 Parent(s): 89b1058

πŸ“ refactor size updater for node

Browse files
frontend/src/components/Navagation/navbar.js CHANGED
@@ -9,6 +9,7 @@ export default class Navbar extends Component{
9
  constructor(props){
10
  super(props)
11
  this.temp_host = 0
 
12
  this.deleteNode = props.onDelete
13
  this.state = {open : true,
14
  menu : [],
@@ -45,7 +46,7 @@ export default class Navbar extends Component{
45
  if(diff !== 0){
46
  this.hanelTabs(menu, diff)
47
  }
48
- },1500);
49
  }catch(e){
50
  console.log(e)
51
  }
@@ -225,7 +226,7 @@ export default class Navbar extends Component{
225
 
226
 
227
  render(){
228
- this.fetch_classes()
229
  return (<div>
230
 
231
  <div className={`z-10 flex-1 float-left bg-white dark:bg-stone-900 h-screen p-5 pt-8 ${this.state.open ? "lg:w-72 md:64 sm:w-60" : "w-10"} duration-300 absolute shadow-2xl border-black border-r-[1px] dark:border-white dark:text-white`}>
 
9
  constructor(props){
10
  super(props)
11
  this.temp_host = 0
12
+ this.fetch_classes()
13
  this.deleteNode = props.onDelete
14
  this.state = {open : true,
15
  menu : [],
 
46
  if(diff !== 0){
47
  this.hanelTabs(menu, diff)
48
  }
49
+ },1000);
50
  }catch(e){
51
  console.log(e)
52
  }
 
226
 
227
 
228
  render(){
229
+
230
  return (<div>
231
 
232
  <div className={`z-10 flex-1 float-left bg-white dark:bg-stone-900 h-screen p-5 pt-8 ${this.state.open ? "lg:w-72 md:64 sm:w-60" : "w-10"} duration-300 absolute shadow-2xl border-black border-r-[1px] dark:border-white dark:text-white`}>
frontend/src/components/Nodes/Custom.js CHANGED
@@ -1,14 +1,22 @@
1
  import React from "react"
2
  import {TbResize} from 'react-icons/tb'
3
  import {BiCube, BiRefresh} from 'react-icons/bi'
4
- import {BsTrash} from 'react-icons/bs'
5
  import {CgLayoutGridSmall} from 'react-icons/cg'
6
  import '../../css/counter.css'
7
 
 
 
8
  export default class CustomNodeIframe extends React.Component {
9
  constructor({id , data}){
10
  super()
11
  this.myRef = React.createRef()
 
 
 
 
 
 
12
  this.state = {
13
  id : id,
14
  reachable : this.isFetchable(data.host),
@@ -16,20 +24,18 @@ export default class CustomNodeIframe extends React.Component {
16
  data : data,
17
  width : 540,
18
  height : 600,
19
- size : false,
20
  iframe : 0,
21
- initial_pos : 0,
22
- initial_size : 0,
23
  }
24
 
25
  }
26
 
27
  handelSelected = () => {
28
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : !this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : this.state.size, iframe : this.state.iframe, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
29
  }
30
 
31
  handelSizeState = () => {
32
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : !this.state.size, iframe : this.state.iframe, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
33
  }
34
 
35
  isFetchable = async (host) => {
@@ -51,18 +57,18 @@ export default class CustomNodeIframe extends React.Component {
51
  if(!this.isFetchable(this.state.data.host)){
52
  this.onNodeClick(this.state.id)
53
  } else{
54
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : this.state.size, iframe : this.state.iframe + 1, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
55
  }
56
  }
57
 
58
  handelOnChange(evt, type){
59
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : type === "width" ? parseInt(evt.target.value) : this.state.width, height : type === "height" ? parseInt(evt.target.value) : this.state.height, size : this.state.size, iframe : this.state.iframe, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
60
  type === "width" ? this.myRef.current.style.width = `${parseInt(evt.target.value)}px` : this.myRef.current.style.height = `${parseInt(evt.target.value)}px`
61
  }
62
 
63
  handelSize(evt, increment, change){
64
  if (evt === "increment") {
65
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : change === "width" ? this.state.width + increment : this.state.width, height : change === "height" ? this.state.height + increment : this.state.height, size : this.state.size, iframe : this.state.iframe, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
66
  change === "width" ? this.myRef.current.style.width = `${this.state.width + increment}px` : this.myRef.current.style.height = `${this.state.height + increment}px`
67
  }
68
 
@@ -70,13 +76,75 @@ export default class CustomNodeIframe extends React.Component {
70
 
71
  //(Experimental) resize nodes by dragging
72
  initial = (e) => {
73
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height , size : this.state.size, iframe : this.state.iframe, initial_pos : e.clientY, initial_size : this.myRef.current.offsetHeight })
 
 
 
 
 
 
 
 
 
74
  }
75
 
76
- resize = (e) => {
77
- var new_height = parseInt(this.state.initial_size) + parseInt(e.clientY - this.state.initial_pos)
78
- this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : new_height, size : this.state.size, iframe : this.state.iframe, initial_pos : this.state.initial_pos, initial_size : this.state.initial_size})
79
- this.myRef.current.style.height = `${new_height}px`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
81
 
82
  Counter(focus, size){
@@ -96,7 +164,6 @@ export default class CustomNodeIframe extends React.Component {
96
  render(){
97
  if (!this.state.reachable) {this.onNodeClick(this.state.id) }
98
  return (<>
99
- <>
100
  <div className=" flex w-full h-10 top-0 cursor-pointer" onClick={this.handelEvent}>
101
  <div title="Collaspse Node" className=" duration-300 cursor-pointer shadow-xl border-2 border-white h-10 w-10 mr-2 -mt-3 bg-Warm-Blue rounded-xl" onClick={this.handelSelected}><CgLayoutGridSmall className="h-full w-full text-white p-1"/></div>
102
 
@@ -115,24 +182,35 @@ export default class CustomNodeIframe extends React.Component {
115
 
116
  </div>
117
 
118
- <div id="draggable" className={`relative w-[540px] h-[600px] overflow-hidden m-0 p-0 shadow-2xl`} ref={this.myRef}>
119
- <div className={`absolute h-full w-full ${this.state.data.colour} border-1 shadow-2xl rounded-xl -z-20`}></div>
 
120
  <iframe
121
  id="iframe"
122
  key={this.state.iframe}
123
  src={this.state.data.host}
124
- title={this.state.data.label}
125
- frameBorder="0"
126
- className=" -z-10 container h-full p-2 flex-grow space-iframe overflow-scroll "
127
- sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe>
 
 
128
  </div>
129
- {/* (Experimental) Do not uncomment */}
130
- <div className={`absolute bottom-0 w-full h-10 bg-transparent border-1 shadow-2xl rounded-xl z-10 cursor-ns-resize`}
131
- draggable
132
- onDragStart={(e) => { this.initial(e) }}
133
- onDrag={(e) => { this.resize(e) }}
134
- ></div>
135
- </>
 
 
 
 
 
 
 
 
136
  </>)
137
  }
138
- }
 
1
  import React from "react"
2
  import {TbResize} from 'react-icons/tb'
3
  import {BiCube, BiRefresh} from 'react-icons/bi'
4
+ import {BsTrash, BsArrowDownRightSquare} from 'react-icons/bs'
5
  import {CgLayoutGridSmall} from 'react-icons/cg'
6
  import '../../css/counter.css'
7
 
8
+ const MINIMUM_HEIGHT = 600;
9
+ const MINIMUM_WIDTH = 540;
10
  export default class CustomNodeIframe extends React.Component {
11
  constructor({id , data}){
12
  super()
13
  this.myRef = React.createRef()
14
+ this.original_width = 0;
15
+ this.original_height = 0;
16
+ this.original_x = 0;
17
+ this.original_y = 0;
18
+ this.original_mouse_x = 0;
19
+ this.original_mouse_y = 0;
20
  this.state = {
21
  id : id,
22
  reachable : this.isFetchable(data.host),
 
24
  data : data,
25
  width : 540,
26
  height : 600,
27
+ size : true,
28
  iframe : 0,
 
 
29
  }
30
 
31
  }
32
 
33
  handelSelected = () => {
34
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : !this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : this.state.size, iframe : this.state.iframe})
35
  }
36
 
37
  handelSizeState = () => {
38
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : !this.state.size, iframe : this.state.iframe})
39
  }
40
 
41
  isFetchable = async (host) => {
 
57
  if(!this.isFetchable(this.state.data.host)){
58
  this.onNodeClick(this.state.id)
59
  } else{
60
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : this.state.width, height : this.state.height, size : this.state.size, iframe : this.state.iframe + 1})
61
  }
62
  }
63
 
64
  handelOnChange(evt, type){
65
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : type === "width" ? parseInt(evt.target.value) : this.state.width, height : type === "height" ? parseInt(evt.target.value) : this.state.height, size : this.state.size, iframe : this.state.iframe })
66
  type === "width" ? this.myRef.current.style.width = `${parseInt(evt.target.value)}px` : this.myRef.current.style.height = `${parseInt(evt.target.value)}px`
67
  }
68
 
69
  handelSize(evt, increment, change){
70
  if (evt === "increment") {
71
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : change === "width" ? this.state.width + increment : this.state.width, height : change === "height" ? this.state.height + increment : this.state.height, size : this.state.size, iframe : this.state.iframe })
72
  change === "width" ? this.myRef.current.style.width = `${this.state.width + increment}px` : this.myRef.current.style.height = `${this.state.height + increment}px`
73
  }
74
 
 
76
 
77
  //(Experimental) resize nodes by dragging
78
  initial = (e) => {
79
+ e.dataTransfer.setDragImage(new Image(), 0, 0)
80
+ console.log( this.myRef.current.offsetHeight, this.myRef.current.offsetWidth, this.myRef.current.getBoundingClientRect().left, this.myRef.current.getBoundingClientRect().top )
81
+ this.original_width = this.myRef.current.offsetWidth
82
+ this.original_height = this.myRef.current.offsetHeight
83
+
84
+ this.original_x = this.myRef.current.getBoundingClientRect().left;
85
+ this.original_y = this.myRef.current.getBoundingClientRect().top;
86
+
87
+ this.original_mouse_x = e.pageX
88
+ this.original_mouse_y = e.pageY
89
  }
90
 
91
+ resize = (e, point) => {
92
+ var height = 0;
93
+ var width = 0;
94
+ // e.dataTransfer.setDragImage(new Image(), 0, 0)
95
+ if (point === 'bottom-right'){
96
+ width = this.original_width + (e.pageX - this.original_mouse_x);
97
+ height = this.original_height + (e.pageY - this.original_mouse_y)
98
+ if (width > MINIMUM_WIDTH) {
99
+ this.myRef.current.style.width = `${width}px`
100
+ }
101
+ if (height > MINIMUM_HEIGHT) {
102
+ this.myRef.current.style.height = `${height}px`
103
+ }
104
+
105
+ } else if (point === "bottom-left"){
106
+ height = this.original_height + (e.pageY - this.original_mouse_y)
107
+ width = this.original_width - (e.pageX - this.original_mouse_x);
108
+ if (height > MINIMUM_HEIGHT) {
109
+ this.myRef.current.style.height = `${height}px`
110
+ }
111
+ if (width > MINIMUM_WIDTH) {
112
+ this.myRef.current.style.width = `${width}px`
113
+ this.myRef.current.style.left = this.original_x + (e.pageX - this.original_mouse_x) + 'px'
114
+
115
+ }
116
+ } else if (point === "top-right"){
117
+ width = this.original_width + (e.pageX - this.original_mouse_x);
118
+ height = this.original_height - (e.pageY - this.original_mouse_y)
119
+
120
+ if (width > MINIMUM_WIDTH) {
121
+ this.myRef.current.style.width = `${width}px`
122
+ }
123
+ if (height > MINIMUM_HEIGHT) {
124
+ this.myRef.current.style.height = `${height}px`
125
+ this.myRef.current.style.top = this.original_y + (e.pageY - this.original_mouse_y) + 'px'
126
+ }
127
+ } else {
128
+ height = this.original_height - (e.pageY - this.original_mouse_y)
129
+ width = this.original_width - (e.pageX - this.original_mouse_x);
130
+ if (width > MINIMUM_WIDTH) {
131
+ this.myRef.current.style.width = `${width}px`
132
+ this.myRef.current.style.left = this.original_x + (e.pageX - this.original_mouse_x) + 'px'
133
+
134
+ }
135
+ if (height > MINIMUM_HEIGHT) {
136
+ this.myRef.current.style.height = `${height}px`
137
+ this.myRef.current.style.top = this.original_y + (e.pageY - this.original_mouse_y) + 'px'
138
+ }
139
+ }
140
+
141
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : parseInt(width) , height : parseInt(height), size : this.state.size, iframe : this.state.iframe})
142
+
143
+ }
144
+
145
+ OnDragEnd = () => {
146
+ this.setState({id : this.state.id, reachable : this.state.reachable, selected : this.state.selected, data : this.state.data, width : parseInt(this.myRef.current.style.width), height : parseInt(this.myRef.current.style.height), size : this.state.size, iframe : this.state.iframe})
147
+
148
  }
149
 
150
  Counter(focus, size){
 
164
  render(){
165
  if (!this.state.reachable) {this.onNodeClick(this.state.id) }
166
  return (<>
 
167
  <div className=" flex w-full h-10 top-0 cursor-pointer" onClick={this.handelEvent}>
168
  <div title="Collaspse Node" className=" duration-300 cursor-pointer shadow-xl border-2 border-white h-10 w-10 mr-2 -mt-3 bg-Warm-Blue rounded-xl" onClick={this.handelSelected}><CgLayoutGridSmall className="h-full w-full text-white p-1"/></div>
169
 
 
182
 
183
  </div>
184
 
185
+ <div id={`draggable`} className={`relative w-[540px] h-[600px] overflow-hidden m-0 p-0 shadow-2xl`} ref={this.myRef}>
186
+
187
+ <div className={`absolute p-5 h-full w-full ${this.state.data.colour} shadow-2xl rounded-xl -z-20`}></div>
188
  <iframe
189
  id="iframe"
190
  key={this.state.iframe}
191
  src={this.state.data.host}
192
+ title={this.state.data.label}
193
+ frameBorder="0"
194
+ scrolling="no"
195
+ className=" -z-10 container h-full p-2 flex-grow space-iframe overflow-auto"
196
+ sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"
197
+ ></iframe>
198
  </div>
199
+ { this.state.size && <>
200
+
201
+ <div id="remove-ghost" className={`absolute select-none -bottom-0 right-0 w-5 h-5border-2 shadow-2xl rounded-xl z-10 cursor-nwse-resize `}
202
+ style={{"userDrag": "none"}}
203
+ draggable
204
+ onDragStart={(e) => { this.initial(e) }}
205
+ onDrag={(e) => { this.resize(e, 'bottom-right') }}
206
+ onDragEnd={() => {this.OnDragEnd()}}
207
+ >
208
+ <BsArrowDownRightSquare className=" text-selected-text text-2xl bg-white"/>
209
+ </div>
210
+
211
+ </>
212
+ }
213
+
214
  </>)
215
  }
216
+ }
frontend/src/components/ReactFlow/ReactFlowEnv.js CHANGED
@@ -103,10 +103,10 @@ export default function ReactEnviorment() {
103
 
104
  return (
105
  <div className={`${theme ? "dark" : ""}`}>
106
- <div className={` absolute ${tool ? "h-[13rem]" : "h-[4rem]"} top-4 right-5 z-50 cursor-default select-none text-4xl bg-white dark:bg-stone-900 p-3 rounded-full border border-black dark:border-white duration-500`} >
107
- <CgMoreVerticalAlt className={`text-black dark:text-white ${tool ? "-rotate-0" : "rotate-90"} duration-150`} onClick={() => setTool(!tool)}/>
108
- <h1 title={theme ? 'Dark Mode' : 'Light Mode'} className={`py-2 ${tool ? "visible delay-[170ms]" : "invisible"} `} onClick={() => setTheme(!theme)} >{theme ? 'πŸŒ™' : 'β˜€οΈ'}</h1>
109
- <h1 title="Save" className={`py-2 ${tool ? "visible delay-[170ms]" : "invisible"} `} onClick={() => onSave()}>πŸ’Ύ</h1>
110
  </div>
111
  <div className={`flex h-screen w-screen ${theme ? "dark" : ""} transition-all`}>
112
  <Navbar onDelete={deleteNodeContains} colour={JSON.parse(localStorage.getItem('colour'))} emoji={JSON.parse(localStorage.getItem('emoji'))}/>
 
103
 
104
  return (
105
  <div className={`${theme ? "dark" : ""}`}>
106
+ <div className={` absolute w-auto h-auto text-4xl top-4 right-5 z-50 cursor-default select-none bg-white dark:bg-stone-900 rounded-full border border-black dark:border-white duration-500`} >
107
+ <CgMoreVerticalAlt className={` text-black dark:text-white ${tool ? "-rotate-0 mr-auto ml-auto" : "rotate-90 m-1"} duration-15 `} onClick={() => setTool(!tool)}/>
108
+ <h1 title={theme ? 'Dark Mode' : 'Light Mode'} className={`p-4 px-1 ${tool ? "visible delay-[170ms]" : "hidden invisible"} text-3xl`} onClick={() => setTheme(!theme)} >{theme ? 'πŸŒ™' : 'β˜€οΈ'}</h1>
109
+ <h1 title="Save" className={`p-4 px-1 ${tool ? "visible delay-[170ms]" : " hidden invisible"} text-3xl`} onClick={() => onSave()}>πŸ’Ύ</h1>
110
  </div>
111
  <div className={`flex h-screen w-screen ${theme ? "dark" : ""} transition-all`}>
112
  <Navbar onDelete={deleteNodeContains} colour={JSON.parse(localStorage.getItem('colour'))} emoji={JSON.parse(localStorage.getItem('emoji'))}/>
frontend/src/css/dist/output.css CHANGED
@@ -624,6 +624,14 @@ video {
624
  top: 0px;
625
  }
626
 
 
 
 
 
 
 
 
 
627
  .top-4 {
628
  top: 1rem;
629
  }
@@ -632,6 +640,14 @@ video {
632
  right: 1.25rem;
633
  }
634
 
 
 
 
 
 
 
 
 
635
  .-z-20 {
636
  z-index: -20;
637
  }
@@ -664,6 +680,14 @@ video {
664
  margin: 0px;
665
  }
666
 
 
 
 
 
 
 
 
 
667
  .mt-4 {
668
  margin-top: 1rem;
669
  }
@@ -692,6 +716,18 @@ video {
692
  margin-top: -0.75rem;
693
  }
694
 
 
 
 
 
 
 
 
 
 
 
 
 
695
  .block {
696
  display: block;
697
  }
@@ -732,44 +768,32 @@ video {
732
  height: 600px;
733
  }
734
 
735
- .h-20 {
736
- height: 5rem;
737
  }
738
 
739
- .h-12 {
740
- height: 3rem;
741
- }
742
-
743
- .h-14 {
744
- height: 3.5rem;
745
  }
746
 
747
- .h-16 {
748
  height: 4rem;
749
  }
750
 
751
- .h-\[4\.5rem\] {
752
- height: 4.5rem;
753
  }
754
 
755
- .h-60 {
756
- height: 15rem;
757
  }
758
 
759
- .h-0 {
760
- height: 0px;
761
  }
762
 
763
- .h-\[14rem\] {
764
- height: 14rem;
765
- }
766
-
767
- .h-\[4rem\] {
768
- height: 4rem;
769
- }
770
-
771
- .h-\[13rem\] {
772
- height: 13rem;
773
  }
774
 
775
  .w-10 {
@@ -804,10 +828,26 @@ video {
804
  width: 540px;
805
  }
806
 
 
 
 
 
807
  .w-screen {
808
  width: 100vw;
809
  }
810
 
 
 
 
 
 
 
 
 
 
 
 
 
811
  .max-w-full {
812
  max-width: 100%;
813
  }
@@ -826,26 +866,14 @@ video {
826
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
827
  }
828
 
829
- .rotate-90 {
830
- --tw-rotate: 90deg;
831
- -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
832
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
833
- }
834
-
835
- .-rotate-90 {
836
- --tw-rotate: -90deg;
837
- -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
838
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
839
- }
840
-
841
- .-rotate-180 {
842
- --tw-rotate: -180deg;
843
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
844
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
845
  }
846
 
847
- .-rotate-0 {
848
- --tw-rotate: -0deg;
849
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
850
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
851
  }
@@ -866,6 +894,10 @@ video {
866
  cursor: default;
867
  }
868
 
 
 
 
 
869
  .select-none {
870
  -webkit-user-select: none;
871
  user-select: none;
@@ -949,6 +981,10 @@ video {
949
  border-width: 2px;
950
  }
951
 
 
 
 
 
952
  .border-y-2 {
953
  border-top-width: 2px;
954
  border-bottom-width: 2px;
@@ -991,6 +1027,11 @@ video {
991
  border-color: rgb(255 255 255 / var(--tw-border-opacity));
992
  }
993
 
 
 
 
 
 
994
  .bg-white {
995
  --tw-bg-opacity: 1;
996
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
@@ -1029,16 +1070,6 @@ video {
1029
  background-color: rgb(254 169 89 / var(--tw-bg-opacity));
1030
  }
1031
 
1032
- .bg-black {
1033
- --tw-bg-opacity: 1;
1034
- background-color: rgb(0 0 0 / var(--tw-bg-opacity));
1035
- }
1036
-
1037
- .bg-stone-900 {
1038
- --tw-bg-opacity: 1;
1039
- background-color: rgb(28 25 23 / var(--tw-bg-opacity));
1040
- }
1041
-
1042
  .bg-gradient-to-bl {
1043
  background-image: linear-gradient(to bottom left, var(--tw-gradient-stops));
1044
  }
@@ -1239,10 +1270,6 @@ video {
1239
  padding: 0.5rem;
1240
  }
1241
 
1242
- .p-3 {
1243
- padding: 0.75rem;
1244
- }
1245
-
1246
  .px-2 {
1247
  padding-left: 0.5rem;
1248
  padding-right: 0.5rem;
@@ -1268,9 +1295,24 @@ video {
1268
  padding-right: 1.5rem;
1269
  }
1270
 
1271
- .py-5 {
1272
- padding-top: 1.25rem;
1273
- padding-bottom: 1.25rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1274
  }
1275
 
1276
  .pt-8 {
@@ -1305,10 +1347,6 @@ video {
1305
  padding-top: 0.5rem;
1306
  }
1307
 
1308
- .pt-5 {
1309
- padding-top: 1.25rem;
1310
- }
1311
-
1312
  .text-center {
1313
  text-align: center;
1314
  }
@@ -1342,6 +1380,11 @@ video {
1342
  line-height: 2rem;
1343
  }
1344
 
 
 
 
 
 
1345
  .font-bold {
1346
  font-weight: 700;
1347
  }
@@ -1369,6 +1412,16 @@ video {
1369
  color: rgb(0 0 0 / var(--tw-text-opacity));
1370
  }
1371
 
 
 
 
 
 
 
 
 
 
 
1372
  .underline {
1373
  -webkit-text-decoration-line: underline;
1374
  text-decoration-line: underline;
@@ -1418,18 +1471,6 @@ video {
1418
  transition-duration: 150ms;
1419
  }
1420
 
1421
- .delay-500 {
1422
- transition-delay: 500ms;
1423
- }
1424
-
1425
- .delay-200 {
1426
- transition-delay: 200ms;
1427
- }
1428
-
1429
- .delay-150 {
1430
- transition-delay: 150ms;
1431
- }
1432
-
1433
  .delay-\[170ms\] {
1434
  transition-delay: 170ms;
1435
  }
@@ -1557,9 +1598,9 @@ video {
1557
  color: rgb(255 255 255 / var(--tw-text-opacity));
1558
  }
1559
 
1560
- .dark .dark\:text-black {
1561
  --tw-text-opacity: 1;
1562
- color: rgb(0 0 0 / var(--tw-text-opacity));
1563
  }
1564
 
1565
  @media (min-width: 640px) {
 
624
  top: 0px;
625
  }
626
 
627
+ .-bottom-1 {
628
+ bottom: -0.25rem;
629
+ }
630
+
631
+ .-right-2 {
632
+ right: -0.5rem;
633
+ }
634
+
635
  .top-4 {
636
  top: 1rem;
637
  }
 
640
  right: 1.25rem;
641
  }
642
 
643
+ .-bottom-0 {
644
+ bottom: -0px;
645
+ }
646
+
647
+ .right-0 {
648
+ right: 0px;
649
+ }
650
+
651
  .-z-20 {
652
  z-index: -20;
653
  }
 
680
  margin: 0px;
681
  }
682
 
683
+ .m-5 {
684
+ margin: 1.25rem;
685
+ }
686
+
687
+ .m-1 {
688
+ margin: 0.25rem;
689
+ }
690
+
691
  .mt-4 {
692
  margin-top: 1rem;
693
  }
 
716
  margin-top: -0.75rem;
717
  }
718
 
719
+ .mt-1 {
720
+ margin-top: 0.25rem;
721
+ }
722
+
723
+ .mb-auto {
724
+ margin-bottom: auto;
725
+ }
726
+
727
+ .mt-auto {
728
+ margin-top: auto;
729
+ }
730
+
731
  .block {
732
  display: block;
733
  }
 
768
  height: 600px;
769
  }
770
 
771
+ .h-5 {
772
+ height: 1.25rem;
773
  }
774
 
775
+ .h-\[13rem\] {
776
+ height: 13rem;
 
 
 
 
777
  }
778
 
779
+ .h-\[4rem\] {
780
  height: 4rem;
781
  }
782
 
783
+ .h-\[10rem\] {
784
+ height: 10rem;
785
  }
786
 
787
+ .h-\[11rem\] {
788
+ height: 11rem;
789
  }
790
 
791
+ .h-\[31\.5px\] {
792
+ height: 31.5px;
793
  }
794
 
795
+ .h-\[39\.750px\] {
796
+ height: 39.750px;
 
 
 
 
 
 
 
 
797
  }
798
 
799
  .w-10 {
 
828
  width: 540px;
829
  }
830
 
831
+ .w-5 {
832
+ width: 1.25rem;
833
+ }
834
+
835
  .w-screen {
836
  width: 100vw;
837
  }
838
 
839
+ .w-\[31\.5\] {
840
+ width: 31.5;
841
+ }
842
+
843
+ .w-\[31\.5px\] {
844
+ width: 31.5px;
845
+ }
846
+
847
+ .w-\[29\.5px\] {
848
+ width: 29.5px;
849
+ }
850
+
851
  .max-w-full {
852
  max-width: 100%;
853
  }
 
866
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
867
  }
868
 
869
+ .-rotate-0 {
870
+ --tw-rotate: -0deg;
 
 
 
 
 
 
 
 
 
 
 
 
871
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
872
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
873
  }
874
 
875
+ .rotate-90 {
876
+ --tw-rotate: 90deg;
877
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
878
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
879
  }
 
894
  cursor: default;
895
  }
896
 
897
+ .cursor-nwse-resize {
898
+ cursor: nwse-resize;
899
+ }
900
+
901
  .select-none {
902
  -webkit-user-select: none;
903
  user-select: none;
 
981
  border-width: 2px;
982
  }
983
 
984
+ .border-\[3px\] {
985
+ border-width: 3px;
986
+ }
987
+
988
  .border-y-2 {
989
  border-top-width: 2px;
990
  border-bottom-width: 2px;
 
1027
  border-color: rgb(255 255 255 / var(--tw-border-opacity));
1028
  }
1029
 
1030
+ .border-Happy-Cool-Blue {
1031
+ --tw-border-opacity: 1;
1032
+ border-color: rgb(80 142 231 / var(--tw-border-opacity));
1033
+ }
1034
+
1035
  .bg-white {
1036
  --tw-bg-opacity: 1;
1037
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
 
1070
  background-color: rgb(254 169 89 / var(--tw-bg-opacity));
1071
  }
1072
 
 
 
 
 
 
 
 
 
 
 
1073
  .bg-gradient-to-bl {
1074
  background-image: linear-gradient(to bottom left, var(--tw-gradient-stops));
1075
  }
 
1270
  padding: 0.5rem;
1271
  }
1272
 
 
 
 
 
1273
  .px-2 {
1274
  padding-left: 0.5rem;
1275
  padding-right: 0.5rem;
 
1295
  padding-right: 1.5rem;
1296
  }
1297
 
1298
+ .px-1 {
1299
+ padding-left: 0.25rem;
1300
+ padding-right: 0.25rem;
1301
+ }
1302
+
1303
+ .py-1 {
1304
+ padding-top: 0.25rem;
1305
+ padding-bottom: 0.25rem;
1306
+ }
1307
+
1308
+ .px-\[0\.5px\] {
1309
+ padding-left: 0.5px;
1310
+ padding-right: 0.5px;
1311
+ }
1312
+
1313
+ .py-\[0\.5px\] {
1314
+ padding-top: 0.5px;
1315
+ padding-bottom: 0.5px;
1316
  }
1317
 
1318
  .pt-8 {
 
1347
  padding-top: 0.5rem;
1348
  }
1349
 
 
 
 
 
1350
  .text-center {
1351
  text-align: center;
1352
  }
 
1380
  line-height: 2rem;
1381
  }
1382
 
1383
+ .text-5xl {
1384
+ font-size: 3rem;
1385
+ line-height: 1;
1386
+ }
1387
+
1388
  .font-bold {
1389
  font-weight: 700;
1390
  }
 
1412
  color: rgb(0 0 0 / var(--tw-text-opacity));
1413
  }
1414
 
1415
+ .text-cream {
1416
+ --tw-text-opacity: 1;
1417
+ color: rgb(250 249 246 / var(--tw-text-opacity));
1418
+ }
1419
+
1420
+ .text-selected-text {
1421
+ --tw-text-opacity: 1;
1422
+ color: rgb(0 83 215 / var(--tw-text-opacity));
1423
+ }
1424
+
1425
  .underline {
1426
  -webkit-text-decoration-line: underline;
1427
  text-decoration-line: underline;
 
1471
  transition-duration: 150ms;
1472
  }
1473
 
 
 
 
 
 
 
 
 
 
 
 
 
1474
  .delay-\[170ms\] {
1475
  transition-delay: 170ms;
1476
  }
 
1598
  color: rgb(255 255 255 / var(--tw-text-opacity));
1599
  }
1600
 
1601
+ .dark .dark\:text-cream {
1602
  --tw-text-opacity: 1;
1603
+ color: rgb(250 249 246 / var(--tw-text-opacity));
1604
  }
1605
 
1606
  @media (min-width: 640px) {