File size: 6,925 Bytes
0e66bc1
 
 
 
 
edfc1b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import streamlit as st

x = st.slider('Select a value')
st.write(x, 'squared is', x * x)

// Simple flame component
const Flame: React.FC<{ className?: string }> = ({ className = '' }) => (
  <div className={`absolute w-2 h-3 bg-orange-500 rounded-t-full animate-pulse ${className}`}>
    <div className="absolute bottom-0 left-1/2 transform -translate-x-1/2 w-1 h-2 bg-red-600 rounded-t-full"></div>
  </div>
);

// Burning effect wrapper
const Burning: React.FC<{ children: React.ReactNode }> = ({ children }) => (
  <div className="relative">
    {children}
    <Flame className="-top-1 left-1/3" />
    <Flame className="-top-2 left-1/2 scale-75" />
    <Flame className="-top-1 left-2/3" />
    <Flame className="top-0 left-1/4 scale-50" />
    <Flame className="top-0 left-3/4 scale-50" />
  </div>
);

// Bus component
const Bus: React.FC<{ burning?: boolean; className?: string }> = ({ burning = false, className = '' }) => {
  const content = (
    <div className={`w-20 h-10 bg-blue-600 rounded-md border-2 border-black relative flex items-center justify-around p-1 ${className}`}>
      {/* Windows */}
      {[...Array(3)].map((_, i) => (
        <div key={i} className="w-4 h-4 bg-gray-300 opacity-75 rounded-sm"></div>
      ))}
      {/* Wheels */}
      <div className="absolute -bottom-1 left-2 w-4 h-4 bg-black rounded-full"></div>
      <div className="absolute -bottom-1 right-2 w-4 h-4 bg-black rounded-full"></div>
    </div>
  );
  return burning ? <Burning>{content}</Burning> : content;
};

// Car component
const Car: React.FC<{ burning?: boolean; className?: string }> = ({ burning = false, className = '' }) => {
  const content = (
    <div className={`w-14 h-7 bg-red-600 rounded-md border-2 border-black relative flex items-center justify-around p-1 ${className}`}>
       {/* Window */}
       <div className="w-6 h-4 bg-gray-300 opacity-75 rounded-sm"></div>
       {/* Wheels */}
       <div className="absolute -bottom-1 left-1 w-3 h-3 bg-black rounded-full"></div>
       <div className="absolute -bottom-1 right-1 w-3 h-3 bg-black rounded-full"></div>
    </div>
  );
  return burning ? <Burning>{content}</Burning> : content;
};


// Slingshot component
const Slingshot: React.FC<{ children?: React.ReactNode, launched: boolean }> = ({ children, launched }) => (
  <div className="absolute bottom-1/4 left-1/4 transform -translate-x-1/2 z-10">
    <div className="relative w-24 h-32">
      {/* Poles */}
      <div className="absolute bottom-0 left-0 w-4 h-24 bg-yellow-800 rounded-t-md transform -rotate-12"></div>
      <div className="absolute bottom-0 right-0 w-4 h-24 bg-yellow-800 rounded-t-md transform rotate-12"></div>
      {/* Band */}
      <div className={`absolute top-0 left-2 w-20 h-12 border-4 border-gray-700 rounded-b-full transition-transform duration-500 ease-out ${launched ? 'translate-y-0 opacity-0' : '-translate-y-4'}`}>
          <div className={`absolute bottom-0 left-1/2 transform -translate-x-1/2 ${launched ? 'opacity-0' : 'opacity-100'}`}>
            {children}
          </div>
      </div>
    </div>
  </div>
);

// Collapsed Bridge component
const CollapsedBridge: React.FC = () => (
    <div className="absolute top-1/4 left-1/3 transform rotate-12 w-24">
        <div className="h-4 bg-gray-700 "></div>
        <div className="h-4 bg-yellow-600 transform rotate-6 translate-y-1"></div>
        <div className="h-4 bg-gray-600 transform -rotate-4 -translate-y-1"></div>
        <div className="text-center text-xs text-red-700 font-bold mt-1">BRIDGE OUT</div>
    </div>
);


export default function DisasterScene() {
  const [launched, setLaunched] = useState(false);

  const handleLaunch = () => {
    setLaunched(true);
  };

  const handleReset = () => {
    setLaunched(false);
  }

  return (
    <div className="flex flex-col items-center justify-center min-h-screen bg-gradient-to-b from-sky-400 to-sky-600 p-4">
      <div className="relative w-full max-w-4xl h-[600px] bg-green-600 rounded-lg shadow-xl overflow-hidden border-4 border-black">
        {/* Hillside Right */}
        <div className="absolute top-0 right-0 bottom-0 w-1/3 bg-green-700 skew-x-[-15deg] origin-top-left"></div>

        {/* Road */}
        <div className="absolute bottom-0 left-1/2 transform -translate-x-1/2 w-1/4 h-3/4 bg-gray-500">
          {/* Fork */}
          <div className="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-full h-1/2 flex">
            {/* Left Fork */}
            <div className="absolute top-0 left-0 w-1/2 h-full bg-gray-500 transform -rotate-12 origin-bottom-left"></div>
             {/* Right Fork */}
            <div className="absolute top-0 right-0 w-1/2 h-full bg-gray-500 transform rotate-12 origin-bottom-right"></div>
          </div>
           {/* Dashed Line */}
           <div className="absolute inset-x-0 bottom-0 top-1/2 flex flex-col items-center">
                {[...Array(5)].map((_, i) => (
                    <div key={i} className="w-1 h-4 bg-yellow-300 mb-4"></div>
                ))}
            </div>
        </div>

         {/* Collapsed Bridge Area */}
         <div className="absolute top-[20%] left-[30%]">
             <CollapsedBridge />
         </div>

        {/* Slingshot */}
        <Slingshot launched={launched}>
          {!launched && <Bus burning className="scale-75 transform translate-y-2" />}
        </Slingshot>

        {/* Launched Bus */}
        <div
          className={`absolute bottom-1/3 left-1/4 transform transition-all duration-1000 ease-in-out z-20 ${
            launched
              ? 'translate-x-[150px] translate-y-[-150px] rotate-45 scale-90' // Move towards fork
              : '-translate-x-1/2 opacity-0 scale-50' // Hidden initially or in slingshot
          }`}
        >
         {launched && <Bus burning className="scale-75" />}
        </div>


        {/* Crashing Vehicles on Right Hill */}
        <div className="absolute top-1/3 right-[10%] transform -rotate-12 z-10">
            <Bus burning className="mb-4 scale-90"/>
        </div>
        <div className="absolute top-1/2 right-[15%] transform -rotate-12 z-10">
             <Car burning className="scale-90"/>
        </div>


      </div>

      <div className="mt-6 flex space-x-4">
         <button
            onClick={handleLaunch}
            disabled={launched}
            className={`px-6 py-2 rounded-lg text-white font-semibold shadow-md transition-colors duration-300 ${
              launched
                ? 'bg-gray-400 cursor-not-allowed'
                : 'bg-red-600 hover:bg-red-700'
            }`}
          >
            Launch Bus!
          </button>
          <button
            onClick={handleReset}
            className="px-6 py-2 rounded-lg text-white font-semibold shadow-md transition-colors duration-300 bg-blue-600 hover:bg-blue-700"
          >
            Reset
          </button>
      </div>

    </div>
  );
}