create-nextjs-stack 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/bin/cli.js +187 -0
  4. package/package.json +48 -0
  5. package/templates/admin/.env.example +11 -0
  6. package/templates/admin/README.md +82 -0
  7. package/templates/admin/app/(auth)/login/page.tsx +84 -0
  8. package/templates/admin/app/(dashboard)/[resource]/[id]/page.tsx +45 -0
  9. package/templates/admin/app/(dashboard)/[resource]/new/page.tsx +32 -0
  10. package/templates/admin/app/(dashboard)/[resource]/page.tsx +131 -0
  11. package/templates/admin/app/(dashboard)/categories/[id]/page.tsx +22 -0
  12. package/templates/admin/app/(dashboard)/categories/new/page.tsx +5 -0
  13. package/templates/admin/app/(dashboard)/categories/page.tsx +33 -0
  14. package/templates/admin/app/(dashboard)/clients/[id]/page.tsx +22 -0
  15. package/templates/admin/app/(dashboard)/clients/new/page.tsx +5 -0
  16. package/templates/admin/app/(dashboard)/clients/page.tsx +33 -0
  17. package/templates/admin/app/(dashboard)/dashboard/page.tsx +45 -0
  18. package/templates/admin/app/(dashboard)/layout.tsx +13 -0
  19. package/templates/admin/app/(dashboard)/products/[id]/page.tsx +22 -0
  20. package/templates/admin/app/(dashboard)/products/new/page.tsx +5 -0
  21. package/templates/admin/app/(dashboard)/products/page.tsx +33 -0
  22. package/templates/admin/app/(dashboard)/projects/[id]/page.tsx +22 -0
  23. package/templates/admin/app/(dashboard)/projects/new/page.tsx +5 -0
  24. package/templates/admin/app/(dashboard)/projects/page.tsx +33 -0
  25. package/templates/admin/app/(dashboard)/users/[id]/page.tsx +22 -0
  26. package/templates/admin/app/(dashboard)/users/new/page.tsx +5 -0
  27. package/templates/admin/app/(dashboard)/users/page.tsx +33 -0
  28. package/templates/admin/app/actions/resources.ts +46 -0
  29. package/templates/admin/app/actions/upload.ts +58 -0
  30. package/templates/admin/app/favicon.ico +0 -0
  31. package/templates/admin/app/globals.css +23 -0
  32. package/templates/admin/app/layout.tsx +23 -0
  33. package/templates/admin/app/page.tsx +5 -0
  34. package/templates/admin/components/admin/AdminLayoutClient.tsx +22 -0
  35. package/templates/admin/components/admin/DeleteModal.tsx +90 -0
  36. package/templates/admin/components/admin/FormLayout.tsx +113 -0
  37. package/templates/admin/components/admin/ImageUpload.tsx +137 -0
  38. package/templates/admin/components/admin/ResourceFormClient.tsx +62 -0
  39. package/templates/admin/components/admin/Sidebar.tsx +74 -0
  40. package/templates/admin/components/admin/SubmitButton.tsx +34 -0
  41. package/templates/admin/components/admin/ToastProvider.tsx +8 -0
  42. package/templates/admin/components/categories/CategoryForm.tsx +24 -0
  43. package/templates/admin/components/categories/CategoryList.tsx +113 -0
  44. package/templates/admin/components/clients/ClientForm.tsx +24 -0
  45. package/templates/admin/components/clients/ClientList.tsx +113 -0
  46. package/templates/admin/components/products/ProductForm.tsx +24 -0
  47. package/templates/admin/components/products/ProductList.tsx +117 -0
  48. package/templates/admin/components/projects/ProjectForm.tsx +24 -0
  49. package/templates/admin/components/projects/ProjectList.tsx +121 -0
  50. package/templates/admin/components/users/UserForm.tsx +39 -0
  51. package/templates/admin/components/users/UserList.tsx +101 -0
  52. package/templates/admin/config/resources.ts +123 -0
  53. package/templates/admin/eslint.config.mjs +18 -0
  54. package/templates/admin/hooks/useResource.ts +86 -0
  55. package/templates/admin/lib/services/base.service.ts +106 -0
  56. package/templates/admin/lib/services/categories.service.ts +7 -0
  57. package/templates/admin/lib/services/clients.service.ts +7 -0
  58. package/templates/admin/lib/services/index.ts +27 -0
  59. package/templates/admin/lib/services/products.service.ts +9 -0
  60. package/templates/admin/lib/services/projects.service.ts +22 -0
  61. package/templates/admin/lib/services/resource.service.ts +26 -0
  62. package/templates/admin/lib/services/users.service.ts +9 -0
  63. package/templates/admin/lib/supabase/client.ts +9 -0
  64. package/templates/admin/lib/supabase/middleware.ts +57 -0
  65. package/templates/admin/lib/supabase/server.ts +29 -0
  66. package/templates/admin/middleware.ts +15 -0
  67. package/templates/admin/next.config.ts +10 -0
  68. package/templates/admin/package-lock.json +6768 -0
  69. package/templates/admin/package.json +33 -0
  70. package/templates/admin/postcss.config.mjs +7 -0
  71. package/templates/admin/public/file.svg +1 -0
  72. package/templates/admin/public/globe.svg +1 -0
  73. package/templates/admin/public/next.svg +1 -0
  74. package/templates/admin/public/vercel.svg +1 -0
  75. package/templates/admin/public/window.svg +1 -0
  76. package/templates/admin/supabase_mock_data.sql +57 -0
  77. package/templates/admin/supabase_schema.sql +93 -0
  78. package/templates/admin/tsconfig.json +34 -0
  79. package/templates/web/.env.example +21 -0
  80. package/templates/web/README.md +129 -0
  81. package/templates/web/components.json +22 -0
  82. package/templates/web/eslint.config.mjs +25 -0
  83. package/templates/web/next.config.ts +25 -0
  84. package/templates/web/package-lock.json +6778 -0
  85. package/templates/web/package.json +45 -0
  86. package/templates/web/postcss.config.mjs +5 -0
  87. package/templates/web/src/app/api/contact/route.ts +181 -0
  88. package/templates/web/src/app/api/revalidate/route.ts +95 -0
  89. package/templates/web/src/app/error.tsx +28 -0
  90. package/templates/web/src/app/globals.css +838 -0
  91. package/templates/web/src/app/layout.tsx +126 -0
  92. package/templates/web/src/app/loading.tsx +60 -0
  93. package/templates/web/src/app/not-found.tsx +68 -0
  94. package/templates/web/src/app/page.tsx +106 -0
  95. package/templates/web/src/app/robots.ts +12 -0
  96. package/templates/web/src/app/sitemap.ts +66 -0
  97. package/templates/web/src/components/home/StatsGrid.tsx +89 -0
  98. package/templates/web/src/hooks/useIntersectionObserver.ts +39 -0
  99. package/templates/web/src/lib/providers/StoreProvider.tsx +12 -0
  100. package/templates/web/src/lib/seo/index.ts +4 -0
  101. package/templates/web/src/lib/seo/metadata.ts +103 -0
  102. package/templates/web/src/lib/seo/seo.config.ts +161 -0
  103. package/templates/web/src/lib/seo/seo.types.ts +76 -0
  104. package/templates/web/src/lib/services/categories.service.ts +38 -0
  105. package/templates/web/src/lib/services/categoryService.ts +251 -0
  106. package/templates/web/src/lib/services/clientService.ts +132 -0
  107. package/templates/web/src/lib/services/clients.service.ts +20 -0
  108. package/templates/web/src/lib/services/productService.ts +261 -0
  109. package/templates/web/src/lib/services/products.service.ts +38 -0
  110. package/templates/web/src/lib/services/projectService.ts +234 -0
  111. package/templates/web/src/lib/services/projects.service.ts +38 -0
  112. package/templates/web/src/lib/services/users.service.ts +20 -0
  113. package/templates/web/src/lib/supabase/client.ts +42 -0
  114. package/templates/web/src/lib/supabase/constants.ts +25 -0
  115. package/templates/web/src/lib/supabase/server.ts +29 -0
  116. package/templates/web/src/lib/supabase/types.ts +112 -0
  117. package/templates/web/src/lib/utils/cache.ts +98 -0
  118. package/templates/web/src/lib/utils/rate-limiter.ts +102 -0
  119. package/templates/web/src/store/actions/index.ts +2 -0
  120. package/templates/web/src/store/index.ts +13 -0
  121. package/templates/web/src/store/reducers/index.ts +13 -0
  122. package/templates/web/src/store/types/index.ts +2 -0
  123. package/templates/web/tsconfig.json +41 -0
