{"slug": "index-html", "title": "index.html", "summary": "The article contains the source code for an HTML file that implements a button to initiate an OAuth 2.0 authentication flow with Microsoft Azure Active Directory (AAD). The script constructs a URL to Microsoft's login endpoint, requiring the user to replace placeholder values for the client ID, redirect URI, and requested permissions. The page is designed to redirect users to Microsoft's login page for authentication and authorization.", "body_md": "-\n-\nSave isdaviddong/36046c2a398cb8e943fc520f79c28c4c to your computer and use it in GitHub Desktop.\n\n[Learn more about bidirectional Unicode characters](https://github.co/hiddenchars)\n\n| <!DOCTYPE html> | |\n| <html> | |\n| <head> | |\n| <title></title> | |\n| <meta charset=\"utf-8\" /> | |\n| <script> | |\n| function Auth() { | |\n| var URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?'; | |\n| URL += 'response_type=code'; | |\n| URL += '&client_id={請換成您的Client id}'; //請換成您的App Client id | |\n| URL += '&redirect_uri=http://localhost:13555/index.html'; //請換成您的URL | |\n| URL += '&scope=openid https://graph.microsoft.com/user.read'; //請換成您要索取的權限 | |\n| URL += '&response_mode=query'; | |\n| URL += '&state=12345'; | |\n| URL += '&nonce=678910'; | |\n| window.location.href = URL; | |\n| } | |\n| </script> | |\n| </head> | |\n| <body> | |\n| <button onclick=\"Auth();\">點選這裡連結AAD 2.0 Login</button> | |\n| </body> | |\n| </html> |\n\n```\n<div class=\"container\">\n    <h1>歡迎來到 EB7 體育平台</h1>\n    <a href=\"https://example.com/match\" class=\"button\">查看比賽資訊</a>\n    <a href=\"https://example.com/news\" class=\"button\">最新體育新聞</a>\n    <a href=\"https://example.com/live\" class=\"button\">即時比分</a>\n    <a href=\"https://example.com/login\" class=\"button\">會員登入</a>\n</div>\n```\n\n# 贪吃蛇游戏\n\n得分：0\n\n难度：历史积分: 0\n\n.container {\n\ntext-align: center;\n\n}\n\n#gameCanvas {\n\nborder: 2px solid #000;\n\nmargin-bottom: 20px;\n\n}\n\nbutton {\n\npadding: 10px 20px;\n\nfont-size: 16px;\n\nmargin: 10px;\n\n}\n\n#difficulty {\n\nwidth: 200px;\n\n}\n\n#controls {\n\nmargin-top: 20px;\n\n}\n\nlet canvas = document.getElementById(\"gameCanvas\");\n\nlet ctx = canvas.getContext(\"2d\");\n\nlet score = 0;\n\nlet highScore = localStorage.getItem(\"highScore\") || 0;\n\nlet snake = [{ x: 200, y: 200 }];\n\nlet food = { x: 0, y: 0 };\n\nlet direction = \"RIGHT\";\n\nlet gameInterval;\n\nlet gameSpeed = 100; // 默认速度\n\nlet isGameRunning = false;\n\ndocument.getElementById(\"startButton\").addEventListener(\"click\", startGame);\n\ndocument.getElementById(\"pauseButton\").addEventListener(\"click\", togglePause);\n\ndocument.getElementById(\"difficulty\").addEventListener(\"input\", changeDifficulty);\n\nfunction startGame() {\n\nscore = 0;\n\nsnake = [{ x: 200, y: 200 }];\n\ndirection = \"RIGHT\";\n\nisGameRunning = true;\n\ndocument.getElementById(\"pauseButton\").disabled = false;\n\ndocument.getElementById(\"startButton\").disabled = true;\n\ngenerateFood();\n\ngameInterval = setInterval(gameLoop, gameSpeed);\n\n}\n\nfunction togglePause() {\n\nif (isGameRunning) {\n\nclearInterval(gameInterval);\n\ndocument.getElementById(\"pauseButton\").innerText = \"继续游戏\";\n\n} else {\n\ngameInterval = setInterval(gameLoop, gameSpeed);\n\ndocument.getElementById(\"pauseButton\").innerText = \"暂停游戏\";\n\n}\n\nisGameRunning = !isGameRunning;\n\n}\n\nfunction changeDifficulty(event) {\n\ngameSpeed = 200 - event.target.value * 20; // 难度范围\n\nif (isGameRunning) {\n\nclearInterval(gameInterval);\n\ngameInterval = setInterval(gameLoop, gameSpeed);\n\n}\n\n}\n\nfunction gameLoop() {\n\nmoveSnake();\n\nif (checkCollision()) {\n\nendGame();\n\n}\n\nif (checkFoodCollision()) {\n\nscore++;\n\nif (score > highScore) {\n\nhighScore = score;\n\nlocalStorage.setItem(\"highScore\", highScore);\n\n}\n\ndocument.getElementById(\"score\").innerText = score;\n\ndocument.getElementById(\"highScore\").innerText = highScore;\n\ngenerateFood();\n\n}\n\nclearCanvas();\n\ndrawSnake();\n\ndrawFood();\n\n}\n\nfunction clearCanvas() {\n\nctx.clearRect(0, 0, canvas.width, canvas.height);\n\n}\n\nfunction drawSnake() {\n\nsnake.forEach(segment => {\n\nctx.fillStyle = \"#00FF00\";\n\nctx.fillRect(segment.x, segment.y, 20, 20);\n\n});\n\n}\n\nfunction drawFood() {\n\nctx.fillStyle = \"#FF0000\";\n\nctx.fillRect(food.x, food.y, 20, 20);\n\n}\n\nfunction moveSnake() {\n\nlet head = { ...snake[0] };\n\nif (direction === \"RIGHT\") head.x += 20;\n\nif (direction === \"LEFT\") head.x -= 20;\n\nif (direction === \"UP\") head.y -= 20;\n\nif (direction === \"DOWN\") head.y += 20;\n\nsnake.unshift(head);\n\nsnake.pop();\n\n}\n\nfunction generateFood() {\n\nfood.x = Math.floor(Math.random() * 20) * 20;\n\nfood.y = Math.floor(Math.random() * 20) * 20;\n\n}\n\nfunction checkCollision() {\n\nlet head = snake[0];\n\n// 检查是否撞到墙壁\n\nif (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height) return true;\n\n// 检查是否撞到自己\n\nfor (let i = 1; i < snake.length; i++) {\n\nif (head.x === snake[i].x && head.y === snake[i].y) return true;\n\n}\n\nreturn false;\n\n}\n\nfunction checkFoodCollision() {\n\nlet head = snake[0];\n\nreturn head.x === food.x && head.y === food.y;\n\n}\n\nfunction endGame() {\n\nclearInterval(gameInterval);\n\nalert(`游戏结束！您的得分为：${score}`\n\n);\n\nif (score > highScore) {\n\nhighScore = score;\n\nlocalStorage.setItem(\"highScore\", highScore);\n\n}\n\ndocument.getElementById(\"highScore\").innerText = highScore;\n\ndocument.getElementById(\"score\").innerText = score;\n\ndocument.getElementById(\"startButton\").disabled = false;\n\ndocument.getElementById(\"pauseButton\").disabled = true;\n\ndocument.getElementById(\"pauseButton\").innerText = \"暂停游戏\";\n\nisGameRunning = false;\n\n}\n\ndocument.addEventListener(\"keydown\", function (event) {\n\nif (event.key === \"ArrowUp\" && direction !== \"DOWN\") direction = \"UP\";\n\nif (event.key === \"ArrowDown\" && direction !== \"UP\") direction = \"DOWN\";\n\nif (event.key === \"ArrowLeft\" && direction !== \"RIGHT\") direction = \"LEFT\";\n\nif (event.key === \"ArrowRight\" && direction !== \"LEFT\") direction = \"RIGHT\";\n\n});\n\nwelcome to google #1 search result for `index.html`\n\n<!doctype html>\n\n<title>Sky Dodge</title> <style> :root{ --bg:#0b1020; --fg:#e8f1ff; --accent:#4cc9f0; --good:#80ffdb; --bad:#ff4d6d; --muted:#95a1b3; } *{box-sizing:border-box} html,body{height:100%;margin:0;background:radial-gradient(1200px 800px at 50% -200px,#111a33,var(--bg));color:var(--fg);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,\"Noto Sans TC\",sans-serif} .wrap{max-width:720px;margin:0 auto;padding:16px;display:flex;flex-direction:column;gap:12px} header{display:flex;align-items:center;justify-content:space-between;gap:12px} h1{font-size:20px;margin:0;letter-spacing:.5px} .btnbar{display:flex;gap:8px;flex-wrap:wrap} button{ appearance:none;border:1px solid #2b3550;background:#111a33;color:var(--fg); padding:8px 12px;border-radius:10px;font-weight:600;cursor:pointer;transition:.15s transform,.2s opacity; } button:active{transform:scale(.98)} button[aria-pressed=\"true\"]{outline:2px solid var(--accent);box-shadow:0 0 0 3px #00000040 inset} #gamebox{position:relative;border:1px solid #223; border-radius:14px;overflow:hidden} canvas{display:block;width:100%;height:auto;background:linear-gradient(#0b1533 0%, #0b1020 60%, #090c1a 100%)} .hud{ position:absolute;inset:0;pointer-events:none;padding:10px;display:flex;flex-direction:column; } .hud .row{display:flex;justify-content:space-between;align-items:center;font-weight:700;font-variant-numeric:tabular-nums} .centerOverlay{ position:absolute;inset:0;display:flex;align-items:center;justify-content:center; backdrop-filter:blur(4px) saturate(120%); background:#0b102088; text-align:center; padding:20px; } .panel{background:#0d1328;border:1px solid #223;border-radius:16px;padding:18px;max-width:480px} .title{font-size:22px;margin:0 0 6px} .muted{color:var(--muted);font-size:14px;line-height:1.4} .kbd{display:inline-block;border:1px solid #3a4466;border-bottom-width:3px;padding:0 6px;border-radius:6px;margin:0 2px;font-weight:700} .tip{margin-top:10px;font-size:13px;color:#b8c4d9} .link{color:var(--accent);text-decoration:none} footer{opacity:.75;font-size:12px;text-align:center;padding-bottom:8px} </style># 🌌 Sky Dodge\n\n```\n<div id=\"overlay\" class=\"centerOverlay\" hidden>\n  <div class=\"panel\">\n    <h2 class=\"title\" id=\"overlayTitle\">Sky Dodge</h2>\n    <p id=\"overlayMsg\" class=\"muted\">左右移動小飛球，避開障礙、吃星星加分。</p>\n    <div class=\"tip\">\n      電腦：<span class=\"kbd\">←</span> <span class=\"kbd\">→</span> 或 <span class=\"kbd\">A</span>/<span class=\"kbd\">D</span>，<span class=\"kbd\">P</span> 暫停。<br>\n      手機：左右半邊螢幕觸控／長按連續移動。\n    </div>\n    <div style=\"margin-top:14px;display:flex;gap:8px;justify-content:center\">\n      <button id=\"overlayStart\">開始</button>\n    </div>\n  </div>\n</div>\n```\n\n# 明天要上班不想面隊補習班\n\n[首頁](#)\n\n[師資介紹](#)\n\n[課程](#)\n\n[活動成果](#)\n\n[最新消息](#)\n\n[聯絡我們](#)\n\n## 我們的特色\n\n### 優秀師資\n\n我們擁有多年經驗的專業教師團隊。\n\n### 舒適環境\n\n明亮整潔的教室，提供最佳的學習氛圍。\n\n### 成果亮眼\n\n學生在各類比賽與考試中屢創佳績。\n\n## 最新消息\n\n- 2025/08/10 - 暑期結業式圓滿落幕\n- 2025/07/15 - 英語朗讀比賽榮獲第一名\n- 2025/06/30 - 暑期課程開課\n\n## 活動成果\n\n地址：台中市西區公益路56號2樓｜電話：(04) 2319-7118｜LINE：23197118\n\n© 2025 華格納補習班. All rights reserved.\n\n# 明天要上班不想面隊補習班\n\n[首頁](#)\n\n[師資介紹](#)\n\n[課程](#)\n\n[活動成果](#)\n\n[最新消息](#)\n\n[聯絡我們](#)\n\n## 我們的特色\n\n### 優秀師資\n\n我們擁有多年經驗的專業教師團隊。\n\n### 舒適環境\n\n明亮整潔的教室，提供最佳的學習氛圍。\n\n### 成果亮眼\n\n學生在各類比賽與考試中屢創佳績。\n\n## 最新消息\n\n- 2025/08/10 - 暑期結業式圓滿落幕\n- 2025/07/15 - 英語朗讀比賽榮獲第一名\n- 2025/06/30 - 暑期課程開課\n\n## 活動成果\n\n地址：台中市西區公益路56號2樓｜電話：(04) 2319-7118｜LINE：23197118\n\n© 2025 華格納補習班. All rights reserved.\n\n<a class=\"link\" href=\"[https://instagram.com/your_instagram_here](https://instagram.com/your_instagram_here)\" target=\"_blank\" ...>Instagram\n\n```\nbody {\n  font-family: Arial, sans-serif;\n  line-height: 1.6;\n  color: #333;\n}\n\nheader {\n  background: url('https://images.unsplash.com/photo-1522312346375-d1a52e2b99b3?auto=format&fit=crop&w=1500&q=80') no-repeat center/cover;\n  height: 100vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  color: white;\n  position: relative;\n}\n\nheader::after {\n  content: \"\";\n  position: absolute;\n  top:0; left:0;\n  width:100%; height:100%;\n  background: rgba(0,0,0,0.5);\n}\n\nheader .content {\n  position: relative;\n  z-index: 1;\n}\n\nheader h1 {\n  font-size: 3rem;\n  margin-bottom: 1rem;\n}\n\nheader p {\n  font-size: 1.2rem;\n  margin-bottom: 2rem;\n}\n\n.btn {\n  display: inline-block;\n  padding: 12px 24px;\n  background: #ff6b6b;\n  color: white;\n  text-decoration: none;\n  font-weight: bold;\n  border-radius: 5px;\n  transition: background 0.3s;\n}\n\n.btn:hover {\n  background: #ff4040;\n}\n\nsection {\n  padding: 60px 20px;\n  max-width: 1100px;\n  margin: auto;\n}\n\n.products {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n  gap: 20px;\n}\n\n.product {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  overflow: hidden;\n  text-align: center;\n  background: #fff;\n  transition: transform 0.3s;\n}\n\n.product:hover {\n  transform: translateY(-5px);\n}\n\n.product img {\n  width: 100%;\n  height: 250px;\n  object-fit: cover;\n}\n\n.product h3 {\n  margin: 15px 0 5px;\n}\n\n.product p {\n  margin-bottom: 15px;\n  color: #555;\n}\n\n.about {\n  text-align: center;\n}\n\n.testimonials {\n  background: #f9f9f9;\n  border-radius: 10px;\n  padding: 30px;\n}\n\n.testimonial {\n  margin-bottom: 20px;\n  font-style: italic;\n}\n\nfooter {\n  background: #333;\n  color: white;\n  text-align: center;\n  padding: 20px;\n}\n\nfooter a {\n  color: #ff6b6b;\n  text-decoration: none;\n}\n```\n\n</style>## Featured Accessories\n\n## Why Choose Us?\n\nWe design timeless accessories that combine elegance with durability. Every piece is crafted with care to elevate your everyday look.\n\n## What Our Customers Say\n\n© 2025 Accessories Store | [Contact Us](#)\n\n# 🐍 Snake Game + GPT AI Chat\n\n```\nfunction gameLoop() {\n  snake.x += velocity.x;\n  snake.y += velocity.y;\n\n  // 撞牆\n  if (snake.x < 0 || snake.x >= tileCount || snake.y < 0 || snake.y >= tileCount) {\n    resetGame();\n  }\n\n  // 吃到自己\n  for (let t of snakeTrail) {\n    if (t.x === snake.x && t.y === snake.y) resetGame();\n  }\n\n  // 畫面\n  ctx.fillStyle = \"#111\";\n  ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n  ctx.fillStyle = \"lime\";\n  for (let t of snakeTrail) ctx.fillRect(t.x * gridSize, t.y * gridSize, gridSize - 2, gridSize - 2);\n\n  ctx.fillStyle = \"yellow\";\n  ctx.fillRect(snake.x * gridSize, snake.y * gridSize, gridSize - 2, gridSize - 2);\n\n  ctx.fillStyle = \"red\";\n  ctx.fillRect(fruit.x * gridSize, fruit.y * gridSize, gridSize - 2, gridSize - 2);\n\n  snakeTrail.push({ x: snake.x, y: snake.y });\n  while (snakeTrail.length > tail) snakeTrail.shift();\n\n  // 吃到果實\n  if (snake.x === fruit.x && snake.y === fruit.y) {\n    tail++;\n    fruit.x = Math.floor(Math.random() * tileCount);\n    fruit.y = Math.floor(Math.random() * tileCount);\n  }\n}\n\nfunction resetGame() {\n  tail = 5;\n  snakeTrail = [];\n  snake = { x: 10, y: 10 };\n  velocity = { x: 0, y: 0 };\n}\n\ndocument.addEventListener('keydown', e => {\n  switch (e.key) {\n    case 'ArrowLeft': velocity = { x: -1, y: 0 }; break;\n    case 'ArrowUp': velocity = { x: 0, y: -1 }; break;\n    case 'ArrowRight': velocity = { x: 1, y: 0 }; break;\n    case 'ArrowDown': velocity = { x: 0, y: 1 }; break;\n  }\n});\n\nsetInterval(gameLoop, 100);\n\n// --- AI 聊天區 ---\nconst apiKey = '你的API Key'; // ←←←這裡貼上你的API Key！\n\nasync function chatWithGPT(prompt) {\n  const endpoint = 'https://api.openai.com/v1/chat/completions';\n  const response = await fetch(endpoint, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'Authorization': `Bearer ${apiKey}`\n    },\n    body: JSON.stringify({\n      model: 'gpt-3.5-turbo',\n      messages: [{ role: 'user', content: prompt }],\n      max_tokens: 300\n    })\n  });\n  const data = await response.json();\n  return data.choices?.[0]?.message?.content || \"AI 沒有回應\";\n}\n\nasync function askAI() {\n  const question = document.getElementById('userInput').value;\n  if (!question) return;\n  document.getElementById('aiResponse').innerText = \"AI 正在思考...\";\n  try {\n    const answer = await chatWithGPT(question);\n    document.getElementById('aiResponse').innerText = answer;\n  } catch (err) {\n    document.getElementById('aiResponse').innerText = \"AI 請求失敗，請檢查 API Key 或網路\";\n  }\n}\n```\n\n</script>\n\n```\n<div class=\"max-w-md mx-auto bg-card-bg shadow-2xl rounded-xl overflow-hidden\">\n    <header class=\"bg-primary text-white p-6\">\n        <h1 class=\"text-2xl font-bold text-center\">💸 智慧分帳計算機</h1>\n    </header>\n\n    <main class=\"p-6 space-y-6\">\n\n        <div class=\"space-y-4\">\n            <h2 class=\"text-lg font-semibold text-gray-700 border-b pb-2\">輸入資訊</h2>\n\n            <div>\n                <label for=\"totalBill\" class=\"block text-sm font-medium text-gray-600 mb-1\">總金額 (Total Bill)</label>\n                <div class=\"relative rounded-lg shadow-sm\">\n                    <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <span class=\"text-gray-500\">NT$</span>\n                    </div>\n                    <input type=\"number\" id=\"totalBill\" value=\"500\" min=\"0\" placeholder=\"0.00\"\n                        class=\"block w-full pl-12 pr-4 py-3 border border-gray-300 rounded-lg text-lg focus:ring-primary focus:border-primary\">\n                </div>\n            </div>\n\n            <div>\n                <div class=\"flex justify-between items-center mb-1\">\n                    <label class=\"text-sm font-medium text-gray-600\">小費百分比 (Tip %)</label>\n                    <span id=\"tipPercentageValue\" class=\"text-lg font-bold text-primary\">10%</span>\n                </div>\n                <input type=\"range\" id=\"tipPercentage\" value=\"10\" min=\"0\" max=\"30\" step=\"1\"\n                    class=\"w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer range-lg focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\">\n            </div>\n\n            <div>\n                <label class=\"block text-sm font-medium text-gray-600 mb-2\">人數 (People)</label>\n                <div class=\"flex items-center justify-center space-x-4 bg-gray-100 p-3 rounded-lg\">\n                    <button id=\"decrementPeople\" class=\"text-3xl font-bold text-primary hover:text-primary-dark transition duration-150 p-1.5 rounded-full hover:bg-white\">-</button>\n                    <span id=\"peopleValue\" class=\"text-3xl font-extrabold text-gray-800 w-16 text-center\">2</span>\n                    <button id=\"incrementPeople\" class=\"text-3xl font-bold text-primary hover:text-primary-dark transition duration-150 p-1.5 rounded-full hover:bg-white\">+</button>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"bg-dark-bg text-dark-text p-5 rounded-xl shadow-lg space-y-5\">\n            <h2 class=\"text-xl font-bold border-b border-gray-700 pb-3 mb-4\">✨ 即時運算結果</h2>\n            \n            <div class=\"flex justify-between items-center\">\n                <span class=\"text-base font-medium text-gray-400\">總金額 (含小費)：</span>\n                <span id=\"totalAmountDisplay\" class=\"text-2xl font-bold text-secondary\">NT$ 0.00</span>\n            </div>\n\n            <div class=\"text-center pt-4 border-t border-gray-700\">\n                <p class=\"text-lg font-medium text-gray-400 mb-1\">每人應付金額 (Per Person)</p>\n                <p id=\"perPersonDisplay\" class=\"text-5xl font-extrabold text-white\">NT$ 0.00</p>\n            </div>\n        </div>\n\n    </main>\n</div>\n\n<script>\n    // 取得所有 DOM 元素\n    const totalBillInput = document.getElementById('totalBill');\n    const tipPercentageSlider = document.getElementById('tipPercentage');\n    const tipPercentageValue = document.getElementById('tipPercentageValue');\n    const peopleValueSpan = document.getElementById('peopleValue');\n    const incrementPeopleBtn = document.getElementById('incrementPeople');\n    const decrementPeopleBtn = document.getElementById('decrementPeople');\n    const totalAmountDisplay = document.getElementById('totalAmountDisplay');\n    const perPersonDisplay = document.getElementById('perPersonDisplay');\n\n    let totalBill = parseFloat(totalBillInput.value) || 0;\n    let tipPercentage = parseInt(tipPercentageSlider.value) || 0;\n    let people = parseInt(peopleValueSpan.textContent) || 1; // 確保人數至少為 1\n\n    /**\n     * 主計算函式：計算總金額與每人應付金額\n     */\n    function calculateSplit() {\n        // 1. 取得最新數值\n        totalBill = parseFloat(totalBillInput.value) || 0;\n        tipPercentage = parseInt(tipPercentageSlider.value) || 0;\n        people = parseInt(peopleValueSpan.textContent) || 1;\n\n        // 處理小費計算\n        const tipAmount = totalBill * (tipPercentage / 100);\n        \n        // 計算總金額 (含小費)\n        const totalAmountWithTip = totalBill + tipAmount;\n\n        // 計算每人應付金額\n        const perPersonAmount = people > 0 ? totalAmountWithTip / people : 0;\n        \n        // 2. 更新介面顯示\n        \n        // 更新小費百分比顯示\n        tipPercentageValue.textContent = `${tipPercentage}%`;\n\n        // 更新總金額 (含小費) 顯示，四捨五入到小數點第二位\n        totalAmountDisplay.textContent = `NT$ ${totalAmountWithTip.toFixed(2)}`;\n\n        // 更新每人應付金額顯示，四捨五入到小數點第二位\n        perPersonDisplay.textContent = `NT$ ${perPersonAmount.toFixed(2)}`;\n    }\n\n    // --- 事件監聽器 ---\n\n    // 1. 總金額輸入變更\n    totalBillInput.addEventListener('input', calculateSplit);\n\n    // 2. 小費滑桿變更\n    tipPercentageSlider.addEventListener('input', calculateSplit);\n\n    // 3. 人數增加按鈕\n    incrementPeopleBtn.addEventListener('click', () => {\n        people = parseInt(peopleValueSpan.textContent) + 1;\n        peopleValueSpan.textContent = people;\n        calculateSplit();\n    });\n\n    // 4. 人數減少按鈕\n    decrementPeopleBtn.addEventListener('click', () => {\n        people = parseInt(peopleValueSpan.textContent);\n        if (people > 1) { // 確保人數至少為 1\n            people -= 1;\n            peopleValueSpan.textContent = people;\n            calculateSplit();\n        }\n    });\n\n    // 頁面載入時先執行一次計算，顯示初始值\n    window.onload = calculateSplit;\n\n</script>\n```\n\n# النقل اللوجستي بلا حدود\n\nنقل سريع، آمن وموثوق عبر Volkswagen Crafter عالية السعة.\n\n``` php\n<!-- ★ ضع صورتك هنا بعد تسميتها: crafter-real.jpg -->\n<img src=\"crafter-real.jpg\" alt=\"SwiftCargo Volkswagen Crafter\">\n```\n\n## لماذا SwiftCargo؟\n\n```\n<div class=\"feature-box\">✔ نقل لوجستي احترافي للشركات والمطارات والموانئ باستخدام Volkswagen Crafter</div>\n<div class=\"feature-box\">✔ تتبع مباشر لكل شحنة لضمان وصولها في الوقت المحدد</div>\n<div class=\"feature-box\">✔ حلول شحن آمنة، سريعة وفعالة</div>\n<div class=\"feature-box\">✔ فريق متخصص، عمليات دقيقة، وانسيابية كاملة في الخدمة</div>\n```\n\n[ابدأ شحنتك الآن](#contact)\n\n## تواصل معنا\n\n```\n    <input type=\"text\" name=\"name\" placeholder=\"الاسم الكامل\" required>\n    <input type=\"email\" name=\"email\" placeholder=\"البريد الإلكتروني\" required>\n    <input type=\"text\" name=\"phone\" placeholder=\"رقم الهاتف\" required>\n    <textarea name=\"message\" placeholder=\"اكتب رسالتك...\" rows=\"5\" required></textarea>\n    \n    <button type=\"submit\">إرسال</button>\n</form>\n```\n\n📧 raaq605@gmail.com\n\n📞 0666116722\n\n© 2025 SwiftCargo\n\n<!doctype html>\n\n<title>簡易旅遊規劃器 • Travel Planner</title> <style> :root{ --bg:#0f1720; --card:#111827; --muted:#9ca3af; --accent:#06b6d4; --glass: rgba(255,255,255,0.03); --max-width:1100px; font-family: system-ui,-apple-system, \"Segoe UI\", Roboto, \"Noto Sans CJK TC\", \"Helvetica Neue\", Arial; } body{margin:0;background:linear-gradient(180deg,#071029 0%, #0b1722 60%);color:#e6eef6;display:flex;justify-content:center;padding:28px 16px;} .app{width:100%;max-width:var(--max-width);display:grid;grid-template-columns:320px 1fr 320px;gap:18px;} .panel{background:linear-gradient(180deg,var(--card), #071022);border-radius:12px;padding:16px;box-shadow:0 6px 20px rgba(2,6,23,0.6);} header.app-head{grid-column:1/-1;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;} header.app-head h1{font-size:18px;margin:0;color:white;} header.app-head p{margin:0;color:var(--muted);font-size:13px;} .left{display:flex;flex-direction:column;gap:10px} .search{display:flex;gap:8px} input[type=text], textarea, select{width:100%;padding:10px;border-radius:8px;border:1px solid rgba(255,255,255,0.04);background:var(--glass);color:inherit} button{background:var(--accent);border:0;padding:8px 10px;border-radius:8px;color:#02303a;font-weight:700;cursor:pointer} button.ghost{background:transparent;border:1px solid rgba(255,255,255,0.06);color:var(--muted);font-weight:600} .dest-list{max-height:220px;overflow:auto;padding:6px;border-radius:8px;background:rgba(255,255,255,0.02)} .dest-item{padding:8px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:6px} .dest-item strong{font-size:14px} .center{display:flex;flex-direction:column;gap:12px} .days{display:flex;gap:8px;overflow:auto;padding-bottom:6px} .day-tab{padding:8px 10px;border-radius:10px;background:rgba(255,255,255,0.02);cursor:pointer;min-width:90px;text-align:center} .day-tab.active{background:linear-gradient(90deg,var(--accent),#7ee1e9);color:#022b30;font-weight:700} .itinerary{min-height:320px;display:flex;flex-direction:column;gap:10px} .activity{background:rgba(255,255,255,0.025);padding:10px;border-radius:10px;display:flex;justify-content:space-between;gap:8px} .activity .meta{font-size:13px;color:var(--muted)} .right .map{height:180px;background:linear-gradient(90deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--muted)} .controls{display:flex;gap:8px;flex-wrap:wrap} .tools{display:flex;gap:8px;align-items:center} footer.note{grid-column:1/-1;margin-top:6px;color:var(--muted);font-size:13px;text-align:center}[@media](https://github.com/media)(max-width:980px){ .app{grid-template-columns:1fr; padding-bottom:48px} .right{order:3} } .small{font-size:13px;color:var(--muted)} .btn-danger{background:#ef4444;color:white} .pill{background:rgba(255,255,255,0.03);padding:6px 8px;border-radius:999px;color:var(--muted);font-size:13px} /* Print */\n\n[@media](https://github.com/media)print{ body{background:white;color:black} .app{max-width:100%;grid-template-columns:1fr} .panel{box-shadow:none;background:transparent;padding:0} .right, .left, header.app-head .tools{display:none} } </style>\n\n# Travel Planner\n\n快速建立你的行程、匯出、及分享\n\n``` php\n<!-- left: destination & quick add -->\n<aside class=\"panel left\">\n  <h3 style=\"margin:0 0 8px 0\">搜尋目的地</h3>\n  <div class=\"search\">\n    <input type=\"text\" id=\"destInput\" placeholder=\"輸入城市或景點（示範：巴黎、東京）\" />\n    <button id=\"btnAddDest\">新增</button>\n  </div>\n  <div class=\"small\" style=\"margin-top:8px;color:var(--muted)\">建議（示範）：台北、東京、首爾、巴黎、布達佩斯、紐約</div>\n  <div class=\"dest-list\" id=\"destList\" aria-live=\"polite\"></div>\n\n  <hr style=\"opacity:.06;margin:12px 0;border:none;height:1px;background:rgba(255,255,255,0.03)\">\n  <h3 style=\"margin:0 0 8px 0\">快速加入活動</h3>\n  <input type=\"text\" id=\"quickTitle\" placeholder=\"活動名稱（例如：艾菲爾鐵塔）\" />\n  <input type=\"text\" id=\"quickTime\" placeholder=\"時間（例如：09:30）\" />\n  <textarea id=\"quickNote\" placeholder=\"備註或地址（例如：Champ de Mars）\" rows=\"3\"></textarea>\n  <div style=\"display:flex;gap:8px;margin-top:8px\">\n    <button id=\"btnQuickAdd\">加入目前天</button>\n    <button id=\"btnAddDay\" class=\"ghost\">新增一天</button>\n  </div>\n</aside>\n\n<!-- center: itinerary -->\n<main class=\"panel center\">\n  <div>\n    <div style=\"display:flex;justify-content:space-between;align-items:center\">\n      <div class=\"days\" id=\"dayTabs\"></div>\n      <div class=\"pill\" id=\"itSummary\">0 天 • 0 活動</div>\n    </div>\n  </div>\n\n  <div class=\"itinerary\" id=\"itineraryArea\">\n    <div class=\"small\" id=\"emptyHint\">還沒有天數，請按「新增一天」。</div>\n  </div>\n</main>\n\n<!-- right: map & details -->\n<aside class=\"panel right\">\n  <h3 style=\"margin:0 0 8px 0\">地圖 & 詳細</h3>\n  <div class=\"map\" id=\"map\">地圖預留區（可接 Google Maps 或 Leaflet）</div>\n\n  <hr style=\"opacity:.06;margin:12px 0;border:none;height:1px;background:rgba(255,255,255,0.03)\">\n  <h4 style=\"margin:6px 0\">當前被選活動</h4>\n  <div id=\"activeDetail\" class=\"small\">尚未選取活動</div>\n\n  <div style=\"margin-top:12px;display:flex;gap:8px;flex-wrap:wrap\">\n    <button id=\"btnClear\" class=\"ghost\">清除本機資料</button>\n    <button id=\"btnLoadSample\" class=\"ghost\">載入範例</button>\n  </div>\n\n  <div style=\"margin-top:12px;color:var(--muted);font-size:13px\">\n    說明：這是靜態前端範例。若要加入地圖搜尋、航班/飯店整合，請使用外部 API。\n  </div>\n</aside>\n\n<footer class=\"note\">製作：Travel Planner • 範例前端（離線可用）</footer>\n```\n\n**${escapeHtml(name)}**\n\n### ${day.name}\n\n**${escapeHtml(a.title||'未命名活動')}**${a.time||''}\n\n```\nh1 {\n  margin-top: 20px;\n}\n\n#score {\n  font-size: 20px;\n  margin-bottom: 10px;\n}\n\n#box {\n  width: 80px;\n  height: 80px;\n  background: #ff5252;\n  position: absolute;\n  border-radius: 12px;\n  cursor: pointer;\n  box-shadow: 0 0 20px rgba(255,82,82,0.7);\n}\n```\n\n</style># Catch the Box 🎯\n\n## Phone Location Tracker\n\nShow My Location <script src=\"https://unpkg.com/leaflet/dist/leaflet.js\"></script> <script> var map = L.map('map').setView([0,0],2); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ maxZoom:19 }).addTo(map); function getLocation(){ if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(function(position){ var lat = position.coords.latitude; var lon = position.coords.longitude; map.setView([lat,lon],15); L.marker([lat,lon]).addTo(map) .bindPopup(\"Your phone location\") .openPopup(); }); }else{ alert(\"Location not supported\"); } } </script>## Track Phone Location\n\nClick the button to get your location\n\nGet Location\n\n<script> function getLocation(){ if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(showPosition); }else{ document.getElementById(\"location\").innerHTML=\"Geolocation not supported\"; } } function showPosition(position){ let lat = position.coords.latitude; let lon = position.coords.longitude; document.getElementById(\"location\").innerHTML = \"Latitude: \" + lat + \"Longitude: \" + lon + \"\n\n[Open in Google Maps](https://maps.google.com/?q=\"+lat+\",\"+lon+\")\"; } </script>\n\n``\n\n# 🌲 小紅帽森林卡戰\n\n### Your Turn\n\n\"; } // 更新畫面 function update(){ document.getElementById(\"hp\").innerText = hp; document.getElementById(\"mhp\").innerText = mhp; } // 玩家行動 function play(type){ if(phase !== \"player\") return; if(type === \"attack\"){ mhp -= (2 + charge); charge = 0; log(\"You attack!\"); } if(type === \"defend\"){ hp += 1; log(\"You defend!\"); } if(type === \"charge\"){ charge += 1; log(\"Charge!\"); } update(); startMonster(); } // 怪物回合 function startMonster(){ phase = \"monster\"; document.getElementById(\"status\").innerText = \"Monster Turn - DON'T MOVE MOUSE!\"; startTime = Date.now(); monsterTimer = setInterval(()=>{ let t = Date.now() - startTime; let p = Math.min(t/3000*100,100); document.getElementById(\"bar\").style.width = p + \"%\"; if(t > 3000){ clearInterval(monsterTimer); monsterAction(); startPlayer(); } },50); } // 怪物行動 function monsterAction(){ let dmg = Math.floor(Math.random()*3)+1; hp -= dmg; log(\"Monster attacks \" + dmg); update(); } // 玩家回合 function startPlayer(){ phase = \"player\"; document.getElementById(\"status\").innerText = \"Your Turn\"; document.getElementById(\"bar\").style.width = \"0%\"; } // ❗ 魔咒系統（核心） document.addEventListener(\"mousemove\",()=>{ if(phase === \"monster\"){ hp -= 1; impulse++; log(\"⚠ Curse activated! -1 HP\"); update(); } }); document.addEventListener(\"click\",()=>{ if(phase === \"monster\"){ hp -= 1; impulse++; log(\"⚠ Curse activated! -1 HP\"); update(); } }); update(); </script>\n\n[@Keyframes](https://github.com/Keyframes)shake{ 0%{transform:translate(0,0);} 25%{transform:translate(-6px,4px);} 50%{transform:translate(6px,-4px);} 75%{transform:translate(-6px,4px);} 100%{transform:translate(0,0);} } /* 卡牌 */ .card{ width:100px; height:70px; background:#4a6cf7; border-radius:8px; display:inline-block; margin:5px; line-height:70px; cursor:pointer; } #hand{ position:absolute; bottom:10px; width:100%; } /* UI */ #ui{ margin-top:10px; } .bar{ width:300px; height:15px; background:gray; margin:5px auto; } .fill{ height:15px; background:yellow; width:100%; } </style>\n\n# 🌲 Little Red Card RPG\n\nCharge: 0 | Shield: 0\n\nImpulse: 0\n\n[@Keyframes](https://github.com/Keyframes)pop{ 0%{transform:scale(0.5);} 100%{transform:scale(1);} } </style> TKD LEGEND - Web AR 跆拳道對戰\n\n## 🥋 模式選擇\n\nAR 對戰\n\nBoss 挑戰\n\n動作挑戰\n\n## 📷 AR 戰鬥畫面\n\nCombo：0\n\n開始戰鬥！\n\n👊 普通踢擊 🔥 旋踢 🛡️ 防禦 🔄 重置## 🤖 AI 教練\n\n## 🥋 腰帶養成系統\n\n目前等級：白帶\n\n<title>TKD LEGEND Web AR</title> <style> body{ margin:0; font-family:Arial; background:#0b1220; color:white; overflow-x:hidden; } header{ background:#111c34; padding:20px; text-align:center; font-size:32px; font-weight:bold; color:#ffd54a; } .container{ padding:20px; max-width:1000px; margin:auto; } .card{ background:#16233f; padding:20px; border-radius:20px; margin-bottom:20px; box-shadow:0 0 20px rgba(0,0,0,0.3); } button{ background:#ffb300; border:none; padding:12px 18px; border-radius:10px; font-size:16px; font-weight:bold; cursor:pointer; margin:5px; } button:hover{ transform:scale(1.05); } .enemy{ font-size:120px; text-align:center; transition:0.2s; } .hpbar{ height:25px; background:#333; border-radius:10px; overflow:hidden; margin:15px 0; } .hp{ height:100%; width:100%; background:#43a047; transition:0.3s; } .camera{ background:#000; height:240px; border-radius:20px; display:flex; justify-content:center; align-items:center; font-size:24px; margin-bottom:20px; } .chat{ background:#1f335f; padding:12px; border-radius:12px; margin-top:10px; } .belts{ display:flex; gap:10px; flex-wrap:wrap; margin-top:15px; } .belt{ width:70px; height:22px; border-radius:5px; border:1px solid #fff; } .score{ font-size:22px; font-weight:bold; color:#ffd54a; } #battle{ display:none; } .combo-effect{ font-size:28px; color:#ff5252; animation:pop 0.5s ease; }[@Keyframes]pop{ 0%{transform:scale(0.5);} 100%{transform:scale(1);} } </style> TKD LEGEND - Web AR 跆拳道對戰 ## 🥋 模式選擇 AR 對戰Boss 挑戰\n\n動作挑戰\n\n## 📷 AR 戰鬥畫面\n\nAR 相機啟動中（模擬）\n\n🥋\n\nCombo：0開始戰鬥！\n\n👊 普通踢擊 🔥 旋踢 🛡️ 防禦 🔄 重置\n\n## 🤖 AI 教練\n\n今天建議進行高踢訓練 20 分鐘。\n\n取得 AI 建議## 🥋 腰帶養成系統\n\n目前等級：白帶\n\n<script> let hp = 100; let combo = 0; let level = 0; const belts = [ \"白帶\", \"黃帶\", \"綠帶\", \"藍帶\", \"紅帶\", \"黑帶\" ]; function startBattle(){ document.getElementById(\"battle\").style.display=\"block\"; document.getElementById(\"status\").innerHTML = \"AR 對戰開始！\"; } function bossMode(){ startBattle(); document.getElementById(\"enemy\").innerHTML = \"👹\"; document.getElementById(\"status\").innerHTML = \"Boss 出現了！\"; } function challengeMode(){ alert(\"⚡ 30 秒旋踢挑戰開始！\"); } function updateUI(){ document.getElementById(\"hp\").style.width = hp + \"%\"; document.getElementById(\"combo\").innerHTML = combo; if(hp <= 0){ document.getElementById(\"enemy\").innerHTML = \"💥\"; document.getElementById(\"status\").innerHTML = \"🎉 Victory！Boss 被擊敗！\"; if(level < belts.length - 1){ level++; document.getElementById(\"beltText\").innerHTML = \"目前等級：\" + belts[level]; } } } function showEffect(text){ document.getElementById(\"effect\").innerHTML = ' ' + text + ' '; setTimeout(() => { document.getElementById(\"effect\").innerHTML = \"\"; }, 500); } function kick(){ if(hp <= 0) return; hp -= 15; combo += 1; document.getElementById(\"status\").innerHTML = \"命中成功！\"; showEffect(\"COMBO +1\"); updateUI(); } function spinKick(){ if(hp <= 0) return; hp -= 30; combo += 2; document.getElementById(\"status\").innerHTML = \"🔥 旋踢爆擊！\"; showEffect(\"CRITICAL HIT!\"); updateUI(); } function block(){ document.getElementById(\"status\").innerHTML = \"成功防禦敵人攻擊！\"; } function resetGame(){ hp = 100; combo = 0; document.getElementById(\"enemy\").innerHTML = \"🥋\"; document.getElementById(\"status\").innerHTML = \"重新開始戰鬥！\"; updateUI(); } function coachTip(){ const tips = [ \"今天建議訓練旋踢速度。\", \"記得補充蛋白質與水分。\", \"你的反應速度進步了！\", \"高踢角度還能再提高。\" ]; const randomTip = tips[Math.floor(Math.random()*tips.length)]; document.getElementById(\"coach\").innerHTML = randomTip; } </script> [](url)", "url": "https://wpnews.pro/news/index-html", "canonical_source": "https://gist.github.com/isdaviddong/36046c2a398cb8e943fc520f79c28c4c", "published_at": "2017-01-15 06:30:19+00:00", "updated_at": "2026-05-22 19:07:12.918041+00:00", "lang": "en", "topics": ["cloud-computing", "cybersecurity", "developer-tools"], "entities": ["Microsoft", "Azure Active Directory", "Graph API"], "alternates": {"html": "https://wpnews.pro/news/index-html", "markdown": "https://wpnews.pro/news/index-html.md", "text": "https://wpnews.pro/news/index-html.txt", "jsonld": "https://wpnews.pro/news/index-html.jsonld"}}