{"id":25878,"date":"2025-02-28T17:46:07","date_gmt":"2025-02-28T08:46:07","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25878"},"modified":"2025-02-28T17:46:09","modified_gmt":"2025-02-28T08:46:09","slug":"%e3%82%b5%e3%83%96%e3%82%b9%e3%82%af%e8%87%aa%e5%8b%95%e6%95%b4%e7%90%86%e3%83%bb%e7%ae%a1%e7%90%86%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25878","title":{"rendered":"\u30b5\u30d6\u30b9\u30af\u81ea\u52d5\u6574\u7406\u30fb\u7ba1\u7406\u30b5\u30fc\u30d3\u30b9"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"ja\">\n&lt;head>\n  &lt;meta charset=\"UTF-8\">\n  &lt;title>SUBS Management - \u30b5\u30d6\u30b9\u30af\u81ea\u52d5\u6574\u7406\u30fb\u7ba1\u7406\u30b5\u30fc\u30d3\u30b9&lt;\/title>\n  &lt;meta name=\"description\" content=\"\u8907\u6570\u306e\u5b9a\u984d\u30b5\u30fc\u30d3\u30b9\u3092\u4e00\u62ec\u7ba1\u7406\u30fb\u6574\u7406\u3057\u3001\u89e3\u7d04\u3057\u5fd8\u308c\u3092\u9632\u6b62\u3057\u3066\u5bb6\u8a08\u3092\u8ce2\u304f\u3059\u308b\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\">\n  &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  &lt;!-- ==========================\n       \u5916\u90e8\u30e9\u30a4\u30d6\u30e9\u30ea (CDN)\n  ========================== -->\n  &lt;!-- GSAP + ScrollTrigger -->\n  &lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.2\/gsap.min.js\"\n    integrity=\"sha512-xxxx\" \n    crossorigin=\"anonymous\" \n    referrerpolicy=\"no-referrer\">\n  &lt;\/script>\n  &lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.2\/ScrollTrigger.min.js\"\n    integrity=\"sha512-xxxx\" \n    crossorigin=\"anonymous\" \n    referrerpolicy=\"no-referrer\">\n  &lt;\/script>\n  &lt;!-- Three.js -->\n  &lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r152\/three.min.js\"\n    integrity=\"sha512-xxxx\" \n    crossorigin=\"anonymous\" \n    referrerpolicy=\"no-referrer\">\n  &lt;\/script>\n\n  &lt;style>\n    \/* ==========================\n       \u30d9\u30fc\u30b9\u30b9\u30bf\u30a4\u30eb\n    ========================== *\/\n    * {\n      box-sizing: border-box;\n    }\n    html, body {\n      margin: 0; \n      padding: 0;\n      font-family: sans-serif;\n      color: #333;\n      background-color: #f9f9f9;\n      line-height: 1.6;\n      scroll-behavior: smooth; \/* \u30b9\u30e0\u30fc\u30ba\u30b9\u30af\u30ed\u30fc\u30eb *\/\n    }\n    a {\n      text-decoration: none;\n      color: #0078d7;\n      transition: color 0.2s ease;\n    }\n    a:hover {\n      color: #005bb5;\n    }\n    h1, h2, h3, h4 {\n      margin: 0;\n      font-weight: normal;\n    }\n    p {\n      margin: 0 0 1em;\n    }\n    ul {\n      margin: 0; \n      padding: 0; \n      list-style: none;\n    }\n    img {\n      max-width: 100%;\n      display: block;\n    }\n\n    \/* ==========================\n       \u30ab\u30e9\u30fc\u5909\u6570\n    ========================== *\/\n    :root {\n      --color-primary: #0078d7;\n      --color-accent: #ffcc00;\n      --color-bg: #f9f9f9;\n      --color-white: #ffffff;\n      --color-border: #eee;\n      --color-text: #333;\n    }\n\n    \/* ==========================\n       \u5168\u4f53\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u7528\u30b3\u30f3\u30c6\u30ca\n    ========================== *\/\n    .container {\n      width: 90%;\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 60px 0;\n    }\n\n    \/* ==========================\n       \u30d8\u30c3\u30c0\u30fc\n    ========================== *\/\n    header {\n      position: sticky;\n      top: 0;\n      z-index: 998;\n      background: var(--color-white);\n      box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n    }\n    .header-inner {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      height: 60px;\n      width: 90%;\n      max-width: 1200px;\n      margin: 0 auto;\n    }\n    .header-logo {\n      font-size: 1.5rem;\n      color: var(--color-primary);\n      font-weight: bold;\n    }\n    nav ul {\n      display: flex;\n      gap: 30px;\n    }\n    nav a {\n      color: var(--color-text);\n      font-size: 0.95rem;\n      font-weight: bold;\n    }\n    nav a:hover {\n      color: var(--color-primary);\n    }\n    .hamburger {\n      display: none;\n      font-size: 1.5rem;\n      cursor: pointer;\n    }\n    .mobile-nav {\n      display: none;\n      position: absolute;\n      top: 60px; right: 0;\n      width: 100%;\n      max-width: 300px;\n      background: var(--color-white);\n      box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n      z-index: 999;\n    }\n    .mobile-nav ul {\n      display: flex; \n      flex-direction: column;\n      gap: 20px; \n      padding: 20px;\n    }\n    .mobile-nav a {\n      font-size: 1rem; \n      color: var(--color-text);\n    }\n\n    \/* ==========================\n       Three.js \u80cc\u666f\u30ad\u30e3\u30f3\u30d0\u30b9\n    ========================== *\/\n    #three-bg {\n      position: fixed;\n      top: 0; left: 0;\n      width: 100vw; height: 100vh;\n      z-index: -1;\n      background: #000; \/* \u8aad\u307f\u8fbc\u307f\u6642\u306e\u4eee\u8272 *\/\n    }\n\n    \/* ==========================\n       \u30d2\u30fc\u30ed\u30fc\u30bb\u30af\u30b7\u30e7\u30f3\n    ========================== *\/\n    .hero {\n      position: relative;\n      min-height: 80vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      text-align: center;\n      color: #fff;\n      padding: 100px 20px;\n      overflow: hidden;\n    }\n    .hero h1 {\n      font-size: 2.5rem;\n      margin-bottom: 20px;\n      line-height: 1.2;\n      transform: translateY(50px);\n      opacity: 0;\n    }\n    .hero p {\n      font-size: 1.1rem;\n      margin-bottom: 30px;\n      transform: translateY(50px);\n      opacity: 0;\n    }\n    .hero .cta-btn {\n      background: var(--color-accent);\n      color: #333;\n      padding: 15px 30px;\n      border-radius: 6px;\n      font-size: 1rem;\n      font-weight: bold;\n      transition: background-color 0.2s ease;\n      transform: translateY(50px);\n      opacity: 0;\n    }\n    .hero .cta-btn:hover {\n      background: #e6b800;\n    }\n\n    \/* ==========================\n       Stats\u30bb\u30af\u30b7\u30e7\u30f3 (\u6570\u5024\u30ab\u30a6\u30f3\u30bf\u30fc)\n    ========================== *\/\n    .stats-section {\n      background: var(--color-bg);\n      text-align: center;\n      padding: 60px 20px;\n    }\n    .stats-section h2 {\n      color: var(--color-primary);\n      margin-bottom: 40px;\n    }\n    .stats-grid {\n      display: flex; \n      flex-wrap: wrap; \n      gap: 40px; \n      justify-content: center;\n    }\n    .stat-item {\n      flex: 1 1 200px;\n      max-width: 250px;\n      background: var(--color-white);\n      border-radius: 8px;\n      box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n      padding: 20px;\n      transition: transform 0.3s ease;\n    }\n    .stat-item:hover { transform: translateY(-5px); }\n    .stat-number {\n      font-size: 2rem;\n      color: var(--color-primary);\n      font-weight: bold;\n      margin-bottom: 10px;\n    }\n    .stat-label {\n      font-size: 0.95rem;\n      color: #666;\n    }\n\n    \/* ==========================\n       Testimonials (\u30ab\u30eb\u30fc\u30bb\u30eb)\n    ========================== *\/\n    .testimonials-section {\n      background: var(--color-white);\n      padding: 60px 20px;\n    }\n    .testimonials-section h2 {\n      text-align: center;\n      color: var(--color-primary);\n      margin-bottom: 40px;\n    }\n    .carousel-container {\n      max-width: 800px; \n      margin: 0 auto; \n      position: relative;\n      overflow: hidden;\n    }\n    .carousel-track {\n      display: flex; \n      transition: transform 0.5s ease;\n    }\n    .carousel-slide {\n      min-width: 100%;\n      background: var(--color-bg);\n      border-radius: 8px;\n      box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n      margin: 0 10px;\n      padding: 30px;\n      text-align: center;\n    }\n    .carousel-text {\n      font-size: 1rem;\n      font-style: italic;\n      color: #555;\n      margin-bottom: 10px;\n    }\n    .carousel-author {\n      font-weight: bold;\n      color: #333;\n      font-size: 0.9rem;\n    }\n    .carousel-buttons {\n      text-align: center;\n      margin-top: 20px;\n    }\n    .carousel-btn {\n      background: var(--color-primary);\n      color: #fff;\n      border: none;\n      padding: 8px 12px;\n      border-radius: 4px;\n      margin: 0 5px;\n      cursor: pointer;\n      font-size: 1rem;\n    }\n    .carousel-btn:hover {\n      background: #005bb5;\n    }\n\n    \/* ==========================\n       \u30d5\u30a9\u30fc\u30e0\u30bb\u30af\u30b7\u30e7\u30f3 (\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3)\n    ========================== *\/\n    .form-section {\n      background: var(--color-accent);\n      padding: 60px 20px;\n    }\n    .form-section h2 {\n      text-align: center;\n      color: var(--color-primary);\n      margin-bottom: 40px;\n    }\n    .signup-form {\n      max-width: 600px;\n      margin: 0 auto;\n      background: var(--color-white);\n      border-radius: 8px;\n      box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n      padding: 30px;\n    }\n    .form-group {\n      margin-bottom: 20px;\n    }\n    .form-group label {\n      display: block;\n      margin-bottom: 5px;\n      font-weight: bold;\n    }\n    .form-group input {\n      width: 100%;\n      padding: 10px;\n      border-radius: 4px;\n      border: 1px solid #ccc;\n      font-size: 1rem;\n    }\n    .error-message {\n      font-size: 0.85rem;\n      color: red;\n      display: none;\n    }\n    .signup-submit {\n      background: var(--color-primary);\n      color: #fff;\n      border: none;\n      padding: 12px 24px;\n      border-radius: 4px;\n      font-size: 1rem;\n      cursor: pointer;\n      transition: background 0.2s ease;\n    }\n    .signup-submit:hover {\n      background: #005bb5;\n    }\n\n    \/* ==========================\n       \u30d5\u30c3\u30bf\u30fc\n    ========================== *\/\n    footer {\n      background: #f0f0f0; \n      padding: 20px; \n      text-align: center;\n      margin-top: 60px;\n    }\n    footer .footer-note {\n      font-size: 0.9rem;\n      color: #666;\n      margin-top: 10px;\n    }\n\n    \/* ==========================\n       \u30ec\u30b9\u30dd\u30f3\u30b7\u30d6\n    ========================== *\/\n    @media (max-width: 768px) {\n      .header-inner {\n        justify-content: space-between;\n      }\n      nav ul { display: none; }\n      .hamburger { display: block; }\n\n      .stats-grid { display: block; }\n      .stat-item { margin: 0 auto 20px; }\n\n      .carousel-slide { margin: 0 5px; }\n    }\n  &lt;\/style>\n&lt;\/head>\n&lt;body>\n\n  &lt;!-- Three.js \u80cc\u666f\u30ad\u30e3\u30f3\u30d0\u30b9 -->\n  &lt;canvas id=\"three-bg\" aria-hidden=\"true\">&lt;\/canvas>\n\n  &lt;!-- \u30d8\u30c3\u30c0\u30fc -->\n  &lt;header>\n    &lt;div class=\"header-inner\">\n      &lt;div class=\"header-logo\">SUBS Management&lt;\/div>\n      &lt;nav>\n        &lt;ul id=\"navLinks\">\n          &lt;li>&lt;a href=\"#hero\">Home&lt;\/a>&lt;\/li>\n          &lt;li>&lt;a href=\"#stats\">Stats&lt;\/a>&lt;\/li>\n          &lt;li>&lt;a href=\"#testimonials\">Reviews&lt;\/a>&lt;\/li>\n          &lt;li>&lt;a href=\"#signup\">SignUp&lt;\/a>&lt;\/li>\n        &lt;\/ul>\n      &lt;\/nav>\n      &lt;!-- \u30cf\u30f3\u30d0\u30fc\u30ac\u30fc\u30e1\u30cb\u30e5\u30fc -->\n      &lt;div class=\"hamburger\" id=\"hamburger\">&amp;#9776;&lt;\/div>\n    &lt;\/div>\n    &lt;!-- \u30e2\u30d0\u30a4\u30eb\u7528\u30ca\u30d3 -->\n    &lt;div class=\"mobile-nav\" id=\"mobileNav\">\n      &lt;ul>\n        &lt;li>&lt;a href=\"#hero\">Home&lt;\/a>&lt;\/li>\n        &lt;li>&lt;a href=\"#stats\">Stats&lt;\/a>&lt;\/li>\n        &lt;li>&lt;a href=\"#testimonials\">Reviews&lt;\/a>&lt;\/li>\n        &lt;li>&lt;a href=\"#signup\">SignUp&lt;\/a>&lt;\/li>\n      &lt;\/ul>\n    &lt;\/div>\n  &lt;\/header>\n\n  &lt;!-- \u30d2\u30fc\u30ed\u30fc\u30bb\u30af\u30b7\u30e7\u30f3 -->\n  &lt;section class=\"hero\" id=\"hero\">\n    &lt;h1>\u30b5\u30d6\u30b9\u30af\u3092\u4e00\u62ec\u7ba1\u7406\u3057\u3066\u3001\u8ce2\u304f\u7bc0\u7d04&lt;\/h1>\n    &lt;p>\n      \u4f7f\u3063\u3066\u3044\u306a\u3044\u30b5\u30d6\u30b9\u30af\u3092\u4e00\u5143\u5316\u30fb\u89e3\u7d04\u30b5\u30dd\u30fc\u30c8\u3002&lt;br>\n      \u7121\u99c4\u306a\u51fa\u8cbb\u3092\u524a\u6e1b\u3057\u3001\u3042\u306a\u305f\u306e\u5bb6\u8a08\u3092\u30b9\u30ea\u30e0\u306b\u3057\u307e\u305b\u3093\u304b\uff1f\n    &lt;\/p>\n    &lt;a href=\"#signup\" class=\"cta-btn\">\u4eca\u3059\u3050\u59cb\u3081\u308b&lt;\/a>\n  &lt;\/section>\n\n  &lt;!-- Stats\u30bb\u30af\u30b7\u30e7\u30f3 (\u6570\u5024\u30ab\u30a6\u30f3\u30bf\u30fc) -->\n  &lt;section class=\"stats-section\" id=\"stats\">\n    &lt;div class=\"container\">\n      &lt;h2>\u5c0e\u5165\u5b9f\u7e3e\u30fb\u6210\u679c&lt;\/h2>\n      &lt;div class=\"stats-grid\">\n        &lt;div class=\"stat-item\">\n          &lt;div class=\"stat-number\" data-target=\"12000\">0&lt;\/div>\n          &lt;div class=\"stat-label\">\u7d2f\u8a08\u30e6\u30fc\u30b6\u30fc&lt;\/div>\n        &lt;\/div>\n        &lt;div class=\"stat-item\">\n          &lt;div class=\"stat-number\" data-target=\"9800\">0&lt;\/div>\n          &lt;div class=\"stat-label\">\u89e3\u7d04\u30b5\u30dd\u30fc\u30c8\u5b9f\u884c&lt;\/div>\n        &lt;\/div>\n        &lt;div class=\"stat-item\">\n          &lt;div class=\"stat-number\" data-target=\"95\">0&lt;\/div>\n          &lt;div class=\"stat-label\">\u6e80\u8db3\u5ea6(%)&lt;\/div>\n        &lt;\/div>\n        &lt;div class=\"stat-item\">\n          &lt;div class=\"stat-number\" data-target=\"1500000\">0&lt;\/div>\n          &lt;div class=\"stat-label\">\u7dcf\u7bc0\u7d04\u984d(\u5186)&lt;\/div>\n        &lt;\/div>\n      &lt;\/div>\n    &lt;\/div>\n  &lt;\/section>\n\n  &lt;!-- Testimonials (\u30ab\u30eb\u30fc\u30bb\u30eb) -->\n  &lt;section class=\"testimonials-section\" id=\"testimonials\">\n    &lt;h2>\u5229\u7528\u8005\u306e\u58f0&lt;\/h2>\n    &lt;div class=\"carousel-container\">\n      &lt;div class=\"carousel-track\" id=\"carouselTrack\">\n        &lt;!-- Slide1 -->\n        &lt;div class=\"carousel-slide\">\n          &lt;p class=\"carousel-text\">\n            \u300c\u3044\u304f\u3064\u3082\u306e\u52d5\u753b\u914d\u4fe1\u30b5\u30fc\u30d3\u30b9\u3092\u5951\u7d04\u3057\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u307e\u3068\u3081\u3066\u7ba1\u7406\u3067\u304d\u308b\u304b\u3089\u51c4\u304f\u697d\u306b\u306a\u308a\u307e\u3057\u305f\uff01\u300d\n          &lt;\/p>\n          &lt;p class=\"carousel-author\">- \u7530\u4e2d\u3055\u3093 (30\u4ee3 \/ \u4f1a\u793e\u54e1)&lt;\/p>\n        &lt;\/div>\n        &lt;!-- Slide2 -->\n        &lt;div class=\"carousel-slide\">\n          &lt;p class=\"carousel-text\">\n            \u300c\u89e3\u7d04\u30ea\u30de\u30a4\u30f3\u30c9\u304c\u6765\u308b\u306e\u3067\u672c\u5f53\u306b\u52a9\u304b\u308a\u307e\u3059\u3002&lt;br>\n             \u5148\u6708\u3060\u3051\u30672,000\u5186\u4ee5\u4e0a\u3082\u7bc0\u7d04\u3067\u304d\u307e\u3057\u305f\uff01\u300d\n          &lt;\/p>\n          &lt;p class=\"carousel-author\">- \u4f50\u85e4\u3055\u3093 (40\u4ee3 \/ \u4e3b\u5a66)&lt;\/p>\n        &lt;\/div>\n        &lt;!-- Slide3 -->\n        &lt;div class=\"carousel-slide\">\n          &lt;p class=\"carousel-text\">\n            \u300c\u652f\u6255\u3044\u60c5\u5831\u304c\u4e00\u5143\u5316\u3055\u308c\u308b\u306e\u306f\u6700\u9ad8\u3002&lt;br>\n             \u4f55\u3088\u308aUI\u304c\u30b7\u30f3\u30d7\u30eb\u3067\u4f7f\u3044\u3084\u3059\u3044\u3067\u3059\uff01\u300d\n          &lt;\/p>\n          &lt;p class=\"carousel-author\">- \u9234\u6728\u3055\u3093 (20\u4ee3 \/ \u30d5\u30ea\u30fc\u30e9\u30f3\u30b9)&lt;\/p>\n        &lt;\/div>\n      &lt;\/div>\n      &lt;div class=\"carousel-buttons\">\n        &lt;button class=\"carousel-btn\" id=\"prevSlide\">\uff1c&lt;\/button>\n        &lt;button class=\"carousel-btn\" id=\"nextSlide\">\uff1e&lt;\/button>\n      &lt;\/div>\n    &lt;\/div>\n  &lt;\/section>\n\n  &lt;!-- \u30d5\u30a9\u30fc\u30e0\u30bb\u30af\u30b7\u30e7\u30f3 (\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3) -->\n  &lt;section class=\"form-section\" id=\"signup\">\n    &lt;div class=\"container\">\n      &lt;h2>\u65b0\u898f\u767b\u9332 (\u7121\u6599)&lt;\/h2>\n      &lt;div class=\"signup-form\" id=\"signupForm\">\n        &lt;div class=\"form-group\">\n          &lt;label for=\"signupEmail\">\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&lt;\/label>\n          &lt;input type=\"email\" id=\"signupEmail\" aria-required=\"true\" placeholder=\"example@example.com\">\n          &lt;p class=\"error-message\" id=\"emailError\">\u6b63\u3057\u3044\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044&lt;\/p>\n        &lt;\/div>\n        &lt;div class=\"form-group\">\n          &lt;label for=\"signupPassword\">\u30d1\u30b9\u30ef\u30fc\u30c9 (8\u6587\u5b57\u4ee5\u4e0a)&lt;\/label>\n          &lt;input type=\"password\" id=\"signupPassword\" aria-required=\"true\" placeholder=\"8\u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\">\n          &lt;p class=\"error-message\" id=\"passwordError\">\u30d1\u30b9\u30ef\u30fc\u30c9\u306f8\u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044&lt;\/p>\n        &lt;\/div>\n        &lt;button class=\"signup-submit\" id=\"signupSubmitBtn\">\u767b\u9332&lt;\/button>\n      &lt;\/div>\n    &lt;\/div>\n  &lt;\/section>\n\n  &lt;!-- \u30d5\u30c3\u30bf\u30fc -->\n  &lt;footer>\n    &lt;p class=\"footer-note\">\n      &amp;copy; 2025 SUBS Management. All rights reserved.\n    &lt;\/p>\n  &lt;\/footer>\n\n  &lt;script>\n    \/*************************************************************\n     * 1. Three.js \u80cc\u666f \n     *************************************************************\/\n    let scene, camera, renderer;\n    const canvas = document.getElementById('three-bg');\n    let objects = &#91;];\n\n    function initThreeBG() {\n      scene = new THREE.Scene();\n      camera = new THREE.PerspectiveCamera(\n        75,\n        window.innerWidth \/ window.innerHeight,\n        0.1,\n        1000\n      );\n      camera.position.z = 250;\n\n      renderer = new THREE.WebGLRenderer({ canvas: canvas, alpha: true });\n      renderer.setSize(window.innerWidth, window.innerHeight);\n\n      \/\/ \u30e9\u30a4\u30c8\n      const ambient = new THREE.AmbientLight(0xffffff, 0.7);\n      scene.add(ambient);\n      const pointLight = new THREE.PointLight(0xffffff, 0.8);\n      pointLight.position.set(50, 50, 50);\n      scene.add(pointLight);\n\n      \/\/ \u3044\u304f\u3064\u304b\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u30e9\u30f3\u30c0\u30e0\u914d\u7f6e\n      const geometryTypes = &#91;\n        new THREE.TorusGeometry(10, 3, 16, 100),\n        new THREE.SphereGeometry(8, 32, 32),\n        new THREE.BoxGeometry(12, 12, 12)\n      ];\n\n      for(let i=0; i&lt;30; i++){\n        const geo = geometryTypes&#91;Math.floor(Math.random() * geometryTypes.length)];\n        const material = new THREE.MeshStandardMaterial({\n          color: 0xffffff\n        });\n        \/\/ \u8272\u76f8\u3092\u30e9\u30f3\u30c0\u30e0\u5316\n        material.color.setHSL(Math.random(), 0.5, 0.5);\n\n        const mesh = new THREE.Mesh(geo, material);\n        mesh.position.x = (Math.random() - 0.5) * 400;\n        mesh.position.y = (Math.random() - 0.5) * 400;\n        mesh.position.z = (Math.random() - 0.5) * 400;\n        mesh.rotation.x = Math.random() * Math.PI;\n        mesh.rotation.y = Math.random() * Math.PI;\n        scene.add(mesh);\n        objects.push(mesh);\n      }\n    }\n\n    function animateThreeBG() {\n      requestAnimationFrame(animateThreeBG);\n      objects.forEach(obj => {\n        obj.rotation.x += 0.001;\n        obj.rotation.y += 0.001;\n      });\n      camera.position.z += Math.sin(Date.now() * 0.0005) * 0.05; \/\/ \u30ab\u30e1\u30e9\u63fa\u3089\u3057\n      renderer.render(scene, camera);\n    }\n\n    \/*************************************************************\n     * 2. \u30cf\u30f3\u30d0\u30fc\u30ac\u30fc\u30e1\u30cb\u30e5\u30fc\n     *************************************************************\/\n    const hamburger = document.getElementById('hamburger');\n    const mobileNav = document.getElementById('mobileNav');\n    let navOpen = false;\n    hamburger.addEventListener('click', () => {\n      navOpen = !navOpen;\n      mobileNav.style.display = navOpen ? 'block' : 'none';\n    });\n\n    \/*************************************************************\n     * 3. GSAP + ScrollTrigger\n     *    - Hero\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u30bf\u30a4\u30c8\u30eb\u3084\u30dc\u30bf\u30f3\u3092\u30a2\u30cb\u30e1\n     *    - \u4ed6\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3082\u30b9\u30af\u30ed\u30fc\u30eb\u3067\u30d5\u30a7\u30fc\u30c9\u30a4\u30f3\n     *************************************************************\/\n    window.addEventListener('DOMContentLoaded', () => {\n      gsap.registerPlugin(ScrollTrigger);\n\n      \/\/ Hero\u30a2\u30cb\u30e1\n      gsap.to('.hero h1', {\n        duration: 1, y: 0, opacity: 1, ease: 'power2.out'\n      });\n      gsap.to('.hero p', {\n        duration: 1, y: 0, opacity: 1, delay: 0.2, ease: 'power2.out'\n      });\n      gsap.to('.hero .cta-btn', {\n        duration: 1, y: 0, opacity: 1, delay: 0.4, ease: 'power2.out'\n      });\n\n      \/\/ Stats\u30bb\u30af\u30b7\u30e7\u30f3\n      gsap.from('#stats .stats-grid', {\n        scrollTrigger: {\n          trigger: '#stats',\n          start: 'top 80%',\n        },\n        y: 50, opacity: 0, duration: 1, ease: 'power2.out'\n      });\n\n      \/\/ Testimonials\n      gsap.from('#testimonials .carousel-container', {\n        scrollTrigger: {\n          trigger: '#testimonials',\n          start: 'top 80%',\n        },\n        y: 50, opacity: 0, duration: 1, ease: 'power2.out'\n      });\n\n      \/\/ SignUp\u30d5\u30a9\u30fc\u30e0\n      gsap.from('#signupForm', {\n        scrollTrigger: {\n          trigger: '#signupForm',\n          start: 'top 80%',\n        },\n        y: 50, opacity: 0, duration: 1, ease: 'power2.out'\n      });\n    });\n\n    \/*************************************************************\n     * 4. Stats \u30ab\u30a6\u30f3\u30bf\u30fc (Intersection Observer)\n     *************************************************************\/\n    const statNumbers = document.querySelectorAll('.stat-number');\n    const statsObserver = new IntersectionObserver((entries, obs) => {\n      entries.forEach(entry => {\n        if(entry.isIntersecting) {\n          const el = entry.target;\n          const targetVal = parseInt(el.getAttribute('data-target'), 10);\n          let currentVal = 0;\n          const increment = Math.ceil(targetVal \/ 100);\n\n          const timer = setInterval(() => {\n            currentVal += increment;\n            if(currentVal >= targetVal) {\n              currentVal = targetVal;\n              clearInterval(timer);\n            }\n            el.textContent = currentVal.toLocaleString();\n          }, 20);\n\n          obs.unobserve(el);\n        }\n      });\n    }, { threshold: 0.5 });\n\n    statNumbers.forEach(num => statsObserver.observe(num));\n\n    \/*************************************************************\n     * 5. Testimonials \u30ab\u30eb\u30fc\u30bb\u30eb\n     *************************************************************\/\n    const carouselTrack = document.getElementById('carouselTrack');\n    const prevSlideBtn = document.getElementById('prevSlide');\n    const nextSlideBtn = document.getElementById('nextSlide');\n    let currentSlideIndex = 0;\n    const slides = Array.from(document.querySelectorAll('.carousel-slide'));\n\n    function updateCarousel() {\n      carouselTrack.style.transform = `translateX(${-100 * currentSlideIndex}%)`;\n    }\n\n    prevSlideBtn.addEventListener('click', () => {\n      currentSlideIndex = (currentSlideIndex === 0) ? slides.length - 1 : currentSlideIndex - 1;\n      updateCarousel();\n    });\n    nextSlideBtn.addEventListener('click', () => {\n      currentSlideIndex = (currentSlideIndex === slides.length - 1) ? 0 : currentSlideIndex + 1;\n      updateCarousel();\n    });\n\n    \/*************************************************************\n     * 6. \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30fb\u30d5\u30a9\u30fc\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n     *************************************************************\/\n    const signupEmail = document.getElementById('signupEmail');\n    const signupPassword = document.getElementById('signupPassword');\n    const emailError = document.getElementById('emailError');\n    const passwordError = document.getElementById('passwordError');\n    const signupSubmitBtn = document.getElementById('signupSubmitBtn');\n\n    function validateEmail(email) {\n      return \/^&#91;^\\s@]+@&#91;^\\s@]+\\.&#91;^\\s@]+$\/.test(email);\n    }\n    function validatePassword(pass) {\n      return pass.length >= 8;\n    }\n\n    signupEmail.addEventListener('input', () => {\n      if(!validateEmail(signupEmail.value.trim())) {\n        emailError.style.display = 'block';\n      } else {\n        emailError.style.display = 'none';\n      }\n    });\n    signupPassword.addEventListener('input', () => {\n      if(!validatePassword(signupPassword.value.trim())) {\n        passwordError.style.display = 'block';\n      } else {\n        passwordError.style.display = 'none';\n      }\n    });\n\n    signupSubmitBtn.addEventListener('click', () => {\n      const emailVal = signupEmail.value.trim();\n      const passVal = signupPassword.value.trim();\n\n      let hasError = false;\n      if(!validateEmail(emailVal)) {\n        emailError.style.display = 'block';\n        hasError = true;\n      }\n      if(!validatePassword(passVal)) {\n        passwordError.style.display = 'block';\n        hasError = true;\n      }\n      if(hasError) return;\n\n      alert('\u767b\u9332\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3057\u305f\uff01');\n      \/\/ \u30d5\u30a9\u30fc\u30e0\u30ea\u30bb\u30c3\u30c8\u4f8b\n      signupEmail.value = '';\n      signupPassword.value = '';\n      emailError.style.display = 'none';\n      passwordError.style.display = 'none';\n    });\n\n    \/*************************************************************\n     * 7. \u753b\u9762\u30ea\u30b5\u30a4\u30ba\u6642\u306eThree.js\u518d\u8a2d\u5b9a\n     *************************************************************\/\n    window.addEventListener('resize', () => {\n      renderer.setSize(window.innerWidth, window.innerHeight);\n      camera.aspect = window.innerWidth \/ window.innerHeight;\n      camera.updateProjectionMatrix();\n    });\n\n    \/*************************************************************\n     * 8. \u30da\u30fc\u30b8\u8aad\u307f\u8fbc\u307f\u5b8c\u4e86\u6642\u306b Three.js \u521d\u671f\u5316 &amp; \u30a2\u30cb\u30e1\u958b\u59cb\n     *************************************************************\/\n    window.addEventListener('load', () => {\n      initThreeBG();\n      animateThreeBG();\n    });\n  &lt;\/script>\n&lt;\/body>\n&lt;\/html>\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[80],"tags":[3],"class_list":["post-25878","post","type-post","status-publish","format-standard","hentry","category-html","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25878"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25878\/revisions"}],"predecessor-version":[{"id":25879,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25878\/revisions\/25879"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25878"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}