@@ -0,0 +1,838 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ @theme inline {
7
+ --color-background: var(--background);
8
+ --color-foreground: var(--foreground);
9
+ --font-sans: var(--font-geist-sans);
10
+ --font-mono: var(--font-geist-mono);
11
+ --font-jersey: var(--font-jersey-10);
12
+ --font-inter: var(--font-inter);
13
+ --font-outfit: var(--font-outfit);
14
+ --font-roboto: var(--font-roboto);
15
+ --font-raleway: var(--font-raleway);
16
+ --color-sidebar-ring: var(--sidebar-ring);
17
+ --color-sidebar-border: var(--sidebar-border);
18
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
19
+ --color-sidebar-accent: var(--sidebar-accent);
20
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
21
+ --color-sidebar-primary: var(--sidebar-primary);
22
+ --color-sidebar-foreground: var(--sidebar-foreground);
23
+ --color-sidebar: var(--sidebar);
24
+ --color-chart-5: var(--chart-5);
25
+ --color-chart-4: var(--chart-4);
26
+ --color-chart-3: var(--chart-3);
27
+ --color-chart-2: var(--chart-2);
28
+ --color-chart-1: var(--chart-1);
29
+ --color-ring: var(--ring);
30
+ --color-input: var(--input);
31
+ --color-border: var(--border);
32
+ --color-destructive: var(--destructive);
33
+ --color-accent-foreground: var(--accent-foreground);
34
+ --color-accent: var(--accent);
35
+ --color-muted-foreground: var(--muted-foreground);
36
+ --color-muted: var(--muted);
37
+ --color-secondary-foreground: var(--secondary-foreground);
38
+ --color-secondary: var(--secondary);
39
+ --color-primary-foreground: var(--primary-foreground);
40
+ --color-primary: var(--primary);
41
+ --color-popover-foreground: var(--popover-foreground);
42
+ --color-popover: var(--popover);
43
+ --color-card-foreground: var(--card-foreground);
44
+ --color-card: var(--card);
45
+ --radius-sm: calc(var(--radius) - 4px);
46
+ --radius-md: calc(var(--radius) - 2px);
47
+ --radius-lg: var(--radius);
48
+ --radius-xl: calc(var(--radius) + 4px);
49
+ --radius-2xl: calc(var(--radius) + 8px);
50
+ --radius-3xl: calc(var(--radius) + 12px);
51
+ --radius-4xl: calc(var(--radius) + 16px);
52
+
53
+ /* Z-Index Hierarchy */
54
+ --z-base: 1;
55
+ --z-dropdown: 1000;
56
+ --z-sticky: 1020;
57
+ --z-fixed: 1030;
58
+ --z-modal-backdrop: 1040;
59
+ --z-modal: 1050;
60
+ --z-popover: 1060;
61
+ --z-tooltip: 1070;
62
+ --z-lightbox: 9999;
63
+ --z-lightbox-controls: 10000;
64
+
65
+ /* Z-Index Utilities */
66
+ --z-base: 1;
67
+ --z-dropdown: 1000;
68
+ --z-sticky: 1020;
69
+ --z-fixed: 1030;
70
+ --z-modal-backdrop: 1040;
71
+ --z-modal: 1050;
72
+ --z-popover: 1060;
73
+ --z-tooltip: 1070;
74
+ --z-lightbox: 9999;
75
+ --z-lightbox-controls: 10000;
76
+ }
77
+
78
+ :root {
79
+ --radius: 0.625rem;
80
+ --background: oklch(1 0 0);
81
+ --foreground: oklch(0.141 0.005 285.823);
82
+ --card: oklch(1 0 0);
83
+ --card-foreground: oklch(0.141 0.005 285.823);
84
+ --popover: oklch(1 0 0);
85
+ --popover-foreground: oklch(0.141 0.005 285.823);
86
+ --primary: oklch(0.21 0.006 285.885);
87
+ --primary-foreground: oklch(0.985 0 0);
88
+ --secondary: oklch(0.967 0.001 286.375);
89
+ --secondary-foreground: oklch(0.21 0.006 285.885);
90
+ --muted: oklch(0.967 0.001 286.375);
91
+ --muted-foreground: oklch(0.552 0.016 285.938);
92
+ --accent: oklch(0.967 0.001 286.375);
93
+ --accent-foreground: oklch(0.21 0.006 285.885);
94
+ --destructive: oklch(0.577 0.245 27.325);
95
+ --border: oklch(0.92 0.004 286.32);
96
+ --input: oklch(0.92 0.004 286.32);
97
+ --ring: oklch(0.705 0.015 286.067);
98
+ --chart-1: oklch(0.646 0.222 41.116);
99
+ --chart-2: oklch(0.6 0.118 184.704);
100
+ --chart-3: oklch(0.398 0.07 227.392);
101
+ --chart-4: oklch(0.828 0.189 84.429);
102
+ --chart-5: oklch(0.769 0.188 70.08);
103
+ --sidebar: oklch(0.985 0 0);
104
+ --sidebar-foreground: oklch(0.141 0.005 285.823);
105
+ --sidebar-primary: oklch(0.21 0.006 285.885);
106
+ --sidebar-primary-foreground: oklch(0.985 0 0);
107
+ --sidebar-accent: oklch(0.967 0.001 286.375);
108
+ --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
109
+ --sidebar-border: oklch(0.92 0.004 286.32);
110
+ --sidebar-ring: oklch(0.705 0.015 286.067);
111
+ }
112
+
113
+ .dark {
114
+ --background: oklch(0.141 0.005 285.823);
115
+ --foreground: oklch(0.985 0 0);
116
+ --card: oklch(0.21 0.006 285.885);
117
+ --card-foreground: oklch(0.985 0 0);
118
+ --popover: oklch(0.21 0.006 285.885);
119
+ --popover-foreground: oklch(0.985 0 0);
120
+ --primary: oklch(0.92 0.004 286.32);
121
+ --primary-foreground: oklch(0.21 0.006 285.885);
122
+ --secondary: oklch(0.274 0.006 286.033);
123
+ --secondary-foreground: oklch(0.985 0 0);
124
+ --muted: oklch(0.274 0.006 286.033);
125
+ --muted-foreground: oklch(0.705 0.015 286.067);
126
+ --accent: oklch(0.274 0.006 286.033);
127
+ --accent-foreground: oklch(0.985 0 0);
128
+ --destructive: oklch(0.704 0.191 22.216);
129
+ --border: oklch(1 0 0 / 10%);
130
+ --input: oklch(1 0 0 / 15%);
131
+ --ring: oklch(0.552 0.016 285.938);
132
+ --chart-1: oklch(0.488 0.243 264.376);
133
+ --chart-2: oklch(0.696 0.17 162.48);
134
+ --chart-3: oklch(0.769 0.188 70.08);
135
+ --chart-4: oklch(0.627 0.265 303.9);
136
+ --chart-5: oklch(0.645 0.246 16.439);
137
+ --sidebar: oklch(0.21 0.006 285.885);
138
+ --sidebar-foreground: oklch(0.985 0 0);
139
+ --sidebar-primary: oklch(0.488 0.243 264.376);
140
+ --sidebar-primary-foreground: oklch(0.985 0 0);
141
+ --sidebar-accent: oklch(0.274 0.006 286.033);
142
+ --sidebar-accent-foreground: oklch(0.985 0 0);
143
+ --sidebar-border: oklch(1 0 0 / 10%);
144
+ --sidebar-ring: oklch(0.552 0.016 285.938);
145
+ }
146
+
147
+ @layer base {
148
+ * {
149
+ @apply border-border outline-ring/50;
150
+ }
151
+
152
+ body {
153
+ @apply bg-background text-foreground;
154
+ overflow-x: hidden;
155
+ }
156
+ }
157
+
158
+ /* Full-Page Scroll Snap Styles */
159
+ /* Full-Page Scroll Snap Styles Removed - Using Framer Motion Slider */
160
+ .scroll-container {
161
+ height: 100vh;
162
+ overflow: hidden;
163
+ /* Prevent native scroll */
164
+ }
165
+
166
+ .section {
167
+ height: 100vh;
168
+ width: 100%;
169
+ }
170
+
171
+ @layer utilities {
172
+ /* Z-Index Utility Classes */
173
+ .z-base {
174
+ z-index: 1;
175
+ }
176
+
177
+ .z-dropdown {
178
+ z-index: 1000;
179
+ }
180
+
181
+ .z-sticky {
182
+ z-index: 1020;
183
+ }
184
+
185
+ .z-fixed {
186
+ z-index: 1030;
187
+ }
188
+
189
+ .z-modal-backdrop {
190
+ z-index: 1040;
191
+ }
192
+
193
+ .z-modal {
194
+ z-index: 1050;
195
+ }
196
+
197
+ .z-popover {
198
+ z-index: 1060;
199
+ }
200
+
201
+ .z-tooltip {
202
+ z-index: 1070;
203
+ }
204
+
205
+ .z-lightbox {
206
+ z-index: 9999;
207
+ }
208
+
209
+ .z-lightbox-controls {
210
+ z-index: 10000;
211
+ }
212
+
213
+ /* Scrollbar Hide Utility */
214
+ .scrollbar-hide,
215
+ .hide-scrollbar {
216
+ -ms-overflow-style: none;
217
+ scrollbar-width: none;
218
+ }
219
+
220
+ .scrollbar-hide::-webkit-scrollbar,
221
+ .hide-scrollbar::-webkit-scrollbar {
222
+ display: none;
223
+ }
224
+
225
+ /* No Scrollbar Utility */
226
+ .no-scrollbar {
227
+ -ms-overflow-style: none;
228
+ scrollbar-width: none;
229
+ }
230
+
231
+ .no-scrollbar::-webkit-scrollbar {
232
+ display: none;
233
+ }
234
+
235
+ .mask-gradient-x {
236
+ mask-image: linear-gradient(
237
+ to right,
238
+ transparent,
239
+ black 20px,
240
+ black 90%,
241
+ transparent
242
+ );
243
+ -webkit-mask-image: linear-gradient(
244
+ to right,
245
+ transparent,
246
+ black 20px,
247
+ black 90%,
248
+ transparent
249
+ );
250
+ }
251
+ }
252
+
253
+ @layer utilities {
254
+ @keyframes float {
255
+ 0%,
256
+ 100% {
257
+ transform: translateY(0px);
258
+ }
259
+
260
+ 50% {
261
+ transform: translateY(-20px);
262
+ }
263
+ }
264
+
265
+ .animate-float {
266
+ animation: float 6s ease-in-out infinite;
267
+ }
268
+
269
+ /* Crane Animations */
270
+ @keyframes moveCrane {
271
+ 0%,
272
+ 20% {
273
+ transform: rotateY(0deg);
274
+ }
275
+
276
+ 70%,
277
+ 100% {
278
+ transform: rotateY(45deg);
279
+ }
280
+ }
281
+
282
+ @keyframes moveWeight {
283
+ 0%,
284
+ 20% {
285
+ transform: rotateY(0deg) translateX(0);
286
+ }
287
+
288
+ 70%,
289
+ 100% {
290
+ transform: rotateY(45deg) translateX(-50%);
291
+ }
292
+ }
293
+
294
+ @keyframes moveLineOne {
295
+ 0%,
296
+ 20% {
297
+ transform: rotateY(0deg) rotateZ(-10deg);
298
+ }
299
+
300
+ 70%,
301
+ 100% {
302
+ transform: rotateY(45deg) rotateZ(-10deg);
303
+ }
304
+ }
305
+
306
+ @keyframes moveLineTwo {
307
+ 0%,
308
+ 20% {
309
+ transform: rotateY(0deg) rotateZ(29deg);
310
+ }
311
+
312
+ 70%,
313
+ 100% {
314
+ transform: rotateY(15deg) rotateZ(29deg);
315
+ }
316
+ }
317
+
318
+ @keyframes moveLineThree {
319
+ 0% {
320
+ transform: translate(0, 0);
321
+ }
322
+
323
+ 20% {
324
+ transform: translate(2500%, -18%);
325
+ }
326
+
327
+ 60% {
328
+ transform: translate(11000%, -25%);
329
+ }
330
+
331
+ 70% {
332
+ transform: translate(9100%, -25%);
333
+ height: 30%;
334
+ }
335
+
336
+ 90%,
337
+ 100% {
338
+ transform: translate(9100%, -15%);
339
+ height: 80%;
340
+ }
341
+ }
342
+ }
343
+
344
+ /* Crane Specific Styles */
345
+ .crane div {
346
+ border-radius: 2px;
347
+ position: absolute;
348
+ }
349
+
350
+ .crane .line {
351
+ border: none;
352
+ background: tomato;
353
+ outline: 1px solid transparent;
354
+ z-index: 0;
355
+ }
356
+
357
+ .crane .lineOne {
358
+ width: 60%;
359
+ left: 11%;
360
+ top: 0;
361
+ transform-origin: right 0;
362
+ animation: moveLineOne 12s infinite alternate;
363
+ }
364
+
365
+ .crane .lineTwo {
366
+ width: 19%;
367
+ right: 8%;
368
+ top: 0;
369
+ transform-origin: top left;
370
+ animation: moveLineTwo 12s infinite alternate;
371
+ }
372
+
373
+ .crane .line.lineThree {
374
+ height: 30%;
375
+ top: 22%;
376
+ left: 9%;
377
+ transform-origin: right center;
378
+ animation: moveLineThree 12s ease-in-out infinite alternate;
379
+ }
380
+
381
+ .crane .line.lineThree:after {
382
+ content: "";
383
+ position: absolute;
384
+ height: 0.2em;
385
+ width: 9000%;
386
+ background: rgb(255, 140, 114);
387
+ display: block;
388
+ bottom: 0;
389
+ left: -4500%;
390
+ border: solid 1px tomato;
391
+ }
392
+
393
+ .crane-two .line.lineThree:after {
394
+ height: 0.1em;
395
+ }
396
+
397
+ .crane-three .line.lineThree:after {
398
+ height: 0.05em;
399
+ }
400
+
401
+ .crane .stand {
402
+ height: 100%;
403
+ width: 5%;
404
+ right: 25%;
405
+ z-index: 1;
406
+ background: linear-gradient(to top, tomato, rgb(255, 179, 169));
407
+ }
408
+
409
+ .crane-two .stand {
410
+ background: linear-gradient(to top, tomato, rgb(255, 169, 157));
411
+ }
412
+
413
+ .crane-three .stand {
414
+ background: linear-gradient(to top, tomato, rgb(255, 159, 145));
415
+ }
416
+
417
+ .crane .weight {
418
+ height: 20%;
419
+ width: 8%;
420
+ right: 4%;
421
+ top: 12%;
422
+ z-index: 2;
423
+ background: rgb(255, 169, 157);
424
+ transform-origin: 0 center;
425
+ animation: moveWeight 12s infinite alternate;
426
+ }
427
+
428
+ .crane-two .weight {
429
+ background: rgb(255, 159, 145);
430
+ animation-delay: 3s;
431
+ }
432
+
433
+ .crane-three .weight {
434
+ background: rgb(255, 149, 133);
435
+ animation-delay: 1.5s;
436
+ }
437
+
438
+ .crane .cabin {
439
+ height: 9%;
440
+ width: 12%;
441
+ right: 24%;
442
+ top: 20%;
443
+ z-index: 2;
444
+ background: rgb(255, 169, 157);
445
+ transform-origin: 80% center;
446
+ animation: moveCrane 12s infinite alternate;
447
+ }
448
+
449
+ .crane .cabin:after {
450
+ content: "";
451
+ position: absolute;
452
+ height: 10%;
453
+ width: 100%;
454
+ background: white;
455
+ display: block;
456
+ top: 60%;
457
+ left: 0;
458
+ }
459
+
460
+ .crane-two .cabin {
461
+ background: rgb(255, 159, 145);
462
+ animation-delay: 3s;
463
+ }
464
+
465
+ .crane-three .cabin {
466
+ background: rgb(255, 149, 133);
467
+ animation-delay: 1.5s;
468
+ }
469
+
470
+ .crane .arm {
471
+ height: 7%;
472
+ width: 100%;
473
+ top: 15%;
474
+ z-index: 3;
475
+ background: rgb(255, 169, 157);
476
+ border-top-left-radius: 10px;
477
+ transform-origin: 80% center;
478
+ animation: moveCrane 12s infinite alternate;
479
+ }
480
+
481
+ .crane-two .arm {
482
+ background: rgb(255, 159, 145);
483
+ animation-delay: 3s;
484
+ }
485
+
486
+ .crane-three .arm {
487
+ background: rgb(255, 149, 133);
488
+ animation-delay: 1.5s;
489
+ }
490
+
491
+ /* Crane size specific */
492
+ .crane-one div {
493
+ border: solid 1px tomato;
494
+ }
495
+
496
+ .crane-one .line {
497
+ height: 1px;
498
+ }
499
+
500
+ .crane-one .lineThree {
501
+ width: 1px;
502
+ }
503
+
504
+ .crane-two div {
505
+ border: solid 1px tomato;
506
+ }
507
+
508
+ .crane-two .line {
509
+ height: 0.77px;
510
+ }
511
+
512
+ .crane-two .lineThree {
513
+ width: 0.71px;
514
+ animation-delay: 3s;
515
+ }
516
+
517
+ .crane-three div {
518
+ border: solid 1px tomato;
519
+ }
520
+
521
+ .crane-three .line {
522
+ height: 0.5px;
523
+ }
524
+
525
+ .crane-three .lineThree {
526
+ width: 0.5px;
527
+ animation-delay: 1.5s;
528
+ }
529
+
530
+ /* Buildings */
531
+ .building-window {
532
+ content: "";
533
+ width: 80%;
534
+ height: 60%;
535
+ left: 10%;
536
+ bottom: 11%;
537
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAFElEQVQImWP4////fwYYIJKDEwAAfPsP8eFXG40AAAAASUVORK5CYII=")
538
+ repeat;
539
+ position: absolute;
540
+ }
541
+
542
+ .building-window-2 {
543
+ content: "";
544
+ width: 60%;
545
+ height: 60%;
546
+ left: 11%;
547
+ bottom: 30%;
548
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAFElEQVQImWP4////fwYYIJKDEwAAfPsP8eFXG40AAAAASUVORK5CYII=")
549
+ repeat;
550
+ position: absolute;
551
+ }
552
+
553
+ .building-window-3 {
554
+ content: "";
555
+ width: 20%;
556
+ height: 85%;
557
+ left: 70%;
558
+ bottom: 0;
559
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAFElEQVQImWP4////fwYYIJKDEwAAfPsP8eFXG40AAAAASUVORK5CYII=")
560
+ repeat;
561
+ position: absolute;
562
+ }
563
+
564
+ .building-window-5 {
565
+ content: "";
566
+ width: 40%;
567
+ height: 85%;
568
+ left: 20%;
569
+ bottom: 0;
570
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAFElEQVQImWP4////fwYYIJKDEwAAfPsP8eFXG40AAAAASUVORK5CYII=")
571
+ repeat;
572
+ position: absolute;
573
+ }
574
+
575
+ /* Welding Crane Scene Styles */
576
+ .welding-sky {
577
+ background: linear-gradient(
578
+ to bottom,
579
+ #000508 0%,
580
+ #163c52 25%,
581
+ #4f4f47 40%,
582
+ #c5752d 53%,
583
+ #b7490f 85%,
584
+ #2f1107 100%
585
+ );
586
+ }
587
+
588
+ .sun {
589
+ border-radius: 50%;
590
+ background: radial-gradient(
591
+ circle,
592
+ #ffe483 0%,
593
+ #ffc700 10%,
594
+ #ff8117 11%,
595
+ #f5740300 35%,
596
+ #f5740300 100%
597
+ );
598
+ }
599
+
600
+ .background {
601
+ margin: 0 -20px;
602
+ margin-bottom: -10px;
603
+ }
604
+
605
+ .limit {
606
+ max-width: 100vh;
607
+ width: calc((768 / 1024) * 107%);
608
+ }
609
+
610
+ .weld-container,
611
+ .spark-container {
612
+ width: 10px;
613
+ height: 10px;
614
+ position: absolute;
615
+ }
616
+
617
+ .weld-container:first-child,
618
+ .spark-container:first-child {
619
+ left: 81.2%;
620
+ top: 50.2%;
621
+ }
622
+
623
+ .weld-container:last-child,
624
+ .spark-container:last-child {
625
+ left: 52%;
626
+ top: 71.9%;
627
+ }
628
+
629
+ .light.red {
630
+ visibility: visible;
631
+ opacity: 1;
632
+ width: 1px;
633
+ height: 1px;
634
+ box-shadow: 0 0 5px 5px #ff1818;
635
+ background-color: #ff1818;
636
+ animation: strobe 3s steps(2, start) infinite;
637
+ animation-direction: alternate;
638
+ }
639
+
640
+ .light.top {
641
+ position: absolute;
642
+ top: 9%;
643
+ right: 29%;
644
+ }
645
+
646
+ .material.hidden {
647
+ visibility: hidden;
648
+ }
649
+
650
+ .material path,
651
+ .hook,
652
+ .trolly-movement,
653
+ .cable {
654
+ stroke: #000000;
655
+ fill: #000000;
656
+ }
657
+
658
+ .material path,
659
+ .hook,
660
+ .trolly-movement {
661
+ animation: move-trolly-components 45s infinite;
662
+ animation-timing-function: ease-in-out;
663
+ animation-direction: alternate;
664
+ }
665
+
666
+ .cable {
667
+ stroke-width: 1;
668
+ stroke: black;
669
+ fill: none;
670
+ stroke-dasharray: 485;
671
+ stroke-dashoffset: 485;
672
+ animation:
673
+ move-cable 45s infinite,
674
+ move-trolly-components 45s infinite;
675
+ animation-timing-function: ease-in-out;
676
+ animation-direction: alternate;
677
+ }
678
+
679
+ .weld {
680
+ opacity: 0;
681
+ width: 10px;
682
+ height: 10px;
683
+ border-radius: 50%;
684
+ animation: welding 8s infinite;
685
+ background: radial-gradient(
686
+ circle,
687
+ #ffffff 0%,
688
+ #ddedff 25%,
689
+ #e1ecf9 35%,
690
+ #cee4ff 40%,
691
+ rgb(186, 218, 255) 50%,
692
+ rgba(186, 218, 255, 0.4) 80%,
693
+ rgba(186, 218, 255, 0.1) 100%
694
+ );
695
+ }
696
+
697
+ .particle {
698
+ opacity: 0;
699
+ position: absolute;
700
+ background-color: rgba(255, 251, 209, 1);
701
+ }
702
+
703
+ .particle.negative-X {
704
+ animation:
705
+ sparks-neg-X 0.7s infinite,
706
+ welding 8s infinite;
707
+ }
708
+
709
+ .particle.positive-X {
710
+ animation:
711
+ sparks-pos-X 0.7s infinite,
712
+ welding 8s infinite;
713
+ }
714
+
715
+ @keyframes welding {
716
+ 0% {
717
+ opacity: 0;
718
+ }
719
+
720
+ 1% {
721
+ opacity: 1;
722
+ }
723
+
724
+ 2% {
725
+ opacity: 0;
726
+ }
727
+
728
+ 3% {
729
+ opacity: 1;
730
+ }
731
+
732
+ 4% {
733
+ opacity: 0;
734
+ }
735
+
736
+ 5% {
737
+ opacity: 1;
738
+ }
739
+
740
+ 11% {
741
+ opacity: 1;
742
+ }
743
+
744
+ 12% {
745
+ opacity: 0;
746
+ }
747
+
748
+ 13% {
749
+ opacity: 1;
750
+ }
751
+
752
+ 59% {
753
+ opacity: 1;
754
+ }
755
+
756
+ 60% {
757
+ opacity: 0;
758
+ }
759
+
760
+ 100% {
761
+ opacity: 0;
762
+ }
763
+ }
764
+
765
+ @keyframes sparks-neg-X {
766
+ 0% {
767
+ opacity: 1;
768
+ transform: translateY(0%);
769
+ }
770
+
771
+ 95% {
772
+ opacity: 1;
773
+ }
774
+
775
+ 100% {
776
+ opacity: 0;
777
+ transform: translateY(1500%) translateX(-5px);
778
+ }
779
+ }
780
+
781
+ @keyframes sparks-pos-X {
782
+ 0% {
783
+ opacity: 1;
784
+ transform: translateY(0%) rotate(0deg);
785
+ }
786
+
787
+ 93% {
788
+ opacity: 1;
789
+ }
790
+
791
+ 100% {
792
+ opacity: 0;
793
+ transform: translateY(1500%) translateX(5px);
794
+ }
795
+ }
796
+
797
+ @keyframes strobe {
798
+ to {
799
+ visibility: hidden;
800
+ opacity: 0;
801
+ }
802
+ }
803
+
804
+ @keyframes move-trolly-components {
805
+ 0% {
806
+ transform: translateX(-55%) translateY(-6.5%) scale(1.1);
807
+ }
808
+
809
+ 25% {
810
+ transform: translateX(-50%) translateY(-6.5%) scale(1.1);
811
+ }
812
+
813
+ 75% {
814
+ transform: translateX(-5%) translateY(0%) scale(1);
815
+ }
816
+
817
+ 100% {
818
+ transform: translateX(-5%) translateY(0%) scale(1);
819
+ }
820
+ }
821
+
822
+ @keyframes move-cable {
823
+ 0% {
824
+ stroke-dashoffset: 970;
825
+ }
826
+
827
+ 25% {
828
+ stroke-dashoffset: 543;
829
+ }
830
+
831
+ 75% {
832
+ stroke-dashoffset: 543;
833
+ }
834
+
835
+ 100% {
836
+ stroke-dashoffset: 970;
837
+ }
838
+ }