Gradient Footer Panel
A closing section: small label, call-to-action headline and an input with a typed placeholder, over a vertical gradient from off-white into blue, pink, red and orange. Below, a beige rounded footer card with logo, five link columns and a language menu that opens upward.
Taken from the page template Niancheng AI App Builder Home. Use it on its own, or combine it with the other components from the same template to rebuild the full page.
Plain HTML, CSS and a little vanilla JS, with no framework dependency. Copy the prompt into Claude Code, Cursor, Trae or Codex and the model adds Gradient Footer Panel to your project in your colors.
Where to use it
Site headers, tab switches, segmented controls, side navigation and footers.
Install
With Builder, install it with the 8pt CLI or call it directly from an editor connected to 8pt MCP.
Code
Source for Gradient Footer Panel. Motion uses only transform and opacity and respects the Reduce motion setting.
<section class="x-gfp"><div class="gfp-bg" aria-hidden="true"></div><div class="gfp-cta"><small>AI 应用构建器</small><h2>准备好让想法上线了吗?</h2><form class="gfp-box cmp" action="#"><div class="cmp-f"><textarea rows="2" aria-label="描述你的想法"></textarea><span class="cmp-ph">让念成帮我做<b class="cmp-t"></b><i class="cmp-c"></i></span></div><div class="cmp-bar"><button type="button" class="cmp-add" aria-label="添加附件"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></svg></button><span class="cmp-sp"></span><div class="cmp-mode"><button type="button" class="cmp-mb" aria-haspopup="true"><span>构建</span><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg></button><div class="cmp-menu"><button type="button" class="on">构建</button><button type="button">规划</button><button type="button">问答</button></div></div><button type="button" class="cmp-mic" aria-label="语音输入"><svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg></button><button type="submit" class="cmp-go" aria-label="发送"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5M6 11l6-6 6 6"/></svg></button></div></form></div><footer class="gfp-card"><div class="gfp-l"><span class="lg"><svg viewBox="0 0 32 32"><defs><linearGradient id="lgG" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#FF7A1A"/><stop offset=".5" stop-color="#FF3D8B"/><stop offset="1" stop-color="#7B61FF"/></linearGradient></defs><path d="M6 4h12a10 10 0 0 1 10 10v4a10 10 0 0 1-10 10H10a6 6 0 0 1-6-6V6a2 2 0 0 1 2-2z" fill="url(#lgG)"/><path d="M15.5 9l1.6 4.4 4.4 1.6-4.4 1.6-1.6 4.4-1.6-4.4-4.4-1.6 4.4-1.6z" fill="#fff"/></svg></span><div class="gfp-lang"><button type="button" class="gfp-lb"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3 3 15 0 18M12 3c-3 3-3 15 0 18"/></svg><span>简体中文</span><svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg></button><div class="gfp-lm"><button type="button" class="on">简体中文</button><button type="button">English</button><button type="button">日本語</button></div></div></div><nav><b>公司</b><a href="#">加入我们</a><a href="#">媒体资料</a><a href="#">企业版</a><a href="#">安全</a><a href="#">信任中心</a><a href="#">合作</a></nav><nav><b>产品</b><a href="#">价格</a><a href="#">学生优惠</a><a href="#">小团队</a><a href="#">创业者</a><a href="#">设计师</a><a href="#">内部工具</a><a href="#">下载应用</a></nav><nav><b>资源</b><a href="#">学习中心</a><a href="#">模板</a><a href="#">指南</a><a href="#">连接器</a><a href="#">视频</a><a href="#">博客</a><a href="#">帮助</a></nav><nav><b>条款</b><a href="#">隐私政策</a><a href="#">Cookie 设置</a><a href="#">服务条款</a><a href="#">平台规则</a><a href="#">无障碍</a></nav><nav><b>社区</b><a href="#">成为伙伴</a><a href="#">联盟计划</a><a href="#">行为准则</a><a href="#">社区论坛</a><a href="#">视频频道</a></nav></footer></section>
.x-gfp{--ink:#1C1C1A;--mut:#5F5F5B;--line:#E9E7E1;--cream:#FCFBF8;--card:#F5F4EF;--blue:#4C7DFF;--pink:#FF66CC;--red:#FF2E63;--org:#FF7A1A;font-family:"Inter","Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-align:left;color:var(--ink)}.x-gfp,.x-gfp *{box-sizing:border-box}.x-gfp a{color:inherit;text-decoration:none}.x-gfp button{font:inherit;cursor:pointer;color:inherit}.x-gfp img{display:block;max-width:100%}.x-gfp .cmp{position:relative;width:100%;max-width:720px;margin:0 auto;background:rgba(255,255,255,.96);border-radius:28px;padding:16px 14px 12px 20px;box-shadow:0 1px 0 rgba(255,255,255,.8) inset,0 24px 60px -24px rgba(40,20,80,.35),0 0 0 1px rgba(20,20,20,.05);text-align:left;transition:box-shadow .3s}.x-gfp .cmp:focus-within{box-shadow:0 0 0 4px rgba(76,125,255,.18),0 24px 60px -24px rgba(40,20,80,.35)}.x-gfp .cmp-f{position:relative}.x-gfp .cmp textarea{width:100%;border:0;outline:0;resize:none;background:transparent;font:inherit;font-size:16px;line-height:1.5;color:var(--ink);padding:0;min-height:48px}.x-gfp .cmp-ph{position:absolute;left:0;top:0;font-size:16px;line-height:1.5;color:#8A8A85;pointer-events:none;white-space:nowrap;overflow:hidden;max-width:100%}.x-gfp .cmp-ph b{font-weight:400}.x-gfp .cmp-c{display:inline-block;width:1.5px;height:17px;background:#8A8A85;vertical-align:-3px;margin-left:1px;animation:cmpB 1s steps(1) infinite}.x-gfp .cmp.has .cmp-ph{opacity:0}@keyframes cmpB{50%{opacity:0}}.x-gfp .cmp-bar{display:flex;align-items:center;gap:6px;margin-top:4px}.x-gfp .cmp-sp{flex:1}.x-gfp .cmp-add{width:30px;height:30px;border-radius:50%;border:1px solid var(--line);background:#fff;display:grid;place-items:center;color:#6B6B66;transition:background .2s}.x-gfp .cmp-add:hover{background:var(--card)}.x-gfp .cmp-mode{position:relative}.x-gfp .cmp-mb{display:flex;align-items:center;gap:4px;height:30px;padding:0 10px;border:0;background:transparent;border-radius:10px;font-size:13px;color:#5F5F5B}.x-gfp .cmp-mb:hover{background:var(--card)}.x-gfp .cmp-mb svg{transition:transform .2s}.x-gfp .cmp-mode.open .cmp-mb svg{transform:rotate(180deg)}.x-gfp .cmp-menu{position:absolute;right:0;top:36px;z-index:5;min-width:120px;background:#fff;border-radius:12px;padding:6px;box-shadow:0 12px 32px -8px rgba(0,0,0,.2),0 0 0 1px rgba(0,0,0,.05);opacity:0;transform:translateY(-4px);pointer-events:none;transition:.18s}.x-gfp .cmp-mode.open .cmp-menu{opacity:1;transform:none;pointer-events:auto}.x-gfp .cmp-menu button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:7px 10px;border-radius:8px;font-size:13px}.x-gfp .cmp-menu button:hover{background:var(--card)}.x-gfp .cmp-menu button.on{font-weight:600}.x-gfp .cmp-mic{width:30px;height:30px;border:0;background:transparent;border-radius:50%;display:grid;place-items:center;color:#6B6B66}.x-gfp .cmp-mic:hover{background:var(--card)}.x-gfp .cmp-mic.rec{color:var(--red);animation:cmpP 1.2s infinite}@keyframes cmpP{50%{box-shadow:0 0 0 6px rgba(255,46,99,.15)}}.x-gfp .cmp-go{width:30px;height:30px;border:0;border-radius:50%;background:#1C1C1A;color:#fff;display:grid;place-items:center;opacity:.25;transition:opacity .2s,transform .2s}.x-gfp .cmp.has .cmp-go{opacity:1}.x-gfp .cmp.sent .cmp-go{transform:translateY(-3px)}.x-gfp .lg{display:inline-block;width:30px;height:30px;flex:none}.x-gfp .lg svg{width:100%;height:100%;display:block}.x-gfp{position:relative;width:100%;padding:70px 32px 32px;overflow:hidden;isolation:isolate;background:var(--cream)}.x-gfp .gfp-bg{position:absolute;inset:0;z-index:-1;background:radial-gradient(130% 60% at 50% 34%,#FCFBF8 30%,rgba(252,251,248,0) 55%),linear-gradient(180deg,#FCFBF8 0%,#B9C8FF 26%,#5B7CFF 38%,#FF66CC 60%,#FF2E63 80%,#FF7A1A 100%);background-size:100% 100%;animation:gfpS 14s ease-in-out infinite alternate}@keyframes gfpS{to{filter:hue-rotate(-12deg) saturate(1.1)}}.x-gfp .gfp-cta{text-align:center;max-width:620px;margin:0 auto 64px}.x-gfp .gfp-cta small{display:block;font-size:14px;color:#6B6B66;margin-bottom:8px}.x-gfp h2{margin:0 0 26px;font-size:clamp(26px,3vw,34px);font-weight:600;letter-spacing:-.03em}.x-gfp .cmp{max-width:580px;border-radius:22px}.x-gfp .gfp-card{display:grid;grid-template-columns:1.1fr repeat(5,1fr);gap:24px;max-width:1280px;margin:0 auto;padding:30px 30px 26px;background:#F6F4EE;border-radius:18px;box-shadow:0 30px 60px -30px rgba(0,0,0,.25)}.x-gfp .gfp-l{display:flex;flex-direction:column;justify-content:space-between;gap:20px}.x-gfp nav b{display:block;font-size:13px;font-weight:600;margin-bottom:14px}.x-gfp nav a{display:block;font-size:13px;color:#6B6B66;margin-bottom:9px;transition:color .2s}.x-gfp nav a:hover{color:#1C1C1A}.x-gfp .gfp-lang{position:relative;align-self:flex-start}.x-gfp .gfp-lb{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border-radius:9px;border:0;background:#fff;box-shadow:0 0 0 1px var(--line);font-size:12px}.x-gfp .gfp-lm{position:absolute;left:0;bottom:36px;min-width:130px;background:#fff;border-radius:10px;padding:5px;box-shadow:0 12px 30px -8px rgba(0,0,0,.2),0 0 0 1px rgba(0,0,0,.05);opacity:0;transform:translateY(4px);pointer-events:none;transition:.18s}.x-gfp .gfp-lang.open .gfp-lm{opacity:1;transform:none;pointer-events:auto}.x-gfp .gfp-lm button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:6px 10px;border-radius:7px;font-size:12px}.x-gfp .gfp-lm button:hover{background:var(--card)}.x-gfp .gfp-lm button.on{font-weight:600}@media (max-width:900px){.x-gfp{padding:56px 14px 14px}.x-gfp .gfp-card{grid-template-columns:repeat(2,1fr);padding:24px 20px}.x-gfp .gfp-l{grid-column:1/-1;flex-direction:row;align-items:center}}@media (prefers-reduced-motion:reduce){.x-gfp *,.x-gfp *::before,.x-gfp *::after{animation:none!important;transition:none!important}}.x-gfp{width:1200px;max-width:100%;box-sizing:border-box}(root) => {const cl=[];const cmpInit=(f,list,cl)=>{if(!f)return;const ta=f.querySelector('textarea'),t=f.querySelector('.cmp-t'),md=f.querySelector('.cmp-mode'),mb=f.querySelector('.cmp-mb'),mic=f.querySelector('.cmp-mic');let li=0,ci=list[0].length,del=false,tm;
const red=matchMedia('(prefers-reduced-motion: reduce)').matches;
const tick=()=>{const w=list[li];if(red){t.textContent=w;return}if(!del){if(ci>=w.length){t.textContent=w;del=true;tm=setTimeout(tick,2200);return}ci++;t.textContent=w.slice(0,ci);if(ci>=w.length){del=true;tm=setTimeout(tick,1600);return}}else{ci--;t.textContent=w.slice(0,ci);if(ci<=0){del=false;li=(li+1)%list.length}}tm=setTimeout(tick,del?35:85)};tick();
const upd=()=>f.classList.toggle('has',ta.value.trim().length>0);ta.addEventListener('input',upd);
const tog=e=>{e.stopPropagation();md.classList.toggle('open')};mb.addEventListener('click',tog);
const pick=e=>{const b=e.target.closest('.cmp-menu button');if(!b)return;md.querySelectorAll('.cmp-menu button').forEach(x=>x.classList.toggle('on',x===b));mb.querySelector('span').textContent=b.textContent;md.classList.remove('open')};md.addEventListener('click',pick);
const out=()=>md.classList.remove('open');document.addEventListener('click',out);
const mc=()=>mic.classList.toggle('rec');mic.addEventListener('click',mc);
const sub=e=>{e.preventDefault();f.classList.add('sent');setTimeout(()=>{f.classList.remove('sent');ta.value='';upd()},500)};f.addEventListener('submit',sub);
cl.push(()=>{clearTimeout(tm);document.removeEventListener('click',out)})};cmpInit(root.querySelector('.cmp'),["一个读书会报名页…","一家咖啡馆的会员系统…","团队周报自动汇总工具…"],cl);
const lg=root.querySelector('.gfp-lang'),lb=root.querySelector('.gfp-lb');const t=e=>{e.stopPropagation();lg.classList.toggle('open')};lb.addEventListener('click',t);
const p=e=>{const b=e.target.closest('.gfp-lm button');if(!b)return;lg.querySelectorAll('.gfp-lm button').forEach(x=>x.classList.toggle('on',x===b));lb.querySelector('span').textContent=b.textContent;lg.classList.remove('open')};lg.addEventListener('click',p);
…