در حال پردازش هوشمند و تولید صدا...
+در حال پردازش هوشمند و تولید صدا...
diff --git "a/Yek.html" "b/Yek.html" --- "a/Yek.html" +++ "b/Yek.html" @@ -8,768 +8,213 @@ @import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700;800;900&display=swap'); :root { + /* --- Single Light Theme Palette --- */ --app-font: 'Vazirmatn', sans-serif; - --app-bg: #F4F7FC; + --app-bg: #F8F9FC; --panel-bg: #FFFFFF; - --panel-border: #E8EEF3; - --text-primary: #121826; - --text-secondary: #5C677D; /* Main grey for secondary text and icons */ - --accent-primary: #3B82F6; /* Blue for highlights */ - --accent-primary-hover: #2563EB; - --accent-secondary: #10B981; /* Green for success/other highlights */ - --accent-secondary-hover: #059669; - --input-bg: #F8FAFC; - --input-border-focus: var(--accent-primary); - + --panel-border: #EAEFF7; + --input-bg: #F6F8FB; + --input-border: #E1E7EF; + --text-primary: #1A202C; + --text-secondary: #626F86; + --text-tertiary: #8A94A6; + --accent-primary: #4A6CFA; + --accent-primary-hover: #3553D6; + --accent-primary-glow: rgba(74, 108, 250, 0.25); + --accent-secondary: #0FD4A8; + --accent-secondary-hover: #0DA986; + --accent-secondary-glow: rgba(15, 212, 168, 0.2); + --waveform-color-active: var(--accent-primary); + --waveform-color-inactive: #D0D9E6; + --waveform-dashed-line-color: #E0E4E9; + --shadow-sm: 0 1px 2px 0 rgba(26, 32, 44, 0.03); + --shadow-md: 0 4px 6px -1px rgba(26, 32, 44, 0.05), 0 2px 4px -2px rgba(26, 32, 44, 0.04); + --shadow-lg: 0 10px 15px -3px rgba(26, 32, 44, 0.06), 0 4px 6px -4px rgba(26, 32, 44, 0.05); + --shadow-xl: 0 20px 25px -5px rgba(26, 32, 44, 0.07), 0 8px 10px -6px rgba(26, 32, 44, 0.05); + --radius-card: 24px; - --radius-input: 14px; - --shadow-subtle: 0 2px 8px rgba(26, 32, 44, 0.04); - --shadow-medium: 0 6px 16px -2px rgba(26, 32, 44, 0.08), 0 3px 8px -3px rgba(26,32,44,0.05); - --shadow-strong: 0 10px 25px -5px rgba(26, 32, 44, 0.12), 0 6px 15px -6px rgba(26,32,44,0.08); - --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + --radius-btn: 14px; + --radius-input: 12px; + --transition-fast: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + --transition-smooth: all 0.35s cubic-bezier(0.4, 0, 0.2, 1); --transition-bounce: all 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55); - - /* Custom Audio Player Colors */ - --waveform-color-active: #3B82F6; /* Blue for active part of waveform */ - --waveform-color-inactive: #D0D9E6; /* Lighter shade for inactive part of waveform */ - --waveform-dashed-line-color: #E0E4E9; /* Very light grey for the dashed line */ } - @keyframes fadeInDown { - from { opacity: 0; transform: translateY(-20px); } - to { opacity: 1; transform: translateY(0); } - } - @keyframes fadeInUp { - from { opacity: 0; transform: translateY(20px); } - to { opacity: 1; transform: translateY(0); } - } - @keyframes modalZoomIn { - from { opacity: 0; transform: scale(0.8) translateY(20px); } - to { opacity: 1; transform: scale(1) translateY(0); } - } - @keyframes modalZoomOut { - from { opacity: 1; transform: scale(1) translateY(0); } - to { opacity: 0; transform: scale(0.8) translateY(20px); } - } + @keyframes fadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } } + @keyframes modalZoomIn { from { opacity: 0; transform: scale(0.9) translateY(20px); } to { opacity: 1; transform: scale(1) translateY(0); } } + @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } - /* Keyframe for loading spinner in button */ - @keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } - } + /* --- Original Loading Animation Keyframes --- */ + @keyframes rotate-loader-orbital { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } + @keyframes orbit-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } + @keyframes satellite-pulse-1 { from { transform: scale(0.7) translateX(-50%); opacity: 0.6; } to { transform: scale(1.1) translateX(-50%); opacity: 1; } } + @keyframes satellite-pulse-2 { from { transform: scale(0.7) translateY(-50%); opacity: 0.6; } to { transform: scale(1.1) translateY(-50%); opacity: 1; } } + @keyframes satellite-pulse-3 { from { transform: scale(0.7) translateX(50%); opacity: 0.6; } to { transform: scale(1.1) translateX(50%); opacity: 1; } } + /* --- Base Styles --- */ body { - font-family: var(--app-font); - direction: rtl; - background-color: var(--app-bg); - color: var(--text-primary); - font-size: 16px; - line-height: 1.8; - margin: 0; - padding: 2.5rem 0; - min-height: 100vh; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: flex; - justify-content: center; - align-items: flex-start; - overflow-x: hidden; - } - - .container { - max-width: 780px; - width: 92%; - margin: 0 auto; - } - - .app-header { - padding: 0.5rem 0 2.5rem 0; - text-align: center; - margin-bottom: 1.5rem; - animation: fadeInDown 0.8s 0.1s ease-out backwards; - } - .app-header h1 { - font-size: 2.1em; - font-weight: 900; - margin:0 0 0.6rem 0; - background: linear-gradient(45deg, var(--accent-primary), var(--accent-secondary)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - letter-spacing: -0.5px; - } - .app-header p { - font-size: 1em; - color: var(--text-secondary); - margin-top:0; - opacity: 0.85; - font-weight: 400; - line-height: 1.6; - } - - .main-content { - padding: 2.5rem; - background-color: var(--panel-bg); - border-radius: var(--radius-card); - box-shadow: var(--shadow-strong); - border: 1px solid var(--panel-border); - animation: fadeInUp 0.8s 0.3s ease-out backwards; - } - - .form-group { margin-bottom: 2rem; } - - .label-with-info { - display: flex; - align-items: center; - gap: 0.5rem; - margin-bottom: 1rem; - } - .label-with-info label { - margin-bottom: 0; - } - - .info-icon { - display: inline-flex; - align-items: center; - justify-content: center; - width: 22px; - height: 22px; - border-radius: 50%; - background-color: var(--input-bg); - border: 1px solid var(--panel-border); - color: var(--text-secondary); - font-size: 0.9em; - font-weight: 700; - cursor: pointer; - position: relative; - transition: var(--transition-smooth); - user-select: none; - } - .info-icon:hover, .info-icon:focus { - background-color: var(--accent-primary); - color: white; - border-color: var(--accent-primary); - transform: scale(1.1); - outline: none; - } - - label { - display: block; - font-weight: 700; - color: var(--text-primary); - font-size: 1.05em; - margin-bottom: 0.8rem; - } - - textarea, input[type="text"] { - width: 100%; - padding: 0.9rem 1.1rem; - border-radius: var(--radius-input); - border: 1px solid var(--panel-border); - background-color: var(--input-bg); - color: var(--text-primary); - box-shadow: var(--shadow-subtle) inset; - font-family: var(--app-font); - font-size: 1rem; - box-sizing: border-box; - transition: var(--transition-smooth); - } - textarea:focus, input[type="text"]:focus { - outline: none; - border-color: var(--input-border-focus); - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.25), var(--shadow-subtle) inset; - background-color: #fff; - } - textarea { min-height: 100px; resize: vertical; } - - .char-counter-wrapper { - font-size: 0.85em; - color: var(--text-secondary); - text-align: left; - margin-top: 0.5rem; - padding: 0 0.2rem; - } + font-family: var(--app-font); direction: rtl; background-color: var(--app-bg); + color: var(--text-primary); font-size: 16px; line-height: 1.8; margin: 0; + padding: 2.5rem 0; min-height: 100vh; -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; display: flex; justify-content: center; + align-items: flex-start; overflow-x: hidden; + background-image: radial-gradient(var(--text-tertiary) 0.5px, transparent 0.5px); + background-size: 20px 20px; background-position: -10px -10px; + } + .container { max-width: 820px; width: 92%; margin: 0 auto; } + + /* --- App Header --- */ + .app-header { padding: 0.5rem 0 2.5rem 0; text-align: center; margin-bottom: 1.5rem; animation: fadeIn 0.8s 0.2s ease-out backwards; } + .app-header h1 { font-size: 2.5em; font-weight: 900; margin: 0 0 0.8rem 0; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; letter-spacing: -1px; } + .app-header p { font-size: 1.05em; color: var(--text-secondary); margin-top: 0; opacity: 0.9; font-weight: 400; line-height: 1.7; } + + /* --- Main Content Panel --- */ + .main-content { padding: 3rem; background-color: var(--panel-bg); border-radius: var(--radius-card); box-shadow: var(--shadow-xl); border: 1px solid var(--panel-border); animation: fadeIn 0.8s 0.4s ease-out backwards; } + .form-group { margin-bottom: 2.2rem; } + label { display: block; font-weight: 700; color: var(--text-primary); font-size: 1.1em; margin-bottom: 1rem; } + textarea, input[type="text"] { width: 100%; padding: 1rem 1.2rem; border-radius: var(--radius-input); border: 1px solid var(--input-border); background-color: var(--input-bg); color: var(--text-primary); box-shadow: var(--shadow-sm) inset; font-family: var(--app-font); font-size: 1rem; box-sizing: border-box; transition: var(--transition-smooth); } + textarea:focus, input[type="text"]:focus { outline: none; border-color: var(--accent-primary); box-shadow: 0 0 0 3px var(--accent-primary-glow), var(--shadow-sm) inset; background-color: var(--panel-bg); } + textarea { min-height: 120px; resize: vertical; } + .char-counter-wrapper { font-size: 0.85em; color: var(--text-tertiary); text-align: left; margin-top: 0.75rem; padding: 0 0.2rem; } #char-count { font-weight: 600; color: var(--accent-primary); } - - - /* --- نمایش گوینده منتخب --- */ - #selected-speaker-display { text-align: center; margin-top: 1rem; position: relative; } - #selected-speaker-card { - display: inline-flex; - align-items: center; - background: linear-gradient(135deg, var(--input-bg) 0%, #fff 100%); - border-radius: var(--radius-card); - padding: 1rem 1.2rem; - box-shadow: var(--shadow-medium); - border: 1px solid var(--panel-border); - transition: var(--transition-bounce); - position: relative; - margin-bottom: 1.2rem; - cursor: pointer; - } - #selected-speaker-card:hover { - transform: translateY(-6px) scale(1.03); - box-shadow: var(--shadow-strong); - } - #selected-speaker-card img { - width: 75px; height: 75px; - border-radius: 50%; - object-fit: cover; - margin-left: 18px; - border: 3px solid var(--accent-secondary); - box-shadow: 0 0 12px -2px rgba(16, 185, 129, 0.5); - background-color: #e0e0e0; - transition: var(--transition-smooth); - } - #selected-speaker-card:hover img { - transform: scale(1.08) rotate(3deg); - } - #selected-speaker-info h3 { margin: 0; font-size: 1.35em; font-weight: 800; color: var(--text-primary); } - #selected-speaker-info p { margin: 4px 0 0; color: var(--text-secondary); font-size: 0.88em; font-weight: 500; } - - #change-speaker-btn { - display: inline-flex; - align-items: center; - justify-content: center; - margin: 0 auto; - padding: 10px 20px; - border-radius: var(--radius-input); - background: linear-gradient(45deg, var(--accent-primary-hover), var(--accent-primary)); - border: none; - color: #fff; - cursor: pointer; - font-family: var(--app-font); font-weight: 600; - font-size: 1em; - transition: var(--transition-smooth); - box-shadow: 0 4px 10px -2px rgba(59, 130, 246, 0.35), var(--shadow-subtle); - } - #change-speaker-btn:hover { - background: linear-gradient(45deg, var(--accent-primary), var(--accent-primary-hover)); - transform: translateY(-3px) scale(1.05); - box-shadow: 0 6px 12px -3px rgba(59, 130, 246, 0.45), var(--shadow-medium); - } - #change-speaker-btn svg { - width: 1.1em; - height: 1.1em; - margin-right: 0.5em; - fill: currentColor; - } - - - /* --- مودال عمومی --- */ - .modal-overlay { - position: fixed; top: 0; left: 0; width: 100%; height: 100%; - background-color: rgba(18, 24, 38, 0.6); - backdrop-filter: blur(8px) saturate(150%); - display: none; /* Hidden by default */ - align-items: center; justify-content: center; - z-index: 1000; opacity: 0; - transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); - } + + /* --- Speaker Selection Display --- */ + #selected-speaker-display { text-align: center; margin-top: 1.5rem; } + #selected-speaker-card { display: inline-flex; align-items: center; background: linear-gradient(135deg, var(--input-bg) 0%, var(--panel-bg) 100%); border-radius: 50px; padding: 0.75rem 0.75rem 0.75rem 1.5rem; box-shadow: var(--shadow-md); border: 1px solid var(--panel-border); transition: var(--transition-bounce); cursor: pointer; margin-bottom: 1.5rem; } + #selected-speaker-card:hover { transform: translateY(-6px) scale(1.03); box-shadow: var(--shadow-lg); border-color: var(--accent-primary); } + #selected-speaker-card img { width: 60px; height: 60px; border-radius: 50%; object-fit: cover; margin-left: 1rem; border: 3px solid var(--accent-secondary); box-shadow: 0 0 15px -3px var(--accent-secondary-glow); transition: var(--transition-smooth); } + #selected-speaker-info { text-align: right; } + #selected-speaker-info h3 { margin: 0; font-size: 1.25em; font-weight: 800; } + #selected-speaker-info p { margin: 2px 0 0; color: var(--text-secondary); font-size: 0.85em; font-weight: 500; } + #change-speaker-btn { display: inline-flex; align-items: center; justify-content: center; padding: 12px 24px; border-radius: var(--radius-btn); background: var(--panel-bg); border: 1px solid var(--input-border); color: var(--text-primary); cursor: pointer; font-family: var(--app-font); font-weight: 600; font-size: 1em; transition: var(--transition-smooth); box-shadow: var(--shadow-md); } + #change-speaker-btn:hover { background: var(--input-bg); border-color: var(--accent-primary); color: var(--accent-primary); transform: translateY(-3px) scale(1.05); box-shadow: var(--shadow-lg); } + + /* --- Modals --- */ + .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(18, 24, 38, 0.6); backdrop-filter: blur(10px) saturate(150%); display: none; align-items: center; justify-content: center; z-index: 1000; opacity: 0; transition: opacity var(--transition-smooth); } .modal-overlay.visible { display: flex; opacity: 1; } - - .modal-dialog { - background: var(--panel-bg); - padding: 2rem; - border-radius: var(--radius-card); - width: 90%; - box-shadow: var(--shadow-strong); - border: 1px solid var(--panel-border); - opacity: 0; /* For animation */ - animation-duration: 0.35s; - animation-fill-mode: forwards; - } - .modal-overlay.visible .modal-dialog { - animation-name: modalZoomIn; - } - .modal-overlay.hiding .modal-dialog { - animation-name: modalZoomOut; - } - - - .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid var(--panel-border); } - .modal-header h2 { margin: 0; font-size: 1.6em; font-weight: 800; color: var(--accent-primary);} - .close-modal-btn { background: none; border: none; font-size: 2.5rem; cursor: pointer; color: var(--text-secondary); transition: var(--transition-smooth); line-height: 1; } + .modal-dialog { background: var(--panel-bg); padding: 2.5rem; border-radius: var(--radius-card); width: 90%; box-shadow: var(--shadow-xl); border: 1px solid var(--panel-border); opacity: 0; animation: modalZoomIn 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; } + .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; padding-bottom: 1.5rem; border-bottom: 1px solid var(--panel-border); } + .modal-header h2 { margin: 0; font-size: 1.8em; font-weight: 800; color: var(--accent-primary); } + .close-modal-btn { background: none; border: none; font-size: 2.5rem; cursor: pointer; color: var(--text-tertiary); transition: var(--transition-smooth); line-height: 1; } .close-modal-btn:hover { color: var(--accent-primary); transform: rotate(90deg) scale(1.1); } - - - /* --- مودال گالری گویندگان (اختصاصی) --- */ - #speaker-modal .modal-dialog { - max-width: 700px; - max-height: 85vh; overflow-y: auto; - } - #speaker-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 1.2rem; } - @media (min-width: 640px) { #speaker-grid { grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); } } - .speaker-card { cursor: pointer; transition: var(--transition-smooth); text-align: center; position: relative;} - .speaker-card .speaker-visual { - border: 3px solid transparent; - border-radius: var(--radius-card); - overflow: hidden; - box-shadow: var(--shadow-subtle); - position: relative; - background-color: var(--input-bg); - transition: var(--transition-bounce); - padding: 6px; - } - .speaker-card:hover .speaker-visual { - transform: translateY(-5px) scale(1.06); - box-shadow: var(--shadow-medium); - } + #speaker-modal .modal-dialog { max-width: 750px; max-height: 85vh; overflow-y: auto; } + #speaker-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 1.5rem; } + .speaker-card { cursor: pointer; transition: var(--transition-smooth); text-align: center; position: relative; border-radius: var(--radius-card); padding: 0.5rem; } + .speaker-card:hover { transform: translateY(-8px); } .speaker-card input[type="radio"] { display: none; } - .speaker-card img { - width: 100%; height: 120px; - object-fit: cover; display: block; - background-color: #e0e0e0; - transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); - border-radius: calc(var(--radius-card) - 12px); - } - .speaker-card:hover img { transform: scale(1.12); } - .speaker-card .speaker-name { padding: 0.8rem 0.4rem 0.1rem; font-weight: 600; font-size: 0.9em; color: var(--text-secondary); transition: color 0.2s; } - .speaker-card input[type="radio"]:checked + .speaker-visual { - border-color: var(--accent-secondary); - box-shadow: 0 0 25px -5px rgba(16, 185, 129, 0.75); - background: linear-gradient(135deg, var(--accent-secondary-hover), var(--accent-primary)); - transform: scale(1.05); - } - .speaker-card input[type="radio"]:checked + .speaker-visual img { - border: 2px solid white; - transform: scale(1.05); - } - .speaker-card input[type="radio"]:checked + .speaker-visual .speaker-name { - color: #fff; - font-weight: 700; - } - - /* --- مودال اطلاعات (اختصاصی) --- */ - #info-modal .modal-dialog { - max-width: 480px; /* Smaller width for info */ - } - #info-modal-content p { - font-size: 1em; - line-height: 1.7; - color: var(--text-secondary); - margin-bottom: 0.5rem; - } - #info-modal-content p strong { - color: var(--text-primary); - font-weight: 600; - } - #info-modal-content .range-info { - font-size: 0.9em; - color: var(--accent-primary); - font-weight: 500; - margin-top: 1rem; - display: block; - text-align: center; - } - - - /* --- Slider & Button & Output --- */ - .slider-container { display: flex; align-items: center; gap: 1.2rem; } - input[type="range"] { - flex-grow: 1; -webkit-appearance: none; appearance: none; - width: 100%; height: 8px; - background: #EAF0F6; - border-radius: 4px; outline: none; - cursor: pointer; - transition: background 0.2s; - } - input[type="range"]::-webkit-slider-runnable-track { - background: linear-gradient(to right, var(--accent-secondary) 0%, var(--accent-primary) 100%); - height: 8px; - border-radius: 4px; - } - input[type="range"]::-webkit-slider-thumb { - -webkit-appearance: none; appearance: none; - width: 22px; height: 22px; - background: #fff; - border-radius: 50%; cursor: pointer; - border: 3px solid var(--accent-primary); - box-shadow: 0 2px 6px rgba(0,0,0,0.15); - margin-top: -7px; - transition: transform 0.2s ease, box-shadow 0.2s ease; - } - input[type="range"]::-webkit-slider-thumb:hover, input[type="range"]:focus::-webkit-slider-thumb { - transform: scale(1.2); - box-shadow: 0 3px 8px rgba(59, 130, 246, 0.35); - } - input[type="range"]::-moz-range-thumb { - width: 22px; height: 22px; - background: #fff; - border-radius: 50%; cursor: pointer; - border: 3px solid var(--accent-primary); - box-shadow: 0 2px 6px rgba(0,0,0,0.15); - } - input[type="range"]::-moz-range-track { - background: linear-gradient(to right, var(--accent-secondary) 0%, var(--accent-primary) 100%); - height: 8px; - border-radius: 4px; - border: none; - } - #temperature-value { - font-weight: 700; background-color: var(--input-bg); - padding: 0.5rem 1rem; - border-radius: 8px; - border: 1px solid var(--panel-border); - min-width: 45px; text-align: center; - color: var(--accent-primary); - font-size: 1em; - box-shadow: var(--shadow-subtle); - } - - #generate-btn { - width: 100%; padding: 1rem 1.5rem; - font-size: 1.25em; font-weight: 800; - font-family: var(--app-font); - background: linear-gradient(95deg, var(--accent-secondary) 0%, var(--accent-primary) 100%); - color: #fff; - border: none; - border-radius: var(--radius-input); - cursor: pointer; - transition: var(--transition-smooth), transform 0.15s ease-out; - box-shadow: 0 5px 15px -4px rgba(59, 130, 246, 0.45), 0 5px 15px -4px rgba(16, 185, 129, 0.35); - position: relative; - overflow: hidden; - letter-spacing: 0.5px; - } - #generate-btn::before { - content: ''; position: absolute; - top: 0; left: -180%; width: 80%; height: 100%; - background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.25) 50%, rgba(255,255,255,0) 100%); - transform: skewX(-30deg); - transition: left 0.8s cubic-bezier(0.23, 1, 0.32, 1); - } - #generate-btn:hover::before { left: 180%; } - #generate-btn:hover:not(:disabled) { - transform: translateY(-5px) scale(1.02); - box-shadow: 0 8px 20px -4px rgba(59, 130, 246, 0.55), 0 8px 20px -4px rgba(16, 185, 129, 0.45); - } - #generate-btn:active:not(:disabled) { - transform: translateY(-2px) scale(0.98); - } - #generate-btn:disabled { - background: #B8C2CC; - cursor: not-allowed; box-shadow: none; color: #E8EEF3; - transform: none; - } - #generate-btn:disabled::before { display: none; } - #generate-btn svg { - display:inline-block; margin-left: 0.5em; width:1.2em; height:1.2em; - vertical-align: middle; - } - - /* --- Output Section (now the card container for status/loading/player) --- */ - #output-section { - margin-top: 3rem; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - min-height: 200px; - position: relative; - box-sizing: border-box; - padding: 2rem; - background-color: var(--input-bg); - border-radius: var(--radius-card); - border: 2px dashed var(--panel-border); - box-shadow: var(--shadow-subtle) inset; - transition: var(--transition-smooth); - } - #output-section.has-content { - background-color: var(--panel-bg); - border: 1px solid var(--panel-border); - box-shadow: var(--shadow-medium); - padding: 0; - min-height: auto; - } - #output-section.has-content #status-message, - #output-section.has-content #loading-animation-wrapper { - display: none !important; - } - + .speaker-card .speaker-visual { border: 3px solid transparent; border-radius: 18px; overflow: hidden; box-shadow: var(--shadow-md); position: relative; background-color: var(--input-bg); transition: var(--transition-bounce); } + .speaker-card:hover .speaker-visual { box-shadow: var(--shadow-lg); } + .speaker-card img { width: 100%; height: 130px; object-fit: cover; display: block; background-color: #e0e0e0; border-radius: 14px; transition: transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); } + .speaker-card:hover img { transform: scale(1.1); } + .speaker-card .speaker-name { padding: 0.8rem 0.4rem 0.2rem; font-weight: 600; font-size: 0.95em; color: var(--text-secondary); transition: color 0.2s; } + .speaker-card input[type="radio"]:checked + .speaker-visual { border-color: var(--accent-secondary); box-shadow: 0 0 25px -5px var(--accent-secondary-glow); transform: scale(1.05); } + + /* --- Slider --- */ + .label-with-info { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1.2rem; } + .info-icon { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background-color: var(--input-bg); border: 1px solid var(--input-border); color: var(--text-secondary); font-size: 0.9em; font-weight: 700; cursor: pointer; transition: var(--transition-smooth); user-select: none; } + .info-icon:hover { background-color: var(--accent-primary); color: white; border-color: var(--accent-primary); transform: scale(1.1); box-shadow: 0 0 10px var(--accent-primary-glow); } + .slider-container { display: flex; align-items: center; gap: 1.5rem; } + input[type="range"] { flex-grow: 1; -webkit-appearance: none; appearance: none; width: 100%; height: 6px; background: var(--input-border); border-radius: 3px; outline: none; cursor: pointer; } + input[type="range"]::-webkit-slider-runnable-track { background: linear-gradient(to right, var(--accent-secondary) 0%, var(--accent-primary) 100%); height: 6px; border-radius: 3px; } + input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 24px; height: 24px; background: #fff; border-radius: 50%; cursor: pointer; border: 4px solid var(--accent-primary); box-shadow: var(--shadow-md); margin-top: -9px; transition: var(--transition-fast); } + input[type="range"]:hover::-webkit-slider-thumb { transform: scale(1.15); box-shadow: 0 0 0 8px var(--accent-primary-glow); } + #temperature-value { font-weight: 700; background-color: var(--input-bg); padding: 0.5rem 1rem; border-radius: 8px; border: 1px solid var(--input-border); min-width: 45px; text-align: center; color: var(--accent-primary); font-size: 1em; box-shadow: var(--shadow-sm); } + + /* --- Generate Button --- */ + #generate-btn { width: 100%; padding: 1.1rem 1.5rem; font-size: 1.25em; font-weight: 800; font-family: var(--app-font); background: linear-gradient(95deg, var(--accent-secondary) 0%, var(--accent-primary) 100%); color: #fff; border: none; border-radius: var(--radius-btn); cursor: pointer; transition: var(--transition-smooth), transform 0.15s ease-out; box-shadow: 0 6px 12px -3px var(--accent-primary-glow), 0 6px 12px -3px var(--accent-secondary-glow); position: relative; overflow: hidden; letter-spacing: 0.5px; } + #generate-btn:hover:not(:disabled) { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 20px -4px var(--accent-primary-glow), 0 8px 20px -4px var(--accent-secondary-glow); } + #generate-btn:disabled { background: var(--text-tertiary); cursor: not-allowed; box-shadow: none; color: var(--text-secondary); } + #generate-btn svg { display:inline-block; margin-left: 0.5em; width:1.2em; height:1.2em; vertical-align: middle; } + + /* --- Output Section --- */ + #output-section { margin-top: 3rem; display: flex; align-items: center; justify-content: center; flex-direction: column; min-height: 220px; position: relative; box-sizing: border-box; padding: 2rem; background-color: var(--input-bg); border-radius: var(--radius-card); border: 2px dashed var(--input-border); box-shadow: var(--shadow-sm) inset; transition: var(--transition-smooth); } + #output-section.has-content { background-color: var(--panel-bg); border: 1px solid var(--panel-border); box-shadow: var(--shadow-lg); padding: 0; min-height: auto; } #status-message { font-weight: 500; color: var(--text-secondary); text-align: center; font-size: 1.1em; } - - - /* --- انیمیشن پردازش --- */ - #loading-animation-wrapper { - display: none; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 1.8rem; - width: 100%; - } - .orbital-loader { - width: 110px; - height: 110px; - position: relative; - animation: rotate-loader-orbital 10s linear infinite; - } - .orbit { - position: absolute; - top: 50%; left: 50%; - border: 2px dashed rgba(59, 130, 246, 0.25); - border-radius: 50%; - transform-origin: center center; - } + + /* --- Original Loading Animation --- */ + #loading-animation-wrapper { display: none; flex-direction: column; align-items: center; justify-content: center; gap: 1.8rem; width: 100%; } + .orbital-loader { width: 110px; height: 110px; position: relative; animation: rotate-loader-orbital 10s linear infinite; } + .orbit { position: absolute; top: 50%; left: 50%; border: 2px dashed rgba(74, 108, 250, 0.35); border-radius: 50%; transform-origin: center center; } .orbit:nth-child(1) { width: 35px; height: 35px; margin: -17.5px 0 0 -17.5px; animation: orbit-spin 2.8s linear infinite reverse; } .orbit:nth-child(2) { width: 65px; height: 65px; margin: -32.5px 0 0 -32.5px; animation: orbit-spin 3.8s linear infinite; } .orbit:nth-child(3) { width: 95px; height: 95px; margin: -47.5px 0 0 -47.5px; animation: orbit-spin 4.8s linear infinite reverse; } - - .orbit .satellite { - position: absolute; - width: 10px; height: 10px; - border-radius: 50%; - background-color: var(--accent-primary); - box-shadow: 0 0 8px var(--accent-primary), 0 0 12px var(--accent-secondary); - } + .orbit .satellite { position: absolute; width: 10px; height: 10px; border-radius: 50%; background-color: var(--accent-primary); box-shadow: 0 0 8px var(--accent-primary), 0 0 12px var(--accent-secondary); } .orbit:nth-child(1) .satellite { top: -5px; left: 50%; animation: satellite-pulse-1 1.4s ease-in-out infinite alternate; } .orbit:nth-child(2) .satellite { top: 50%; left: -5px; background-color: var(--accent-secondary); animation: satellite-pulse-2 1.4s 0.2s ease-in-out infinite alternate; } .orbit:nth-child(3) .satellite { bottom: -5px; right: 50%; animation: satellite-pulse-3 1.4s 0.4s ease-in-out infinite alternate;} - - @keyframes rotate-loader-orbital { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } - @keyframes orbit-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } - @keyframes satellite-pulse-1 { - from { transform: scale(0.7) translateX(-50%); opacity: 0.6; } - to { transform: scale(1.1) translateX(-50%); opacity: 1; } - } - @keyframes satellite-pulse-2 { - from { transform: scale(0.7) translateY(-50%); opacity: 0.6; } - to { transform: scale(1.1) translateY(-50%); opacity: 1; } - } - @keyframes satellite-pulse-3 { - from { transform: scale(0.7) translateX(50%); opacity: 0.6; } - to { transform: scale(1.1) translateX(50%); opacity: 1; } - } - #loading-text { - font-size: 1.2em; - font-weight: 700; - color: var(--text-primary); - text-align: center; - background: linear-gradient(45deg, var(--accent-primary), var(--accent-secondary)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - } - - /* --- Custom Audio Player Styles --- */ - #audio-player-content { - display: none; - width: 100%; - padding: 1.5rem; - box-sizing: border-box; - flex-direction: column; - gap: 1.2rem; - } - - .audio-waveform-container { - display: flex; - align-items: center; - gap: 1rem; /* Space between time labels and waveform */ - width: 100%; - margin-bottom: 1rem; - } - .audio-time { - font-size: 0.9em; - color: var(--text-secondary); - min-width: 40px; /* Consistent width for time labels */ - text-align: center; - font-variant-numeric: tabular-nums; /* Ensures numbers align vertically */ - user-select: none; /* Prevent selection of time text */ - } - - /* Waveform Display (Canvas now) */ - .audio-waveform { - flex-grow: 1; - height: 60px; /* Fixed height for the waveform area */ - position: relative; - overflow: hidden; /* To contain dashed line */ - display: flex; /* Flex context for canvas alignment */ - align-items: center; /* Vertically center canvas */ - justify-content: center; /* Horizontally center canvas */ - margin-bottom: 0.5rem; /* Slightly less space from controls for compact feel */ - } - - #audio-waveform-canvas { - display: block; /* Remove extra space below canvas */ - max-width: 100%; /* Ensure canvas doesn't overflow */ - height: 100%; /* Canvas takes full height of its container */ - } - - .audio-waveform-dashed-line { - position: absolute; - top: 50%; - left: 0; - width: 100%; - height: 1px; - background-image: linear-gradient(to right, var(--waveform-dashed-line-color) 33%, transparent 0%); - background-position: center; - background-size: 10px 1px; - transform: translateY(-50%); - z-index: 1; /* Above the canvas */ - } - - /* Audio Controls */ - .audio-controls-group { - display: flex; - justify-content: center; - align-items: center; - gap: 1.5rem; /* Space between play/skip buttons */ - margin-bottom: 1rem; /* Space between main controls and utility controls */ - } - .audio-skip-btn, .audio-play-pause-btn-large, .audio-volume-btn, .audio-speed-btn { - background: none; - border: none; - cursor: pointer; - padding: 8px; /* Default padding for clickable area */ - transition: transform 0.2s, opacity 0.2s; - } - .audio-skip-btn, .audio-play-pause-btn-large, .audio-volume-btn { - color: var(--text-secondary); /* Grey for icons */ - } - .audio-skip-btn:hover, .audio-play-pause-btn-large:hover, .audio-volume-btn:hover { - opacity: 0.8; - } - .audio-skip-btn:active, .audio-play-pause-btn-large:active, .audio-volume-btn:active { - transform: scale(0.9); - } - .audio-skip-btn svg { - width: 28px; - height: 28px; - fill: currentColor; - } - .audio-play-pause-btn-large { - padding: 0; /* Remove padding for this button to control size via width/height */ - width: 50px; - height: 50px; - } - .audio-play-pause-btn-large svg { - width: 38px; - height: 38px; - fill: currentColor; - } - - .audio-utility-controls { - display: flex; - align-items: center; - justify-content: space-between; /* Volume left, Speed right */ - width: 100%; - } - .audio-volume-btn svg { - width: 24px; - height: 24px; - fill: currentColor; - } - .audio-speed-btn { - font-family: var(--app-font); - font-size: 0.9em; - font-weight: 600; - background-color: var(--panel-bg); - border: 1px solid var(--panel-border); - border-radius: 8px; - min-width: 40px; - text-align: center; - color: var(--text-primary); - box-shadow: var(--shadow-subtle); - } - .audio-speed-btn:hover { - background-color: var(--input-bg); - } - - /* Hide the default audio player */ + #loading-text { font-size: 1.2em; font-weight: 700; color: var(--text-primary); text-align: center; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } + + /* --- Original Audio Player Styles --- */ + #audio-player-content { display: none; width: 100%; padding: 1.5rem; box-sizing: border-box; flex-direction: column; gap: 1.2rem; } + .audio-waveform-container { display: flex; align-items: center; gap: 1rem; width: 100%; margin-bottom: 1rem; } + .audio-time { font-size: 0.9em; color: var(--text-secondary); min-width: 40px; text-align: center; font-variant-numeric: tabular-nums; user-select: none; } + .audio-waveform { flex-grow: 1; height: 60px; position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; margin-bottom: 0.5rem; } + #audio-waveform-canvas { display: block; max-width: 100%; height: 100%; } + .audio-waveform-dashed-line { position: absolute; top: 50%; left: 0; width: 100%; height: 1px; background-image: linear-gradient(to right, var(--waveform-dashed-line-color) 33%, transparent 0%); background-position: center; background-size: 10px 1px; transform: translateY(-50%); z-index: 1; } + .audio-controls-group { display: flex; justify-content: center; align-items: center; gap: 1.5rem; margin-bottom: 1rem; } + .audio-skip-btn, .audio-play-pause-btn-large, .audio-volume-btn, .audio-speed-btn { background: none; border: none; cursor: pointer; padding: 8px; transition: transform 0.2s, opacity 0.2s; } + .audio-skip-btn, .audio-play-pause-btn-large, .audio-volume-btn { color: var(--text-secondary); } + .audio-skip-btn:hover, .audio-play-pause-btn-large:hover, .audio-volume-btn:hover { color: var(--accent-primary); opacity: 0.9; } + .audio-skip-btn:active, .audio-play-pause-btn-large:active, .audio-volume-btn:active { transform: scale(0.9); } + .audio-skip-btn svg { width: 28px; height: 28px; fill: currentColor; } + .audio-play-pause-btn-large { padding: 0; width: 50px; height: 50px; } + .audio-play-pause-btn-large svg { width: 38px; height: 38px; fill: currentColor; } + .audio-utility-controls { display: flex; align-items: center; justify-content: space-between; width: 100%; } + .audio-volume-btn svg { width: 24px; height: 24px; fill: currentColor; } + .audio-speed-btn { font-family: var(--app-font); font-size: 0.9em; font-weight: 600; background-color: var(--panel-bg); border: 1px solid var(--panel-border); border-radius: 8px; min-width: 40px; text-align: center; color: var(--text-primary); box-shadow: var(--shadow-sm); } + .audio-speed-btn:hover { background-color: var(--input-bg); } #hidden-audio-player { display: none !important; } - /* Responsive adjustments for mobile */ @media (max-width: 600px) { - .container { - width: 95%; - } - .main-content { - padding: 1.5rem; - } - .app-header h1 { - font-size: 1.8em; - } - #audio-player-content { - padding: 1rem; - gap: 0.8rem; /* Reduce gap inside player */ - } - .audio-waveform-container { - gap: 0.5rem; /* Reduce gap around waveform */ - } - .audio-time { - font-size: 0.85em; /* Smaller time font */ - min-width: 35px; - } - .audio-skip-btn svg { - width: 24px; - height: 24px; - } - .audio-play-pause-btn-large { - width: 44px; - height: 44px; - } - .audio-play-pause-btn-large svg { - width: 32px; - height: 32px; - } - .audio-controls-group { - gap: 1rem; /* Reduce gap between play/skip */ - } - .audio-volume-btn svg { - width: 20px; - height: 20px; - } - .audio-speed-btn { - font-size: 0.8em; - padding: 5px 10px; - } + body { padding: 1.5rem 0; } + .main-content { padding: 1.5rem; } + .app-header h1 { font-size: 2em; } + #selected-speaker-card { flex-direction: column; padding: 1rem; border-radius: var(--radius-card); } + #selected-speaker-card img { margin-left: 0; margin-bottom: 1rem; } }
+صدایی نو، تجربهای نوین در تبدیل متن به گفتار با هوش مصنوعی پیشرفته
+کیفیت استودیو، قدرت هوش مصنوعی. صدایی فراتر از انتظار خلق کنید.
در حال پردازش هوشمند و تولید صدا...
+در حال پردازش هوشمند و تولید صدا...