Spaces:
Running
Running
Update index.html
Browse files- index.html +724 -159
index.html
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
-
<title>AI
|
7 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
|
8 |
<style>
|
9 |
* {
|
@@ -53,6 +53,54 @@
|
|
53 |
color: #a8a8b3;
|
54 |
}
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
.methods-grid {
|
57 |
display: grid;
|
58 |
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
|
@@ -300,6 +348,132 @@
|
|
300 |
margin-top: 2rem;
|
301 |
}
|
302 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
303 |
@keyframes fadeInDown {
|
304 |
from {
|
305 |
opacity: 0;
|
@@ -334,198 +508,499 @@
|
|
334 |
.pros-cons {
|
335 |
grid-template-columns: 1fr;
|
336 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
337 |
}
|
338 |
</style>
|
339 |
</head>
|
340 |
<body>
|
341 |
<div class="container">
|
342 |
<header>
|
343 |
-
<h1>AI
|
344 |
-
<p class="subtitle">์ต์ ์
|
345 |
</header>
|
346 |
|
347 |
-
<div class="
|
348 |
-
|
349 |
-
<
|
350 |
-
|
351 |
-
|
352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
</div>
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
<
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
369 |
</div>
|
370 |
</div>
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
<
|
383 |
-
<
|
384 |
-
<
|
385 |
-
|
386 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
387 |
</div>
|
388 |
</div>
|
389 |
</div>
|
390 |
|
391 |
-
<!--
|
392 |
-
<div class="
|
393 |
-
<
|
394 |
-
|
395 |
-
<
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
412 |
</div>
|
413 |
</div>
|
414 |
-
<
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
<
|
420 |
-
<
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
<
|
427 |
-
|
428 |
-
|
429 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
430 |
</div>
|
431 |
</div>
|
432 |
</div>
|
|
|
433 |
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
<
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
<
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
<
|
454 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
455 |
</div>
|
456 |
</div>
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
473 |
</div>
|
474 |
</div>
|
475 |
-
</div>
|
476 |
-
</div>
|
477 |
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
<
|
485 |
-
<
|
486 |
-
|
487 |
-
|
488 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
489 |
</div>
|
490 |
-
|
491 |
-
|
492 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
493 |
</div>
|
494 |
-
|
495 |
-
|
496 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
497 |
</div>
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
<
|
503 |
-
<
|
504 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
505 |
</div>
|
506 |
-
</div>
|
507 |
-
<button class="calculate-btn" onclick="calculateCosts()">๋น์ฉ ๊ณ์ฐํ๊ธฐ</button>
|
508 |
|
509 |
-
|
510 |
-
<div class="
|
511 |
-
<div class="
|
512 |
-
<
|
513 |
-
<
|
514 |
-
<p>์ด๊ธฐ + ์ด์ ๋น์ฉ</p>
|
515 |
</div>
|
516 |
-
<div class="
|
517 |
-
<
|
518 |
-
|
519 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
520 |
</div>
|
521 |
-
<div class="
|
522 |
-
<
|
523 |
-
|
524 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
525 |
</div>
|
526 |
</div>
|
527 |
-
|
528 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
529 |
</div>
|
530 |
</div>
|
531 |
</div>
|
@@ -533,6 +1008,96 @@
|
|
533 |
|
534 |
<script>
|
535 |
let costChart = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
536 |
|
537 |
function calculateCosts() {
|
538 |
const scale = document.getElementById('projectScale').value;
|
@@ -618,7 +1183,7 @@
|
|
618 |
tension: 0.4
|
619 |
},
|
620 |
{
|
621 |
-
label: '
|
622 |
data: months.map(m => costs.platform.initial + (costs.platform.monthly * m * multiplier)),
|
623 |
borderColor: '#00f2fe',
|
624 |
backgroundColor: 'rgba(0, 242, 254, 0.1)',
|
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>AI SAAS Build Calculator</title>
|
7 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
|
8 |
<style>
|
9 |
* {
|
|
|
53 |
color: #a8a8b3;
|
54 |
}
|
55 |
|
56 |
+
.tabs {
|
57 |
+
display: flex;
|
58 |
+
justify-content: center;
|
59 |
+
margin-bottom: 3rem;
|
60 |
+
background: rgba(255, 255, 255, 0.05);
|
61 |
+
backdrop-filter: blur(10px);
|
62 |
+
border-radius: 15px;
|
63 |
+
padding: 0.5rem;
|
64 |
+
gap: 0.5rem;
|
65 |
+
}
|
66 |
+
|
67 |
+
.tab {
|
68 |
+
padding: 1rem 2rem;
|
69 |
+
background: transparent;
|
70 |
+
border: none;
|
71 |
+
color: #a8a8b3;
|
72 |
+
cursor: pointer;
|
73 |
+
border-radius: 10px;
|
74 |
+
transition: all 0.3s ease;
|
75 |
+
font-size: 1.1rem;
|
76 |
+
font-weight: 500;
|
77 |
+
}
|
78 |
+
|
79 |
+
.tab.active {
|
80 |
+
background: linear-gradient(45deg, #00d2ff, #3a7bd5);
|
81 |
+
color: #ffffff;
|
82 |
+
transform: scale(1.05);
|
83 |
+
}
|
84 |
+
|
85 |
+
.tab:hover:not(.active) {
|
86 |
+
background: rgba(255, 255, 255, 0.1);
|
87 |
+
color: #ffffff;
|
88 |
+
}
|
89 |
+
|
90 |
+
.tab-content {
|
91 |
+
display: none;
|
92 |
+
}
|
93 |
+
|
94 |
+
.tab-content.active {
|
95 |
+
display: block;
|
96 |
+
animation: fadeIn 0.5s ease;
|
97 |
+
}
|
98 |
+
|
99 |
+
@keyframes fadeIn {
|
100 |
+
from { opacity: 0; }
|
101 |
+
to { opacity: 1; }
|
102 |
+
}
|
103 |
+
|
104 |
.methods-grid {
|
105 |
display: grid;
|
106 |
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
|
|
|
348 |
margin-top: 2rem;
|
349 |
}
|
350 |
|
351 |
+
/* ๋ง์ถค ์ค๊ณ ์คํ์ผ */
|
352 |
+
.custom-design-container {
|
353 |
+
background: rgba(255, 255, 255, 0.05);
|
354 |
+
backdrop-filter: blur(10px);
|
355 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
356 |
+
border-radius: 20px;
|
357 |
+
padding: 2rem;
|
358 |
+
}
|
359 |
+
|
360 |
+
.component-section {
|
361 |
+
margin-bottom: 2.5rem;
|
362 |
+
}
|
363 |
+
|
364 |
+
.component-title {
|
365 |
+
font-size: 1.3rem;
|
366 |
+
margin-bottom: 1rem;
|
367 |
+
display: flex;
|
368 |
+
align-items: center;
|
369 |
+
gap: 0.5rem;
|
370 |
+
}
|
371 |
+
|
372 |
+
.component-icon {
|
373 |
+
width: 30px;
|
374 |
+
height: 30px;
|
375 |
+
background: linear-gradient(45deg, #00d2ff, #3a7bd5);
|
376 |
+
border-radius: 8px;
|
377 |
+
display: flex;
|
378 |
+
align-items: center;
|
379 |
+
justify-content: center;
|
380 |
+
font-size: 1.2rem;
|
381 |
+
}
|
382 |
+
|
383 |
+
.component-options {
|
384 |
+
display: grid;
|
385 |
+
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
386 |
+
gap: 1rem;
|
387 |
+
}
|
388 |
+
|
389 |
+
.option-card {
|
390 |
+
background: rgba(255, 255, 255, 0.05);
|
391 |
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
392 |
+
border-radius: 10px;
|
393 |
+
padding: 1rem;
|
394 |
+
cursor: pointer;
|
395 |
+
transition: all 0.3s ease;
|
396 |
+
position: relative;
|
397 |
+
overflow: hidden;
|
398 |
+
}
|
399 |
+
|
400 |
+
.option-card.selected {
|
401 |
+
background: rgba(58, 123, 213, 0.2);
|
402 |
+
border-color: #3a7bd5;
|
403 |
+
transform: scale(1.05);
|
404 |
+
}
|
405 |
+
|
406 |
+
.option-card:hover {
|
407 |
+
border-color: #00d2ff;
|
408 |
+
background: rgba(255, 255, 255, 0.1);
|
409 |
+
}
|
410 |
+
|
411 |
+
.option-name {
|
412 |
+
font-weight: 600;
|
413 |
+
margin-bottom: 0.5rem;
|
414 |
+
}
|
415 |
+
|
416 |
+
.option-details {
|
417 |
+
display: flex;
|
418 |
+
justify-content: space-between;
|
419 |
+
font-size: 0.9rem;
|
420 |
+
color: #a8a8b3;
|
421 |
+
}
|
422 |
+
|
423 |
+
.custom-result {
|
424 |
+
background: rgba(0, 0, 0, 0.3);
|
425 |
+
border-radius: 15px;
|
426 |
+
padding: 2rem;
|
427 |
+
margin-top: 2rem;
|
428 |
+
display: none;
|
429 |
+
}
|
430 |
+
|
431 |
+
.custom-summary {
|
432 |
+
display: grid;
|
433 |
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
434 |
+
gap: 2rem;
|
435 |
+
margin-bottom: 2rem;
|
436 |
+
}
|
437 |
+
|
438 |
+
.summary-item {
|
439 |
+
text-align: center;
|
440 |
+
}
|
441 |
+
|
442 |
+
.summary-label {
|
443 |
+
color: #a8a8b3;
|
444 |
+
margin-bottom: 0.5rem;
|
445 |
+
}
|
446 |
+
|
447 |
+
.summary-value {
|
448 |
+
font-size: 2rem;
|
449 |
+
font-weight: 700;
|
450 |
+
background: linear-gradient(45deg, #00d2ff, #3a7bd5);
|
451 |
+
-webkit-background-clip: text;
|
452 |
+
-webkit-text-fill-color: transparent;
|
453 |
+
}
|
454 |
+
|
455 |
+
.selected-components {
|
456 |
+
background: rgba(255, 255, 255, 0.05);
|
457 |
+
border-radius: 10px;
|
458 |
+
padding: 1.5rem;
|
459 |
+
}
|
460 |
+
|
461 |
+
.selected-components h4 {
|
462 |
+
margin-bottom: 1rem;
|
463 |
+
}
|
464 |
+
|
465 |
+
.component-list {
|
466 |
+
display: grid;
|
467 |
+
gap: 0.5rem;
|
468 |
+
}
|
469 |
+
|
470 |
+
.component-list-item {
|
471 |
+
display: flex;
|
472 |
+
justify-content: space-between;
|
473 |
+
padding: 0.5rem 0;
|
474 |
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
475 |
+
}
|
476 |
+
|
477 |
@keyframes fadeInDown {
|
478 |
from {
|
479 |
opacity: 0;
|
|
|
508 |
.pros-cons {
|
509 |
grid-template-columns: 1fr;
|
510 |
}
|
511 |
+
|
512 |
+
.tabs {
|
513 |
+
flex-direction: column;
|
514 |
+
}
|
515 |
+
|
516 |
+
.tab {
|
517 |
+
width: 100%;
|
518 |
+
}
|
519 |
}
|
520 |
</style>
|
521 |
</head>
|
522 |
<body>
|
523 |
<div class="container">
|
524 |
<header>
|
525 |
+
<h1>AI SAAS Build Calculator</h1>
|
526 |
+
<p class="subtitle">์ต์ ์ AI ์๋น์ค ๊ตฌ์ถ ๋ฐฉ์์ ์ฐพ์๋๋ฆฝ๋๋ค</p>
|
527 |
</header>
|
528 |
|
529 |
+
<div class="tabs">
|
530 |
+
<button class="tab active" onclick="switchTab('comparison')">๊ตฌ์ถ ๋ฐฉ์ ๋น๊ต</button>
|
531 |
+
<button class="tab" onclick="switchTab('custom')">๋๋ง์ ๋ง์ถค ์ค๊ณ</button>
|
532 |
+
</div>
|
533 |
+
|
534 |
+
<!-- ๊ตฌ์ถ ๋ฐฉ์ ๋น๊ต ํญ -->
|
535 |
+
<div id="comparison" class="tab-content active">
|
536 |
+
<div class="methods-grid">
|
537 |
+
<!-- ์ธ์ฃผ ์ฉ์ญ ๊ฐ๋ฐ ๋ฐฉ์ -->
|
538 |
+
<div class="method-card">
|
539 |
+
<div class="method-header">
|
540 |
+
<div class="method-icon outsource-icon">๐ค</div>
|
541 |
+
<h2 class="method-title">์ธ์ฃผ ์ฉ์ญ ๊ฐ๋ฐ</h2>
|
542 |
+
</div>
|
543 |
+
<p class="method-description">
|
544 |
+
์ ๋ฌธ ๊ฐ๋ฐ์ฌ์ ํ๋ก์ ํธ๋ฅผ ์ํํ์ฌ AI SaaS๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ์
|
545 |
+
</p>
|
546 |
+
<div class="cost-breakdown">
|
547 |
+
<div class="cost-item">
|
548 |
+
<span>์ด๊ธฐ ๋น์ฉ</span>
|
549 |
+
<span>โฉ50M - โฉ200M</span>
|
550 |
+
</div>
|
551 |
+
<div class="cost-item">
|
552 |
+
<span>๊ฐ๋ฐ ๊ธฐ๊ฐ</span>
|
553 |
+
<span>3 - 6๊ฐ์</span>
|
554 |
+
</div>
|
555 |
+
<div class="cost-item">
|
556 |
+
<span>์ ์ง๋ณด์</span>
|
557 |
+
<span>์ โฉ5M - โฉ15M</span>
|
558 |
+
</div>
|
559 |
+
</div>
|
560 |
+
<div class="pros-cons">
|
561 |
+
<div class="pros">
|
562 |
+
<h4>์ฅ์ </h4>
|
563 |
+
<ul>
|
564 |
+
<li>๋น ๋ฅธ ๊ฐ๋ฐ ์ฐฉ์</li>
|
565 |
+
<li>์ ๋ฌธ์ฑ ํ์ฉ</li>
|
566 |
+
<li>์ธ๋ ฅ ๊ด๋ฆฌ ๋ถ๋ด ์์</li>
|
567 |
+
</ul>
|
568 |
+
</div>
|
569 |
+
<div class="cons">
|
570 |
+
<h4>๋จ์ </h4>
|
571 |
+
<ul>
|
572 |
+
<li>๋์ ๋น์ฉ</li>
|
573 |
+
<li>์ปค์คํฐ๋ง์ด์ง ์ ํ</li>
|
574 |
+
<li>์์กด์ฑ ๋ฌธ์ </li>
|
575 |
+
</ul>
|
576 |
+
</div>
|
577 |
+
</div>
|
578 |
</div>
|
579 |
+
|
580 |
+
<!-- ์์ฒด ์ธ๋ ฅ ๊ฐ๋ฐ ๋ฐฉ์ -->
|
581 |
+
<div class="method-card">
|
582 |
+
<div class="method-header">
|
583 |
+
<div class="method-icon inhouse-icon">๐ฅ</div>
|
584 |
+
<h2 class="method-title">์์ฒด ์ธ๋ ฅ ๊ฐ๋ฐ</h2>
|
585 |
+
</div>
|
586 |
+
<p class="method-description">
|
587 |
+
๋ด๋ถ ๊ฐ๋ฐํ์ ๊ตฌ์ฑํ์ฌ ์ง์ AI SaaS๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐฉ์
|
588 |
+
</p>
|
589 |
+
<div class="cost-breakdown">
|
590 |
+
<div class="cost-item">
|
591 |
+
<span>์ด๊ธฐ ๋น์ฉ</span>
|
592 |
+
<span>โฉ30M - โฉ100M</span>
|
593 |
+
</div>
|
594 |
+
<div class="cost-item">
|
595 |
+
<span>๏ฟฝ๏ฟฝ๋ฐ ๊ธฐ๊ฐ</span>
|
596 |
+
<span>6 - 12๊ฐ์</span>
|
597 |
+
</div>
|
598 |
+
<div class="cost-item">
|
599 |
+
<span>์ด์ ๋น์ฉ</span>
|
600 |
+
<span>์ โฉ20M - โฉ50M</span>
|
601 |
+
</div>
|
602 |
+
</div>
|
603 |
+
<div class="pros-cons">
|
604 |
+
<div class="pros">
|
605 |
+
<h4>์ฅ์ </h4>
|
606 |
+
<ul>
|
607 |
+
<li>์์ ํ ํต์ ๊ถ</li>
|
608 |
+
<li>์ฅ๊ธฐ์ ๋น์ฉ ํจ์จ</li>
|
609 |
+
<li>๊ธฐ์ ๋ด์ฌํ</li>
|
610 |
+
</ul>
|
611 |
+
</div>
|
612 |
+
<div class="cons">
|
613 |
+
<h4>๋จ์ </h4>
|
614 |
+
<ul>
|
615 |
+
<li>์ฑ์ฉ ์ด๋ ค์</li>
|
616 |
+
<li>๊ธด ๊ฐ๋ฐ ๊ธฐ๊ฐ</li>
|
617 |
+
<li>๋์ ์ด์ ๋น์ฉ</li>
|
618 |
+
</ul>
|
619 |
+
</div>
|
620 |
</div>
|
621 |
</div>
|
622 |
+
|
623 |
+
<!-- ํ๋ซํผ ๋์ฌ ๋ฐฉ์ -->
|
624 |
+
<div class="method-card">
|
625 |
+
<div class="method-header">
|
626 |
+
<div class="method-icon platform-icon">๐</div>
|
627 |
+
<h2 class="method-title">ํ๋ซํผ ๋์ฌ</h2>
|
628 |
+
</div>
|
629 |
+
<p class="method-description">
|
630 |
+
๊ธฐ์กด ํ๋ซํผ์ ๋์ฌํ์ฌ ๋น ๋ฅด๊ฒ AI SaaS๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ์
|
631 |
+
</p>
|
632 |
+
<div class="cost-breakdown">
|
633 |
+
<div class="cost-item">
|
634 |
+
<span>์ด๊ธฐ ๋น์ฉ</span>
|
635 |
+
<span>โฉ10M - โฉ50M</span>
|
636 |
+
</div>
|
637 |
+
<div class="cost-item">
|
638 |
+
<span>๊ฐ๋ฐ ๊ธฐ๊ฐ</span>
|
639 |
+
<span>1 - 3๊ฐ์</span>
|
640 |
+
</div>
|
641 |
+
<div class="cost-item">
|
642 |
+
<span>๊ตฌ๋
๋ฃ</span>
|
643 |
+
<span>์ โฉ2M - โฉ10M</span>
|
644 |
+
</div>
|
645 |
+
</div>
|
646 |
+
<div class="pros-cons">
|
647 |
+
<div class="pros">
|
648 |
+
<h4>์ฅ์ </h4>
|
649 |
+
<ul>
|
650 |
+
<li>๋น ๋ฅธ ์์ฅ ์ง์
</li>
|
651 |
+
<li>๋ฎ์ ์ด๊ธฐ ๋น์ฉ</li>
|
652 |
+
<li>๊ฒ์ฆ๋ ๊ธฐ์ </li>
|
653 |
+
</ul>
|
654 |
+
</div>
|
655 |
+
<div class="cons">
|
656 |
+
<h4>๋จ์ </h4>
|
657 |
+
<ul>
|
658 |
+
<li>์ ํ๋ ์ปค์คํฐ๋ง์ด์ง</li>
|
659 |
+
<li>ํ๋ซํผ ์ข
์์ฑ</li>
|
660 |
+
<li>์ฐจ๋ณํ ์ด๋ ค์</li>
|
661 |
+
</ul>
|
662 |
+
</div>
|
663 |
</div>
|
664 |
</div>
|
665 |
</div>
|
666 |
|
667 |
+
<!-- ๋น์ฉ ๊ณ์ฐ๊ธฐ ์น์
-->
|
668 |
+
<div class="calculator-section">
|
669 |
+
<h2 class="calculator-title">๋น์ฉ ์๋ฎฌ๋ ์ดํฐ</h2>
|
670 |
+
<div class="input-group">
|
671 |
+
<div class="input-field">
|
672 |
+
<label for="projectScale">ํ๋ก์ ํธ ๊ท๋ชจ</label>
|
673 |
+
<select id="projectScale">
|
674 |
+
<option value="small">์๊ท๋ชจ (MVP)</option>
|
675 |
+
<option value="medium">์ค๊ท๋ชจ</option>
|
676 |
+
<option value="large">๋๊ท๋ชจ</option>
|
677 |
+
</select>
|
678 |
+
</div>
|
679 |
+
<div class="input-field">
|
680 |
+
<label for="duration">์ด์ ๊ธฐ๊ฐ (๊ฐ์)</label>
|
681 |
+
<input type="number" id="duration" value="12" min="1" max="60">
|
682 |
+
</div>
|
683 |
+
<div class="input-field">
|
684 |
+
<label for="users">์์ ์ฌ์ฉ์ ์</label>
|
685 |
+
<input type="number" id="users" value="1000" min="100" max="1000000">
|
686 |
+
</div>
|
687 |
+
<div class="input-field">
|
688 |
+
<label for="features">AI ๊ธฐ๋ฅ ๋ณต์ก๋</label>
|
689 |
+
<select id="features">
|
690 |
+
<option value="basic">๊ธฐ๋ณธ (์ฑ๋ด, ๋ฒ์ญ)</option>
|
691 |
+
<option value="advanced">๊ณ ๊ธ (์ด๋ฏธ์ง ์์ฑ, ๋ถ์)</option>
|
692 |
+
<option value="enterprise">์ํฐํ๋ผ์ด์ฆ (๋ง์ถคํ ๋ชจ๋ธ)</option>
|
693 |
+
</select>
|
694 |
</div>
|
695 |
</div>
|
696 |
+
<button class="calculate-btn" onclick="calculateCosts()">๋น์ฉ ๊ณ์ฐํ๊ธฐ</button>
|
697 |
+
|
698 |
+
<div class="results-section" id="results">
|
699 |
+
<div class="results-grid">
|
700 |
+
<div class="result-card">
|
701 |
+
<h3>์ธ์ฃผ ์ฉ์ญ ์ด ๋น์ฉ</h3>
|
702 |
+
<div class="result-value" id="outsourceCost">โฉ0</div>
|
703 |
+
<p>์ด๊ธฐ + ์ด์ ๋น์ฉ</p>
|
704 |
+
</div>
|
705 |
+
<div class="result-card">
|
706 |
+
<h3>์์ฒด ์ธ๋ ฅ ์ด ๋น์ฉ</h3>
|
707 |
+
<div class="result-value" id="inhouseCost">โฉ0</div>
|
708 |
+
<p>์ธ๊ฑด๋น + ์ธํ๋ผ</p>
|
709 |
+
</div>
|
710 |
+
<div class="result-card">
|
711 |
+
<h3>ํ๋ซํผ ๋์ฌ ์ด ๋น์ฉ</h3>
|
712 |
+
<div class="result-value" id="platformCost">โฉ0</div>
|
713 |
+
<p>๋ผ์ด์ ์ค + API</p>
|
714 |
+
</div>
|
715 |
+
</div>
|
716 |
+
<div class="chart-container">
|
717 |
+
<canvas id="costChart"></canvas>
|
718 |
</div>
|
719 |
</div>
|
720 |
</div>
|
721 |
+
</div>
|
722 |
|
723 |
+
<!-- ๋๋ง์ ๋ง์ถค ์ค๊ณ ํญ -->
|
724 |
+
<div id="custom" class="tab-content">
|
725 |
+
<div class="custom-design-container">
|
726 |
+
<h2 class="calculator-title">๋๋ง์ AI SaaS ๋ง์ถค ์ค๊ณ</h2>
|
727 |
+
|
728 |
+
<!-- ํ๊น ์๋น์ค ์ ํ -->
|
729 |
+
<div class="component-section">
|
730 |
+
<div class="component-title">
|
731 |
+
<div class="component-icon">๐ฏ</div>
|
732 |
+
<span>ํ๊น ์๋น์ค ์ ํ</span>
|
733 |
+
</div>
|
734 |
+
<div class="component-options">
|
735 |
+
<div class="option-card" onclick="selectOption('service', 'image-gen', 30, 2)">
|
736 |
+
<div class="option-name">์ด๋ฏธ์ง ์์ฑ</div>
|
737 |
+
<div class="option-details">
|
738 |
+
<span>โฉ30M</span>
|
739 |
+
<span>2๊ฐ์</span>
|
740 |
+
</div>
|
741 |
+
</div>
|
742 |
+
<div class="option-card" onclick="selectOption('service', 'image-edit', 35, 2.5)">
|
743 |
+
<div class="option-name">์ด๋ฏธ์ง ํธ์ง/ํฉ์ฑ</div>
|
744 |
+
<div class="option-details">
|
745 |
+
<span>โฉ35M</span>
|
746 |
+
<span>2.5๊ฐ์</span>
|
747 |
+
</div>
|
748 |
+
</div>
|
749 |
+
<div class="option-card" onclick="selectOption('service', 'video-gen', 50, 3)">
|
750 |
+
<div class="option-name">๋น๋์ค ์์ฑ</div>
|
751 |
+
<div class="option-details">
|
752 |
+
<span>โฉ50M</span>
|
753 |
+
<span>3๊ฐ์</span>
|
754 |
+
</div>
|
755 |
+
</div>
|
756 |
+
<div class="option-card" onclick="selectOption('service', 'music-gen', 40, 2.5)">
|
757 |
+
<div class="option-name">์์
๋ฐ ์ํฅ ์์ฑ</div>
|
758 |
+
<div class="option-details">
|
759 |
+
<span>โฉ40M</span>
|
760 |
+
<span>2.5๊ฐ์</span>
|
761 |
+
</div>
|
762 |
+
</div>
|
763 |
+
<div class="option-card" onclick="selectOption('service', 'text-chat', 20, 1.5)">
|
764 |
+
<div class="option-name">ํ
์คํธ ์์ฑ(์ฑ๋ด)</div>
|
765 |
+
<div class="option-details">
|
766 |
+
<span>โฉ20M</span>
|
767 |
+
<span>1.5๊ฐ์</span>
|
768 |
+
</div>
|
769 |
+
</div>
|
770 |
+
<div class="option-card" onclick="selectOption('service', 'text-expert', 25, 2)">
|
771 |
+
<div class="option-name">ํ
์คํธ ์์ฑ(์ ๋ฌธ๊ฐ)</div>
|
772 |
+
<div class="option-details">
|
773 |
+
<span>โฉ25M</span>
|
774 |
+
<span>2๊ฐ์</span>
|
775 |
+
</div>
|
776 |
+
</div>
|
777 |
+
<div class="option-card" onclick="selectOption('service', 'voice-clone', 45, 2.5)">
|
778 |
+
<div class="option-name">์์ฑ ๋ณต์ /์์ฑ</div>
|
779 |
+
<div class="option-details">
|
780 |
+
<span>โฉ45M</span>
|
781 |
+
<span>2.5๊ฐ์</span>
|
782 |
+
</div>
|
783 |
+
</div>
|
784 |
+
<div class="option-card" onclick="selectOption('service', 'vision-ai', 35, 2)">
|
785 |
+
<div class="option-name">๋น์ ์ธ์</div>
|
786 |
+
<div class="option-details">
|
787 |
+
<span>โฉ35M</span>
|
788 |
+
<span>2๊ฐ์</span>
|
789 |
+
</div>
|
790 |
+
</div>
|
791 |
</div>
|
792 |
</div>
|
793 |
+
|
794 |
+
<!-- DB ๊ด๋ฆฌ -->
|
795 |
+
<div class="component-section">
|
796 |
+
<div class="component-title">
|
797 |
+
<div class="component-icon">๐พ</div>
|
798 |
+
<span>DB ๊ด๋ฆฌ</span>
|
799 |
+
</div>
|
800 |
+
<div class="component-options">
|
801 |
+
<div class="option-card" onclick="selectOption('db', 'basic-db', 5, 0.5)">
|
802 |
+
<div class="option-name">๊ธฐ๋ณธ DB</div>
|
803 |
+
<div class="option-details">
|
804 |
+
<span>โฉ5M</span>
|
805 |
+
<span>0.5๊ฐ์</span>
|
806 |
+
</div>
|
807 |
+
</div>
|
808 |
+
<div class="option-card" onclick="selectOption('db', 'advanced-db', 15, 1)">
|
809 |
+
<div class="option-name">๊ณ ๊ธ DB + ๋ฐฑ์
</div>
|
810 |
+
<div class="option-details">
|
811 |
+
<span>โฉ15M</span>
|
812 |
+
<span>1๊ฐ์</span>
|
813 |
+
</div>
|
814 |
+
</div>
|
815 |
+
<div class="option-card" onclick="selectOption('db', 'enterprise-db', 25, 1.5)">
|
816 |
+
<div class="option-name">์ํฐํ๋ผ์ด์ฆ DB</div>
|
817 |
+
<div class="option-details">
|
818 |
+
<span>โฉ25M</span>
|
819 |
+
<span>1.5๊ฐ์</span>
|
820 |
+
</div>
|
821 |
+
</div>
|
822 |
</div>
|
823 |
</div>
|
|
|
|
|
824 |
|
825 |
+
<!-- ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ -->
|
826 |
+
<div class="component-section">
|
827 |
+
<div class="component-title">
|
828 |
+
<div class="component-icon">๐</div>
|
829 |
+
<span>ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ</span>
|
830 |
+
</div>
|
831 |
+
<div class="component-options">
|
832 |
+
<div class="option-card" onclick="selectOption('auth', 'gmail-only', 3, 0.3)">
|
833 |
+
<div class="option-name">Gmail ์ฐ๋</div>
|
834 |
+
<div class="option-details">
|
835 |
+
<span>โฉ3M</span>
|
836 |
+
<span>0.3๊ฐ์</span>
|
837 |
+
</div>
|
838 |
+
</div>
|
839 |
+
<div class="option-card" onclick="selectOption('auth', 'multi-auth', 8, 0.5)">
|
840 |
+
<div class="option-name">๋ค์ค ์์
๋ก๊ทธ์ธ</div>
|
841 |
+
<div class="option-details">
|
842 |
+
<span>โฉ8M</span>
|
843 |
+
<span>0.5๊ฐ์</span>
|
844 |
+
</div>
|
845 |
+
</div>
|
846 |
+
<div class="option-card" onclick="selectOption('auth', 'custom-auth', 12, 1)">
|
847 |
+
<div class="option-name">์ปค์คํ
์ธ์ฆ ์์คํ
</div>
|
848 |
+
<div class="option-details">
|
849 |
+
<span>โฉ12M</span>
|
850 |
+
<span>1๊ฐ์</span>
|
851 |
+
</div>
|
852 |
+
</div>
|
853 |
+
</div>
|
854 |
</div>
|
855 |
+
|
856 |
+
<!-- ํฌ๋ ๋ง ๊ด๋ฆฌ -->
|
857 |
+
<div class="component-section">
|
858 |
+
<div class="component-title">
|
859 |
+
<div class="component-icon">๐ฐ</div>
|
860 |
+
<span>ํฌ๋ ๋ง ๊ด๋ฆฌ</span>
|
861 |
+
</div>
|
862 |
+
<div class="component-options">
|
863 |
+
<div class="option-card" onclick="selectOption('credit', 'basic-credit', 5, 0.5)">
|
864 |
+
<div class="option-name">๊ธฐ๋ณธ ํฌ๋ ๋ง ์์คํ
</div>
|
865 |
+
<div class="option-details">
|
866 |
+
<span>โฉ5M</span>
|
867 |
+
<span>0.5๊ฐ์</span>
|
868 |
+
</div>
|
869 |
+
</div>
|
870 |
+
<div class="option-card" onclick="selectOption('credit', 'advanced-credit', 12, 1)">
|
871 |
+
<div class="option-name">๊ณ ๊ธ ํฌ๋ ๋ง + ๊ตฌ๋
</div>
|
872 |
+
<div class="option-details">
|
873 |
+
<span>โฉ12M</span>
|
874 |
+
<span>1๊ฐ์</span>
|
875 |
+
</div>
|
876 |
+
</div>
|
877 |
+
</div>
|
878 |
</div>
|
879 |
+
|
880 |
+
<!-- ํ์ด๋จผํธ ์ง์ -->
|
881 |
+
<div class="component-section">
|
882 |
+
<div class="component-title">
|
883 |
+
<div class="component-icon">๐ณ</div>
|
884 |
+
<span>ํ์ด๋จผํธ ์ง์</span>
|
885 |
+
</div>
|
886 |
+
<div class="component-options">
|
887 |
+
<div class="option-card" onclick="selectOption('payment', 'basic-payment', 8, 0.5)">
|
888 |
+
<div class="option-name">๊ธฐ๋ณธ ๊ฒฐ์ (์นด๋)</div>
|
889 |
+
<div class="option-details">
|
890 |
+
<span>โฉ8M</span>
|
891 |
+
<span>0.5๊ฐ์</span>
|
892 |
+
</div>
|
893 |
+
</div>
|
894 |
+
<div class="option-card" onclick="selectOption('payment', 'multi-payment', 15, 1)">
|
895 |
+
<div class="option-name">๋ค์ค ๊ฒฐ์ ์๋จ</div>
|
896 |
+
<div class="option-details">
|
897 |
+
<span>โฉ15M</span>
|
898 |
+
<span>1๊ฐ์</span>
|
899 |
+
</div>
|
900 |
+
</div>
|
901 |
+
<div class="option-card" onclick="selectOption('payment', 'global-payment', 20, 1.5)">
|
902 |
+
<div class="option-name">๊ธ๋ก๋ฒ ๊ฒฐ์ ์์คํ
</div>
|
903 |
+
<div class="option-details">
|
904 |
+
<span>โฉ20M</span>
|
905 |
+
<span>1.5๊ฐ์</span>
|
906 |
+
</div>
|
907 |
+
</div>
|
908 |
+
</div>
|
909 |
</div>
|
910 |
+
|
911 |
+
<!-- ๋ง์ผํ
์ง์ -->
|
912 |
+
<div class="component-section">
|
913 |
+
<div class="component-title">
|
914 |
+
<div class="component-icon">๐ข</div>
|
915 |
+
<span>๋ง์ผํ
์ง์</span>
|
916 |
+
</div>
|
917 |
+
<div class="component-options">
|
918 |
+
<div class="option-card" onclick="selectOption('marketing', 'basic-marketing', 10, 1)">
|
919 |
+
<div class="option-name">๊ธฐ๋ณธ ๋ง์ผํ
๋๊ตฌ</div>
|
920 |
+
<div class="option-details">
|
921 |
+
<span>โฉ10M</span>
|
922 |
+
<span>1๊ฐ์</span>
|
923 |
+
</div>
|
924 |
+
</div>
|
925 |
+
<div class="option-card" onclick="selectOption('marketing', 'advanced-marketing', 20, 1.5)">
|
926 |
+
<div class="option-name">๊ณ ๊ธ ๋ง์ผํ
์๋ํ</div>
|
927 |
+
<div class="option-details">
|
928 |
+
<span>โฉ20M</span>
|
929 |
+
<span>1.5๊ฐ์</span>
|
930 |
+
</div>
|
931 |
+
</div>
|
932 |
+
</div>
|
933 |
</div>
|
|
|
|
|
934 |
|
935 |
+
<!-- ๊ฐ๋ฐ ๋ฐ ๊ธฐ์ ์ธ๋ ฅ ์ง์ -->
|
936 |
+
<div class="component-section">
|
937 |
+
<div class="component-title">
|
938 |
+
<div class="component-icon">๐จโ๐ป</div>
|
939 |
+
<span>๊ฐ๋ฐ ๋ฐ ๊ธฐ์ ์ธ๋ ฅ ์ง์</span>
|
|
|
940 |
</div>
|
941 |
+
<div class="component-options">
|
942 |
+
<div class="option-card" onclick="selectOption('support', 'basic-support', 5, 0)">
|
943 |
+
<div class="option-name">๊ธฐ๋ณธ ๊ธฐ์ ์ง์</div>
|
944 |
+
<div class="option-details">
|
945 |
+
<span>์ โฉ5M</span>
|
946 |
+
<span>์ฆ์</span>
|
947 |
+
</div>
|
948 |
+
</div>
|
949 |
+
<div class="option-card" onclick="selectOption('support', 'dedicated-support', 15, 0)">
|
950 |
+
<div class="option-name">์ ๋ด ๊ฐ๋ฐ์ ์ง์</div>
|
951 |
+
<div class="option-details">
|
952 |
+
<span>์ โฉ15M</span>
|
953 |
+
<span>์ฆ์</span>
|
954 |
+
</div>
|
955 |
+
</div>
|
956 |
+
</div>
|
957 |
+
</div>
|
958 |
+
|
959 |
+
<!-- ์๊ฒฉ ๋ชจ๋ํฐ๋ง ์ง์ -->
|
960 |
+
<div class="component-section">
|
961 |
+
<div class="component-title">
|
962 |
+
<div class="component-icon">๐</div>
|
963 |
+
<span>์๊ฒฉ ๋ชจ๋ํฐ๋ง ์ง์</span>
|
964 |
</div>
|
965 |
+
<div class="component-options">
|
966 |
+
<div class="option-card" onclick="selectOption('monitoring', 'basic-monitor', 3, 0.3)">
|
967 |
+
<div class="option-name">๊ธฐ๋ณธ ๋ชจ๋ํฐ๋ง</div>
|
968 |
+
<div class="option-details">
|
969 |
+
<span>โฉ3M</span>
|
970 |
+
<span>0.3๊ฐ์</span>
|
971 |
+
</div>
|
972 |
+
</div>
|
973 |
+
<div class="option-card" onclick="selectOption('monitoring', 'advanced-monitor', 8, 0.5)">
|
974 |
+
<div class="option-name">๊ณ ๊ธ ๋ถ์ + ์๋ฆผ</div>
|
975 |
+
<div class="option-details">
|
976 |
+
<span>โฉ8M</span>
|
977 |
+
<span>0.5๊ฐ์</span>
|
978 |
+
</div>
|
979 |
+
</div>
|
980 |
</div>
|
981 |
</div>
|
982 |
+
|
983 |
+
<button class="calculate-btn" onclick="calculateCustomCost()">๋ง์ถค ๊ฒฌ์ ๊ณ์ฐํ๊ธฐ</button>
|
984 |
+
|
985 |
+
<div class="custom-result" id="customResult">
|
986 |
+
<div class="custom-summary">
|
987 |
+
<div class="summary-item">
|
988 |
+
<div class="summary-label">์ด ๊ฐ๋ฐ ๋น์ฉ</div>
|
989 |
+
<div class="summary-value" id="totalCost">โฉ0</div>
|
990 |
+
</div>
|
991 |
+
<div class="summary-item">
|
992 |
+
<div class="summary-label">์์ ๊ฐ๋ฐ ๊ธฐ๊ฐ</div>
|
993 |
+
<div class="summary-value" id="totalTime">0๊ฐ์</div>
|
994 |
+
</div>
|
995 |
+
<div class="summary-item">
|
996 |
+
<div class="summary-label">์ ์ด์ ๋น์ฉ</div>
|
997 |
+
<div class="summary-value" id="monthlyCost">โฉ0</div>
|
998 |
+
</div>
|
999 |
+
</div>
|
1000 |
+
<div class="selected-components">
|
1001 |
+
<h4>์ ํํ ๊ตฌ์ฑ ์์</h4>
|
1002 |
+
<div class="component-list" id="componentList"></div>
|
1003 |
+
</div>
|
1004 |
</div>
|
1005 |
</div>
|
1006 |
</div>
|
|
|
1008 |
|
1009 |
<script>
|
1010 |
let costChart = null;
|
1011 |
+
let selectedComponents = {};
|
1012 |
+
|
1013 |
+
function switchTab(tabName) {
|
1014 |
+
// ๋ชจ๋ ํญ ๋ด์ฉ ์จ๊ธฐ๊ธฐ
|
1015 |
+
document.querySelectorAll('.tab-content').forEach(content => {
|
1016 |
+
content.classList.remove('active');
|
1017 |
+
});
|
1018 |
+
|
1019 |
+
// ๋ชจ๋ ํญ ๋ฒํผ ๋นํ์ฑํ
|
1020 |
+
document.querySelectorAll('.tab').forEach(tab => {
|
1021 |
+
tab.classList.remove('active');
|
1022 |
+
});
|
1023 |
+
|
1024 |
+
// ์ ํํ ํญ ํ์ฑํ
|
1025 |
+
document.getElementById(tabName).classList.add('active');
|
1026 |
+
event.target.classList.add('active');
|
1027 |
+
}
|
1028 |
+
|
1029 |
+
function selectOption(category, optionId, cost, time) {
|
1030 |
+
// ์ด์ ์ ํ ์ ๊ฑฐ
|
1031 |
+
document.querySelectorAll(`.component-section:has(.component-title:has(.component-icon:contains('${getCategoryIcon(category)}'))) .option-card`).forEach(card => {
|
1032 |
+
card.classList.remove('selected');
|
1033 |
+
});
|
1034 |
+
|
1035 |
+
// ์ ์ ํ ์ถ๊ฐ
|
1036 |
+
event.currentTarget.classList.add('selected');
|
1037 |
+
|
1038 |
+
// ์ ํ ์ ๋ณด ์ ์ฅ
|
1039 |
+
selectedComponents[category] = {
|
1040 |
+
id: optionId,
|
1041 |
+
name: event.currentTarget.querySelector('.option-name').textContent,
|
1042 |
+
cost: cost,
|
1043 |
+
time: time
|
1044 |
+
};
|
1045 |
+
}
|
1046 |
+
|
1047 |
+
function getCategoryIcon(category) {
|
1048 |
+
const icons = {
|
1049 |
+
'service': '๐ฏ',
|
1050 |
+
'db': '๐พ',
|
1051 |
+
'auth': '๐',
|
1052 |
+
'credit': '๐ฐ',
|
1053 |
+
'payment': '๐ณ',
|
1054 |
+
'marketing': '๐ข',
|
1055 |
+
'support': '๐จโ๐ป',
|
1056 |
+
'monitoring': '๐'
|
1057 |
+
};
|
1058 |
+
return icons[category];
|
1059 |
+
}
|
1060 |
+
|
1061 |
+
function calculateCustomCost() {
|
1062 |
+
if (Object.keys(selectedComponents).length === 0) {
|
1063 |
+
alert('๊ตฌ์ฑ ์์๋ฅผ ์ ํํด์ฃผ์ธ์.');
|
1064 |
+
return;
|
1065 |
+
}
|
1066 |
+
|
1067 |
+
let totalCost = 0;
|
1068 |
+
let totalTime = 0;
|
1069 |
+
let monthlyCost = 0;
|
1070 |
+
let componentListHTML = '';
|
1071 |
+
|
1072 |
+
Object.values(selectedComponents).forEach(component => {
|
1073 |
+
totalCost += component.cost;
|
1074 |
+
totalTime = Math.max(totalTime, component.time);
|
1075 |
+
|
1076 |
+
// ์ ์ด์ ๋น์ฉ ๊ณ์ฐ (support๋ ์ ๋น์ฉ)
|
1077 |
+
if (component.id.includes('support')) {
|
1078 |
+
monthlyCost += component.cost;
|
1079 |
+
}
|
1080 |
+
|
1081 |
+
componentListHTML += `
|
1082 |
+
<div class="component-list-item">
|
1083 |
+
<span>${component.name}</span>
|
1084 |
+
<span>โฉ${component.cost}M</span>
|
1085 |
+
</div>
|
1086 |
+
`;
|
1087 |
+
});
|
1088 |
+
|
1089 |
+
// ๊ธฐ๋ณธ ์ ์ด์ ๋น์ฉ ์ถ๊ฐ (์๋ฒ, API ๋ฑ)
|
1090 |
+
monthlyCost += totalCost * 0.05; // ์ด๊ธฐ ๋น์ฉ์ 5%๋ฅผ ์ ์ด์๋น๋ก ๊ฐ์
|
1091 |
+
|
1092 |
+
document.getElementById('totalCost').textContent = `โฉ${totalCost}M`;
|
1093 |
+
document.getElementById('totalTime').textContent = `${totalTime}๊ฐ์`;
|
1094 |
+
document.getElementById('monthlyCost').textContent = `โฉ${monthlyCost.toFixed(1)}M`;
|
1095 |
+
document.getElementById('componentList').innerHTML = componentListHTML;
|
1096 |
+
document.getElementById('customResult').style.display = 'block';
|
1097 |
+
|
1098 |
+
// ์คํฌ๋กค ๋ค์ด
|
1099 |
+
document.getElementById('customResult').scrollIntoView({ behavior: 'smooth' });
|
1100 |
+
}
|
1101 |
|
1102 |
function calculateCosts() {
|
1103 |
const scale = document.getElementById('projectScale').value;
|
|
|
1183 |
tension: 0.4
|
1184 |
},
|
1185 |
{
|
1186 |
+
label: 'ํ๋ซํผ ๋์ฌ',
|
1187 |
data: months.map(m => costs.platform.initial + (costs.platform.monthly * m * multiplier)),
|
1188 |
borderColor: '#00f2fe',
|
1189 |
backgroundColor: 'rgba(0, 242, 254, 0.1)',
|