:root{
  --indigo:#1f2a44; --indigo2:#2c3a5e; --noren:#b5322f; --noren2:#d4423d;
  --gold:#c9a45c; --cream:#f7f3ea; --paper:#fbf8f1; --ink:#23252b;
  --muted:#8a8578; --line:#e8e1d2; --shadow:0 6px 24px rgba(31,42,68,.10);
  --bubble-ai:#fff; --bubble-me:#1f2a44;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;margin:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  background:var(--paper);color:var(--ink);overflow:hidden;
}
#app{display:flex;flex-direction:column;height:100dvh;max-width:860px;margin:0 auto;background:var(--paper);position:relative}

/* 顶部 */
header{
  background:linear-gradient(135deg,var(--indigo),var(--indigo2));color:#fff;
  padding:14px 18px;display:flex;align-items:center;gap:12px;flex:none;
  box-shadow:0 2px 14px rgba(0,0,0,.18);z-index:10;
}
header .logo{
  width:46px;height:46px;border-radius:12px;flex:none;
  background:linear-gradient(135deg,var(--noren),var(--noren2));
  display:flex;align-items:center;justify-content:center;font-size:24px;
  box-shadow:0 3px 10px rgba(181,50,47,.5);
}
header .tt{flex:1;min-width:0}
header h1{font-size:18px;margin:0;font-weight:700;letter-spacing:.5px}
header .sub{font-size:12px;opacity:.78;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
header .ai-badge{font-size:11px;background:rgba(201,164,92,.22);color:var(--gold);
  border:1px solid rgba(201,164,92,.5);padding:3px 8px;border-radius:20px;flex:none}

/* 聊天区 */
#chat{flex:1;overflow-y:auto;padding:18px 14px 8px;scroll-behavior:smooth;-webkit-overflow-scrolling:touch}
.msg{display:flex;margin-bottom:14px;gap:9px;animation:rise .3s ease}
@keyframes rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.msg .av{width:34px;height:34px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;font-size:18px}
.msg.ai .av{background:linear-gradient(135deg,var(--noren),var(--noren2))}
.bubble{max-width:78%;padding:11px 14px;border-radius:16px;font-size:15.5px;line-height:1.6;box-shadow:var(--shadow);white-space:pre-wrap;word-break:break-word}
.msg.ai .bubble{background:var(--bubble-ai);border-bottom-left-radius:5px;border:1px solid var(--line)}
.msg.me{flex-direction:row-reverse}
.msg.me .bubble{background:var(--bubble-me);color:#fff;border-bottom-right-radius:5px}
.typing .bubble{display:flex;gap:5px;padding:14px}
.typing span{width:7px;height:7px;border-radius:50%;background:var(--muted);animation:blink 1.2s infinite}
.typing span:nth-child(2){animation-delay:.2s}.typing span:nth-child(3){animation-delay:.4s}
@keyframes blink{0%,60%,100%{opacity:.25}30%{opacity:1}}

/* 推荐菜卡片 */
.recos{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:2px 0 4px 43px;max-width:88%}
.card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:11px;display:flex;flex-direction:column;box-shadow:var(--shadow);animation:rise .35s ease}
.card .emoji{font-size:30px;line-height:1;margin-bottom:6px}
.card .nm{font-size:14px;font-weight:600;line-height:1.35}
.card .sig{display:inline-block;font-size:10px;color:#fff;background:var(--noren);border-radius:5px;padding:1px 5px;margin-left:4px;vertical-align:middle}
.card .ds{font-size:11.5px;color:var(--muted);margin:4px 0 8px;line-height:1.45;flex:1}
.card .row{display:flex;align-items:center;justify-content:space-between;margin-top:auto}
.card .pr{color:var(--noren);font-weight:700;font-size:15px}
.card .add{background:var(--indigo);color:#fff;border:none;border-radius:9px;width:34px;height:30px;font-size:19px;font-weight:600;cursor:pointer;transition:transform .12s}
.card .add:active{transform:scale(.85)}
.card .add.added{background:var(--gold)}

/* 快捷词 */
.chips{display:flex;flex-wrap:wrap;gap:8px;padding:6px 14px 4px}
.chip{background:#fff;border:1px solid var(--line);border-radius:20px;padding:7px 13px;font-size:13px;color:var(--indigo);cursor:pointer;white-space:nowrap;box-shadow:var(--shadow)}
.chip:active{background:var(--cream)}

/* 语音输入区 */
.voicewrap{flex:none;background:var(--paper);border-top:1px solid var(--line);
  padding:8px 12px calc(12px + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center}
.heard{min-height:0;max-height:0;overflow:hidden;opacity:0;transition:all .25s;text-align:center;
  font-size:15px;color:var(--indigo);font-weight:600;width:100%}
.heard.show{max-height:60px;min-height:24px;opacity:1;margin-bottom:6px}
.voicebar{display:flex;align-items:center;justify-content:center;gap:26px;width:100%}
.sidebtn{width:46px;height:46px;border-radius:50%;border:1px solid var(--line);background:#fff;
  font-size:20px;cursor:pointer;flex:none;color:var(--indigo);display:flex;align-items:center;justify-content:center}
.sidebtn:active{transform:scale(.9)}
.sidebtn.off{opacity:.45}
.mic{position:relative;width:74px;height:74px;border-radius:50%;border:none;cursor:pointer;flex:none;
  background:linear-gradient(135deg,var(--noren),var(--noren2));color:#fff;
  box-shadow:0 6px 20px rgba(181,50,47,.45);display:flex;align-items:center;justify-content:center;
  transition:transform .15s}
.mic:active{transform:scale(.92)}
.mic .micicon{font-size:32px;position:relative;z-index:2}
.mic.listening{background:linear-gradient(135deg,#d4423d,#e8615b);animation:micpulse 1.3s infinite}
@keyframes micpulse{0%{box-shadow:0 0 0 0 rgba(212,66,61,.55)}70%{box-shadow:0 0 0 18px rgba(212,66,61,0)}100%{box-shadow:0 0 0 0 rgba(212,66,61,0)}}
.mic .waves{position:absolute;inset:0;display:none;align-items:center;justify-content:center;gap:3px;z-index:1}
.mic.listening .waves{display:flex}
.mic.listening .micicon{opacity:.25}
.mic .waves i{width:4px;height:14px;background:#fff;border-radius:3px;animation:wave 1s infinite ease-in-out}
.mic .waves i:nth-child(2){animation-delay:.15s}.mic .waves i:nth-child(3){animation-delay:.3s}
.mic .waves i:nth-child(4){animation-delay:.45s}.mic .waves i:nth-child(5){animation-delay:.6s}
@keyframes wave{0%,100%{height:10px}50%{height:30px}}
.mictip{font-size:12px;color:var(--muted);margin-top:8px;height:16px;text-align:center}
.kbdrow{display:flex;gap:9px;width:100%;margin-top:10px}
.kbdrow[hidden]{display:none}
.kbdrow input{flex:1;border:1px solid var(--line);background:#fff;border-radius:22px;padding:11px 16px;font-size:15.5px;outline:none}
.kbdrow input:focus{border-color:var(--indigo)}
.kbdrow .send{background:linear-gradient(135deg,var(--noren),var(--noren2));color:#fff;border:none;border-radius:50%;width:44px;height:44px;font-size:19px;cursor:pointer;flex:none}

/* 购物车浮条 */
.cartbar{position:absolute;left:12px;right:12px;bottom:74px;background:var(--indigo);color:#fff;border-radius:14px;
  display:flex;align-items:center;padding:11px 14px;box-shadow:0 8px 26px rgba(31,42,68,.35);cursor:pointer;
  transform:translateY(140%);transition:transform .3s cubic-bezier(.2,.8,.3,1);z-index:20}
.cartbar.show{transform:none}
.cartbar .ico{position:relative;font-size:22px;margin-right:12px}
.cartbar .badge{position:absolute;top:-7px;right:-9px;background:var(--noren);font-size:11px;min-width:18px;height:18px;
  border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px;font-weight:700}
.cartbar .ct{flex:1}.cartbar .ct b{font-size:17px}.cartbar .ct small{display:block;opacity:.7;font-size:11px}
.cartbar .go{background:var(--gold);color:var(--indigo);font-weight:700;padding:8px 16px;border-radius:10px;font-size:14px}

/* 购物车抽屉 */
.sheet-mask{position:fixed;inset:0;background:rgba(20,22,30,.5);opacity:0;pointer-events:none;transition:opacity .25s;z-index:30}
.sheet-mask.show{opacity:1;pointer-events:auto}
.sheet{position:absolute;left:0;right:0;bottom:0;max-width:860px;margin:0 auto;background:var(--paper);
  border-radius:20px 20px 0 0;transform:translateY(100%);transition:transform .3s cubic-bezier(.2,.8,.3,1);
  z-index:31;max-height:82dvh;display:flex;flex-direction:column}
.sheet.show{transform:none}
.sheet .hd{padding:16px 18px 10px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}
.sheet .hd h3{margin:0;font-size:17px}
.sheet .hd .x{font-size:22px;color:var(--muted);cursor:pointer;border:none;background:none}
.sheet .items{overflow-y:auto;padding:6px 14px;flex:1}
.line{display:flex;align-items:center;gap:11px;padding:11px 4px;border-bottom:1px solid var(--line)}
.line .e{font-size:26px}.line .info{flex:1;min-width:0}
.line .info .n{font-size:14.5px;font-weight:600}.line .info .p{font-size:12.5px;color:var(--noren);margin-top:2px}
.stepper{display:flex;align-items:center;gap:11px}
.stepper button{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:#fff;font-size:18px;cursor:pointer;color:var(--indigo)}
.stepper b{min-width:18px;text-align:center;font-size:15px}
.sheet .ft{padding:14px 18px calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:#fff;border-radius:0}
.sheet .tot{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.sheet .tot .big{font-size:24px;font-weight:800;color:var(--noren)}
.sheet .acts{display:flex;gap:10px}
.btn{flex:1;border:none;border-radius:12px;padding:14px;font-size:15.5px;font-weight:700;cursor:pointer}
.btn.ghost{background:#fff;border:1px solid var(--indigo);color:var(--indigo)}
.btn.primary{background:linear-gradient(135deg,var(--noren),var(--noren2));color:#fff}
.empty{text-align:center;color:var(--muted);padding:40px 20px;font-size:14px}

/* 下单成功 */
.toast{position:fixed;top:18px;left:50%;transform:translateX(-50%) translateY(-120%);background:var(--indigo);color:#fff;
  padding:12px 20px;border-radius:30px;font-size:14px;z-index:50;transition:transform .35s;box-shadow:var(--shadow)}
.toast.show{transform:translateX(-50%) translateY(0)}

@media(min-width:600px){.recos{grid-template-columns:1fr 1fr 1fr}}
