Spaces:
Running
Running
Add 2 files
Browse files- index.html +276 -2
- prompts.txt +2 -1
index.html
CHANGED
|
@@ -490,12 +490,153 @@
|
|
| 490 |
.audio-controls.collapsed h3 span {
|
| 491 |
display: none;
|
| 492 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 493 |
</style>
|
| 494 |
</head>
|
| 495 |
<body>
|
| 496 |
<!-- Audio Visualization -->
|
| 497 |
<div class="audio-visualizer"></div>
|
| 498 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 499 |
<!-- Audio Controls -->
|
| 500 |
<div class="audio-controls">
|
| 501 |
<h3>
|
|
@@ -627,7 +768,7 @@
|
|
| 627 |
</audio>
|
| 628 |
|
| 629 |
<script>
|
| 630 |
-
// Audio Manager
|
| 631 |
class AudioManager {
|
| 632 |
constructor() {
|
| 633 |
this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
@@ -650,9 +791,16 @@
|
|
| 650 |
|
| 651 |
this.dataArray = new Uint8Array(this.analyser.frequencyBinCount);
|
| 652 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 653 |
this.initControls();
|
| 654 |
this.startAudio();
|
| 655 |
this.visualize();
|
|
|
|
| 656 |
}
|
| 657 |
|
| 658 |
initControls() {
|
|
@@ -664,16 +812,19 @@
|
|
| 664 |
humVolume.addEventListener('input', () => {
|
| 665 |
this.humAudio.volume = humVolume.value / 100;
|
| 666 |
document.getElementById('hum-volume-value').textContent = `${humVolume.value}%`;
|
|
|
|
| 667 |
});
|
| 668 |
|
| 669 |
heartbeatVolume.addEventListener('input', () => {
|
| 670 |
this.heartbeatAudio.volume = heartbeatVolume.value / 100;
|
| 671 |
document.getElementById('heartbeat-volume-value').textContent = `${heartbeatVolume.value}%`;
|
|
|
|
| 672 |
});
|
| 673 |
|
| 674 |
thunderVolume.addEventListener('input', () => {
|
| 675 |
this.thunderAudio.volume = thunderVolume.value / 100;
|
| 676 |
document.getElementById('thunder-volume-value').textContent = `${thunderVolume.value}%`;
|
|
|
|
| 677 |
});
|
| 678 |
|
| 679 |
// Toggle buttons
|
|
@@ -681,8 +832,10 @@
|
|
| 681 |
e.target.classList.toggle('active');
|
| 682 |
if (e.target.classList.contains('active')) {
|
| 683 |
this.humAudio.play();
|
|
|
|
| 684 |
} else {
|
| 685 |
this.humAudio.pause();
|
|
|
|
| 686 |
}
|
| 687 |
});
|
| 688 |
|
|
@@ -690,19 +843,140 @@
|
|
| 690 |
e.target.classList.toggle('active');
|
| 691 |
if (e.target.classList.contains('active')) {
|
| 692 |
this.heartbeatAudio.play();
|
|
|
|
| 693 |
} else {
|
| 694 |
this.heartbeatAudio.pause();
|
|
|
|
| 695 |
}
|
| 696 |
});
|
| 697 |
|
| 698 |
document.getElementById('toggle-thunder').addEventListener('click', (e) => {
|
| 699 |
e.target.classList.toggle('active');
|
|
|
|
| 700 |
});
|
| 701 |
|
| 702 |
// Collapse/expand controls
|
| 703 |
document.getElementById('toggle-audio-controls').addEventListener('click', () => {
|
| 704 |
document.querySelector('.audio-controls').classList.toggle('collapsed');
|
| 705 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 706 |
}
|
| 707 |
|
| 708 |
startAudio() {
|
|
@@ -1304,7 +1578,7 @@
|
|
| 1304 |
new ParticleSystem(canvas);
|
| 1305 |
}
|
| 1306 |
|
| 1307 |
-
// Initialize Audio Manager
|
| 1308 |
new AudioManager();
|
| 1309 |
|
| 1310 |
// Recreate elements periodically for variety
|
|
|
|
| 490 |
.audio-controls.collapsed h3 span {
|
| 491 |
display: none;
|
| 492 |
}
|
| 493 |
+
|
| 494 |
+
/* Pleasure Dial Styles */
|
| 495 |
+
.pleasure-dial-container {
|
| 496 |
+
position: fixed;
|
| 497 |
+
bottom: 20px;
|
| 498 |
+
left: 20px;
|
| 499 |
+
z-index: 1000;
|
| 500 |
+
background: rgba(15, 15, 26, 0.7);
|
| 501 |
+
border-radius: 8px;
|
| 502 |
+
padding: 15px;
|
| 503 |
+
backdrop-filter: blur(5px);
|
| 504 |
+
border: 1px solid rgba(56, 189, 248, 0.2);
|
| 505 |
+
transition: all 0.3s ease;
|
| 506 |
+
max-width: 300px;
|
| 507 |
+
}
|
| 508 |
+
|
| 509 |
+
.pleasure-dial-container:hover {
|
| 510 |
+
background: rgba(15, 15, 26, 0.9);
|
| 511 |
+
border-color: rgba(245, 158, 11, 0.3);
|
| 512 |
+
}
|
| 513 |
+
|
| 514 |
+
.pleasure-dial-container h3 {
|
| 515 |
+
color: var(--warm-amber);
|
| 516 |
+
margin-bottom: 15px;
|
| 517 |
+
font-family: 'Orbitron', sans-serif;
|
| 518 |
+
display: flex;
|
| 519 |
+
align-items: center;
|
| 520 |
+
justify-content: space-between;
|
| 521 |
+
}
|
| 522 |
+
|
| 523 |
+
.pleasure-dial-container h3 i {
|
| 524 |
+
margin-right: 8px;
|
| 525 |
+
}
|
| 526 |
+
|
| 527 |
+
.pleasure-dial {
|
| 528 |
+
width: 100%;
|
| 529 |
+
height: 8px;
|
| 530 |
+
-webkit-appearance: none;
|
| 531 |
+
background: linear-gradient(90deg, var(--cool-blue), var(--warm-amber), var(--electric-purple));
|
| 532 |
+
border-radius: 4px;
|
| 533 |
+
outline: none;
|
| 534 |
+
margin: 20px 0;
|
| 535 |
+
}
|
| 536 |
+
|
| 537 |
+
.pleasure-dial::-webkit-slider-thumb {
|
| 538 |
+
-webkit-appearance: none;
|
| 539 |
+
width: 24px;
|
| 540 |
+
height: 24px;
|
| 541 |
+
background: white;
|
| 542 |
+
border-radius: 50%;
|
| 543 |
+
cursor: pointer;
|
| 544 |
+
box-shadow: 0 0 10px rgba(245, 158, 11, 0.8);
|
| 545 |
+
border: 2px solid var(--warm-amber);
|
| 546 |
+
}
|
| 547 |
+
|
| 548 |
+
.pleasure-dial::-webkit-slider-thumb:hover {
|
| 549 |
+
box-shadow: 0 0 15px rgba(245, 158, 11, 1);
|
| 550 |
+
}
|
| 551 |
+
|
| 552 |
+
.pleasure-intensity {
|
| 553 |
+
display: flex;
|
| 554 |
+
justify-content: space-between;
|
| 555 |
+
margin-top: 5px;
|
| 556 |
+
color: rgba(224, 224, 255, 0.7);
|
| 557 |
+
font-size: 0.8rem;
|
| 558 |
+
}
|
| 559 |
+
|
| 560 |
+
.pleasure-value {
|
| 561 |
+
text-align: center;
|
| 562 |
+
font-family: 'Orbitron', sans-serif;
|
| 563 |
+
font-size: 1.2rem;
|
| 564 |
+
color: var(--warm-amber);
|
| 565 |
+
margin: 10px 0;
|
| 566 |
+
}
|
| 567 |
+
|
| 568 |
+
.haptic-toggle {
|
| 569 |
+
display: flex;
|
| 570 |
+
align-items: center;
|
| 571 |
+
justify-content: center;
|
| 572 |
+
margin-top: 15px;
|
| 573 |
+
}
|
| 574 |
+
|
| 575 |
+
.haptic-toggle button {
|
| 576 |
+
background: rgba(245, 158, 11, 0.1);
|
| 577 |
+
border: 1px solid rgba(245, 158, 11, 0.3);
|
| 578 |
+
color: var(--warm-amber);
|
| 579 |
+
padding: 8px 15px;
|
| 580 |
+
border-radius: 4px;
|
| 581 |
+
cursor: pointer;
|
| 582 |
+
font-size: 0.9rem;
|
| 583 |
+
transition: all 0.3s ease;
|
| 584 |
+
display: flex;
|
| 585 |
+
align-items: center;
|
| 586 |
+
}
|
| 587 |
+
|
| 588 |
+
.haptic-toggle button i {
|
| 589 |
+
margin-right: 8px;
|
| 590 |
+
}
|
| 591 |
+
|
| 592 |
+
.haptic-toggle button:hover {
|
| 593 |
+
background: rgba(245, 158, 11, 0.2);
|
| 594 |
+
}
|
| 595 |
+
|
| 596 |
+
.haptic-toggle button.active {
|
| 597 |
+
background: rgba(245, 158, 11, 0.3);
|
| 598 |
+
color: white;
|
| 599 |
+
}
|
| 600 |
+
|
| 601 |
+
/* Haptic feedback indicator */
|
| 602 |
+
.haptic-indicator {
|
| 603 |
+
position: absolute;
|
| 604 |
+
width: 100%;
|
| 605 |
+
height: 100%;
|
| 606 |
+
top: 0;
|
| 607 |
+
left: 0;
|
| 608 |
+
pointer-events: none;
|
| 609 |
+
opacity: 0;
|
| 610 |
+
background: radial-gradient(circle, rgba(245, 158, 11, 0.2) 0%, transparent 70%);
|
| 611 |
+
transition: opacity 0.3s ease;
|
| 612 |
+
}
|
| 613 |
+
|
| 614 |
+
.haptic-active .haptic-indicator {
|
| 615 |
+
opacity: 1;
|
| 616 |
+
}
|
| 617 |
</style>
|
| 618 |
</head>
|
| 619 |
<body>
|
| 620 |
<!-- Audio Visualization -->
|
| 621 |
<div class="audio-visualizer"></div>
|
| 622 |
|
| 623 |
+
<!-- Pleasure Dial Controls -->
|
| 624 |
+
<div class="pleasure-dial-container">
|
| 625 |
+
<h3><i class="fas fa-sliders-h"></i> Pleasure Dial</h3>
|
| 626 |
+
<div class="pleasure-value" id="pleasure-value">50%</div>
|
| 627 |
+
<input type="range" id="pleasure-dial" class="pleasure-dial" min="0" max="100" value="50">
|
| 628 |
+
<div class="pleasure-intensity">
|
| 629 |
+
<span>Subtle</span>
|
| 630 |
+
<span>Intense</span>
|
| 631 |
+
</div>
|
| 632 |
+
<div class="haptic-toggle">
|
| 633 |
+
<button id="toggle-haptic">
|
| 634 |
+
<i class="fas fa-vibration"></i> Haptic Feedback
|
| 635 |
+
</button>
|
| 636 |
+
</div>
|
| 637 |
+
<div class="haptic-indicator"></div>
|
| 638 |
+
</div>
|
| 639 |
+
|
| 640 |
<!-- Audio Controls -->
|
| 641 |
<div class="audio-controls">
|
| 642 |
<h3>
|
|
|
|
| 768 |
</audio>
|
| 769 |
|
| 770 |
<script>
|
| 771 |
+
// Enhanced Audio Manager with Pleasure Dial integration
|
| 772 |
class AudioManager {
|
| 773 |
constructor() {
|
| 774 |
this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
|
|
| 791 |
|
| 792 |
this.dataArray = new Uint8Array(this.analyser.frequencyBinCount);
|
| 793 |
|
| 794 |
+
// Pleasure dial state
|
| 795 |
+
this.pleasureIntensity = 0.5; // 0-1 scale
|
| 796 |
+
this.hapticEnabled = false;
|
| 797 |
+
this.lastHapticTime = 0;
|
| 798 |
+
this.hapticInterval = 1000; // Start with slow pulses
|
| 799 |
+
|
| 800 |
this.initControls();
|
| 801 |
this.startAudio();
|
| 802 |
this.visualize();
|
| 803 |
+
this.initHaptic();
|
| 804 |
}
|
| 805 |
|
| 806 |
initControls() {
|
|
|
|
| 812 |
humVolume.addEventListener('input', () => {
|
| 813 |
this.humAudio.volume = humVolume.value / 100;
|
| 814 |
document.getElementById('hum-volume-value').textContent = `${humVolume.value}%`;
|
| 815 |
+
this.logInteraction('hum_volume_change', humVolume.value);
|
| 816 |
});
|
| 817 |
|
| 818 |
heartbeatVolume.addEventListener('input', () => {
|
| 819 |
this.heartbeatAudio.volume = heartbeatVolume.value / 100;
|
| 820 |
document.getElementById('heartbeat-volume-value').textContent = `${heartbeatVolume.value}%`;
|
| 821 |
+
this.logInteraction('heartbeat_volume_change', heartbeatVolume.value);
|
| 822 |
});
|
| 823 |
|
| 824 |
thunderVolume.addEventListener('input', () => {
|
| 825 |
this.thunderAudio.volume = thunderVolume.value / 100;
|
| 826 |
document.getElementById('thunder-volume-value').textContent = `${thunderVolume.value}%`;
|
| 827 |
+
this.logInteraction('thunder_volume_change', thunderVolume.value);
|
| 828 |
});
|
| 829 |
|
| 830 |
// Toggle buttons
|
|
|
|
| 832 |
e.target.classList.toggle('active');
|
| 833 |
if (e.target.classList.contains('active')) {
|
| 834 |
this.humAudio.play();
|
| 835 |
+
this.logInteraction('hum_toggle', 'on');
|
| 836 |
} else {
|
| 837 |
this.humAudio.pause();
|
| 838 |
+
this.logInteraction('hum_toggle', 'off');
|
| 839 |
}
|
| 840 |
});
|
| 841 |
|
|
|
|
| 843 |
e.target.classList.toggle('active');
|
| 844 |
if (e.target.classList.contains('active')) {
|
| 845 |
this.heartbeatAudio.play();
|
| 846 |
+
this.logInteraction('heartbeat_toggle', 'on');
|
| 847 |
} else {
|
| 848 |
this.heartbeatAudio.pause();
|
| 849 |
+
this.logInteraction('heartbeat_toggle', 'off');
|
| 850 |
}
|
| 851 |
});
|
| 852 |
|
| 853 |
document.getElementById('toggle-thunder').addEventListener('click', (e) => {
|
| 854 |
e.target.classList.toggle('active');
|
| 855 |
+
this.logInteraction('thunder_toggle', e.target.classList.contains('active') ? 'on' : 'off');
|
| 856 |
});
|
| 857 |
|
| 858 |
// Collapse/expand controls
|
| 859 |
document.getElementById('toggle-audio-controls').addEventListener('click', () => {
|
| 860 |
document.querySelector('.audio-controls').classList.toggle('collapsed');
|
| 861 |
});
|
| 862 |
+
|
| 863 |
+
// Pleasure dial
|
| 864 |
+
const pleasureDial = document.getElementById('pleasure-dial');
|
| 865 |
+
const pleasureValue = document.getElementById('pleasure-value');
|
| 866 |
+
|
| 867 |
+
pleasureDial.addEventListener('input', () => {
|
| 868 |
+
this.pleasureIntensity = pleasureDial.value / 100;
|
| 869 |
+
pleasureValue.textContent = `${pleasureDial.value}%`;
|
| 870 |
+
|
| 871 |
+
// Update all parameters based on pleasure intensity
|
| 872 |
+
this.updatePleasureEffects();
|
| 873 |
+
|
| 874 |
+
// Log the interaction
|
| 875 |
+
this.logInteraction('pleasure_dial', pleasureDial.value);
|
| 876 |
+
});
|
| 877 |
+
|
| 878 |
+
// Haptic feedback toggle
|
| 879 |
+
document.getElementById('toggle-haptic').addEventListener('click', (e) => {
|
| 880 |
+
e.target.classList.toggle('active');
|
| 881 |
+
this.hapticEnabled = e.target.classList.contains('active');
|
| 882 |
+
document.querySelector('.pleasure-dial-container').classList.toggle('haptic-active');
|
| 883 |
+
|
| 884 |
+
if (this.hapticEnabled) {
|
| 885 |
+
this.triggerHapticFeedback();
|
| 886 |
+
this.logInteraction('haptic_feedback', 'enabled');
|
| 887 |
+
} else {
|
| 888 |
+
this.logInteraction('haptic_feedback', 'disabled');
|
| 889 |
+
}
|
| 890 |
+
});
|
| 891 |
+
}
|
| 892 |
+
|
| 893 |
+
updatePleasureEffects() {
|
| 894 |
+
// Update audio volumes
|
| 895 |
+
const baseVolume = 0.3 + (this.pleasureIntensity * 0.7);
|
| 896 |
+
this.humAudio.volume = baseVolume * 0.8;
|
| 897 |
+
this.heartbeatAudio.volume = baseVolume * 1.2;
|
| 898 |
+
|
| 899 |
+
// Update UI elements to reflect changes
|
| 900 |
+
document.getElementById('hum-volume').value = this.humAudio.volume * 100;
|
| 901 |
+
document.getElementById('heartbeat-volume').value = this.heartbeatAudio.volume * 100;
|
| 902 |
+
document.getElementById('hum-volume-value').textContent = `${Math.round(this.humAudio.volume * 100)}%`;
|
| 903 |
+
document.getElementById('heartbeat-volume-value').textContent = `${Math.round(this.heartbeatAudio.volume * 100)}%`;
|
| 904 |
+
|
| 905 |
+
// Update heartbeat speed (playback rate)
|
| 906 |
+
this.heartbeatAudio.playbackRate = 0.5 + (this.pleasureIntensity * 1.5);
|
| 907 |
+
|
| 908 |
+
// Update haptic pulse speed
|
| 909 |
+
this.hapticInterval = 1000 - (this.pleasureIntensity * 900); // 100ms to 1000ms
|
| 910 |
+
|
| 911 |
+
// Update visual intensity
|
| 912 |
+
this.updateVisualIntensity();
|
| 913 |
+
}
|
| 914 |
+
|
| 915 |
+
updateVisualIntensity() {
|
| 916 |
+
// Update CSS variables based on intensity
|
| 917 |
+
document.documentElement.style.setProperty('--cool-blue', `rgba(56, 189, 248, ${0.5 + this.pleasureIntensity * 0.5})`);
|
| 918 |
+
document.documentElement.style.setProperty('--warm-amber', `rgba(245, 158, 11, ${0.5 + this.pleasureIntensity * 0.5})`);
|
| 919 |
+
|
| 920 |
+
// Update pulse animation speed
|
| 921 |
+
const pulseElements = document.querySelectorAll('.pulse-glow, .neon-text');
|
| 922 |
+
pulseElements.forEach(el => {
|
| 923 |
+
el.style.animationDuration = `${6 - (this.pleasureIntensity * 4)}s`;
|
| 924 |
+
});
|
| 925 |
+
}
|
| 926 |
+
|
| 927 |
+
initHaptic() {
|
| 928 |
+
// Check for vibration API support
|
| 929 |
+
this.vibrationSupported = 'vibrate' in navigator;
|
| 930 |
+
|
| 931 |
+
if (!this.vibrationSupported) {
|
| 932 |
+
document.getElementById('toggle-haptic').disabled = true;
|
| 933 |
+
document.getElementById('toggle-haptic').title = "Haptic feedback not supported on this device";
|
| 934 |
+
}
|
| 935 |
+
}
|
| 936 |
+
|
| 937 |
+
triggerHapticFeedback() {
|
| 938 |
+
if (!this.hapticEnabled || !this.vibrationSupported) return;
|
| 939 |
+
|
| 940 |
+
// Calculate vibration pattern based on pleasure intensity
|
| 941 |
+
const duration = 50 + (this.pleasureIntensity * 100); // 50-150ms
|
| 942 |
+
const pattern = [duration, this.hapticInterval - duration];
|
| 943 |
+
|
| 944 |
+
// Start vibration
|
| 945 |
+
navigator.vibrate(pattern);
|
| 946 |
+
|
| 947 |
+
// Schedule next vibration
|
| 948 |
+
clearTimeout(this.hapticTimeout);
|
| 949 |
+
this.hapticTimeout = setTimeout(() => {
|
| 950 |
+
this.triggerHapticFeedback();
|
| 951 |
+
}, this.hapticInterval);
|
| 952 |
+
|
| 953 |
+
// Visual feedback
|
| 954 |
+
const indicator = document.querySelector('.haptic-indicator');
|
| 955 |
+
indicator.style.opacity = '1';
|
| 956 |
+
setTimeout(() => {
|
| 957 |
+
indicator.style.opacity = '0';
|
| 958 |
+
}, duration);
|
| 959 |
+
}
|
| 960 |
+
|
| 961 |
+
logInteraction(type, value) {
|
| 962 |
+
// In a real application, this would send data to your server
|
| 963 |
+
console.log(`Logged interaction: ${type}=${value}`);
|
| 964 |
+
|
| 965 |
+
// Simulate server logging
|
| 966 |
+
const logData = {
|
| 967 |
+
type: type,
|
| 968 |
+
value: value,
|
| 969 |
+
timestamp: new Date().toISOString(),
|
| 970 |
+
pleasureIntensity: this.pleasureIntensity,
|
| 971 |
+
userAgent: navigator.userAgent
|
| 972 |
+
};
|
| 973 |
+
|
| 974 |
+
// Here you would typically use fetch() to send to your backend
|
| 975 |
+
// fetch('/api/log-interaction', {
|
| 976 |
+
// method: 'POST',
|
| 977 |
+
// headers: { 'Content-Type': 'application/json' },
|
| 978 |
+
// body: JSON.stringify(logData)
|
| 979 |
+
// });
|
| 980 |
}
|
| 981 |
|
| 982 |
startAudio() {
|
|
|
|
| 1578 |
new ParticleSystem(canvas);
|
| 1579 |
}
|
| 1580 |
|
| 1581 |
+
// Initialize Audio Manager with Pleasure Dial
|
| 1582 |
new AudioManager();
|
| 1583 |
|
| 1584 |
// Recreate elements periodically for variety
|
prompts.txt
CHANGED
|
@@ -2,4 +2,5 @@ Deepsite, generate a full‑stack web application scaffold using Next.js for the
|
|
| 2 |
Refine the landing page: - Create a full‑screen hero with animated “electric currents” flowing across a dark grid background. - Implement a pulsating glow effect that mimics waves of tingling warmth radiating from the center. - Overlay the text “Welcome to Algorithmic Ecstasy” in neon gradient, fading in sync with the pulse.
|
| 3 |
Enhance CSS interactions: - On hover, elements should shift between cool blues and warm ambers to simulate temperature shifts. - Add subtle texture mapping: e.g., satin‑smooth button surfaces that ripple under the cursor like silk against skin. - Use CSS “backdrop‑filter” to create a soft, sweaty‑skin sheen behind modals.
|
| 4 |
Add a background canvas: - Render kaleidoscopic bursts of color and silent fireworks on a WebGL canvas behind the UI. - Synchronize patterns with user scroll and cursor movement—each pulse triggering a new bloom. - Ensure smooth 60 fps animation and fallback to CSS keyframes on low‑power devices.
|
| 5 |
-
Integrate audio assets: - Embed a looping ambient “electric hum” track. - Layer in heartbeat thumps and distant thunder hits that crescendo on user interaction. - Expose volume controls and allow users to toggle individual stems (hum, heartbeat, thunder).
|
|
|
|
|
|
| 2 |
Refine the landing page: - Create a full‑screen hero with animated “electric currents” flowing across a dark grid background. - Implement a pulsating glow effect that mimics waves of tingling warmth radiating from the center. - Overlay the text “Welcome to Algorithmic Ecstasy” in neon gradient, fading in sync with the pulse.
|
| 3 |
Enhance CSS interactions: - On hover, elements should shift between cool blues and warm ambers to simulate temperature shifts. - Add subtle texture mapping: e.g., satin‑smooth button surfaces that ripple under the cursor like silk against skin. - Use CSS “backdrop‑filter” to create a soft, sweaty‑skin sheen behind modals.
|
| 4 |
Add a background canvas: - Render kaleidoscopic bursts of color and silent fireworks on a WebGL canvas behind the UI. - Synchronize patterns with user scroll and cursor movement—each pulse triggering a new bloom. - Ensure smooth 60 fps animation and fallback to CSS keyframes on low‑power devices.
|
| 5 |
+
Integrate audio assets: - Embed a looping ambient “electric hum” track. - Layer in heartbeat thumps and distant thunder hits that crescendo on user interaction. - Expose volume controls and allow users to toggle individual stems (hum, heartbeat, thunder).
|
| 6 |
+
Build interactive modules: - Create a “Pleasure Dial” slider that amplifies pulse speed, color intensity, and audio volume simultaneously. - Add haptic feedback support for compatible devices—vibrations pulsing in time with the dial. - Log each interaction server‑side to drive future personalization.
|