:root { --kakao-bg: #b2c7d9; --kakao-yellow: #fee500; --bot-bubble: #ffffff; --text: #111111; --subtext: #555555; --time: #6b7b8c; --border: rgba(0, 0, 0, 0.06); --safe-top: env(safe-area-inset-top, 0px); --safe-bottom: env(safe-area-inset-bottom, 0px); --composer-h: 58px; --bubble-max: min(78vw, 520px); } * { box-sizing: border-box; } html, body { margin: 0; width: 100%; height: 100%; height: -webkit-fill-available; overflow: hidden; background: var(--kakao-bg); font-family: -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Noto Sans KR", sans-serif; color: var(--text); -webkit-text-size-adjust: 100%; } .app { display: flex; flex-direction: column; width: 100%; max-width: none; height: 100%; height: 100vh; height: 100dvh; height: -webkit-fill-available; min-height: 100vh; min-height: 100dvh; min-height: -webkit-fill-available; margin: 0; background: var(--kakao-bg); } .app-header { flex-shrink: 0; display: flex; align-items: center; gap: 12px; padding: calc(10px + var(--safe-top)) clamp(12px, 3vw, 32px) 8px; background: var(--kakao-bg); } .app-header-brand { flex: 1; min-width: 0; overflow: hidden; } .app-header-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; margin-left: auto; } .app-btn-close { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; border: none; border-radius: 50%; background: rgba(255, 255, 255, 0.92); color: #333; cursor: pointer; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); } .app-btn-close:active { transform: scale(0.96); } .chat { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; padding: calc(12px + var(--safe-top)) clamp(12px, 3vw, 32px) 12px; scroll-behavior: smooth; } .msg-row { display: flex; margin-bottom: clamp(10px, 2vh, 16px); } .msg-row.user { justify-content: flex-end; } .msg-row.bot { justify-content: flex-start; align-items: flex-end; gap: clamp(6px, 1.5vw, 10px); } .bot-avatar { width: clamp(34px, 8vw, 42px); height: clamp(34px, 8vw, 42px); border-radius: 14px; background: #fff; display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); } .bot-avatar-img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 14px; } .bot-content { max-width: min(calc(100% - 52px), calc(100% - clamp(34px, 8vw, 42px) - 16px)); } .bot-name { margin: 0 0 4px 2px; } .bubble { position: relative; padding: clamp(8px, 2vw, 12px) clamp(10px, 2.5vw, 14px); border-radius: 16px; font-size: clamp(14px, 3.5vw, 16px); line-height: 1.55; white-space: pre-wrap; word-break: break-word; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .bubble.user { background: var(--kakao-yellow); border-top-right-radius: 4px; max-width: var(--bubble-max); } .bubble.bot { background: var(--bot-bubble); border-top-left-radius: 4px; max-width: min(85vw, 560px); } .bubble.bot.bubble--rich { white-space: normal; padding: clamp(10px, 2.5vw, 14px) clamp(12px, 3vw, 16px); line-height: 1.65; } /* ── ChatGPT / Gemini 스타일 마크다운 ── */ .bubble-body.md-content { display: flex; flex-direction: column; gap: 0.15em; font-size: clamp(14px, 3.5vw, 16px); color: #0d0d0d; } .md-content > * + * { margin-top: 0.1em; } .md-p { margin: 0 0 0.75em; line-height: 1.72; letter-spacing: -0.01em; } .md-p:last-child { margin-bottom: 0; } .md-p--compact { margin-bottom: 0.4em; } .md-p--compact:last-child { margin-bottom: 0; } .md-h { margin: 1em 0 0.45em; font-weight: 700; line-height: 1.35; letter-spacing: -0.02em; color: #0d0d0d; } .md-h:first-child { margin-top: 0; } .md-h1 { font-size: 1.12em; } .md-h2 { font-size: 1.06em; } .md-h3, .md-h4 { font-size: 1em; } .md-strong { font-weight: 700; color: #0d0d0d; } .md-em { font-style: italic; } .md-inline-code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88em; padding: 0.12em 0.38em; border-radius: 5px; background: #f4f4f4; color: #c7254e; word-break: break-word; } .md-link { color: #007aff; text-decoration: none; word-break: break-all; } .md-link:active { opacity: 0.75; } .md-list { margin: 0.25em 0 0.75em; padding-left: 1.4em; } .md-list--bullet { list-style: disc; } .md-list--ordered { list-style: decimal; } .md-list--nested { margin: 0.35em 0 0.15em; padding-left: 1.15em; } .md-li { margin: 0.4em 0; padding-left: 0.15em; line-height: 1.65; } .md-li::marker { color: #444; font-weight: 600; } .md-blockquote { margin: 0.65em 0; padding: 0.55em 0 0.55em 0.85em; border-left: 3px solid #d0d0d0; color: #444; background: linear-gradient(90deg, rgba(0, 0, 0, 0.03) 0%, transparent 100%); border-radius: 0 6px 6px 0; } .md-hr { border: none; border-top: 1px solid #e5e5e5; margin: 0.85em 0; } .md-code-wrap { margin: 0.65em 0 0.85em; border-radius: 10px; overflow: hidden; background: #f7f7f8; border: 1px solid #ececec; } .md-code-lang { padding: 6px 12px; font-size: 0.72em; font-weight: 600; color: #666; background: #efefef; border-bottom: 1px solid #e5e5e5; text-transform: lowercase; } .md-pre { margin: 0; padding: 12px 14px; overflow-x: auto; -webkit-overflow-scrolling: touch; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.55; color: #1a1a1a; white-space: pre-wrap; word-break: break-word; } .md-pre code { font-family: inherit; background: none; padding: 0; color: inherit; } .bubble-body { display: flex; flex-direction: column; } .msg-time { margin-top: 4px; font-size: clamp(10px, 2.2vw, 12px); color: var(--time); } .msg-row.user .msg-time { text-align: right; } .msg-row.bot .msg-time { margin-left: 2px; } .bubble.loading { color: var(--subtext); } .typing { display: inline-flex; gap: 4px; align-items: center; margin-left: 4px; } .typing span { width: 6px; height: 6px; border-radius: 50%; background: #8a96a3; animation: bounce 1.2s infinite ease-in-out; } .typing span:nth-child(2) { animation-delay: 0.15s; } .typing span:nth-child(3) { animation-delay: 0.3s; } @keyframes bounce { 0%, 80%, 100% { transform: translateY(0); opacity: 0.45; } 40% { transform: translateY(-4px); opacity: 1; } } /* ── 입력창 위 관련 질문 (app 모드) ── */ .related-questions-bar--app { flex-shrink: 0; border-top: 1px solid var(--border); background: #eef2f6; padding: 10px clamp(10px, 3vw, 24px) 8px; } .related-questions-bar__head { margin: 0 0 8px; font-size: 12px; font-weight: 700; color: var(--subtext); letter-spacing: -0.01em; } .related-questions-bar__scroll { display: flex; gap: 8px; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; padding-bottom: 2px; } .related-questions-bar__scroll::-webkit-scrollbar { display: none; } .related-questions-bar__chip { flex-shrink: 0; border: 1px solid #d8dce3; background: #fff; color: var(--text); border-radius: 999px; padding: 8px 14px; font-size: 13px; line-height: 1.35; cursor: pointer; white-space: nowrap; max-width: min(85vw, 320px); overflow: hidden; text-overflow: ellipsis; } .related-questions-bar__chip:hover:not(:disabled) { background: #f5f7fa; border-color: #c5cad3; } .related-questions-bar__chip:disabled { opacity: 0.55; cursor: not-allowed; } .composer { position: relative; z-index: 10; flex-shrink: 0; overflow: visible; padding: clamp(8px, 2vw, 12px) clamp(10px, 3vw, 24px) calc(clamp(8px, 2vw, 12px) + var(--safe-bottom)); background: #f6f6f6; border-top: 1px solid var(--border); } .composer form { display: flex; gap: clamp(6px, 1.5vw, 10px); align-items: center; width: 100%; max-width: none; } .composer input { flex: 1; min-width: 0; height: clamp(40px, 10vw, 44px); border: 1.5px solid #007aff; border-radius: 999px; padding: 0 clamp(14px, 3.5vw, 18px); font-size: clamp(14px, 3.5vw, 16px); background: #fff; outline: none; } .composer input:focus { border-color: #007aff; } .composer input:disabled { background: #fafafa; border-color: #c8c8c8; } .btn-send { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; height: clamp(36px, 9vw, 40px); min-width: clamp(56px, 15vw, 68px); padding: 0 clamp(16px, 4vw, 20px); border: none; border-radius: 999px; font-size: clamp(14px, 3.5vw, 16px); font-weight: 500; font-family: inherit; line-height: 1; cursor: default; transition: background 0.15s ease, color 0.15s ease; background: #ececec; color: #a8a8a8; } .btn-send.is-ready { background: #007aff; color: #fff; cursor: pointer; } .btn-send.is-ready:active { transform: scale(0.97); } .faq-wrap { position: relative; flex-shrink: 0; } .btn-faq { flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: clamp(40px, 10vw, 44px); height: clamp(40px, 10vw, 44px); border: none; border-radius: 50%; cursor: pointer; background: #fff; color: #007aff; border: 1.5px solid #007aff; transition: transform 0.15s ease, background 0.15s ease, color 0.15s ease; } .btn-faq:active, .btn-faq.is-open { transform: scale(0.96); background: #007aff; color: #fff; } .btn-faq:disabled { opacity: 0.45; cursor: not-allowed; } .faq-panel[hidden], .faq-panel.faq-panel--closed { display: none !important; } .faq-panel { position: fixed; left: 50%; right: auto; transform: translateX(-50%); bottom: calc(72px + var(--safe-bottom)); width: min(92vw, 360px); max-height: min(62vh, 520px); background: #fff; border-radius: 14px; box-shadow: 0 8px 28px rgba(0, 0, 0, 0.18); border: 1px solid rgba(0, 0, 0, 0.08); display: flex; flex-direction: column; overflow: hidden; z-index: 1000; } .faq-panel-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 14px; border-bottom: 1px solid #eee; font-size: 0.92rem; font-weight: 700; color: #222; flex-shrink: 0; } .faq-close { border: none; background: transparent; font-size: 1.4rem; line-height: 1; color: #888; cursor: pointer; padding: 0 4px; } .faq-body { overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 8px 10px 12px; } .faq-loading, .faq-empty { margin: 12px 8px; font-size: 0.85rem; color: #666; } .faq-section + .faq-section { margin-top: 10px; } .faq-cat { margin: 8px 6px 6px; font-size: 0.78rem; font-weight: 700; color: #007aff; letter-spacing: -0.01em; } .faq-list { list-style: none; margin: 0; padding: 0; } .faq-item { display: block; width: 100%; text-align: left; border: none; background: #f7f9fc; border-radius: 10px; padding: 10px 12px; margin-bottom: 6px; font-size: 0.84rem; line-height: 1.45; color: #222; cursor: pointer; font-family: inherit; } .faq-item:active { background: #e8f2ff; } .btn-voice { flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: clamp(40px, 10vw, 44px); height: clamp(40px, 10vw, 44px); border: none; border-radius: 50%; cursor: pointer; transition: transform 0.15s ease, background 0.15s ease, box-shadow 0.15s ease; background: #fff; color: #444; border: 1px solid #ddd; } .btn-voice:active { transform: scale(0.96); } .btn-send:disabled, .btn-voice:disabled, .composer input:disabled { opacity: 1; } .btn-voice:disabled, .composer input:disabled { opacity: 0.55; cursor: not-allowed; } .btn-voice.listening { background: #ff4d4f; border-color: #ff4d4f; color: #fff; box-shadow: 0 0 0 4px rgba(255, 77, 79, 0.25); animation: pulse-mic 1.2s ease-in-out infinite; } .btn-voice.unsupported { opacity: 0.35; cursor: not-allowed; } @keyframes pulse-mic { 0%, 100% { box-shadow: 0 0 0 4px rgba(255, 77, 79, 0.2); } 50% { box-shadow: 0 0 0 8px rgba(255, 77, 79, 0.12); } } .welcome-card { margin: 8px 0 clamp(14px, 3vh, 20px); padding: clamp(12px, 3vw, 16px); background: rgba(255, 255, 255, 0.72); border-radius: 14px; font-size: clamp(13px, 3.2vw, 15px); line-height: 1.6; color: #333; max-width: 100%; } /* ── Kakao ListCard 스타일 (주유·휴게소 등) ── */ .list-card-stack { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; max-width: min(85vw, 360px); } .action-buttons { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; max-width: min(85vw, 360px); } .action-button { display: inline-flex; align-items: center; justify-content: center; min-height: 34px; padding: 8px 12px; border: 1px solid rgba(0, 122, 255, 0.28); border-radius: 999px; background: #fff; color: #007aff; font-size: 13px; font-weight: 700; line-height: 1.2; text-decoration: none; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .action-button:active { transform: scale(0.98); } .list-card { background: #fff; border-radius: 14px; border: 1px solid rgba(0, 0, 0, 0.06); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); overflow: hidden; } .list-card__title { margin: 0; padding: 12px 14px 8px; font-size: 15px; font-weight: 700; line-height: 1.4; color: #111; } .list-card__items { list-style: none; margin: 0; padding: 0 10px 10px; } .list-card__row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 4px; border-top: 1px solid rgba(0, 0, 0, 0.05); } .list-card__row-link { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; color: inherit; text-decoration: none; } .list-card__row-link:active { opacity: 0.72; } .list-card__row:first-child { border-top: none; } .list-card__meta { min-width: 0; flex: 1; } .list-card__price { font-size: 17px; font-weight: 700; color: #111; line-height: 1.3; } .list-card__location { margin-top: 2px; font-size: 12px; color: #777; line-height: 1.3; } .list-card__fuel { flex-shrink: 0; width: 52px; height: 52px; border-radius: 10px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; background: #f5f5f5; color: #333; } .list-card__fuel-icon { font-size: 16px; line-height: 1; } .list-card__thumb { width: 36px; height: 36px; object-fit: contain; display: block; } .list-card__fuel-label { font-size: 10px; font-weight: 700; line-height: 1.1; } .list-card__fuel--gasoline { background: #1a1a1a; color: #fff; } .list-card__fuel--diesel { background: #f58220; color: #fff; } .list-card__fuel--lpg { background: #f5c518; color: #222; } .list-card__fuel--electric { background: #007aff; color: #fff; } .list-card__fuel--hydrogen { background: #34c759; color: #fff; } .list-card__fuel--food { background: #ff9500; color: #fff; } .list-card__fuel--food-soup, .list-card__fuel--food-rice, .list-card__fuel--food-meat, .list-card__fuel--food-fish, .list-card__fuel--food-noodle, .list-card__fuel--food-coffee, .list-card__fuel--food-bread, .list-card__fuel--food-drink, .list-card__fuel--food-premium, .list-card__fuel--food-recommend { background: #ff9500; color: #fff; } .list-card__fuel--facility, .list-card__fuel--facility-nursery, .list-card__fuel--facility-shower, .list-card__fuel--facility-pharmacy, .list-card__fuel--facility-carwash, .list-card__fuel--facility-repair { background: #5856d6; color: #fff; } .list-card__fuel--shop, .list-card__fuel--theme, .list-card__fuel--recruit { background: #007aff; color: #fff; } .list-card__fuel--road-smooth { background: #34c759; color: #fff; } .list-card__fuel--road-slow { background: #ffcc00; color: #222; } .list-card__fuel--road-congestion, .list-card__fuel--road-accident { background: #ff3b30; color: #fff; } .list-card__fuel--road-work { background: #ff9500; color: #fff; } .list-card__fuel--unknown { background: #8e8e93; color: #fff; } /* ── 유사 질문 Quick Reply (카카오톡 스타일) ── */ .quick-reply-wrap { margin-top: 10px; max-width: min(85vw, 360px); } .quick-reply-title { margin: 0 0 8px; font-size: 12px; font-weight: 600; color: #666; } .quick-reply-list { display: flex; flex-wrap: wrap; gap: 8px; } .quick-reply-chip { display: inline-flex; align-items: center; max-width: 100%; padding: 8px 12px; border: 1px solid #d8dce3; border-radius: 18px; background: #fff; color: #222; font-size: 13px; line-height: 1.35; text-align: left; cursor: pointer; font-family: inherit; transition: background 0.15s ease, border-color 0.15s ease; } .quick-reply-chip:hover:not(:disabled) { background: #fff9db; border-color: #fee500; } .quick-reply-chip:active:not(:disabled) { background: #fee500; } .quick-reply-chip:disabled { opacity: 0.55; cursor: not-allowed; } @media (min-width: 1024px) { :root { --bubble-max: min(520px, 45vw); } .chat { padding-left: max(32px, 8vw); padding-right: max(32px, 8vw); } .composer form { max-width: 1200px; margin: 0 auto; } } .bot-avatar-fallback { font-size: 0.72rem; font-weight: 700; color: #007aff; } .loading-text { color: var(--subtext); } .md-content p { margin: 0 0 0.75em; line-height: 1.72; } .md-content p:last-child { margin-bottom: 0; } .md-content ul, .md-content ol { margin: 0.25em 0 0.75em; padding-left: 1.4em; } .md-content li { margin: 0.4em 0; line-height: 1.65; } .suggestion-block { margin-top: 0.85em; } .suggestion-block__title { margin: 0 0 0.65em; font-weight: 500; } .suggestion-block__list { list-style: none; margin: 0.25em 0 0.75em; padding: 0; } .suggestion-block__list li { margin: 0.28em 0; } .suggestion-block__button { display: inline-flex; align-items: flex-start; gap: 0.35em; max-width: 100%; border: 0; padding: 0.1em 0; background: transparent; color: inherit; font: inherit; line-height: 1.65; text-align: left; cursor: pointer; } .suggestion-block__button:hover { color: #006ee6; text-decoration: underline; text-underline-offset: 3px; } .suggestion-block__button:disabled { cursor: default; text-decoration: none; } .suggestion-block__index { flex-shrink: 0; } .md-content h1, .md-content h2, .md-content h3, .md-content h4 { margin: 1em 0 0.45em; font-weight: 700; line-height: 1.35; } .md-content h1:first-child, .md-content h2:first-child, .md-content h3:first-child { margin-top: 0; } .md-content a { color: #007aff; word-break: break-all; } .md-content code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88em; padding: 0.12em 0.38em; border-radius: 5px; background: #f4f4f4; } .faq-category-title { margin: 8px 6px 6px; font-size: 0.78rem; font-weight: 700; color: #007aff; }