{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/leaflabot-app.js?cachebust=20260707e"],
  "sourcesContent": ["// LEAFLA\u690D\u7269\u80B2\u6210\u8A18\u9332\u30B7\u30B9\u30C6\u30E0 \u5B8C\u5168\u7D71\u5408\u7248 JavaScript\n// v6.6.0\u30D9\u30FC\u30B9 + TypeScript v17.1.0\u5B8C\u5168\u5BFE\u5FDC\u7248 - \u69CB\u6587\u30A8\u30E9\u30FC\u4FEE\u6B63\u7248\n// \u5168\u6A5F\u80FD\u7D71\u5408\u30FBnano-banana\u753B\u50CF\u751F\u6210\u5BFE\u5FDC\u30FB\u30B1\u30A2\u7BA1\u7406\u5B8C\u5168\u5B9F\u88C5\n\n// \u2605\u2605 \u5546\u54C1\u30FB\u8A18\u4E8B\u63A8\u5968\u8868\u793A\u30D5\u30E9\u30B0 \u2605\u2605\n// Shopify\u9023\u643A\u3067\u30B3\u30F3\u30C6\u30F3\u30C4\u30DE\u30C3\u30C1\u30F3\u30B0\u304C\u5B8C\u6210\u3057\u305F\u3089 true \u306B\u5909\u66F4\u3059\u308B\nconst RECOMMENDATIONS_ENABLED = false;\nconst nativeFetch = globalThis.fetch.bind(globalThis);\n\n// ===== Supabase Functions \u8A8D\u8A3C\u30D8\u30C3\u30C0\u30FC\u81EA\u52D5\u4ED8\u4E0E\u30A4\u30F3\u30BF\u30FC\u30BB\u30D7\u30BF\u30FC =====\n// process-consultation \u7B49\u3078\u306E\u5168\u30EA\u30AF\u30A8\u30B9\u30C8\u306B Authorization / apikey \u3092\u81EA\u52D5\u8FFD\u52A0\n// window.SUPABASE_CONFIG.key \u3092\u4F7F\u3046\u3053\u3068\u3067 dev/prod \u3092\u81EA\u52D5\u5207\u66FF\n(function() {\n  var _orig = globalThis.fetch;\n  var _sbKeyFallback = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxhaXhnY2p2b3dkc3pydGRweGxxIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDU2NTM5MTIsImV4cCI6MjA2MTIyOTkxMn0.yAvMili-p_uQMHYlz-fpErgFqX243J5z1zI87VqO63M';\n  globalThis.fetch = function(url, options) {\n    var urlStr = url ? (typeof url === 'string' ? url : String(url)) : '';\n    if (urlStr.indexOf('supabase.co/functions/') !== -1) {\n      var _sbKey = (window.SUPABASE_CONFIG && window.SUPABASE_CONFIG.key) || _sbKeyFallback;\n      options = Object.assign({}, options || {});\n      options.headers = Object.assign(\n        { 'Authorization': 'Bearer ' + _sbKey, 'apikey': _sbKey },\n        options.headers || {}\n      );\n    }\n    return _orig.call(this, url, options);\n  };\n})();\n// ===================================================\n\nclass PlantConsultationApp {\nconstructor() {\n    // \u57FA\u672C\u8A2D\u5B9A\n    this.userEmail = window.LEAFLA?.customerEmail || window.LEAFLA?.customer?.email || '';\n    this.isLoggedIn = window.LEAFLA?.isLoggedIn || false;\n    this.SUPABASE_ANON_KEY = window.SUPABASE_CONFIG?.key || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxhaXhnY2p2b3dkc3pydGRweGxxIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDU2NTM5MTIsImV4cCI6MjA2MTIyOTkxMn0.yAvMili-p_uQMHYlz-fpErgFqX243J5z1zI87VqO63M';\n    this.entitlement = window.LEAFLA?.entitlement || null;\n    this.currentQuota = null;\n    this.entitlementSnapshot = window.LEAFLA?.entitlement_snapshot || null;\n    \n    // API\u8A2D\u5B9A\n    const defaultApiBase = 'https://laixgcjvowdszrtdpxlq.supabase.co/functions/v1/process-consultation';\n    this.apiBase = (window.SUPABASE_CONFIG?.functionsBase ? window.SUPABASE_CONFIG.functionsBase + '/process-consultation' : defaultApiBase);\n\n    // \u72B6\u614B\u7BA1\u7406\n    this.existingPlants = [];\n    this.lastSelectedPlant = null;\n    this.currentOpenThread = null;\n    this.seasonInfo = this.getCurrentSeasonInfo();\n    \n    // TypeScript v17.1.0\u6E96\u62E0\u306E\u30B1\u30A2\u7A2E\u5225\u5B9A\u7FA9\n    this.careTypes = {\n      watering: { \n        icon: '\uD83D\uDCA7', \n        name: '\u6C34\u3084\u308A', \n        base_interval_days: 7, \n        seasonal_multipliers: { spring: 0.8, summer: 0.6, autumn: 1.0, winter: 1.5 } \n      },\n      fertilizing: { \n        icon: '\uD83C\uDF31', \n        name: '\u80A5\u6599', \n        base_interval_days: 30, \n        seasonal_multipliers: { spring: 0.8, summer: 0.9, autumn: 1.2, winter: 2.0 } \n      },\n      repotting: { \n        icon: '\uD83E\uDEB4', \n        name: '\u690D\u3048\u66FF\u3048', \n        base_interval_days: 365, \n        seasonal_multipliers: { spring: 1.0, summer: 1.1, autumn: 1.0, winter: 1.3 } \n      },\n      pruning: { \n        icon: '\u2702\uFE0F', \n        name: '\u526A\u5B9A', \n        base_interval_days: 90, \n        seasonal_multipliers: { spring: 0.8, summer: 1.0, autumn: 0.9, winter: 1.5 } \n      },\n      pest_control: { \n        icon: '\uD83D\uDC1B', \n        name: '\u5BB3\u866B\u5BFE\u7B56', \n        base_interval_days: 14, \n        seasonal_multipliers: { spring: 0.8, summer: 0.7, autumn: 1.0, winter: 1.8 } \n      },\n      other: { \n        icon: '\uD83D\uDCDD', \n        name: '\u305D\u306E\u4ED6', \n        base_interval_days: 30, \n        seasonal_multipliers: { spring: 1.0, summer: 1.0, autumn: 1.0, winter: 1.0 } \n      }\n    };\n    \n    // \u30AF\u30A9\u30FC\u30BF\u60C5\u5831\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\n    this._quotaCache = null;\n    this._quotaCacheExpiry = 0;\n    this._quotaLoading = false;\n\n    // syncShopifyPacks \u4E8C\u91CD\u5B9F\u884C\u9632\u6B62\n    this._syncInProgress = false;\n    this._syncDone = false;\n\n    // \u9001\u4FE1\u5236\u9650\n    this._lastSubmitTime = 0;\n    this._minSubmitInterval = 30000; // 30\u79D2\n    \n  // SNS\u72B6\u614B\u7BA1\u7406\u3092\u521D\u671F\u5316\uFF08\u6700\u5F8C\u306B\u8FFD\u52A0\uFF09\n  this.snsState = {\n    currentSort: 'recent',\n    currentPage: 1,\n    hasMore: true,\n    posts: [],\n    currentFeed: 'all'\n  };\n  // \u30D5\u30A9\u30ED\u30FC\u72B6\u614B\u30AD\u30E3\u30C3\u30B7\u30E5\uFF08authorEmail \u2192 true/false\uFF09\n  this.followState = {};\n  // \u672A\u8AAD\u901A\u77E5\u6570\n  this.notificationCount = 0;\n    this.init();\n\n  this.openedFromSNS = false;\n  this.returnToPostDetail = false;\n  this.currentPostId = null;\n  }\nrequestServerIllustration(...args) {\n  return this.requestServerIllustrationPatch(...args);\n}\n\n  getGuideTourSteps() {\n    return [\n      {\n        selector: '.consultation-form-section',\n        title: 'BotaReco\u3067\u3067\u304D\u308B\u3053\u3068',\n        body: '\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u3092\u6B8B\u3057\u305F\u308A\u3001AI\u306B\u80B2\u3066\u65B9\u3092\u76F8\u8AC7\u3057\u305F\u308A\u3067\u304D\u307E\u3059\u3002\u307E\u305A\u306F\u3072\u3068\u901A\u308A\u306E\u4F7F\u3044\u65B9\u3092\u3054\u6848\u5185\u3057\u307E\u3059\u3002',\n      },\n      {\n        selector: '#plant-name',\n        title: '\u2460 \u690D\u7269\u540D\u3092\u5165\u529B',\n        body: '\u307E\u305A\u306F\u8A18\u9332\u3057\u305F\u3044\u690D\u7269\u306E\u540D\u524D\u3092\u5165\u529B\u3057\u307E\u3059\u3002\u5199\u771F\u3082\u4E00\u7DD2\u306B\u767B\u9332\u3067\u304D\u307E\u3059\u3002',\n      },\n      {\n        selector: '#consultation',\n        title: '\u2461 AI\u306B\u76F8\u8AC7\uFF08\u7A7A\u6B04\u306A\u3089\u8A18\u9332\u306E\u307F\uFF09',\n        body: '\u3053\u3053\u306B\u6C17\u306B\u306A\u308B\u3053\u3068\u3092\u66F8\u304F\u3068AI\u304C\u30A2\u30C9\u30D0\u30A4\u30B9\u3057\u307E\u3059\u3002\u7A7A\u6B04\u306E\u307E\u307E\u6295\u7A3F\u3059\u308B\u3068\u300C\u8A18\u9332\u306E\u307F\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u3001AI\u5206\u6790\u306F\u884C\u308F\u308C\u307E\u305B\u3093\u3002',\n      },\n      {\n        selector: '.sns-public-option-section',\n        title: '\u2462 SNS\u516C\u958B\u8A2D\u5B9A',\n        body: '\u6295\u7A3F\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067SNS\u306B\u516C\u958B\u3055\u308C\u307E\u3059\u3002\u30C1\u30A7\u30C3\u30AF\u3092\u5916\u3059\u3068\u975E\u516C\u958B\u306E\u8A18\u9332\u3068\u3057\u3066\u4F7F\u3048\u307E\u3059\u3002\u516C\u958B\u5F8C\u3082\u3042\u3068\u304B\u3089\u975E\u516C\u958B\u306B\u5909\u66F4\u3067\u304D\u307E\u3059\u3002',\n      },\n      {\n        selector: '.threads-section',\n        title: '\u2463 \u8A18\u9332\u306F\u30B9\u30EC\u30C3\u30C9\u306B\u307E\u3068\u307E\u308A\u307E\u3059',\n        body: '\u6295\u7A3F\u3059\u308B\u3068\u690D\u7269\u3054\u3068\u306B\u30B9\u30EC\u30C3\u30C9\u304C\u3067\u304D\u307E\u3059\u3002\u540C\u3058\u30B9\u30EC\u30C3\u30C9\u304B\u3089\u7D9A\u3051\u3066AI\u306B\u76F8\u8AC7\u3057\u305F\u308A\u3001\u6C34\u3084\u308A\u30FB\u80A5\u6599\u306E\u914D\u5408\u306A\u3069\u306E\u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0\u3057\u3066\u3044\u3051\u307E\u3059\u3002',\n      },\n    ];\n  }\n\n  startGuideTour() {\n    if (!window.GuideTour) return;\n    window.GuideTour.start('leaflabot_app', this.getGuideTourSteps());\n  }\n\n  maybeAutoStartGuideTour() {\n    if (!this.isLoggedIn || !window.GuideTour) return;\n    window.GuideTour.isSeen('leaflabot_app').then((seen) => {\n      if (!seen) this.startGuideTour();\n    });\n  }\n\n  // \u30BF\u30D6\u3092\u958B\u3044\u3066\u304B\u3089\u30CF\u30A4\u30E9\u30A4\u30C8\u3059\u308B(onEnter)\u3002\u5B58\u5728\u3057\u306A\u3044\u30BF\u30D6(\u30B1\u30A2\u901A\u77E5/Grow Ops\u306F\n  // \u975E\u8868\u793A\u6761\u4EF6\u3042\u308A)\u306F\u30BB\u30EC\u30AF\u30BF\u304C\u898B\u3064\u304B\u3089\u305Agtour\u30A8\u30F3\u30B8\u30F3\u5074\u3067\u81EA\u7136\u306B\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u308B\n  getPlantRecordGuideTourSteps() {\n    var clickTab = function (tab) {\n      return function () {\n        var btn = document.querySelector('.tab-btn[data-tab=\"' + tab + '\"]');\n        if (btn) btn.click();\n      };\n    };\n    return [\n      {\n        selector: '.modal-header h3',\n        title: '\u3053\u306E\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u306B\u3064\u3044\u3066',\n        body: '\u30BF\u30D6\u3092\u5207\u308A\u66FF\u3048\u3066\u3001\u8A18\u9332\u306E\u632F\u308A\u8FD4\u308A\u30FB\u6210\u9577\u6BD4\u8F03\u30FB\u30B1\u30A2\u7BA1\u7406\u306A\u3069\u304C\u3067\u304D\u307E\u3059\u3002\u3072\u3068\u901A\u308A\u3054\u6848\u5185\u3057\u307E\u3059\u3002',\n      },\n      {\n        selector: '.tab-btn[data-tab=\"timeline\"]',\n        onEnter: clickTab('timeline'),\n        title: '\u2460 \u80B2\u6210\u8A18\u9332\u5C65\u6B74',\n        body: '\u3053\u308C\u307E\u3067\u6295\u7A3F\u3057\u305F\u8A18\u9332\u304C\u6642\u7CFB\u5217\u3067\u4E26\u3073\u307E\u3059\u3002\u5199\u771F\u3084\u76F8\u8AC7\u5185\u5BB9\u3092\u632F\u308A\u8FD4\u308C\u307E\u3059\u3002',\n      },\n      {\n        selector: '.tab-btn[data-tab=\"growth-comparison\"]',\n        onEnter: clickTab('growth-comparison'),\n        title: '\u2461 \u6210\u9577\u6BD4\u8F03',\n        body: '\u8A18\u9332\u3092\u6642\u7CFB\u5217\u3067\u6BD4\u8F03\u30FB\u5206\u6790\u3067\u304D\u307E\u3059\u3002\u8A18\u9332\u671F\u9593\u3084\u5199\u771F\u306E\u5909\u5316\u3092\u307E\u3068\u3081\u3066\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002',\n      },\n      {\n        selector: '.tab-btn[data-tab=\"care-log\"]',\n        onEnter: clickTab('care-log'),\n        title: '\u2462 \u30B1\u30A2\u8A18\u9332',\n        body: '\u6C34\u3084\u308A\u30FB\u80A5\u6599\u30FB\u690D\u3048\u66FF\u3048\u30FB\u526A\u5B9A\u30FB\u5BB3\u866B\u5BFE\u7B56\u306A\u3069\u3001\u3044\u3064\u4F55\u306E\u30B1\u30A2\u3092\u3057\u305F\u304B\u3092\u8A18\u9332\u3067\u304D\u307E\u3059\u3002\u65E5\u4ED8\u3068\u30E1\u30E2\u3092\u6B8B\u3057\u3066\u304A\u304F\u3068\u3001\u6B21\u306B\u30B1\u30A2\u3057\u305F\u6642\u306B\u524D\u56DE\u304B\u3089\u306E\u9593\u9694\u3092\u632F\u308A\u8FD4\u308C\u307E\u3059\u3002',\n      },\n      {\n        selector: '.tab-btn[data-tab=\"care-alerts\"]',\n        onEnter: clickTab('care-alerts'),\n        title: '\u2463 \u30B1\u30A2\u901A\u77E5\uFF08\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\uFF09',\n        body: '\u5B63\u7BC0\u3084\u524D\u56DE\u306E\u30B1\u30A2\u8A18\u9332\u304B\u3089\u306E\u7D4C\u904E\u65E5\u6570\u3092\u3082\u3068\u306B\u3001\u6C34\u3084\u308A\u30FB\u80A5\u6599\u306A\u3069\u300C\u305D\u308D\u305D\u308D\u304A\u624B\u5165\u308C\u306E\u6642\u671F\u300D\u3092\u81EA\u52D5\u3067\u901A\u77E5\u3057\u307E\u3059\u3002\u30B1\u30A2\u8A18\u9332\u30BF\u30D6\u306B\u8A18\u9332\u3059\u308B\u307B\u3069\u7CBE\u5EA6\u304C\u4E0A\u304C\u308A\u307E\u3059\u3002',\n      },\n      {\n        selector: '.tab-btn[data-tab=\"grow-ops\"]',\n        onEnter: clickTab('grow-ops'),\n        title: '\u2464 Grow Ops',\n        body: '\u80B2\u6210\u5834\u6240\u30FBLED\u7167\u660E\u30FB\u7A7A\u8ABF\u6A5F\u5668\u30FB\u9262\u3084\u7528\u571F\u30FB\u80A5\u6599\u30FB\u85AC\u5264\u30FB\u8CFC\u5165\u5143\u306A\u3069\u3092\u3001\u30BF\u30B0\u3067\u8A18\u9332\u30FB\u7BA1\u7406\u3067\u304D\u307E\u3059\u3002\u300C\u4ED6\u306E\u690D\u7269\u304B\u3089\u30B3\u30D4\u30FC\u300D\u3067\u3001\u540C\u3058\u74B0\u5883\u3067\u80B2\u3066\u3066\u3044\u308B\u690D\u7269\u306B\u540C\u3058\u8A2D\u5B9A\u3092\u4F7F\u3044\u56DE\u305B\u307E\u3059\u3002',\n      },\n    ];\n  }\n\n  // \u975E\u4F1A\u54E1\u3082\u95B2\u89A7\u3067\u304D\u308B\u30DA\u30FC\u30B8\u306E\u305F\u3081\u3001\u672A\u30ED\u30B0\u30A4\u30F3\u6642\u3082localStorage\u30D9\u30FC\u30B9\u3067\n  // \u521D\u56DE\u306E\u307F\u81EA\u52D5\u8868\u793A\u3059\u308B(guide-tour.js\u5074\u304C\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B)\n  getSNSGuideTourSteps() {\n    return [\n      {\n        selector: '.sns-feed-header h2',\n        title: 'DISCOVER\uFF08BotaReco SNS\uFF09',\n        body: 'BotaReco\u3067\u8A18\u9332\u3057\u305F\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u304C\u3053\u3053\u306BSNS\u306E\u3088\u3046\u306B\u4E26\u3073\u307E\u3059\u3002\u30ED\u30B0\u30A4\u30F3\u4E0D\u8981\u30FB\u7121\u6599\u3067\u8AB0\u3067\u3082\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002',\n      },\n      {\n        selector: '.sns-feed-tabs',\n        title: '\u2460 \u5168\u4F53 / \u30D5\u30A9\u30ED\u30FC\u4E2D',\n        body: '\u300C\u5168\u4F53\u300D\u3067\u5168\u30E6\u30FC\u30B6\u30FC\u306E\u6295\u7A3F\u3001\u300C\u30D5\u30A9\u30ED\u30FC\u4E2D\u300D\u3067\u6C17\u306B\u306A\u308B\u4EBA\u306E\u6295\u7A3F\u3060\u3051\u3092\u898B\u3089\u308C\u307E\u3059(\u30D5\u30A9\u30ED\u30FC\u306B\u306F\u4F1A\u54E1\u767B\u9332\u304C\u5FC5\u8981\u3067\u3059)\u3002',\n      },\n      {\n        selector: '.sns-sort-tabs',\n        title: '\u2461 \u4E26\u3073\u66FF\u3048',\n        body: 'FEED(\u65B0\u7740)\u30FBPICKUP(\u4EBA\u6C17)\u30FBTREND(\u8A71\u984C)\u3067\u6295\u7A3F\u306E\u4E26\u3073\u9806\u3092\u5207\u308A\u66FF\u3048\u3089\u308C\u307E\u3059\u3002',\n      },\n      {\n        selector: '#sns-posts-container',\n        title: '\u2462 \u6295\u7A3F\u3092\u898B\u308B',\n        body: '\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u306E\u80B2\u6210\u8A18\u9332\u3092\u95B2\u89A7\u3067\u304D\u307E\u3059(\u95B2\u89A7\u306F\u7121\u6599\u30FB\u767B\u9332\u4E0D\u8981)\u3002\u76F8\u8AC7\u8A18\u9332\u304C\u516C\u958B\u3055\u308C\u3066\u3044\u308B\u6295\u7A3F\u3067\u306F\u3001\u305D\u306E\u65B9\u304CBotaReco\u3067\u3069\u306E\u3088\u3046\u306BAI\u306B\u76F8\u8AC7\u3057\u3001\u3069\u3046\u30B1\u30A2\u3057\u3066\u3044\u308B\u304B\u3082\u898B\u3089\u308C\u307E\u3059\u3002\u3044\u3044\u306D\u3084\u30B3\u30E1\u30F3\u30C8\u3001\u30D5\u30A9\u30ED\u30FC\u3092\u3059\u308B\u306B\u306F\u4F1A\u54E1\u767B\u9332(\u7121\u6599)\u304C\u5FC5\u8981\u3067\u3059\u3002',\n      },\n      {\n        selector: '#sns-events-panel-btn',\n        onEnter: function () {\n          var btn = document.getElementById('sns-events-panel-btn');\n          if (btn && !document.getElementById('events-panel')) btn.click();\n        },\n        onExit: function () {\n          var p = document.getElementById('events-panel');\n          if (p) p.remove();\n        },\n        title: '\u2463 \u884C\u304D\u305F\u3044\u30FB\u4FDD\u5B58\u30EA\u30B9\u30C8',\n        body: '\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u3084\u8A18\u4E8B\u30DA\u30FC\u30B8\u306E\u300C\u884C\u304D\u305F\u3044\u300D\u30DC\u30BF\u30F3\u3067\u4FDD\u5B58\u3057\u305F\u3001\u6C17\u306B\u306A\u308B\u30A4\u30D9\u30F3\u30C8\u30FB\u8A18\u4E8B\u304C\u3053\u3053\u306B\u4E00\u89A7\u8868\u793A\u3055\u308C\u307E\u3059\u3002',\n      },\n      {\n        selector: '#sns-notification-panel-btn',\n        onEnter: function () {\n          var btn = document.getElementById('sns-notification-panel-btn');\n          if (btn && !document.getElementById('notification-panel')) btn.click();\n        },\n        onExit: function () {\n          var p = document.getElementById('notification-panel');\n          if (p) p.remove();\n        },\n        title: '\u2464 \u901A\u77E5',\n        body: '\u30D5\u30A9\u30ED\u30FC\u30FB\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u3055\u308C\u305F\u6642\u3084\u3001\u30A4\u30D9\u30F3\u30C8\u95A2\u9023\u306E\u304A\u77E5\u3089\u305B\u304C\u3053\u3053\u306B\u5C4A\u304D\u307E\u3059\u3002',\n      },\n      {\n        selector: '.sns-feed-header',\n        title: '\u2465 \u30A4\u30D9\u30F3\u30C8\u60C5\u5831\u306E\u767B\u9332',\n        body: '\u3054\u81EA\u8EAB\u304C\u958B\u50AC\u3059\u308B\u30EF\u30FC\u30AF\u30B7\u30E7\u30C3\u30D7\u3084\u30A4\u30D9\u30F3\u30C8\u306E\u60C5\u5831\u3082\u767B\u9332\u3067\u304D\u307E\u3059\u3002\u300C\u30A4\u30D9\u30F3\u30C8\u60C5\u5831\u3092\u767B\u9332\u3059\u308B\u300D\u30DA\u30FC\u30B8\u304B\u3089\u7533\u8ACB\u3067\u304D\u307E\u3059\u3002',\n      },\n    ];\n  }\n\n  startSNSGuideTour() {\n    if (!window.GuideTour) return;\n    window.GuideTour.start('sns_feed', this.getSNSGuideTourSteps());\n  }\n\n  maybeAutoStartSNSGuideTour() {\n    if (!window.GuideTour) return;\n    window.GuideTour.isSeen('sns_feed').then((seen) => {\n      if (!seen) this.startSNSGuideTour();\n    });\n  }\n\n  startPlantRecordGuideTour() {\n    if (!window.GuideTour) return;\n    window.GuideTour.start('plant_record_modal', this.getPlantRecordGuideTourSteps());\n  }\n\n  maybeAutoStartPlantRecordGuideTour() {\n    if (!this.isLoggedIn || !window.GuideTour) return;\n    window.GuideTour.isSeen('plant_record_modal').then((seen) => {\n      if (!seen) this.startPlantRecordGuideTour();\n    });\n  }\n\n  init() {\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', () => this.start());\n    } else {\n      this.start();\n    }\n  }\n\nasync start() {\n  // 2026-09-14: \u30D8\u30C3\u30C0\u30FC(botareco-header.liquid)\u306F/pages/botareco\u4EE5\u5916\u306B\u3082\n  // 13\u30DA\u30FC\u30B8\u3067\u8AAD\u307F\u8FBC\u307E\u308C\u3066\u3044\u308B\u304C\u3001initNewHeader()(\u4F1A\u54E1\u30D0\u30C3\u30B8\u30FB\u30E6\u30FC\u30B6\u30FC\u540D\u306E\n  // \u5B9F\u30C7\u30FC\u30BF\u53CD\u6620)\u306F\u3053\u306E\u95A2\u6570\u306E\u5F8C\u65B9\u3067\u3057\u304B\u547C\u3070\u308C\u3066\u304A\u3089\u305A\u3001#leaflabot-root \u304C\n  // \u7121\u3044\u30DA\u30FC\u30B8\u3067\u306F\u4E0B\u306Ereturn\u3067\u6B62\u307E\u3063\u3066\u4E00\u5EA6\u3082\u5B9F\u884C\u3055\u308C\u306A\u304B\u3063\u305F\u3002\u305D\u306E\u7D50\u679C\u3001\n  // \u30B2\u30B9\u30C8/\u7121\u6599\u4F1A\u54E1\u3067\u3082HTML\u306B\u76F4\u66F8\u304D\u3055\u308C\u305F\u521D\u671F\u5024\u300C\u6709\u6599\u4F1A\u54E1\u300D\u304C\u305D\u306E\u307E\u307E\u8868\u793A\n  // \u3055\u308C\u7D9A\u3051\u308B\u4E0D\u5177\u5408\u304C\u3042\u3063\u305F(\u30E6\u30FC\u30B6\u30FC\u6307\u6458)\u3002\u30D8\u30C3\u30C0\u30FC\u66F4\u65B0\u306F\u3069\u306E\u30DA\u30FC\u30B8\u3067\u3082\n  // \u5FC5\u8981\u306A\u306E\u3067\u3001\u30B3\u30F3\u30C6\u30CA\u306E\u6709\u7121\u30C1\u30A7\u30C3\u30AF\u3088\u308A\u524D\u306B\u5FC5\u305A\u5B9F\u884C\u3059\u308B\u3002\n  this.initNewHeader();\n\n  // leaflabot-app\u672C\u4F53(\u76F8\u8AC7\u30D5\u30A9\u30FC\u30E0\u7B49)\u306F\u30DC\u30BF\u30EC\u30B3\u30DA\u30FC\u30B8\u5C02\u7528\u3002\u8A72\u5F53\u30B3\u30F3\u30C6\u30CA\u304C\n  // \u306A\u3044\u30DA\u30FC\u30B8\u3067\u306F\u3053\u3053\u3067\u521D\u671F\u5316\u3092\u7D42\u3048\u308B\n  if (!document.getElementById('leaflabot-root')) return;\n\n  console.log('\uD83D\uDE80\uD83D\uDE80\uD83D\uDE80 START\u95A2\u6570\u5B9F\u884C\u958B\u59CB\uFF08\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\uFF09\uD83D\uDE80\uD83D\uDE80\uD83D\uDE80');\n  console.log('\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7:', new Date().toISOString());\n  console.log('\u30ED\u30B0\u30A4\u30F3\u72B6\u614B:', this.isLoggedIn);\n  console.log('\u30E6\u30FC\u30B6\u30FC\u30E1\u30FC\u30EB:', this.userEmail);\n  console.log('entitlement:', this.entitlement);\n  \n  console.log('LEAFLA\u690D\u7269\u80B2\u6210\u8A18\u9332\u30A2\u30D7\u30EA \u5B8C\u5168\u7D71\u5408\u7248 \u521D\u671F\u5316\u958B\u59CB');\n  \n  this.renderApp();\n  this.attachEventListeners();\n  this.maybeAutoStartGuideTour();\n\n  const membershipType = this.getMembershipType();\n  console.log('start() \u5B9F\u884C\u6642\u306E\u4F1A\u54E1\u7A2E\u5225:', membershipType);\n  \n  if (this.isLoggedIn && membershipType !== 'non_member') {\n    console.log('\u2705 \u7121\u6599/\u6709\u6599\u4F1A\u54E1\u3068\u3057\u3066\u51E6\u7406\u958B\u59CB');\n    \n    // UI\u306F\u5148\u306B\u8868\u793A\n    const container = document.getElementById('threads-list');\n    if (container) {\n      container.innerHTML = '<div class=\"loading\">\u690D\u7269\u8A18\u9332\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>';\n    }\n    \n    // \u30C7\u30FC\u30BF\u53D6\u5F97\uFF08\u975E\u30D6\u30ED\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30EB\u30C9\u30B9\u30BF\u30FC\u30C8\u5BFE\u7B56\u30672\u79D2\u9045\u5EF6\uFF09\n    setTimeout(async () => {\n      try {\n        await this.loadExistingPlantsForSelection();\n        console.log('\uD83C\uDF31 \u690D\u7269\u30C7\u30FC\u30BF\u53D6\u5F97\u5B8C\u4E86:', this.existingPlants.length);\n        if (container && this.existingPlants.length > 0) {\n          this.renderThreadsList(this.existingPlants, membershipType);\n        } else if (container) {\n          this.renderThreadsList([], membershipType);\n        }\n      } catch (error) {\n        console.error('\u274C \u690D\u7269\u30C7\u30FC\u30BF\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n        if (container) {\n          container.innerHTML = `\n            <div class=\"error-message\">\n              <h4>\u690D\u7269\u8A18\u9332\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F</h4>\n              <p>\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u690D\u7269\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002</p>\n              <div class=\"error-details\">\n                <p><strong>\u30A8\u30E9\u30FC:</strong> ${this.escapeHtml((error && error.message) || String(error))}</p>\n              </div>\n              <div class=\"error-actions\">\n                <button onclick=\"window.plantApp.loadUserThreads()\" class=\"btn btn-small btn-secondary\">\u518D\u8AAD\u307F\u8FBC\u307F</button>\n                <a href=\"/pages/contact\" class=\"btn btn-small btn-primary\" target=\"_blank\">\u30B5\u30DD\u30FC\u30C8\u306B\u9023\u7D61</a>\n              </div>\n            </div>\n          `;\n        }\n      }\n    }, 2000);\n    \n    // \u7D71\u8A08\u3068\u30AF\u30AA\u30FC\u30BF\u306F\u5F8C\u304B\u3089\u8AAD\u307F\u8FBC\u3080\uFF08\u975E\u30D6\u30ED\u30C3\u30AD\u30F3\u30B0\uFF09\n    setTimeout(() => {\n      this.loadHeaderStats();\n      this.loadQuotaInfo();\n    }, 100);\n    \n} else if (this.isLoggedIn) {\n  console.log('\u975E\u4F1A\u54E1\u30E6\u30FC\u30B6\u30FC: \u4F53\u9A13\u7248\u3068\u3057\u3066\u52D5\u4F5C');\n  setTimeout(() => this.loadQuotaInfo(), 100);\n}\n\nawait this.syncShopifyPacks();\n// 2026-09-14: initNewHeader()\u306Fstart()\u5192\u982D(\u30B3\u30F3\u30C6\u30CA\u6709\u7121\u30C1\u30A7\u30C3\u30AF\u3088\u308A\u524D)\u306B\n// \u79FB\u52D5\u3057\u305F\u305F\u3081\u3001\u3053\u3053\u3067\u306E\u518D\u547C\u3073\u51FA\u3057\u306F\u524A\u9664(\u4E8C\u91CD\u5B9F\u884C\u9632\u6B62)\u3002\n\n// \u672A\u8AAD\u901A\u77E5\u6570\u3092\u53D6\u5F97\uFF08\u30ED\u30B0\u30A4\u30F3\u6E08\u307F\u4F1A\u54E1\u306E\u307F\uFF09\nif (this.userEmail && !this.userEmail.startsWith('anon_')) {\n  setTimeout(() => this.fetchNotificationCount(), 500);\n}\n\n  // \u2605\u2605\u2605 \u4E00\u756A\u6700\u5F8C\u306B\u8FFD\u52A0 \u2605\u2605\u2605\n  if (window.location.hash === '#sns') {\n    setTimeout(() => {\n      this.openSNSFeed();\n    }, 300);\n  }\n\n}  // \u2190 start() \u30E1\u30BD\u30C3\u30C9\u306E\u7D42\u308F\u308A\n\ngetMembershipType() {\n  if (!this.userEmail) {\n    return 'non_member';\n  }\n\n  // \u7BA1\u7406\u8005\u30E1\u30FC\u30EB\u306F\u5E38\u306B paid_member \u6271\u3044\n  const ADMIN_EMAILS = ['leaflaboratory.com@gmail.com'];\n  if (ADMIN_EMAILS.includes(this.userEmail)) {\n    return 'paid_member';\n  }\n\n  // entitlement \u304C\u3042\u308A\u3001\u6709\u52B9\u306A\u6709\u6599\u30D7\u30E9\u30F3\n  if (this.entitlement) {\n    const validStatuses = ['active', 'grace_period'];\n    if (validStatuses.includes(this.entitlement.status)) {\n      const paidPlans = ['member', 'premium', 'basic-monthly', 'pro-monthly', '1months', '6months', '12months'];\n      if (paidPlans.includes(this.entitlement.plan_code)) {\n        return 'paid_member';\n      }\n    }\n  }\n\n  // \u30ED\u30B0\u30A4\u30F3\u6E08\u307F\u3060\u304C\u6709\u6599\u30D7\u30E9\u30F3\u3067\u306A\u3044 \u2192 \u7121\u6599\u4F1A\u54E1\n  return 'free_member';\n}\n\nasync syncShopifyPacks() {\n  if (!this.userEmail || this.userEmail.startsWith('anon_') || this.userEmail.startsWith('fp_')) {\n    return;\n  }\n\n  // \u540C\u4E00\u30BB\u30C3\u30B7\u30E7\u30F3\u5185\u3067\u5B8C\u4E86\u6E08\u307F\u306A\u3089\u518D\u5B9F\u884C\u3057\u306A\u3044\uFF08\u51AA\u7B49\u6027\u30AC\u30FC\u30C9\uFF09\n  if (this._syncDone) {\n    console.log('[syncShopifyPacks] \u540C\u4E00\u30BB\u30C3\u30B7\u30E7\u30F3\u3067\u540C\u671F\u6E08\u307F \u2014 \u30B9\u30AD\u30C3\u30D7');\n    return;\n  }\n  // \u4E26\u884C\u547C\u3073\u51FA\u3057\u9632\u6B62\n  if (this._syncInProgress) {\n    console.log('[syncShopifyPacks] \u540C\u671F\u51E6\u7406\u304C\u9032\u884C\u4E2D \u2014 \u30B9\u30AD\u30C3\u30D7');\n    return;\n  }\n  this._syncInProgress = true;\n\n  try {\n    var response = await fetch(\n      this.apiBase + '?action=sync_shopify_packs',\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          user_email: this.userEmail\n        })\n      }\n    );\n\n    if (response.ok) {\n      var data = await response.json();\n      console.log('[syncShopifyPacks] \u30EC\u30B9\u30DD\u30F3\u30B9:', JSON.stringify(data));\n      if (data.success && (data.consultation.purchased > 0 || data.illustration.purchased > 0)) {\n        console.log('\u2705 Shopify\u8CFC\u5165\u53CD\u6620:', data);\n        this.loadQuotaInfo(true);  // \u2605 \u5F37\u5236\u518D\u8AAD\u307F\u8FBC\u307F\n      }\n    } else {\n      console.warn('[syncShopifyPacks] HTTP \u30A8\u30E9\u30FC:', response.status);\n    }\n    this._syncDone = true;\n  } catch (error) {\n    console.log('Shopify\u540C\u671F\u30B9\u30AD\u30C3\u30D7:', error);\n  } finally {\n    this._syncInProgress = false;\n  }\n}\ngetAnonymousId() {\n  const storageKey = 'leafla_anonymous_id';\n  let anonymousId = localStorage.getItem(storageKey);\n  if (!anonymousId) {\n    const timestamp = Date.now();\n    const random = Math.random().toString(36).substr(2, 9);\n    anonymousId = `anon_${timestamp}_${random}`;\n    localStorage.setItem(storageKey, anonymousId);\n    console.log('\uD83C\uDD94 \u65B0\u898F\u533F\u540DID\u751F\u6210:', anonymousId);\n  }\n  return anonymousId;\n}\nasync compressImage(file, maxSizeMB = 4, maxDimension = 1920) {\n  if (file.size <= maxSizeMB * 1024 * 1024) return file;\n  const originalMB = (file.size / 1024 / 1024).toFixed(2);\n  return new Promise((resolve) => {\n    const img = new Image();\n    const url = URL.createObjectURL(file);\n    img.onload = () => {\n      URL.revokeObjectURL(url);\n      let { width, height } = img;\n      if (width > maxDimension || height > maxDimension) {\n        if (width > height) { height = Math.round(height * maxDimension / width); width = maxDimension; }\n        else { width = Math.round(width * maxDimension / height); height = maxDimension; }\n      }\n      const canvas = document.createElement('canvas');\n      canvas.width = width; canvas.height = height;\n      canvas.getContext('2d').drawImage(img, 0, 0, width, height);\n      canvas.toBlob((blob) => {\n        const compressed = new File([blob], 'photo.jpg', { type: 'image/jpeg' });\n        console.log(`\uD83D\uDDDC\uFE0F \u753B\u50CF\u5727\u7E2E: ${originalMB}MB \u2192 ${(compressed.size/1024/1024).toFixed(2)}MB`);\n        resolve(compressed);\n      }, 'image/jpeg', 0.85);\n    };\n    img.onerror = () => { URL.revokeObjectURL(url); resolve(file); };\n    img.src = url;\n  });\n}\n\ngetBrowserFingerprint() {\n  try {\n    // Canvas fingerprint\uFF08\u6700\u3082\u6709\u52B9\u306A\u8B58\u5225\u65B9\u6CD5\uFF09\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d');\n    ctx.textBaseline = 'top';\n    ctx.font = '14px Arial';\n    ctx.fillStyle = '#f60';\n    ctx.fillRect(0, 0, 100, 30);\n    ctx.fillStyle = '#069';\n    ctx.fillText('LEAFLA \uD83C\uDF31', 2, 2);\n    const canvasData = canvas.toDataURL();\n    \n    // \u30C7\u30D0\u30A4\u30B9\u60C5\u5831\u3092\u53CE\u96C6\n    const fingerprint = {\n      canvas: canvasData.substring(0, 150),\n      screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      language: navigator.language,\n      platform: navigator.platform,\n      cores: navigator.hardwareConcurrency || 0\n    };\n    \n    // \u30CF\u30C3\u30B7\u30E5\u5316\uFF08\u7C21\u6613\u7248\uFF09\n    const str = JSON.stringify(fingerprint);\n    let hash = 0;\n    for (let i = 0; i < str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash << 5) - hash) + char;\n      hash = hash & hash;\n    }\n    \n    const fp = 'fp_' + Math.abs(hash).toString(36);\n    console.log('\uD83D\uDD0D \u30D6\u30E9\u30A6\u30B6\u30D5\u30A3\u30F3\u30AC\u30FC\u30D7\u30EA\u30F3\u30C8\u751F\u6210:', fp);\n    return fp;\n    \n  } catch (error) {\n    console.error('\u30D5\u30A3\u30F3\u30AC\u30FC\u30D7\u30EA\u30F3\u30C8\u751F\u6210\u30A8\u30E9\u30FC:', error);\n    return null;\n  }\n}\n\n\n// \u2190 \u65E2\u5B58\u306E applyQuotaFromResponse \u3092\u4E38\u3054\u3068\u7F6E\u63DB\u3057\u3066\u304F\u3060\u3055\u3044\napplyQuotaFromResponse(resp) {\n  console.log('quota response\u53D7\u4FE1:', resp);\n  const consultQuota = resp.consultation_quota;\n  const hasQuotaPayload = !!(resp && (\n    'plant_count' in resp ||\n    'consultation_quota' in resp ||\n    'illustration_quota' in resp\n  ));\n  if (!hasQuotaPayload) {\n    console.log('quota\u7CFB\u3067\u306A\u3044\u30EC\u30B9\u30DD\u30F3\u30B9\u306E\u305F\u3081\u30B9\u30AD\u30C3\u30D7');\n    return;\n  }\n\n  const el = document.getElementById('quota-display');\n  if (!el) return;\n\n  const membershipType = this.getMembershipType();\n  let quotaHtml = '';\n  const actualPlantCount = (resp.plant_count != null) ? resp.plant_count : (this.existingPlants?.length ?? 0);\n\n  if (membershipType === 'paid_member') {\n    quotaHtml = `\u6709\u6599\u4F1A\u54E1: \u690D\u7269${actualPlantCount}/50\u500B`;\n\n    // === \u76F8\u8AC7\u30AF\u30AA\u30FC\u30BF\u8868\u793A\uFF08\u30B5\u30FC\u30D0\u30FC\u30C7\u30FC\u30BF\u3092\u4FE1\u983C\uFF09 ===\n    const consultQuota = resp.consultation_quota;  // \u2190 \u2605\u2605\u2605 \u3053\u306E\u884C\u3092\u8FFD\u52A0 \u2605\u2605\u2605\n  \n    if (consultQuota) {\n      console.log('\uD83D\uDD0D \u30B5\u30FC\u30D0\u30FC\u304B\u3089\u53D7\u4FE1\u3057\u305Fconsultation_quota:', consultQuota);\n      \n      const used = consultQuota.used || 0;\n      const baseLimit = consultQuota.base_limit || 150;\n      const packRemaining = consultQuota.pack_remaining || 0;\n      const totalLimit = baseLimit + packRemaining;\n      const totalRemaining = Math.max(0, totalLimit - used);\n      const defaultUsed = Math.min(used, baseLimit);\n      const defaultRemaining = Math.max(0, baseLimit - used);\n\n      const remainingPercent = totalLimit > 0 ? Math.round((totalRemaining / totalLimit) * 100) : 0;\n      const consultClass = remainingPercent < 20 ? 'quota-warning' : remainingPercent < 50 ? 'quota-caution' : 'quota-normal';\n\n      if (packRemaining > 0) {\n        quotaHtml += `<br>\u76F8\u8AC7: <span class=\"${consultClass}\">${used}/${totalLimit}</span> <small>\uFF08\u4ECA\u6708\u6B8B\u308A${totalRemaining}\u56DE\uFF09</small>`;\n        quotaHtml += `<br><small>\u2514 \u30C7\u30D5\u30A9\u30EB\u30C8: ${defaultUsed}/${baseLimit} | \u8FFD\u52A0\u30D1\u30C3\u30AF\u6B8B: ${packRemaining}\u56DE</small>`;\n      } else {\n        quotaHtml += `<br>\u76F8\u8AC7: <span class=\"${consultClass}\">${used}/${baseLimit}</span> <small>\uFF08\u4ECA\u6708\u6B8B\u308A${defaultRemaining}\u56DE\uFF09</small>`;\n      }\n    }\n\n    // === \u30A4\u30E9\u30B9\u30C8\u30AF\u30AA\u30FC\u30BF\u8868\u793A\uFF08\u30B5\u30FC\u30D0\u30FC\u30C7\u30FC\u30BF\u3092\u4FE1\u983C\uFF09 ===\n    const illustQuota = resp.illustration_quota;  // \u2190 boost\u306A\u3057\uFF01\n    if (illustQuota) {\n      const used = illustQuota.used || 0;\n      const baseLimit = illustQuota.base_limit || 20;\n      const packRemaining = illustQuota.pack_remaining || 0;\n      const totalLimit = baseLimit + packRemaining;\n      const totalRemaining = Math.max(0, totalLimit - used);\n      const defaultUsed = Math.min(used, baseLimit);\n      const defaultRemaining = Math.max(0, baseLimit - used);\n\n      const remainingPercent = totalLimit > 0 ? Math.round((totalRemaining / totalLimit) * 100) : 0;\n      const illusClass = remainingPercent < 20 ? 'quota-warning' : remainingPercent < 50 ? 'quota-caution' : 'quota-normal';\n\n      if (packRemaining > 0) {\n        quotaHtml += `<br>\u30A4\u30E9\u30B9\u30C8: <span class=\"${illusClass}\">${used}/${totalLimit}</span> <small>\uFF08\u4ECA\u6708\u6B8B\u308A${totalRemaining}\u56DE\uFF09</small>`;\n        quotaHtml += `<br><small>\u2514 \u30C7\u30D5\u30A9\u30EB\u30C8: ${defaultUsed}/${baseLimit} | \u8FFD\u52A0\u30D1\u30C3\u30AF\u6B8B: ${packRemaining}\u56DE</small>`;\n      } else {\n        quotaHtml += `<br>\u30A4\u30E9\u30B9\u30C8: <span class=\"${illusClass}\">${used}/${baseLimit}</span> <small>\uFF08\u4ECA\u6708\u6B8B\u308A${defaultRemaining}\u56DE\uFF09</small>`;\n      }\n    }\n\n  } else if (membershipType === 'free_member') {\n    const upgradeLink = actualPlantCount >= 15 ? \n      '<br><small><a href=\"/pages/botanical-record#plans\" style=\"color: #7c3aed;\">\u6709\u6599\u30D7\u30E9\u30F3\u306750\u500B\u307E\u3067\u62E1\u5F35 \u2192</a></small>' : '';\n\n    quotaHtml = `\u7121\u6599\u4F1A\u54E1: \u690D\u7269${actualPlantCount}/20\u500B${upgradeLink}<br><small>\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A</small>`;\n  } else {\n    quotaHtml = `<span>\u4F53\u9A13\u7248: \u5236\u9650\u3042\u308A | <a href=\"/account/register?return_url=${encodeURIComponent(window.location.pathname + window.location.search)}\" style=\"color: #059669; text-decoration: underline;\">\u7121\u6599\u767B\u9332\u3067\u8A18\u9332\u4FDD\u5B58</a></span>`;\n  }\n\n  el.innerHTML = quotaHtml;\n  console.log('\u2705 quota\u8868\u793A\u66F4\u65B0\u5B8C\u4E86:', quotaHtml);\n}\n\n\n\n  getCurrentSeasonInfo() {\n    const now = new Date();\n    const month = now.getMonth() + 1;\n    \n    let season, seasonName, seasonEmoji;\n    \n    if (month >= 3 && month <= 5) {\n      season = 'spring';\n      seasonName = '\u6625';\n      seasonEmoji = '\uD83C\uDF38';\n    } else if (month >= 6 && month <= 8) {\n      season = 'summer';\n      seasonName = '\u590F';\n      seasonEmoji = '\u2600\uFE0F';\n    } else if (month >= 9 && month <= 11) {\n      season = 'autumn';\n      seasonName = '\u79CB';\n      seasonEmoji = '\uD83C\uDF42';\n    } else {\n      season = 'winter';\n      seasonName = '\u51AC';\n      seasonEmoji = '\u2744\uFE0F';\n    }\n    \n    return {\n      season,\n      seasonName,\n      seasonEmoji,\n      displayText: `${seasonEmoji} ${seasonName}`,\n      month,\n      careMultipliers: this.getSeasonalCareMultipliers(season)\n    };\n  }\n\n  getSeasonalCareMultipliers(season) {\n    const multipliers = {\n      spring: { watering: 0.8, fertilizing: 0.7, repotting: 0.9, pruning: 0.8, pest_control: 0.9 },\n      summer: { watering: 0.6, fertilizing: 0.8, repotting: 1.5, pruning: 1.2, pest_control: 0.7 },\n      autumn: { watering: 1.0, fertilizing: 1.0, repotting: 0.8, pruning: 0.9, pest_control: 1.0 },\n      winter: { watering: 1.5, fertilizing: 2.0, repotting: 2.0, pruning: 1.5, pest_control: 1.3 }\n    };\n    \n    return multipliers[season] || multipliers.autumn;\n  }\n\n  getSeasonalCareInterval(careType, season = null) {\n    const currentSeason = season || this.seasonInfo.season;\n    const careConfig = this.careTypes[careType];\n    if (!careConfig) return 30;\n    \n    const baseInterval = careConfig.base_interval_days;\n    const multiplier = careConfig.seasonal_multipliers[currentSeason] || 1.0;\n    return Math.round(baseInterval * multiplier);\n  }\n// --- \u8FFD\u52A0: \u65E5\u672C\u8A9E\u30FB\u82F1\u8A9E\u6DF7\u5728\u6587\u306E\u8EFD\u91CF\u6B63\u898F\u5316 ---\nnormalizeJP(text = '') {\n  return (text || '')\n    .toLowerCase()\n    .replace(/[\uFF08\uFF09]/g,'(')               // \u5168\u89D2\u30AB\u30C3\u30B3\u2192\u534A\u89D2\n    .replace(/[\uFF0D\u2015\u30FC\uFF70]/g,'-')             // \u9577\u97F3\u30FB\u30C0\u30C3\u30B7\u30E5\u7D71\u4E00\n    .replace(/[\u30FB\uFF65]/g,' ')                 // \u4E2D\u70B9\u30C8\u30EA\u30E0\n    .replace(/\\s+/g,' ')\n    .trim();\n}\n\n// --- \u8FFD\u52A0: \u690D\u7269\u30BF\u30A4\u30D7\u63A8\u5B9A\uFF08\u5E45\u5E83\u3081\uFF09 ---\nidentifyPlantType(plantName = '') {\n  const name = this.normalizeJP(plantName);\n  if (/(\u30D3\u30AB\u30AF|\u30D3\u30D5\u30EB\u30AB\u30C4\u30E0|\u30EA\u30C9\u30EC\u30A4|staghorn)/.test(name)) return 'staghorn_fern';\n  if (/(\u591A\u8089|\u30A2\u30AC\u30D9|\u30CF\u30AA\u30EB\u30C1\u30A2|\u30A8\u30B1\u30D9\u30EA\u30A2|\u30B5\u30DC\u30C6\u30F3|\u67F1|\u70CF\u7FBD\u7389|\u30ED\u30D5\u30A9|\u30A2\u30B9\u30C8\u30ED)/.test(name)) return 'succulent_cacti';\n  if (/(\u584A\u6839|\u30B3\u30FC\u30C7\u30C3\u30AF\u30B9|\u30A2\u30C7\u30CB\u30A6\u30E0|\u30D1\u30AD\u30DD|\u30AA\u30C8\u30F3\u30CA|\u4E80\u7532\u7ADC)/.test(name)) return 'caudex';\n  if (/(\u30B7\u30C0|fern|\u30D7\u30C6\u30EA\u30B9|\u30CD\u30D5\u30ED|\u30A2\u30B8\u30A2\u30F3\u30BF\u30E0)/.test(name)) return 'fern';\n  if (/(\u30DD\u30C8\u30B9|\u30E2\u30F3\u30B9\u30C6\u30E9|\u30D5\u30A3\u30ED\u30C7\u30F3\u30C9\u30ED\u30F3|\u30A2\u30F3\u30B9\u30EA\u30A6\u30E0|\u30C9\u30E9\u30BB\u30CA|\u89B3\u8449)/.test(name)) return 'foliage';\n  if (/(\u862D|\u30E9\u30F3|phalaenopsis|\u30BB\u30C3\u30B3\u30AF|\u30AA\u30F3\u30B7|\u30AB\u30C8\u30EC\u30A2)/.test(name)) return 'orchid';\n  if (/(\u30C8\u30DE\u30C8|\u30C8\u30A6\u30AC\u30E9\u30B7|\u30EC\u30BF\u30B9|\u30D0\u30B8\u30EB|\u30CF\u30FC\u30D6|\u5BB6\u5EAD\u83DC\u5712|\u91CE\u83DC|\u679C\u6A39|\u67D1\u6A58)/.test(name)) return 'edible';\n  if (/(\u30C9\u30E9\u30A4\u30D5\u30E9\u30EF\u30FC|\u751F\u82B1|\u5207\u308A\u82B1|bouquet|wreath)/.test(name)) return 'cut_or_dry';\n  return 'general';\n}\n// \u2605\u8FFD\u52A0\uFF1A\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u5F37\u5236\u30B7\u30FC\u30F3\u3092\u62BD\u51FA\uFF08\u5168\u30B7\u30FC\u30F3\u5BFE\u5FDC\uFF09\ngetForcedSceneFromText(text = '') {\n  const t = (text || '').toLowerCase();\n  const map = [\n    { re: /\u5B50\u682A|\u4ED4\u682A|\u30AB\u30AD\u5B50|pup|offset|sucker/, scene: 'pup_separation' },\n    { re: /\u682A\u5206\u3051|division/,                      scene: 'division' },\n    { re: /\u690D\u3048\u66FF\u3048|\u9262\u66FF\u3048|\u9262\u5897\u3057|\u7528\u571F|\u6839\u9262/,      scene: 'repotting' },\n    { re: /\u8170\u6C34|bottom[\\s-]*water/,                scene: 'bottom_watering' },\n    { re: /\u6C34\u3084\u308A|\u6F45\u6C34|\u7D66\u6C34|watering/,             scene: 'watering' },\n    { re: /\u5BB3\u866B|\u30AB\u30A4\u30AC\u30E9\u30E0\u30B7|\u30CF\u30C0\u30CB|\u85AC\u5264|\u6BBA\u866B/,      scene: 'pest_control' },\n    { re: /\u633F\u3057\u6728|\u633F\u3057\u82BD|\u80F4\u5207\u308A|cutting|graft/,     scene: 'cutting' },\n    { re: /\u53D6\u308A\u6728|\u30A8\u30A2\u30EC\u30A4\u30E4/,                     scene: 'air_layering' },\n    { re: /\u677F\u4ED8|\u7740\u751F|mount/,                       scene: 'mounting' },\n    { re: /\u652F\u67F1|\u8A98\u5F15|\u6574\u679D|stake|training/,          scene: 'staking_training' },\n    { re: /\u8449\u6C34|misting|\u9727\u5439\u304D/,                    scene: 'misting' }\n  ];\n  const hit = map.find(m => m.re.test(t));\n  return hit ? hit.scene : null;\n}\n\n// --- \u8FFD\u52A0: \u30B7\u30FC\u30F3\u5206\u985E\uFF08\u65B9\u5411\u6027\u3092\u78BA\u5B9A\uFF09 ---\nclassifyScene({ plantName='', consultationRequest='', notes='', aiResponse='' }) {\n  const t = this.normalizeJP(`${plantName} ${consultationRequest} ${notes} ${aiResponse}`);\n\n  const KW = {\n    mounting: /(\u677F\u4ED8|\u677F\u4ED8\u3051|\u7740\u751F|\u30DC\u30FC\u30C9|\u7740\u751F\u677F|mount(ing)?)/,\n    watering: /(\u6C34\u3084\u308A|\u6F45\u6C34|\u8170\u6C34|bottom\\s*water|\u9727\u5439\u304D|\u8449\u6C34)/,\n    repotting: /(\u690D\u3048\u66FF\u3048|\u9262\u5897\u3057|\u7528\u571F|\u571F\u66FF\u3048|\u9262\u66FF\u3048|\u6839\u9262|\u9262\u4E0A\u3052|\u9262\u4E0B\u308D\u3057)/,\n    division: /(\u682A\u5206\u3051|\u5206\u3051|\u5206\u682A|division)/,\n    pup: /(\u5B50\u682A|\u4ED4\u682A|\u30AB\u30AD\u5B50|\u30AA\u30D5\u30BB\u30C3\u30C8|pup|offset|sucker)/,\n    cutting: /(\u633F\u3057\u6728|\u633F\u3057\u82BD|\u80F4\u5207\u308A|\u63A5\u304E\u6728|cutting|graft)/,\n    air_layer: /(\u53D6\u308A\u6728|\u30A8\u30A2\u30EC\u30A4\u30E4\u30EA\u30F3\u30B0|air[\\s-]*layer)/,\n    pest: /(\u5BB3\u866B|\u30AB\u30A4\u30AC\u30E9\u30E0\u30B7|\u30CF\u30C0\u30CB|\u30B3\u30CA\u30B8\u30E9\u30DF|\u30A2\u30D6\u30E9\u30E0\u30B7|\u85AC\u5264|\u6BBA\u866B|\u30D9\u30CB\u30AB|\u30AA\u30EB\u30C8\u30E9\u30F3)/,\n    staking: /(\u652F\u67F1|\u8A98\u5F15|\u6574\u679D|tie|stake|training)/,\n    misting: /(\u8449\u6C34|misting|spray)/,\n    bottom_watering: /(\u8170\u6C34|bottom[\\s-]*water)/,\n    diagnosis_only: /(\u539F\u56E0|\u75C7\u72B6|\u5927\u4E08\u592B|\u5FC3\u914D|\u8A3A\u65AD|\u72B6\u614B|\u67AF|\u9ED2\u70B9|\u6591\u70B9|\u75C5\u6C17|\u5BFE\u51E6|\u306A\u305C)/\n  };\n\n  const scores = {\n    mounting: +KW.mounting.test(t),\n    watering: +KW.watering.test(t),\n    repotting: +KW.repotting.test(t),\n    division: +KW.division.test(t),\n    pup: +KW.pup.test(t) * 2, // \u300C\u5B50\u682A\u300D\u306F\u6700\u512A\u5148\n    cutting: +KW.cutting.test(t),\n    air_layer: +KW.air_layer.test(t),\n    pest: +KW.pest.test(t),\n    staking: +KW.staking.test(t),\n    misting: +KW.misting.test(t),\n    bottom_watering: +KW.bottom_watering.test(t)\n  };\n\n  if (scores.pup) scores.division += 1; // \u5B50\u682A\u2192\u5206\u96E2/\u682A\u5206\u3051\u3068\u89AA\u548C\n\n  const entries = Object.entries(scores).sort((a,b)=>b[1]-a[1]);\n  const [topScene, topScore] = entries[0] || ['general_care', 0];\n\n  const diagnosisOnly = KW.diagnosis_only.test(t) && topScore === 0;\n\n  const confidence = Math.min(1, topScore / 2);\n\n  const map = {\n    mounting: 'mounting',\n    watering: 'watering',\n    repotting: 'repotting',\n    division: 'division',\n    pup: 'pup_separation',\n    cutting: 'cutting',\n    air_layer: 'air_layering',\n    pest: 'pest_control',\n    staking: 'staking_training',\n    misting: 'misting',\n    bottom_watering: 'bottom_watering'\n  };\n\n  return {\n    scene: topScore > 0 ? (map[topScene] || 'general_care') : 'general_care',\n    confidence,\n    diagnosisOnly,\n    plantType: this.identifyPlantType(plantName)\n  };\n}\n\nshouldGenerateIllustration(consultationRequest, notes, plantType, aiResponse) {\n  if (this.getMembershipType() !== 'paid_member') return false;\n  if (!window.LEAFLA?.features?.text_free_illustration) return false;\n  if (!aiResponse || aiResponse.length < 10) return false;\n\n  const ar = (aiResponse || '').toLowerCase();\n  if (\n    plantType === 'non_plant' ||\n    /\u690D\u7269\u306E\u540D\u524D\u3067\u306F\u306A\u3044|\u975E\u690D\u7269|not\\s+a\\s+plant|no\\s+plant/.test(ar)\n  ) return false;\n\n  // \u5F37\u5236\u30B7\u30FC\u30F3\u304C\u62FE\u3048\u305F\u3089\u512A\u5148\u8A31\u53EF\nconst forced = this.getForcedSceneFromText(`${consultationRequest} ${notes}`);\nif (forced) return true;\n\n  const { confidence, diagnosisOnly } = this.classifyScene({\n    plantName: document.getElementById('plant-name')?.value || '',\n    consultationRequest, notes, aiResponse\n  });\n  if (diagnosisOnly) return false;\n\n  return confidence >= 0.3;\n}\n\n\n/*\nasync generateTextFreeIllustration({ plantName, scene, plantType, apiKey }) {\n  try {\n    const toolsByScene = {\n      mounting: 'wooden board, sphagnum moss, twine/string, scissors',\n      watering: 'watering can, drip technique, moisture check',\n      repotting: 'pot, soil, scoop, gloves, tapping pot',\n      division: 'knife, clean cut, root tease, separate clumps',\n      pup_separation: 'sterile knife, separate pup from parent, healing time',\n      cutting: 'pruners, node cut, rooting medium',\n      air_layering: 'sphagnum moss, wrap, tie, cut after rooting',\n      pest_control: 'spray bottle, soft brush, wipe leaves',\n      staking_training: 'stake, soft tie, gentle support',\n      misting: 'fine mist sprayer, leaf-only spray',\n      bottom_watering: 'tray of water, capillary action',\n      general_care: 'hands, simple tools'\n    };\n\n    const sceneKey = toolsByScene[scene] ? scene : 'general_care';\n    const palette = 'sage green, warm browns, soft whites';\n\nconst prompt = `\n\u3053\u306E\u5199\u771F\u306E\u30A2\u30AC\u30D9\uFF08${plantName}\uFF09\u306E\u5B50\u682A\u5206\u96E2\u65B9\u6CD5\u3092\u6559\u80B2\u7684\u30A4\u30E9\u30B9\u30C8\u3067\u8868\u73FE\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\n\u690D\u7269\u306E\u7279\u5FB4:\n- \u539A\u3044\u4E09\u89D2\u5F62\u306E\u8449\u304C\u653E\u5C04\u72B6\u306B\u914D\u7F6E\u3055\u308C\u305F\u30ED\u30BC\u30C3\u30C8\n- \u8449\u306E\u7E01\u3068\u5148\u7AEF\u306B\u92ED\u3044\u68D8\n- \u9752\u7DD1\u8272\u3067\u7C89\u3092\u5439\u3044\u305F\u3088\u3046\u306A\u8CEA\u611F\n- \u57FA\u90E8\u304B\u3089\u5C0F\u3055\u306A\u5B50\u682A\u304C\u767A\u751F\n\n\u30A4\u30E9\u30B9\u30C8\u5185\u5BB9:\n- \u3057\u3063\u304B\u308A\u3068\u6839\u51FA\u3057\u3066\u3044\u308B\u5B50\u682A\n- \u6E05\u6F54\u306A\u30CA\u30A4\u30D5\u3067\u306E\u5207\u308A\u96E2\u3057\u624B\u9806\n- \u5207\u308A\u96E2\u3057\u305F\u5B50\u682A\u306E\u69D8\u5B50\n- \u65B0\u3057\u3044\u9262\u3078\u306E\u690D\u3048\u4ED8\u3051\n\n\u30B9\u30BF\u30A4\u30EB: \u65E5\u672C\u306E\u5712\u82B8\u66F8\u98A8\u306E\u6559\u80B2\u7684\u30A4\u30E9\u30B9\u30C8\n\u8272\u8ABF: \u81EA\u7136\u306A\u7DD1\u8272\u3001\u6E29\u304B\u3044\u8336\u8272\u306E\u571F\u3001\u6E05\u6F54\u611F\n\u6587\u5B57\u306F\u4E00\u5207\u542B\u3081\u306A\u3044\n`;\n\nconst payload = {\n  contents: [{ parts: [{ text: prompt }]}],\n  generationConfig: {\n    responseModalities: [\"IMAGE\"],\n    temperature: 1.0,\n    topK: 40,\n    topP: 0.95,\n    maxOutputTokens: 8192\n  }\n};\n\n    const res = await fetch(\n      'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image-preview:generateContent',\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'x-goog-api-key': apiKey },\n        body: JSON.stringify(payload)\n      }\n    );\n    if (!res.ok) return null;\n\n    const data = await res.json();\n    const parts = data?.candidates?.[0]?.content?.parts || [];\n    const b64 = parts.find(p => p?.inline_data?.data)?.inline_data?.data\n             || parts.find(p => p?.inlineData?.data)?.inlineData?.data\n             || null;\n    if (!b64) return null;\n    return { imageData: b64, sceneType: sceneKey };\n  } catch (e) {\n    console.error('\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u30A8\u30E9\u30FC:', e);\n    return null;\n  }\n}\n*/\n\n// \u65E2\u5B58\u306E\u95A2\u6570\u3092\u4EE5\u4E0B\u3067\u7F6E\u304D\u63DB\u3048\n// === BEGIN PATCH: requestServerIllustrationPatch (\u5B8C\u5168\u7F6E\u63DB) ===\nasync requestServerIllustrationPatch({\n  plantName,\n  scene,\n  plantType,\n  postId = null,\n  threadId = null,\n  aiResponse = '',\n  consultationRequest = '',\n  notes = ''\n}) {\n  // generate_illustration \u306F\u7121\u52B9\u5316\uFF08\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u672A\u5B9F\u88C5/\u4E0D\u8981\uFF09\n  return null;\n}\n\n// === illustration disabled\u201D ===\n\n\n  generateSecureUserId(userEmail) {\n    if (!userEmail) return 'anonymous';\n    const encoder = new TextEncoder();\n    const data = encoder.encode(userEmail + 'LEAFLA_SALT_2024');\n    let hash = 0;\n    for(let i = 0; i < data.length; i++){\n      const char = data[i];\n      hash = (hash << 5) - hash + char;\n      hash = hash & hash;\n    }\n    return Math.abs(hash).toString(36).substring(0, 8);\n  }\n\n  renderApp() {\n    const container = document.getElementById('leaflabot-root');\n    if (!container) {\n      console.error('leaflabot-root container not found');\n      return;\n    }\n\n    container.innerHTML = `\n      <div class=\"plant-consultation-container\">\n        ${this.renderHeader()}\n        ${this.renderMainContent()}\n      </div>\n    `;\n  }\n\nrenderHeader() {\n  if (!this.isLoggedIn) {\n    return `<div class=\"br-guest-hero\">\n  <div class=\"br-guest-hero-card\">\n    <div class=\"br-guest-hero-illu\">\n      <img src=\"https://cdn.shopify.com/s/files/1/0658/5332/5495/files/il1.png?v=1765080460\" alt=\"\u690D\u7269\u30B1\u30A2\u306E\u30A4\u30E1\u30FC\u30B8\">\n    </div>\n    <div class=\"br-guest-hero-body\">\n      <h2 class=\"br-guest-hero-title\">\u690D\u7269\u80B2\u6210\u8A18\u9332\u30FB\u76F8\u8AC7\u30B5\u30FC\u30D3\u30B9</h2>\n      <p class=\"br-guest-hero-copy\">\u690D\u7269\u306E\u6210\u9577\u3092\u8A18\u9332\u3057\u3001AI\u304C\u30B1\u30A2\u72B6\u614B\u3092\u89E3\u6790\u3057\u307E\u3059\u3002</p>\n      <p class=\"br-guest-hero-copy\">\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u3068\u3001\u80B2\u6210\u8A18\u9332\u306E\u4FDD\u5B58\u3084\u30B1\u30A2\u76F8\u8AC7\u304C\u5229\u7528\u3067\u304D\u307E\u3059\u3002</p>\n      <div class=\"br-guest-hero-cta\">\n        <a href=\"/customer_authentication/login?return_to=${encodeURIComponent(window.location.pathname + window.location.search || '/pages/botareco')}\" class=\"br-guest-btn primary\">\u30ED\u30B0\u30A4\u30F3</a>\n        <a href=\"/customer_authentication/login?return_to=${encodeURIComponent(window.location.pathname + window.location.search || '/pages/botareco')}\" class=\"br-guest-btn secondary\">\u65B0\u898F\u4F1A\u54E1\u767B\u9332</a>\n     </div>\n    </div>\n  </div>\n</div>`;\n  }\n\n  const membershipType = this.getMembershipType();\n  const membershipLabels = {\n    non_member: '\u975E\u4F1A\u54E1',\n    free_member: '\u7121\u6599\u4F1A\u54E1', \n    paid_member: '\u6709\u6599\u4F1A\u54E1'\n  };\n\n  return `<div class=\"app-header\">\n      <h2>BotaReco\uFF08\u30DC\u30BF\u30EC\u30B3\uFF09<br>\u690D\u7269\u7BA1\u7406\u30AB\u30EC\u30F3\u30C0\u30FC\u3068\u80B2\u6210\u30FB\u683D\u57F9\u8A18\u9332\u30A2\u30D7\u30EA</h2>\n\n      ${this.renderHeaderStats(membershipType)}\n      \n      <div class=\"user-info\">\n        <span>\u3088\u3046\u3053\u305D\u3001${window.LEAFLA?.customer?.first_name || '\u304A\u5BA2\u69D8'}\u3055\u3093</span>\n        <div class=\"membership-info\">\n          <span class=\"plan-badge plan-${membershipType}\">${membershipLabels[membershipType]}</span>\n          ${membershipType !== 'paid_member' ? '<a href=\"/pages/botanical-record#plans\" style=\"margin-left: 10px; font-size: 12px; color: #2563eb;\">\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9</a>' : ''}\n        </div>\n        <div class=\"season-info\">\n          <span class=\"season-badge\">${this.seasonInfo.displayText}</span>\n        </div>\n        <div class=\"quota-info\" id=\"quota-display\">\n          <span class=\"muted\">\u5229\u7528\u72B6\u6CC1: \u4E0D\u660E\uFF08\u81EA\u52D5\u53D6\u5F97\u3057\u307E\u305B\u3093\uFF09</span>\n        </div>\n      </div>\n    </div>`;\n}\nrenderHeaderStats(membershipType) {\n  if (membershipType === 'non_member') return '';\n  \n  return `\n    <div class=\"header-stats\">\n      <div class=\"stat-item\">\n        <span class=\"stat-icon\">\uD83D\uDCDD</span>\n        <span class=\"stat-value\" id=\"total-records\">-</span>\n        <span class=\"stat-label\">\u80B2\u6210\u8A18\u9332</span>\n      </div>\n      <div class=\"stat-item\">\n        <span class=\"stat-icon\">\uD83D\uDC65</span>\n        <span class=\"stat-value\" id=\"consultation-count\">-</span>\n        <span class=\"stat-label\">\u76F8\u8AC7\u690D\u7269</span>\n      </div>\n      <div class=\"stat-item\">\n        <span class=\"stat-icon\">\uD83D\uDCC8</span>\n        <span class=\"stat-value\" id=\"growth-period\">-</span>\n        <span class=\"stat-label\">\u8A18\u9332\u671F\u9593</span>\n      </div>\n      ${membershipType === 'paid_member' ? `\n        <div class=\"stat-item care-alerts-stat\" id=\"care-alerts-stat\" onclick=\"window.plantApp.showTodaysCareList()\">\n          <span class=\"stat-icon\">\uD83D\uDD14</span>\n          <span class=\"stat-value\" id=\"todays-care-count\">-</span>\n          <span class=\"stat-label\">\u4ECA\u65E5\u306E\u30B1\u30A2</span>\n        </div>\n      ` : `\n        <div class=\"stat-item\">\n          <span class=\"stat-icon\">\uD83D\uDCCB</span>\n          <span class=\"stat-value\" id=\"care-guide-count\">6</span>\n          <span class=\"stat-label\">\u30B1\u30A2\u30AC\u30A4\u30C9</span>\n        </div>\n      `}\n    </div>\n  `;\n}\ngetCommonPayload(extra = {}) {\n  return {\n    user_email: this.userEmail,\n    entitlement: this.entitlement,\n    entitlement_snapshot: this.entitlementSnapshot,\n    ...extra\n  };\n}\nasync loadHeaderStats() {\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') return;\n\n  try {\n    const response = await fetch(`${this.apiBase}?action=header_stats`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n    if (data.success && data.stats) {\n      this.updateHeaderStatsDisplay(data.stats);\n    } else {\n      console.warn('\u26A0\uFE0F \u7D71\u8A08\u30C7\u30FC\u30BF\u53D6\u5F97\u5931\u6557:', data.error || 'unknown');\n      this.updateHeaderStatsDisplay(null);\n    }\n  } catch (error) {\n    console.error('\u274C \u30D8\u30C3\u30C0\u30FC\u7D71\u8A08\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    this.updateHeaderStatsDisplay(null);\n  }\n}\n\n\nupdateHeaderStatsDisplay(stats) {\n  if (!stats) {\n    console.warn('\u26A0\uFE0F \u7D71\u8A08\u30C7\u30FC\u30BF\u304C\u7A7A - \u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u3092\u4F7F\u7528');\n    stats = {\n      total_records: 0,\n      consultation_count: 0,\n      growth_period_days: 0,\n      todays_care_count: 0\n    };\n  }\n  \n  console.log('\u7D71\u8A08\u30C7\u30FC\u30BF\u66F4\u65B0:', stats);\n  \n  const totalRecordsEl = document.getElementById('total-records');\n  if (totalRecordsEl) {\n    totalRecordsEl.textContent = stats.total_records || 0;\n  }\n  \n  const consultationCountEl = document.getElementById('consultation-count');\n  if (consultationCountEl) {\n    consultationCountEl.textContent = stats.consultation_count || 0;\n  }\n  \n  const periodElement = document.getElementById('growth-period');\n  if (periodElement) {\n    const days = stats.growth_period_days || 0;\n    periodElement.textContent = days > 0 ? `${days}\u65E5` : '-';\n  }\n\n  const careElement = document.getElementById('todays-care-count');\n  if (careElement) {\n    careElement.textContent = stats.todays_care_count || 0;\n    careElement.parentElement?.classList.toggle('has-alerts', stats.todays_care_count > 0);\n  }\n\n  // \u30D8\u30C3\u30C0\u30FC\u30DD\u30C3\u30D7\u30AA\u30FC\u30D0\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u8981\u7D20\u3082\u76F4\u63A5\u66F4\u65B0\n  const brTotal = document.getElementById('brTotalRecords');\n  if (brTotal) brTotal.textContent = stats.total_records || 0;\n  const brConsult = document.getElementById('brConsultations');\n  if (brConsult) brConsult.textContent = stats.consultation_count || 0;\n  const brPeriod = document.getElementById('brPeriod');\n  if (brPeriod) {\n    const days = stats.growth_period_days || 0;\n    brPeriod.textContent = days > 0 ? `${days}\u65E5` : '\u2014';\n  }\n  const brCare = document.getElementById('brTodayCare');\n  if (brCare) brCare.textContent = stats.todays_care_count || 0;\n}\n\nasync showTodaysCareList() {\n  if (this.getMembershipType() !== 'paid_member') {\n    console.warn('showTodaysCareList: paid_member \u3067\u306F\u306A\u3044\u305F\u3081\u30B9\u30AD\u30C3\u30D7', {\n      userEmail: this.userEmail,\n      entitlement: this.entitlement\n    });\n    return;\n  }\n\n  try {\n    console.log('\uD83D\uDD0D \u4ECA\u65E5\u306E\u30B1\u30A2\u53D6\u5F97\u958B\u59CB');\n\n    const response = await fetch(`${this.apiBase}?action=todays_care_list`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    const data = await response.json();\n    console.log('\uD83D\uDD0D API\u30EC\u30B9\u30DD\u30F3\u30B9:', data);\n\n    this.renderTodaysCareModal(data.care_items || []);\n  } catch (error) {\n    console.error('\u274C \u4ECA\u65E5\u306E\u30B1\u30A2\u4E00\u89A7\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification('\u4ECA\u65E5\u306E\u30B1\u30A2\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n  }\n}\n\nrenderTodaysCareModal(careItems) {\n  this.closeAllModals();\n  \n  const modalHtml = `\n    <div id=\"todays-care-modal\" class=\"modal-overlay\" onclick=\"window.plantApp.closeAllModals()\">\n      <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-header\">\n          <h3>\u4ECA\u65E5\u306E\u30B1\u30A2\u5BFE\u8C61</h3>\n          <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\" type=\"button\">\u00D7</button>\n        </div>\n        <div class=\"modal-body\">\n          ${careItems.length > 0 ? `\n            <div class=\"care-items-list\">\n              ${careItems.map(item => `\n                <div class=\"care-item\">\n                  <input type=\"checkbox\" id=\"care-${item.id}\" \n                         onchange=\"window.plantApp.toggleCareComplete('${item.thread_id}', '${item.care_type}')\">\n                  <label for=\"care-${item.id}\">\n                    <span class=\"care-icon\">${item.care_icon}</span>\n                    <span class=\"plant-name\">${item.plant_name}</span>\n                    <span class=\"care-name\">${item.care_name}</span>\n                    <span class=\"days-overdue\">${item.days_overdue}\u65E5\u7D4C\u904E</span>\n                  </label>\n                </div>\n              `).join('')}\n            </div>\n          ` : `\n            <div class=\"no-care-today\">\n              <p>\u4ECA\u65E5\u306E\u30B1\u30A2\u5BFE\u8C61\u306F\u3042\u308A\u307E\u305B\u3093</p>\n              <p>\u7D20\u6674\u3089\u3057\u3044\u7BA1\u7406\u304C\u3067\u304D\u3066\u3044\u307E\u3059\uFF01</p>\n            </div>\n          `}\n        </div>\n      </div>\n    </div>\n  `;\n  \n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n}\n\n\nasync toggleCareComplete(threadId, careType) {\n  try {\n    const today = new Date().toISOString().split('T')[0];\n    \n    const response = await fetch(`${this.apiBase}?action=save_care_record`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n        thread_id: threadId,\n        care_type: careType,\n        care_date: today,\n        notes: '\u30B1\u30A2\u901A\u77E5\u304B\u3089\u5B8C\u4E86\u30DE\u30FC\u30AF',\n        auto_detected: true\n      })\n    });\n\n    const result = await response.json();\n    \n    if (result.success) {\n      const careInfo = this.careTypes[careType] || this.careTypes.other;\n      this.showTemporaryNotification(`${careInfo.name}\u306E\u30B1\u30A2\u8A18\u9332\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F`, 'success');\n      \n      // \u7D71\u8A08\u3092\u66F4\u65B0\uFF08\u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\u524D\u306B\uFF09\n      await this.loadHeaderStats();\n      \n      // \u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n      this.closeAllModals();\n      \n    } else {\n      throw new Error(result.error);\n    }\n\n  } catch (error) {\n    console.error('\u30B1\u30A2\u5B8C\u4E86\u30DE\u30FC\u30AF\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(`\u30B1\u30A2\u8A18\u9332\u306E\u4FDD\u5B58\u306B\u5931\u6557: ${error.message}`, 'error');\n  }\n}\n\n  renderMainContent() {\n    if (!this.isLoggedIn) {\n      return `<div class=\"main-content\">\n          <div class=\"consultation-form-section\">\n            <div class=\"br-section-label\">TRIAL</div>\n            <h3 class=\"br-section-title\">\u690D\u7269\u76F8\u8AC7\u3092\u4F53\u9A13\u3057\u3066\u307F\u308B</h3>\n            <div class=\"br-trial-notice\">\n              <div class=\"br-trial-notice__head\">\n                <span class=\"br-trial-notice__tag\">\u4F53\u9A13\u7248\uFF08\u975E\u4F1A\u54E1\uFF09</span>\n              </div>\n              <ul class=\"br-trial-notice__list\">\n                <li>AI\u690D\u7269\u76F8\u8AC7\uFF08\u57FA\u672C\u6A5F\u80FD\uFF09</li>\n                <li>\u8A18\u9332\u4FDD\u5B58\u306A\u3057</li>\n                <li>\u753B\u50CF\u751F\u6210\u306A\u3057</li>\n                <li>\u30B1\u30A2\u8A18\u9332\u306A\u3057</li>\n              </ul>\n              <p class=\"br-trial-notice__cta-note\">\n                <a href=\"/account/register?return_url=${encodeURIComponent(window.location.pathname + window.location.search)}\" class=\"br-trial-notice__link\">\u7121\u6599\u4F1A\u54E1\u767B\u9332</a>\u3067\u8A18\u9332\u4FDD\u5B58\u30FB\u30B1\u30A2\u7BA1\u7406\u6A5F\u80FD\u304C\u4F7F\u3048\u307E\u3059\n              </p>\n            </div>\n            ${this.renderNonMemberConsultationForm()}\n          </div>\n\n          <div class=\"threads-section\">\n            <div class=\"br-section-label\">MEMBERSHIP</div>\n            <h3 class=\"br-section-title\">\u4F1A\u54E1\u767B\u9332\u306E\u3054\u6848\u5185</h3>\n            ${this.renderMembershipBenefits()}\n          </div>\n        </div>`;\n    }\n\n    const membershipType = this.getMembershipType();\n  console.log('renderMainContent \u5B9F\u884C\u6642\u306E\u4F1A\u54E1\u7A2E\u5225:', membershipType);\n    \n    return `<div class=\"main-content\">\n        <div class=\"consultation-form-section\">\n          <h3 class=\"plant-fk\">\u65B0\u3057\u3044\u80B2\u6210\u8A18\u9332\u3092\u6295\u7A3F</h3>\n          ${this.renderMembershipNotice(membershipType)}\n          ${this.renderSeasonalInfoBanner()}\n          ${this.renderConsultationForm()}\n        </div>\n        \n<div class=\"threads-section\">\n  <h3 class=\"plant-fk\">\u690D\u7269\u80B2\u6210\u8A18\u9332</h3>\n  ${this.renderAdvertisementSection()}\n  \n  ${membershipType === 'non_member' ? \n    `<div class=\"non-member-notice\">\n      <h4>\u4F1A\u54E1\u767B\u9332\u3067\u8A18\u9332\u4FDD\u5B58\u6A5F\u80FD\u3092\u5229\u7528</h4>\n      <p>\u4F1A\u54E1\u767B\u9332\uFF08\u7121\u6599\uFF09\u3059\u308B\u3068\u3001\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u3092\u4FDD\u5B58\u30FB\u7BA1\u7406\u3067\u304D\u307E\u3059\u3002</p>\n      <ul class=\"feature-list\">\n        <li>\u2705 \u80B2\u6210\u8A18\u9332\u7121\u5236\u9650\u6295\u7A3F</li>\n        <li>\u2705 \u690D\u726920\u500B\u307E\u3067\u767B\u9332</li>\n        <li>\u2705 \u30B1\u30A2\u8A18\u9332\u7BA1\u7406</li>\n        <li>\u2705 \u6210\u9577\u6BD4\u8F03\u6A5F\u80FD</li>\n      </ul>\n      <a href=\"/account/register?return_url=${encodeURIComponent(window.location.pathname + window.location.search)}\" class=\"btn btn-primary\">\u7121\u6599\u4F1A\u54E1\u767B\u9332</a>\n    </div>` :\n    `<div id=\"threads-list\" class=\"threads-container\">\n      <div class=\"loading\">\u690D\u7269\u8A18\u9332\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n    </div>`\n  }\n</div>\n      </div>`;\n  }\n\n  renderMembershipBenefits() {\n    return `<div class=\"br-plan-grid\">\n      <div class=\"br-plan-card\">\n        <div class=\"br-plan-card__tier\">FREE</div>\n        <div class=\"br-plan-card__name\">\u7121\u6599\u4F1A\u54E1</div>\n        <div class=\"br-plan-card__price\">\u6708\u984D <strong>\u00A50</strong></div>\n        <ul class=\"br-plan-card__list\">\n          <li>\u80B2\u6210\u8A18\u9332\u7121\u5236\u9650\u6295\u7A3F</li>\n          <li>\u6295\u7A3F\u3054\u3068\u306B5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7</li>\n          <li>\u30B1\u30A2\u8A18\u9332\u7BA1\u7406</li>\n          <li>\u6210\u9577\u6BD4\u8F03\u6A5F\u80FD</li>\n          <li>\u690D\u726920\u500B\u307E\u3067\u767B\u9332</li>\n          <li>\u8A18\u9332\u306E\u307F\u6295\u7A3F\u5BFE\u5FDC</li>\n          <li>\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u7BA1\u7406</li>\n        </ul>\n        <a href=\"/account/register?return_url=${encodeURIComponent(window.location.pathname + window.location.search)}\" class=\"br-plan-card__btn\">\u7121\u6599\u4F1A\u54E1\u767B\u9332</a>\n      </div>\n\n      <div class=\"br-plan-card br-plan-card--premium\">\n        <div class=\"br-plan-card__tier\">PREMIUM</div>\n        <div class=\"br-plan-card__name\">\u30D7\u30EC\u30DF\u30A2\u30E0\u4F1A\u54E1</div>\n        <div class=\"br-plan-card__price\">\u6708\u984D <strong>\u00A5300</strong> ~</div>\n        <p class=\"br-plan-card__note\">\u203B \u534A\u5E74 / \u5E74\u9593\u30D7\u30E9\u30F3\u304B\u3089\u9078\u3079\u307E\u3059</p>\n        <ul class=\"br-plan-card__list\">\n          <li>\u5168\u6A5F\u80FD\u5229\u7528\u53EF\u80FD</li>\n          <li>\u9AD8\u54C1\u8CEA\u5206\u6790</li>\n          <li>\u690D\u7269\u30B1\u30A2AI\u30A4\u30E9\u30B9\u30C8\u753B\u50CF\u56DE\u7B54\uFF08\u6708100\u56DE\uFF09</li>\n          <li>\u6295\u7A3F\u3054\u3068\u306B5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7</li>\n          <li>\u30B1\u30A2\u8A18\u9332\u7BA1\u7406</li>\n          <li>\u30B1\u30A2\u8A2D\u5B9A\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA</li>\n          <li>\u6210\u9577\u6BD4\u8F03\u6A5F\u80FD</li>\n          <li>\u690D\u726920\u500B\u307E\u3067\u767B\u9332</li>\n          <li>\u8A18\u9332\u306E\u307F\u6295\u7A3F\u5BFE\u5FDC</li>\n          <li>\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u7BA1\u7406</li>\n        </ul>\n        <div class=\"br-plan-card__cta\">\n          <a href=\"https://leaf-laboratory.com/products/botareco-6m-pass\" class=\"br-plan-card__btn br-plan-card__btn--outline\">\n            \u534A\u5E74\u30D7\u30E9\u30F3\u3092\u7533\u3057\u8FBC\u3080\uFF08300\u5186\u00D76\u30F6\u6708\uFF09\n          </a>\n          <a href=\"https://leaf-laboratory.com/products/botareco-annual-pass\" class=\"br-plan-card__btn\">\n            \u5E74\u9593\u30D7\u30E9\u30F3\u3092\u7533\u3057\u8FBC\u3080\uFF08300\u5186\u00D712\u30F6\u6708\uFF09\n          </a>\n        </div>\n      </div>\n    </div>`;\n  }\n\nrenderMembershipNotice(membershipType) {\n  const notices = {\n    non_member: {\n      title: '\u975E\u4F1A\u54E1\u30D7\u30E9\u30F3',\n      features: ['\u57FA\u672C\u76F8\u8AC7\u306E\u307F', '\u8A18\u9332\u4FDD\u5B58\u306A\u3057', '\u753B\u50CF\u751F\u6210\u306A\u3057'],\n      color: '#dc2626'\n    },\n    free_member: {\n      title: '\u7121\u6599\u4F1A\u54E1\u30D7\u30E9\u30F3\uFF08\u6708\u984D0\u5186\uFF09', \n      features: [\n        '\u80B2\u6210\u8A18\u9332\u7121\u5236\u9650\u6295\u7A3F',\n        '\u6295\u7A3F\u3054\u3068\u306B5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7',\n        '\u30B1\u30A2\u8A18\u9332\u7BA1\u7406',\n        '\u6210\u9577\u6BD4\u8F03\u6A5F\u80FD',\n        '\u690D\u726920\u500B\u307E\u3067\u767B\u9332',\n        '\u8A18\u9332\u306E\u307F\u6295\u7A3F\u5BFE\u5FDC',\n        '\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u7BA1\u7406',\n        '\u753B\u50CF\u751F\u6210\u306A\u3057',\n        '\u30B1\u30A2\u901A\u77E5\u306A\u3057'\n      ],\n      color: '#059669'\n    },\n    paid_member: {\n      title: '\u6709\u6599\u4F1A\u54E1\u30D7\u30E9\u30F3\uFF08\u6708\u984D300\u5186\uFF09',\n      features: [\n        '\u5168\u6A5F\u80FD\u5229\u7528\u53EF\u80FD',\n        '\u80B2\u6210\u8A18\u9332\u7121\u5236\u9650\u6295\u7A3F',\n        '\u6295\u7A3F\u3054\u3068\u306B5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7',\n        '\u6210\u9577\u6BD4\u8F03\u6A5F\u80FD',\n        '\u690D\u726950\u500B\u307E\u3067\u767B\u9332',\n        '\u8A18\u9332\u306E\u307F\u6295\u7A3F\u5BFE\u5FDC',\n        '\u30A4\u30E9\u30B9\u30C8\u751F\u6210\uFF08\u6708100\u56DE\uFF09',\n        '\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u901A\u77E5',\n        '\u30B1\u30A2\u8A2D\u5B9A\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA'\n      ],\n      color: '#7c3aed'\n    }\n  };\n\n  const notice = notices[membershipType];\n\n  return `<details class=\"membership-notice\">\n      <summary class=\"membership-summary\">\n        <span class=\"membership-title\">${notice.title}</span>\n        <svg class=\"membership-arrow\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <path d=\"M7 10l5 5 5-5\"></path>\n        </svg>\n      </summary>\n      <ul class=\"membership-features\">\n        ${notice.features.map(feature => `<li>${feature}</li>`).join('')}\n      </ul>\n      ${membershipType === 'free_member' ? `\n        <p class=\"membership-upgrade\">\n          \u753B\u50CF\u751F\u6210\u30FB\u30B1\u30A2\u901A\u77E5\u6A5F\u80FD\u306F<a href=\"/pages/botanical-record#plans\" style=\"color: #7c3aed;\">\u6709\u6599\u30D7\u30E9\u30F3\uFF08\u6700\u5B89 \u6708\u00A5250\u301C\uFF09</a>\u3067\u3054\u5229\u7528\u3044\u305F\u3060\u3051\u307E\u3059\n        </p>\n      ` : ''}\n    </details>`;\n}\n\n  renderSeasonalInfoBanner() {\n    const membershipType = this.getMembershipType();\n    \n    return `<div class=\"seasonal-info-banner\">\n        <h5>${this.seasonInfo.displayText} \u306E\u30B1\u30A2\u30DD\u30A4\u30F3\u30C8</h5>\n        <p>${this.getSeasonalCareMessage(this.seasonInfo.season)}</p>\n        ${membershipType === 'paid_member' ? \n          '<p><small>\u6709\u6599\u4F1A\u54E1: \u30B1\u30A2\u901A\u77E5\u3067\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u9593\u9694\u8ABF\u6574\u3092\u81EA\u52D5\u5B9F\u884C\u4E2D</small></p>' :\n          '<p><small>\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u901A\u77E5\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u6A5F\u80FD\u3067\u3059</small></p>'\n        }\n      </div>`;\n  }\n\n  getSeasonalCareMessage(season) {\n    const messages = {\n      spring: '\u6210\u9577\u671F\u306E\u305F\u3081\u6C34\u3084\u308A\u30FB\u80A5\u6599\u306E\u983B\u5EA6\u3092\u5897\u3084\u3057\u307E\u3057\u3087\u3046\u3002\u690D\u3048\u66FF\u3048\u306B\u3082\u9069\u3057\u305F\u5B63\u7BC0\u3067\u3059\u3002',\n      summer: '\u9AD8\u6E29\u591A\u6E7F\u306E\u305F\u3081\u6C34\u3084\u308A\u3092\u3053\u307E\u3081\u306B\u3001\u5BB3\u866B\u5BFE\u7B56\u3082\u91CD\u8981\u3067\u3059\u3002\u76F4\u5C04\u65E5\u5149\u306B\u6CE8\u610F\u3002',\n      autumn: '\u6210\u9577\u304C\u7DE9\u3084\u304B\u306B\u306A\u308B\u6642\u671F\u3002\u690D\u3048\u66FF\u3048\u3084\u526A\u5B9A\u306E\u6700\u9069\u30B7\u30FC\u30BA\u30F3\u3067\u3059\u3002',\n      winter: '\u4F11\u7720\u671F\u306E\u305F\u3081\u6C34\u3084\u308A\u3092\u63A7\u3048\u3081\u306B\u3002\u6696\u304B\u3044\u5834\u6240\u3067\u7BA1\u7406\u3057\u307E\u3057\u3087\u3046\u3002'\n    };\n    return messages[season] || messages.autumn;\n  }\n\n  renderAdvertisementSection() {\n    const seasonalProducts = this.getSeasonalProductRecommendations(this.seasonInfo.season);\n    \n    return `<div class=\"advertisement-section\">\n        <h5>${this.seasonInfo.seasonEmoji} ${this.seasonInfo.seasonName}\u306B\u304A\u3059\u3059\u3081\u306E\u690D\u7269\u7528\u54C1</h5>\n        <div class=\"ad-content\">\n          <p>${seasonalProducts.message}</p>\n          <a href=\"${seasonalProducts.link}\" class=\"btn btn-small btn-secondary\">\n            ${seasonalProducts.buttonText}\n          </a>\n        </div>\n      </div>`;\n  }\n\n  getSeasonalProductRecommendations(season) {\n    const recommendations = {\n      spring: {\n        message: '\u6210\u9577\u671F\u306B\u6700\u9069\u306A\u80A5\u6599\u30FB\u690D\u3048\u66FF\u3048\u7528\u571F\u3092\u7279\u5225\u4FA1\u683C\u3067\u3054\u63D0\u4F9B',\n        buttonText: '\u6625\u306E\u690D\u7269\u7528\u54C1',\n        link: '/collections/spring-plant-care'\n      },\n      summer: {\n        message: '\u6691\u3055\u5BFE\u7B56\u30FB\u5BB3\u866B\u5BFE\u7B56\u30B0\u30C3\u30BA\u3092\u7279\u5225\u4FA1\u683C\u3067\u3054\u63D0\u4F9B',\n        buttonText: '\u590F\u306E\u7BA1\u7406\u7528\u54C1',\n        link: '/collections/summer-plant-care'\n      },\n      autumn: {\n        message: '\u690D\u3048\u66FF\u3048\u30FB\u526A\u5B9A\u30C4\u30FC\u30EB\u3092\u7279\u5225\u4FA1\u683C\u3067\u3054\u63D0\u4F9B',\n        buttonText: '\u79CB\u306E\u4F5C\u696D\u7528\u54C1',\n        link: '/collections/autumn-plant-care'\n      },\n      winter: {\n        message: '\u4FDD\u6E29\u30FB\u6E7F\u5EA6\u7BA1\u7406\u7528\u54C1\u3092\u7279\u5225\u4FA1\u683C\u3067\u3054\u63D0\u4F9B',\n        buttonText: '\u51AC\u306E\u7BA1\u7406\u7528\u54C1',\n        link: '/collections/winter-plant-care'\n      }\n    };\n    \n    return recommendations[season] || {\n      message: '\u690D\u7269\u5C02\u7528\u571F\u30FB\u80A5\u6599\u30FB\u30C4\u30FC\u30EB\u3092\u7279\u5225\u4FA1\u683C\u3067\u3054\u63D0\u4F9B',\n      buttonText: '\u5546\u54C1\u3092\u898B\u308B',\n      link: '/collections/plant-care-products'\n    };\n  }\n\n  renderConsultationForm() {\n    const membershipType = this.getMembershipType();\n    \n    return `<form id=\"consultation-form\" class=\"consultation-form\">\n        ${membershipType !== 'non_member' ? this.renderPlantSelectionSection() : ''}\n\n        <div class=\"form-group\">\n          <label for=\"plant-name\">\u690D\u7269\u540D *</label>\n          <input type=\"text\" id=\"plant-name\" name=\"plant_name\" required \n                 placeholder=\"\u4F8B: \u30D3\u30AB\u30AF\u30B7\u30C0\u3001\u30EA\u30C9\u30EC\u30A4\u3001\u591A\u8089\u690D\u7269\u3001\u30DD\u30C8\u30B9\">\n          <div class=\"help-text\">\u6B63\u78BA\u306A\u690D\u7269\u540D\u3092\u5165\u529B\u3059\u308B\u3068\u3001\u3088\u308A\u9069\u5207\u306A\u30A2\u30C9\u30D0\u30A4\u30B9\u3092\u53D7\u3051\u3089\u308C\u307E\u3059</div>\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"plant-image\">\u690D\u7269\u306E\u5199\u771F\uFF08\u4EFB\u610F\uFF09</label>\n          <input type=\"file\" id=\"plant-image\" name=\"image\" accept=\"image/*\">\n          <div class=\"help-text\">\n            \u5199\u771F\u304C\u3042\u308B\u3068\u72B6\u614B\u3092\u3088\u308A\u6B63\u78BA\u306B\u5224\u65AD\u3067\u304D\u307E\u3059\uFF08JPEG, PNG, WebP\u5BFE\u5FDC\u30FB10MB\u4EE5\u4E0B\uFF09\n          </div>\n          <div class=\"image-preview\" id=\"image-preview\"></div>\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"notes\">\u8A18\u9332\u30FB\u5099\u8003</label>\n          <textarea id=\"notes\" name=\"notes\" rows=\"3\" \n                    placeholder=\"\u4F8B: \u65B0\u3057\u3044\u8449\u304C\u51FA\u3066\u304D\u307E\u3057\u305F\u3001\u6C34\u3084\u308A\u5F8C\u306E\u72B6\u614B\u3001\u524D\u56DE\u304B\u3089\u306E\u5909\u5316\u3001\u6C17\u306B\u306A\u308B\u70B9\u306A\u3069\"></textarea>\n          <div class=\"help-text\">\u6210\u9577\u306E\u8A18\u9332\u3084\u6C17\u3065\u3044\u305F\u3053\u3068\u3092\u8A18\u5165\u3057\u3066\u304F\u3060\u3055\u3044</div>\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"consultation\">\u80B2\u3066\u65B9\u306B\u3064\u3044\u3066\u76F8\u8AC7\u3057\u305F\u3044\u3053\u3068\uFF08\u4EFB\u610F\uFF09</label>\n          <textarea id=\"consultation\" name=\"consultation_request\" rows=\"4\" \n                    placeholder=\"\u4F8B: \n- \u8449\u306E\u8272\u304C\u5909\u308F\u3063\u3066\u304D\u305F\u306E\u3067\u3059\u304C\u5927\u4E08\u592B\u3067\u3057\u3087\u3046\u304B\uFF1F\n- \u6C34\u3084\u308A\u983B\u5EA6\u306F\u9069\u5207\u3067\u3059\u304B\uFF1F\n- \u5143\u6C17\u304C\u306A\u3044\u3088\u3046\u306B\u898B\u3048\u308B\u306E\u3067\u3059\u304C\u539F\u56E0\u306F\uFF1F\n- \u6B21\u306B\u3069\u3093\u306A\u30B1\u30A2\u3092\u3059\u3079\u304D\u3067\u3057\u3087\u3046\u304B\uFF1F\n\n\u203B\u7A7A\u306E\u5834\u5408\u306F\u300C\u8A18\u9332\u306E\u307F\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3059\uFF08AI\u5206\u6790\u306A\u3057\uFF09\"></textarea>\n          <div class=\"help-text\">\n            <strong>\u8A18\u9332\u306E\u307F\u306E\u5834\u5408</strong>: \u76F8\u8AC7\u5185\u5BB9\u3092\u7A7A\u306B\u3057\u3066\u300C\u8A18\u9332\u30FB\u5099\u8003\u300D\u306E\u307F\u3054\u8A18\u5165\u304F\u3060\u3055\u3044<br>\n            <strong>AI\u76F8\u8AC7\u306E\u5834\u5408</strong>: \u76F8\u8AC7\u5185\u5BB9\u3092\u5165\u529B\u3059\u308B\u3068\u8A73\u3057\u3044\u5206\u6790\u30FB\u30A2\u30C9\u30D0\u30A4\u30B9\u3092\u53D7\u3051\u3089\u308C\u307E\u3059<br>\n            <strong>\u5B63\u7BC0\u5BFE\u5FDC</strong>: \u73FE\u5728\u306E\u5B63\u7BC0\uFF08${this.seasonInfo.displayText}\uFF09\u3092\u8003\u616E\u3057\u305F\u30A2\u30C9\u30D0\u30A4\u30B9\u3092\u63D0\u4F9B\u3057\u307E\u3059\n          </div>\n        </div>\n<!-- \u30A4\u30E9\u30B9\u30C8\u751F\u6210\uFF08\u6709\u6599\u4F1A\u54E1\u306E\u307F\u30FB\u7121\u6599\u4F1A\u54E1\u306F\u30B0\u30EC\u30FC\u30A2\u30A6\u30C8\u8868\u793A\uFF09 -->\n${membershipType !== 'non_member' ? `\n  <div class=\"illustration-option-section\">\n    <label class=\"illustration-option\" ${membershipType !== 'paid_member' ? 'style=\"opacity: 0.5;\"' : ''}>\n      <input type=\"checkbox\" id=\"enable-illustration-checkbox\" name=\"enable_illustration\" value=\"1\" ${membershipType === 'paid_member' ? 'checked' : 'disabled'}>\n      <span class=\"option-text\">AI\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\u3082\u751F\u6210\u3059\u308B</span>\n      <span class=\"option-note\">\u76F8\u8AC7\u5185\u5BB9\u306B\u5FDC\u3058\u305F\u690D\u7269\u30B1\u30A2\u306E\u30A4\u30E9\u30B9\u30C8\u3092\u81EA\u52D5\u751F\u6210\uFF0820\u301C30\u79D2\uFF09</span>\n    </label>\n    <p class=\"illustration-requirement\" style=\"font-size: 12px; color: #6b7280; margin-top: 8px;\">\n      ${membershipType === 'paid_member'\n        ? '\u203B \u30A4\u30E9\u30B9\u30C8\u751F\u6210\u306B\u306F\u300C\u80B2\u3066\u65B9\u306B\u3064\u3044\u3066\u76F8\u8AC7\u3057\u305F\u3044\u3053\u3068\u300D\u306E\u5165\u529B\u304C\u5FC5\u8981\u3067\u3059'\n        : '\u203B \u30A4\u30E9\u30B9\u30C8\u751F\u6210\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u306E\u6A5F\u80FD\u3067\u3059'}\n    </p>\n  </div>\n` : '' }\n\n${membershipType !== 'non_member' ? `\n      <div class=\"sns-public-option-section\">\n        <label class=\"sns-public-option\">\n          <input type=\"checkbox\" id=\"is-public-checkbox\" name=\"is_public\" value=\"1\" checked>\n          <span class=\"option-text\">\n            \uD83D\uDCE2 \u3053\u306E\u80B2\u6210\u8A18\u9332\u3092SNS\u3067\u516C\u958B\u3059\u308B\n            <span class=\"help-icon\" title=\"\u516C\u958B\u3059\u308B\u3068\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u3042\u306A\u305F\u306E\u80B2\u6210\u8A18\u9332\u3092\u95B2\u89A7\u3057\u3001\u3044\u3044\u306D\u3084\u30B3\u30E1\u30F3\u30C8\u304C\u3067\u304D\u307E\u3059\u3002\u500B\u4EBA\u60C5\u5831\u306F\u542B\u3081\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\">?</span>\n          </span>\n        </label>\n        <div class=\"sns-public-info\">\n          <small>\n            <a href=\"#\" onclick=\"window.plantApp.previewPublicPost(); return false;\">\n              \uD83D\uDC41\uFE0F \u516C\u958B\u6642\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u898B\u308B\n            </a>\n          </small>\n          <small>\u26A0\uFE0F \u516C\u958B\u5F8C\u3082\u300C\u516C\u958B\u8A2D\u5B9A\u5909\u66F4\u300D\u30DC\u30BF\u30F3\u3067\u975E\u516C\u958B\u306B\u623B\u305B\u307E\u3059</small>\n        </div>\n        <div style=\"margin-top:8px;padding:8px 12px;background:#f0f8ff;border:1px solid #a0c8e8;border-radius:6px;font-size:11px;color:#1a4a6b;line-height:1.6;\">\n          \uD83D\uDCCB SNS\u516C\u958B\u306E\u524D\u306B\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\uFF1A\u30E6\u30FC\u30B6\u30FC\u540D\u30FB\u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u306B\u4F01\u696D\u540D\u3084\u5B9F\u5728\u3059\u308B\u7B2C\u4E09\u8005\u30FB\u6709\u540D\u4EBA\u306E\u540D\u524D\u3092\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u7981\u6B62\u3057\u3066\u3044\u307E\u3059\u3002\u8AB9\u8B17\u4E2D\u50B7\u30FB\u653B\u6483\u7684\u306A\u6295\u7A3F\u306F\u904B\u55B6\u306E\u5224\u65AD\u3067\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u505C\u6B62\u3059\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002\n          \u8A73\u7D30\u306F<a href=\"/pages/terms\" target=\"_blank\" style=\"color:#1B8F5A;text-decoration:underline;\">\u5229\u7528\u898F\u7D04\uFF08\u7B2C8\u6761\uFF09</a>\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002\n        </div>\n      </div>\n    ` : ''}\n\n        <div class=\"form-actions\">\n          <button type=\"submit\" id=\"submit-btn\" class=\"btn btn-primary btn-submit\">\n            ${this.getSubmitButtonText(membershipType)}\n          </button>\n        </div>\n\n        <div id=\"form-status\" class=\"form-status br-form-status\"></div>\n\n        <div class=\"ai-disclaimer-note\" style=\"margin-top:10px;padding:8px 12px;background:#fffbea;border:1px solid #f0c040;border-radius:6px;font-size:12px;color:#6b5200;line-height:1.6;\">\n          \u26A0\uFE0F AI\u306E\u56DE\u7B54\u306F\u53C2\u8003\u60C5\u5831\u3067\u3059\u3002\u6B63\u78BA\u6027\u3092\u4FDD\u8A3C\u3059\u308B\u3082\u306E\u3067\u306F\u306A\u304F\u3001\u690D\u7269\u306E\u72B6\u614B\u306B\u95A2\u3059\u308B\u6700\u7D42\u5224\u65AD\u306F\u3054\u81EA\u8EAB\u3067\u304A\u9858\u3044\u3057\u307E\u3059\u3002\n          \u8A73\u7D30\u306F<a href=\"/pages/terms\" target=\"_blank\" style=\"color:#1B8F5A;text-decoration:underline;\">\u5229\u7528\u898F\u7D04\uFF08\u7B2C6\u6761\uFF09</a>\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002\n        </div>\n\n      </form>`;\n  }\n\n  getSubmitButtonText(membershipType) {\n    switch (membershipType) {\n      case 'non_member': \n        return '\u80B2\u3066\u65B9\u3092\u4F53\u9A13\u3059\u308B\uFF08\u8A18\u9332\u4FDD\u5B58\u306A\u3057\uFF09';\n      case 'free_member': \n        return `\u80B2\u6210\u8A18\u9332\u3092\u6295\u7A3F\u3059\u308B\uFF08${this.seasonInfo.seasonName}\u5BFE\u5FDC\uFF09`;\n      case 'paid_member': \n        return `\u80B2\u6210\u8A18\u9332\u3092\u6295\u7A3F\u3059\u308B\uFF08${this.seasonInfo.seasonName}\u5BFE\u5FDC\u30FB\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u4ED8\u304D\uFF09`;\n      default: \n        return '\u80B2\u3066\u65B9\u3092\u76F8\u8AC7\u3059\u308B';\n    }\n  }\n\n  renderNonMemberConsultationForm() {\n    return `<form id=\"consultation-form\" class=\"consultation-form\">\n        <div class=\"form-group\">\n          <label for=\"plant-name\">\u690D\u7269\u540D *</label>\n          <input type=\"text\" id=\"plant-name\" name=\"plant_name\" required \n                 placeholder=\"\u4F8B: \u30D3\u30AB\u30AF\u30B7\u30C0\u3001\u30EA\u30C9\u30EC\u30A4\u3001\u591A\u8089\u690D\u7269\u3001\u30DD\u30C8\u30B9\">\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"plant-image\">\u690D\u7269\u306E\u5199\u771F\uFF08\u4EFB\u610F\uFF09</label>\n          <input type=\"file\" id=\"plant-image\" name=\"image\" accept=\"image/*\">\n          <div class=\"help-text\">\n            <strong>\u4F53\u9A13\u7248</strong>: \u5199\u771F\u306F\u5206\u6790\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u304C\u4FDD\u5B58\u3055\u308C\u307E\u305B\u3093\n          </div>\n          <div class=\"image-preview\" id=\"image-preview\"></div>\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"notes\">\u73FE\u5728\u306E\u72B6\u614B\u30FB\u8A18\u9332</label>\n          <textarea id=\"notes\" name=\"notes\" rows=\"3\" placeholder=\"\u4F8B: \u65B0\u3057\u3044\u8449\u304C\u51FA\u3066\u304D\u307E\u3057\u305F\u3001\u6C34\u3084\u308A\u5F8C\u306E\u72B6\u614B\u3001\u6C17\u306B\u306A\u308B\u5909\u5316\u306A\u3069\"></textarea>\n        </div>\n\n        <div class=\"form-group\">\n          <label for=\"consultation\">\u80B2\u3066\u65B9\u306B\u3064\u3044\u3066\u76F8\u8AC7\u3057\u305F\u3044\u3053\u3068 *</label>\n          <textarea id=\"consultation\" name=\"consultation_request\" rows=\"4\" required\n                    placeholder=\"\u4F8B: \n- \u8449\u306E\u8272\u304C\u5909\u308F\u3063\u3066\u304D\u305F\u306E\u3067\u3059\u304C\u5927\u4E08\u592B\u3067\u3057\u3087\u3046\u304B\uFF1F\n- \u6C34\u3084\u308A\u983B\u5EA6\u306F\u9069\u5207\u3067\u3059\u304B\uFF1F\n- \u3053\u306E\u72B6\u614B\u306F\u6B63\u5E38\u3067\u3057\u3087\u3046\u304B\uFF1F\"></textarea>\n          <div class=\"help-text\">\n            \u4F53\u9A13\u7248\u3067\u306F\u76F8\u8AC7\u5185\u5BB9\u306E\u5165\u529B\u304C\u5FC5\u9808\u3067\u3059\u3002\u73FE\u5728\u306E\u5B63\u7BC0\uFF08${this.seasonInfo.displayText}\uFF09\u3092\u8003\u616E\u3057\u305F\u30A2\u30C9\u30D0\u30A4\u30B9\u3092\u63D0\u4F9B\u3057\u307E\u3059\u3002\n          </div>\n        </div>\n        <div class=\"form-actions\">\n          <button type=\"submit\" id=\"submit-btn\" class=\"btn btn-primary btn-submit\">\n            \u690D\u7269\u76F8\u8AC7\u3092\u4F53\u9A13\u3059\u308B\uFF08\u8A18\u9332\u4FDD\u5B58\u306A\u3057\uFF09\n          </button>\n        </div>\n\n        <div id=\"form-status\" class=\"form-status br-form-status\"></div>\n\n        <div class=\"ai-disclaimer-note\" style=\"margin-top:10px;padding:8px 12px;background:#fffbea;border:1px solid #f0c040;border-radius:6px;font-size:12px;color:#6b5200;line-height:1.6;\">\n          \u26A0\uFE0F AI\u306E\u56DE\u7B54\u306F\u53C2\u8003\u60C5\u5831\u3067\u3059\u3002\u6B63\u78BA\u6027\u3092\u4FDD\u8A3C\u3059\u308B\u3082\u306E\u3067\u306F\u306A\u304F\u3001\u690D\u7269\u306E\u72B6\u614B\u306B\u95A2\u3059\u308B\u6700\u7D42\u5224\u65AD\u306F\u3054\u81EA\u8EAB\u3067\u304A\u9858\u3044\u3057\u307E\u3059\u3002\n          \u8A73\u7D30\u306F<a href=\"/pages/terms\" target=\"_blank\" style=\"color:#1B8F5A;text-decoration:underline;\">\u5229\u7528\u898F\u7D04\uFF08\u7B2C6\u6761\uFF09</a>\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002\n        </div>\n\n      </form>`;\n  }\n\n  renderPlantSelectionSection() {\n    const membershipType = this.getMembershipType();\n    \n    return `<div class=\"plant-selection-section\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;\">\n          <h4 class=\"plant-fk\" style=\"margin:0;\">\u690D\u7269\u30B1\u30A2\u306E\u9078\u629E</h4>\n          <button type=\"button\" onclick=\"window.plantApp.startGuideTour()\" style=\"flex-shrink:0;border:2px solid #111;border-radius:20px;background:#fff;color:#111;font-size:12px;font-weight:700;padding:6px 14px;cursor:pointer;white-space:nowrap;\">\uFF1F \u4F7F\u3044\u65B9</button>\n        </div>\n        <p><small>\u65E2\u5B58\u690D\u7269\u3078\u306E\u8A18\u9332\u8FFD\u52A0\u3001\u307E\u305F\u306F\u65B0\u898F\u690D\u7269\u306E\u8A18\u9332\u958B\u59CB\u3092\u9078\u629E</small></p>\n        \n        <div class=\"selection-options\">\n          <label class=\"selection-option\">\n            <input type=\"radio\" name=\"plant_selection_type\" value=\"existing\" id=\"radio-existing\">\n            <span class=\"option-text\">\u65E2\u5B58\u306E\u690D\u7269\u306B\u80B2\u6210\u8A18\u9332\u3092\u8FFD\u52A0</span>\n            <span class=\"option-note\">\u767B\u9332\u6E08\u307F\u690D\u7269\u306E\u30B1\u30A2\u5C65\u6B74\u306B\u8FFD\u52A0</span>\n          </label>\n          <label class=\"selection-option\">\n            <input type=\"radio\" name=\"plant_selection_type\" value=\"new\" id=\"radio-new\" checked>\n            <span class=\"option-text\">\u65B0\u3057\u3044\u690D\u7269\u306E\u8A18\u9332\u3092\u958B\u59CB</span>\n            <span class=\"option-note\">\u65B0\u898F\u690D\u7269\u3068\u3057\u3066\u767B\u9332\u30FB\u7BA1\u7406\u958B\u59CB</span>\n          </label>\n        </div>\n        \n        <div id=\"existing-plants-dropdown\" class=\"existing-plants-dropdown\" style=\"display: none;\">\n          <label for=\"existing-plant-select\">\u8A18\u9332\u3092\u8FFD\u52A0\u3059\u308B\u690D\u7269\u3092\u9078\u629E:</label>\n          <select id=\"existing-plant-select\" name=\"existing_plant_id\">\n            <option value=\"\">\u690D\u7269\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</option>\n          </select>\n          <div class=\"seasonal-note\">\n            <small>${this.seasonInfo.displayText}\u306E\u72B6\u6CC1\u3092\u8003\u616E\u3057\u305F\u8A18\u9332\u30FB\u5206\u6790\u3092\u5B9F\u884C</small>\n          </div>\n        </div>\n        \n        ${membershipType !== 'non_member' ? `<div class=\"plant-limit-reminder\">\n            <p><small>\n              \u690D\u7269\u767B\u9332\u4E0A\u9650: ${membershipType === 'paid_member' ? '50\u500B' : '20\u500B'}\n              ${membershipType === 'free_member' ? ' | \u6709\u6599\u7248\u306750\u500B\u307E\u3067\u62E1\u5F35\u53EF\u80FD' : ''}\n            </small></p>\n          </div>` : ''}\n      </div>`;\n  }\n\nasync submitConsultation() {\n  // \u30EC\u30FC\u30C8\u5236\u9650\u30C1\u30A7\u30C3\u30AF\n  const now = Date.now();\n  const timeSinceLastSubmit = now - this._lastSubmitTime;\n\n  if (timeSinceLastSubmit < this._minSubmitInterval) {\n    const waitSeconds = Math.ceil((this._minSubmitInterval - timeSinceLastSubmit) / 1000);\n    this.showTemporaryNotification(\n      '\u9023\u7D9A\u6295\u7A3F\u5236\u9650: \u3042\u3068' + waitSeconds + '\u79D2\u304A\u5F85\u3061\u304F\u3060\u3055\u3044',\n      'warning'\n    );\n    return;\n  }\n\n  const form = document.getElementById('consultation-form');\n  const formData = new FormData(form);\n\n  console.log('\uD83D\uDCDD \u6295\u7A3F\u51E6\u7406\u958B\u59CB\uFF08B\u6848: Storage\u76F4\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\uFF09');\n  this.debugFormState();\n\n  const extracted = this.extractPlantSelection(formData);\n  const plantName = extracted.plantName;\n  const isExistingPlant = extracted.isExistingPlant;\n  const existingPlantId = extracted.existingPlantId;\n\n  if (!plantName || plantName === '') {\n    console.error('\u274C \u690D\u7269\u540D\u304C\u7A7A\u3067\u3059');\n    this.showError('\u690D\u7269\u540D\u3092\u5165\u529B\u307E\u305F\u306F\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002');\n    return;\n  }\n\n  // \u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\n  const consultationValue = formData.get('consultation_request');\n  const notesValue = formData.get('notes');\n\n  const consultationRequest = consultationValue ? String(consultationValue).trim() : '';\n  const notes = notesValue ? String(notesValue).trim() : '';\n\n  if (!consultationRequest && !notes) {\n    this.showError('\u300C\u8A18\u9332\u30FB\u5099\u8003\u300D\u307E\u305F\u306F\u300C\u76F8\u8AC7\u3057\u305F\u3044\u3053\u3068\u300D\u306E\u3044\u305A\u308C\u304B\u306F\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002');\n    return;\n  }\n\n  // \u8A18\u9332\u306E\u307F\u30E2\u30FC\u30C9\u306E\u5224\u5B9A\n  const isRecordOnly = !consultationRequest;\n\n  console.log('\uD83D\uDCCA \u6295\u7A3F\u30E2\u30FC\u30C9:', isRecordOnly ? '\u8A18\u9332\u306E\u307F' : 'AI\u76F8\u8AC7');\n  console.log('\uD83D\uDCCA \u76F8\u8AC7\u5185\u5BB9:', consultationRequest.substring(0, 50));\n  console.log('\uD83D\uDCCA \u8A18\u9332\u5185\u5BB9:', notes.substring(0, 50));\n\n  const statusDiv = document.getElementById('form-status');\n  const submitBtn = document.getElementById('submit-btn');\n\n  if (!statusDiv || !submitBtn) return;\n\n  const membershipType = this.getMembershipType();\n\n  submitBtn.disabled = true;\n  submitBtn.style.pointerEvents = 'none';\n  submitBtn.style.opacity = '0.6';\n  submitBtn.textContent = isRecordOnly ? '\u8A18\u9332\u4FDD\u5B58\u4E2D...' : 'AI\u5206\u6790\u4E2D...';\n\n  statusDiv.innerHTML = '<div class=\"loading-message\"><div class=\"spinner\"></div><p>\u6295\u7A3F\u3092\u53D7\u4ED8\u4E2D...</p></div>';\n\n  try {\n    this._lastSubmitTime = now;\n\n    // \u2605\u2605\u2605 B\u6848: \u753B\u50CF\u51E6\u7406\uFF08Storage\u76F4\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\uFF09 \u2605\u2605\u2605\n    let imageStorageUrl = null;\n    let imageMimeType = null;\n\n    const imageFile = formData.get('image');\n    if (imageFile && imageFile instanceof File && imageFile.size > 0) {\n      console.log('\uD83D\uDCE4 [B-PLAN] \u753B\u50CF\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u958B\u59CB');\n      console.log('   - \u30D5\u30A1\u30A4\u30EB\u540D:', imageFile.name);\n      console.log('   - \u30B5\u30A4\u30BA:', (imageFile.size / 1024 / 1024).toFixed(2), 'MB');\n\n      try {\n        // \u30B9\u30C6\u30C3\u30D70: 5MB\u8D85\u3048\u306F\u81EA\u52D5\u5727\u7E2E\uFF08iPhone\u306F\u901A\u5E388\u301C12MB\uFF09\n        let fileToUpload = imageFile;\n        if (imageFile.size > 4 * 1024 * 1024) {\n          const originalMB = (imageFile.size / 1024 / 1024).toFixed(1);\n          statusDiv.innerHTML = `<div class=\"loading-message\"><div class=\"spinner\"></div><p>\u753B\u50CF\u3092\u6700\u9069\u5316\u3057\u3066\u3044\u307E\u3059\uFF08${originalMB}MB\uFF09...</p></div>`;\n          fileToUpload = await this.compressImage(imageFile, 4, 1920);\n          console.log('\u2705 [B-PLAN] \u5727\u7E2E\u5B8C\u4E86:', (fileToUpload.size/1024/1024).toFixed(2), 'MB');\n        }\n\n        // \u30B9\u30C6\u30C3\u30D71: \u30D7\u30EA\u30B5\u30A4\u30F3URL\u53D6\u5F97\n        console.log('\uD83D\uDD10 [B-PLAN] \u30D7\u30EA\u30B5\u30A4\u30F3URL\u53D6\u5F97\u4E2D...');\n        const urlResponse = await fetch(\n          'https://laixgcjvowdszrtdpxlq.supabase.co/functions/v1/generate-upload-url',\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({\n              filename: `plant-${Date.now()}.jpg`,\n              contentType: 'image/jpeg',\n              userEmail: this.userEmail || this.getAnonymousId()\n            })\n          }\n        );\n\n        if (!urlResponse.ok) {\n          const errorData = await urlResponse.json();\n          throw new Error('\u30D7\u30EA\u30B5\u30A4\u30F3URL\u53D6\u5F97\u5931\u6557: ' + (errorData.error || urlResponse.statusText));\n        }\n\n        const { uploadUrl, publicUrl } = await urlResponse.json();\n        console.log('\u2705 [B-PLAN] \u30D7\u30EA\u30B5\u30A4\u30F3URL\u53D6\u5F97\u6210\u529F');\n\n        // \u30B9\u30C6\u30C3\u30D72: Storage \u306B\u76F4\u63A5\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\n        console.log('\uD83D\uDCE4 [B-PLAN] Storage\u76F4\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D...');\n        const uploadResponse = await fetch(uploadUrl, {\n          method: 'PUT',\n          headers: {\n            'Content-Type': 'image/jpeg',\n            'Content-Length': fileToUpload.size.toString()\n          },\n          body: fileToUpload\n        });\n\n        if (!uploadResponse.ok) {\n          throw new Error('Storage\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u5931\u6557: ' + uploadResponse.statusText);\n        }\n\n        imageStorageUrl = publicUrl;\n        imageMimeType = 'image/jpeg';\n        console.log('\u2705 [B-PLAN] Storage\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u6210\u529F:', publicUrl);\n\n      } catch (uploadError) {\n        console.error('\u274C [B-PLAN] \u753B\u50CF\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u30A8\u30E9\u30FC:', uploadError);\n        throw new Error('\u753B\u50CF\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ' + uploadError.message);\n      }\n    } else {\n      console.log('\u2139\uFE0F [B-PLAN] \u753B\u50CF\u306A\u3057\uFF08\u30C6\u30AD\u30B9\u30C8\u306E\u307F\uFF09');\n    }\n\n    // \u2605\u2605\u2605 B\u6848: accept-consultation \u306B JSON \u3067\u9001\u4FE1 \u2605\u2605\u2605\n    console.log('\uD83D\uDCEE [B-PLAN] accept-consultation \u547C\u3073\u51FA\u3057');\n\n    const requestBody = {\n      user_email: this.userEmail || this.getAnonymousId(),\n      plant_name: plantName,\n      consultation_request: consultationRequest,\n      notes: notes,\n      image_storage_url: imageStorageUrl,\n      image_mime_type: imageMimeType,\n      existing_thread_id: isExistingPlant ? existingPlantId : null,\n      enable_illustration: (consultationRequest && (form.querySelector('[name=\"enable_illustration\"]')?.checked || false)) ? 1 : 0,\n      is_public: formData.get('is_public') === 'true' || formData.get('is_public') === '1' ? 1 : 0,\n      entitlement: this.entitlement,\n      entitlement_snapshot: this.entitlementSnapshot,\n      browser_fingerprint: this.browserFingerprint,\n      record_only: isRecordOnly\n    };\n\n    console.log('\uD83D\uDCE6 [B-PLAN] \u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3:', {\n      ...requestBody,\n      image_storage_url: imageStorageUrl ? '(\u8A2D\u5B9A\u6E08\u307F)' : '(\u306A\u3057)'\n    });\n\n    const response = await fetch(\n      'https://laixgcjvowdszrtdpxlq.supabase.co/functions/v1/accept-consultation',\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n          'apikey': this.SUPABASE_ANON_KEY,\n          'x-client-info': 'botareco-web'\n        },\n        body: JSON.stringify(requestBody)\n      }\n    );\n\n    const data = await response.json();\n\n    if (!response.ok) {\n      if (data.error === 'consultation_limit_reached') {\n        console.error('\u274C \u76F8\u8AC7\u56DE\u6570\u5236\u9650\u30A8\u30E9\u30FC');\n        this.showConsultationLimitModal(data);\n        return;\n      }\n      throw new Error(data.error || data.message || '\u6295\u7A3F\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n\n    console.log('\u2705 [B-PLAN] \u30B5\u30FC\u30D0\u30FC\u30EC\u30B9\u30DD\u30F3\u30B9:', data);\n\n    if (!data.success) {\n      throw new Error(data.error || data.message || '\u6295\u7A3F\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n\n    // \u8A18\u9332\u306E\u307F\u30E2\u30FC\u30C9\u306E\u51E6\u7406\n    if (data.record_only) {\n      console.log('\u2705 \u8A18\u9332\u306E\u307F\u30E2\u30FC\u30C9\u5B8C\u4E86:', data.post_id);\n\n      statusDiv.innerHTML = '<div class=\"success-message\"><h4>\u2705 \u8A18\u9332\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F</h4><p>\u690D\u7269\u306E\u6210\u9577\u8A18\u9332\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002</p></div>';\n\n      // \u30D5\u30A9\u30FC\u30E0\u30EA\u30BB\u30C3\u30C8\n      form.reset();\n      this.selectedPlantData = null;\n\n      // \u30B9\u30EC\u30C3\u30C9\u4E00\u89A7\u3092\u518D\u8AAD\u307F\u8FBC\u307F\n      this.loadUserThreads();\n      this.loadExistingPlantsForSelection();\n\n      return;\n    }\n\n    if (!data.job_id && !data.ai_response) {\n      throw new Error('\u30B5\u30FC\u30D0\u30FC\u304C\u6B63\u3057\u3044\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F');\n    }\n\n    if (data.job_id) {\n      statusDiv.innerHTML = this.getAiProcessingHtml();\n      this.initAiProcessingTip();\n      this.pollJobStatus(data.job_id, plantName, membershipType);\n    } else {\n      this.handleJobCompleted(data, plantName, membershipType);\n    }\n\n  } catch (error) {\n    this._lastSubmitTime = 0;\n    console.error('\u274C [B-PLAN] \u9001\u4FE1\u30A8\u30E9\u30FC:', error);\n    statusDiv.innerHTML = '<div class=\"error-message\"><h4>\u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F</h4><p>\u30A8\u30E9\u30FC: ' + error.message + '</p><p><small>\u30B5\u30FC\u30D0\u30FC\u3068\u306E\u901A\u4FE1\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002</small></p></div>';\n  } finally {\n    submitBtn.disabled = false;\n    submitBtn.style.pointerEvents = 'auto';\n    submitBtn.style.opacity = '1';\n    submitBtn.textContent = this.getSubmitButtonText(membershipType);\n  }\n}\n\n// \u76F8\u8AC7\u7D50\u679C1\u4EF6\u3092\u30B5\u30FC\u30D0\u30FC\u7D4C\u7531\u3067\u53D6\u5F97\u3057\u3001\u4EE5\u524D\u306E\u30C6\u30FC\u30D6\u30EB\u76F4\u8AAD\u307F\u3068\u540C\u3058\u5F62([job])\u306E\u30EC\u30B9\u30DD\u30F3\u30B9\u3068\u3057\u3066\u8FD4\u3059\nasync fetchConsultationJob(jobId) {\n  const res = await fetch(`${this.apiBase}?action=get_consultation_job`, {\n    method: 'POST',\n    // \u6CE8\u610F: Cache-Control \u7B49\u306E\u72EC\u81EA\u30D8\u30C3\u30C0\u30FC\u3092\u4ED8\u3051\u308B\u3068\u30B5\u30FC\u30D0\u30FC\u306ECORS\u8A31\u53EF\u5916\u306B\u306A\u308A\u3001\u30D6\u30E9\u30A6\u30B6\u304C\u9001\u4FE1\u3092\u6B62\u3081\u308B(2026-10-18\u306B\u4E00\u5EA6\u767A\u751F)\n    headers: { 'Content-Type': 'application/json' },\n    cache: 'no-store',\n    body: JSON.stringify({ job_id: jobId })\n  });\n  if (!res.ok) return res;\n  const d = await res.json();\n  const rows = d && d.job ? [d.job] : [];\n  return { ok: true, status: 200, statusText: 'OK', json: async () => rows };\n}\n\nasync pollJobStatus(jobId, plantName, membershipType, maxAttempts = 600) {\n  let attempts = 0;\n  const statusDiv = document.getElementById('form-status');\n  \n  const checkStatus = async () => {\n    attempts++;\n    \n    try {\n      // 2026-10-18: \u76F8\u8AC7\u7D50\u679C\u306F\u30B5\u30FC\u30D0\u30FC\u7D4C\u7531(get_consultation_job)\u30671\u4EF6\u3060\u3051\u53D6\u5F97\u3059\u308B\u3002\n      // \u4EE5\u524D\u306F\u516C\u958B\u7528\u30AD\u30FC\u3067\u30C6\u30FC\u30D6\u30EB\u3092\u76F4\u63A5\u8AAD\u3093\u3067\u304A\u308A\u3001\u30C6\u30FC\u30D6\u30EB\u5168\u4F53\u304C\u8AB0\u3067\u3082\u8AAD\u3081\u308B\u72B6\u614B\u306B\u306A\u3063\u3066\u3044\u305F\n      const response = await this.fetchConsultationJob(jobId);\n      \n      // \u2605\u2605\u2605 HTTP\u30A8\u30E9\u30FC\u30C1\u30A7\u30C3\u30AF\u8FFD\u52A0 \u2605\u2605\u2605\n      if (!response.ok) {\n        console.error('Job status fetch failed:', response.status, response.statusText);\n        setTimeout(checkStatus, 3000);\n        return;\n      }\n      \n      // \u2605\u2605\u2605 \u30EC\u30B9\u30DD\u30F3\u30B9\u5F62\u5F0F\u30C1\u30A7\u30C3\u30AF\u8FFD\u52A0 \u2605\u2605\u2605\n      const data = await response.json();\n      \n      if (!Array.isArray(data) || data.length === 0) {\n        console.error('Unexpected response format or empty result:', data);\n        setTimeout(checkStatus, 3000);\n        return;\n      }\n      \n      const job = data[0];\n      \n      if (job.status === 'completed') {\n        console.log('\u2705 AI\u5206\u6790\u5B8C\u4E86');\n        \n        if (!job.ai_generated_image_url) {\n          console.log('\u23F3 \u753B\u50CFURL\u66F4\u65B0\u5F85\u6A5F\u4E2D...');\n          await new Promise(resolve => setTimeout(resolve, 500));\n          \n          const retryResponse = await this.fetchConsultationJob(jobId);\n          const retryData = await retryResponse.json();\n          const retryJob = Array.isArray(retryData) ? retryData[0] : retryData;\n          console.log('\uD83D\uDD04 \u518D\u53D6\u5F97\u7D50\u679C:', retryJob.ai_generated_image_url);\n          this.handleJobCompleted(retryJob, plantName, membershipType);\n        } else {\n          this.handleJobCompleted(job, plantName, membershipType);\n        }\n        return;\n      } else if (job.status === 'failed') {\n        console.log('\u274C AI\u5206\u6790\u5931\u6557');\n        this.handleJobFailed(job);\n        return;\n      } else if (attempts >= maxAttempts) {\n        console.log('\u23F0 \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8');\n        this.handleJobTimeout();\n        return;\n      }\n      \n      setTimeout(checkStatus, 3000);\n      \n    } catch (error) {\n      console.error('Polling error:', error);\n      \n      // \u2605\u2605\u2605 \u6700\u5927\u8A66\u884C\u56DE\u6570\u30C1\u30A7\u30C3\u30AF\u8FFD\u52A0 \u2605\u2605\u2605\n      if (attempts >= maxAttempts) {\n        console.log('\u23F0 \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08\u30A8\u30E9\u30FC\u306B\u3088\u308B\uFF09');\n        this.handleJobTimeout();\n        return;\n      }\n      \n      setTimeout(checkStatus, 3000);\n    }\n  };\n  \n  checkStatus();\n}\n\nhandleJobCompleted(job, plantName, membershipType) {\n  console.log('\u2705 \u30B8\u30E7\u30D6\u5B8C\u4E86:', job);\n  \n  const statusDiv = document.getElementById('form-status');\n  \n  // result JSON\u3092\u30D1\u30FC\u30B9\n  let parsedResult = {};\n  try {\n    if (typeof job.result === 'string') {\n      parsedResult = JSON.parse(job.result);\n    } else {\n      parsedResult = job.result || {};\n    }\n  } catch (e) {\n    console.warn('result JSON parse error:', e);\n  }\n  \n  const aiResponse = parsedResult.ai_response || job.ai_response || '';\n  const aiGeneratedImageUrl = parsedResult.ai_generated_image_url || job.ai_generated_image_url || null;\n  const productRecommendations = job.product_recommendations || [];\n  const articleRecommendations = job.article_recommendations || [];\n  \n  // \u2605\u2605\u2605 \u3053\u3053\u306B\u8FFD\u52A0 \u2605\u2605\u2605\n  // \u30B8\u30E7\u30D6\u30C6\u30FC\u30D6\u30EB\u304B\u3089\u6700\u65B0\u306E\u30AF\u30AA\u30FC\u30BF\u60C5\u5831\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A\u3092\u66F4\u65B0\n  this.applyQuotaFromResponse({\n    consultation_quota: job.consultation_quota,\n    illustration_quota: job.illustration_quota,\n    plant_count: this.existingPlants.length\n  });\n  \n  // \u753B\u9762\u306B\u8868\u793A\n  let html = `\n    <div class=\"success-message\">\n      <h4>\u5206\u6790\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\uFF01</h4>\n      \n      <div class=\"ai-response-section\">\n        <h5>AI\u5206\u6790\u7D50\u679C:</h5>\n        <div class=\"response-content\">${this.formatResponse(aiResponse)}</div>\n      </div>\n  `;\n  \n  // \u2605 \u753B\u50CF\u304C\u3042\u308C\u3070\u8FFD\u52A0\n  if (aiGeneratedImageUrl) {\n    html += `\n      <div class=\"ai-illustration\" style=\"margin-top: 20px;\">\n        <h4>\uD83D\uDCF8 \u30A4\u30E9\u30B9\u30C8</h4>\n        <img src=\"${aiGeneratedImageUrl}\" alt=\"AI\u751F\u6210\u30A4\u30E9\u30B9\u30C8\" style=\"max-width: 100%; border-radius: 8px;\" />\n      </div>\n    `;\n  }\n  \n  if (membershipType !== 'non_member') {\n    html += `\n      <div class=\"record-saved-notice\">\n        <p>\u3053\u306E\u80B2\u6210\u8A18\u9332\u306F\u300C${plantName}\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F</p>\n      </div>\n    `;\n  }\n  \n  // \u2605\u2605 \u5546\u54C1\u63A8\u5968\u3092\u8FFD\u52A0\uFF08RECOMMENDATIONS_ENABLED \u304C true \u306B\u306A\u3063\u305F\u3089\u6709\u52B9\u5316\uFF09 \u2605\u2605\n  if (RECOMMENDATIONS_ENABLED && productRecommendations && productRecommendations.length > 0) {\n    html += `\n      <div class=\"product-recommendations-section\">\n        <h5>\u304A\u3059\u3059\u3081\u5546\u54C1</h5>\n        ${productRecommendations.map(product => `\n          <div class=\"recommendation-item ${product.is_pr ? 'pr-item' : ''}\">\n            <div class=\"rec-header\">\n              <h6>${this.escapeHtml(product.product_name)}</h6>\n              ${product.is_pr ? '<span class=\"pr-badge\">PR</span>' : ''}\n            </div>\n            <p>${this.escapeHtml(product.description || '')}</p>\n            <div class=\"product-details\">\n              ${product.price_range ? `<span class=\"price-range\">${this.escapeHtml(product.price_range)}</span>` : ''}\n            </div>\n            <a href=\"${product.product_url}\" target=\"_blank\" class=\"btn btn-small btn-secondary\">\n              \u5546\u54C1\u3092\u898B\u308B\n            </a>\n          </div>\n        `).join('')}\n      </div>\n    `;\n  }\n\n  // \u2605\u2605 \u8A18\u4E8B\u63A8\u5968\u3092\u8FFD\u52A0\uFF08RECOMMENDATIONS_ENABLED \u304C true \u306B\u306A\u3063\u305F\u3089\u6709\u52B9\u5316\uFF09 \u2605\u2605\n  if (RECOMMENDATIONS_ENABLED && articleRecommendations && articleRecommendations.length > 0) {\n    html += `\n      <div class=\"article-recommendations-section\">\n        <h5>\u53C2\u8003\u8A18\u4E8B</h5>\n        ${articleRecommendations.map(article => `\n          <div class=\"recommendation-item\">\n            <h6>${this.escapeHtml(article.title)}</h6>\n            <p>${this.escapeHtml(article.summary || '')}</p>\n            <a href=\"${article.url}\" target=\"_blank\" class=\"btn btn-small btn-tertiary\">\n              \u8A18\u4E8B\u3092\u8AAD\u3080\n            </a>\n          </div>\n        `).join('')}\n      </div>\n    `;\n  }\n  \n  html += `</div>`;\n  \n  statusDiv.innerHTML = html;\n    // \u2605\u2605\u2605 \u3053\u3053\u306B\u8FFD\u52A0 \u2605\u2605\u2605\n  if (job.consultation_quota || job.illustration_quota) {\n    this.applyQuotaFromResponse({\n      consultation_quota: job.consultation_quota,\n      illustration_quota: job.illustration_quota,\n      plant_count: this.existingPlants.length\n    });\n    \n  }\n  \n// \u30D5\u30A9\u30FC\u30E0\u30EA\u30BB\u30C3\u30C8\uFF08\u4EE5\u4E0B\u65E2\u5B58\u30B3\u30FC\u30C9\uFF09\n  document.getElementById('consultation-form').reset();\n  \n  if (membershipType !== 'non_member') {\n    this.loadUserThreads();\n    this.loadExistingPlantsForSelection();\n    \n    // \u2605 \u6700\u65B0\u306Equota\u60C5\u5831\u3092\u53D6\u5F97\uFF08\u30B8\u30E7\u30D6\u30C6\u30FC\u30D6\u30EB\u306E\u53E4\u3044\u5024\u3067\u306F\u306A\u304F\u3001DB\u304B\u3089\u76F4\u63A5\u53D6\u5F97\uFF09\n    setTimeout(() => {\n      this.loadQuotaInfo(true);\n    }, 500);\n  }\n}\n\nhandleJobFailed(job) {\n  const statusDiv = document.getElementById('form-status');\n  statusDiv.innerHTML = `\n    <div class=\"error-message\">\n      <h4>AI\u5206\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F</h4>\n      <p>${job.error_message || '\u4E0D\u660E\u306A\u30A8\u30E9\u30FC'}</p>\n    </div>\n  `;\n}\n\nhandleJobTimeout() {\n  const statusDiv = document.getElementById('form-status');\n  statusDiv.innerHTML = `\n    <div class=\"warning-message\">\n      <h4>\u51E6\u7406\u306B\u6642\u9593\u304C\u304B\u304B\u3063\u3066\u3044\u307E\u3059</h4>\n      <p>\u5F8C\u307B\u3069\u690D\u7269\u8A18\u9332\u4E00\u89A7\u304B\u3089\u7D50\u679C\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044</p>\n    </div>\n  `;\n  \n  // \u30D5\u30A9\u30FC\u30E0\u30EA\u30BB\u30C3\u30C8\n  document.getElementById('consultation-form').reset();\n  \n  // \u6295\u7A3F\u30EA\u30B9\u30C8\u66F4\u65B0\n  setTimeout(() => {\n    this.loadUserThreads();\n    this.loadExistingPlantsForSelection();\n  }, 2000);\n}\n// =====================\n// AI\u5F85\u6A5F\u30A2\u30CB\u30E1 UI \u4F5C\u6210\n// =====================\ngetAiProcessingHtml() {\n  return `\n    <div class=\"br-processing-core\">\n      <div class=\"br-processing-wrap\">\n        <img src=\"https://cdn.shopify.com/s/files/1/0658/5332/5495/files/t5.png?v=1765098930\"\n             class=\"br-processing-cactus\"\n             alt=\"AI\u5BE9\u67FB\u4E2D\u306E\u30A4\u30E1\u30FC\u30B8\">\n\n        <div class=\"br-ellipse-line br-left-half\"></div>\n        <div class=\"br-ellipse-line br-right-half\"></div>\n      </div>\n\n      <p class=\"br-processing-title\">AI\u304C\u5185\u5BB9\u3092\u5BE9\u67FB\u4E2D\u3067\u3059</p>\n      <p class=\"br-processing-sub\">\u5C11\u3057\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\uFF0810\u301C30\u79D2\u307B\u3069\uFF09</p>\n    </div>\n\n    <div class=\"br-processing-tip\" id=\"br-processing-tip\">\n      <div class=\"br-processing-tip-inner\">\n        <img id=\"br-processing-tip-img\" src=\"\" alt=\"\" class=\"br-processing-tip-img\">\n        <p id=\"br-processing-tip-text\" class=\"br-processing-tip-text\"></p>\n      </div>\n    </div>\n\n    <div class=\"br-processing-ad\" id=\"br-processing-ad\"></div>\n  `;\n}\n\n\n// =====================\n// \u30E9\u30F3\u30C0\u30E0TIP \u521D\u671F\u5316\n// =====================\ninitAiProcessingTip() {\n  const tipBlock = document.getElementById(\"br-processing-tip\");\n  const adBlock  = document.getElementById(\"br-processing-ad\");\n\n  if (!tipBlock) return;\n\n  // CONTENT_SLOTS['loading-tip'] \u304B\u3089\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\n  const slotHtml = this.renderSlot('loading-tip');\n\n  if (!slotHtml) {\n    tipBlock.style.display = \"none\";\n    return;\n  }\n\n  // \u7D14\u5E83\u544A\u304C\u5225\u9014 br-processing-ad \u306B\u5165\u3063\u3066\u3044\u308B\u5834\u5408\u306F tip \u3092\u975E\u8868\u793A\n  if (adBlock && adBlock.children.length > 0) {\n    tipBlock.style.display = \"none\";\n    return;\n  }\n\n  tipBlock.innerHTML = slotHtml;\n}\n\n\n  extractPlantSelection(formData) {\n    const selectionType = formData.get('plant_selection_type');\n    let existingPlantId = formData.get('existing_plant_id');\n    let plantName = '';\n    let isExistingPlant = false;\n    \n    const plantNameInput = document.getElementById('plant-name');\n    if (plantNameInput) {\n      plantName = plantNameInput.value?.trim() || '';\n    }\n    \n    const existingRadio = document.getElementById('radio-existing');\n    const existingSelect = document.getElementById('existing-plant-select');\n    \n    if ((existingRadio && existingRadio.checked) || this.lastSelectedPlant) {\n      if (existingSelect && existingSelect.value) {\n        existingPlantId = existingSelect.value;\n        const selectedOption = existingSelect.selectedOptions[0];\n        \n        if (selectedOption && selectedOption.dataset.plantName) {\n          plantName = selectedOption.dataset.plantName.trim();\n          isExistingPlant = true;\n          \n          console.log('\u65E2\u5B58\u690D\u7269\u9078\u629E\u78BA\u8A8D:', {\n            threadId: existingPlantId,\n            plantName: plantName\n          });\n        }\n      } else if (this.lastSelectedPlant) {\n        existingPlantId = this.lastSelectedPlant.id;\n        plantName = this.lastSelectedPlant.name;\n        isExistingPlant = true;\n        \n        console.log('\u8A18\u61B6\u3057\u305F\u690D\u7269\u60C5\u5831\u3092\u4F7F\u7528:', {\n          threadId: existingPlantId,\n          plantName: plantName\n        });\n      }\n    }\n\n    return { plantName, isExistingPlant, existingPlantId };\n  }\n\nfinalizeFormData(formData, plantName, isExistingPlant, existingPlantId) {\n    if (isExistingPlant && existingPlantId) {\n      formData.set('plant_name', plantName);\n      formData.set('plant_selection_type', 'existing');\n      formData.set('existing_plant_id', existingPlantId);\n      formData.append('existing_thread_id', existingPlantId);\n      \n      console.log('\u65E2\u5B58\u690D\u7269\u7528FormData\u8A2D\u5B9A:', {\n        plant_name: plantName,\n        existing_thread_id: existingPlantId\n      });\n    } else {\n      formData.set('plant_name', plantName);\n      formData.set('plant_selection_type', 'new');\n      \n      console.log('\u65B0\u898F\u690D\u7269\u7528FormData\u8A2D\u5B9A:', {\n        plant_name: plantName\n      });\n    }\n\nlet userEmail = this.userEmail || '';\nif (!userEmail) {\n  userEmail = this.getAnonymousId();\n  console.log('\uD83D\uDCE7 \u533F\u540DID\u4F7F\u7528:', userEmail);\n  \n  // \u2605\u2605\u2605 \u30D5\u30A3\u30F3\u30AC\u30FC\u30D7\u30EA\u30F3\u30C8\u8FFD\u52A0 \u2605\u2605\u2605\n  const fingerprint = this.getBrowserFingerprint();\n  if (fingerprint) {\n    formData.append('browser_fingerprint', fingerprint);\n    console.log('\uD83D\uDD0D \u30D5\u30A3\u30F3\u30AC\u30FC\u30D7\u30EA\u30F3\u30C8\u9001\u4FE1:', fingerprint);\n  }\n  // \u2605\u2605\u2605 \u3053\u3053\u307E\u3067\u8FFD\u52A0 \u2605\u2605\u2605\n  \n} else {\n  console.log('\uD83D\uDCE7 \u30ED\u30B0\u30A4\u30F3\u30E6\u30FC\u30B6\u30FC:', userEmail);\n}\nformData.append('user_email', userEmail);\n    const membershipType = this.getMembershipType();\n    if (membershipType !== 'non_member') {\n      const isPublicCheckbox = document.getElementById('is-public-checkbox');\n      const isPublic = isPublicCheckbox ? isPublicCheckbox.checked : false;\n      formData.append('is_public', isPublic ? 'true' : 'false');\n      console.log('\uD83D\uDCE2 SNS\u516C\u958B\u8A2D\u5B9A:', isPublic);\n    }\n    if (this.entitlement && typeof this.entitlement === 'object' && Object.keys(this.entitlement).length > 0) {\n      const safeEntitlement = {\n        status: this.entitlement.status,\n        plan_code: this.entitlement.plan_code,\n        expires_at: this.entitlement.expires_at\n      };\n      formData.append('entitlement', JSON.stringify(safeEntitlement));\n    }\n\n    if (this.entitlementSnapshot && typeof this.entitlementSnapshot === 'object' && Object.keys(this.entitlementSnapshot).length > 0) {\n      const safeSnapshot = {\n        status: this.entitlementSnapshot.status,\n        plan_code: this.entitlementSnapshot.plan_code,\n        expires_at: this.entitlementSnapshot.expires_at,\n        consultation_pack_count: this.entitlementSnapshot.consultation_pack_count,\n        illustration_pack_count: this.entitlementSnapshot.illustration_pack_count\n      };\n      formData.append('entitlement_snapshot', JSON.stringify(safeSnapshot));\n    }\n    \n    const safeSeason = {\n      season: this.seasonInfo?.season || 'winter',\n      seasonName: this.seasonInfo?.seasonName || '\u51AC',\n      seasonEmoji: this.seasonInfo?.seasonEmoji || '\u2744\uFE0F',\n      displayText: this.seasonInfo?.displayText || '\u2744\uFE0F \u51AC',\n      month: this.seasonInfo?.month || 12\n    };\n    formData.append('current_season', JSON.stringify(safeSeason));\n    \n    const consultationRequest = formData.get('consultation_request') || '';\n    const notes = formData.get('notes') || '';\n    const classification = this.classifyScene({ plantName, consultationRequest, notes, aiResponse: '' });\n\nconst forced = this.getForcedSceneFromText(`${consultationRequest} ${notes}`);\nconst scenePayload = {\n  scene: forced || classification.scene,\n  confidence: classification.confidence,\n  plant_type: classification.plantType,\n  forced: !!forced\n};\n\n    scenePayload.confidence = Number(scenePayload.confidence.toFixed(2));\n    console.log('scene_hint', scenePayload);\n\n    formData.append('scene_hint', JSON.stringify(scenePayload));\n\n    if (isExistingPlant && existingPlantId && plantName) {\n      const lockedName = (plantName || '').normalize('NFC').trim();\n      formData.append('selected_plant_name', lockedName);\n      formData.append(\n        'name_lock_policy',\n        'selected_plant_name \u3092\u7B2C1\u5019\u88DC\u3068\u3057\u3066\u6271\u3046\u3002\u5199\u771F\u304C\u660E\u78BA\u306B\u77DB\u76FE\u3059\u308B\u5834\u5408\u306E\u307F\u5225\u5019\u88DC\u3092\u6319\u3052\u3001\u305D\u306E\u6839\u62E0\uFF08\u523A\u5EA7\u306E\u5F62/\u5BC6\u5EA6\u3001\u8449\u539A\u3001\u8449\u5148\u306E\u5F62\u3001\u30EA\u30FC\u30D5\u30A4\u30F3\u30D7\u30EC\u30C3\u30B7\u30E7\u30F3\u7B49\uFF09\u3092\u7B87\u6761\u66F8\u304D\u3067\u6BD4\u8F03\u3059\u308B\u3002\u7121\u95A2\u4FC2\u306A\u56FA\u6709\u540D\u306F\u51FA\u3055\u306A\u3044\u3002'\n      );\n    }\n\n    const membership = this.getMembershipType();\n    const visionGuidance = [\n      '\u65E5\u672C\u8A9E\u3067\u7C21\u6F54\u306B\u3002\u5199\u771F\u3092\u4E3B\u8981\u6839\u62E0\u306B\u3001\u6700\u6709\u529B\u5019\u88DC(1\u301C2)\u3060\u3051\u3092\u63D0\u793A\u3057\u3001\u5404\u5019\u88DC\u306B\u3064\u3044\u3066\u300C\u8449\u306E\u539A\u307F/\u8272\u8ABF\u300D\u300C\u523A\u5EA7\u306E\u5F62\u300D\u300C\u523A\u306E\u592A\u3055\u30FB\u9593\u9694\u300D\u300C\u30ED\u30BC\u30C3\u30C8\u5BC6\u5EA6\u300D\u300C\u8449\u7E01\u306E\u6CE2\u6253\u3061\u300D\u306E\u89B3\u5BDF\u6839\u62E0\u30921\u884C\u305A\u3064\u6BD4\u8F03\u5BFE\u6BD4\u3059\u308B\uFF08\u8868\u73FE\u306F\u77ED\u6587\u7B87\u6761\u66F8\u304D\uFF09\u3002',\n      '\u65AD\u5B9A\u306F\u907F\u3051\u3064\u3064\u3082\u66D6\u6627\u8A9E\u306E\u9023\u767A\u306F\u3057\u306A\u3044\u3002\u300C\u6700\u6709\u529B\u300D\u300C\u6B21\u70B9\u300D\u306E\u3088\u3046\u306B\u512A\u52A3\u3092\u5FC5\u305A\u3064\u3051\u308B\u3002',\n      '\u300C\u4ECA\u3059\u3050\u3084\u308B\u3053\u3068\u300D\u3092\u6700\u59273\u3064\u306B\u7D5E\u308A\u3001\u756A\u53F7\u4ED8\u304D\u3067\u5177\u4F53\u7684\u306A\u64CD\u4F5C\u5358\u4F4D\u306B\u5206\u89E3\uFF08\u4F8B: 1) \u4E7E\u304D\u30C1\u30A7\u30C3\u30AF\u21922) \u7528\u571F\u306E\u901A\u6C17\u6539\u5584\u21923) \u76F4\u5C04\u306E\u6642\u9593\u5236\u9650\uFF09\u3002',\n      '\u5199\u771F\u304C\u4E0D\u5341\u5206\u306A\u3089\u300C\u89B3\u5BDF\u30DD\u30A4\u30F3\u30C8\uFF083\u3064\uFF09\u300D\u3068\u300C\u518D\u64AE\u5F71\u306E\u6307\u793A\uFF08\u89D2\u5EA6/\u8DDD\u96E2/\u660E\u308B\u3055/\u80CC\u666F\uFF09\u300D\u3092\u5FC5\u305A\u51FA\u3059\u3002',\n      '\u523A\u306E\u53D6\u308A\u6271\u3044\u306A\u3069\u5B89\u5168\u6CE8\u610F\u304C\u3042\u308C\u3070\u6700\u5F8C\u306B1\u884C\u3067\u6CE8\u610F\u559A\u8D77\u3002',\n      '\u30A2\u30AC\u30D9\u7CFB\u3067\u306F\u6C34\u3084\u308A/\u5149/\u6E29\u5EA6/\u7528\u571F\u3092\u54041\u884C\u3001\u5B63\u7BC0\uFF08current_season\uFF09\u306E\u50BE\u5411\u306B\u5408\u308F\u305B\u3066\u983B\u5EA6\u306E\u5F37\u5F31\u3082\u77ED\u304F\u793A\u3059\u3002'\n    ];\n\n    if (membership === 'paid_member') {\n      visionGuidance.push('\u5019\u88DC\u3054\u3068\u306B\u6C34\u3084\u308A/\u5149/\u6E29\u5EA6/\u571F\u306E\u8981\u70B9\u30921\u884C\u305A\u3064\u6DFB\u3048\u308B\u3002');\n    }\n\n    formData.append('vision_guidance', visionGuidance.join(' '));\n    formData.append(\n      'photo_first_policy',\n      '\u56DE\u7B54\u306F\u5FC5\u305A\u5199\u771F\u3092\u4E3B\u8981\u6839\u62E0\u306B\u3002\u672A\u6DFB\u4ED8\u6642\u306F\u767B\u9332\u5199\u771F(reference_image_url)\u3092\u4F7F\u7528\u3002\u3069\u3061\u3089\u3082\u7121\u3044\u5834\u5408\u306E\u307F\u5019\u88DC\uFF0B\u89B3\u5BDF\u30DD\u30A4\u30F3\u30C8\uFF0B\u518D\u64AE\u5F71\u6307\u793A\u3067\u88DC\u5B8C\u3057\u3001\u66D6\u6627\u306A\u5426\u5B9A\u306F\u3057\u306A\u3044\u3002'\n    );\n\n    formData.append('client_image_autogen_enabled', 'false');\n  }\n\n  async handleSuccessfulSubmission(data, isRecordOnly, plantName, membershipType, isExistingPlant, existingPlantId, consultationRequest, notes) {\n\n    const statusDiv = document.getElementById('form-status');\n    const postId = data.post_id;\n    \n    if (isExistingPlant && existingPlantId) {\n      this.lastSelectedPlant = {\n        id: existingPlantId,\n        name: plantName\n      };\n      console.log('\u65E2\u5B58\u690D\u7269\u9078\u629E\u3092\u8A18\u9332:', this.lastSelectedPlant);\n    } else {\n      this.lastSelectedPlant = null;\n      console.log('\u65B0\u898F\u690D\u7269\u306E\u305F\u3081\u9078\u629E\u72B6\u614B\u3092\u30AF\u30EA\u30A2');\n    }\n    \n\n    // \u307E\u305AUI\u3092\u63CF\u753B\uFF08\u3053\u3053\u3067 .success-message/.ai-generated-image \u306E\u30B3\u30F3\u30C6\u30CA\u304C\u51FA\u6765\u308B\uFF09\n    if (data.record_only) {\n      statusDiv.innerHTML = this.renderRecordOnlySuccess(data, plantName, postId, membershipType);\n    } else if (data.non_plant_response) {\n      statusDiv.innerHTML = this.renderNonPlantResponse(data);\n    } else {\n      statusDiv.innerHTML = this.renderFullConsultationSuccess(data, plantName, postId, membershipType);\n    }\n\n    // \u25BC \u305D\u306E\u5F8C\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u751F\u6210\uFF08\u63CF\u753B\u5B8C\u4E86\u5F8C\u306A\u306E\u3067DOM\u306B\u633F\u5165\u30FB\u5DEE\u3057\u66FF\u3048\u304C\u78BA\u5B9F\uFF09\nif (!data.record_only && !data.non_plant_response) {\n  try {\nconst needServerSide =\n  membershipType === 'paid_member' &&\n  !data.ai_generated_image_url &&\n  data.illustration_requested === true &&  // \u2605 !== false \u2192 === true \u306B\u5909\u66F4\n  (window.LEAFLA?.features?.text_free_illustration !== false);\n\nif (needServerSide) {\n  // \u2605 \u4FEE\u6B63\uFF1AFormData\u304B\u3089\u5B9F\u969B\u306E\u5024\u3092\u53D6\u5F97\n  const formElement = document.getElementById('consultation-form');\n  const currentFormData = new FormData(formElement);\n  \n  const actualConsultationRequest = currentFormData.get('consultation_request') || '';\n  const actualNotes = currentFormData.get('notes') || '';\n  \n  const hint = this.classifyScene({ \n    plantName, \n    consultationRequest: actualConsultationRequest, \n    notes: actualNotes, \n    aiResponse: data.ai_response || '' \n  });\n  \n  const forced = this.getForcedSceneFromText(`${actualConsultationRequest} ${actualNotes}`);\n  const scene = forced || hint.scene;\n  const plantType = hint.plantType;\n\n  const targetThreadId = (isExistingPlant && existingPlantId) \n                          ? existingPlantId \n                          : data.thread_id || data.post_id;\n\n// \u76F4\u524D\u3067 actualConsultationRequest / actualNotes \u3092\u53D6\u5F97\u3057\u3066\u3044\u308B\u306E\u3067\u3001\u305D\u308C\u3092\u6E21\u3059\nconst imageUrl = await this.requestServerIllustrationPatch({\n  plantName,\n  scene,\n  plantType,\n  postId: data.post_id,\n  threadId: targetThreadId,\n  aiResponse: data.ai_response,\n  consultationRequest: actualConsultationRequest, // \u2605\u3053\u3053\u3092\u4FEE\u6B63\n  notes: actualNotes                              // \u2605\u3053\u3053\u3092\u4FEE\u6B63\n});\n\n\n\nif (imageUrl) {\n  // \u65E2\u5B58\u67A0\u304C\u3042\u308C\u3070\u5DEE\u3057\u66FF\u3048\u3001\u7121\u3051\u308C\u3070\u5B63\u7BC0\u30B1\u30A2\u63D0\u6848\u306E\u5F8C\u306B\u633F\u5165\n  const img = document.querySelector('.ai-generated-image .image-container img');\n  if (img) {\n    img.src = imageUrl;\n  } else {\n    // \u5B63\u7BC0\u30B1\u30A2\u63D0\u6848\u306E\u5F8C\u306B\u633F\u5165\n    const seasonalSection = document.querySelector('.seasonal-care-suggestion');\n    if (seasonalSection) {\n      seasonalSection.insertAdjacentHTML('afterend', `\n        <div class=\"ai-generated-image\">\n          <h5>\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8</h5>\n          <div class=\"image-container\">\n            <img src=\"${imageUrl}\" alt=\"\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\" style=\"max-width: 100%; border-radius: 8px; cursor: pointer;\" loading=\"lazy\"\n                 onclick=\"window.plantApp.showImageFullscreen('${imageUrl}', '\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8')\">\n            <div class=\"watermark\">LEAFLA</div>\n          </div>\n        </div>\n      `);\n    } else {\n      const wrap = document.querySelector('.success-message') || statusDiv;\n      wrap.insertAdjacentHTML('beforeend', `\n        <div class=\"ai-generated-image\">\n          <h5>\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8</h5>\n          <div class=\"image-container\">\n            <img src=\"${imageUrl}\" alt=\"\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\" style=\"max-width: 100%; border-radius: 8px; cursor: pointer;\" loading=\"lazy\"\n                 onclick=\"window.plantApp.showImageFullscreen('${imageUrl}', '\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8')\">\n            <div class=\"watermark\">LEAFLA</div>\n          </div>\n        </div>\n      `);\n    }\n  }\n}\n    }\n  } catch (e) {\n    console.warn('\u30B5\u30FC\u30D0\u30FC\u5074\u753B\u50CF\u751F\u6210\u547C\u3073\u51FA\u3057\u3067\u4F8B\u5916:', e);\n    this.showTemporaryNotification('\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u306B\u5931\u6557\uFF08\u901A\u4FE1\u30A8\u30E9\u30FC\uFF09', 'error');\n  }\n}\n\n\n    const form = document.getElementById('consultation-form');\n    form.reset();\n    document.getElementById('image-preview').innerHTML = '';\n\n    if (this.lastSelectedPlant && membershipType !== 'non_member') {\n      console.log('\u690D\u7269\u9078\u629E\u72B6\u614B\u3092\u5FA9\u5143\u958B\u59CB:', this.lastSelectedPlant);\n      this.restorePlantSelection();\n    }\n\nif (membershipType !== 'non_member') {\n  // \u690D\u7269\u30EA\u30B9\u30C8\u66F4\u65B0\u5B8C\u4E86\u3092\u5F85\u3064\n  await Promise.all([\n    this.loadUserThreads(),\n    this.loadExistingPlantsForSelection()\n  ]);\n  \n  console.log('\u6295\u7A3F\u5F8C\u306E\u690D\u7269\u6570:', this.existingPlants.length);\n  \n  // \u30AF\u30AA\u30FC\u30BF\u8868\u793A\u3092\u66F4\u65B0\uFF08\u6700\u65B0\u306E\u690D\u7269\u6570\u3092\u53CD\u6620\uFF09\n  this.applyQuotaFromResponse({\n    plant_count: this.existingPlants.length,\n    ...data\n  });\n  \n  if (this.lastSelectedPlant) {\n    setTimeout(() => {\n      this.restorePlantSelection();\n    }, 300);\n  }\n} else {\n  this.applyQuotaFromResponse?.(data);\n}\n  }\n\nrenderFullConsultationSuccess(data, plantName, postId, membershipType) {\n  return `<div class=\"success-message\">\n      <h4>\u5206\u6790\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\uFF01</h4>\n      \n      <div class=\"ai-response-section\">\n        <h5>AI\u5206\u6790\u7D50\u679C:</h5>\n        <div class=\"response-content\">${this.formatResponse(data.ai_response)}</div>\n        <div class=\"analysis-info\">\n          <small>\u5206\u6790\u6642\u306E\u5B63\u7BC0\u60C5\u5831: ${this.seasonInfo.displayText}\u3092\u8003\u616E</small>\n        </div>\n        <div class=\"ai-disclaimer-note\" style=\"margin-top:10px;padding:8px 12px;background:#fffbea;border:1px solid #f0c040;border-radius:6px;font-size:11px;color:#6b5200;line-height:1.6;\">\n          \u26A0\uFE0F \u3053\u306E\u56DE\u7B54\u306FAI\u306B\u3088\u308B\u53C2\u8003\u60C5\u5831\u3067\u3059\u3002\u6B63\u78BA\u6027\u30FB\u5B8C\u5168\u6027\u3092\u4FDD\u8A3C\u3059\u308B\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u690D\u7269\u306E\u72B6\u614B\u306B\u95A2\u3059\u308B\u6700\u7D42\u5224\u65AD\u306F\u3054\u81EA\u8EAB\u3067\u304A\u9858\u3044\u3057\u307E\u3059\u3002<a href=\"/pages/terms\" target=\"_blank\" style=\"color:#1B8F5A;\">\u5229\u7528\u898F\u7D04</a>\n        </div>\n      </div>\n        \n        ${data.ai_generated_image_url ? `\n          <div class=\"ai-generated-image\">\n            <h5>\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\uFF08\u753B\u50CF\u751F\u6210\uFF09</h5>\n            <div class=\"image-container\">\n              <img src=\"${data.ai_generated_image_url}\"\n                   alt=\"\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\"\n                   onclick=\"window.plantApp.showImageFullscreen('${data.ai_generated_image_url}', '\u690D\u7269\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8')\"\n                   style=\"max-width: 100%; border-radius: 8px; cursor: pointer;\"\n                   loading=\"lazy\">\n              <div class=\"watermark\">LEAFLA</div>\n            </div>\n            <p>\u76F8\u8AC7\u5185\u5BB9\u304B\u3089\u6700\u9069\u306A\u30B1\u30A2\u30B7\u30FC\u30F3\u3092\u30A4\u30E9\u30B9\u30C8\u3067\u8868\u73FE</p>\n            <div class=\"image-generation-info\">\n              <small>\u6709\u6599\u4F1A\u54E1\u7279\u5178: AI\u753B\u50CF\u751F\u6210\u6A5F\u80FD\uFF08Gemini 2.5-flash-image-preview\uFF09</small>\n            </div>\n            ${membershipType === 'paid_member' ? `\n            <div style=\"margin-top:12px;\">\n              <button class=\"btn-illustration-goods\"\n                onclick=\"window.plantApp.openIllustrationShop('${data.ai_generated_image_url}', '${postId || ''}')\"\n                style=\"background:#4caf50;color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;\">\n                \uD83D\uDECD \u3053\u306E\u30A4\u30E9\u30B9\u30C8\u3067\u30B0\u30C3\u30BA\u3092\u4F5C\u308B\n              </button>\n            </div>\n            ` : ''}\n          </div>\n        ` : ''}\n        \n        ${membershipType !== 'non_member' && postId ? `\n          <div class=\"record-saved-notice\">\n            <p>\u3053\u306E\u80B2\u6210\u8A18\u9332\u306F\u300C${plantName}\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F</p>\n            <p><strong>\u3053\u306E\u6295\u7A3F\u306B\u5BFE\u3057\u30665\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7</strong>\u304C\u3067\u304D\u307E\u3059</p>\n          </div>\n          \n          ${this.renderFollowUpSection(postId, 0)}\n        ` : ''}\n\n        <div class=\"seasonal-care-suggestion\">\n          <h6>${this.seasonInfo.seasonEmoji} \u4ECA\u306E\u5B63\u7BC0\u306E\u30B1\u30A2\u30DD\u30A4\u30F3\u30C8</h6>\n          <p>${this.getSeasonalCareMessage(this.seasonInfo.season)}</p>\n          ${membershipType === 'paid_member' ? \n            '<small>\u6709\u6599\u4F1A\u54E1: \u30B1\u30A2\u901A\u77E5\u6A5F\u80FD\u3067\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u7BA1\u7406\u3092\u30B5\u30DD\u30FC\u30C8\u4E2D</small>' : \n            '<small>\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u901A\u77E5\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u6A5F\u80FD\u3067\u3059</small>'\n          }\n          \n        </div>\n\n      \n      ${/* RECOMMENDATIONS_ENABLED \u304C true \u306B\u306A\u3063\u305F\u3089\u6709\u52B9\u5316 */ RECOMMENDATIONS_ENABLED && data.product_recommendations && data.product_recommendations.length > 0 ? `\n        <div class=\"product-recommendations-section\">\n          <h5>\u304A\u3059\u3059\u3081\u5546\u54C1</h5>\n          ${data.product_recommendations.map(product => `\n            <div class=\"recommendation-item ${product.is_pr ? 'pr-item' : ''}\">\n              <div class=\"rec-header\">\n                <h6>${this.escapeHtml(product.product_name)}</h6>\n                ${product.is_pr ? '<span class=\"pr-badge\">PR</span>' : ''}\n              </div>\n              <p>${this.escapeHtml(product.description || '')}</p>\n              <div class=\"product-details\">\n                ${product.price_range ? `<span class=\"price-range\">${this.escapeHtml(product.price_range)}</span>` : ''}\n              </div>\n              <a href=\"${product.product_url}\" target=\"_blank\" class=\"btn btn-small btn-secondary\">\n                \u5546\u54C1\u3092\u898B\u308B\n              </a>\n            </div>\n          `).join('')}\n        </div>\n      ` : ''}\n\n      ${/* RECOMMENDATIONS_ENABLED \u304C true \u306B\u306A\u3063\u305F\u3089\u6709\u52B9\u5316 */ RECOMMENDATIONS_ENABLED && data.article_recommendations && data.article_recommendations.length > 0 ? `\n        <div class=\"article-recommendations-section\">\n          <h5>\u53C2\u8003\u8A18\u4E8B</h5>\n          ${data.article_recommendations.map(article => `\n            <div class=\"recommendation-item\">\n              <h6>${this.escapeHtml(article.title)}</h6>\n              <p>${this.escapeHtml(article.summary || '')}</p>\n              <a href=\"${article.url}\" target=\"_blank\" class=\"btn btn-small btn-tertiary\">\n                \u8A18\u4E8B\u3092\u8AAD\u3080\n              </a>\n            </div>\n          `).join('')}\n        </div>\n      ` : ''}\n\n      ${this.renderSlot('result-bottom')}\n\n      </div>`;\n  }\n\n  renderRecordOnlySuccess(data, plantName, postId, membershipType) {\n    return `<div class=\"success-message\">\n        <h4>\u8A18\u9332\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\uFF01</h4>\n        \n        <div class=\"record-only-notice\">\n          <h5>\u80B2\u6210\u8A18\u9332\u3068\u3057\u3066\u4FDD\u5B58</h5>\n          <div class=\"record-details\">\n            <p><strong>\u690D\u7269\u540D:</strong> \u300C${this.escapeHtml(plantName)}\u300D</p>\n            <p><strong>\u8A18\u9332\u5185\u5BB9:</strong> ${this.escapeHtml(data.notes || '\u8A18\u9332\u6E08\u307F')}</p>\n            <p><strong>\u4FDD\u5B58\u65E5\u6642:</strong> ${new Date().toLocaleString('ja-JP')}</p>\n            <p><strong>\u5B63\u7BC0\u60C5\u5831:</strong> ${this.seasonInfo.displayText}\u3068\u3057\u3066\u8A18\u9332</p>\n          </div>\n          <div class=\"record-only-info\">\n            <p><strong>\u8A18\u9332\u306E\u307F\u6295\u7A3F</strong>\u306E\u305F\u3081\u3001AI\u5206\u6790\u306F\u5B9F\u884C\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F</p>\n            <p>\u76F8\u8AC7\u3057\u305F\u3044\u5834\u5408\u306F\u300C\u80B2\u3066\u65B9\u306B\u3064\u3044\u3066\u76F8\u8AC7\u3057\u305F\u3044\u3053\u3068\u300D\u6B04\u306B\u5185\u5BB9\u3092\u8A18\u5165\u3057\u3066\u304F\u3060\u3055\u3044</p>\n          </div>\n        </div>\n        \n        ${membershipType !== 'non_member' && postId ? `\n          <div class=\"record-saved-notice\">\n            <p>\u3053\u306E\u80B2\u6210\u8A18\u9332\u306F\u300C${plantName}\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F</p>\n            <p><strong>\u3053\u306E\u6295\u7A3F\u306B\u5BFE\u3057\u30665\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7</strong>\u304C\u3067\u304D\u307E\u3059</p>\n          </div>\n          \n          ${this.renderFollowUpSection(postId, 0)}\n        ` : ''}\n        \n        <div class=\"seasonal-tips-success\">\n          <h6>${this.seasonInfo.seasonEmoji} ${this.seasonInfo.seasonName}\u306E\u30B1\u30A2\u306E\u30B3\u30C4</h6>\n          <p>${this.getSeasonalCareMessage(this.seasonInfo.season)}</p>\n        </div>\n      </div>`;\n  }\n\n  renderNonPlantResponse(data) {\n    return `<div class=\"info-message\">\n        <h4>\u690D\u7269\u80B2\u6210\u5C02\u9580\u30B5\u30FC\u30D3\u30B9</h4>\n        <div class=\"non-plant-response\">\n          <div class=\"response-content\">${this.formatResponse(data.ai_response)}</div>\n          <div class=\"service-guide\">\n            <h6>LEAFLA\u3067\u3054\u76F8\u8AC7\u3044\u305F\u3060\u3051\u308B\u5185\u5BB9</h6>\n            <div class=\"consultation-examples\">\n              <div class=\"example-category\">\n                <strong>\u690D\u7269\u306E\u72B6\u614B\u306B\u3064\u3044\u3066</strong>\n                <ul>\n                  <li>\u8449\u306E\u8272\u304C\u5909\u308F\u3063\u3066\u304D\u305F</li>\n                  <li>\u5143\u6C17\u304C\u306A\u3044\u3088\u3046\u306B\u898B\u3048\u308B</li>\n                  <li>\u6210\u9577\u304C\u6B62\u307E\u3063\u3066\u3044\u308B</li>\n                  <li>\u8449\u304C\u9EC4\u8272\u304F\u306A\u3063\u3066\u3044\u308B</li>\n                  <li>\u65B0\u82BD\u304C\u51FA\u306A\u3044</li>\n                </ul>\n              </div>\n              <div class=\"example-category\">\n                <strong>\u30B1\u30A2\u65B9\u6CD5\u306B\u3064\u3044\u3066</strong>\n                <ul>\n                  <li>\u6C34\u3084\u308A\u306E\u983B\u5EA6\u3084\u30BF\u30A4\u30DF\u30F3\u30B0</li>\n                  <li>\u80A5\u6599\u306E\u7A2E\u985E\u3084\u4E0E\u3048\u65B9</li>\n                  <li>\u65E5\u5149\u306E\u5F53\u3066\u65B9</li>\n                  <li>\u6E7F\u5EA6\u306E\u7BA1\u7406\u65B9\u6CD5</li>\n                  <li>\u51AC\u8D8A\u3057\u306E\u65B9\u6CD5</li>\n                </ul>\n              </div>\n              <div class=\"example-category\">\n                <strong>\u7BA1\u7406\u4F5C\u696D\u306B\u3064\u3044\u3066</strong>\n                <ul>\n                  <li>\u690D\u3048\u66FF\u3048\u306E\u65B9\u6CD5\u3084\u6642\u671F</li>\n                  <li>\u526A\u5B9A\u306E\u4ED5\u65B9</li>\n                  <li>\u75C5\u6C17\u3084\u5BB3\u866B\u306E\u5BFE\u7B56</li>\n                  <li>\u5897\u6B96\u65B9\u6CD5</li>\n                  <li>\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u30B1\u30A2</li>\n                </ul>\n              </div>\n            </div>\n            <div class=\"specialized-note\">\n              <p><strong>\u5C02\u9580\u7279\u5316</strong>\u306B\u3088\u308A\u3001\u690D\u7269\u306B\u95A2\u3059\u308B\u8CEA\u554F\u306B\u3088\u308A\u9069\u5207\u306B\u304A\u7B54\u3048\u3067\u304D\u307E\u3059</p>\n            </div>\n          </div>\n        </div>\n      </div>`;\n  }\n\n  renderFollowUpSection(postId, currentCount) {\n    const remainingCount = 5 - currentCount;\n    \n    return `<div class=\"follow-up-section\" id=\"follow-up-section-${postId}\">\n        <h5>\u3053\u306E\u8A18\u9332\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u76F8\u8AC7\u3059\u308B (${currentCount}/5)</h5>\n        \n        ${remainingCount > 0 ? `\n          <div class=\"follow-up-form\">\n            <textarea id=\"follow-up-text-${postId}\" \n                      placeholder=\"\u3053\u306E\u8A18\u9332\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u8CEA\u554F\u3057\u305F\u3044\u3053\u3068\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\n\n\u4F8B: \n- \u3053\u306E\u72B6\u614B\u306F\u6B63\u5E38\u3067\u3059\u304B\uFF1F\n- \u6C34\u3084\u308A\u306E\u30BF\u30A4\u30DF\u30F3\u30B0\u306F\uFF1F\n- \u6B21\u306E\u30B1\u30A2\u3067\u6C17\u3092\u3064\u3051\u308B\u3053\u3068\u306F\uFF1F\n- ${this.seasonInfo.seasonName}\u306E\u9593\u306B\u7279\u306B\u6CE8\u610F\u3059\u3079\u304D\u3053\u3068\u306F\uFF1F\" \n                      rows=\"3\"></textarea>\n            <div class=\"follow-up-actions\">\n              <button onclick=\"window.plantApp.submitFollowUp('${postId}')\" class=\"btn btn-secondary\">\n                \u8FFD\u52A0\u76F8\u8AC7\u3059\u308B (\u6B8B\u308A${remainingCount}\u56DE)\n              </button>\n              <button onclick=\"window.plantApp.showFollowUpModal('${postId}')\" class=\"btn btn-tertiary\">\n                \u8A73\u7D30\u306A\u8FFD\u52A0\u76F8\u8AC7\u30D5\u30A9\u30FC\u30E0\n              </button>\n            </div>\n            <div class=\"follow-up-tips\">\n              <small>\n                \u5B63\u7BC0\u60C5\u5831\uFF08${this.seasonInfo.displayText}\uFF09\u3082\u8003\u616E\u3057\u305F\u8A73\u7D30\u56DE\u7B54\u3092\u53D7\u3051\u3089\u308C\u307E\u3059\n              </small>\n            </div>\n          </div>\n        ` : `\n          <div class=\"follow-up-limit-reached\">\n            <p class=\"limit-reached\">\u3053\u306E\u8A18\u9332\u3078\u306E\u8FFD\u52A0\u76F8\u8AC7\u306F5\u56DE\u306B\u9054\u3057\u307E\u3057\u305F</p>\n            <div class=\"limit-reached-info\">\n              <p><small>\u65B0\u3057\u3044\u6295\u7A3F\u3092\u3059\u308B\u3053\u3068\u3067\u3001\u307E\u305F5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7\u3067\u304D\u307E\u3059</small></p>\n            </div>\n          </div>\n        `}\n        \n        <div id=\"follow-ups-list-${postId}\" class=\"follow-ups-list\">\n          <!-- \u8FFD\u52A0\u76F8\u8AC7\u5C65\u6B74\u304C\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u308B -->\n        </div>\n      </div>`;\n  }\n\n  handlePlantLimitError(data) {\n    const statusDiv = document.getElementById('form-status');\n    \n    statusDiv.innerHTML = `\n      <div class=\"error-message plant-limit-error\">\n        <h4>\u690D\u7269\u767B\u9332\u6570\u5236\u9650\u306B\u9054\u3057\u307E\u3057\u305F</h4>\n        <div class=\"limit-info\">\n          <p><strong>\u73FE\u5728\u306E\u72B6\u6CC1:</strong></p>\n          <ul>\n            <li>\u767B\u9332\u6E08\u307F\u690D\u7269: ${data.current_count || 0}\u500B</li>\n            <li>\u30D7\u30E9\u30F3\u4E0A\u9650: ${data.limit || 0}\u500B</li>\n            <li>\u4F1A\u54E1\u7A2E\u5225: ${data.membership_type === 'free_member' ? '\u7121\u6599\u4F1A\u54E1' : '\u4E00\u822C\u4F1A\u54E1'}</li>\n          </ul>\n        </div>\n        \n        ${data.upgrade_required ? `\n          <div class=\"upgrade-suggestion\">\n            <h5>\u6709\u6599\u4F1A\u54E1\u306B\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3067\u89E3\u6C7A</h5>\n            <div class=\"upgrade-comparison\">\n              <div class=\"current-plan\">\n                <h6>\u73FE\u5728\uFF08\u7121\u6599\u4F1A\u54E1\uFF09</h6>\n                <ul>\n                  <li>\u690D\u7269\u767B\u9332: 20\u500B\u307E\u3067</li>\n                  <li>\u30B1\u30A2\u901A\u77E5: \u306A\u3057</li>\n                  <li>\u753B\u50CF\u751F\u6210: \u306A\u3057</li>\n                </ul>\n              </div>\n              <div class=\"upgrade-plan\">\n                <h6>\u6709\u6599\u4F1A\u54E1\uFF08\u6708\u984D300\u5186\uFF09</h6>\n                <ul>\n                  <li>\u690D\u7269\u767B\u9332: <strong>50\u500B\u307E\u3067</strong></li>\n                  <li>\u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u901A\u77E5\u6A5F\u80FD</li>\n                  <li>AI\u753B\u50CF\u751F\u6210\uFF08\u6708100\u56DE\uFF09</li>\n                  <li>\u9AD8\u54C1\u8CEA\u5206\u6790</li>\n                </ul>\n              </div>\n            </div>\n            <div class=\"upgrade-action\">\n              <a href=\"/pages/botanical-record#plans\" class=\"btn btn-primary\">\n                \u6709\u6599\u30D7\u30E9\u30F3\u3092\u898B\u308B\uFF08\u6700\u5B89 \u6708\u00A5250\u301C\uFF09\n              </a>\n              <p><small>\u3044\u3064\u3067\u3082\u89E3\u7D04\u53EF\u80FD</small></p>\n            </div>\n          </div>\n        ` : ''}\n        \n        <div class=\"alternative-solutions\">\n          <h6>\u307E\u305F\u306F\u4EE5\u4E0B\u306E\u65B9\u6CD5\u3082\u3054\u5229\u7528\u3044\u305F\u3060\u3051\u307E\u3059</h6>\n          <div class=\"solution-option\">\n            <h7>\u65E2\u5B58\u690D\u7269\u306B\u8A18\u9332\u3092\u8FFD\u52A0</h7>\n            <p>\u65B0\u898F\u690D\u7269\u3092\u767B\u9332\u305B\u305A\u306B\u3001\u65E2\u5B58\u306E\u690D\u7269\u306B\u80B2\u6210\u8A18\u9332\u3092\u8FFD\u52A0\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u300C\u65E2\u5B58\u306E\u690D\u7269\u306B\u80B2\u6210\u8A18\u9332\u3092\u8FFD\u52A0\u300D\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002</p>\n          </div>\n          <div class=\"solution-option\">\n            <h7>\u4E0D\u8981\u306A\u690D\u7269\u8A18\u9332\u306E\u524A\u9664</h7>\n            <p>\u4F7F\u7528\u3057\u3066\u3044\u306A\u3044\u690D\u7269\u8A18\u9332\u3092\u524A\u9664\u3059\u308B\u3053\u3068\u3067\u3001\u65B0\u3057\u3044\u690D\u7269\u3092\u767B\u9332\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059\u3002</p>\n          </div>\n        </div>\n        \n        <div class=\"contact-suggestion\">\n          <p>\u3054\u4E0D\u660E\u306A\u70B9\u304C\u3054\u3056\u3044\u307E\u3057\u305F\u3089<a href=\"/pages/contact\" target=\"_blank\">\u304A\u554F\u3044\u5408\u308F\u305B</a>\u304F\u3060\u3055\u3044\u3002</p>\n        </div>\n      </div>\n    `;\n  }\n\n  handleSubmissionError(data) {\n    const statusDiv = document.getElementById('form-status');\n    \n    statusDiv.innerHTML = `\n      <div class=\"error-message\">\n        <h4>\u51E6\u7406\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F</h4>\n        <div class=\"error-details\">\n          <p><strong>\u30A8\u30E9\u30FC\u5185\u5BB9:</strong> ${data.error}</p>\n          ${data.error_code ? `<p><strong>\u30A8\u30E9\u30FC\u30B3\u30FC\u30C9:</strong> ${data.error_code}</p>` : ''}\n        </div>\n        \n        <div class=\"error-troubleshooting\">\n          <h6>\u5BFE\u51E6\u65B9\u6CD5:</h6>\n          <ul>\n            <li>\u5165\u529B\u5185\u5BB9\u306B\u554F\u984C\u304C\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044</li>\n            <li>\u753B\u50CF\u30D5\u30A1\u30A4\u30EB\u304C10MB\u4EE5\u4E0B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044</li>\n            <li>\u30A4\u30F3\u30BF\u30FC\u30CD\u30C3\u30C8\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044</li>\n            <li>\u5C11\u3057\u6642\u9593\u3092\u304A\u3044\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044</li>\n          </ul>\n        </div>\n        \n        <div class=\"error-actions\">\n          <button onclick=\"document.getElementById('form-status').innerHTML=''\" class=\"btn btn-secondary btn-small\">\n            \u30A8\u30E9\u30FC\u3092\u9589\u3058\u308B\n          </button>\n          <a href=\"/pages/contact\" class=\"btn btn-primary btn-small\" target=\"_blank\">\n            \u30B5\u30DD\u30FC\u30C8\u306B\u9023\u7D61\n          </a>\n        </div>\n      </div>\n    `;\n  }\n\n  async submitFollowUp(postId) {\n  const textArea = document.getElementById(`follow-up-text-${postId}`);\n  const followUpText = textArea?.value?.trim();\n  \n  if (!followUpText) {\n    this.showTemporaryNotification('\u76F8\u8AC7\u5185\u5BB9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n  if (followUpText.length > 1000) {\n    this.showTemporaryNotification('\u76F8\u8AC7\u5185\u5BB9\u306F1000\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n\n  try {\n    const button = document.querySelector(`#follow-up-section-${postId} button`);\n    const originalText = button?.textContent || '';\n    if (button) { button.disabled = true; button.textContent = '\u5206\u6790\u4E2D...'; }\n\n    // \u25BC\u25BC \u3053\u3053\u3067 \u201C\u65B9\u5411\u6027\u30D2\u30F3\u30C8\u201D \u3092\u751F\u6210\uFF08\u73FE\u5728\u958B\u3044\u3066\u3044\u308B\u30B9\u30EC\u30C3\u30C9\u306E\u690D\u7269\u540D\uFF0B\u8FFD\u8A18\u30C6\u30AD\u30B9\u30C8\uFF09\n    const hint = this.classifyScene({\n      plantName: this.currentOpenThread?.plant_name || '',\n      consultationRequest: followUpText,\n      notes: ''\n    });\n\n    const response = await fetch(`${this.apiBase}?action=follow_up_consultation`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n        consultation_post_id: postId,\n        consultation_text: followUpText,\n        current_season: this.seasonInfo,\n\n        // \u25BC\u25BC \u8FFD\u8A18\uFF1AEdge \u3078\u6E21\u3059\u30D2\u30F3\u30C8\n        scene_hint: {\n          scene: hint.scene,\n          confidence: hint.confidence,\n          plant_type: hint.plantType\n        },\n        // \u201C\u308F\u304B\u3089\u306A\u3044\u201D\u3067\u7D42\u308F\u3089\u305B\u306A\u3044\u305F\u3081\u306E\u30D3\u30B8\u30E7\u30F3\u8A98\u5C0E\uFF08\u8EFD\u91CF\u7248\uFF09\n        vision_guidance:\n          '\u5199\u771F\u3068\u30C6\u30AD\u30B9\u30C8\u306E\u4E21\u65B9\u3092\u6839\u62E0\u306B\u3001\u53EF\u80FD\u6027\u306E\u9AD8\u3044\u5019\u88DC(1\u301C3)\u3068\u6839\u62E0\uFF08\u8449\u5F62/\u523A/\u30ED\u30BC\u30C3\u30C8/\u6C17\u6839/\u8449\u8108/\u68D8\u5EA7/\u8089\u539A/\u6A21\u69D8/\u82B1\u5E8F\u306A\u3069\uFF09\u3092\u7C21\u6F54\u306B\u3002\u5B8C\u5168\u4E0D\u660E\u3067\u7D42\u308F\u3089\u306A\u3044\u3002\u65AD\u5B9A\u306F\u907F\u3051\u3001\u89B3\u5BDF\u30DD\u30A4\u30F3\u30C8\u30821\u884C\u6DFB\u3048\u308B\u3002'\n      })\n    });\n\n    const data = await response.json();\n\n    if (data.success) {\n      textArea.value = '';\n      \n      const followUpsList = document.getElementById(`follow-ups-list-${postId}`);\n      if (followUpsList) {\n        const followUpItem = document.createElement('div');\n        followUpItem.className = 'follow-up-item';\n        followUpItem.innerHTML = `\n          <div class=\"follow-up-header\">\n            <span class=\"sequence\">\u8FFD\u52A0\u76F8\u8AC7 ${data.sequence_number}/5</span>\n            <span class=\"timestamp\">${new Date().toLocaleString('ja-JP')}</span>\n          </div>\n          <div class=\"follow-up-question\"><strong>\u8CEA\u554F:</strong> ${this.escapeHtml(followUpText)}</div>\n          <div class=\"follow-up-answer\"><strong>AI\u56DE\u7B54:</strong> ${this.formatResponse(data.ai_response)}</div>\n          <div class=\"follow-up-season-info\"><small>\u56DE\u7B54\u6642\u306E\u5B63\u7BC0: ${this.seasonInfo.displayText}</small></div>\n        `;\n        followUpsList.appendChild(followUpItem);\n      }\n\n      const sectionHeader = document.querySelector(`#follow-up-section-${postId} h5`);\n      if (sectionHeader) sectionHeader.textContent = `\u3053\u306E\u8A18\u9332\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u76F8\u8AC7\u3059\u308B (${data.sequence_number}/5)`;\n\n      if (data.remaining_consultations === 0) {\n        const followUpForm = document.querySelector(`#follow-up-section-${postId} .follow-up-form`);\n        if (followUpForm) {\n          followUpForm.innerHTML = `\n            <div class=\"follow-up-limit-reached\">\n              <p class=\"limit-reached\">\u3053\u306E\u8A18\u9332\u3078\u306E\u8FFD\u52A0\u76F8\u8AC7\u306F5\u56DE\u306B\u9054\u3057\u307E\u3057\u305F</p>\n              <div class=\"follow-up-limit-reached-info\"><p><small>\u65B0\u3057\u3044\u6295\u7A3F\u3067\u518D\u5EA65\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7\u3067\u304D\u307E\u3059</small></p></div>\n            </div>`;\n        }\n      }\n\n      this.showTemporaryNotification(`\u8FFD\u52A0\u76F8\u8AC7 ${data.sequence_number}/5 \u3092\u9001\u4FE1\u3057\u307E\u3057\u305F`, 'success');\n\n    } else if (data.error === 'follow_up_limit_reached') {\n      this.showTemporaryNotification('\u3053\u306E\u8A18\u9332\u3078\u306E\u8FFD\u52A0\u76F8\u8AC7\u306F5\u56DE\u306B\u9054\u3057\u307E\u3057\u305F', 'error');\n    } else {\n      throw new Error(data.error || '\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n\n  } catch (error) {\n    console.error('\u8FFD\u52A0\u76F8\u8AC7\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(`\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557: ${error.message}`, 'error');\n  } finally {\n    const button = document.querySelector(`#follow-up-section-${postId} button`);\n    if (button) { button.disabled = false; button.textContent = '\u8FFD\u52A0\u76F8\u8AC7\u3059\u308B'; }\n  }\n}\n\n\nasync loadExistingPlantsForSelection() {\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') {\n    console.log('\u975E\u4F1A\u54E1\u306E\u305F\u3081\u690D\u7269\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u30B9\u30AD\u30C3\u30D7');\n    return;\n  }\n\n  try {\n    console.log('\u65E2\u5B58\u690D\u7269\u9078\u629E\u7528\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u958B\u59CB');\n    console.log('API\u30EA\u30AF\u30A8\u30B9\u30C8:', {\n      userEmail: this.userEmail,\n      entitlement: this.entitlement\n    });\n\n    console.log('\u23F3 fetch\u958B\u59CB...');\n    console.log('\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8:', `${this.apiBase}?action=threads`);\n    \n    const response = await fetch(`${this.apiBase}?action=threads`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({ \n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot\n      })\n    });\n\n    console.log('\u2705 fetch\u5B8C\u4E86');\n    console.log('API\u30EC\u30B9\u30DD\u30F3\u30B9\u53D7\u4FE1:', response.status, response.statusText);\n    console.log('response.ok:', response.ok);\n\n    if (!response.ok) {\n      console.error('\u274C HTTP\u30A8\u30E9\u30FC:', response.status, response.statusText);\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    console.log('\u23F3 JSON\u30D1\u30FC\u30B9\u958B\u59CB...');\n    const data = await response.json();\n    console.log('\u2705 JSON\u30D1\u30FC\u30B9\u5B8C\u4E86');\n    console.log('API\u30EC\u30B9\u30DD\u30F3\u30B9\u30C7\u30FC\u30BF:', data);\n    console.log('\u53D6\u5F97\u3057\u305F\u30B9\u30EC\u30C3\u30C9\u6570:', (data.threads || []).length);\n    \n    this.existingPlants = data.threads || [];\n    console.log('this.existingPlants \u306B\u683C\u7D0D:', this.existingPlants.length + '\u4EF6');\n    \n    this.updateExistingPlantsDropdown();\n    \n    console.log('\uD83C\uDF89\uD83C\uDF89\uD83C\uDF89 \u65E2\u5B58\u690D\u7269\u30EA\u30B9\u30C8\u66F4\u65B0\u5B8C\u4E86:', this.existingPlants.length + '\u4EF6 \uD83C\uDF89\uD83C\uDF89\uD83C\uDF89');\n    \n    return this.existingPlants;\n\n  } catch (error) {\n    console.error('\u274C\u274C\u274C \u65E2\u5B58\u690D\u7269\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557:', error);\n    console.error('\u30A8\u30E9\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8:', error.message);\n    console.error('\u30A8\u30E9\u30FC\u30B9\u30BF\u30C3\u30AF:', error.stack);\n    \n    this.existingPlants = [];\n    const select = document.getElementById('existing-plant-select');\n    if (select) {\n      select.innerHTML = '<option value=\"\">\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F</option>';\n    }\n    \n    throw error;\n  }\n}\n\n  updateExistingPlantsDropdown() {\n    const select = document.getElementById('existing-plant-select');\n    if (!select) return;\n\n    if (this.existingPlants.length === 0) {\n      select.innerHTML = '<option value=\"\">\u307E\u3060\u690D\u7269\u8A18\u9332\u304C\u3042\u308A\u307E\u305B\u3093</option>';\n      return;\n    }\n\n    const sortedPlants = [...this.existingPlants].sort((a, b) => \n      new Date(b.updated_at) - new Date(a.updated_at)\n    );\n\n    const options = sortedPlants.map(thread => {\n      const lastUpdate = this.calculateDaysSince(thread.updated_at);\n      const activityStatus = this.getActivityLevel(lastUpdate).text;\n      \n      return `<option value=\"${thread.id}\" \n                     data-plant-name=\"${this.escapeHtml(thread.plant_name)}\"\n                     data-posts-count=\"${thread.posts_count || 0}\"\n                     data-activity=\"${activityStatus}\">\n        ${this.escapeHtml(thread.plant_name)} \n        (\u8A18\u9332${thread.posts_count || 0}\u4EF6\u30FB${activityStatus})\n      </option>`;\n    }).join('');\n\n    select.innerHTML = `\n      <option value=\"\">\u690D\u7269\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044</option>\n      ${options}\n    `;\n  }\n\nasync loadUserThreads() {\n  const container = document.getElementById('threads-list');\n  if (!container) return;\n\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') return;\n\n  try {\n    console.log('\u30B9\u30EC\u30C3\u30C9\u8AAD\u307F\u8FBC\u307F\u958B\u59CB');\n\n    const response = await fetch(`${this.apiBase}?action=threads`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({ \n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n    membership_type: this.getMembershipType()  \n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n    console.log('\u30B9\u30EC\u30C3\u30C9\u53D6\u5F97\u6210\u529F:', (data.threads || []).length + '\u4EF6');\n\n    // \u2605 \u8FFD\u52A0: existingPlants \u3092\u66F4\u65B0\n    this.existingPlants = data.threads || [];\n    \n    this.renderThreadsList(data.threads || [], membershipType);\n    \n\n    } catch (error) {\n      console.error('\u8A18\u9332\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557:', error);\n      container.innerHTML = `\n        <div class=\"error-message\">\n          <h4>\u63A5\u7D9A\u30A8\u30E9\u30FC</h4>\n          <p>\u690D\u7269\u8A18\u9332\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002</p>\n          <div class=\"error-details\">\n            <p><strong>\u30A8\u30E9\u30FC:</strong> ${error.message}</p>\n          </div>\n          <div class=\"error-actions\">\n            <button onclick=\"window.plantApp.loadUserThreads()\" class=\"btn btn-small btn-secondary\">\n              \u518D\u8AAD\u307F\u8FBC\u307F\n            </button>\n            <a href=\"/pages/contact\" class=\"btn btn-small btn-primary\" target=\"_blank\">\n              \u30B5\u30DD\u30FC\u30C8\u306B\u9023\u7D61\n            </a>\n          </div>\n        </div>\n      `;\n    }\n  }\n\n  renderThreadsList(threads, membershipType) {\n    const container = document.getElementById('threads-list');\n    if (!container) return;\n\n    const plantLimits = {\n      free_member: 20,\n      paid_member: 50\n    };\n    const currentLimit = plantLimits[membershipType] || 0;\n\n    if (!threads.length) {\n      container.innerHTML = `\n        <div class=\"empty-state\">\n          <div class=\"empty-icon\">\uD83C\uDF31</div>\n          <h4>\u307E\u3060\u690D\u7269\u8A18\u9332\u304C\u3042\u308A\u307E\u305B\u3093</h4>\n          <p>\u6700\u521D\u306E\u80B2\u6210\u8A18\u9332\u6295\u7A3F\u3067\u3001\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u3092\u59CB\u3081\u307E\u3057\u3087\u3046\uFF01</p>\n          <div class=\"empty-state-features\">\n            <p><strong>\u5229\u7528\u53EF\u80FD\u306A\u6A5F\u80FD:</strong></p>\n            <ul>\n              <li>\u80B2\u6210\u8A18\u9332\u306F\u7121\u5236\u9650\u3067\u6295\u7A3F\u3067\u304D\u307E\u3059</li>\n              <li>\u76F8\u8AC7\u5185\u5BB9\u3092\u7A7A\u306B\u3059\u308B\u3068\u300C\u8A18\u9332\u306E\u307F\u300D\u6295\u7A3F\u3082\u53EF\u80FD</li>\n              <li>\u5404\u8A18\u9332\u306B\u5BFE\u3057\u30665\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7</li>\n              <li>\u690D\u7269\u306F${currentLimit}\u500B\u307E\u3067\u767B\u9332\u53EF\u80FD</li>\n              <li>${this.seasonInfo.displayText}\u306E\u5B63\u7BC0\u60C5\u5831\u3092\u8003\u616E\u3057\u305F\u5206\u6790</li>\n            </ul>\n          </div>\n        </div>\n      `;\n      return;\n    }\n\n    const limitWarning = threads.length >= currentLimit * 0.8;\n\n    container.innerHTML = `\n      ${limitWarning ? `\n        <div class=\"plant-count-info ${threads.length >= currentLimit ? 'limit-reached' : ''}\">\n          <div class=\"count-display\">\n            <span class=\"count-text\">\u767B\u9332\u690D\u7269: ${threads.length}/${currentLimit}\u500B</span>\n            <span class=\"season-info-small\">${this.seasonInfo.displayText}</span>\n          </div>\n          ${threads.length >= currentLimit ? `\n            <div class=\"limit-reached-notice\">\n              <p><strong>\u690D\u7269\u767B\u9332\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F</strong></p>\n              <p>\u65B0\u3057\u3044\u690D\u7269\u3092\u767B\u9332\u3059\u308B\u306B\u306F\u3001\u65E2\u5B58\u306E\u690D\u7269\u8A18\u9332\u3092\u524A\u9664\u3059\u308B\u304B\u3001<a href=\"/pages/botanical-record#plans\">\u6709\u6599\u4F1A\u54E1\u306B\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9</a>\u3057\u3066\u304F\u3060\u3055\u3044\u3002</p>\n            </div>\n          ` : threads.length >= currentLimit * 0.9 ? `\n            <div class=\"limit-warning-notice\">\n              <p><strong>\u690D\u7269\u767B\u9332\u4E0A\u9650\u304C\u8FD1\u3065\u3044\u3066\u3044\u307E\u3059</strong></p>\n              <p>\u3042\u3068${currentLimit - threads.length}\u500B\u307E\u3067\u767B\u9332\u53EF\u80FD\u3067\u3059\u3002</p>\n            </div>\n          ` : ''}\n        </div>\n      ` : ''}\n      \n      <div class=\"threads-grid\">\n        ${threads.map((thread, index) => this.renderThreadCard(thread, index, membershipType)).join('')}\n      </div>\n    `;\n  }\n\nrenderThreadCard(thread, index, membershipType) {\n  const lastUpdateDays = this.calculateDaysSince(thread.updated_at);\n  const totalImages = thread.total_images || 0;\n  \n  return `<div class=\"plant-record-card unlimited\" \n         data-thread-id=\"${thread.id}\">\n      \n      <div class=\"plant-header\">\n        <div class=\"plant-info\" onclick=\"window.plantApp.openPlantRecord('${thread.id}', ${index})\">\n          <h4 class=\"plant-name\">${this.escapeHtml(thread.plant_name)}</h4>\n          <p class=\"plant-dates\">\n            \u8A18\u9332\u958B\u59CB: ${this.formatDate(thread.created_at)}\n            ${lastUpdateDays > 0 ? `<br>\u6700\u7D42\u66F4\u65B0: ${lastUpdateDays}\u65E5\u524D` : ''}\n          </p>\n        </div>\n        <div class=\"plant-stats\">\n          <span class=\"post-count unlimited\">\n            \u80B2\u6210\u8A18\u9332: ${thread.posts_count || 0}\u4EF6\n          </span>\n          ${totalImages > 0 ? `\n            <span class=\"image-count\">\n              \uD83D\uDCF8 ${totalImages}\u679A\n            </span>\n          ` : ''}\n          <span class=\"unlimited-badge\">\u7121\u5236\u9650</span>\n\n        </div>\n      </div>\n\n      <div onclick=\"window.plantApp.openPlantRecord('${thread.id}', ${index})\">\n        ${thread.cover_image_url ? `\n          <div class=\"plant-cover-image\">\n            <img src=\"${thread.cover_image_url}\" \n                 alt=\"${this.escapeHtml(thread.plant_name)}\" \n                 class=\"cover-img\"\n                 loading=\"lazy\">\n          </div>\n        ` : `\n          <div class=\"plant-cover-placeholder\">\n            <div class=\"placeholder-icon\">${this.getPlantEmoji(thread.plant_name)}</div>\n            <span class=\"placeholder-text\">\u80B2\u6210\u8A18\u9332</span>\n            <span class=\"season-context\">${this.seasonInfo.displayText}\u7BA1\u7406\u4E2D</span>\n          </div>\n        `}\n\n        <div class=\"plant-actions\">\n          <span class=\"action-hint\">\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8A18\u9332\u3092\u898B\u308B</span>\n          <div class=\"plant-features\">\n            <p class=\"unlimited-note\">\n              \u80B2\u6210\u8A18\u9332\u7121\u5236\u9650\u30FB\u8FFD\u52A0\u76F8\u8AC7\u306F\u5404\u8A18\u9332\u306B5\u56DE\u307E\u3067\u30FB\u8A18\u9332\u306E\u307F\u6295\u7A3F\u3082\u53EF\u80FD\n            </p>\n            ${membershipType === 'paid_member' ? `\n              <p class=\"premium-features\">\n                <small>\u30B1\u30A2\u901A\u77E5\u30FB\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u5BFE\u5FDC</small>\n              </p>\n            ` : ''}\n          </div>\n        </div>\n\n        <div class=\"plant-quick-stats\">\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u6D3B\u52D5\u5EA6</span>\n            <span class=\"stat-value ${this.getActivityLevel(lastUpdateDays).class}\">\n              ${this.getActivityLevel(lastUpdateDays).text}\n            </span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u5B63\u7BC0\u9069\u5FDC</span>\n            <span class=\"stat-value seasonal\">\n              ${this.seasonInfo.seasonName}\u5BFE\u5FDC\n            </span>\n          </div>\n        </div>\n      </div>\n\n    </div>`;\n}\ncalculateDaysSince(dateString) {\n  try {\n    const date = new Date(dateString);\n    const now = new Date();\n    const diffTime = Math.abs(now - date);\n    return Math.floor(diffTime / (1000 * 60 * 60 * 24));\n  } catch (error) {\n    return 0;\n  }\n}\n\n// === BEGIN PATCH: getLatestThreadImage \u8FFD\u52A0/\u7F6E\u63DB ===\nasync getLatestThreadImage(threadId) {\n  try {\n    if (!threadId) return null;\n\n    const res = await fetch(`${this.apiBase}?action=growth_images`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify(this.getCommonPayload({ thread_id: threadId }))\n    });\n\n    if (!res.ok) {\n      console.warn('growth_images HTTP error:', res.status);\n      return null;\n    }\n\n    const data = await res.json().catch(() => ({}));\n    // \u671F\u5F85\u3059\u308B\u5F62: { images: [{ url: '...' }, ...] }\n    const url = data?.images?.[0]?.url || data?.latest_image_url || null;\n    return url;\n  } catch (e) {\n    console.error('getLatestThreadImage \u4F8B\u5916:', e);\n    return null;\n  }\n}\n// === END PATCH ===\n\n\n\n\n\n  getActivityLevel(daysSince) {\n    if (daysSince <= 7) {\n      return { text: '\u30A2\u30AF\u30C6\u30A3\u30D6', class: 'active' };\n    } else if (daysSince <= 30) {\n      return { text: '\u901A\u5E38', class: 'normal' };\n    } else {\n      return { text: '\u4F11\u7720\u4E2D', class: 'inactive' };\n    }\n  }\n\n  getPlantEmoji(plantName) {\n    const name = plantName.toLowerCase();\n    if (name.includes('\u30D3\u30AB\u30AF\u30B7\u30C0') || name.includes('\u30EA\u30C9\u30EC\u30A4')) return '\uD83E\uDD87';\n    if (name.includes('\u591A\u8089') || name.includes('\u30B5\u30DC\u30C6\u30F3')) return '\uD83C\uDF35';\n    if (name.includes('\u862D') || name.includes('orchid')) return '\uD83C\uDF3A';\n    if (name.includes('\u30DD\u30C8\u30B9') || name.includes('\u30D5\u30A3\u30ED\u30C7\u30F3\u30C9\u30ED\u30F3')) return '\uD83C\uDF3F';\n    if (name.includes('\u30E2\u30F3\u30B9\u30C6\u30E9')) return '\uD83C\uDF43';\n    if (name.includes('\u30B5\u30F3\u30BB\u30D9\u30EA\u30A2')) return '\uD83D\uDDE1\uFE0F';\n    return '\uD83C\uDF31';\n  }\n\n  async openPlantRecord(threadId, threadIndex) {\n    try {\n    this.openedFromSNS = false;\n    this.returnToPostDetail = false;\n    this.currentPostId = null;\n    console.log('\uD83D\uDCCC \u901A\u5E38\u306E\u690D\u7269\u4E00\u89A7\u304B\u3089\u958B\u304D\u307E\u3057\u305F');\n      let threadData;\n      if (threadIndex !== undefined && this.existingPlants[threadIndex]) {\n        threadData = this.existingPlants[threadIndex];\n      } else {\n        const threadsResponse = await fetch(`${this.apiBase}?action=threads`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ \n            user_email: this.userEmail,\n            entitlement: this.entitlement,\n            entitlement_snapshot: this.entitlementSnapshot \n          })\n        });\n        const threadsData = await threadsResponse.json();\n        threadData = (threadsData.threads || []).find(t => t.id === threadId);\n      }\n      \n      if (!threadData) {\n        this.showErrorModal('\u690D\u7269\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n        return;\n      }\n      \n      this.currentOpenThread = threadData;\n      this.showLoadingModal('\u690D\u7269\u8A18\u9332\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...');\n      \n      const posts = await this.loadThreadPosts(threadId);\n      this.closeLoadingModal();\n      this.renderAdvancedPlantRecordModal(threadData, posts);\n      this.loadModalAdditionalData(threadId);\n      \n    } catch (error) {\n      this.closeLoadingModal();\n      this.showErrorModal('\u690D\u7269\u8A18\u9332\u306E\u8868\u793A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ' + error.message);\n      console.error('\u690D\u7269\u8A18\u9332\u8868\u793A\u30A8\u30E9\u30FC:', error);\n    }\n  }\n  \nbackToPlantList() {\n  console.log('\uD83D\uDD19 \u4E00\u89A7\u3078\u623B\u308B:', { \n    openedFromSNS: this.openedFromSNS\n  });\n  \n  // \u690D\u7269\u8A73\u7D30\u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n  const plantRecordModal = document.getElementById('plant-record-modal');\n  if (plantRecordModal) {\n    plantRecordModal.remove();\n    console.log('\u2705 plant-record-modal \u3092\u524A\u9664\u3057\u307E\u3057\u305F');\n  }\n  \n  // \u2605 \u6B8B\u3063\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30E2\u30FC\u30C0\u30EB\u30AA\u30FC\u30D0\u30FC\u30EC\u30A4\u3092\u524A\u9664\n  const modals = document.querySelectorAll('.modal-overlay');\n  modals.forEach(modal => {\n    modal.remove();\n    console.log('\u2705 \u6B8B\u3063\u3066\u3044\u305F\u30E2\u30FC\u30C0\u30EB\u3092\u524A\u9664\u3057\u307E\u3057\u305F');\n  });\n  \n  // \u2605 SNS\u304B\u3089\u958B\u3044\u305F\u5834\u5408\u306FSNS\u4E00\u89A7\u306B\u623B\u308B\n  if (this.openedFromSNS === true) {\n    console.log('\uD83D\uDCCC SNS\u4E00\u89A7\u306B\u623B\u308A\u307E\u3059');\n    this.openedFromSNS = false;\n    this.openSNSFeed();\n    return;\n  }\n  \n  // \u2605 \u901A\u5E38\u306E\u690D\u7269\u4E00\u89A7\u304B\u3089\u958B\u3044\u305F\u5834\u5408\n  console.log('\uD83D\uDCCC \u690D\u7269\u4E00\u89A7\u306B\u623B\u308A\u307E\u3059');\n  \n  // popover\u3092\u958B\u304F\n  const brUserPopover = document.getElementById('brUserPopover');\n  const brUserBtn = document.getElementById('brUserBtn');\n  if (brUserPopover && brUserBtn) {\n    brUserPopover.hidden = false;\n    brUserBtn.setAttribute('aria-expanded', 'true');\n    console.log('\u2705 \u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304D\u307E\u3057\u305F');\n  }\n  \n  console.log('\u690D\u7269\u4E00\u89A7\u306B\u623B\u308A\u307E\u3057\u305F');\n}\n\nrenderAdvancedPlantRecordModal(threadData, posts) {\n  console.log('\uD83D\uDCCC renderAdvancedPlantRecordModal \u958B\u59CB\u6642:', this.openedFromSNS);\n\n  this.closeAllModals();\n  const membershipType = this.getMembershipType();\n\n  const modalHtml = `\n    <div id=\"plant-record-modal\" class=\"modal-overlay\" onclick=\"window.plantApp.closeRecordModal(event)\">\n      <div class=\"modal-content plant-record-content\" onclick=\"event.stopPropagation()\">\n        \n        <div class=\"modal-header\">\n          <div class=\"modal-header-top\">\n            <button onclick=\"window.plantApp.backToPlantList()\" class=\"back-to-list-btn\" type=\"button\">\u2190 \u623B\u308B</button>\n            <div class=\"header-badges\">\n              <span class=\"unlimited-badge\">\u8A18\u9332\u7121\u5236\u9650</span>\n              <span class=\"season-badge\">${this.seasonInfo.displayText}</span>\n              ${membershipType === 'paid_member' ? '<span class=\"premium-badge\">\u30D7\u30EC\u30DF\u30A2\u30E0</span>' : ''}\n            </div>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\" type=\"button\">\u00D7 \u9589\u3058\u308B</button>\n          </div>\n          <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;\">\n            <h3 style=\"margin:0;\">${this.escapeHtml(threadData.plant_name)} \u306E\u80B2\u6210\u8A18\u9332</h3>\n            <button type=\"button\" onclick=\"window.plantApp.startPlantRecordGuideTour()\" style=\"flex-shrink:0;border:2px solid #111;border-radius:20px;background:#fff;color:#111;font-size:12px;font-weight:700;padding:6px 14px;cursor:pointer;white-space:nowrap;\">\uFF1F \u4F7F\u3044\u65B9</button>\n          </div>\n          <div class=\"modal-header-meta\">\n            <div class=\"record-info\">\n              <span>${posts.length}\u4EF6\u306E\u80B2\u6210\u8A18\u9332 | ${this.formatDate(threadData.created_at)}\u301C \u6700\u7D42\u66F4\u65B0: ${this.formatDate(threadData.updated_at)}</span>\n            </div>\n            ${threadData.is_owner !== false ? `<button class=\"delete-thread-btn\" onclick=\"event.stopPropagation(); window.plantApp.deleteThread('${threadData.id}')\" title=\"\u3053\u306E\u690D\u7269\u306E\u8A18\u9332\u3092\u524A\u9664\">\u690D\u7269\u306E\u8A18\u9332\u3092\u524A\u9664</button>` : ''}\n          </div>\n        </div>\n\n        <div class=\"modal-body\">\n          \n          <div class=\"tab-navigation advanced\">\n            <button class=\"tab-btn active\" data-tab=\"timeline\">\n              <span class=\"tab-icon\">\uD83D\uDCDD</span>\n              <span class=\"tab-label\">\u80B2\u6210\u8A18\u9332\u5C65\u6B74</span>\n            </button>\n            <button class=\"tab-btn\" data-tab=\"growth-comparison\">\n              <span class=\"tab-icon\">\uD83D\uDCC8</span>\n              <span class=\"tab-label\">\u6210\u9577\u6BD4\u8F03</span>\n            </button>\n            <button class=\"tab-btn\" data-tab=\"care-log\">\n              <span class=\"tab-icon\">\uD83D\uDDD3\uFE0F</span>\n              <span class=\"tab-label\">\u30B1\u30A2\u8A18\u9332</span>\n            </button>\n            ${this.shouldShowCareAlertsTab(threadData, posts) ? `\n              <button class=\"tab-btn\" data-tab=\"care-alerts\">\n                <span class=\"tab-icon\">\uD83D\uDD14</span>\n                <span class=\"tab-label\">\u30B1\u30A2\u901A\u77E5</span>\n              </button>\n            ` : ''}\n            ${threadData.is_owner !== false ? `\n              <button class=\"tab-btn\" data-tab=\"grow-ops\">\n                <span class=\"tab-icon\">\u2699\uFE0F</span>\n                <span class=\"tab-label\">Grow Ops</span>\n              </button>\n            ` : ''}\n          </div>\n\n          <div class=\"tab-contents\">\n            \n            <div class=\"tab-content active\" data-tab=\"timeline\">\n              ${this.renderAdvancedTimelineTab(posts)}\n            </div>\n\n            <div class=\"tab-content\" data-tab=\"growth-comparison\">\n              ${this.renderGrowthComparisonTab(threadData.id)}\n            </div>\n\n            <div class=\"tab-content\" data-tab=\"care-log\">\n              ${this.renderAdvancedCareLogTab(threadData)}\n            </div>\n            ${this.shouldShowCareAlertsTab(threadData, posts) ? `\n              <div class=\"tab-content\" data-tab=\"care-alerts\">\n                ${this.renderCareAlertsTab(threadData.id)}\n              </div>\n            ` : ''}\n            ${threadData.is_owner !== false ? `\n              <div class=\"tab-content\" data-tab=\"grow-ops\">\n                ${this.renderGrowOpsTab(threadData)}\n              </div>\n            ` : ''}\n          </div>\n        </div>\n      </div>\n    </div>\n  `;\n\n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n  this.attachAdvancedTabEvents();\n  document.addEventListener('keydown', this.handleEscapeKey.bind(this));\n  this.maybeAutoStartPlantRecordGuideTour();\n}\n\n// ===== Grow Ops =====\nrenderGrowOpsTab(threadData) {\n  const tid = threadData.id;\n  const categories = [\n    { key: 'location', label: '\u80B2\u6210\u5834\u6240', icon: '\uD83D\uDCCD', presets: ['\u30EA\u30D3\u30F3\u30B0', '\u5BDD\u5BA4', '\u5357\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u5317\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u6771\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u6E29\u5BA4', '\u7384\u95A2', '\u30D0\u30EB\u30B3\u30CB\u30FC', '\u5C4B\u4E0A', '\u30AC\u30EC\u30FC\u30B8'] },\n    { key: 'lighting', label: 'LED\u30FB\u7167\u660E', icon: '\uD83D\uDCA1', presets: ['AMATERAS LED', 'HASU 38W', 'Helios Green LED', 'TSUKUYOMI LED', 'AMATERAS 20W', 'Mars Hydro', '\u690D\u7269\u80B2\u6210\u30E9\u30A4\u30C8', '\u81EA\u7136\u5149\u306E\u307F', 'HLG', 'Quantum Board'] },\n    { key: 'hvac', label: '\u7A7A\u8ABF\u30FB\u6A5F\u5668', icon: '\uD83C\uDF00', presets: ['\u30DC\u30EB\u30CD\u30FC\u30C9', '\u30A2\u30A4\u30EA\u30B9\u30AA\u30FC\u30E4\u30DE \u30B5\u30FC\u30AD\u30E5\u30EC\u30FC\u30BF\u30FC', '\u30B9\u30DE\u30FC\u30C8\u30D7\u30E9\u30B0', '\u30D2\u30FC\u30BF\u30FC', '\u52A0\u6E7F\u5668', '\u9664\u6E7F\u5668', '\u30A8\u30A2\u30B3\u30F3\u7BA1\u7406', 'IoT\u6E29\u6E7F\u5EA6\u8A08', '\u30B9\u30DE\u30FC\u30C8\u30B5\u30FC\u30E2\u30B9\u30BF\u30C3\u30C8', 'CO\u2082\u30B3\u30F3\u30C8\u30ED\u30FC\u30E9\u30FC'] },\n    { key: 'materials', label: '\u8CC7\u6750\u30FB\u9262', icon: '\uD83E\uDEB4', presets: ['\u30D7\u30EC\u30B9\u30C6\u30E9105', '\u30D7\u30EC\u30B9\u30C6\u30E990', '\u30B9\u30EA\u30C3\u30C8\u9262 CSM', '\u4F5C\u5BB6\u9262', '\u30D7\u30E9\u9262', '\u7D20\u713C\u304D\u9262', '\u30B0\u30E9\u30B9\u30D5\u30A1\u30A4\u30D0\u30FC\u9262', '\u30C6\u30E9\u30B3\u30C3\u30BF', '\u6850\u751F\u7802', '\u8D64\u7389\u571F', '\u9E7F\u6CBC\u571F', '\u65E5\u5411\u571F', '\u30BC\u30AA\u30E9\u30A4\u30C8', '\u30D0\u30FC\u30DF\u30AD\u30E5\u30E9\u30A4\u30C8'] },\n    { key: 'fertilizer', label: '\u80A5\u6599\u30FB\u6804\u990A', icon: '\uD83E\uDDEA', presets: ['\u30DE\u30B0\u30A1\u30F3\u30D7K', '\u30CF\u30A4\u30DD\u30CD\u30C3\u30AF\u30B9', '\u30EA\u30AD\u30C0\u30B9', '\u30E1\u30CD\u30C7\u30FC\u30EB', 'HB-101', '\u30D0\u30A4\u30AA\u30B4\u30FC\u30EB\u30C9', '\u30D7\u30ED\u30DF\u30C3\u30AF', '\u30AA\u30B9\u30E2\u30B3\u30FC\u30C8', '\u30AB\u30EA\u30B0\u30EA\u30FC\u30F3', '\u30A2\u30DF\u30CE\u9178\u80A5\u6599'] },\n    { key: 'pesticide', label: '\u85AC\u54C1\u30FB\u9632\u866B', icon: '\uD83D\uDEE1\uFE0F', presets: ['\u30AA\u30EB\u30C8\u30E9\u30F3DX', '\u30D9\u30CB\u30ABX\u30D5\u30A1\u30A4\u30F3\u30B9\u30D7\u30EC\u30FC', '\u30C0\u30B3\u30CB\u30FC\u30EB', '\u5C55\u7740\u5264', '\u30CB\u30FC\u30E0\u30AA\u30A4\u30EB', '\u30A2\u30EB\u30D0\u30EA\u30F3', '\u30B9\u30BF\u30FC\u30AC\u30FC\u30C9', '\u30A2\u30D5\u30A1\u30FC\u30E0', '\u30E2\u30B9\u30D4\u30E9\u30F3', '\u30D5\u30ED\u30F3\u30B5\u30A4\u30C9'] },\n    { key: 'purchase', label: '\u8CFC\u5165\u5143', icon: '\uD83D\uDED2', presets: ['\u30E1\u30EB\u30AB\u30EA', '\u30E4\u30D5\u30AA\u30AF', 'BASE', '\u697D\u5929\u5E02\u5834', 'Amazon', 'Yahoo!\u30B7\u30E7\u30C3\u30D4\u30F3\u30B0', '\u690D\u7269\u5C02\u9580\u5E97', '\u30DB\u30FC\u30E0\u30BB\u30F3\u30BF\u30FC', '\u5C55\u793A\u4F1A\u30FB\u30A4\u30D9\u30F3\u30C8', 'leafla'] },\n    { key: 'free', label: '\u81EA\u7531\u30E1\u30E2', icon: '\uD83D\uDCDD', presets: [] },\n  ];\n\n  const catHtml = categories.map(cat => `\n    <div class=\"gops-category\" data-category=\"${cat.key}\">\n      <div class=\"gops-cat-header\">\n        <span class=\"gops-cat-icon\">${cat.icon}</span>\n        <span class=\"gops-cat-label\">${cat.label}</span>\n      </div>\n      <div class=\"gops-tags-wrap\" id=\"gops-tags-${tid}-${cat.key}\"></div>\n      <div class=\"gops-input-row\">\n        <div class=\"gops-autocomplete-wrap\">\n          <input type=\"text\" class=\"gops-tag-input\" placeholder=\"\u8FFD\u52A0...\" data-category=\"${cat.key}\" data-tid=\"${tid}\" autocomplete=\"off\" />\n          <div class=\"gops-dropdown\" id=\"gops-dd-${tid}-${cat.key}\"></div>\n        </div>\n        <button class=\"gops-add-btn\" onclick=\"window.plantApp.growOpsAddTag('${tid}','${cat.key}')\" type=\"button\">\uFF0B</button>\n      </div>\n    </div>\n  `).join('');\n\n  return `\n    <div class=\"gops-wrap\" id=\"gops-wrap-${tid}\" data-thread-id=\"${tid}\" data-loading=\"true\">\n      <div class=\"gops-loading\">\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n      <div class=\"gops-main\" style=\"display:none\">\n        <div class=\"gops-env-section\">\n          <div class=\"gops-section-title\">\u74B0\u5883\u30BF\u30A4\u30D7</div>\n          <div class=\"gops-env-btns\" id=\"gops-env-${tid}\">\n            <button class=\"gops-env-btn\" data-env=\"indoor\" onclick=\"window.plantApp.growOpsSetEnv('${tid}','indoor')\">\uD83C\uDFE0 \u5C4B\u5185</button>\n            <button class=\"gops-env-btn\" data-env=\"outdoor\" onclick=\"window.plantApp.growOpsSetEnv('${tid}','outdoor')\">\uD83C\uDF3F \u5C4B\u5916</button>\n            <button class=\"gops-env-btn\" data-env=\"hybrid\" onclick=\"window.plantApp.growOpsSetEnv('${tid}','hybrid')\">\uD83D\uDD04 \u30CF\u30A4\u30D6\u30EA\u30C3\u30C9</button>\n          </div>\n        </div>\n        <div class=\"gops-cats-grid\">\n          ${catHtml}\n        </div>\n        <div class=\"gops-notes-section\">\n          <div class=\"gops-section-title\">\u30E1\u30E2</div>\n          <textarea class=\"gops-notes\" id=\"gops-notes-${tid}\" rows=\"3\" placeholder=\"\u81EA\u7531\u30E1\u30E2\uFF08\u305D\u306E\u4ED6\u306E\u8A2D\u5B9A\u3084\u7279\u8A18\u4E8B\u9805\u306A\u3069\uFF09\"></textarea>\n        </div>\n        <div class=\"gops-actions\">\n          <button class=\"gops-copy-btn\" onclick=\"window.plantApp.growOpsCopyFrom('${tid}')\" type=\"button\">\uD83D\uDCCB \u4ED6\u306E\u690D\u7269\u304B\u3089\u30B3\u30D4\u30FC</button>\n          <button class=\"gops-save-btn\" onclick=\"window.plantApp.growOpsSave('${tid}')\" type=\"button\">\u4FDD\u5B58\u3059\u308B</button>\n        </div>\n        <div class=\"gops-save-msg\" id=\"gops-msg-${tid}\" style=\"display:none\"></div>\n      </div>\n    </div>\n  `;\n}\n\n// Grow Ops \u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u3066\u30BF\u30D6\u306B\u63CF\u753B\nasync loadGrowOpsData(threadId) {\n  const wrap = document.getElementById(`gops-wrap-${threadId}`);\n  if (!wrap) return;\n\n  try {\n    const _gopsRes = await fetch(`${this.apiBase}?action=get_grow_ops`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ thread_id: threadId, user_email: this.userEmail }),\n    });\n    if (!_gopsRes.ok) throw new Error('get_grow_ops failed');\n    const resp = await _gopsRes.json();\n    const { grow_ops, custom_tags } = resp;\n\n    // \u30C7\u30FC\u30BF\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\n    this._growOpsCache = this._growOpsCache || {};\n    this._growOpsCache[threadId] = grow_ops;\n    this._growOpsTagCache = this._growOpsTagCache || {};\n    this._growOpsTagCache[this.userEmail] = custom_tags || [];\n\n    this.growOpsRenderData(threadId, grow_ops, custom_tags || []);\n  } catch (e) {\n    console.error('Grow Ops load error:', e);\n    const loading = wrap.querySelector('.gops-loading');\n    if (loading) loading.textContent = '\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F';\n  }\n}\n\ngrowOpsRenderData(threadId, growOps, customTags) {\n  const wrap = document.getElementById(`gops-wrap-${threadId}`);\n  if (!wrap) return;\n\n  const loading = wrap.querySelector('.gops-loading');\n  const main = wrap.querySelector('.gops-main');\n  if (loading) loading.style.display = 'none';\n  if (main) main.style.display = 'block';\n\n  const envType = growOps?.environment_type || 'indoor';\n  const tags = growOps?.tags || {};\n  const notes = growOps?.notes || '';\n\n  // \u74B0\u5883\u30BF\u30A4\u30D7\n  this.growOpsSetEnv(threadId, envType, false);\n\n  // \u5404\u30AB\u30C6\u30B4\u30EA\u306E\u30BF\u30B0\u3092\u8868\u793A\n  const categories = ['location', 'lighting', 'hvac', 'materials', 'fertilizer', 'pesticide', 'purchase', 'free'];\n  categories.forEach(cat => {\n    const catTags = tags[cat] || [];\n    this.growOpsRenderTags(threadId, cat, catTags);\n  });\n\n  // \u30E1\u30E2\n  const notesEl = document.getElementById(`gops-notes-${threadId}`);\n  if (notesEl) notesEl.value = notes;\n\n  // \u30A4\u30F3\u30D7\u30C3\u30C8\u306E\u30AA\u30FC\u30C8\u30B3\u30F3\u30D7\u30EA\u30FC\u30C8\u3092\u521D\u671F\u5316\n  this.growOpsInitInputs(threadId, customTags);\n}\n\ngrowOpsRenderTags(threadId, category, tagList) {\n  const container = document.getElementById(`gops-tags-${threadId}-${category}`);\n  if (!container) return;\n  container.innerHTML = tagList.map(tag => `\n    <span class=\"gops-tag-chip\" data-tag=\"${this.escapeHtml(tag)}\">\n      ${this.escapeHtml(tag)}\n      <button class=\"gops-chip-remove\" onclick=\"window.plantApp.growOpsRemoveTag('${threadId}','${category}','${tag.replace(/'/g, \"\\\\'\")}')\" type=\"button\">\u00D7</button>\n    </span>\n  `).join('');\n}\n\ngrowOpsSetEnv(threadId, envType, persist = true) {\n  const container = document.getElementById(`gops-env-${threadId}`);\n  if (!container) return;\n  container.querySelectorAll('.gops-env-btn').forEach(btn => {\n    btn.classList.toggle('active', btn.dataset.env === envType);\n  });\n  if (persist) {\n    this._growOpsCache = this._growOpsCache || {};\n    this._growOpsCache[threadId] = this._growOpsCache[threadId] || {};\n    this._growOpsCache[threadId].environment_type = envType;\n  }\n}\n\ngrowOpsGetCategories() {\n  return {\n    location: { label: '\u80B2\u6210\u5834\u6240', presets: ['\u30EA\u30D3\u30F3\u30B0', '\u5BDD\u5BA4', '\u5357\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u5317\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u6771\u5411\u304D\u30D9\u30E9\u30F3\u30C0', '\u6E29\u5BA4', '\u7384\u95A2', '\u30D0\u30EB\u30B3\u30CB\u30FC', '\u5C4B\u4E0A', '\u30AC\u30EC\u30FC\u30B8'] },\n    lighting: { label: 'LED\u30FB\u7167\u660E', presets: ['AMATERAS LED', 'HASU 38W', 'Helios Green LED', 'TSUKUYOMI LED', 'AMATERAS 20W', 'Mars Hydro', '\u690D\u7269\u80B2\u6210\u30E9\u30A4\u30C8', '\u81EA\u7136\u5149\u306E\u307F'] },\n    hvac: { label: '\u7A7A\u8ABF\u30FB\u6A5F\u5668', presets: ['\u30DC\u30EB\u30CD\u30FC\u30C9', '\u30A2\u30A4\u30EA\u30B9\u30AA\u30FC\u30E4\u30DE \u30B5\u30FC\u30AD\u30E5\u30EC\u30FC\u30BF\u30FC', '\u30B9\u30DE\u30FC\u30C8\u30D7\u30E9\u30B0', '\u30D2\u30FC\u30BF\u30FC', '\u52A0\u6E7F\u5668', '\u9664\u6E7F\u5668', '\u30A8\u30A2\u30B3\u30F3\u7BA1\u7406', 'IoT\u6E29\u6E7F\u5EA6\u8A08'] },\n    materials: { label: '\u8CC7\u6750\u30FB\u9262', presets: ['\u30D7\u30EC\u30B9\u30C6\u30E9105', '\u30D7\u30EC\u30B9\u30C6\u30E990', '\u30B9\u30EA\u30C3\u30C8\u9262 CSM', '\u4F5C\u5BB6\u9262', '\u30D7\u30E9\u9262', '\u7D20\u713C\u304D\u9262', '\u30B0\u30E9\u30B9\u30D5\u30A1\u30A4\u30D0\u30FC\u9262', '\u30C6\u30E9\u30B3\u30C3\u30BF', '\u6850\u751F\u7802', '\u8D64\u7389\u571F', '\u9E7F\u6CBC\u571F', '\u65E5\u5411\u571F'] },\n    fertilizer: { label: '\u80A5\u6599\u30FB\u6804\u990A', presets: ['\u30DE\u30B0\u30A1\u30F3\u30D7K', '\u30CF\u30A4\u30DD\u30CD\u30C3\u30AF\u30B9', '\u30EA\u30AD\u30C0\u30B9', '\u30E1\u30CD\u30C7\u30FC\u30EB', 'HB-101', '\u30D0\u30A4\u30AA\u30B4\u30FC\u30EB\u30C9', '\u30D7\u30ED\u30DF\u30C3\u30AF', '\u30AA\u30B9\u30E2\u30B3\u30FC\u30C8'] },\n    pesticide: { label: '\u85AC\u54C1\u30FB\u9632\u866B', presets: ['\u30AA\u30EB\u30C8\u30E9\u30F3DX', '\u30D9\u30CB\u30ABX\u30D5\u30A1\u30A4\u30F3\u30B9\u30D7\u30EC\u30FC', '\u30C0\u30B3\u30CB\u30FC\u30EB', '\u5C55\u7740\u5264', '\u30CB\u30FC\u30E0\u30AA\u30A4\u30EB', '\u30A2\u30EB\u30D0\u30EA\u30F3', '\u30B9\u30BF\u30FC\u30AC\u30FC\u30C9'] },\n    purchase: { label: '\u8CFC\u5165\u5143', presets: ['\u30E1\u30EB\u30AB\u30EA', '\u30E4\u30D5\u30AA\u30AF', 'BASE', '\u697D\u5929\u5E02\u5834', 'Amazon', 'Yahoo!\u30B7\u30E7\u30C3\u30D4\u30F3\u30B0', '\u690D\u7269\u5C02\u9580\u5E97', '\u30DB\u30FC\u30E0\u30BB\u30F3\u30BF\u30FC', '\u5C55\u793A\u4F1A\u30FB\u30A4\u30D9\u30F3\u30C8', 'leafla'] },\n    free: { label: '\u81EA\u7531\u30E1\u30E2', presets: [] },\n  };\n}\n\ngrowOpsInitInputs(threadId, customTags) {\n  const categories = this.growOpsGetCategories();\n  Object.keys(categories).forEach(cat => {\n    const input = document.querySelector(`.gops-tag-input[data-category=\"${cat}\"][data-tid=\"${threadId}\"]`);\n    if (!input) return;\n\n    const dropdown = document.getElementById(`gops-dd-${threadId}-${cat}`);\n    const presets = categories[cat].presets;\n    const userTags = (customTags || []).filter(t => t.category === cat).map(t => t.tag);\n    const allSuggestions = [...new Set([...userTags, ...presets])];\n\n    input.addEventListener('input', () => {\n      const val = input.value.trim();\n      if (!dropdown) return;\n      if (!val) { dropdown.innerHTML = ''; dropdown.classList.remove('open'); return; }\n      const matches = allSuggestions.filter(s => s.toLowerCase().includes(val.toLowerCase())).slice(0, 8);\n      if (matches.length === 0) { dropdown.innerHTML = ''; dropdown.classList.remove('open'); return; }\n      dropdown.innerHTML = matches.map(m => `<div class=\"gops-dd-item\" onmousedown=\"event.preventDefault(); window.plantApp.growOpsSelectSuggestion('${threadId}','${cat}','${m.replace(/'/g, \"\\\\'\")}')\">${this.escapeHtml(m)}</div>`).join('');\n      dropdown.classList.add('open');\n    });\n\n    input.addEventListener('keydown', (e) => {\n      if (e.key === 'Enter') { e.preventDefault(); this.growOpsAddTag(threadId, cat); }\n      if (e.key === 'Escape') { dropdown.innerHTML = ''; dropdown.classList.remove('open'); }\n    });\n\n    input.addEventListener('blur', () => {\n      setTimeout(() => { if (dropdown) { dropdown.innerHTML = ''; dropdown.classList.remove('open'); } }, 200);\n    });\n  });\n}\n\ngrowOpsSelectSuggestion(threadId, category, tag) {\n  const input = document.querySelector(`.gops-tag-input[data-category=\"${category}\"][data-tid=\"${threadId}\"]`);\n  if (input) { input.value = tag; }\n  this.growOpsAddTag(threadId, category);\n}\n\ngrowOpsAddTag(threadId, category) {\n  const input = document.querySelector(`.gops-tag-input[data-category=\"${category}\"][data-tid=\"${threadId}\"]`);\n  if (!input) return;\n  const tag = input.value.trim();\n  if (!tag) return;\n\n  this._growOpsPending = this._growOpsPending || {};\n  this._growOpsPending[threadId] = this._growOpsPending[threadId] || {};\n  this._growOpsPending[threadId][category] = this._growOpsPending[threadId][category] || [];\n\n  const container = document.getElementById(`gops-tags-${threadId}-${category}`);\n  const existing = container ? [...container.querySelectorAll('.gops-tag-chip')].map(c => c.dataset.tag) : [];\n  if (existing.includes(tag)) { input.value = ''; return; }\n\n  this._growOpsPending[threadId][category].push(tag);\n  existing.push(tag);\n  this.growOpsRenderTags(threadId, category, existing);\n  this.growOpsInitInputs(threadId, this._growOpsTagCache?.[this.userEmail] || []);\n  input.value = '';\n  const dd = document.getElementById(`gops-dd-${threadId}-${category}`);\n  if (dd) { dd.innerHTML = ''; dd.classList.remove('open'); }\n}\n\ngrowOpsRemoveTag(threadId, category, tag) {\n  const container = document.getElementById(`gops-tags-${threadId}-${category}`);\n  if (!container) return;\n  const existing = [...container.querySelectorAll('.gops-tag-chip')].map(c => c.dataset.tag).filter(t => t !== tag);\n  this.growOpsRenderTags(threadId, category, existing);\n}\n\nasync growOpsSave(threadId) {\n  const btn = document.querySelector(`#gops-wrap-${threadId} .gops-save-btn`);\n  const msg = document.getElementById(`gops-msg-${threadId}`);\n  if (btn) { btn.disabled = true; btn.textContent = '\u4FDD\u5B58\u4E2D...'; }\n\n  try {\n    const categories = Object.keys(this.growOpsGetCategories());\n    const tags = {};\n    categories.forEach(cat => {\n      const container = document.getElementById(`gops-tags-${threadId}-${cat}`);\n      if (container) {\n        const catTags = [...container.querySelectorAll('.gops-tag-chip')].map(c => c.dataset.tag);\n        if (catTags.length > 0) tags[cat] = catTags;\n      }\n    });\n\n    const envBtn = document.querySelector(`#gops-env-${threadId} .gops-env-btn.active`);\n    const envType = envBtn?.dataset.env || 'indoor';\n    const notes = document.getElementById(`gops-notes-${threadId}`)?.value || '';\n\n    // \u65B0\u898F\u30AB\u30B9\u30BF\u30E0\u30BF\u30B0\u3092\u53CE\u96C6\n    const presetAll = Object.values(this.growOpsGetCategories()).flatMap(c => c.presets);\n    const newCustomTags = [];\n    categories.forEach(cat => {\n      (tags[cat] || []).forEach(tag => {\n        if (!presetAll.includes(tag)) newCustomTags.push({ category: cat, tag });\n      });\n    });\n\n    const _saveRes = await fetch(`${this.apiBase}?action=save_grow_ops`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ thread_id: threadId, user_email: this.userEmail, environment_type: envType, tags, notes, new_custom_tags: newCustomTags }),\n    });\n    if (!_saveRes.ok) throw new Error('save_grow_ops failed');\n\n    if (msg) { msg.textContent = '\u2705 \u4FDD\u5B58\u3057\u307E\u3057\u305F'; msg.style.display = 'block'; msg.className = 'gops-save-msg success'; setTimeout(() => { msg.style.display = 'none'; }, 3000); }\n  } catch (e) {\n    if (msg) { msg.textContent = '\u274C \u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F'; msg.style.display = 'block'; msg.className = 'gops-save-msg error'; }\n  } finally {\n    if (btn) { btn.disabled = false; btn.textContent = '\u4FDD\u5B58\u3059\u308B'; }\n  }\n}\n\nasync growOpsCopyFrom(threadId) {\n  // \u4ED6\u306E\u690D\u7269\u306E\u30B9\u30EC\u30C3\u30C9\u3092\u9078\u629E\u3059\u308B\u30C0\u30A4\u30A2\u30ED\u30B0\n  const threads = this.existingPlants || [];\n  if (threads.length === 0) { alert('\u30B3\u30D4\u30FC\u5143\u306E\u690D\u7269\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093'); return; }\n\n  const choices = threads.filter(t => t.id !== threadId);\n  if (choices.length === 0) { alert('\u30B3\u30D4\u30FC\u5143\u306E\u690D\u7269\u304C\u4ED6\u306B\u3042\u308A\u307E\u305B\u3093'); return; }\n\n  const options = choices.map((t, i) => `${i + 1}. ${t.plant_name}`).join('\\n');\n  const input = prompt(`\u3069\u306E\u690D\u7269\u306EGrow Ops\u8A2D\u5B9A\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3059\u304B\uFF1F\\n\u756A\u53F7\u3067\u9078\u629E:\\n\\n${options}`);\n  if (!input) return;\n  const idx = parseInt(input) - 1;\n  if (isNaN(idx) || idx < 0 || idx >= choices.length) { alert('\u7121\u52B9\u306A\u756A\u53F7\u3067\u3059'); return; }\n\n  const sourceThread = choices[idx];\n  try {\n    const _copyRes = await fetch(`${this.apiBase}?action=get_grow_ops`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ thread_id: sourceThread.id, user_email: this.userEmail }),\n    });\n    if (!_copyRes.ok) throw new Error('get_grow_ops failed');\n    const resp = await _copyRes.json();\n    if (resp.grow_ops) {\n      this.growOpsRenderData(threadId, resp.grow_ops, resp.custom_tags || []);\n      const msg = document.getElementById(`gops-msg-${threadId}`);\n      if (msg) { msg.textContent = `\uD83D\uDCCB \u300C${sourceThread.plant_name}\u300D\u304B\u3089\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F`; msg.style.display = 'block'; msg.className = 'gops-save-msg success'; setTimeout(() => { msg.style.display = 'none'; }, 3000); }\n    } else {\n      alert(`\u300C${sourceThread.plant_name}\u300D\u306B\u306FGrow Ops\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093`);\n    }\n  } catch (e) {\n    alert('\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n  }\n}\n\nshouldShowCareAlertsTab(threadData, posts) {\n  // \u6295\u7A3F\u8005\u304C\u81EA\u5206\u306E\u5834\u5408\u306F\u3001\u81EA\u5206\u306E\u4F1A\u54E1\u7A2E\u5225\u3067\u5224\u5B9A\n  if (threadData.is_owner !== false) {\n    const membershipType = this.getMembershipType();\n    return membershipType === 'paid_member';\n  }\n  \n  // \u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u306E\u6295\u7A3F\u306E\u5834\u5408\n  // \u6295\u7A3F\u6570\u304C\u591A\u3044\u5834\u5408\u306F\u6709\u6599\u4F1A\u54E1\u3068\u63A8\u6E2C\uFF08\u66AB\u5B9A\u7684\u306A\u5224\u5B9A\uFF09\n  // \u2605 \u3088\u308A\u6B63\u78BA\u306B\u306F\u3001\u6295\u7A3F\u8005\u306E\u4F1A\u54E1\u7A2E\u5225\u3092\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u304B\u3089\u53D6\u5F97\u3059\u3079\u304D\n  return posts.length > 5;\n}\n\nasync loadModalAdditionalData(threadId) {\n    console.log('\uD83D\uDCCC loadModalAdditionalData \u958B\u59CB\u6642:', this.openedFromSNS);\n\n  const promises = [\n    this.loadCareRecords(threadId),\n    this.loadGrowthImages(threadId)\n  ];\n  \n  // \u2605\u2605\u2605 \u30B1\u30A2\u901A\u77E5\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u8FBC\u307F\u6761\u4EF6 \u2605\u2605\u2605\n  const careAlertsTab = document.querySelector('[data-tab=\"care-alerts\"]');\n  if (careAlertsTab) {\n    const membershipType = this.getMembershipType();\n    const isOwner = this.currentOpenThread?.is_owner !== false;\n    \n    // \u81EA\u5206\u306E\u690D\u7269 & \u7121\u6599\u4F1A\u54E1\u306E\u5834\u5408\u306F\u8AAD\u307F\u8FBC\u307E\u306A\u3044\uFF08\u8A34\u6C42\u753B\u9762\u3092\u7DAD\u6301\uFF09\n    // \u305D\u308C\u4EE5\u5916\u306E\u5834\u5408\u306F\u30B1\u30A2\u901A\u77E5\u30C7\u30FC\u30BF\u3092\u8AAD\u307F\u8FBC\u3080\n    if (!(isOwner && membershipType !== 'paid_member')) {\n      promises.push(this.loadCareAlerts(threadId));\n    }\n  }\n  \n  try {\n    await Promise.all(promises);\n    console.log('\u30E2\u30FC\u30C0\u30EB\u8FFD\u52A0\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u5B8C\u4E86');\n  } catch (error) {\n    console.error('\u30E2\u30FC\u30C0\u30EB\u8FFD\u52A0\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n  }\n}\n\n  // \u2605 \u3053\u3053\u304B\u3089\u7F6E\u304D\u63DB\u3048\n  renderAdvancedTimelineTab(posts, noLimit = false) {\n  const membershipType = this.getMembershipType();\n    if (!posts.length) {\n      return `<div class=\"empty-content\">\n          <div class=\"empty-icon\">\uD83D\uDCDD</div>\n          <h5>\u307E\u3060\u80B2\u6210\u8A18\u9332\u304C\u3042\u308A\u307E\u305B\u3093</h5>\n          <div class=\"empty-suggestions\">\n            <p>\u80B2\u6210\u8A18\u9332\u306F\u7121\u5236\u9650\u3067\u6295\u7A3F\u3067\u304D\u307E\u3059</p>\n            <ul>\n              <li>\u76F8\u8AC7\u5185\u5BB9\u3092\u7A7A\u306B\u3059\u308B\u3068\u300C\u8A18\u9332\u306E\u307F\u300D\u6295\u7A3F\u304C\u53EF\u80FD</li>\n              <li>\u5404\u8A18\u9332\u306B\u5BFE\u3057\u30665\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7\u3067\u304D\u307E\u3059</li>\n              <li>\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u30A2\u30C9\u30D0\u30A4\u30B9\u3092\u53D7\u3051\u3089\u308C\u307E\u3059</li>\n            </ul>\n          </div>\n        </div>`;\n    }\n\n    const MAX_INITIAL = 30; // \u2190 \u521D\u671F\u8868\u793A\u4EF6\u6570\uFF08\u5FC5\u8981\u306A\u3089\u5897\u6E1B\u3057\u3066OK\uFF09\n    const visiblePosts = noLimit ? posts : posts.slice(0, MAX_INITIAL);\n    const hasMore = !noLimit && posts.length > MAX_INITIAL;\n\n    const recordOnlyCount = posts.filter(p => !p.consultation_request).length;\n    const consultationCount = posts.length - recordOnlyCount;\n\n    return `<div class=\"timeline-content advanced\">\n        <div class=\"timeline-header\">\n          <h5>\u80B2\u6210\u8A18\u9332\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3</h5>\n          <div class=\"timeline-stats\">\n            <span class=\"stat\">\u5168${posts.length}\u4EF6</span>\n            <span class=\"stat\">\u8A18\u9332\u306E\u307F: ${recordOnlyCount}\u4EF6</span>\n            <span class=\"stat\">\u76F8\u8AC7: ${consultationCount}\u4EF6</span>\n          </div>\n        </div>\n\n        ${visiblePosts.map((post, index) => `\n          <div class=\"timeline-item advanced ${!post.consultation_request ? 'record-only' : 'consultation'}\">\n            <div class=\"timeline-marker\">\n              <span class=\"marker-icon\">${!post.consultation_request ? '\uD83D\uDCDD' : '\uD83D\uDCA1'}</span>\n              <span class=\"marker-number\">${posts.length - index}</span>\n            </div>\n\n            <div class=\"timeline-content-body\">\n<div class=\"timeline-date\">\n  <span class=\"date-text\">${this.formatDateTime(post.created_at)}</span>\n  \n  ${this.currentOpenThread.is_owner !== false ? `\n    <div class=\"timeline-actions\">\n      ${membershipType !== 'non_member' ? `\n        <button onclick=\"window.plantApp.togglePostVisibility('${post.id}', ${post.is_public || false})\" \n                class=\"btn-visibility\" \n                title=\"\u516C\u958B\u8A2D\u5B9A\u3092\u5909\u66F4\">\n          ${post.is_public ? '\uD83D\uDD13 \u516C\u958B\u4E2D' : '\uD83D\uDD12 \u975E\u516C\u958B'}\n        </button>\n      ` : ''}\n      \n      <button onclick=\"window.plantApp.confirmDeletePost('${post.id}', '${this.currentOpenThread?.id || ''}')\" \n              class=\"btn-delete\" \n              title=\"\u3053\u306E\u6295\u7A3F\u3092\u524A\u9664\">\n        \uD83D\uDDD1\uFE0F \u524A\u9664\n      </button>\n    </div>\n  ` : ''}\n</div>\n              \n              <div class=\"post-content\">\n                ${post.consultation_request ? `\n                  <div class=\"consultation-section\">\n                    <h6>\u76F8\u8AC7\u5185\u5BB9</h6>\n                    <p>${this.escapeHtml(post.consultation_request)}</p>\n                  </div>\n                ` : `\n                  <div class=\"record-only-section\">\n                    <h6>\u8A18\u9332\u306E\u307F\u6295\u7A3F</h6>\n                    <p class=\"record-only-note\">AI\u5206\u6790\u306A\u3057\u306E\u8A18\u9332\u5C02\u7528\u6295\u7A3F</p>\n                  </div>\n                `}\n\n                ${post.notes ? `\n                  <div class=\"notes-section\">\n                    <h6>\u8A18\u9332\u30FB\u5099\u8003</h6>\n                    <p>${this.escapeHtml(post.notes)}</p>\n                  </div>\n                ` : ''}\n                \n                ${post.ai_response && post.ai_response.trim() !== '' ? `\n                  <div class=\"response-section\">\n                    <h6>AI\u5206\u6790\u7D50\u679C</h6>\n                    <div class=\"ai-response\">${this.formatResponse(post.ai_response)}</div>\n                  </div>\n                ` : ''}\n                \n                <div class=\"media-section\">\n                  ${post.input_image_url ? `\n                    <div class=\"post-image\">\n                      <img src=\"${post.input_image_url}\" alt=\"\u6295\u7A3F\u5199\u771F\" \n                           onclick=\"window.plantApp.showImageFullscreen('${post.input_image_url}', '\u6295\u7A3F\u5199\u771F ${this.formatDate(post.created_at)}')\"\n                           loading=\"lazy\">\n                    </div>\n                  ` : ''}\n\n                  ${post.ai_generated_image_url ? `\n                    <div class=\"generated-image\">\n                      <h7>\u751F\u6210\u30A4\u30E9\u30B9\u30C8</h7>\n                      <img src=\"${post.ai_generated_image_url}\" alt=\"\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\" \n                           onclick=\"window.plantApp.showImageFullscreen('${post.ai_generated_image_url}', '\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8 ${this.formatDate(post.created_at)}')\"\n                           loading=\"lazy\">\n                    </div>\n                  ` : ''}\n                </div>\n\n<div class=\"post-footer\">\n  <div class=\"follow-up-count\">\n    <span class=\"count-badge\">\u8FFD\u52A0\u76F8\u8AC7: ${post.follow_up_count || 0}/5\u56DE</span>\n    ${this.currentOpenThread?.is_owner !== false ? \n      ((post.follow_up_count || 0) < 5 ? \n        `<button onclick=\"window.plantApp.showFollowUpModal('${post.id}')\" class=\"btn btn-small btn-secondary\">\n          \u8FFD\u52A0\u76F8\u8AC7\n        </button>` :\n        '<span class=\"limit-reached\">\u4E0A\u9650\u5230\u9054</span>'\n      ) : \n      '<span class=\"other-user-post\">\u95B2\u89A7\u306E\u307F</span>'\n    }\n  </div>\n</div>\n              </div>\n            </div>\n          </div>\n        `).join('')}\n\n        ${hasMore ? `\n          <div class=\"timeline-load-more\">\n            <button class=\"btn btn-secondary btn-small\"\n                    onclick=\"window.plantApp.loadMoreTimeline('${this.currentOpenThread?.id || ''}')\">\n              \u3055\u3089\u306B\u8868\u793A\uFF08\u6B8B\u308A${posts.length - MAX_INITIAL}\u4EF6\uFF09\n            </button>\n          </div>\n        ` : ''}\n      </div>`;\n  }\n  // \u2605 \u3053\u3053\u307E\u3067\u7F6E\u304D\u63DB\u3048\n  async loadMoreTimeline(threadId) {\n    try {\n      if (!threadId && this.currentOpenThread) {\n        threadId = this.currentOpenThread.id;\n      }\n      if (!threadId) return;\n\n      const posts = await this.loadThreadPosts(threadId);\n      const timelineContent = document.querySelector('[data-tab=\"timeline\"].tab-content');\n      if (!timelineContent) return;\n\n      // \u4ECA\u5EA6\u306F noLimit = true \u3067\u5168\u4EF6\u8868\u793A\n      timelineContent.innerHTML = this.renderAdvancedTimelineTab(posts, true);\n    } catch (e) {\n      console.error('\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u8FFD\u52A0\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', e);\n      this.showTemporaryNotification('\u80B2\u6210\u8A18\u9332\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n    }\n  }\n\n\n  attachAdvancedTabEvents() {\n    const tabButtons = document.querySelectorAll('.tab-btn');\n    const tabContents = document.querySelectorAll('.tab-content');\n    \n    tabButtons.forEach(btn => {\n      btn.addEventListener('click', (e) => {\n        e.preventDefault();\n        const targetTab = btn.getAttribute('data-tab');\n        \n        tabButtons.forEach(b => b.classList.remove('active'));\n        tabContents.forEach(c => c.classList.remove('active'));\n        \n        btn.classList.add('active');\n        const targetContent = document.querySelector(`[data-tab=\"${targetTab}\"].tab-content`);\n        if (targetContent) {\n          targetContent.classList.add('active');\n        }\n\n        // Grow Ops \u30BF\u30D6\u3092\u521D\u3081\u3066\u958B\u3044\u305F\u3068\u304D\u306B\u30C7\u30FC\u30BF\u3092\u8AAD\u307F\u8FBC\u3080\n        if (targetTab === 'grow-ops') {\n          const wrap = document.querySelector('.gops-wrap[data-loading=\"true\"]');\n          if (wrap) {\n            const tid = wrap.dataset.threadId;\n            wrap.dataset.loading = 'false';\n            this.loadGrowOpsData(tid);\n          }\n        }\n      });\n    });\n  }\n\n  closeRecordModal(event) {\n    if (event.target.id === 'plant-record-modal') {\n      this.closeAllModals();\n      this.currentOpenThread = null;\n    }\n  }\n\n  handleEscapeKey(event) {\n    if (event.key === 'Escape') {\n      this.closeAllModals();\n      this.currentOpenThread = null;\n    }\n  }\n\n  async loadThreadPosts(threadId) {\n    try {\n      console.log('\u6295\u7A3F\u5C65\u6B74\u8AAD\u307F\u8FBC\u307F\u958B\u59CB:', threadId);\n\u3000\u3000\u3000\u3000\n      const response = await fetch(`${this.apiBase}?action=thread_posts`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({ \n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n          entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId\n        })\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      console.log('\u6295\u7A3F\u5C65\u6B74\u53D6\u5F97\u6210\u529F:', (data.posts || []).length + '\u4EF6');\n      \n      return data.posts || [];\n\n    } catch (error) {\n      console.error('\u6295\u7A3F\u5C65\u6B74\u306E\u53D6\u5F97\u306B\u5931\u6557:', error);\n      throw error;\n    }\n  }\n\n  async showFollowUpModal(postId) {\n    console.log('\u8FFD\u52A0\u76F8\u8AC7\u30E2\u30FC\u30C0\u30EB\u8868\u793A\u958B\u59CB:', postId);\n    this.closeAllModals();\n    this.loadPostForFollowUp(postId);\n  }\n\nasync loadPostForFollowUp(postId) {\n  try {\n    // \u307E\u305A\u73FE\u5728\u306E\u30B9\u30EC\u30C3\u30C9\u304B\u3089\u6295\u7A3F\u3092\u691C\u7D22\n    const response = await fetch(`${this.apiBase}?action=thread_posts`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n        thread_id: this.currentOpenThread?.id || ''\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n    const post = data.posts?.find(p => p.id === postId);\n    \n    if (!post) {\n      throw new Error('\u6295\u7A3F\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    }\n\n    // \u690D\u7269\u540D\u306E\u78BA\u4FDD\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u51E6\u7406\uFF09\n    const plantName = post.plant_name || \n                     data.thread_info?.plant_name || \n                     this.currentOpenThread?.plant_name || \n                     '\u690D\u7269';\n\n    // post\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B\u690D\u7269\u540D\u3092\u78BA\u5B9F\u306B\u8A2D\u5B9A\n    const enrichedPost = {\n      ...post,\n      plant_name: plantName\n    };\n\n    this.renderFollowUpModal(enrichedPost);\n    \n  } catch (error) {\n    console.error('\u6295\u7A3F\u60C5\u5831\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification('\u6295\u7A3F\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n  }\n}\n\n  renderFollowUpModal(post) {\n    const modalHtml = `\n      <div id=\"follow-up-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-content follow-up-modal\" onclick=\"event.stopPropagation()\">\n          <div class=\"modal-header\">\n            <h3>\u8FFD\u52A0\u76F8\u8AC7</h3>\n            <div class=\"post-context\">\n              <small>\u300C${this.escapeHtml(post.plant_name || '')}\u300D\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u8CEA\u554F</small>\n            </div>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n          </div>\n          \n          <div class=\"modal-body\">\n            <div class=\"original-post-summary\">\n              <h5>\u5143\u306E\u76F8\u8AC7\u5185\u5BB9</h5>\n              <div class=\"post-content\">\n                ${post.consultation_request ? `\n                  <div class=\"consultation-section\">\n                    <strong>\u76F8\u8AC7\u5185\u5BB9:</strong>\n                    <p>${this.escapeHtml(post.consultation_request)}</p>\n                  </div>` : ''}\n                \n                ${post.notes ? `\n                  <div class=\"notes-section\">\n                    <strong>\u8A18\u9332\u30FB\u5099\u8003:</strong>\n                    <p>${this.escapeHtml(post.notes)}</p>\n                  </div>\n                ` : ''}\n                \n                ${post.ai_response ? `\n                  <div class=\"ai-response-section\">\n                    <strong>AI\u56DE\u7B54:</strong>\n                    <div class=\"response-content\">${this.formatResponse(post.ai_response)}</div>\n                  </div>\n                ` : ''}\n              </div>\n            </div>\n            \n            <div class=\"follow-up-form-section\">\n              <h5>\u8FFD\u52A0\u3067\u8CEA\u554F\u3057\u305F\u3044\u3053\u3068</h5>\n              <div class=\"form-group\">\n                <textarea id=\"follow-up-text-modal\" \n                          placeholder=\"\u4F8B:\n- \u4ED6\u306B\u6C17\u3092\u3064\u3051\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u3059\u304B\uFF1F\n- \u3069\u306E\u304F\u3089\u3044\u306E\u983B\u5EA6\u3067\u884C\u3048\u3070\u3088\u3044\u3067\u3059\u304B\uFF1F\n- \u75C7\u72B6\u304C\u6539\u5584\u3055\u308C\u306A\u3044\u5834\u5408\u306F\u3069\u3046\u3059\u308C\u3070\u3088\u3044\u3067\u3059\u304B\uFF1F\n- ${this.seasonInfo.seasonName}\u306B\u3088\u308B\u9055\u3044\u306F\u3042\u308A\u307E\u3059\u304B\uFF1F\" \n                          rows=\"4\"></textarea>\n                <div class=\"help-text\">\n                  <small>\u73FE\u5728\u306E\u5B63\u7BC0\uFF08${this.seasonInfo.displayText}\uFF09\u3092\u8003\u616E\u3057\u305F\u8CEA\u554F\u304C\u3067\u304D\u307E\u3059</small>\n                </div>\n              </div>\n              \n              <div class=\"form-actions\">\n                <button onclick=\"window.plantApp.submitFollowUpFromModal('${post.id}')\" \n                        class=\"btn btn-primary\" id=\"follow-up-submit-btn\">\n                  \u8FFD\u52A0\u76F8\u8AC7\u3092\u9001\u4FE1\n                </button>\n                <button onclick=\"window.plantApp.closeAllModals()\" class=\"btn btn-secondary\">\n                  \u30AD\u30E3\u30F3\u30BB\u30EB\n                </button>\n              </div>\n            </div>\n            \n            <div class=\"follow-up-history-section\">\n              <h5>\u8FFD\u52A0\u76F8\u8AC7\u5C65\u6B74</h5>\n              <div id=\"follow-ups-list-modal-${post.id}\" class=\"follow-ups-list\">\n                <div class=\"loading\">\u5C65\u6B74\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n\n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n    \n    this.loadFollowUpHistory(post.id);\n    \n    const handleEscKey = (e) => {\n      if (e.key === 'Escape') {\n        this.closeAllModals();\n        document.removeEventListener('keydown', handleEscKey);\n      }\n    };\n    document.addEventListener('keydown', handleEscKey);\n  }\n\n  async loadFollowUpHistory(postId) {\n    try {\n      const response = await fetch(`${this.apiBase}?action=get_follow_ups`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n          consultation_post_id: postId\n        })\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      \n      if (data.success && data.follow_ups) {\n        this.renderFollowUpHistory(postId, data.follow_ups);\n      } else {\n        this.renderFollowUpHistory(postId, []);\n      }\n      \n    } catch (error) {\n      console.error('\u8FFD\u52A0\u76F8\u8AC7\u5C65\u6B74\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n      this.renderFollowUpHistory(postId, []);\n    }\n  }\nrenderFollowUpHistory(postId, history) {\n  const container = document.getElementById(`follow-ups-list-modal-${postId}`);\n  if (!container) return;\n\n  if (!history.length) {\n    container.innerHTML = `\n      <div class=\"no-follow-ups\">\n        <p>\u307E\u3060\u8FFD\u52A0\u76F8\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093</p>\n        <p><small>\u3053\u306E\u6295\u7A3F\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u8CEA\u554F\u3057\u305F\u3044\u3053\u3068\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044</small></p>\n      </div>\n    `;\n    return;\n  }\n\n  container.innerHTML = history.map((followUp, index) => `\n    <div class=\"follow-up-item\">\n      <div class=\"follow-up-header\">\n        <span class=\"sequence\">\u8FFD\u52A0\u76F8\u8AC7 ${followUp.sequence_number}/5</span>\n        <span class=\"timestamp\">${this.formatDateTime(followUp.created_at)}</span>\n      </div>\n      <div class=\"follow-up-question\">\n        <strong>\u8CEA\u554F:</strong> ${this.escapeHtml(followUp.consultation_text)}\n      </div>\n      <div class=\"follow-up-answer\">\n        <strong>AI\u56DE\u7B54:</strong> ${this.formatResponse(followUp.ai_response)}\n      </div>\n    </div>\n  `).join('');\n\n  // \u2605 \u8FFD\u52A0\uFF1A\u6700\u65B0\u306E\u8FFD\u52A0\u76F8\u8AC7\u307E\u3067\u30B9\u30AF\u30ED\u30FC\u30EB\n  if (history.length > 0) {\n    setTimeout(() => {\n      const lastItem = container.querySelector('.follow-up-item:last-child');\n      if (lastItem) {\n        lastItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      }\n    }, 100);\n  }\n}\n\n async submitFollowUpFromModal(postId) {\n  const textArea = document.getElementById('follow-up-text-modal');\n  const followUpText = textArea?.value?.trim();\n  if (!followUpText) {\n    this.showTemporaryNotification('\u76F8\u8AC7\u5185\u5BB9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n  if (followUpText.length > 1000) {\n    this.showTemporaryNotification('\u76F8\u8AC7\u5185\u5BB9\u306F1000\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n\n  try {\n    const submitBtn = document.getElementById('follow-up-submit-btn');\n    const originalText = submitBtn?.textContent || '';\n    if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = '\u9001\u4FE1\u4E2D...'; }\n\n    // \u25BC\u25BC \u3053\u3053\u3067 \u201C\u65B9\u5411\u6027\u30D2\u30F3\u30C8\u201D \u3092\u751F\u6210\uFF08\u30E2\u30FC\u30C0\u30EB\u306E\u8FFD\u8A18\u30C6\u30AD\u30B9\u30C8\uFF09\n    const hint = this.classifyScene({\n      plantName: this.currentOpenThread?.plant_name || '',\n      consultationRequest: followUpText,\n      notes: ''\n    });\n\n    const response = await fetch(`${this.apiBase}?action=follow_up_consultation`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n        consultation_post_id: postId,\n        consultation_text: followUpText,\n        current_season: this.seasonInfo,\n\n        // \u25BC\u25BC \u8FFD\u8A18\uFF1AEdge \u3078\u6E21\u3059\u30D2\u30F3\u30C8\n        scene_hint: {\n          scene: hint.scene,\n          confidence: hint.confidence,\n          plant_type: hint.plantType\n        },\n        vision_guidance:\n          '\u5199\u771F\u3068\u30C6\u30AD\u30B9\u30C8\u306E\u4E21\u65B9\u3092\u6839\u62E0\u306B\u3001\u53EF\u80FD\u6027\u306E\u9AD8\u3044\u5019\u88DC(1\u301C3)\u3068\u6839\u62E0\u3092\u7C21\u6F54\u306B\u793A\u3059\u3002\u5B8C\u5168\u4E0D\u660E\u3067\u7D42\u308F\u3089\u306A\u3044\u3002\u89B3\u5BDF\u3059\u3079\u304D\u90E8\u4F4D\u30821\u884C\u6DFB\u3048\u308B\u3002'\n      })\n    });\n\n    const data = await response.json();\nif (!response.ok || !data.success) {\n  if (data.error === 'consultation_limit_reached') {\n    this.showConsultationLimitModal(data);\n    return;\n  }\n  throw new Error(data.error || '\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n}\n\nif (!response.ok || !data.success) {\n  if (data.error === 'consultation_limit_reached') {\n    this.showConsultationLimitModal(data);\n    return;\n  }\n  throw new Error(data.error || '\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n}\n    if (data.success) {\n      textArea.value = '';\n      this.showTemporaryNotification(`\u8FFD\u52A0\u76F8\u8AC7 ${data.sequence_number}/5 \u3092\u9001\u4FE1\u3057\u307E\u3057\u305F`, 'success');\n\n      await this.loadFollowUpHistory(postId);\n      this.updateMainFollowUpSection(postId, data);\n\n  if (this.currentOpenThread?.id) {\n    await this.loadThreadPosts(this.currentOpenThread.id);\n  }\n\n  if (data.remaining_consultations === 0) {\n    setTimeout(() => { this.closeAllModals(); }, 2000);\n  }\n    } else {\n      throw new Error(data.error || '\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n\n  } catch (error) {\n    console.error('\u8FFD\u52A0\u76F8\u8AC7\u9001\u4FE1\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(`\u8FFD\u52A0\u76F8\u8AC7\u306B\u5931\u6557: ${error.message}`, 'error');\n  } finally {\n    const submitBtn = document.getElementById('follow-up-submit-btn');\n    if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = '\u8FFD\u52A0\u76F8\u8AC7\u3092\u9001\u4FE1'; }\n  }\n}\n\n\n  updateMainFollowUpSection(postId, data) {\n    const mainFollowUpSection = document.getElementById(`follow-up-section-${postId}`);\n    if (mainFollowUpSection) {\n      const sectionHeader = mainFollowUpSection.querySelector('h5');\n      if (sectionHeader) {\n        sectionHeader.textContent = `\u3053\u306E\u8A18\u9332\u306B\u3064\u3044\u3066\u8FFD\u52A0\u3067\u76F8\u8AC7\u3059\u308B (${data.sequence_number}/5)`;\n      }\n      \n      if (data.remaining_consultations === 0) {\n        const followUpForm = mainFollowUpSection.querySelector('.follow-up-form');\n        if (followUpForm) {\n          followUpForm.innerHTML = `\n            <div class=\"follow-up-limit-reached\">\n              <p class=\"limit-reached\">\u3053\u306E\u8A18\u9332\u3078\u306E\u8FFD\u52A0\u76F8\u8AC7\u306F5\u56DE\u306B\u9054\u3057\u307E\u3057\u305F</p>\n              <div class=\"limit-reached-info\">\n                <p><small>\u65B0\u3057\u3044\u6295\u7A3F\u3092\u3059\u308B\u3053\u3068\u3067\u3001\u307E\u305F5\u56DE\u307E\u3067\u8FFD\u52A0\u76F8\u8AC7\u3067\u304D\u307E\u3059</small></p>\n              </div>\n            </div>\n          `;\n        }\n      }\n    }\n  }\n\n  renderAdvancedCareLogTab(threadData) {\n    return `<div class=\"care-log-content\">\n        <div class=\"care-log-header\">\n          <div class=\"header-info\">\n            <h4>\u30B1\u30A2\u8A18\u9332</h4>\n            <p>\u6C34\u3084\u308A\u30FB\u80A5\u6599\u30FB\u690D\u3048\u66FF\u3048\u306A\u3069\u306E\u30B1\u30A2\u5C65\u6B74\u3092\u7BA1\u7406</p>\n          </div>\n<div class=\"header-actions\">\n  ${this.currentOpenThread?.is_owner !== false ? `\n    <button onclick=\"window.plantApp.showAddCareModal('${threadData.id}')\" class=\"btn btn-primary btn-small\">\n      + \u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0\n    </button>\n  ` : ''}\n</div>\n        </div>\n\n        <div id=\"care-records-container\">\n          <div class=\"loading\">\u30B1\u30A2\u8A18\u9332\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n        </div>\n      </div>`;\n  }\n\n  async loadCareRecords(threadId) {\n    const container = document.getElementById('care-records-container');\n    if (!container) {\n      console.error('care-records-container \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n      return;\n    }\n\n    try {\n      console.log('\u30B1\u30A2\u8A18\u9332\u8AAD\u307F\u8FBC\u307F\u958B\u59CB:', threadId);\n\n      const response = await fetch(`${this.apiBase}?action=get_care_records`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId\n        })\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      \n      if (data.error) {\n        throw new Error(data.error);\n      }\n\nconsole.log('\u30B1\u30A2\u8A18\u9332\u53D6\u5F97\u6210\u529F:', data.records?.length || 0);\nthis.renderAdvancedCareRecordsList(data.records || []);\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u8A18\u9332\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n      container.innerHTML = `\n        <div class=\"error-message\">\n          <h5>\u30B1\u30A2\u8A18\u9332\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557</h5>\n          <p>\u30A8\u30E9\u30FC: ${error.message}</p>\n          <div class=\"error-actions\">\n            <button onclick=\"window.plantApp.loadCareRecords('${threadId}')\" class=\"btn btn-small\">\n              \u518D\u8AAD\u307F\u8FBC\u307F\n            </button>\n          </div>\n        </div>\n      `;\n    }\n  }\n\n  renderAdvancedCareRecordsList(careRecords) {\n    const container = document.getElementById('care-records-container');\n    if (!container) return;\n\n    if (!careRecords.length) {\n      container.innerHTML = `\n        <div class=\"no-care-records\">\n          <div class=\"empty-icon\">\uD83D\uDCDD</div>\n          <h5>\u307E\u3060\u30B1\u30A2\u8A18\u9332\u304C\u3042\u308A\u307E\u305B\u3093</h5>\n          <p>\u6C34\u3084\u308A\u30FB\u80A5\u6599\u306A\u3069\u306E\u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0\u3057\u3066\u307F\u307E\u3057\u3087\u3046\uFF01</p>\n          <div class=\"care-benefits\">\n            <h6>\u30B1\u30A2\u8A18\u9332\u306E\u30E1\u30EA\u30C3\u30C8</h6>\n            <ul>\n              <li>\u30B1\u30A2\u9593\u9694\u306E\u6700\u9069\u5316</li>\n              <li>\u690D\u7269\u306E\u5065\u5EB7\u72B6\u614B\u628A\u63E1</li>\n              <li>\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u30B1\u30A2\u8ABF\u6574</li>\n              <li>\u554F\u984C\u306E\u65E9\u671F\u767A\u898B</li>\n            </ul>\n          </div>\n        </div>\n      `;\n      return;\n    }\n\n    const groupedRecords = this.groupCareRecordsByType(careRecords);\n    \n    container.innerHTML = `\n      <div class=\"care-records-summary\">\n        <h5>\u30B1\u30A2\u8A18\u9332\u30B5\u30DE\u30EA\u30FC</h5>\n        <div class=\"summary-stats\">\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u7DCF\u8A18\u9332\u6570</span>\n            <span class=\"stat-value\">${careRecords.length}\u4EF6</span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u30B1\u30A2\u7A2E\u985E</span>\n            <span class=\"stat-value\">${Object.keys(groupedRecords).length}\u7A2E\u985E</span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u6700\u7D42\u30B1\u30A2</span>\n            <span class=\"stat-value\">${this.formatDate(careRecords[0]?.care_date)}</span>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"care-records-by-type\">\n        ${Object.entries(groupedRecords).map(([careType, records]) => \n          this.renderCareTypeSection(careType, records)\n        ).join('')}\n      </div>\n      \n      <div class=\"care-records-timeline\">\n        <h5>\u3059\u3079\u3066\u306E\u30B1\u30A2\u8A18\u9332</h5>\n        <div class=\"records-list\">\n          ${careRecords.map(record => this.renderCareRecordItem(record)).join('')}\n        </div>\n      </div>\n    `;\n  }\n\n  groupCareRecordsByType(records) {\n    const grouped = {};\n    records.forEach(record => {\n      if (!grouped[record.care_type]) {\n        grouped[record.care_type] = [];\n      }\n      grouped[record.care_type].push(record);\n    });\n    return grouped;\n  }\n\n  renderCareTypeSection(careType, records) {\n    const latestRecord = records[0];\n    const totalCount = records.length;\n    const careInfo = this.careTypes[careType] || this.careTypes.other;\n    \n    return `<div class=\"care-type-section\">\n        <div class=\"care-type-header\">\n          <div class=\"care-type-info\">\n            <span class=\"care-icon\">${careInfo.icon}</span>\n            <h6>${careInfo.name}</h6>\n          </div>\n          <div class=\"care-type-stats\">\n            <span class=\"count\">${totalCount}\u56DE</span>\n            <span class=\"latest\">\u6700\u65B0: ${this.formatDate(latestRecord.care_date)}</span>\n          </div>\n        </div>\n        <div class=\"recent-records\">\n          ${records.slice(0, 3).map(record => `\n            <div class=\"mini-record\">\n              <span class=\"date\">${this.formatDate(record.care_date)}</span>\n              ${record.notes ? `<span class=\"note\">${this.escapeHtml(record.notes.substring(0, 30))}${record.notes.length > 30 ? '...' : ''}</span>` : ''}\n            </div>\n          `).join('')}\n          ${records.length > 3 ? `<div class=\"more-records\">+${records.length - 3}\u4EF6</div>` : ''}\n        </div>\n      </div>`;\n  }\n\n  renderCareRecordItem(record) {\n    const careInfo = this.careTypes[record.care_type] || this.careTypes.other;\n    \n    return `<div class=\"care-record-item\">\n        <div class=\"care-header\">\n          <span class=\"care-info\">\n            <span class=\"care-icon\">${careInfo.icon}</span>\n            <span class=\"care-type\">${careInfo.name}</span>\n          </span>\n          <span class=\"care-date\">${this.formatDate(record.care_date)}</span>\n        </div>\n        ${record.notes ? `\n          <div class=\"care-notes\">\n            <p>${this.escapeHtml(record.notes)}</p>\n          </div>\n        ` : ''}\n        ${record.auto_detected ? `\n          <div class=\"auto-detected\">\n            <small>\u81EA\u52D5\u8A18\u9332\uFF08\u30B1\u30A2\u901A\u77E5\u304B\u3089\uFF09</small>\n          </div>\n        ` : ''}\n        ${record.image_url ? `\n          <div class=\"care-image\">\n            <img src=\"${record.image_url}\" alt=\"\u30B1\u30A2\u8A18\u9332\" \n                 onclick=\"window.plantApp.showImageFullscreen('${record.image_url}', '\u30B1\u30A2\u8A18\u9332 ${this.formatDate(record.care_date)}')\"\n                 loading=\"lazy\">\n          </div>\n        ` : ''}\n      </div>`;\n  }\n\n  closeAddCareModal() {\n    const modal = document.getElementById('add-care-modal');\n    if (modal) modal.remove();\n  }\n\n  showAddCareModal(threadId) {\n    // plant-record-modal \u306F\u9589\u3058\u305A\u3001add-care-modal \u3060\u3051\u3092\u91CD\u306D\u3066\u8868\u793A\n    const existing = document.getElementById('add-care-modal');\n    if (existing) existing.remove();\n\n    const modalHtml = `\n      <div id=\"add-care-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n          <div class=\"modal-header\">\n            <h3>\u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0</h3>\n            <div class=\"season-context\">\n              <small>${this.seasonInfo.displayText}\u306E\u5B63\u7BC0\u3092\u8003\u616E\u3057\u305F\u30B1\u30A2\u8A18\u9332</small>\n            </div>\n            <button onclick=\"window.plantApp.closeAddCareModal()\" class=\"close-btn\">\u00D7</button>\n          </div>\n          <div class=\"modal-body\">\n            <form id=\"add-care-form\">\n\n              <div class=\"form-group\">\n                <label for=\"care-type-select\">\u30B1\u30A2\u306E\u7A2E\u985E *</label>\n                <select id=\"care-type-select\" required>\n                  <option value=\"\">\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044</option>\n                  ${Object.entries(this.careTypes).map(([type, config]) =>\n                    `<option value=\"${type}\">${config.icon} ${config.name}</option>`\n                  ).join('')}\n                </select>\n              </div>\n\n              <div class=\"form-group\">\n                <label for=\"care-date-input\">\u30B1\u30A2\u65E5 *</label>\n                <input type=\"date\" id=\"care-date-input\" value=\"${new Date().toISOString().split('T')[0]}\" required>\n                <div class=\"help-text\">\u5B9F\u969B\u306B\u30B1\u30A2\u3092\u884C\u3063\u305F\u65E5\u4ED8\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044</div>\n              </div>\n\n              <div class=\"form-group\">\n                <label for=\"care-notes-input\">\u30B1\u30A2\u5185\u5BB9\u30FB\u30E1\u30E2</label>\n                <textarea id=\"care-notes-input\" rows=\"3\"\n                          placeholder=\"\u4F8B:\n- \u6C34\u3084\u308A: \u30B3\u30C3\u30D71\u676F\u5206\u306E\u6C34\u3092\u3042\u3052\u307E\u3057\u305F\n- \u80A5\u6599: \u6DB2\u4F53\u80A5\u6599\u3092\u898F\u5B9A\u91CF\u3067\u5E0C\u91C8\u3057\u3066\u4E0E\u3048\u307E\u3057\u305F\n- \u690D\u3048\u66FF\u3048: \u4E00\u56DE\u308A\u5927\u304D\u306A\u9262\u306B\u690D\u3048\u66FF\u3048\u307E\u3057\u305F\n- \u526A\u5B9A: \u9EC4\u8272\u3044\u8449\u3092\u53D6\u308A\u9664\u304D\u307E\u3057\u305F\"></textarea>\n                <div class=\"help-text\">\u5177\u4F53\u7684\u306A\u30B1\u30A2\u5185\u5BB9\u3092\u8A18\u9332\u3059\u308B\u3068\u3001\u5F8C\u3067\u632F\u308A\u8FD4\u308A\u3084\u3059\u304F\u306A\u308A\u307E\u3059</div>\n              </div>\n\n              <div class=\"form-group\">\n                <label for=\"custom-next-date-input\">\u6B21\u56DE\u4E88\u5B9A\u65E5\uFF08\u4EFB\u610F\uFF09</label>\n                <input type=\"date\" id=\"custom-next-date-input\">\n                <div class=\"help-text\">\u7A7A\u6B04\u306E\u5834\u5408\u306F\u5B63\u7BC0\u5BFE\u5FDC\u306E\u63A8\u5968\u9593\u9694\u3092\u81EA\u52D5\u8A2D\u5B9A\u3057\u307E\u3059</div>\n              </div>\n\n              <div class=\"seasonal-tips\">\n                <h6>${this.seasonInfo.displayText}\u306E\u30B1\u30A2\u306E\u30B3\u30C4</h6>\n                <p>${this.getSeasonalCareMessage(this.seasonInfo.season)}</p>\n              </div>\n\n              <div class=\"form-actions\">\n                <button type=\"submit\" class=\"btn btn-primary\">\u8A18\u9332\u3092\u4FDD\u5B58</button>\n                <button type=\"button\" onclick=\"window.plantApp.closeAddCareModal()\" class=\"btn btn-secondary\">\u30AD\u30E3\u30F3\u30BB\u30EB</button>\n              </div>\n\n              <div id=\"care-save-status\" class=\"save-status\"></div>\n\n            </form>\n          </div>\n        </div>\n      </div>\n    `;\n\n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n\n    const form = document.getElementById('add-care-form');\n    \n    if (form) {\n      form.addEventListener('submit', (e) => {\n        e.preventDefault();\n        this.saveCareRecord(threadId);\n      });\n    }\n\n    const handleEscKey = (e) => {\n      if (e.key === 'Escape') {\n        this.closeAddCareModal();\n        document.removeEventListener('keydown', handleEscKey);\n      }\n    };\n    document.addEventListener('keydown', handleEscKey);\n  }\n\n  async saveCareRecord(threadId) {\n    const careType = document.getElementById('care-type-select')?.value;\n    const careDate = document.getElementById('care-date-input')?.value;\n    const notes = document.getElementById('care-notes-input')?.value;\n    const customNextDate = document.getElementById('custom-next-date-input')?.value;\n\n    if (!careType || !careDate) {\n      this.showTemporaryNotification('\u30B1\u30A2\u306E\u7A2E\u985E\u3068\u65E5\u4ED8\u306F\u5FC5\u9808\u3067\u3059', 'error');\n      return;\n    }\n\n    try {\n      const response = await fetch(`${this.apiBase}?action=save_care_record`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement || {},\n          entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId,\n          care_type: careType,\n          care_date: careDate,\n          notes: notes || '',\n          custom_next_date: customNextDate || null\n        })\n      });\n\n      const result = await response.json();\n\n      if (result.success) {\n        this.showTemporaryNotification('\u30B1\u30A2\u8A18\u9332\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F', 'success');\n        // add-care-modal \u306E\u307F\u9589\u3058\u308B\uFF08plant-record-modal \u306F\u7DAD\u6301\uFF09\n        this.closeAddCareModal();\n        // \u30B1\u30A2\u8A18\u9332\u30BF\u30D6\u306B\u5207\u308A\u66FF\u3048 & \u4E00\u89A7\u3092\u66F4\u65B0\n        await this.loadCareRecords(threadId);\n        const careLogBtn = document.querySelector('.tab-btn[data-tab=\"care-log\"]');\n        if (careLogBtn) careLogBtn.click();\n      } else {\n        throw new Error(result.error);\n      }\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u8A18\u9332\u4FDD\u5B58\u30A8\u30E9\u30FC:', error);\n      this.showTemporaryNotification(`\u4FDD\u5B58\u306B\u5931\u6557: ${error.message}`, 'error');\n    }\n  }\n\nrenderCareAlertsTab(threadId) {\n  const membershipType = this.getMembershipType();\n  const isOwner = this.currentOpenThread?.is_owner !== false;\n  \n  // \u2605\u2605\u2605 \u81EA\u5206\u306E\u6295\u7A3F\u3067\u7121\u6599\u4F1A\u54E1\u306E\u5834\u5408\u306E\u307F\u8A34\u6C42\u8868\u793A \u2605\u2605\u2605\n  if (isOwner && membershipType !== 'paid_member') {\n    return `<div class=\"care-alerts-content\">\n        <div class=\"care-alerts-upgrade-required\">\n          <div class=\"feature-locked\">\n            <div class=\"lock-icon\">\uD83D\uDD12</div>\n            <h5>\u30B1\u30A2\u901A\u77E5\u6A5F\u80FD</h5>\n            <p>\u5B63\u7BC0\u5BFE\u5FDC\u306E\u30B1\u30A2\u901A\u77E5\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u6A5F\u80FD\u3067\u3059</p>\n          </div>\n          \n          <div class=\"feature-preview\">\n            <h6>\u6709\u6599\u7248\u3067\u5229\u7528\u3067\u304D\u308B\u6A5F\u80FD</h6>\n            <ul>\n              <li>\u6C34\u3084\u308A\u30FB\u80A5\u6599\u306E\u30BF\u30A4\u30DF\u30F3\u30B0\u901A\u77E5</li>\n              <li>\u5B63\u7BC0\u306B\u5FDC\u3058\u305F\u30B1\u30A2\u9593\u9694\u81EA\u52D5\u8ABF\u6574</li>\n              <li>\u690D\u3048\u66FF\u3048\u30FB\u526A\u5B9A\u306E\u63A8\u5968\u6642\u671F\u6848\u5185</li>\n              <li>\u5BB3\u866B\u5BFE\u7B56\u306E\u30A2\u30E9\u30FC\u30C8</li>\n              <li>\u512A\u5148\u5EA6\u5225\u30B1\u30A2\u7BA1\u7406</li>\n              <li>\u5B63\u7BC0\u5225\u30B1\u30A2\u306E\u30B3\u30C4\u914D\u4FE1</li>\n              <li>\u30B1\u30A2\u9593\u9694\u306E\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA</li>\n            </ul>\n          </div>\n          \n          <div class=\"seasonal-demo\">\n            <h6>\u5B63\u7BC0\u5BFE\u5FDC\u306E\u4F8B</h6>\n            <div class=\"season-examples\">\n              <div class=\"season-example\">\n                <strong>\u6625\uFF083-5\u6708\uFF09:</strong> \u6210\u9577\u671F\u306E\u305F\u3081\u6C34\u3084\u308A\u983B\u5EA620%\u5897\u52A0\n              </div>\n              <div class=\"season-example\">\n                <strong>\u590F\uFF086-8\u6708\uFF09:</strong> \u9AD8\u6E29\u306E\u305F\u3081\u6C34\u3084\u308A\u983B\u5EA640%\u5897\u52A0\n              </div>\n              <div class=\"season-example\">\n                <strong>\u79CB\uFF089-11\u6708\uFF09:</strong> \u6A19\u6E96\u9593\u9694\u3067\u306E\u7BA1\u7406\n              </div>\n              <div class=\"season-example\">\n                <strong>\u51AC\uFF0812-2\u6708\uFF09:</strong> \u4F11\u7720\u671F\u306E\u305F\u3081\u6C34\u3084\u308A\u983B\u5EA650%\u6E1B\u5C11\n              </div>\n            </div>\n          </div>\n          \n          <div class=\"upgrade-action\">\n            <a href=\"/pages/botanical-record#plans\" class=\"btn btn-primary\">\n              \u6709\u6599\u30D7\u30E9\u30F3\u3092\u898B\u308B\uFF08\u6700\u5B89 \u6708\u00A5250\u301C\uFF09\n            </a>\n            <p class=\"upgrade-benefits\">\u30B1\u30A2\u901A\u77E5 + AI\u753B\u50CF\u751F\u6210 + \u690D\u726950\u500B\u307E\u3067\u767B\u9332</p>\n          </div>\n        </div>\n      </div>`;\n  }\n\n  // \u2605\u2605\u2605 \u305D\u308C\u4EE5\u5916\u306E\u5834\u5408\u306F\u30B1\u30A2\u901A\u77E5\u30C7\u30FC\u30BF\u3092\u8868\u793A \u2605\u2605\u2605\n  return `<div class=\"care-alerts-content\">\n      <div class=\"care-alerts-header\">\n        <h4>\u30B1\u30A2\u901A\u77E5</h4>\n        <p>\u690D\u7269\u306E\u30B1\u30A2\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u304A\u77E5\u3089\u305B\u3057\u307E\u3059</p>\n        <div class=\"current-season\">\n          ${this.seasonInfo.displayText} - \u30B1\u30A2\u9593\u9694\u81EA\u52D5\u8ABF\u6574\u4E2D\n        </div>\n        ${isOwner ? `\n          <div class=\"care-settings-controls\">\n            <button onclick=\"window.plantApp.showCareSettingsModal('${threadId}')\" \n                     class=\"btn btn-secondary btn-small\">\n              \u2699\uFE0F \u30B1\u30A2\u9593\u9694\u3092\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\n            </button>\n          </div>\n        ` : ''}\n      </div>\n\n      <div id=\"care-alerts-container-${threadId}\">\n        <div class=\"loading\">\u30B1\u30A2\u901A\u77E5\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n      </div>\n    </div>`;\n}\nasync loadCareAlerts(threadId) {\n  const container = document.getElementById(`care-alerts-container-${threadId}`);\n  if (!container) {\n    console.error('care-alerts-container \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n\n  try {\n    console.log('\u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u8AAD\u307F\u8FBC\u307F\u958B\u59CB:', threadId);\n\n    const response = await fetch(`${this.apiBase}?action=care_alerts`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        entitlement_snapshot: this.entitlementSnapshot,\n        thread_id: threadId\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n    \n    if (data.error) {\n      throw new Error(data.error);\n    }\nconsole.log('\uD83D\uDCE6 \u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u306E\u751F\u30C7\u30FC\u30BF:', data);\nconsole.log('\u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u53D6\u5F97\u6210\u529F:', data.alerts?.length || 0);\nconsole.log('\uD83D\uDCE6 \u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u306E\u751F\u30C7\u30FC\u30BF:', data);\nconsole.log('\uD83D\uDCE6 \u6700\u521D\u306E\u30A2\u30E9\u30FC\u30C8\uFF08\u5168\u4F53\uFF09:', JSON.stringify(data.alerts[0], null, 2));\nconsole.log('\u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u53D6\u5F97\u6210\u529F:', data.alerts?.length || 0);\n    this.renderCareAlertsList(data.alerts || [], data.summary, threadId);\n\n  } catch (error) {\n    console.error('\u30B1\u30A2\u30A2\u30E9\u30FC\u30C8\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n    container.innerHTML = `\n      <div class=\"error-message\">\n        <h5>\u30B1\u30A2\u901A\u77E5\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557</h5>\n        <p>\u30A8\u30E9\u30FC: ${error.message}</p>\n        <div class=\"error-actions\">\n          <button onclick=\"window.plantApp.loadCareAlerts('${threadId}')\" class=\"btn btn-small\">\n            \u518D\u8AAD\u307F\u8FBC\u307F\n          </button>\n          <a href=\"/pages/contact\" class=\"btn btn-small btn-primary\" target=\"_blank\">\n            \u30B5\u30DD\u30FC\u30C8\u306B\u9023\u7D61\n          </a>\n        </div>\n      </div>\n    `;\n  }\n}\n\n  renderCareAlertsList(alerts, summary, threadId) {\n    const container = document.getElementById(`care-alerts-container-${threadId}`);\n    if (!container) return;\n\n    if (!alerts.length) {\n      container.innerHTML = `\n        <div class=\"no-care-alerts\">\n          <div class=\"empty-icon\">\u2B50</div>\n          <h5>\u73FE\u5728\u3001\u7DCA\u6025\u306E\u30B1\u30A2\u901A\u77E5\u306F\u3042\u308A\u307E\u305B\u3093</h5>\n          <p>\u690D\u7269\u306E\u72B6\u614B\u306F\u826F\u597D\u3067\u3059\u3002\u5B9A\u671F\u7684\u306A\u30B1\u30A2\u8A18\u9332\u3092\u7D9A\u3051\u3066\u3001\u5065\u5EB7\u72B6\u614B\u3092\u4FDD\u3061\u307E\u3057\u3087\u3046\u3002</p>\n          \n          <div class=\"seasonal-tips\">\n            <h6>${this.seasonInfo.displayText}\u306E\u30B1\u30A2\u306E\u30B3\u30C4</h6>\n            <p>${this.getSeasonalCareMessage(this.seasonInfo.season)}</p>\n          </div>\n\n${this.currentOpenThread?.is_owner !== false ? `\n  <div class=\"add-care-prompt\">\n    <button onclick=\"window.plantApp.showAddCareModal('${threadId}')\" class=\"btn btn-primary\">\n      \u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0\n    </button>\n  </div>\n` : ''}\n        </div>\n      `;\n      return;\n    }\n\n    const summaryData = summary || {};\n    \n    container.innerHTML = `\n      <div class=\"alerts-summary\">\n        <h5>\u30B1\u30A2\u72B6\u6CC1\u30B5\u30DE\u30EA\u30FC</h5>\n        <div class=\"summary-grid\">\n          <div class=\"summary-item priority-high\">\n            <span class=\"priority-count\">${summaryData.high_priority || 0}</span>\n            <span class=\"priority-label\">\u7DCA\u6025</span>\n          </div>\n          <div class=\"summary-item priority-medium\">\n            <span class=\"priority-count\">${summaryData.medium_priority || 0}</span>\n            <span class=\"priority-label\">\u6CE8\u610F</span>\n          </div>\n          <div class=\"summary-item priority-low\">\n            <span class=\"priority-count\">${summaryData.low_priority || 0}</span>\n            <span class=\"priority-label\">\u63A8\u5968</span>\n          </div>\n        </div>\n        <div class=\"season-adjustment-info\">\n          <p><small>${this.seasonInfo.displayText}\u306E\u5B63\u7BC0\u4FC2\u6570\u3092\u9069\u7528\u4E2D</small></p>\n        </div>\n      </div>\n\n      <div class=\"care-alerts-list\">\n        <h5>\u30B1\u30A2\u901A\u77E5\u4E00\u89A7</h5>\n        ${alerts.map(alert => this.renderCareAlertItem(alert, threadId)).join('')}\n      </div>\n      \n<div class=\"care-alerts-footer\">\n  <p>\u5B9A\u671F\u7684\u306A\u30B1\u30A2\u8A18\u9332\u3067\u3001\u690D\u7269\u306E\u5065\u5EB7\u72B6\u614B\u3092\u6700\u9069\u306B\u4FDD\u3061\u307E\u3057\u3087\u3046</p>\n  ${this.currentOpenThread?.is_owner !== false ? `\n    <div class=\"footer-actions\">\n      <button onclick=\"window.plantApp.showAddCareModal('${threadId}')\" class=\"btn btn-primary\">\n        \u30B1\u30A2\u8A18\u9332\u3092\u8FFD\u52A0\n      </button>\n      <button onclick=\"window.plantApp.loadCareAlerts('${threadId}')\" class=\"btn btn-secondary\">\n        \u901A\u77E5\u3092\u66F4\u65B0\n      </button>\n    </div>\n  ` : ''}\n</div>\n    `;\n  }\n\n  renderCareAlertItem(alert, threadId) {\n    const careInfo = this.careTypes[alert.care_type] || this.careTypes.other;\n    \n    return `<div class=\"alert-item priority-${alert.priority}\">\n        <div class=\"alert-header\">\n          <div class=\"alert-care-info\">\n            <span class=\"care-icon\">${careInfo.icon}</span>\n            <span class=\"care-name\">${careInfo.name}</span>\n            <span class=\"priority-badge ${alert.priority}\">${this.getPriorityLabel(alert.priority)}</span>\n          </div>\n<div class=\"alert-actions\">\n  ${this.currentOpenThread?.is_owner !== false ? `\n    <button onclick=\"window.plantApp.markCareAsDone('${threadId}', '${alert.care_type}')\" \n            class=\"btn btn-small btn-success\">\n      \u2713 \u5B8C\u4E86\n    </button>\n  ` : ''}\n</div>\n        </div>\n        \n        <div class=\"alert-details\">\n          <div class=\"alert-message\">\n            <p><strong>${alert.recommended_action || '\u30B1\u30A2\u304C\u63A8\u5968\u3055\u308C\u307E\u3059'}</strong></p>\n            <p class=\"alert-description\">${alert.alert_message || '\u30BF\u30A4\u30DF\u30F3\u30B0\u3067\u3059'}</p>\n          </div>\n          \n          ${alert.seasonal_message ? `\n            <div class=\"seasonal-message\">\n              <p>${alert.seasonal_message}</p>\n            </div>\n          ` : ''}\n          \n          <div class=\"alert-timing\">\n            ${alert.last_care_date ? `\n              <span class=\"last-care\">\u524D\u56DE: ${this.formatDate(alert.last_care_date)}</span>\n            ` : ''}\n            <span class=\"days-since\">${alert.days_since || 0}\u65E5\u7D4C\u904E</span>\n            <span class=\"recommended-interval\">\u63A8\u5968: ${alert.recommended_interval || 7}\u65E5\u6BCE</span>\n          </div>\n        </div>\n      </div>`;\n  }\n\n  getPriorityLabel(priority) {\n    const labels = {\n      'high': '\u7DCA\u6025',\n      'medium': '\u6CE8\u610F',\n      'low': '\u63A8\u5968'\n    };\n    return labels[priority] || '\u901A\u5E38';\n  }\n\n  async markCareAsDone(threadId, careType) {\n    try {\n      const today = new Date().toISOString().split('T')[0];\n      \n      const response = await fetch(`${this.apiBase}?action=save_care_record`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n          entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId,\n          care_type: careType,\n          care_date: today,\n          notes: '\u30B1\u30A2\u901A\u77E5\u304B\u3089\u5B8C\u4E86\u30DE\u30FC\u30AF',\n          auto_detected: true\n        })\n      });\n\n      const result = await response.json();\n      \n      if (result.success) {\n        const careInfo = this.careTypes[careType] || this.careTypes.other;\n        this.showTemporaryNotification(`${careInfo.name}\u306E\u30B1\u30A2\u8A18\u9332\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F`, 'success');\n        \n        await Promise.all([\n          this.loadCareAlerts(threadId),\n          this.loadCareRecords(threadId)\n        ]);\n        \n      } else {\n        throw new Error(result.error);\n      }\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u5B8C\u4E86\u30DE\u30FC\u30AF\u30A8\u30E9\u30FC:', error);\n      this.showTemporaryNotification(`\u30B1\u30A2\u8A18\u9332\u306E\u4FDD\u5B58\u306B\u5931\u6557: ${error.message}`, 'error');\n    }\n  }\n\n  renderGrowthComparisonTab(threadId) {\n    return `<div class=\"growth-comparison-content\">\n        <div class=\"growth-comparison-header\">\n          <h4>\u6210\u9577\u6BD4\u8F03</h4>\n          <p>\u3053\u306E\u690D\u7269\u306E\u6210\u9577\u8A18\u9332\u3092\u6642\u7CFB\u5217\u3067\u6BD4\u8F03\u30FB\u5206\u6790\u3067\u304D\u307E\u3059</p>\n        </div>\n\n        <div id=\"growth-images-container-${threadId}\">\n          <div class=\"loading\">\u6210\u9577\u753B\u50CF\u30C7\u30FC\u30BF\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n        </div>\n      </div>`;\n  }\n\n  async loadGrowthImages(threadId) {\n    const container = document.getElementById(`growth-images-container-${threadId}`);\n    if (!container) {\n      console.error('growth-images-container \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n      return;\n    }\n\n    try {\n      console.log('\u6210\u9577\u753B\u50CF\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u958B\u59CB:', threadId);\n\n      const response = await fetch(`${this.apiBase}?action=growth_images`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n          entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId\n        })\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      \n      if (data.error) {\n        throw new Error(data.error);\n      }\n\n      console.log('\u6210\u9577\u753B\u50CF\u53D6\u5F97\u6210\u529F:', data.images?.length || 0);\n      this.renderGrowthImagesList(data.images || [], data.comparison_data, threadId);\n\n    } catch (error) {\n      console.error('\u6210\u9577\u753B\u50CF\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n      container.innerHTML = `\n        <div class=\"error-message\">\n          <h5>\u6210\u9577\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557</h5>\n          <p>\u30A8\u30E9\u30FC: ${error.message}</p>\n          <div class=\"error-actions\">\n            <button onclick=\"window.plantApp.loadGrowthImages('${threadId}')\" class=\"btn btn-small\">\n              \u518D\u8AAD\u307F\u8FBC\u307F\n            </button>\n          </div>\n        </div>\n      `;\n    }\n  }\n\n  renderGrowthImagesList(images, comparisonData, threadId) {\n    const container = document.getElementById(`growth-images-container-${threadId}`);\n    if (!container) return;\n\n    if (!images.length) {\n      container.innerHTML = `\n        <div class=\"no-growth-images\">\n          <div class=\"empty-icon\">\uD83D\uDCF8</div>\n          <h5>\u307E\u3060\u6210\u9577\u8A18\u9332\u753B\u50CF\u304C\u3042\u308A\u307E\u305B\u3093</h5>\n          <p>\u80B2\u6210\u8A18\u9332\u6295\u7A3F\u6642\u306B\u5199\u771F\u3092\u6DFB\u4ED8\u3059\u308B\u3068\u3001\u3053\u3053\u3067\u6210\u9577\u6BD4\u8F03\u304C\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059</p>\n          \n          <div class=\"growth-benefits\">\n            <h6>\u6210\u9577\u6BD4\u8F03\u306E\u30E1\u30EA\u30C3\u30C8</h6>\n            <ul>\n              <li>\u690D\u7269\u306E\u6210\u9577\u901F\u5EA6\u3092\u53EF\u8996\u5316</li>\n              <li>\u30B1\u30A2\u306E\u52B9\u679C\u3092\u78BA\u8A8D</li>\n              <li>\u554F\u984C\u306E\u65E9\u671F\u767A\u898B</li>\n              <li>\u6700\u9069\u306A\u7BA1\u7406\u65B9\u6CD5\u306E\u767A\u898B</li>\n            </ul>\n          </div>\n        </div>\n      `;\n      return;\n    }\n\n    const statistics = comparisonData || {};\n    \n    container.innerHTML = `\n      <div class=\"growth-statistics\">\n        <h5>\u6210\u9577\u8A18\u9332\u7D71\u8A08</h5>\n        <div class=\"stats-grid\">\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u8A18\u9332\u671F\u9593</span>\n            <span class=\"stat-value\">${statistics.total_days || 0}\u65E5</span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u5199\u771F\u8A18\u9332</span>\n            <span class=\"stat-value\">${statistics.image_count || 0}\u56DE</span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u5E73\u5747\u9593\u9694</span>\n            <span class=\"stat-value\">${statistics.average_interval || 0}\u65E5</span>\n          </div>\n          <div class=\"stat-item\">\n            <span class=\"stat-label\">\u8A18\u9332\u6570</span>\n            <span class=\"stat-value\">${this.calculateGrowthRate(statistics)}%</span>\n          </div>\n        </div>\n        <div class=\"seasonal-growth-note\">\n          <p><small>\u73FE\u5728\u306E\u5B63\u7BC0\uFF08${this.seasonInfo.displayText}\uFF09\u3067\u306E\u6210\u9577\u8A18\u9332</small></p>\n        </div>\n      </div>\n      \n      <div class=\"growth-timeline\">\n        <h5>\u6210\u9577\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3</h5>\n        <div class=\"timeline-images\" id=\"growth-timeline-${threadId}\">\n          ${this.renderGrowthTimelineImages(images, statistics)}\n        </div>\n      </div>\n      \n      ${images.some(img => img.ai_generated_image_url) ? `\n        <div class=\"generated-images-section\">\n          <h5>AI\u751F\u6210\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\u5C65\u6B74</h5>\n          <div class=\"generated-images-grid\">\n            ${images.filter(img => img.ai_generated_image_url).map(image => `\n              <div class=\"generated-image-item\">\n                <img src=\"${image.ai_generated_image_url}\" \n                     alt=\"\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8 ${this.formatDate(image.created_at)}\"\n                     onclick=\"window.plantApp.showImageFullscreen('${image.ai_generated_image_url}', '\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8 ${this.formatDate(image.created_at)}')\"\n                     loading=\"lazy\">\n                <div class=\"generated-date\">${this.formatDate(image.created_at)}</div>\n              </div>\n            `).join('')}\n          </div>\n        </div>\n      ` : ''}\n      \n      <div class=\"growth-insights\">\n        <h6>\u6210\u9577\u30D1\u30BF\u30FC\u30F3\u5206\u6790</h6>\n        ${this.renderGrowthInsights(statistics)}\n      </div>\n      \n      <div class=\"growth-tips\">\n        <h6>\u6210\u9577\u6BD4\u8F03\u306E\u30B3\u30C4</h6>\n        <ul>\n          <li>\u5B9A\u671F\u7684\u306B\u540C\u3058\u89D2\u5EA6\u30FB\u8DDD\u96E2\u304B\u3089\u64AE\u5F71</li>\n          <li>\u81EA\u7136\u5149\u3067\u306E\u64AE\u5F71\u3067\u8272\u5473\u3092\u6B63\u78BA\u306B</li>\n          <li>\u65B0\u82BD\u3084\u8449\u306E\u5909\u5316\u306B\u6CE8\u76EE</li>\n          <li>\u30B1\u30A2\u8A18\u9332\u3068\u5408\u308F\u305B\u3066\u5206\u6790</li>\n          <li>\u5B63\u7BC0\u306B\u3088\u308B\u6210\u9577\u901F\u5EA6\u306E\u9055\u3044\u3092\u8003\u616E</li>\n        </ul>\n      </div>\n    `;\n  }\n\n  renderGrowthTimelineImages(images, statistics) {\n    return images.map((image, index) => {\n      const milestone = statistics.growth_milestones?.[index] || {};\n      const daysSince = milestone.days_since_previous || 0;\n      \n      return `<div class=\"growth-snapshot\">\n          <div class=\"snapshot-image\">\n            <img src=\"${image.input_image_url}\" \n                 alt=\"\u6210\u9577\u8A18\u9332 ${this.formatDate(image.created_at)}\"\n                 onclick=\"window.plantApp.showImageFullscreen('${image.input_image_url}', '\u6210\u9577\u8A18\u9332 ${this.formatDate(image.created_at)}')\"\n                 loading=\"lazy\">\n            <div class=\"snapshot-overlay\">\n              <span class=\"snapshot-date\">${this.formatDate(image.created_at)}</span>\n              <span class=\"snapshot-index\">#${index + 1}</span>\n            </div>\n          </div>\n          \n          <div class=\"snapshot-info\">\n            <div class=\"milestone-label\">\n              ${milestone.milestone_label || (index === 0 ? '\u8A18\u9332\u958B\u59CB' : `\u8A18\u9332 ${index + 1}`)}\n            </div>\n            \n            ${daysSince > 0 ? `\n              <div class=\"interval-info\">\n                <span class=\"interval\">${daysSince}\u65E5\u5F8C</span>\n                <span class=\"growth-rate\">${this.getGrowthRateLabel(daysSince)}</span>\n              </div>\n            ` : ''}\n            \n            ${image.description ? `\n              <div class=\"snapshot-description\">\n                <p>${this.escapeHtml(image.description.substring(0, 80))}${image.description.length > 80 ? '...' : ''}</p>\n              </div>\n            ` : ''}\n\n            <div class=\"snapshot-actions\">\n              <button onclick=\"window.plantApp.showImageComparison(${index}, '${image.input_image_url}')\" \n                      class=\"btn btn-small btn-secondary\">\n                \u6BD4\u8F03\n              </button>\n            </div>\n          </div>\n        </div>`;\n    }).join('');\n  }\n\n  calculateGrowthRate(statistics) {\n    if (!statistics.total_days || !statistics.image_count) return 0;\n    return Math.round((statistics.image_count / statistics.total_days) * 30 * 100) / 100;\n  }\n\n  getGrowthRateLabel(days) {\n    if (days <= 7) return '\u9AD8\u983B\u5EA6';\n    if (days <= 14) return '\u6A19\u6E96';\n    if (days <= 30) return '\u4F4E\u983B\u5EA6';\n    return '\u9577\u671F\u9593\u9694';\n  }\n\n  renderGrowthInsights(statistics) {\n    const insights = [];\n    \n    if (statistics.total_days > 90) {\n      insights.push(`\u9577\u671F\u9593\uFF08${Math.floor(statistics.total_days / 30)}\u30F6\u6708\uFF09\u306B\u308F\u305F\u3063\u3066\u7D99\u7D9A\u7684\u306B\u8A18\u9332\u3055\u308C\u3066\u3044\u307E\u3059`);\n    }\n\n    if (statistics.average_interval <= 7) {\n      insights.push('\u983B\u7E41\u306A\u8A18\u9332\u306B\u3088\u308A\u3001\u8A73\u7D30\u306A\u6210\u9577\u904E\u7A0B\u3092\u8FFD\u8DE1\u3067\u304D\u3066\u3044\u307E\u3059');\n    }\n\n    insights.push(`${this.seasonInfo.seasonName}\u306E\u5B63\u7BC0\u7279\u6027\u3092\u8003\u616E\u3057\u305F\u6210\u9577\u30D1\u30BF\u30FC\u30F3\u3067\u3059`);\n\n    if (statistics.image_count >= 10) {\n      insights.push('\u8C4A\u5BCC\u306A\u753B\u50CF\u30C7\u30FC\u30BF\u306B\u3088\u308A\u3001\u6210\u9577\u306E\u5909\u5316\u3092\u660E\u78BA\u306B\u78BA\u8A8D\u3067\u304D\u307E\u3059');\n    }\n\n    return insights.length > 0 ? `\n      <div class=\"insights-list\">\n        ${insights.map(insight => `<p>\u2022 ${insight}</p>`).join('')}\n      </div>\n    ` : '<p>\u3055\u3089\u306B\u8A18\u9332\u3092\u7D9A\u3051\u308B\u3053\u3068\u3067\u3001\u3088\u308A\u8A73\u7D30\u306A\u5206\u6790\u304C\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002</p>';\n  }\n\n  showImageComparison(currentIndex, imageUrl) {\n    this.showImageFullscreen(imageUrl, `\u6210\u9577\u8A18\u9332 #${currentIndex + 1}`);\n  }\n\n  async showCareSettingsModal(threadId) {\n    const membershipType = this.getMembershipType();\n    \n    if (membershipType !== 'paid_member') {\n      this.showTemporaryNotification('\u30B1\u30A2\u8A2D\u5B9A\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u6A5F\u80FD\u3067\u3059', 'error');\n      return;\n    }\n\n    this.closeAllModals();\n\n    try {\n      const currentSettings = await this.loadCareSettings(threadId);\n      \n      const modalHtml = `\n        <div id=\"care-settings-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n          <div class=\"modal-content care-settings-content\" onclick=\"event.stopPropagation()\">\n            <div class=\"modal-header\">\n              <h3>\u30B1\u30A2\u9593\u9694\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA</h3>\n              <div class=\"season-context\">\n                <small>${this.seasonInfo.displayText}\u306E\u8A2D\u5B9A - \u500B\u5225\u306B\u30B1\u30A2\u9593\u9694\u3092\u8ABF\u6574\u3067\u304D\u307E\u3059</small>\n              </div>\n              <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n            </div>\n            \n            <div class=\"modal-body\">\n              <div class=\"care-settings-form-container\">\n                \n                <div class=\"settings-info\">\n                  <h5>\u30AB\u30B9\u30BF\u30E0\u9593\u9694\u8A2D\u5B9A</h5>\n                  <p>\u5404\u30B1\u30A2\u306E\u63A8\u5968\u9593\u9694\u3092\u500B\u5225\u306B\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002\u5B63\u7BC0\u306B\u3088\u308B\u81EA\u52D5\u8ABF\u6574\u3082\u9069\u7528\u3055\u308C\u307E\u3059\u3002</p>\n                </div>\n\n                <form id=\"care-settings-form\">\n                  ${this.renderCareSettingsForm(currentSettings)}\n                </form>\n\n                <div class=\"settings-actions\">\n                  <button onclick=\"window.plantApp.saveCareSettings('${threadId}')\" \n                          class=\"btn btn-primary\" id=\"save-care-settings-btn\">\n                    \u8A2D\u5B9A\u3092\u4FDD\u5B58\n                  </button>\n                  <button onclick=\"window.plantApp.resetCareSettings('${threadId}')\" \n                          class=\"btn btn-secondary\">\n                    \u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u623B\u3059\n                  </button>\n                  <button onclick=\"window.plantApp.closeAllModals()\" \n                          class=\"btn btn-secondary\">\n                    \u30AD\u30E3\u30F3\u30BB\u30EB\n                  </button>\n                </div>\n\n                <div id=\"care-settings-status\" class=\"settings-status\"></div>\n\n              </div>\n            </div>\n          </div>\n        </div>\n      `;\n\n      document.body.insertAdjacentHTML('beforeend', modalHtml);\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u8A2D\u5B9A\u30E2\u30FC\u30C0\u30EB\u8868\u793A\u30A8\u30E9\u30FC:', error);\n      this.showTemporaryNotification('\u30B1\u30A2\u8A2D\u5B9A\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n    }\n  }\n\n  renderCareSettingsForm(currentSettings) {\n    const careTypes = Object.entries(this.careTypes);\n    \n    return `<div class=\"care-settings-grid\">\n        ${careTypes.map(([careType, config]) => {\n          const setting = currentSettings.find(s => s.care_type === careType) || {};\n          const defaultInterval = config.base_interval_days;\n          const seasonalMultiplier = config.seasonal_multipliers[this.seasonInfo.season] || 1.0;\n          const seasonalInterval = Math.round(defaultInterval * seasonalMultiplier);\n          const customInterval = setting.custom_interval_days || '';\n          \n          return `<div class=\"care-setting-item\" data-care-type=\"${careType}\">\n              <div class=\"care-setting-header\">\n                <span class=\"care-icon\">${config.icon}</span>\n                <h6>${config.name}</h6>\n              </div>\n              \n              <div class=\"interval-settings\">\n                <div class=\"interval-info\">\n                  <span class=\"default-interval\">\u6A19\u6E96: ${defaultInterval}\u65E5</span>\n                  <span class=\"seasonal-interval\">\u73FE\u5728(${this.seasonInfo.seasonName}): ${seasonalInterval}\u65E5</span>\n                </div>\n                \n                <div class=\"custom-interval-input\">\n                  <label for=\"custom-${careType}\">\u30AB\u30B9\u30BF\u30E0\u9593\u9694\uFF08\u65E5\uFF09:</label>\n                  <input type=\"number\" \n                         id=\"custom-${careType}\" \n                         name=\"custom_${careType}\"\n                         value=\"${customInterval}\" \n                         placeholder=\"${seasonalInterval}\"\n                         min=\"1\" \n                         max=\"365\">\n                  <small>\u7A7A\u767D\u3067\u5B63\u7BC0\u81EA\u52D5\u8ABF\u6574</small>\n                </div>\n                \n                <div class=\"advance-settings\">\n                  <label for=\"advance-${careType}\">\u4E8B\u524D\u901A\u77E5\uFF08\u65E5\uFF09:</label>\n                  <select id=\"advance-${careType}\" name=\"advance_${careType}\">\n                    <option value=\"1\" ${(setting.alert_advance_days || 1) === 1 ? 'selected' : ''}>1\u65E5\u524D</option>\n                    <option value=\"2\" ${setting.alert_advance_days === 2 ? 'selected' : ''}>2\u65E5\u524D</option>\n                    <option value=\"3\" ${setting.alert_advance_days === 3 ? 'selected' : ''}>3\u65E5\u524D</option>\n                    <option value=\"7\" ${setting.alert_advance_days === 7 ? 'selected' : ''}>1\u9031\u9593\u524D</option>\n                  </select>\n                </div>\n                \n                <div class=\"enable-setting\">\n                  <label>\n                    <input type=\"checkbox\" \n                           id=\"enabled-${careType}\" \n                           name=\"enabled_${careType}\"\n                           ${setting.is_enabled !== false ? 'checked' : ''}>\n                    \u3053\u306E\u901A\u77E5\u3092\u6709\u52B9\u306B\u3059\u308B\n                  </label>\n                </div>\n              </div>\n            </div>`;\n        }).join('')}\n      </div>\n\n      <div class=\"seasonal-explanation\">\n        <h6>${this.seasonInfo.seasonName}\u306E\u5B63\u7BC0\u4FC2\u6570</h6>\n        <div class=\"multipliers-info\">\n          ${careTypes.map(([careType, config]) => {\n            const multiplier = config.seasonal_multipliers[this.seasonInfo.season];\n            const effect = multiplier < 1 ? '\u77ED\u7E2E' : multiplier > 1 ? '\u5EF6\u9577' : '\u6A19\u6E96';\n            return `<span class=\"multiplier-item\">\n                ${config.icon} ${config.name}: ${multiplier}\u500D (${effect})\n              </span>`;\n          }).join('')}\n        </div>\n      </div>`;\n  }\n\n  async loadCareSettings(threadId) {\n    try {\n      const response = await fetch(`${this.apiBase}?action=get_care_settings`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n          entitlement_snapshot: this.entitlementSnapshot,\n          thread_id: threadId\n        })\n      });\n\n      const data = await response.json();\n      \n      if (data.success) {\n        return data.settings || [];\n      } else {\n        throw new Error(data.error || '\u30B1\u30A2\u8A2D\u5B9A\u306E\u53D6\u5F97\u306B\u5931\u6557');\n      }\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u8A2D\u5B9A\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC:', error);\n      return [];\n    }\n  }\n\nasync saveCareSettings(threadId) {\n  const statusDiv = document.getElementById('care-settings-status');\n  const saveBtn = document.getElementById('save-care-settings-btn');\n  \n  if (!statusDiv || !saveBtn) {\n    console.error('\u30B1\u30A2\u8A2D\u5B9AUI\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n\n  saveBtn.disabled = true;\n  const originalText = saveBtn.textContent;\n  saveBtn.textContent = '\u4FDD\u5B58\u4E2D...';\n\n  statusDiv.innerHTML = `\n    <div class=\"loading-message\">\n      <div class=\"spinner\"></div>\n      <p>\u30B1\u30A2\u8A2D\u5B9A\u3092\u4FDD\u5B58\u4E2D...</p>\n    </div>\n  `;\n\n  try {\n    const form = document.getElementById('care-settings-form');\n    if (!form) {\n      throw new Error('\u30B1\u30A2\u8A2D\u5B9A\u30D5\u30A9\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    }\n    \n    const formData = new FormData(form);\n    const careTypes = Object.keys(this.careTypes);\n    \n    // \u30C7\u30D0\u30C3\u30B0\uFF1A\u30D5\u30A9\u30FC\u30E0\u30C7\u30FC\u30BF\u306E\u5185\u5BB9\u3092\u30ED\u30B0\u51FA\u529B\n    console.log('\u30D5\u30A9\u30FC\u30E0\u304B\u3089\u53D6\u5F97\u3059\u308B\u30B1\u30A2\u30BF\u30A4\u30D7:', careTypes);\n    console.log('\u30D5\u30A9\u30FC\u30E0\u30C7\u30FC\u30BF\u306E\u30AD\u30FC\u4E00\u89A7:', Array.from(formData.keys()));\n    \n    const savePromises = [];\n    \n    for (const careType of careTypes) {\n      const customInterval = formData.get(`custom_${careType}`);\n      const advanceDays = formData.get(`advance_${careType}`);\n      const isEnabled = formData.has(`enabled_${careType}`);\n      \n      // \u30C7\u30D0\u30C3\u30B0\uFF1A\u5404\u30B1\u30A2\u30BF\u30A4\u30D7\u306E\u8A2D\u5B9A\u5024\u3092\u30ED\u30B0\u51FA\u529B\n      console.log(`${careType}\u306E\u8A2D\u5B9A:`, {\n        customInterval,\n        advanceDays,\n        isEnabled\n      });\n      \n      const settingData = {\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        thread_id: threadId,\n        care_type: careType,\n        custom_interval_days: customInterval ? parseInt(customInterval) : null,\n        alert_advance_days: parseInt(advanceDays) || 1,\n        is_enabled: isEnabled\n      };\n      \n      // \u30C7\u30D0\u30C3\u30B0\uFF1A\u9001\u4FE1\u3059\u308B\u30C7\u30FC\u30BF\u3092\u30ED\u30B0\u51FA\u529B\n      console.log(`${careType}\u7528\u9001\u4FE1\u30C7\u30FC\u30BF:`, settingData);\n      \n      const savePromise = fetch(`${this.apiBase}?action=save_care_settings`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify(settingData)\n      })\n      .then(async response => {\n        console.log(`${careType}\u306E\u30EC\u30B9\u30DD\u30F3\u30B9:`, response.status, response.statusText);\n        const result = await response.json();\n        console.log(`${careType}\u306E\u7D50\u679C:`, result);\n        return result;\n      })\n      .catch(error => {\n        console.error(`${careType}\u306EAPI\u547C\u3073\u51FA\u3057\u30A8\u30E9\u30FC:`, error);\n        return { success: false, error: error.message };\n      });\n      \n      savePromises.push(savePromise);\n    }\n\n    console.log('API\u547C\u3073\u51FA\u3057\u958B\u59CB:', savePromises.length + '\u4EF6');\n    \n    const results = await Promise.all(savePromises);\n    \n    // \u30C7\u30D0\u30C3\u30B0\uFF1A\u5168\u7D50\u679C\u3092\u30ED\u30B0\u51FA\u529B\n    console.log('\u5168API\u7D50\u679C:', results);\n    \n    const failures = results.filter(r => !r.success);\n    \n    if (failures.length > 0) {\n      console.error('\u4FDD\u5B58\u5931\u6557\u8A73\u7D30:', failures);\n      throw new Error(`${failures.length}\u4EF6\u306E\u8A2D\u5B9A\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F`);\n    }\n\n      statusDiv.innerHTML = `\n        <div class=\"success-message\">\n          <h5>\u2705 \u8A2D\u5B9A\u4FDD\u5B58\u5B8C\u4E86</h5>\n          <p>\u3059\u3079\u3066\u306E\u30B1\u30A2\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F</p>\n          <p><small>\u65B0\u3057\u3044\u8A2D\u5B9A\u306F\u30B1\u30A2\u901A\u77E5\u306B\u5373\u5EA7\u306B\u53CD\u6620\u3055\u308C\u307E\u3059</small></p>\n        </div>\n      `;\n\n      this.showTemporaryNotification('\u30B1\u30A2\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F', 'success');\n      \n      if (this.currentOpenThread) {\n        setTimeout(() => {\n          this.loadCareAlerts(this.currentOpenThread.id);\n        }, 1000);\n      }\n\n    } catch (error) {\n      console.error('\u30B1\u30A2\u8A2D\u5B9A\u4FDD\u5B58\u30A8\u30E9\u30FC:', error);\n      \n      statusDiv.innerHTML = `\n        <div class=\"error-message\">\n          <h5>\u274C \u4FDD\u5B58\u5931\u6557</h5>\n          <p>\u30A8\u30E9\u30FC: ${error.message}</p>\n          <div class=\"error-actions\">\n            <button onclick=\"window.plantApp.saveCareSettings('${threadId}')\" class=\"btn btn-small\">\n              \u518D\u8A66\u884C\n            </button>\n          </div>\n        </div>\n      `;\n      \n      this.showTemporaryNotification('\u30B1\u30A2\u8A2D\u5B9A\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n      \n    } finally {\n      saveBtn.disabled = false;\n      saveBtn.textContent = originalText;\n    }\n  }\n\n  async resetCareSettings(threadId) {\n    if (!confirm('\u3059\u3079\u3066\u306E\u30B1\u30A2\u8A2D\u5B9A\u3092\u30C7\u30D5\u30A9\u30EB\u30C8\uFF08\u5B63\u7BC0\u81EA\u52D5\u8ABF\u6574\uFF09\u306B\u623B\u3057\u307E\u3059\u304B\uFF1F')) {\n      return;\n    }\n\n    const careTypes = Object.keys(this.careTypes);\n    const promises = [];\n\n    for (const careType of careTypes) {\n      const defaultData = {\n        user_email: this.userEmail,\n        entitlement: this.entitlement,\n        thread_id: threadId,\n        care_type: careType,\n        custom_interval_days: null,\n        alert_advance_days: 1,\n        is_enabled: true\n      };\n      \n      promises.push(\n        fetch(`${this.apiBase}?action=save_care_settings`, {\n          method: 'POST',\n          headers: { \n            'Content-Type': 'application/json',\n            'Accept': 'application/json'\n          },\n          body: JSON.stringify(defaultData)\n        })\n      );\n    }\n\n    try {\n      await Promise.all(promises);\n      this.showTemporaryNotification('\u8A2D\u5B9A\u3092\u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u623B\u3057\u307E\u3057\u305F', 'success');\n      this.closeAllModals();\n      \n      setTimeout(() => {\n        this.showCareSettingsModal(threadId);\n      }, 500);\n\n    } catch (error) {\n      this.showTemporaryNotification('\u30EA\u30BB\u30C3\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n    }\n  }\n\n  confirmDeletePost(postId, threadId = null) {\n    console.log('\u524A\u9664\u78BA\u8A8D\u958B\u59CB:', { postId, threadId });\n    this.closeAllModals();\n\n    const modalHtml = `\n      <div id=\"delete-confirm-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n          <div class=\"modal-header\">\n            <h3>\u6295\u7A3F\u524A\u9664\u306E\u78BA\u8A8D</h3>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"delete-warning\">\n              <h4>\u26A0\uFE0F \u3053\u306E\u64CD\u4F5C\u306F\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093</h4>\n              <p><strong>\u3053\u306E\u80B2\u6210\u8A18\u9332\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F</strong></p>\n              <ul>\n                <li>\u6295\u7A3F\u5185\u5BB9\u3068AI\u56DE\u7B54\u304C\u524A\u9664\u3055\u308C\u307E\u3059</li>\n                <li>\u6DFB\u4ED8\u753B\u50CF\u3082\u5B8C\u5168\u306B\u524A\u9664\u3055\u308C\u307E\u3059</li>\n                <li>\u8FFD\u52A0\u76F8\u8AC7\u5C65\u6B74\u3082\u3059\u3079\u3066\u524A\u9664\u3055\u308C\u307E\u3059</li>\n                <li>\u3053\u306E\u6295\u7A3F\u304C\u690D\u7269\u306E\u6700\u5F8C\u306E\u8A18\u9332\u306E\u5834\u5408\u3001\u690D\u7269\u8A18\u9332\u5168\u4F53\u3082\u524A\u9664\u3055\u308C\u307E\u3059</li>\n              </ul>\n              <div class=\"deletion-impact\">\n                <p><strong>\u524A\u9664\u306E\u5F71\u97FF\u7BC4\u56F2:</strong></p>\n                <p>\u2022 \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u5B8C\u5168\u306B\u524A\u9664\uFF08\u5FA9\u5143\u4E0D\u53EF\uFF09</p>\n                <p>\u2022 \u95A2\u9023\u3059\u308B\u30B1\u30A2\u8A18\u9332\u3078\u306E\u5F71\u97FF\u306F\u3042\u308A\u307E\u305B\u3093</p>\n                <p>\u2022 \u4ED6\u306E\u690D\u7269\u8A18\u9332\u3078\u306E\u5F71\u97FF\u306F\u3042\u308A\u307E\u305B\u3093</p>\n              </div>\n            </div>\n\n            <div class=\"form-actions\">\n              <button onclick=\"window.plantApp.executeDeletePost('${postId}', '${threadId || ''}')\" \n                      class=\"btn btn-danger\" id=\"delete-execute-btn\">\n                \uD83D\uDDD1\uFE0F \u5B8C\u5168\u306B\u524A\u9664\u3059\u308B\n              </button>\n              <button onclick=\"window.plantApp.closeAllModals()\" \n                      class=\"btn btn-secondary\">\n                \u30AD\u30E3\u30F3\u30BB\u30EB\n              </button>\n            </div>\n\n            <div id=\"delete-status\" class=\"delete-status\"></div>\n          </div>\n        </div>\n      </div>\n    `;\n\n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n\n    const handleEscKey = (e) => {\n      if (e.key === 'Escape') {\n        this.closeAllModals();\n        document.removeEventListener('keydown', handleEscKey);\n      }\n    };\n    document.addEventListener('keydown', handleEscKey);\n  }\nasync togglePostVisibility(postId, currentIsPublic) {\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') {\n    this.showTemporaryNotification('SNS\u6A5F\u80FD\u306F\u4F1A\u54E1\u9650\u5B9A\u3067\u3059', 'error');\n    return;\n  }\n  \n  const newStatus = !currentIsPublic;\n  const actionText = newStatus ? '\u516C\u958B' : '\u975E\u516C\u958B';\n  \n  if (!confirm(`\u3053\u306E\u6295\u7A3F\u3092\u300C${actionText}\u300D\u306B\u5909\u66F4\u3057\u307E\u3059\u304B\uFF1F\\n\\n${\n    newStatus \n      ? '\u516C\u958B\u3059\u308B\u3068\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u3042\u306A\u305F\u306E\u8A18\u9332\u3092\u898B\u3066\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u3067\u304D\u307E\u3059\u3002' \n      : '\u975E\u516C\u958B\u306B\u3059\u308B\u3068\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u304B\u3089\u898B\u3048\u306A\u304F\u306A\u308A\u307E\u3059\uFF08\u65E2\u5B58\u306E\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u306F\u4FDD\u6301\u3055\u308C\u307E\u3059\uFF09\u3002'\n  }`)) {\n    return;\n  }\n  \n  try {\n    console.log('\u516C\u958B\u8A2D\u5B9A\u5909\u66F4:', { postId, currentIsPublic, newStatus });\n    \n    const response = await fetch(`${this.apiBase}?action=toggle_post_visibility`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        post_id: postId,\n        is_public: newStatus\n      })\n    });\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    \n    const data = await response.json();\n    \n    if (data.success) {\n      this.showTemporaryNotification(\n        `\u6295\u7A3F\u3092\u300C${actionText}\u300D\u306B\u5909\u66F4\u3057\u307E\u3057\u305F`, \n        'success'\n      );\n      \n      // \u30E2\u30FC\u30C0\u30EB\u5185\u5BB9\u3092\u66F4\u65B0\n      if (this.currentOpenThread?.id) {\n        const posts = await this.loadThreadPosts(this.currentOpenThread.id);\n        const timelineContent = document.querySelector('[data-tab=\"timeline\"].tab-content');\n        if (timelineContent) {\n          timelineContent.innerHTML = this.renderAdvancedTimelineTab(posts);\n        }\n      }\n    } else {\n      throw new Error(data.error || '\u516C\u958B\u8A2D\u5B9A\u306E\u5909\u66F4\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u516C\u958B\u8A2D\u5B9A\u5909\u66F4\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u516C\u958B\u8A2D\u5B9A\u306E\u5909\u66F4\u306B\u5931\u6557: ${error.message}`, \n      'error'\n    );\n  }\n}\n\npreviewPublicPost() {\n  const form = document.getElementById('consultation-form');\n  if (!form) return;\n  \n  const plantName = document.getElementById('plant-name')?.value || '\uFF08\u672A\u5165\u529B\uFF09';\n  const notes = document.getElementById('notes')?.value || '\uFF08\u306A\u3057\uFF09';\n  const consultation = document.getElementById('consultation')?.value || '\uFF08\u306A\u3057\uFF09';\n  \n  const message = `\n\uD83D\uDCE2 \u516C\u958B\u30D7\u30EC\u30D3\u30E5\u30FC\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u690D\u7269\u540D: ${plantName}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\n\u8A18\u9332: ${notes.substring(0, 50)}${notes.length > 50 ? '...' : ''}\n\n\u76F8\u8AC7\u5185\u5BB9: ${consultation.substring(0, 50)}${consultation.length > 50 ? '...' : ''}\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u26A0\uFE0F \u78BA\u8A8D\u4E8B\u9805\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u30FB\u500B\u4EBA\u60C5\u5831\u304C\u542B\u307E\u308C\u3066\u3044\u306A\u3044\u304B\n\u30FB\u516C\u958B\u3057\u305F\u304F\u306A\u3044\u60C5\u5831\u304C\u5199\u3063\u3066\u3044\u306A\u3044\u304B\n\u30FB\u4ED6\u4EBA\u306E\u6A29\u5229\u3092\u4FB5\u5BB3\u3057\u3066\u3044\u306A\u3044\u304B\n\n\u203B \u8A73\u7D30\u306A\u30D7\u30EC\u30D3\u30E5\u30FC\u306F\u5F8C\u65E5\u5B9F\u88C5\u4E88\u5B9A\n  `.trim();\n  \n  alert(message);\n}\n// ==========================================\n// SNS\u6A5F\u80FD\u95A2\u9023\u30E1\u30BD\u30C3\u30C9\uFF08Phase 3 Part 2\uFF09\n// ==========================================\n\ninitSNSState() {\n  this.snsState = {\n    currentSort: 'recent',\n    currentPage: 1,\n    hasMore: true,\n    posts: [],\n    currentFeed: 'all'\n  };\n}\n\nopenSNSFeed() {\n  const existingModal = document.getElementById('sns-feed-modal');\n  if (existingModal) {\n    existingModal.remove();\n  }\n  // \u2605 \u975E\u4F1A\u54E1\u3082\u95B2\u89A7\u53EF\u80FD\uFF08\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u30FB\u30D5\u30A9\u30ED\u30FC\u306E\u307F\u4F1A\u54E1\u9650\u5B9A\uFF09\n\n  // \u65E2\u5B58\u306E\u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n  this.closeAllModals();\n  \n  // SNS\u72B6\u614B\u3092\u521D\u671F\u5316\n  if (!this.snsState) {\n    this.initSNSState();\n  }\n  \n  // SNS\u30D5\u30A3\u30FC\u30C9\u30DA\u30FC\u30B8\u3092\u8868\u793A\n  const modalHtml = `\n    <div id=\"sns-feed-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n      <div class=\"modal-content sns-feed-modal-content\" onclick=\"event.stopPropagation()\">\n        ${this.renderSNSFeedPage()}\n      </div>\n    </div>\n  `;\n  \n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n\n  // \u6295\u7A3F\u3092\u8AAD\u307F\u8FBC\u307F\uFF08currentFeed \u306B\u5FDC\u3058\u305F\u30BD\u30FC\u30C8\u3067\uFF09\n  const initialSort = this.snsState.currentFeed === 'following' ? 'recent' : this.snsState.currentSort;\n  this.loadPublicPosts(initialSort, 1, false);\n  this.maybeAutoStartSNSGuideTour();\n}\n\ncloseSNSFeed() {\n  const modal = document.getElementById('sns-feed-modal');\n  if (modal) {\n    modal.remove();\n  }\n}\n\nrenderSNSFeedPage() {\n  // \u2605 \u975E\u4F1A\u54E1\u3082\u95B2\u89A7\u53EF\u80FD\uFF08\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u30FB\u30D5\u30A9\u30ED\u30FC\u306E\u307F\u4F1A\u54E1\u9650\u5B9A\uFF09\n  return `\n    <div class=\"sns-feed-container\">\n      <!-- \u30D8\u30C3\u30C0\u30FC -->\n      <div class=\"sns-feed-header\">\n        <h2>DISCOVER</h2>\n        <div class=\"sns-header-actions\">\n          <button type=\"button\" onclick=\"window.plantApp.startSNSGuideTour()\" class=\"sns-guide-tour-btn\">\uFF1F \u4F7F\u3044\u65B9</button>\n          <button id=\"sns-events-panel-btn\" class=\"notification-bell-btn\" onclick=\"window.plantApp.openEventsPanel()\" title=\"\u30A4\u30D9\u30F3\u30C8\u30FB\u30EF\u30FC\u30AF\u30B7\u30E7\u30C3\u30D7\">\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>\n          </button>\n          <button id=\"sns-notification-panel-btn\" class=\"notification-bell-btn\" onclick=\"window.plantApp.openNotificationPanel()\" title=\"\u901A\u77E5\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/></svg>\n            <span id=\"notification-bell-badge\" class=\"notification-badge\" style=\"display:none\">0</span>\n          </button>\n          <button onclick=\"window.plantApp.closeSNSFeed()\" class=\"close-btn\" type=\"button\">\u00D7</button>\n        </div>\n      </div>\n      \n      <!-- \u30D5\u30A3\u30FC\u30C9\u5207\u308A\u66FF\u3048\uFF08\u5168\u4F53 / \u30D5\u30A9\u30ED\u30FC\u4E2D\uFF09 -->\n      <div class=\"sns-feed-tabs\">\n        <button class=\"feed-tab ${this.snsState.currentFeed === 'all' ? 'active' : ''}\" data-feed=\"all\" onclick=\"window.plantApp.changeSNSFeed('all')\">\n          \u5168\u4F53\n        </button>\n        <button class=\"feed-tab ${this.snsState.currentFeed === 'following' ? 'active' : ''}\" data-feed=\"following\" onclick=\"window.plantApp.changeSNSFeed('following')\">\n          \u30D5\u30A9\u30ED\u30FC\u4E2D\n        </button>\n      </div>\n\n      <!-- \u30BD\u30FC\u30C8\u5207\u308A\u66FF\u3048 -->\n      <div class=\"sns-sort-tabs\">\n        <button class=\"sort-tab active\" data-sort=\"recent\" onclick=\"window.plantApp.changeSNSSort('recent')\">\n          FEED\n        </button>\n        <button class=\"sort-tab\" data-sort=\"popular\" onclick=\"window.plantApp.changeSNSSort('popular')\">\n          PICKUP\n        </button>\n        <button class=\"sort-tab\" data-sort=\"trending\" onclick=\"window.plantApp.changeSNSSort('trending')\">\n          TREND\n        </button>\n      </div>\n      \n      <!-- \u6295\u7A3F\u4E00\u89A7 -->\n      <div id=\"sns-posts-container\" class=\"sns-posts-container\">\n        <div class=\"loading-indicator\">\n          <div class=\"spinner\"></div>\n          <p>\u6295\u7A3F\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</p>\n        </div>\n      </div>\n      \n      <!-- \u3082\u3063\u3068\u898B\u308B\u30DC\u30BF\u30F3 -->\n      <div id=\"load-more-container\" class=\"load-more-container\" style=\"display: none;\">\n        <button onclick=\"window.plantApp.loadMoreSNSPosts()\" class=\"btn btn-secondary\">\n          \u3082\u3063\u3068\u898B\u308B\n        </button>\n      </div>\n    </div>\n  `;\n}\n\nasync loadPublicPosts(sortBy = 'recent', page = 1, append = false) {\n  const feed = this.snsState.currentFeed || 'all';\n  try {\n    console.log('\uD83D\uDCE2 \u516C\u958B\u6295\u7A3F\u53D6\u5F97:', { sortBy, page, feed });\n\n    const response = await fetch(`${this.apiBase}?action=public_posts`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail || this.getAnonymousId(),\n        sort_by: sortBy,\n        page: page,\n        limit: 20,\n        feed: feed\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n\n    if (data.success) {\n      // \u30D5\u30A9\u30ED\u30FC\u4E2D\u30D5\u30A3\u30FC\u30C9\u3067\u8AB0\u3082\u30D5\u30A9\u30ED\u30FC\u3057\u3066\u3044\u306A\u3044\u5834\u5408\n      if (data.is_empty_following) {\n        const container = document.getElementById('sns-posts-container');\n        if (container) {\n          container.innerHTML = `\n            <div class=\"empty-content\">\n              <div class=\"empty-icon\">\uD83C\uDF31</div>\n              <h3>\u307E\u3060\u8AB0\u3082\u30D5\u30A9\u30ED\u30FC\u3057\u3066\u3044\u307E\u305B\u3093</h3>\n              <p>\u300C\u5168\u4F53\u300D\u30BF\u30D6\u304B\u3089\u6C17\u306B\u306A\u308B\u30E6\u30FC\u30B6\u30FC\u3092\u30D5\u30A9\u30ED\u30FC\u3057\u3066\u307F\u307E\u3057\u3087\u3046\u3002</p>\n              <button onclick=\"window.plantApp.changeSNSFeed('all')\" class=\"btn btn-primary\">\n                \u5168\u4F53\u3092\u898B\u308B\n              </button>\n            </div>\n          `;\n        }\n        const loadMoreContainer = document.getElementById('load-more-container');\n        if (loadMoreContainer) loadMoreContainer.style.display = 'none';\n        return;\n      }\n\n      if (append) {\n        this.snsState.posts = [...this.snsState.posts, ...data.posts];\n      } else {\n        this.snsState.posts = data.posts;\n      }\n\n      this.snsState.hasMore = data.has_more;\n      this.snsState.currentPage = page;\n\n      this.renderSNSPosts();\n\n      console.log('\u2705 \u6295\u7A3F\u53D6\u5F97\u6210\u529F:', {\n        count: data.posts.length,\n        hasMore: data.has_more,\n        feed\n      });\n\n    } else {\n      throw new Error(data.error || '\u6295\u7A3F\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n\n  } catch (error) {\n    console.error('\u6295\u7A3F\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u6295\u7A3F\u306E\u53D6\u5F97\u306B\u5931\u6557: ${error.message}`,\n      'error'\n    );\n\n    // \u30A8\u30E9\u30FC\u8868\u793A\n    const container = document.getElementById('sns-posts-container');\n    if (container) {\n      container.innerHTML = `\n        <div class=\"empty-content\">\n          <div class=\"empty-icon\">\u26A0\uFE0F</div>\n          <h3>\u6295\u7A3F\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F</h3>\n          <p>${this.escapeHtml(error.message)}</p>\n          <button onclick=\"window.plantApp.loadPublicPosts('${sortBy}', 1)\" class=\"btn btn-primary\">\n            \u518D\u8AAD\u307F\u8FBC\u307F\n          </button>\n        </div>\n      `;\n    }\n  }\n}\n\nrenderSNSPosts() {\n  const container = document.getElementById('sns-posts-container');\n  if (!container) return;\n  \n  const posts = this.snsState.posts;\n  \n  if (posts.length === 0) {\n    container.innerHTML = `\n      <div class=\"empty-content\">\n        <div class=\"empty-icon\">\uD83D\uDCED</div>\n        <h3>\u307E\u3060\u6295\u7A3F\u304C\u3042\u308A\u307E\u305B\u3093</h3>\n        <p>\u6700\u521D\u306E\u6295\u7A3F\u3092\u3057\u3066\u307F\u307E\u305B\u3093\u304B\uFF1F</p>\n        <button onclick=\"window.plantApp.closeSNSFeed()\" class=\"btn btn-primary\">\n          \u65B0\u3057\u3044\u76F8\u8AC7\u3092\u6295\u7A3F\n        </button>\n      </div>\n    `;\n    return;\n  }\n  \n  // \u2605 \u6700\u65B0\u30BF\u30D6\u306E\u5834\u5408\u306F\u30B0\u30EA\u30C3\u30C9\u8868\u793A\n  if (this.snsState.currentSort === 'recent') {\n    container.innerHTML = `\n      <div class=\"sns-grid-container\">\n        ${posts.map(post => `\n          <div class=\"sns-grid-item\" onclick=\"window.plantApp.openPostDetail('${post.id}')\">\n            ${post.input_image_url ? `\n              <img src=\"${post.input_image_url}\" alt=\"${this.escapeHtml(post.plant_name)}\" loading=\"lazy\">\n            ` : `\n              <div class=\"no-image-placeholder\">\n                <span>\uD83C\uDF31</span>\n                <span>${this.escapeHtml(post.plant_name)}</span>\n              </div>\n            `}\n          </div>\n        `).join('')}\n      </div>\n    `;\n  } else {\n    // \u2605 \u4EBA\u6C17\u30FB\u30C8\u30EC\u30F3\u30C9\u30BF\u30D6\u306F\u65E2\u5B58\u306E\u30AB\u30FC\u30C9\u8868\u793A\n    container.innerHTML = posts.map(post => this.renderSNSPostCard(post)).join('');\n  }\n  \n  // \u3082\u3063\u3068\u898B\u308B\u30DC\u30BF\u30F3\u306E\u8868\u793A\u5236\u5FA1\n  const loadMoreContainer = document.getElementById('load-more-container');\n  if (loadMoreContainer) {\n    loadMoreContainer.style.display = this.snsState.hasMore ? 'block' : 'none';\n  }\n}\n\nrenderSNSPostCard(post) {\n  console.log('\uD83D\uDCE6 renderSNSPostCard \u53D7\u4FE1\u30C7\u30FC\u30BF:', {\n    post_id: post.id,\n    user_email: post.user_email,\n    user_profiles: post.user_profiles,\n    user_nickname: post.user_nickname,\n    \u5168\u4F53: post\n  });\n  const timeAgo = this.getTimeAgo(post.created_at);\n  const formattedDate = this.formatDateTime(post.created_at);\n  const isOwnPost = post.user_email === this.userEmail;\n  // \u2605 \u30D5\u30A9\u30ED\u30FC\u72B6\u614B: API\u304B\u3089\u53D6\u5F97\u3057\u305F\u5024 \u2192 \u30AD\u30E3\u30C3\u30B7\u30E5 \u2192 \u30C7\u30D5\u30A9\u30EB\u30C8 false\n  const isFollowing = this.followState[post.user_email] !== undefined\n    ? this.followState[post.user_email]\n    : (post.viewer_is_following || false);\n  if (this.followState[post.user_email] === undefined) {\n    this.followState[post.user_email] = post.viewer_is_following || false;\n  }\n\n  // \u2605 user_profiles\u306E\u53D6\u5F97\uFF08\u8907\u6570\u30D1\u30BF\u30FC\u30F3\u5BFE\u5FDC\uFF09\n  const userProfile = post.user_profiles || post.user_profile || null;\n  \n  // \u2605 \u8868\u793A\u540D\u306E\u6C7A\u5B9A\uFF08\u512A\u5148\u9806\u4F4D: nickname > username > email\uFF09\n  const displayName = userProfile?.nickname || \n                     userProfile?.username || \n                     post.user_nickname ||\n                     'botaple'; \n  \n  // \u2605 \u30D7\u30ED\u30D5\u30A3\u30FC\u30EBURL\u306E\u751F\u6210\n  const username = userProfile?.username;\n  const profileUrl = username \n    ? `/pages/community?user=${encodeURIComponent(username)}`\n    : null;\n  \n  // \u2605 \u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u753B\u50CFURL\n  const profileImageUrl = userProfile?.profile_image_url || null;\n  \n  console.log('\uD83C\uDFA8 SNS\u6295\u7A3F\u30AB\u30FC\u30C9\u751F\u6210:', {\n    post_id: post.id,\n    displayName,\n    profileUrl,\n    profileImageUrl,\n    userProfile\n  });\n  \n  return `\n    <div class=\"sns-post-card\" data-post-id=\"${post.id}\">\n      <div class=\"post-header\">\n        <div class=\"post-author-info\">\n          <div class=\"author-avatar\">\n            ${profileImageUrl ? `\n              <img src=\"${profileImageUrl}\" alt=\"${this.escapeHtml(displayName)}\"\n                   style=\"width: 40px; height: 40px; border-radius: 50%; object-fit: cover;\">\n            ` : `\n              <div style=\"width: 40px; height: 40px; border-radius: 50%; background: #dbeafe;\n                          display: flex; align-items: center; justify-content: center; font-size: 20px;\">\n                \uD83C\uDF31\n              </div>\n            `}\n          </div>\n          <div class=\"author-details\">\n            <div class=\"author-name\">\n              ${profileUrl ? `\n                <a href=\"${profileUrl}\"\n                   style=\"color: #333; text-decoration: none; font-weight: 600;\"\n                   onclick=\"event.stopPropagation();\">\n                  ${this.escapeHtml(displayName)}\n                </a>\n              ` : `\n                <span style=\"color: #999; font-weight: 600;\">\n                  ${this.escapeHtml(displayName)}\n                </span>\n              `}\n            </div>\n            <div class=\"post-date\" style=\"font-size: 12px; color: #6b7280;\">\n              ${timeAgo}\n            </div>\n          </div>\n          ${!isOwnPost && this.userEmail ? `\n            <button class=\"follow-btn ${isFollowing ? 'following' : ''}\"\n                    data-author=\"${post.user_email}\"\n                    onclick=\"event.stopPropagation(); window.plantApp.toggleFollow('${post.user_email}', this)\"\n                    style=\"margin-left: auto; padding: 4px 12px; border-radius: 20px; font-size: 12px; font-weight: 600; cursor: pointer; border: 1.5px solid ${isFollowing ? '#6b7280' : '#16a34a'}; background: ${isFollowing ? 'transparent' : '#16a34a'}; color: ${isFollowing ? '#6b7280' : '#fff'}; transition: all 0.2s;\">\n              ${isFollowing ? '\u30D5\u30A9\u30ED\u30FC\u4E2D' : '\u30D5\u30A9\u30ED\u30FC'}\n            </button>\n          ` : ''}\n        </div>\n      </div>\n      \n      <div class=\"post-content\" onclick=\"window.plantApp.openPostDetail('${post.id}')\">\n        <h3 class=\"post-title\">${this.escapeHtml(post.plant_name)}</h3>\n        \n        ${post.input_image_url ? `\n          <div class=\"post-image\">\n            <img src=\"${post.input_image_url}\" alt=\"${this.escapeHtml(post.plant_name)}\" loading=\"lazy\">\n          </div>\n        ` : ''}\n        \n        ${post.notes ? `\n          <div class=\"post-notes\">\n            <p>${this.escapeHtml(post.notes).substring(0, 150)}${post.notes.length > 150 ? '...' : ''}</p>\n          </div>\n        ` : ''}\n        \n        ${post.consultation_request ? `\n          <div class=\"post-consultation\">\n            <p>${this.escapeHtml(post.consultation_request).substring(0, 150)}${post.consultation_request.length > 150 ? '...' : ''}</p>\n          </div>\n        ` : ''}\n      </div>\n      \n<div class=\"post-actions\">\n  <button class=\"action-btn ${post.user_has_liked ? 'liked' : ''}\" \n          onclick=\"event.stopPropagation(); window.plantApp.toggleLike('${post.id}')\">\n    ${post.user_has_liked ? '\u2764\uFE0F' : '\uD83E\uDD0D'} ${post.like_count || 0}\n  </button>\n  \n  <button class=\"action-btn\" onclick=\"event.stopPropagation(); window.plantApp.openPostDetail('${post.id}')\">\n    \uD83D\uDCAC ${post.comment_count || 0}\n  </button>\n  \n  ${isOwnPost ? `\n    <button class=\"action-btn\" disabled>\n      \uD83D\uDC41\uFE0F ${post.view_count || 0}\n    </button>\n  ` : ''}\n</div>\n    </div>\n  `;\n}\n\ngetTimeAgo(dateString) {\n  const now = new Date();\n  const past = new Date(dateString);\n  const diffMs = now - past;\n  const diffMins = Math.floor(diffMs / 60000);\n  const diffHours = Math.floor(diffMins / 60);\n  const diffDays = Math.floor(diffHours / 24);\n  \n  if (diffMins < 1) return '\u305F\u3063\u305F\u4ECA';\n  if (diffMins < 60) return `${diffMins}\u5206\u524D`;\n  if (diffHours < 24) return `${diffHours}\u6642\u9593\u524D`;\n  if (diffDays < 7) return `${diffDays}\u65E5\u524D`;\n  if (diffDays < 30) return `${Math.floor(diffDays / 7)}\u9031\u9593\u524D`;\n  if (diffDays < 365) return `${Math.floor(diffDays / 30)}\u30F6\u6708\u524D`;\n  return `${Math.floor(diffDays / 365)}\u5E74\u524D`;\n}\n\nchangeSNSSort(sortBy) {\n  this.snsState.currentSort = sortBy;\n  this.snsState.currentPage = 1;\n\n  // \u30BF\u30D6\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u72B6\u614B\u3092\u66F4\u65B0\n  document.querySelectorAll('.sort-tab').forEach(tab => {\n    tab.classList.remove('active');\n    if (tab.dataset.sort === sortBy) {\n      tab.classList.add('active');\n    }\n  });\n\n  // \u6295\u7A3F\u3092\u518D\u8AAD\u307F\u8FBC\u307F\n  this.loadPublicPosts(sortBy, 1, false);\n}\n\nchangeSNSFeed(feed) {\n  this.snsState.currentFeed = feed;\n  this.snsState.currentPage = 1;\n\n  // \u30D5\u30A3\u30FC\u30C9\u30BF\u30D6\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u72B6\u614B\u3092\u66F4\u65B0\n  document.querySelectorAll('.feed-tab').forEach(tab => {\n    tab.classList.remove('active');\n    if (tab.dataset.feed === feed) {\n      tab.classList.add('active');\n    }\n  });\n\n  // \u30D5\u30A9\u30ED\u30FC\u4E2D\u30D5\u30A3\u30FC\u30C9\u3067\u306F\u30BD\u30FC\u30C8\u30BF\u30D6\u3092\u7121\u52B9\u5316\uFF08\u5168\u4F53\u306E\u307F\u6709\u52B9\uFF09\n  const sortTabs = document.querySelector('.sns-sort-tabs');\n  if (sortTabs) {\n    sortTabs.style.opacity = feed === 'following' ? '0.4' : '1';\n    sortTabs.style.pointerEvents = feed === 'following' ? 'none' : '';\n  }\n\n  // \u30D5\u30A9\u30ED\u30FC\u4E2D\u30D5\u30A3\u30FC\u30C9\u306F\u5E38\u306B recent \u3067\u53D6\u5F97\n  const effectiveSort = feed === 'following' ? 'recent' : this.snsState.currentSort;\n  this.loadPublicPosts(effectiveSort, 1, false);\n}\n\nasync loadMoreSNSPosts() {\n  const nextPage = this.snsState.currentPage + 1;\n  const effectiveSort = this.snsState.currentFeed === 'following' ? 'recent' : this.snsState.currentSort;\n  await this.loadPublicPosts(effectiveSort, nextPage, true);\n}\n\nasync openPostDetail(postId) {\n  // \u2605 \u975E\u4F1A\u54E1\u3082\u95B2\u89A7\u53EF\u80FD\uFF08\u3044\u3044\u306D\u30FB\u30B3\u30E1\u30F3\u30C8\u30FB\u30D5\u30A9\u30ED\u30FC\u306E\u307F\u4F1A\u54E1\u9650\u5B9A\uFF09\n  try {\n    console.log('\uD83D\uDCD6 \u6295\u7A3F\u8A73\u7D30\u8868\u793A\u958B\u59CB:', postId);\n    \n    // \u2605\u2605\u2605 \u307E\u305A snsState.posts \u304B\u3089\u6295\u7A3F\u3092\u63A2\u3059\uFF08ai_response\u304C\u3042\u308B\u5834\u5408\u306E\u307F\u30AD\u30E3\u30C3\u30B7\u30E5\u5229\u7528\uFF09\u2605\u2605\u2605\n    let post = this.snsState.posts.find(p => p.id === postId);\n\n    if (post && post.ai_response) {\n      console.log('\u2705 \u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u6295\u7A3F\u53D6\u5F97:', post);\n      // \u95B2\u89A7\u6570\u3092\u30AB\u30A6\u30F3\u30C8\n      this.incrementViewCount(postId);\n      this.renderPostDetailModal(post);\n      return;\n    }\n\n    // \u2605\u2605\u2605 \u30AD\u30E3\u30C3\u30B7\u30E5\u306B\u306A\u3051\u308C\u3070\uFF08\u307E\u305F\u306Fai_response\u304C\u672A\u53D6\u5F97\u306A\u3089\uFF09API\u304B\u3089\u53D6\u5F97 \u2605\u2605\u2605\n    console.log('\uD83D\uDCE1 API\u304B\u3089\u6295\u7A3F\u53D6\u5F97\u958B\u59CB...');\n    \n    const response = await fetch(`${this.apiBase}?action=post_detail`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail || this.getAnonymousId(),\n        post_id: postId\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n    console.log('\uD83D\uDCE6 API\u30EC\u30B9\u30DD\u30F3\u30B9:', data);\n    \n    if (data.success && data.post) {\n      // \u95B2\u89A7\u6570\u3092\u30AB\u30A6\u30F3\u30C8\n      this.incrementViewCount(postId);\n      this.renderPostDetailModal(data.post);\n    } else {\n      // \u2605\u2605\u2605 API\u304C\u5931\u6557\u3057\u305F\u5834\u5408\u3067\u3082\u30A8\u30E9\u30FC\u306B\u305B\u305A\u3001\u8B66\u544A\u306E\u307F \u2605\u2605\u2605\n      console.warn('\u26A0\uFE0F API\u672A\u5B9F\u88C5 - \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E\u307F\u8868\u793A');\n      throw new Error('\u3053\u306E\u6295\u7A3F\u306F\u4E00\u89A7\u304B\u3089\u76F4\u63A5\u958B\u3044\u3066\u304F\u3060\u3055\u3044');\n    }\n    \n  } catch (error) {\n    console.error('\u6295\u7A3F\u8A73\u7D30\u8868\u793A\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      error.message || '\u6295\u7A3F\u8A73\u7D30\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F',\n      'error'\n    );\n  }\n}\n\nasync incrementViewCount(postId) {\n  try {\n    await fetch(`${this.apiBase}?action=increment_view_count`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail || this.getAnonymousId(),\n        post_id: postId\n      })\n    });\n  } catch (error) {\n    console.warn('\u95B2\u89A7\u6570\u30AB\u30A6\u30F3\u30C8\u30A8\u30E9\u30FC:', error);\n  }\n}\nrenderPostDetailModal(post) {\n  this.closeAllModals();\n  \n  const timeAgo = this.getTimeAgo(post.created_at);\n  const isOwnPost = post.user_email === this.userEmail;\n  \n  // \u2605 user_profiles\u306E\u53D6\u5F97\n  const userProfile = post.user_profiles || post.user_profile || null;\n  \n  // \u2605 \u8868\u793A\u540D\u3068\u30D7\u30ED\u30D5\u30A3\u30FC\u30EBURL\n  const displayName = userProfile?.nickname || \n                     userProfile?.username || \n                     post.user_nickname ||\n                     'botaple';\n  \n  const username = userProfile?.username;\n  const profileUrl = username \n    ? `/pages/community?user=${encodeURIComponent(username)}`\n    : null;\n  \n  const profileImageUrl = userProfile?.profile_image_url || null;\n  \n  console.log('\uD83D\uDCC4 \u6295\u7A3F\u8A73\u7D30\u30E2\u30FC\u30C0\u30EB\u751F\u6210:', {\n    post_id: post.id,\n    displayName,\n    profileUrl,\n    profileImageUrl\n  });\n  \n  const modalHtml = `\n    <div id=\"post-detail-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n      <div class=\"modal-content post-detail-modal-content\" onclick=\"event.stopPropagation()\">\n        \n        <!-- \u30D8\u30C3\u30C0\u30FC -->\n        <div class=\"post-detail-header\">\n          <button onclick=\"window.plantApp.closePostDetailModal()\" class=\"back-btn\" type=\"button\">\n            \u2190 \u4E00\u89A7\u306B\u623B\u308B\n          </button>\n          <h3>\u6295\u7A3F\u8A73\u7D30</h3>\n          <button onclick=\"window.plantApp.closePostDetailModal()\" class=\"close-btn\" type=\"button\">\u00D7</button>\n        </div>\n        \n        <!-- \u6295\u7A3F\u672C\u6587 -->\n        <div class=\"post-detail-body\">\n          \n          <!-- \u30E6\u30FC\u30B6\u30FC\u60C5\u5831 -->\n          <div class=\"post-author-info\">\n            ${profileImageUrl ? `\n              <img src=\"${profileImageUrl}\" alt=\"${this.escapeHtml(displayName)}\" \n                   class=\"user-avatar-large\" \n                   style=\"width: 60px; height: 60px; border-radius: 50%; object-fit: cover;\">\n            ` : `\n              <span class=\"user-avatar-large\"><img src=\"https://cdn.shopify.com/s/files/1/0658/5332/5495/files/blg2.png?v=1767146489\" alt=\"\u30DC\u30BF\u30EC\u30B3\" class=\"user-avatar-large\" style=\"width: 60px; height: 60px; border-radius: 50%; object-fit: cover;\"></span>\n            `}\n            <div class=\"author-details\">\n              ${profileUrl ? `\n                <a href=\"${profileUrl}\" \n                   class=\"author-nickname\"\n                   style=\"color: #333; text-decoration: none; font-weight: 600;\">\n                  ${this.escapeHtml(displayName)}\n                </a>\n              ` : `\n                <span class=\"author-nickname\" style=\"color: #999; font-weight: 600;\">\n                  ${this.escapeHtml(displayName)}\n                </span>\n              `}\n              <span class=\"post-timestamp\">${timeAgo} \u2022 ${this.formatDateTime(post.created_at)}</span>\n            </div>\n          </div>\n          \n          <!-- \u690D\u7269\u540D -->\n          <h2 class=\"post-plant-name\">${this.escapeHtml(post.plant_name)}</h2>\n          \n          <!-- \u753B\u50CF -->\n          ${post.input_image_url ? `\n            <div class=\"post-detail-image\">\n              <img src=\"${post.input_image_url}\" \n                   alt=\"${this.escapeHtml(post.plant_name)}\"\n                   onclick=\"window.plantApp.showImageFullscreen('${post.input_image_url}', '${this.escapeHtml(post.plant_name)}')\"\n                   loading=\"lazy\">\n            </div>\n          ` : ''}\n          \n          <!-- \u8A18\u9332\u5185\u5BB9 -->\n          ${post.notes ? `\n            <div class=\"post-detail-section\">\n              <h4>\uD83D\uDCDD \u8A18\u9332\u30FB\u5099\u8003</h4>\n              <p>${this.escapeHtml(post.notes)}</p>\n            </div>\n          ` : ''}\n          \n          <!-- \u76F8\u8AC7\u5185\u5BB9 -->\n          ${post.consultation_request ? `\n            <div class=\"post-detail-section\">\n              <h4>\uD83D\uDCA1 \u76F8\u8AC7\u5185\u5BB9</h4>\n              <p>${this.escapeHtml(post.consultation_request)}</p>\n            </div>\n          ` : ''}\n          \n          <!-- AI\u56DE\u7B54 -->\n          ${post.ai_response ? `\n            <div class=\"post-detail-section ai-response-section\">\n              <h4>\uD83E\uDD16 AI\u5206\u6790\u7D50\u679C</h4>\n              <div class=\"ai-response-full\">${this.formatResponse(post.ai_response)}</div>\n            </div>\n          ` : ''}\n          \n          <!-- AI\u751F\u6210\u30A4\u30E9\u30B9\u30C8 -->\n          ${post.ai_generated_image_url ? `\n            <div class=\"post-detail-section\">\n              <h4>\uD83C\uDFA8 \u30B1\u30A2\u30A4\u30E9\u30B9\u30C8</h4>\n              <div class=\"post-detail-image\">\n                <img src=\"${post.ai_generated_image_url}\" \n                     alt=\"\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\"\n                     onclick=\"window.plantApp.showImageFullscreen('${post.ai_generated_image_url}', '\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8')\"\n                     loading=\"lazy\">\n              </div>\n            </div>\n          ` : ''}\n          \n          <!-- \u30A2\u30AF\u30B7\u30E7\u30F3\u30DC\u30BF\u30F3 -->\n<div class=\"post-detail-actions\">\n  <button class=\"action-btn-large ${post.user_has_liked ? 'liked' : ''}\" \n          onclick=\"window.plantApp.toggleLikeInDetail('${post.id}')\">\n    ${post.user_has_liked ? '\u2764\uFE0F' : '\uD83E\uDD0D'} ${post.like_count}\n  </button>\n  <button class=\"action-btn-large\" style=\"flex: 1;\">\n    \uD83D\uDCAC ${post.comment_count}\n  </button>\n  \n  ${isOwnPost ? `\n    <button class=\"action-btn-large\" style=\"flex: 1;\">\n      \uD83D\uDC41\uFE0F ${post.view_count}\n    </button>\n  ` : ''}\n  \n  ${post.thread_id ? `\n    <button class=\"action-btn-large btn-growth-record\" \n            onclick=\"window.plantApp.openGrowthRecordFromPost('${post.thread_id}', '${this.escapeHtml(post.plant_name)}', '${post.user_email}')\">\n      \uD83D\uDCC8 \u6210\u9577\u8A18\u9332\u3092\u898B\u308B\n    </button>\n  ` : ''}\n  \n  ${isOwnPost ? `\n    <button class=\"action-btn-large delete-btn\" \n            onclick=\"window.plantApp.deletePublicPost('${post.id}')\">\n      \uD83D\uDDD1\uFE0F \u524A\u9664\n    </button>\n  ` : ''}\n</div>\n          \n          <!-- \u30B3\u30E1\u30F3\u30C8\u30BB\u30AF\u30B7\u30E7\u30F3 -->\n          <div class=\"comments-section\">\n            <h4>\uD83D\uDCAC \u30B3\u30E1\u30F3\u30C8 (${post.comment_count || 0})</h4>\n            \n            <!-- \u30B3\u30E1\u30F3\u30C8\u6295\u7A3F\u30D5\u30A9\u30FC\u30E0 -->\n            <div class=\"comment-form\">\n              <textarea id=\"comment-text-${post.id}\" \n                        placeholder=\"\u30B3\u30E1\u30F3\u30C8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044...\"\n                        rows=\"3\"\n                        maxlength=\"500\"></textarea>\n              <div class=\"comment-form-actions\">\n                <span class=\"char-count\" id=\"char-count-${post.id}\">0/500</span>\n                <button onclick=\"window.plantApp.submitComment('${post.id}')\" class=\"btn btn-primary\">\n                  \u30B3\u30E1\u30F3\u30C8\u3059\u308B\n                </button>\n              </div>\n            </div>\n            \n            <!-- \u30B3\u30E1\u30F3\u30C8\u4E00\u89A7 -->\n            <div id=\"comments-list-${post.id}\" class=\"comments-list\">\n              <div class=\"loading\">\n                <div class=\"spinner\"></div>\n                <p>\u30B3\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...</p>\n              </div>\n            </div>\n          </div>\n          \n        </div>\n      </div>\n    </div>\n  `;\n  \n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n  \n  // \u30B3\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u8AAD\u307F\u8FBC\u307F\n  this.loadPostComments(post.id);\n  \n  // \u6587\u5B57\u6570\u30AB\u30A6\u30F3\u30BF\u30FC\n  const textarea = document.getElementById(`comment-text-${post.id}`);\n  const charCount = document.getElementById(`char-count-${post.id}`);\n  if (textarea && charCount) {\n    textarea.addEventListener('input', () => {\n      const length = textarea.value.length;\n      charCount.textContent = `${length}/500`;\n      charCount.style.color = length > 450 ? '#dc2626' : '#6b7280';\n    });\n  }\n}\n\nclosePostDetailModal() {\n  const modal = document.getElementById('post-detail-modal');\n  if (modal) {\n    modal.remove();\n  }\n  \n  // SNS\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u3092\u66F4\u65B0\uFF08\u3044\u3044\u306D\u6570\u306A\u3069\u53CD\u6620\uFF09\n  if (this.snsState && this.snsState.currentSort) {\n    this.loadPublicPosts(this.snsState.currentSort, this.snsState.currentPage, false);\n  }\n}\n\nasync loadPostComments(postId) {\n  const container = document.getElementById(`comments-list-${postId}`);\n  if (!container) return;\n  \n  try {\n    const response = await fetch(`${this.apiBase}?action=get_comments`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail || this.getAnonymousId(),\n        post_id: postId\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.json();\n\n    if (data.success) {\n      this.renderCommentsList(postId, data.comments || []);\n    } else {\n      throw new Error(data.error || '\u30B3\u30E1\u30F3\u30C8\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u30B3\u30E1\u30F3\u30C8\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    container.innerHTML = `\n      <div class=\"empty-content\">\n        <p>\u30B3\u30E1\u30F3\u30C8\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F</p>\n      </div>\n    `;\n  }\n}\n\nrenderCommentsList(postId, comments) {\n  const container = document.getElementById(`comments-list-${postId}`);\n  if (!container) return;\n  \n  if (comments.length === 0) {\n    container.innerHTML = `\n      <div class=\"no-comments\">\n        <p>\u307E\u3060\u30B3\u30E1\u30F3\u30C8\u304C\u3042\u308A\u307E\u305B\u3093</p>\n        <p><small>\u6700\u521D\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u6295\u7A3F\u3057\u3066\u307F\u307E\u305B\u3093\u304B\uFF1F</small></p>\n      </div>\n    `;\n    return;\n  }\n  \n  container.innerHTML = comments.map(comment => {\n    const isOwnComment = comment.user_email === this.userEmail;\n    const timeAgo = this.getTimeAgo(comment.created_at);\n    const user = comment.user || {};\n    const nickname = user.nickname || '\u30E6\u30FC\u30B6\u30FC';\n    const profileUrl = user.username\n      ? `/pages/community?user=${encodeURIComponent(user.username)}`\n      : null;\n    const avatarHtml = user.profile_image_url\n      ? `<img src=\"${this.escapeHtml(user.profile_image_url)}\" class=\"comment-avatar-img\" alt=\"\" style=\"width:32px;height:32px;border-radius:50%;object-fit:cover;\">`\n      : `<span class=\"comment-avatar-placeholder\" style=\"width:32px;height:32px;border-radius:50%;background:#e5e7eb;display:inline-flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;color:#6b7280;\">${nickname[0].toUpperCase()}</span>`;\n    const authorHtml = profileUrl\n      ? `<a href=\"${profileUrl}\" class=\"comment-author\" style=\"color:#111;font-weight:600;text-decoration:none;\">${this.escapeHtml(nickname)}</a>`\n      : `<span class=\"comment-author\">${this.escapeHtml(nickname)}</span>`;\n\n    return `\n      <div class=\"comment-item\" data-comment-id=\"${comment.id}\">\n        <div class=\"comment-header\">\n          ${avatarHtml}\n          <div class=\"comment-author-info\">\n            ${authorHtml}\n            <span class=\"comment-time\">${timeAgo}</span>\n          </div>\n          ${isOwnComment ? `\n            <button class=\"comment-delete-btn\"\n                    onclick=\"window.plantApp.deleteComment('${comment.id}', '${postId}')\"\n                    title=\"\u524A\u9664\">\n              \uD83D\uDDD1\uFE0F\n            </button>\n          ` : ''}\n        </div>\n        <div class=\"comment-body\">\n          <p>${this.escapeHtml(comment.comment_text)}</p>\n        </div>\n      </div>\n    `;\n  }).join('');\n}\n\nasync submitComment(postId) {\n  if (this.getMembershipType() === 'non_member') {\n    this.showTemporaryNotification('\u30B3\u30E1\u30F3\u30C8\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059', 'warning');\n    return;\n  }\n\n  const textarea = document.getElementById(`comment-text-${postId}`);\n  const commentText = textarea?.value?.trim();\n\n  if (!commentText) {\n    this.showTemporaryNotification('\u30B3\u30E1\u30F3\u30C8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n  \n  if (commentText.length > 500) {\n    this.showTemporaryNotification('\u30B3\u30E1\u30F3\u30C8\u306F500\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044', 'error');\n    return;\n  }\n  \n  try {\n    const response = await fetch(`${this.apiBase}?action=add_comment`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        post_id: postId,\n        comment_text: commentText\n      })\n    });\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    \n    const data = await response.json();\n    \n    if (data.success) {\n      // \u30C6\u30AD\u30B9\u30C8\u30A8\u30EA\u30A2\u3092\u30AF\u30EA\u30A2\n      if (textarea) {\n        textarea.value = '';\n        const charCount = document.getElementById(`char-count-${postId}`);\n        if (charCount) charCount.textContent = '0/500';\n      }\n      \n      // \u30B3\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u518D\u8AAD\u307F\u8FBC\u307F\n      this.loadPostComments(postId);\n      \n      this.showTemporaryNotification('\u30B3\u30E1\u30F3\u30C8\u3092\u6295\u7A3F\u3057\u307E\u3057\u305F', 'success');\n      \n    } else {\n      throw new Error(data.error || '\u30B3\u30E1\u30F3\u30C8\u306E\u6295\u7A3F\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u30B3\u30E1\u30F3\u30C8\u6295\u7A3F\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u30B3\u30E1\u30F3\u30C8\u306E\u6295\u7A3F\u306B\u5931\u6557: ${error.message}`,\n      'error'\n    );\n  }\n}\n\nasync deleteComment(commentId, postId) {\n  if (!confirm('\u3053\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F')) {\n    return;\n  }\n  \n  try {\n    const response = await fetch(`${this.apiBase}?action=delete_comment`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        comment_id: commentId\n      })\n    });\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    \n    const data = await response.json();\n    \n    if (data.success) {\n      // \u30B3\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u518D\u8AAD\u307F\u8FBC\u307F\n      this.loadPostComments(postId);\n      \n      this.showTemporaryNotification('\u30B3\u30E1\u30F3\u30C8\u3092\u524A\u9664\u3057\u307E\u3057\u305F', 'success');\n      \n    } else {\n      throw new Error(data.error || '\u30B3\u30E1\u30F3\u30C8\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u30B3\u30E1\u30F3\u30C8\u524A\u9664\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u30B3\u30E1\u30F3\u30C8\u306E\u524A\u9664\u306B\u5931\u6557: ${error.message}`,\n      'error'\n    );\n  }\n}\n\nasync toggleLikeInDetail(postId) {\n  await this.toggleLike(postId);\n  \n  // \u8A73\u7D30\u30E2\u30FC\u30C0\u30EB\u5185\u306E\u3044\u3044\u306D\u30DC\u30BF\u30F3\u3092\u66F4\u65B0\n  const post = this.snsState.posts.find(p => p.id === postId);\n  if (post) {\n    const likeBtn = document.querySelector('.post-detail-actions .action-btn-large.liked, .post-detail-actions .action-btn-large:not(.delete-btn):first-child');\n    if (likeBtn) {\n      if (post.user_has_liked) {\n        likeBtn.classList.add('liked');\n        likeBtn.innerHTML = `\u2764\uFE0F ${post.like_count}`;\n      } else {\n        likeBtn.classList.remove('liked');\n        likeBtn.innerHTML = `\uD83E\uDD0D ${post.like_count}`;\n      }\n    }\n  }\n}\n\nasync deletePublicPost(postId) {\n  if (!confirm('\u3053\u306E\u6295\u7A3F\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\\n\\n\u524A\u9664\u3059\u308B\u3068\u3001\u3044\u3044\u306D\u3084\u30B3\u30E1\u30F3\u30C8\u3082\u5168\u3066\u524A\u9664\u3055\u308C\u307E\u3059\u3002')) {\n    return;\n  }\n  \n  try {\n    // \u30102026-09-12\u4FEE\u6B63\u3011delete_public_post\u3068\u3044\u3046action\u540D\u306B\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u5B9F\u88C5\u304C\n    // \u5B58\u5728\u305B\u305A\u3001SNS\u30D5\u30A3\u30FC\u30C9\u304B\u3089\u306E\u6295\u7A3F\u524A\u9664\u304C\u5E38\u306B\u5931\u6557\u3057\u3066\u3044\u305F\u3002\u65E2\u5B58\u306E`delete_post`\n    // (\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u753B\u9762\u7B49\u3001\u4ED6\u306E\u524A\u9664\u5C0E\u7DDA\u3067\u4F7F\u308F\u308C\u3066\u3044\u308B\u5B9F\u88C5)\u306F\u5168\u304F\u540C\u3058\n    // {user_email, post_id}\u3092\u53D7\u3051\u53D6\u308A\u540C\u3058\u524A\u9664\u51E6\u7406(\u3044\u3044\u306D/\u30B3\u30E1\u30F3\u30C8\u9023\u52D5\u524A\u9664\u542B\u3080)\u3092\n    // \u884C\u3046\u305F\u3081\u3001\u65B0\u898F\u5B9F\u88C5\u305B\u305A\u3053\u3061\u3089\u3092\u547C\u3076\u3088\u3046\u4FEE\u6B63\u3002\n    const response = await fetch(`${this.apiBase}?action=delete_post`, {\n      method: 'POST',\n      headers: { \n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        post_id: postId\n      })\n    });\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    \n    const data = await response.json();\n    \n    if (data.success) {\n      this.showTemporaryNotification('\u6295\u7A3F\u3092\u524A\u9664\u3057\u307E\u3057\u305F', 'success');\n      \n      // \u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n      this.closeAllModals();\n      \n      // SNS\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u3092\u66F4\u65B0\n      if (this.snsState && this.snsState.currentSort) {\n        this.loadPublicPosts(this.snsState.currentSort, 1, false);\n      }\n      \n    } else {\n      throw new Error(data.error || '\u6295\u7A3F\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u6295\u7A3F\u524A\u9664\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u6295\u7A3F\u306E\u524A\u9664\u306B\u5931\u6557: ${error.message}`,\n      'error'\n    );\n  }\n}\nasync openGrowthRecordFromPost(threadId, plantName, ownerEmail) {\n  try {\n    console.log('\uD83D\uDCC8 \u6210\u9577\u8A18\u9332\u3092\u958B\u304F:', { threadId, plantName, ownerEmail });\n    this.openedFromSNS = true;\n    console.log('\uD83D\uDCCC \u30D5\u30E9\u30B0\u8A2D\u5B9A:', this.openedFromSNS);\n    \n    \n    // \u2605 \u6295\u7A3F\u8A73\u7D30\u306E\u72B6\u614B\u3092\u4FDD\u5B58\n    this.returnToPostDetail = true;\n    this.currentPostId = document.querySelector('#post-detail-modal')?.dataset?.postId || null;\n    \n    // \u6295\u7A3F\u8A73\u7D30\u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n    const postDetailModal = document.getElementById('post-detail-modal');\n    if (postDetailModal) {\n      postDetailModal.remove();\n    }\n    \n    // SNS\u30D5\u30A3\u30FC\u30C9\u30E2\u30FC\u30C0\u30EB\u3082\u9589\u3058\u308B\n    const snsModal = document.getElementById('sns-feed-modal');\n    if (snsModal) {\n      snsModal.remove();\n    }\n    \n    this.showLoadingModal('\u6210\u9577\u8A18\u9332\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...');\n    \n    // \u6295\u7A3F\u30C7\u30FC\u30BF\u304B\u3089\u76F4\u63A5\u30B9\u30EC\u30C3\u30C9\u30C7\u30FC\u30BF\u3092\u69CB\u7BC9\n    const threadData = {\n      id: threadId,\n      plant_name: plantName,\n      user_email: ownerEmail,\n      is_owner: ownerEmail === this.userEmail\n    };\n    \n    // \u6295\u7A3F\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\n    const posts = await this.loadThreadPosts(threadId);\n    \n    this.closeLoadingModal();\n    \n    // \u30E2\u30FC\u30C0\u30EB\u3092\u8868\u793A\n    this.currentOpenThread = threadData;\n    this.renderAdvancedPlantRecordModal(threadData, posts);\n    this.loadModalAdditionalData(threadId);\n        console.log('\uD83D\uDCCC openGrowthRecordFromPost \u7D42\u4E86\u6642:', this.openedFromSNS);\n\n  } catch (error) {\n    this.closeLoadingModal();\n    console.error('\u6210\u9577\u8A18\u9332\u8868\u793A\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification('\u6210\u9577\u8A18\u9332\u306E\u8868\u793A\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n  }\n}\n// \u2605 \u30D5\u30A9\u30ED\u30FC/\u30A2\u30F3\u30D5\u30A9\u30ED\u30FC\nasync toggleFollow(authorEmail, buttonEl) {\n  if (!this.userEmail) {\n    this.showTemporaryNotification('\u30D5\u30A9\u30ED\u30FC\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059', 'warning');\n    return;\n  }\n  if (buttonEl) {\n    buttonEl.disabled = true;\n    buttonEl.style.opacity = '0.6';\n  }\n  try {\n    const response = await fetch(`${this.apiBase}?action=toggle_follow`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ follower_email: this.userEmail, following_email: authorEmail })\n    });\n    const data = await response.json();\n    if (data.success) {\n      this.followState[authorEmail] = data.is_following;\n      // \u540C\u3058\u8457\u8005\u306E\u3059\u3079\u3066\u306E\u30D5\u30A9\u30ED\u30FC\u30DC\u30BF\u30F3\u3092\u66F4\u65B0\n      document.querySelectorAll(`.follow-btn[data-author=\"${authorEmail}\"]`).forEach(btn => {\n        btn.textContent = data.is_following ? '\u30D5\u30A9\u30ED\u30FC\u4E2D' : '\u30D5\u30A9\u30ED\u30FC';\n        btn.classList.toggle('following', data.is_following);\n        btn.style.border = `1.5px solid ${data.is_following ? '#6b7280' : '#16a34a'}`;\n        btn.style.background = data.is_following ? 'transparent' : '#16a34a';\n        btn.style.color = data.is_following ? '#6b7280' : '#fff';\n      });\n      this.showTemporaryNotification(\n        data.is_following ? '\u30D5\u30A9\u30ED\u30FC\u3057\u307E\u3057\u305F' : '\u30D5\u30A9\u30ED\u30FC\u3092\u89E3\u9664\u3057\u307E\u3057\u305F',\n        'success'\n      );\n    } else {\n      throw new Error(data.error || '\u30D5\u30A9\u30ED\u30FC\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n  } catch (error) {\n    console.error('toggleFollow error:', error);\n    this.showTemporaryNotification('\u30D5\u30A9\u30ED\u30FC\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n  } finally {\n    if (buttonEl) {\n      buttonEl.disabled = false;\n      buttonEl.style.opacity = '1';\n    }\n  }\n}\n\nasync toggleLike(postId) {\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') {\n    this.showTemporaryNotification('\u3044\u3044\u306D\u6A5F\u80FD\u306F\u4F1A\u54E1\u9650\u5B9A\u3067\u3059', 'error');\n    return;\n  }\n  \n  try {\n    const response = await fetch(`${this.apiBase}?action=toggle_like`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY,\n        'apikey': this.SUPABASE_ANON_KEY\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail,\n        post_id: postId\n      })\n    });\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n    \n    const data = await response.json();\n    \n    if (data.success) {\n      // \u30AB\u30FC\u30C9\u5185\u306E\u3044\u3044\u306D\u30DC\u30BF\u30F3\u3092\u66F4\u65B0\n      const card = document.querySelector(`[data-post-id=\"${postId}\"]`);\n      if (card) {\n        const likeBtn = card.querySelector('.action-btn');\n        if (likeBtn) {\n          if (data.liked) {\n            likeBtn.classList.add('liked');\n            likeBtn.innerHTML = `\u2764\uFE0F ${data.like_count}`;\n          } else {\n            likeBtn.classList.remove('liked');\n            likeBtn.innerHTML = `\uD83E\uDD0D ${data.like_count}`;\n          }\n        }\n      }\n      \n      // snsState\u5185\u306E\u6295\u7A3F\u30C7\u30FC\u30BF\u3082\u66F4\u65B0\n      const postInState = this.snsState.posts.find(p => p.id === postId);\n      if (postInState) {\n        postInState.user_has_liked = data.liked;\n        postInState.like_count = data.like_count;\n      }\n      \n    } else {\n      throw new Error(data.error || '\u3044\u3044\u306D\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n    }\n    \n  } catch (error) {\n    console.error('\u3044\u3044\u306D\u30A8\u30E9\u30FC:', error);\n    this.showTemporaryNotification(\n      `\u3044\u3044\u306D\u51E6\u7406\u306B\u5931\u6557: ${error.message}`,\n      'error'\n    );\n  }\n}\n// ==========================================\n// SNS\u6A5F\u80FD\u95A2\u9023\u30E1\u30BD\u30C3\u30C9 \u3053\u3053\u307E\u3067\n// ==========================================\n\n  async executeDeletePost(postId, threadId = '') {\n    const statusDiv = document.getElementById('delete-status');\n    const deleteBtn = document.getElementById('delete-execute-btn');\n    \n    if (!statusDiv || !deleteBtn) {\n      console.error('\u524A\u9664UI\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n      return;\n    }\n\n    deleteBtn.disabled = true;\n    deleteBtn.textContent = '\u524A\u9664\u51E6\u7406\u4E2D...';\n\n    statusDiv.innerHTML = `\n      <div class=\"loading-message\">\n        <div class=\"spinner\"></div>\n        <p>\u6295\u7A3F\u3092\u524A\u9664\u4E2D...</p>\n        <p><small>\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u5B8C\u5168\u306B\u524A\u9664\u3057\u3066\u3044\u307E\u3059...</small></p>\n      </div>\n    `;\n\n    try {\n      console.log('\u524A\u9664API\u547C\u3073\u51FA\u3057\u958B\u59CB:', { \n        postId, \n        threadId, \n        userEmail: this.userEmail \n      });\n\n      const response = await fetch(`${this.apiBase}?action=delete_post`, {\n        method: 'POST',\n        headers: { \n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          entitlement: this.entitlement,\n          entitlement_snapshot: this.entitlementSnapshot,\n          post_id: postId\n        })\n      });\n\n      console.log('\u524A\u9664API\u5FDC\u7B54:', {\n        status: response.status,\n        statusText: response.statusText,\n        headers: Object.fromEntries(response.headers.entries())\n      });\n\n      let data;\n      const contentType = response.headers.get('content-type');\n      \n      if (contentType && contentType.includes('application/json')) {\n        data = await response.json();\n      } else {\n        const textResponse = await response.text();\n        console.error('\u975EJSON\u5FDC\u7B54:', textResponse);\n        throw new Error(`\u4E88\u671F\u3057\u306A\u3044\u5FDC\u7B54\u5F62\u5F0F: ${response.status} ${response.statusText}`);\n      }\n\n      console.log('\u524A\u9664\u51E6\u7406\u7D50\u679C:', data);\n\n      if (data.success) {\n        statusDiv.innerHTML = `\n          <div class=\"success-message\">\n            <h5>\u2705 \u524A\u9664\u5B8C\u4E86</h5>\n            <div class=\"deletion-result\">\n              <p><strong>\u524A\u9664\u3055\u308C\u305F\u5185\u5BB9:</strong></p>\n              <ul>\n                <li>\u6295\u7A3FID: ${postId}</li>\n                <li>\u6295\u7A3F\u5185\u5BB9: \u524A\u9664\u6E08\u307F</li>\n                <li>\u6DFB\u4ED8\u753B\u50CF: \u524A\u9664\u6E08\u307F</li>\n                <li>\u8FFD\u52A0\u76F8\u8AC7: ${data.deleted_follow_ups || 0}\u4EF6\u524A\u9664</li>\n                ${data.thread_deleted ? '<li><strong>\u690D\u7269\u8A18\u9332\u5168\u4F53\u3082\u524A\u9664\u3055\u308C\u307E\u3057\u305F</strong></li>' : ''}\n              </ul>\n              ${data.remaining_posts_count !== undefined ? \n                `<p>\u3053\u306E\u690D\u7269\u306E\u6B8B\u308A\u8A18\u9332\u6570: ${data.remaining_posts_count}\u4EF6</p>` : ''\n              }\n            </div>\n          </div>\n        `;\n\n        this.showTemporaryNotification(\n          data.thread_deleted ? '\u690D\u7269\u8A18\u9332\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3057\u305F' : '\u6295\u7A3F\u3092\u524A\u9664\u3057\u307E\u3057\u305F', \n          'success'\n        );\n\n        setTimeout(async () => {\n          this.closeAllModals();\n          await this.refreshAfterDeletion(data.thread_deleted);\n        }, 2500);\n\n      } else {\n        throw new Error(data.error || '\u524A\u9664\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F');\n      }\n\n    } catch (error) {\n      console.error('\u524A\u9664\u51E6\u7406\u30A8\u30E9\u30FC:', error);\n      \n      statusDiv.innerHTML = `\n        <div class=\"error-message\">\n          <h5>\u274C \u524A\u9664\u5931\u6557</h5>\n          <div class=\"error-details\">\n            <p><strong>\u30A8\u30E9\u30FC\u5185\u5BB9:</strong> ${error.message}</p>\n            <p><strong>\u5BFE\u51E6\u65B9\u6CD5:</strong></p>\n            <ul>\n              <li>\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044</li>\n              <li>\u30DA\u30FC\u30B8\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044</li>\n              <li>\u554F\u984C\u304C\u7D9A\u304F\u5834\u5408\u306F\u30B5\u30DD\u30FC\u30C8\u306B\u304A\u554F\u3044\u5408\u308F\u305B\u304F\u3060\u3055\u3044</li>\n            </ul>\n          </div>\n          <div class=\"error-actions\">\n            <button onclick=\"window.plantApp.executeDeletePost('${postId}', '${threadId}')\" \n                    class=\"btn btn-primary btn-small\">\n              \u518D\u8A66\u884C\n            </button>\n            <button onclick=\"window.plantApp.closeAllModals()\" \n                    class=\"btn btn-secondary btn-small\">\n              \u9589\u3058\u308B\n            </button>\n          </div>\n        </div>\n      `;\n\n      this.showTemporaryNotification('\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n      \n    } finally {\n      deleteBtn.disabled = false;\n      deleteBtn.textContent = '\uD83D\uDDD1\uFE0F \u5B8C\u5168\u306B\u524A\u9664\u3059\u308B';\n    }\n  }\nasync deleteThread(threadId) {\n  if (!confirm('\u3053\u306E\u690D\u7269\u306E\u80B2\u6210\u8A18\u9332\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\\n\uFF08\u5168\u3066\u306E\u6295\u7A3F\u3068\u30B1\u30A2\u8A18\u9332\u304C\u524A\u9664\u3055\u308C\u307E\u3059\uFF09')) {\n    return;\n  }\n\n  try {\n    console.log('\u690D\u7269\u30AB\u30FC\u30C9\u524A\u9664\u958B\u59CB:', threadId);\n\n    const response = await fetch(\n      `${this.apiBase}?action=delete_thread`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'apikey': this.supabaseAnonKey\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          thread_id: threadId\n        })\n      }\n    );\n\n    const data = await response.json();\n    console.log('\u524A\u9664\u51E6\u7406\u7D50\u679C:', data);\n\n    if (data.success) {\n      alert('\u690D\u7269\u30AB\u30FC\u30C9\u3092\u524A\u9664\u3057\u307E\u3057\u305F');\n      \n      // \u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n      this.closeAllModals();\n      \n      // UI\u304B\u3089\u524A\u9664\n      const card = document.querySelector(`[data-thread-id=\"${threadId}\"]`);\n      if (card) {\n        card.remove();\n      }\n      \n      // \u30DA\u30FC\u30B8\u3092\u30EA\u30ED\u30FC\u30C9\u3057\u3066\u6700\u65B0\u72B6\u614B\u3092\u8868\u793A\n      window.location.reload();\n      \n    } else {\n      alert('\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ' + (data.error || '\u4E0D\u660E\u306A\u30A8\u30E9\u30FC'));\n    }\n\n  } catch (error) {\n    console.error('\u690D\u7269\u30AB\u30FC\u30C9\u524A\u9664\u30A8\u30E9\u30FC:', error);\n    alert('\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F');\n  }\n}\nasync deletePublicPost(postId) {\n  if (!confirm('\u3053\u306E\u6295\u7A3F\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\\n\u524A\u9664\u3059\u308B\u3068\u3001\u3044\u3044\u306D\u3084\u30B3\u30E1\u30F3\u30C8\u3082\u5168\u3066\u524A\u9664\u3055\u308C\u307E\u3059\u3002')) {\n    return;\n  }\n\n  try {\n    console.log('\uD83D\uDDD1\uFE0F SNS\u6295\u7A3F\u524A\u9664\u958B\u59CB:', postId);\n\n    const response = await fetch(\n      `${this.apiBase}?action=delete_post`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'apikey': this.supabaseAnonKey\n        },\n        body: JSON.stringify({\n          user_email: this.userEmail,\n          post_id: postId\n        })\n      }\n    );\n\n    const data = await response.json();\n    console.log('\u524A\u9664\u51E6\u7406\u7D50\u679C:', data);\n\n    if (data.success) {\n      alert('\u6295\u7A3F\u3092\u524A\u9664\u3057\u307E\u3057\u305F');\n      \n      // \u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u308B\n      this.closeAllModals();\n      \n      // SNS\u6295\u7A3F\u4E00\u89A7\u3092\u518D\u8AAD\u307F\u8FBC\u307F\n      await this.loadPublicPosts();\n      \n    } else {\n      alert('\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ' + (data.error || '\u4E0D\u660E\u306A\u30A8\u30E9\u30FC'));\n    }\n\n  } catch (error) {\n    console.error('SNS\u6295\u7A3F\u524A\u9664\u30A8\u30E9\u30FC:', error);\n    alert('\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F');\n  }\n}\n  async refreshAfterDeletion(threadDeleted = false) {\n    console.log('\u524A\u9664\u5F8C\u66F4\u65B0\u51E6\u7406:', { threadDeleted });\n    \n    try {\n      await this.loadUserThreads();\n      await this.loadExistingPlantsForSelection();\n      \n      if (this.currentOpenThread) {\n        if (threadDeleted) {\n          this.currentOpenThread = null;\n          console.log('\u30B9\u30EC\u30C3\u30C9\u524A\u9664\u306B\u3088\u308A\u8A18\u9332\u30E2\u30FC\u30C0\u30EB\u3092\u9589\u3058\u307E\u3059');\n        } else {\n          console.log('\u6295\u7A3F\u524A\u9664\u306B\u3088\u308A\u30E2\u30FC\u30C0\u30EB\u5185\u5BB9\u3092\u66F4\u65B0\u3057\u307E\u3059');\n          const modal = document.getElementById('plant-record-modal');\n          if (modal) {\n            try {\n              const posts = await this.loadThreadPosts(this.currentOpenThread.id);\n              const timelineContent = document.querySelector('[data-tab=\"timeline\"].tab-content');\n              if (timelineContent) {\n                timelineContent.innerHTML = this.renderAdvancedTimelineTab(posts);\n              }\n            } catch (error) {\n              console.error('\u30E2\u30FC\u30C0\u30EB\u5185\u5BB9\u66F4\u65B0\u30A8\u30E9\u30FC:', error);\n            }\n          }\n        }\n      }\n      \n      this.loadQuotaInfo();\n      \n    } catch (error) {\n      console.error('\u524A\u9664\u5F8C\u66F4\u65B0\u30A8\u30E9\u30FC:', error);\n      this.showTemporaryNotification('\u30C7\u30FC\u30BF\u306E\u518D\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n    }\n  }\n\n  showImageFullscreen(imageUrl, imageTitle = '') {\n    this.closeAllModals();\n    \n    const modalHtml = `\n      <div id=\"image-fullscreen-modal\" class=\"image-modal-overlay\" onclick=\"window.plantApp.closeImageModal(event)\">\n        <div class=\"image-modal-content\" onclick=\"event.stopPropagation()\">\n          <div class=\"image-modal-header\">\n            <h4>${this.escapeHtml(imageTitle)}</h4>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"image-modal-close\">\u00D7</button>\n          </div>\n          <div class=\"image-modal-body\">\n            <img src=\"${imageUrl}\" alt=\"${this.escapeHtml(imageTitle)}\" class=\"full-image\" loading=\"lazy\">\n          </div>\n          <div class=\"image-modal-footer\">\n            <small>\u30AF\u30EA\u30C3\u30AF\u307E\u305F\u306FESC\u30AD\u30FC\u3067\u9589\u3058\u308B</small>\n          </div>\n        </div>\n      </div>\n    `;\n    \n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n  }\n\n  closeImageModal(event) {\n    if (event.target.classList.contains('image-modal-overlay')) {\n      this.closeAllModals();\n    }\n  }\n\n  showLoadingModal(message = '\u8AAD\u307F\u8FBC\u307F\u4E2D...') {\n    this.closeAllModals();\n    \n    const loadingHtml = `\n      <div id=\"loading-modal\" class=\"modal-overlay\">\n        <div class=\"modal-content loading-modal\">\n          <div class=\"loading-content\">\n            <div class=\"spinner\"></div>\n            <p>${this.escapeHtml(message)}</p>\n          </div>\n        </div>\n      </div>\n    `;\n    \n    document.body.insertAdjacentHTML('beforeend', loadingHtml);\n  }\n\n  closeLoadingModal() {\n    const modal = document.getElementById('loading-modal');\n    if (modal) {\n      modal.remove();\n    }\n  }\n\n  showErrorModal(message) {\n    this.closeAllModals();\n    \n    const modalHtml = `\n      <div id=\"error-modal\" class=\"modal-overlay\">\n        <div class=\"modal-content error-modal\">\n          <div class=\"modal-header\">\n            <h3>\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F</h3>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"error-content\">\n              <p>${this.escapeHtml(message)}</p>\n            </div>\n            <div class=\"error-actions\">\n              <button onclick=\"window.plantApp.closeAllModals()\" class=\"btn btn-secondary\">\n                \u9589\u3058\u308B\n              </button>\n              <a href=\"/pages/contact\" class=\"btn btn-primary\" target=\"_blank\">\n                \u30B5\u30DD\u30FC\u30C8\u306B\u9023\u7D61\n              </a>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n    \n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n  }\n\n  closeAllModals() {\n    const modals = [\n      'loading-modal',\n      'error-modal',\n      'plant-record-modal',\n      'image-fullscreen-modal',\n      'add-care-modal',\n      'follow-up-modal',\n      'care-guide-modal',\n      'delete-confirm-modal',\n      'care-settings-modal',\n      'todays-care-modal',\n    'illustration-limit-modal',\n    'consultation-limit-modal'\n    ];\n    \n    modals.forEach(modalId => {\n      const modal = document.getElementById(modalId);\n      if (modal) {\n        modal.remove();\n      }\n    });\n\n    document.removeEventListener('keydown', this.handleEscapeKey);\n    console.log('\u5168\u30E2\u30FC\u30C0\u30EB\u9589\u3058\u5B8C\u4E86');\n  }\n\n  showTemporaryNotification(message, type = 'info', duration = 3000) {\n    const existingNotifications = document.querySelectorAll('.temporary-notification');\n    existingNotifications.forEach(notif => notif.remove());\n\n    const notification = document.createElement('div');\n    notification.className = `temporary-notification ${type}`;\n\n    const styles = {\n      success: { bg: '#d4edda', border: '#c3e6cb', color: '#155724' },\n      error: { bg: '#f8d7da', border: '#f5c6cb', color: '#721c24' },\n      info: { bg: '#d1ecf1', border: '#bee5eb', color: '#0c5460' },\n      warning: { bg: '#fff3cd', border: '#ffeaa7', color: '#856404' }\n    };\n\n    const style = styles[type] || styles.info;\n\n    notification.style.cssText = `\n      position: fixed;\n      top: 20px;\n      right: 20px;\n      background: ${style.bg};\n      border: 1px solid ${style.border};\n      color: ${style.color};\n      padding: 12px 16px;\n      border-radius: 8px;\n      box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n      z-index: 2000;\n      max-width: 350px;\n      font-size: 14px;\n      font-weight: 500;\n      animation: slideInNotification 0.3s ease;\n    `;\n\n    notification.textContent = message;\n    document.body.appendChild(notification);\n\n    setTimeout(() => {\n      if (notification.parentNode) {\n        notification.style.animation = 'slideOutNotification 0.3s ease';\n        setTimeout(() => {\n          if (notification.parentNode) {\n            notification.parentNode.removeChild(notification);\n          }\n        }, 300);\n      }\n    }, duration);\n  }\n\n\ndisplayFollowUpRecommendations(data) {\n  let recommendationsHtml = '';\n  \n  if (data.product_recommendations && data.product_recommendations.length > 0) {\n    recommendationsHtml += `\n      <div class=\"follow-up-recommendations\">\n        <h6>\u8FFD\u52A0\u76F8\u8AC7\u306B\u57FA\u3065\u304F\u304A\u3059\u3059\u3081\u5546\u54C1</h6>\n        <div class=\"recommendations-grid\">\n          ${data.product_recommendations.map(product => `\n            <div class=\"mini-recommendation-item ${product.is_pr ? 'pr-item' : ''}\">\n              <div class=\"mini-rec-header\">\n                <strong>${this.escapeHtml(product.product_name)}</strong>\n                ${product.is_pr ? '<span class=\"mini-pr-badge\">PR</span>' : ''}\n              </div>\n              ${product.price_range ? `<div class=\"mini-price\">${this.escapeHtml(product.price_range)}</div>` : ''}\n              <a href=\"${product.product_url}\" target=\"_blank\" class=\"btn btn-mini\">\u5546\u54C1\u3092\u898B\u308B</a>\n            </div>\n          `).join('')}\n        </div>\n      </div>\n    `;\n  }\n  \n  if (data.article_recommendations && data.article_recommendations.length > 0) {\n    recommendationsHtml += `\n      <div class=\"follow-up-articles\">\n        <h6>\u95A2\u9023\u8A18\u4E8B</h6>\n        <div class=\"articles-list\">\n          ${data.article_recommendations.map(article => `\n            <div class=\"mini-article-item\">\n              <strong>${this.escapeHtml(article.title)}</strong>\n              <a href=\"${article.url}\" target=\"_blank\" class=\"btn btn-mini\">\u8A18\u4E8B\u3092\u8AAD\u3080</a>\n            </div>\n          `).join('')}\n        </div>\n      </div>\n    `;\n  }\n  \n  if (recommendationsHtml) {\n    setTimeout(() => {\n      const followUpModal = document.getElementById('follow-up-modal');\n      if (followUpModal) {\n        const modalBody = followUpModal.querySelector('.modal-body');\n        if (modalBody) {\n          modalBody.insertAdjacentHTML('beforeend', recommendationsHtml);\n        }\n      }\n    }, 500);\n  }\n}\n\n  showError(message) {\n    console.error('\u30A8\u30E9\u30FC\u8868\u793A:', message);\n    const statusDiv = document.getElementById('form-status');\n    if (statusDiv) {\n      statusDiv.innerHTML = `\n        <div class=\"error-message\">\n          <h5>\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F</h5>\n          <p>${this.escapeHtml(message)}</p>\n        </div>\n      `;\n    }\n    this.showTemporaryNotification(message, 'error');\n  }\n\n  reportError(error, context = '') {\n    const errorReport = {\n      timestamp: new Date().toISOString(),\n      userAgent: navigator.userAgent,\n      url: window.location.href,\n      userEmail: this.userEmail,\n      membershipType: this.getMembershipType(),\n      context: context,\n      error: {\n        message: error.message,\n        stack: error.stack,\n        name: error.name\n      },\n      appVersion: 'Complete-Integrated-v17.1.0',\n      features: {\n        nano_banana: true,\n        care_records: true,\n        care_alerts: true,\n        care_settings: true,\n        growth_comparison: true,\n        follow_up: true,\n        delete_function: true\n      }\n    };\n    \n    console.error('\u5B8C\u5168\u7D71\u5408\u7248\u30A8\u30E9\u30FC\u5831\u544A:', errorReport);\n    \n    if (this.userEmail && this.getMembershipType() !== 'non_member') {\n      fetch(`${this.apiBase}?action=error_report`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(errorReport)\n      }).catch(e => console.warn('\u30A8\u30E9\u30FC\u5831\u544A\u9001\u4FE1\u5931\u6557:', e));\n    }\n  }\n\nasync performSystemIntegrityCheck() {\n  console.log('\uD83D\uDD0D \u30B7\u30B9\u30C6\u30E0\u6574\u5408\u6027\u30C1\u30A7\u30C3\u30AF\u958B\u59CB');\n  \n  const checks = {\n    imageGeneration: this.shouldGenerateIllustration && this.requestServerIllustrationPatch,  // \u2605 \u4FEE\u6B63\uFF01\n    careRecords: this.loadCareRecords && this.saveCareRecord,\n    careAlerts: this.loadCareAlerts && this.markCareAsDone,\n    careSettings: this.loadCareSettings && this.saveCareSettings,\n    growthComparison: this.loadGrowthImages && this.calculateGrowthRate,\n    followUp: this.submitFollowUp && this.loadFollowUpHistory,\n    deleteFunction: this.confirmDeletePost && this.executeDeletePost,\n    modalSystem: this.openPlantRecord && this.closeAllModals\n  };\n  \n  const results = {};\n  for (const [feature, isImplemented] of Object.entries(checks)) {\n    results[feature] = !!isImplemented;\n  }\n  \n  console.log('\u2705 \u30B7\u30B9\u30C6\u30E0\u6574\u5408\u6027\u30C1\u30A7\u30C3\u30AF\u7D50\u679C:', results);\n  \n  const allFeaturesImplemented = Object.values(results).every(Boolean);\n  if (allFeaturesImplemented) {\n    console.log('\uD83C\uDF89 \u5168\u6A5F\u80FD\u304C\u6B63\u5E38\u306B\u5B9F\u88C5\u3055\u308C\u3066\u3044\u307E\u3059');\n  } else {\n    console.warn('\u26A0\uFE0F \u4E00\u90E8\u6A5F\u80FD\u304C\u672A\u5B9F\u88C5\u3067\u3059:', Object.entries(results).filter(([k,v]) => !v));\n  }\n  \n  return results;\n}\n\n  formatResponse(response) {\n    if (!response) return '';\n    return response\n      .replace(/\\n/g, '<br>')\n      .replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>')\n      .replace(/\\*(.*?)\\*/g, '<em>$1</em>')\n      .replace(/`(.*?)`/g, '<code>$1</code>');\n  }\n\n  escapeHtml(text) {\n    if (typeof text !== 'string') return String(text || '');\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  formatDate(dateString) {\n    try {\n      const date = new Date(dateString);\n      if (isNaN(date.getTime())) return dateString;\n      return date.toLocaleDateString('ja-JP', {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric'\n      });\n    } catch (error) {\n      console.error('\u65E5\u4ED8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30A8\u30E9\u30FC:', error, dateString);\n      return dateString;\n    }\n  }\n\n  formatDateTime(dateString) {\n    try {\n      const date = new Date(dateString);\n      if (isNaN(date.getTime())) return dateString;\n      return date.toLocaleString('ja-JP', {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit'\n      });\n    } catch (error) {\n      console.error('\u65E5\u6642\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30A8\u30E9\u30FC:', error, dateString);\n      return dateString;\n    }\n  }\n\nasync loadQuotaInfo(forceRefresh = false) {\n  const membershipType = this.getMembershipType();\n  const el = document.getElementById('quota-display');\n  if (!el) return;\n  \n  if (membershipType === 'non_member') {\n    el.innerHTML = '<span>\u4F53\u9A13\u7248: \u5236\u9650\u3042\u308A</span>';\n    return;\n  }\n  \n  // \u30AD\u30E3\u30C3\u30B7\u30E5\u30C1\u30A7\u30C3\u30AF\n  if (!forceRefresh && this._quotaCache && Date.now() < this._quotaCacheExpiry) {\n    this.applyQuotaFromResponse(this._quotaCache);\n    return;\n  }\n  \n  // \u4E8C\u91CD\u8AAD\u307F\u8FBC\u307F\u9632\u6B62\n  if (this._quotaLoading) return;\n  this._quotaLoading = true;\n  \n  try {\n    const response = await fetch(`${this.apiBase}?action=quota`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Authorization': `Bearer ${this.SUPABASE_ANON_KEY}`,\n        'apikey': this.SUPABASE_ANON_KEY,\n        'x-client-info': 'botareco-web'\n      },\n      body: JSON.stringify({\n        user_email: this.userEmail\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}`);\n    }\n\n    const data = await response.json();\n    \n    if (data.success) {\n      this._quotaCache = data;\n      this._quotaCacheExpiry = Date.now() + 30000;\n      this.applyQuotaFromResponse(data);\n    }\n  } catch (error) {\n    console.error('\u30AF\u30AA\u30FC\u30BF\u60C5\u5831\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n  } finally {\n    this._quotaLoading = false;\n  }\n}\n\n\n\n  attachEventListeners() {\n    const imageInput = document.getElementById('plant-image');\n    if (imageInput) {\n      imageInput.addEventListener('change', (e) => {\n        this.handleImagePreview(e.target.files[0]);\n      });\n    }\n\n    const form = document.getElementById('consultation-form');\n    if (form) {\n      form.addEventListener('submit', (e) => {\n        e.preventDefault();\n        this.submitConsultation();\n      });\n    }\n\n    this.attachPlantSelectionEvents();\n    this.attachGlobalKeyboardEvents();\n\n  // \u30A4\u30E9\u30B9\u30C8\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u306F disabled \u3092\u52D5\u7684\u306B\u5909\u3048\u306A\u3044\uFF08\u30D5\u30A9\u30FC\u30E0\u518D\u63CF\u753B\u3067\u30EA\u30B9\u30CA\u30FC\u304C\u5916\u308C\u308B\u305F\u3081\uFF09\n  // \u8996\u899A\u7684\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u306E\u307F\u3002\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u306F submitConsultation \u3067\u884C\u3046\n  const consultationTextarea = document.getElementById('consultation');\n  const illustrationCheckbox = document.getElementById('enable-illustration-checkbox');\n  if (consultationTextarea && illustrationCheckbox) {\n    const updateIllustrationOpacity = () => {\n      const hasConsultation = consultationTextarea.value.trim().length > 0;\n      const section = illustrationCheckbox.closest('.illustration-option-section');\n      if (section) section.style.opacity = hasConsultation ? '1' : '0.5';\n    };\n    consultationTextarea.addEventListener('input', updateIllustrationOpacity);\n    setTimeout(updateIllustrationOpacity, 100);\n  }\n    console.log('\u30A4\u30D9\u30F3\u30C8\u30EA\u30B9\u30CA\u30FC\u521D\u671F\u5316\u5B8C\u4E86');\n  }\ninitNewHeader() {\n  const membershipType = this.getMembershipType();\n  \n  // \u4F1A\u54E1\u7A2E\u5225\u30D0\u30C3\u30B8\u306E\u66F4\u65B0\n  const planBadge = document.getElementById('brPlanBadge');\n  if (planBadge) {\n    const membershipLabels = {\n      non_member: '\u4F53\u9A13\u7248',\n      free_member: '\u7121\u6599\u4F1A\u54E1',\n      paid_member: '\u6709\u6599\u4F1A\u54E1'\n    };\n    planBadge.textContent = membershipLabels[membershipType] || '\u4F53\u9A13\u7248';\n  }\n  \n  // \u5B63\u7BC0\u30D0\u30C3\u30B8\u306E\u66F4\u65B0\n  const seasonBadge = document.getElementById('brSeasonBadge');\n  if (seasonBadge) {\n    const now = new Date();\n    const month = now.getMonth() + 1;\n    \n    let seasonEmoji = '\uD83C\uDF42';\n    let seasonName = '\u79CB';\n    \n    if (month >= 3 && month <= 5) {\n      seasonEmoji = '\uD83C\uDF38';\n      seasonName = '\u6625';\n    } else if (month >= 6 && month <= 8) {\n      seasonEmoji = '\u2600\uFE0F';\n      seasonName = '\u590F';\n    } else if (month >= 9 && month <= 11) {\n      seasonEmoji = '\uD83C\uDF42';\n      seasonName = '\u79CB';\n    } else {\n      seasonEmoji = '\u2744\uFE0F';\n      seasonName = '\u51AC';\n    }\n    \n    seasonBadge.textContent = `${seasonEmoji} ${seasonName}`;\n  }\n  \n  // \u2605\u2605\u2605 \u30E6\u30FC\u30B6\u30FC\u540D\u306E\u66F4\u65B0\uFF08Supabase\u6700\u512A\u5148\uFF09 \u2605\u2605\u2605\n  this.loadUserNicknameFromSupabase();\n  \n  // \u30AF\u30A9\u30FC\u30BF\u60C5\u5831\u306E\u8868\u793A\n  const quotasDiv = document.getElementById('brQuotas');\n  if (quotasDiv && membershipType === 'non_member') {\n    quotasDiv.innerHTML = `\n      <div style=\"padding: 8px; background: #fff3cd; border: 1px solid #ffc107; border-radius: 6px; font-size: 13px;\">\n        <strong>\uD83D\uDD12 \u4F53\u9A13\u7248</strong><br>\n        <small>AI\u76F8\u8AC7: \u67085\u56DE\u307E\u3067</small><br>\n        <small>\u690D\u7269\u767B\u9332: \u4E0D\u53EF</small><br>\n        <a href=\"/customer_authentication/login\" style=\"color: #0066cc; text-decoration: underline;\">\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u5236\u9650\u89E3\u9664</a>\n      </div>\n    `;\n  } else if (quotasDiv && membershipType === 'free_member') {\n    quotasDiv.innerHTML = `\n      <div style=\"padding: 8px; background: #e7f3ff; border: 1px solid #0066cc; border-radius: 6px; font-size: 13px;\">\n        <strong>\uD83C\uDD93 \u7121\u6599\u4F1A\u54E1</strong><br>\n        <small>AI\u76F8\u8AC7: \u670830\u56DE\u307E\u3067</small><br>\n        <small>\u690D\u7269\u767B\u9332: 20\u500B\u307E\u3067</small><br>\n        <a href=\"/pages/botanical-record#plans\" style=\"color: #7c3aed; text-decoration: underline;\">\u6709\u6599\u30D7\u30E9\u30F3\u3067\u5168\u6A5F\u80FD\u89E3\u653E</a>\n      </div>\n    `;\n  }\n  \n  this.addSNSButtonToPopover();\n  this.addItineraryButtonToPopover();\n}\n\nasync loadUserNicknameFromSupabase() {\n  const userNameElements = [\n    document.getElementById('brUserName'),\n    document.getElementById('brSummaryName')\n  ];\n  \n  // \u2605\u2605\u2605 \u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306E\u512A\u5148\u9806\u4F4D \u2605\u2605\u2605\n  let defaultName = '\u30B2\u30B9\u30C8';\n  \n  // Shopify\u306E\u540D\u524D\u304C\u3042\u308C\u3070\u305D\u308C\u3092\u4F7F\u3046\n  if (window.LEAFLA?.customer?.first_name) {\n    defaultName = window.LEAFLA.customer.first_name;\n  } \n  // \u306A\u3051\u308C\u3070\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E@\u524D\n  else if (this.userEmail) {\n    defaultName = this.userEmail.split('@')[0];\n  }\n  \n  // \u307E\u305A\u30C7\u30D5\u30A9\u30EB\u30C8\u540D\u3092\u8868\u793A\uFF08\u3061\u3089\u3064\u304D\u9632\u6B62\uFF09\n  userNameElements.forEach(el => {\n    if (el) {\n      el.textContent = defaultName + ' \u3055\u3093';\n    }\n  });\n  \n  console.log('\uD83D\uDD0D \u30C7\u30D5\u30A9\u30EB\u30C8\u540D\u8868\u793A:', defaultName);\n  \n  // \u975E\u4F1A\u54E1\u30FB\u672A\u30ED\u30B0\u30A4\u30F3\u306E\u5834\u5408\u306F\u3053\u3053\u3067\u7D42\u4E86\n  if (!this.userEmail || this.getMembershipType() === 'non_member') {\n    console.log('\u2139\uFE0F \u975E\u4F1A\u54E1\u306E\u305F\u3081Supabase\u53D6\u5F97\u30B9\u30AD\u30C3\u30D7');\n    return;\n  }\n  \n  // \u2605\u2605\u2605 Supabase\u304B\u3089nickname\u3092\u53D6\u5F97\uFF08\u6700\u512A\u5148\uFF09 \u2605\u2605\u2605\n  try {\n    console.log('\uD83D\uDCE1 Supabase\u304B\u3089\u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u53D6\u5F97\u4E2D...');\n    \n    const response = await fetch(\n      `https://laixgcjvowdszrtdpxlq.supabase.co/rest/v1/user_profiles?user_email=eq.${encodeURIComponent(this.userEmail)}&select=nickname`,\n      {\n        headers: {\n          'apikey': this.SUPABASE_ANON_KEY,\n          'Authorization': `Bearer ${this.SUPABASE_ANON_KEY}`,\n          'Cache-Control': 'no-cache',\n          'Pragma': 'no-cache'\n        }\n      }\n    );\n    \n    if (!response.ok) {\n      console.warn('\u26A0\uFE0F \u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u53D6\u5F97\u5931\u6557:', response.status);\n      return;\n    }\n    \n    const data = await response.json();\n    \n    if (data && data.length > 0 && data[0].nickname) {\n      const nickname = data[0].nickname;\n      console.log('\u2705 Supabase\u304B\u3089\u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u53D6\u5F97\u6210\u529F:', nickname);\n      \n      // \u2605\u2605\u2605 Supabase\u306Enickname\u3067\u4E0A\u66F8\u304D \u2605\u2605\u2605\n      userNameElements.forEach(el => {\n        if (el) {\n          el.textContent = nickname + ' \u3055\u3093';\n        }\n      });\n    } else {\n      console.log('\u2139\uFE0F Supabase\u306Bnickname\u306A\u3057 \u2192 \u30C7\u30D5\u30A9\u30EB\u30C8\u540D\u306E\u307E\u307E');\n    }\n    \n  } catch (error) {\n    console.warn('\u274C \u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u53D6\u5F97\u30A8\u30E9\u30FC:', error);\n    // \u30A8\u30E9\u30FC\u3067\u3082\u30C7\u30D5\u30A9\u30EB\u30C8\u540D\u306E\u307E\u307E\u7D99\u7D9A\n  }\n}\n// \u2605\u2605\u2605 \u65B0\u898F\u30E1\u30BD\u30C3\u30C9\uFF1ASNS\u30DC\u30BF\u30F3\u3092\u52D5\u7684\u8FFD\u52A0 \u2605\u2605\u2605\naddSNSButtonToPopover() {\n  // \u2605 \u975E\u4F1A\u54E1\u3082\u95B2\u89A7\u76EE\u7684\u3067SNS\u30DC\u30BF\u30F3\u3092\u8868\u793A\u3059\u308B\n\n  // \u30DD\u30C3\u30D7\u30AA\u30FC\u30D0\u30FC\u5185\u306E\u30DC\u30BF\u30F3\u30EA\u30B9\u30C8\u3092\u63A2\u3059\n  const popover = document.getElementById('brUserPopover');\n  if (!popover) {\n    console.warn('brUserPopover \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n  \n  // \u65E2\u5B58\u306ESNS\u30DC\u30BF\u30F3\u304C\u3042\u308C\u3070\u524A\u9664\n  const existingSNSBtn = document.getElementById('brSNSBtn');\n  if (existingSNSBtn) {\n    existingSNSBtn.remove();\n  }\n  \n  // \u2605 \u4FEE\u6B63\uFF1A.br-actions\u5185\u306E\u300C\u9589\u3058\u308B\u300D\u30DC\u30BF\u30F3\u3092\u63A2\u3059\n  const actionsContainer = popover.querySelector('.br-actions');\n  if (!actionsContainer) {\n    console.warn('.br-actions \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n  \n  const closeBtn = actionsContainer.querySelector('button[data-close]');\n  if (!closeBtn) {\n    console.warn('.br-actions\u5185\u306E\u9589\u3058\u308B\u30DC\u30BF\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n  \n  // SNS\u30DC\u30BF\u30F3\u3092\u4F5C\u6210\n  const snsBtn = document.createElement('button');\n  snsBtn.id = 'brSNSBtn';\n  snsBtn.className = 'br-action'; // \u57FA\u672C\u30AF\u30E9\u30B9\u3092\u9069\u7528\n  const badgeHtml = this.notificationCount > 0\n    ? `<span id=\"brSNSBadge\" class=\"br-sns-badge\">${this.notificationCount > 99 ? '99+' : this.notificationCount}</span>`\n    : `<span id=\"brSNSBadge\" class=\"br-sns-badge\" style=\"display:none\">0</span>`;\n  snsBtn.innerHTML = `SNS ${badgeHtml}`;\n  \n  // \u30AF\u30EA\u30C3\u30AF\u30A4\u30D9\u30F3\u30C8\u3092\u8FFD\u52A0\n  snsBtn.addEventListener('click', () => {\n    // \u30DD\u30C3\u30D7\u30AA\u30FC\u30D0\u30FC\u3092\u9589\u3058\u308B\n    popover.hidden = true;\n    const userBtn = document.getElementById('brUserBtn');\n    if (userBtn) {\n      userBtn.setAttribute('aria-expanded', 'false');\n    }\n    \n    // SNS\u30D5\u30A3\u30FC\u30C9\u3092\u958B\u304F\n    this.openSNSFeed();\n  });\n  \n  // .br-actions\u5185\u306E\u300C\u9589\u3058\u308B\u300D\u30DC\u30BF\u30F3\u306E\u76F4\u524D\u306B\u633F\u5165\n  actionsContainer.insertBefore(snsBtn, closeBtn);\n  \n  console.log('\u2705 SNS\u30DC\u30BF\u30F3\u3092.br-actions\u5185\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F');\n}\n\n// \u2605\u2605\u2605 \u65B0\u898F\u30E1\u30BD\u30C3\u30C9\uFF1A\u30DE\u30A4\u3057\u304A\u308A\u30DC\u30BF\u30F3\u3092\u52D5\u7684\u8FFD\u52A0 \u2605\u2605\u2605\naddItineraryButtonToPopover() {\n  const membershipType = this.getMembershipType();\n  if (membershipType === 'non_member') return;\n\n  const popover = document.getElementById('brUserPopover');\n  if (!popover) return;\n\n  const existing = document.getElementById('brItineraryBtn');\n  if (existing) existing.remove();\n\n  const actionsContainer = popover.querySelector('.br-actions');\n  if (!actionsContainer) return;\n\n  const closeBtn = actionsContainer.querySelector('button[data-close]');\n  if (!closeBtn) return;\n\n  const btn = document.createElement('button');\n  btn.id = 'brItineraryBtn';\n  btn.className = 'br-action';\n  btn.textContent = '\uD83D\uDCDA \u30DE\u30A4\u3057\u304A\u308A';\n  btn.addEventListener('click', () => {\n    window.location.href = '/pages/my-itineraries';\n  });\n\n  actionsContainer.insertBefore(btn, closeBtn);\n  console.log('\u2705 \u30DE\u30A4\u3057\u304A\u308A\u30DC\u30BF\u30F3\u3092.br-actions\u5185\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F');\n}\n\n// ==========================================\n// \u901A\u77E5\u6A5F\u80FD\u30E1\u30BD\u30C3\u30C9\n// ==========================================\n\nasync fetchNotificationCount() {\n  if (!this.userEmail || this.userEmail.startsWith('anon_')) return;\n  try {\n    const response = await fetch(`${this.apiBase}?action=get_notifications`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, limit: 1, offset: 0 })\n    });\n    const data = await response.json();\n    if (data.success) {\n      this.notificationCount = data.unread_count || 0;\n      this.updateNotificationBadge();\n    }\n  } catch (e) {\n    console.error('fetchNotificationCount error:', e);\n  }\n}\n\nupdateNotificationBadge() {\n  const count = this.notificationCount;\n  const label = count > 99 ? '99+' : String(count);\n\n  // SNS\u30D5\u30A3\u30FC\u30C9\u30D8\u30C3\u30C0\u30FC\u306E\u30D9\u30EB\u30D0\u30C3\u30B8\n  const bellBadge = document.getElementById('notification-bell-badge');\n  if (bellBadge) {\n    bellBadge.textContent = label;\n    bellBadge.style.display = count > 0 ? 'flex' : 'none';\n  }\n\n  // \u30DD\u30C3\u30D7\u30AA\u30FC\u30D0\u30FC\u5185SNS\u30DC\u30BF\u30F3\u306E\u30D0\u30C3\u30B8\n  const snsBadge = document.getElementById('brSNSBadge');\n  if (snsBadge) {\n    snsBadge.textContent = label;\n    snsBadge.style.display = count > 0 ? 'inline-flex' : 'none';\n  }\n}\n\nasync openNotificationPanel() {\n  // \u65E2\u5B58\u306E\u30D1\u30CD\u30EB\u304C\u3042\u308C\u3070\u524A\u9664\n  const existing = document.getElementById('notification-panel');\n  if (existing) { existing.remove(); return; }\n\n  // \u30D1\u30CD\u30EB\u3092\u5148\u306B\u8868\u793A\u3057\u3066\u30ED\u30FC\u30C7\u30A3\u30F3\u30B0\n  const snsModal = document.querySelector('.sns-feed-modal-content');\n  if (!snsModal) return;\n\n  const panel = document.createElement('div');\n  panel.id = 'notification-panel';\n  panel.className = 'notification-panel';\n  panel.innerHTML = `\n    <div class=\"notification-panel-header\">\n      <h3>\u901A\u77E5</h3>\n      <button class=\"notification-panel-close\" onclick=\"document.getElementById('notification-panel').remove()\" type=\"button\">\u00D7</button>\n    </div>\n    <div id=\"notification-panel-body\" class=\"notification-panel-body\">\n      <div class=\"loading-indicator\"><div class=\"spinner\"></div><p>\u8AAD\u307F\u8FBC\u307F\u4E2D...</p></div>\n    </div>\n  `;\n  snsModal.appendChild(panel);\n\n  // \u901A\u77E5\u53D6\u5F97\uFF08mark_read=true \u3067\u65E2\u8AAD\u306B\u3059\u308B\uFF09\n  try {\n    const response = await fetch(`${this.apiBase}?action=get_notifications`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, limit: 30, offset: 0, mark_read: true })\n    });\n    const data = await response.json();\n\n    // \u65E2\u8AAD\u51E6\u7406\u5F8C\u306B\u30D0\u30C3\u30B8\u3092\u30AF\u30EA\u30A2\n    this.notificationCount = 0;\n    this.updateNotificationBadge();\n\n    const body = document.getElementById('notification-panel-body');\n    if (!body) return;\n\n    if (!data.success || data.notifications.length === 0) {\n      body.innerHTML = `\n        <div class=\"empty-content\" style=\"padding:40px 20px\">\n          <div class=\"empty-icon\">\uD83D\uDD14</div>\n          <p>\u307E\u3060\u901A\u77E5\u306F\u3042\u308A\u307E\u305B\u3093</p>\n        </div>\n      `;\n      return;\n    }\n\n    body.innerHTML = data.notifications.map(n => this.renderNotificationItem(n)).join('');\n\n  } catch (e) {\n    console.error('openNotificationPanel error:', e);\n    const body = document.getElementById('notification-panel-body');\n    if (body) body.innerHTML = '<p style=\"padding:20px;color:#e74c3c\">\u901A\u77E5\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F</p>';\n  }\n}\n\nrenderNotificationItem(n) {\n  const timeAgo = this.getTimeAgo(n.created_at);\n\n  // \u30A2\u30AF\u30BF\u30FC\u306E\u30A2\u30D0\u30BF\u30FC\uFF08\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u753B\u50CF or \u30A4\u30CB\u30B7\u30E3\u30EB\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\uFF09\n  const actorProfileUrl = n.actor_username\n    ? `/pages/community?user=${encodeURIComponent(n.actor_username)}`\n    : null;\n  const avatarImg = n.actor_image_url\n    ? `<img src=\"${this.escapeHtml(n.actor_image_url)}\" class=\"notif-avatar\" alt=\"\">`\n    : `<div class=\"notif-avatar notif-avatar-placeholder\">${(n.actor_nickname || '?')[0].toUpperCase()}</div>`;\n  const avatar = actorProfileUrl\n    ? `<a href=\"${actorProfileUrl}\" onclick=\"document.getElementById('notification-panel')?.remove()\" style=\"display:contents\">${avatarImg}</a>`\n    : avatarImg;\n\n  const typeIcon = { follow: '\uD83D\uDC64', like: '\u2764\uFE0F', comment: '\uD83D\uDCAC', event_open: '\uD83D\uDCC5', event_submitted: '\uD83D\uDCCB' }[n.type] || '\uD83D\uDD14';\n\n  let message;\n  if (n.type === 'event_submitted') {\n    const maskedEmail = n.actor_email\n      ? n.actor_email.replace(/^(.{2})([^@]*)(@.*)$/, (_, a, b, c) => a + '***' + c)\n      : '\u7533\u8ACB\u8005';\n    const titlePart = n.entity_title ? `\u300C${this.escapeHtml(n.entity_title)}\u300D` : '';\n    message = `\u65B0\u3057\u3044\u30A4\u30D9\u30F3\u30C8\u7533\u8ACB ${titlePart}\uFF08${maskedEmail}\uFF09`;\n  } else {\n    const actor = n.actor_nickname ? this.escapeHtml(n.actor_nickname) : '\u30E6\u30FC\u30B6\u30FC';\n    const actorDisplay = actorProfileUrl\n      ? `<a href=\"${actorProfileUrl}\" onclick=\"document.getElementById('notification-panel')?.remove()\" style=\"color:#16a34a;font-weight:600;text-decoration:none\">${actor}</a>`\n      : `<strong>${actor}</strong>`;\n    const title = n.entity_title ? `\u300C${this.escapeHtml(n.entity_title)}\u300D` : '';\n    message = n.message\n      ? n.message.replace(actor, actorDisplay)  // \u30E1\u30C3\u30BB\u30FC\u30B8\u5185\u306E\u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u3092\u30EA\u30F3\u30AF\u5316\n      : (() => {\n          if (n.type === 'follow') return `${actorDisplay} \u3055\u3093\u304C\u3042\u306A\u305F\u3092\u30D5\u30A9\u30ED\u30FC\u3057\u307E\u3057\u305F`;\n          if (n.type === 'like') return `${actorDisplay} \u3055\u3093\u304C ${title}\u306B\u3044\u3044\u306D\u3057\u307E\u3057\u305F`;\n          if (n.type === 'comment') return `${actorDisplay} \u3055\u3093\u304C ${title}\u306B\u30B3\u30E1\u30F3\u30C8\u3057\u307E\u3057\u305F`;\n          return `${actorDisplay} \u3055\u3093\u304B\u3089\u901A\u77E5`;\n        })();\n  }\n\n  // \u30AF\u30EA\u30C3\u30AF\u9077\u79FB: post/like/comment \u2192 \u6295\u7A3F\u8A73\u7D30\u3001follow \u2192 \u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\n  let itemAttrs = '';\n  if (n.entity_type === 'post' && n.entity_id) {\n    itemAttrs = `onclick=\"document.getElementById('notification-panel').remove(); window.plantApp.openPostDetail('${n.entity_id}')\" style=\"cursor:pointer\"`;\n  } else if (n.type === 'follow' && actorProfileUrl) {\n    itemAttrs = `onclick=\"document.getElementById('notification-panel').remove(); window.location.href='${actorProfileUrl}'\" style=\"cursor:pointer\"`;\n  }\n\n  return `\n    <div class=\"notification-item ${n.is_read ? '' : 'unread'}\" ${itemAttrs}>\n      <div class=\"notif-avatar-wrap\">${avatar}<span class=\"notif-type-icon\">${typeIcon}</span></div>\n      <div class=\"notif-content\">\n        <p class=\"notif-message\">${message}</p>\n        <span class=\"notif-time\">${timeAgo}</span>\n      </div>\n    </div>\n  `;\n}\n\n// ==========================================\n// \u30A4\u30D9\u30F3\u30C8\u30FB\u30EF\u30FC\u30AF\u30B7\u30E7\u30C3\u30D7\u6A5F\u80FD\n// ==========================================\n\nasync openEventsPanel() {\n  const existing = document.getElementById('events-panel');\n  if (existing) { existing.remove(); return; }\n\n  const snsModal = document.querySelector('.sns-feed-modal-content');\n  if (!snsModal) return;\n\n  const panel = document.createElement('div');\n  panel.id = 'events-panel';\n  panel.className = 'notification-panel events-panel';\n  panel.innerHTML = `\n    <div class=\"notification-panel-header\">\n      <h3>\uD83D\uDD16 \u884C\u304D\u305F\u3044\u30FB\u4FDD\u5B58\u30EA\u30B9\u30C8</h3>\n      <button class=\"notification-panel-close\" onclick=\"document.getElementById('events-panel').remove()\" type=\"button\">\u00D7</button>\n    </div>\n    <div id=\"events-panel-body\" class=\"notification-panel-body\">\n      <div class=\"loading-indicator\"><div class=\"spinner\"></div><p>\u8AAD\u307F\u8FBC\u307F\u4E2D...</p></div>\n    </div>\n  `;\n  snsModal.appendChild(panel);\n\n  try {\n    const response = await fetch(`${this.apiBase}?action=get_bookmarked_events`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail })\n    });\n    const data = await response.json();\n\n    const body = document.getElementById('events-panel-body');\n    if (!body) return;\n\n    if (data.is_guest) {\n      body.innerHTML = `\n        <div class=\"empty-content\" style=\"padding:40px 20px;text-align:center\">\n          <div class=\"empty-icon\">\uD83D\uDD16</div>\n          <p>\u30A4\u30D9\u30F3\u30C8\u3092\u4FDD\u5B58\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059</p>\n          <a href=\"/account/login?return_url=${encodeURIComponent(window.location.pathname + window.location.search)}\" class=\"lf-ev-action-btn external\" style=\"display:inline-block;margin-top:12px\">\u30ED\u30B0\u30A4\u30F3</a>\n        </div>\n      `;\n      return;\n    }\n\n    if (!data.success || !data.events || data.events.length === 0) {\n      body.innerHTML = `\n        <div class=\"empty-content\" style=\"padding:40px 20px;text-align:center\">\n          <div class=\"empty-icon\">\uD83D\uDD16</div>\n          <p style=\"font-weight:600;margin-bottom:6px\">\u4FDD\u5B58\u3057\u305F\u30A4\u30D9\u30F3\u30C8\u30FB\u8A18\u4E8B\u306F\u3042\u308A\u307E\u305B\u3093</p>\n          <p style=\"font-size:13px;color:#6b7280\">\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u3084\u8A18\u4E8B\u30DA\u30FC\u30B8\u3067\u300C\u884C\u304D\u305F\u3044\u300D\u3092\u62BC\u3057\u3066\u4FDD\u5B58\u3067\u304D\u307E\u3059</p>\n          <a href=\"/pages/events-db\" class=\"lf-ev-action-btn external\" style=\"display:inline-block;margin-top:12px\">\u30A4\u30D9\u30F3\u30C8\u3092\u63A2\u3059 \u2192</a>\n        </div>\n      `;\n      return;\n    }\n\n    this._eventsCache = data.events;\n    body.innerHTML = data.events.map(e => this.renderEventCard(e)).join('');\n\n  } catch (err) {\n    console.error('openEventsPanel error:', err);\n    const body = document.getElementById('events-panel-body');\n    if (body) body.innerHTML = '<p style=\"padding:20px;color:#e74c3c\">\u30A4\u30D9\u30F3\u30C8\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F</p>';\n  }\n}\n\nasync toggleEventBookmark(eventId, btn, _isCurrentlyBookmarked) {\n  if (!this.userEmail || this.userEmail.startsWith('anon_')) {\n    this.showTemporaryNotification('\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059', 'error');\n    return;\n  }\n  btn.disabled = true;\n  try {\n    const response = await fetch(`${this.apiBase}?action=toggle_event_bookmark`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, event_id: eventId })\n    });\n    const data = await response.json();\n    if (data.success) {\n      if (!data.is_bookmarked) {\n        // \u30D1\u30CD\u30EB\u5185\u304B\u3089\u306E\u89E3\u9664 \u2192 \u30AB\u30FC\u30C9\u3092\u524A\u9664\n        const card = document.getElementById(`lf-ev-card-${eventId}`);\n        if (card) card.remove();\n        const panelBody = document.getElementById('events-panel-body');\n        if (panelBody && panelBody.querySelectorAll('.lf-ev-card').length === 0) {\n          panelBody.innerHTML = `\n            <div class=\"empty-content\" style=\"padding:40px 20px;text-align:center\">\n              <div class=\"empty-icon\">\uD83D\uDD16</div>\n              <p style=\"font-weight:600;margin-bottom:6px\">\u4FDD\u5B58\u3057\u305F\u30A4\u30D9\u30F3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093</p>\n              <p style=\"font-size:13px;color:#6b7280\">\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u30DA\u30FC\u30B8\u3067\u6C17\u306B\u306A\u308B\u30A4\u30D9\u30F3\u30C8\u3092\u4FDD\u5B58\u3067\u304D\u307E\u3059</p>\n              <a href=\"/pages/events-db\" class=\"lf-ev-action-btn external\" style=\"display:inline-block;margin-top:12px\">\u30A4\u30D9\u30F3\u30C8\u3092\u63A2\u3059 \u2192</a>\n            </div>\n          `;\n        }\n        this.showTemporaryNotification('\u4FDD\u5B58\u3092\u89E3\u9664\u3057\u307E\u3057\u305F', 'success');\n      } else {\n        btn.textContent = '\u4FDD\u5B58\u89E3\u9664';\n        btn.disabled = false;\n      }\n    } else {\n      btn.disabled = false;\n    }\n  } catch (err) {\n    console.error('toggleEventBookmark error:', err);\n    btn.disabled = false;\n  }\n}\n\nasync toggleArticleBookmark(articleHandle, btn) {\n  if (!this.userEmail || this.userEmail.startsWith('anon_')) return;\n  btn.disabled = true;\n  try {\n    const res = await fetch(`${this.apiBase}?action=toggle_article_bookmark`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, article_handle: articleHandle })\n    });\n    const data = await res.json();\n    if (data.success && !data.is_bookmarked) {\n      // \u30AB\u30FC\u30C9\u3092\u524A\u9664\n      const card = document.getElementById(`lf-ev-card-article-${articleHandle}`);\n      if (card) card.remove();\n      // \u6B8B\u308A\u304C0\u306A\u3089\u7A7A\u30E1\u30C3\u30BB\u30FC\u30B8\n      const body = document.getElementById('events-panel-body');\n      if (body && body.querySelectorAll('.lf-ev-card').length === 0) {\n        body.innerHTML = `\n          <div class=\"empty-content\" style=\"padding:40px 20px;text-align:center\">\n            <div class=\"empty-icon\">\uD83D\uDD16</div>\n            <p style=\"font-weight:600;margin-bottom:6px\">\u4FDD\u5B58\u3057\u305F\u30A4\u30D9\u30F3\u30C8\u30FB\u8A18\u4E8B\u306F\u3042\u308A\u307E\u305B\u3093</p>\n            <p style=\"font-size:13px;color:#6b7280\">\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u3084\u8A18\u4E8B\u30DA\u30FC\u30B8\u3067\u300C\u884C\u304D\u305F\u3044\u300D\u3092\u62BC\u3057\u3066\u4FDD\u5B58\u3067\u304D\u307E\u3059</p>\n          </div>\n        `;\n      }\n      this.showTemporaryNotification('\u4FDD\u5B58\u3092\u89E3\u9664\u3057\u307E\u3057\u305F', 'success');\n    } else {\n      btn.disabled = false;\n    }\n  } catch (err) {\n    btn.disabled = false;\n  }\n}\n\nrenderEventCard(ev) {\n  // \u8A18\u4E8B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306E\u5834\u5408\u306F\u5C02\u7528\u30AB\u30FC\u30C9\u3092\u8FD4\u3059\n  if (ev.type === 'article') {\n    const articleUrl = `/blogs/media/${ev.article_handle.replace(/^media\\//, '')}`;\n    const unbookmarkBtn = `<button class=\"lf-ev-unbookmark-btn\" onclick=\"window.plantApp.toggleArticleBookmark('${this.escapeHtml(ev.article_handle)}', this)\" title=\"\u4FDD\u5B58\u89E3\u9664\" style=\"background:none;border:1px solid #d1d5db;border-radius:6px;padding:4px 8px;font-size:12px;color:#6b7280;cursor:pointer;margin-bottom:4px;\">\uD83D\uDD16 \u4FDD\u5B58\u89E3\u9664</button>`;\n    return `\n      <div class=\"lf-ev-card\" id=\"lf-ev-card-${this.escapeHtml(ev.id)}\">\n        <div class=\"lf-ev-card-header\">\n          <div class=\"lf-ev-date-badge\" style=\"background:#f0f4ff;color:#3b5bdb;font-size:10px;padding:4px 6px;border-radius:6px;text-align:center;min-width:40px;line-height:1.4;\">\n            <span style=\"display:block;font-weight:700;\">\u8A18\u4E8B</span>\n          </div>\n          <div class=\"lf-ev-info\">\n            <h4 class=\"lf-ev-title\">${this.escapeHtml(ev.title)}</h4>\n          </div>\n        </div>\n        <div class=\"lf-ev-card-footer\">\n          <div></div>\n          <div style=\"display:flex;flex-direction:column;align-items:flex-end;gap:4px;\">\n            ${unbookmarkBtn}\n            <a href=\"${articleUrl}\" class=\"lf-ev-action-btn external\">\u8A18\u4E8B\u3092\u8AAD\u3080 \u2192</a>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n\n  const dateStr = ev.event_date\n    ? new Date(ev.event_date).toLocaleDateString('ja-JP', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'short' })\n    : '\u65E5\u7A0B\u672A\u5B9A';\n\n  const priceStr = ev.price === null || ev.price === undefined\n    ? '\u7121\u6599'\n    : `\u00A5${Number(ev.price).toLocaleString()}`;\n\n  // \u7A7A\u304D\u72B6\u6CC1\u30D0\u30C3\u30B8\n  let statusBadge = '';\n  if (ev.status === 'full' || ev.is_full) {\n    statusBadge = '<span class=\"lf-ev-status-badge full\">\u6E80\u54E1</span>';\n  } else if (ev.capacity !== null) {\n    const remaining = ev.capacity - (ev.enrollment_count || 0);\n    statusBadge = remaining <= 3\n      ? `<span class=\"lf-ev-status-badge few\">\u6B8B\u308A${remaining}\u5E2D</span>`\n      : `<span class=\"lf-ev-status-badge open\">\u52DF\u96C6\u4E2D</span>`;\n  } else {\n    statusBadge = '<span class=\"lf-ev-status-badge open\">\u52DF\u96C6\u4E2D</span>';\n  }\n\n  // \u7533\u8FBC\u30DC\u30BF\u30F3\uFF08\u8A73\u7D30\u30DA\u30FC\u30B8 slug > \u5916\u90E8\u7533\u8FBCURL > \u4E00\u89A7 \u306E\u512A\u5148\u9806\uFF09\n  const isUserSlug = ev.slug && ev.slug.indexOf('event-') === 0;\n  const detailUrl = ev.slug && !isUserSlug ? `/blogs/media/${ev.slug}` : null;\n  let actionBtn = '';\n  if (ev.is_full || ev.status === 'full') {\n    actionBtn = detailUrl\n      ? `<a href=\"${detailUrl}\" class=\"lf-ev-action-btn external\">\u8A73\u7D30\u3092\u898B\u308B \u2192</a>`\n      : `<button class=\"lf-ev-action-btn disabled\" disabled>\u6E80\u54E1\u7DE0\u5207</button>`;\n  } else if (detailUrl) {\n    actionBtn = `<a href=\"${detailUrl}\" class=\"lf-ev-action-btn external\">\u8A73\u7D30\u30FB\u7533\u8FBC \u2192</a>`;\n  } else if (ev.registration_url) {\n    actionBtn = `<a href=\"${this.escapeHtml(ev.registration_url)}\" target=\"_blank\" rel=\"noopener\" class=\"lf-ev-action-btn external\">\u8A73\u7D30\u30FB\u7533\u8FBC \u2192</a>`;\n  } else {\n    actionBtn = `<a href=\"/pages/events-db\" class=\"lf-ev-action-btn external\">\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u3067\u7533\u8FBC \u2192</a>`;\n  }\n\n  // \u4FDD\u5B58\u89E3\u9664\u30DC\u30BF\u30F3\uFF08\u30D1\u30CD\u30EB\u5185\u306F\u5E38\u306B\u4FDD\u5B58\u6E08\u307F\u306A\u306E\u3067\u89E3\u9664\u306E\u307F\uFF09\n  const unbookmarkBtn = `<button class=\"lf-ev-unbookmark-btn\" onclick=\"window.plantApp.toggleEventBookmark('${ev.id}', this, true)\" title=\"\u4FDD\u5B58\u89E3\u9664\" style=\"background:none;border:1px solid #d1d5db;border-radius:6px;padding:4px 8px;font-size:12px;color:#6b7280;cursor:pointer;margin-bottom:4px;\">\uD83D\uDD16 \u4FDD\u5B58\u89E3\u9664</button>`;\n\n  return `\n    <div class=\"lf-ev-card\" id=\"lf-ev-card-${ev.id}\">\n      <div class=\"lf-ev-card-header\">\n        <div class=\"lf-ev-date-badge\">\n          <span class=\"lf-ev-month\">${new Date(ev.event_date).getMonth() + 1}\u6708</span>\n          <span class=\"lf-ev-day\">${new Date(ev.event_date).getDate()}</span>\n        </div>\n        <div class=\"lf-ev-info\">\n          <h4 class=\"lf-ev-title\">${this.escapeHtml(ev.title || ev.event_title || '\u30A4\u30D9\u30F3\u30C8')}</h4>\n          <p class=\"lf-ev-meta\">${this.escapeHtml(dateStr)} ${ev.venue ? `\u30FB${this.escapeHtml(ev.venue)}` : ''}</p>\n        </div>\n        ${statusBadge}\n      </div>\n      ${ev.description ? `<p class=\"lf-ev-description\">${this.escapeHtml(ev.description)}</p>` : ''}\n      <div class=\"lf-ev-card-footer\">\n        <div class=\"lf-ev-stats\">\n          <span class=\"lf-ev-price\">${priceStr}</span>\n          ${ev.capacity !== null ? `<span class=\"lf-ev-capacity\">${ev.enrollment_count || 0}/${ev.capacity}\u4EBA</span>` : ''}\n        </div>\n        <div style=\"display:flex;flex-direction:column;align-items:flex-end;gap:4px;\">\n          ${unbookmarkBtn}\n          ${actionBtn}\n        </div>\n      </div>\n    </div>\n  `;\n}\n\nasync registerEvent(eventId, btn) {\n  if (!this.userEmail || this.userEmail.startsWith('anon_')) {\n    this.showTemporaryNotification('\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059', 'error');\n    return;\n  }\n  btn.disabled = true;\n  btn.textContent = '\u7533\u8FBC\u4E2D...';\n\n  try {\n    const res = await fetch(`${this.apiBase}?action=register_event`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, event_id: eventId })\n    });\n    const data = await res.json();\n\n    if (data.success) {\n      this.showTemporaryNotification('\u7533\u8FBC\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\uFF01', 'success');\n      // \u30AB\u30FC\u30C9\u3092\u518D\u63CF\u753B\uFF08\u30AD\u30E3\u30C3\u30B7\u30E5\u66F4\u65B0\uFF09\n      const ev = this._eventsCache?.find(e => e.id === eventId);\n      if (ev) {\n        ev.is_registered = true;\n        ev.enrollment_count = (ev.enrollment_count || 0) + 1;\n        ev.is_full = ev.capacity !== null && ev.enrollment_count >= ev.capacity;\n        if (ev.is_full) ev.status = 'full';\n        const card = document.getElementById(`lf-ev-card-${eventId}`);\n        if (card) card.outerHTML = this.renderEventCard(ev);\n      }\n    } else {\n      const msg = data.error === 'already_registered' ? '\u3059\u3067\u306B\u7533\u8FBC\u6E08\u307F\u3067\u3059'\n        : data.error === 'event_full' ? '\u3053\u306E\u30A4\u30D9\u30F3\u30C8\u306F\u6E80\u54E1\u3067\u3059'\n        : `\u7533\u8FBC\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${data.error}`;\n      this.showTemporaryNotification(msg, 'error');\n      btn.disabled = false;\n      btn.textContent = '\u53C2\u52A0\u7533\u8FBC';\n    }\n  } catch (err) {\n    console.error('registerEvent error:', err);\n    this.showTemporaryNotification('\u901A\u4FE1\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F', 'error');\n    btn.disabled = false;\n    btn.textContent = '\u53C2\u52A0\u7533\u8FBC';\n  }\n}\n\nasync cancelEventRegistration(eventId, btn) {\n  btn.disabled = true;\n  btn.textContent = '\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D...';\n\n  try {\n    const res = await fetch(`${this.apiBase}?action=cancel_event`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + this.SUPABASE_ANON_KEY, 'apikey': this.SUPABASE_ANON_KEY },\n      body: JSON.stringify({ user_email: this.userEmail, event_id: eventId })\n    });\n    const data = await res.json();\n\n    if (data.success) {\n      this.showTemporaryNotification('\u7533\u8FBC\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F', 'success');\n      const ev = this._eventsCache?.find(e => e.id === eventId);\n      if (ev) {\n        ev.is_registered = false;\n        ev.enrollment_count = Math.max(0, (ev.enrollment_count || 1) - 1);\n        ev.is_full = false;\n        ev.status = 'open';\n        const card = document.getElementById(`lf-ev-card-${eventId}`);\n        if (card) card.outerHTML = this.renderEventCard(ev);\n      }\n    } else {\n      this.showTemporaryNotification('\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n      btn.disabled = false;\n      btn.textContent = '\u7533\u8FBC\u30AD\u30E3\u30F3\u30BB\u30EB';\n    }\n  } catch (err) {\n    console.error('cancelEventRegistration error:', err);\n    this.showTemporaryNotification('\u901A\u4FE1\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F', 'error');\n    btn.disabled = false;\n    btn.textContent = '\u7533\u8FBC\u30AD\u30E3\u30F3\u30BB\u30EB';\n  }\n}\n\n  attachPlantSelectionEvents() {\n    const selectionRadios = document.querySelectorAll('input[name=\"plant_selection_type\"]');\n    const existingDropdown = document.getElementById('existing-plants-dropdown');\n    const plantNameInput = document.getElementById('plant-name');\n    \n    if (!selectionRadios.length) return;\n\n    selectionRadios.forEach(radio => {\n      radio.addEventListener('change', (e) => {\n        console.log('\u690D\u7269\u9078\u629E\u30E2\u30FC\u30C9\u5909\u66F4:', e.target.value);\n        \n        if (e.target.value === 'existing') {\n          if (existingDropdown) {\n            existingDropdown.style.display = 'block';\n          }\n          if (plantNameInput) {\n            plantNameInput.disabled = true;\n            plantNameInput.value = '';\n            plantNameInput.placeholder = '\u690D\u7269\u3092\u9078\u629E\u3059\u308B\u3068\u81EA\u52D5\u5165\u529B\u3055\u308C\u307E\u3059';\n          }\n          this.updateExistingPlantsDropdown();\n        } else {\n          if (existingDropdown) {\n            existingDropdown.style.display = 'none';\n          }\n          if (plantNameInput) {\n            plantNameInput.disabled = false;\n            plantNameInput.value = '';\n            plantNameInput.placeholder = '\u4F8B: \u30D3\u30AB\u30AF\u30B7\u30C0\u3001\u30EA\u30C9\u30EC\u30A4\u3001\u591A\u8089\u690D\u7269\u3001\u30DD\u30C8\u30B9';\n          }\n          this.lastSelectedPlant = null;\n        }\n      });\n    });\n\n    const existingSelect = document.getElementById('existing-plant-select');\n    if (existingSelect) {\n      existingSelect.addEventListener('change', (e) => {\n        const selectedOption = e.target.selectedOptions[0];\n        if (selectedOption && selectedOption.dataset.plantName && plantNameInput) {\n          const plantName = selectedOption.dataset.plantName;\n          plantNameInput.value = plantName;\n          \n          this.lastSelectedPlant = {\n            id: selectedOption.value,\n            name: plantName,\n            postsCount: selectedOption.dataset.postsCount || 0,\n            activity: selectedOption.dataset.activity || 'unknown'\n          };\n          \n          console.log('\u690D\u7269\u9078\u629E\u8A18\u9332:', this.lastSelectedPlant);\n        }\n      });\n    }\n  }\n\n  attachGlobalKeyboardEvents() {\n    document.addEventListener('keydown', (e) => {\n      if (e.key === 'Escape') {\n        this.closeAllModals();\n        this.currentOpenThread = null;\n      }\n      \n      if (e.ctrlKey && e.key === 'Enter') {\n        const form = document.getElementById('consultation-form');\n        if (form && !document.querySelector('.modal-overlay')) {\n          e.preventDefault();\n          this.submitConsultation();\n        }\n      }\n    });\n  }\n\n  handleImagePreview(file) {\n    const preview = document.getElementById('image-preview');\n    if (!preview) return;\n\n    if (!file) {\n      preview.innerHTML = '';\n      return;\n    }\n\n    if (file.size > 10 * 1024 * 1024) {\n      preview.innerHTML = '<p class=\"error\">\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF0810MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF09</p>';\n      return;\n    }\n\n    const allowedTypes = ['image/jpeg', 'image/png', 'image/webp'];\n    if (!allowedTypes.includes(file.type)) {\n      preview.innerHTML = '<p class=\"error\">\u5BFE\u5FDC\u3057\u3066\u3044\u306A\u3044\u753B\u50CF\u5F62\u5F0F\u3067\u3059\uFF08JPEG\u3001PNG\u3001WebP\u5BFE\u5FDC\uFF09</p>';\n      return;\n    }\n\n    const membershipType = this.getMembershipType();\n    const reader = new FileReader();\n    \n    reader.onload = (e) => {\n      preview.innerHTML = `\n        <div class=\"image-preview-container\">\n          <img src=\"${e.target.result}\" alt=\"\u30D7\u30EC\u30D3\u30E5\u30FC\">\n          <div class=\"preview-info\">\n            <p class=\"file-info\">\n              ${file.name}<br>\n              \u30B5\u30A4\u30BA: ${(file.size / 1024 / 1024).toFixed(2)}MB\n            </p>\n            <p class=\"storage-info\">\n              ${membershipType !== 'non_member' ? \n                '\u2713 \u3053\u306E\u5199\u771F\u306F\u4FDD\u5B58\u3055\u308C\u307E\u3059' : \n                '\u26A0 \u975E\u4F1A\u54E1\u3067\u306F\u5199\u771F\u4FDD\u5B58\u3055\u308C\u307E\u305B\u3093'\n              }\n            </p>\n          </div>\n        </div>\n      `;\n    };\n    \n    reader.readAsDataURL(file);\n  }\n\n  debugFormState() {\n    const plantNameInput = document.getElementById('plant-name');\n    const existingRadio = document.getElementById('radio-existing');\n    const newRadio = document.getElementById('radio-new');\n    const existingSelect = document.getElementById('existing-plant-select');\n    \n    const debugInfo = {\n      plantName: plantNameInput?.value,\n      plantNameDisabled: plantNameInput?.disabled,\n      plantNamePlaceholder: plantNameInput?.placeholder,\n      existingRadioChecked: existingRadio?.checked,\n      newRadioChecked: newRadio?.checked,\n      selectedPlantId: existingSelect?.value,\n      selectedPlantName: existingSelect?.selectedOptions[0]?.dataset?.plantName,\n      lastSelectedPlant: this.lastSelectedPlant,\n      availableOptions: Array.from(existingSelect?.options || []).map(opt => ({\n        value: opt.value,\n        text: opt.text,\n        plantName: opt.dataset.plantName,\n        postsCount: opt.dataset.postsCount\n      })),\n      membershipType: this.getMembershipType(),\n      currentSeason: this.getCurrentSeasonInfo()\n    };\n\n    console.log('\u30D5\u30A9\u30FC\u30E0\u72B6\u614B\u30C7\u30D0\u30C3\u30B0\u60C5\u5831:', debugInfo);\n    return debugInfo;\n  }\n\n  restorePlantSelection() {\n    if (!this.lastSelectedPlant) return;\n    console.log('\u690D\u7269\u9078\u629E\u72B6\u614B\u5FA9\u5143\u51E6\u7406\u958B\u59CB:', this.lastSelectedPlant);\n\n    let attempts = 0;\n    const maxAttempts = 5;\n\n    const attemptRestore = () => {\n      attempts++;\n      console.log(`\u5FA9\u5143\u8A66\u884C ${attempts}/${maxAttempts}`);\n      \n      const existingRadio = document.getElementById('radio-existing');\n      const newRadio = document.getElementById('radio-new');\n      const existingSelect = document.getElementById('existing-plant-select');\n      const plantNameInput = document.getElementById('plant-name');\n      const existingDropdown = document.getElementById('existing-plants-dropdown');\n      \n      if (!existingRadio || !existingSelect || !plantNameInput) {\n        if (attempts < maxAttempts) {\n          setTimeout(attemptRestore, 100);\n          return;\n        }\n        console.error('\u5FC5\u8981\u306A\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 - \u5FA9\u5143\u3092\u4E2D\u6B62');\n        return;\n      }\n      \n      try {\n        existingRadio.checked = true;\n        if (newRadio) newRadio.checked = false;\n        \n        if (existingDropdown) {\n          existingDropdown.style.display = 'block';\n        }\n        \n        plantNameInput.disabled = true;\n        plantNameInput.value = this.lastSelectedPlant.name;\n        plantNameInput.placeholder = '\u9078\u629E\u3057\u305F\u690D\u7269: ' + this.lastSelectedPlant.name;\n        \n        const targetOption = Array.from(existingSelect.options).find(\n          option => option.value === this.lastSelectedPlant.id\n        );\n        \n        if (targetOption) {\n          existingSelect.value = this.lastSelectedPlant.id;\n          console.log('\u690D\u7269\u9078\u629E\u72B6\u614B\u5FA9\u5143\u5B8C\u4E86:', {\n            selectedId: existingSelect.value,\n            selectedName: plantNameInput.value,\n            radioChecked: existingRadio.checked,\n            activity: this.lastSelectedPlant.activity\n          });\n        } else {\n          console.warn('\u5BFE\u8C61\u306E\u690D\u7269\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 - \u30EA\u30B9\u30C8\u66F4\u65B0\u3092\u5F85\u6A5F');\n          if (attempts < maxAttempts) {\n            setTimeout(attemptRestore, 200);\n            return;\n          }\n          console.error('\u690D\u7269\u9078\u629E\u5FA9\u5143\u5931\u6557: \u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n        }\n        \n      } catch (error) {\n        console.error('\u690D\u7269\u9078\u629E\u72B6\u614B\u5FA9\u5143\u30A8\u30E9\u30FC:', error);\n      }\n    };\n\n    setTimeout(attemptRestore, 100);\n  }\nshowIllustrationLimitModal(limitData) {\n  this.closeAllModals();\n  \n  const modalHtml = `\n    <div id=\"illustration-limit-modal\" class=\"modal-overlay\" onclick=\"event.stopPropagation()\">\n      <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-header\">\n          <h3>\u30A4\u30E9\u30B9\u30C8\u751F\u6210\u306E\u6708\u9593\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F</h3>\n          <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n        </div>\n        <div class=\"modal-body\">\n          <div class=\"limit-info\">\n            <h4>\u73FE\u5728\u306E\u5229\u7528\u72B6\u6CC1</h4>\n            <div class=\"usage-stats\">\n              <div class=\"stat\">\n                <span class=\"label\">\u4ECA\u6708\u306E\u5229\u7528\u56DE\u6570</span>\n                <span class=\"value\">${limitData.current_usage}\u56DE</span>\n              </div>\n              <div class=\"stat\">\n                <span class=\"label\">\u6708\u9593\u4E0A\u9650</span>\n                <span class=\"value\">${limitData.monthly_limit}\u56DE</span>\n              </div>\n              <div class=\"stat\">\n                <span class=\"label\">\u8FFD\u52A0\u30D1\u30C3\u30AF</span>\n                <span class=\"value\">${limitData.additional_pack_count}\u30D1\u30C3\u30AF\u8CFC\u5165\u6E08\u307F</span>\n              </div>\n            </div>\n          </div>\n          \n          <div class=\"options\">\n            <h4>\u89E3\u6C7A\u65B9\u6CD5</h4>\n            \n            <div class=\"option-card\">\n              <h5>\u8FFD\u52A0\u30A4\u30E9\u30B9\u30C8\u30D1\u30C3\u30AF\u8CFC\u5165</h5>\n              <div class=\"option-details\">\n                <p><strong>${limitData.upgrade_options.additional_pack_price}</strong>\u3067<strong>${limitData.upgrade_options.additional_pack_illustrations}\u56DE</strong>\u8FFD\u52A0</p>\n                <p>\u4ECA\u6708\u9650\u5B9A\u3067\u5373\u5EA7\u306B\u5229\u7528\u53EF\u80FD</p>\n              </div>\n              <button class=\"btn btn-primary\" onclick=\"window.plantApp.purchaseAdditionalPack()\">\n                \u8FFD\u52A0\u30D1\u30C3\u30AF\u3092\u8CFC\u5165\u3059\u308B\n              </button>\n            </div>\n            \n            <div class=\"option-card\">\n              <h5>\u6765\u6708\u307E\u3067\u5F85\u3064</h5>\n              <div class=\"option-details\">\n                <p>\u6708\u9593\u4E0A\u9650\u306F\u6BCE\u6708\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3059</p>\n                <p>\u305D\u308C\u307E\u3067\u306F\u901A\u5E38\u306E\u76F8\u8AC7\u6A5F\u80FD\u3092\u3054\u5229\u7528\u304F\u3060\u3055\u3044</p>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `;\n  \n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n}\n\nshowConsultationLimitModal(errorData = {}) {\n  this.closeAllModals();\n  \n  const membershipType = this.getMembershipType();\n  \n  // \u2605\u2605\u2605 \u6B63\u3057\u3044\u30EA\u30BB\u30C3\u30C8\u65E5\u8A08\u7B97 \u2605\u2605\u2605\n  const now = new Date();\n  const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n  const resetDate = `${nextMonth.getFullYear()}\u5E74${nextMonth.getMonth() + 1}\u67081\u65E5`;\n  \n  // \u975E\u4F1A\u54E1\u30FB\u7121\u6599\u4F1A\u54E1\u306E\u5834\u5408\n  if (membershipType !== 'paid_member') {\n    const modalHtml = `\n      <div id=\"consultation-limit-modal\" class=\"modal-overlay\" onclick=\"window.plantApp.closeAllModals()\">\n        <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n          <div class=\"modal-header\">\n            <h3>\uD83C\uDF3F AI\u76F8\u8AC7\u6A5F\u80FD\u306F\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u3067\u3059</h3>\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n          </div>\n          \n          <div class=\"modal-body\">\n            <div class=\"upgrade-benefits\">\n              <h4>\u6708\u984D300\u5186\u3067\u4F7F\u3044\u653E\u984C</h4>\n              <ul>\n                <li>\u2705 AI\u690D\u7269\u76F8\u8AC7\uFF08\u6708150\u56DE\uFF09</li>\n                <li>\u2705 AI\u30B1\u30A2\u30A4\u30E9\u30B9\u30C8\uFF08\u670820\u56DE\uFF09</li>\n                <li>\u2705 \u5B63\u7BC0\u5BFE\u5FDC\u30B1\u30A2\u901A\u77E5</li>\n                <li>\u2705 \u690D\u726950\u500B\u307E\u3067\u767B\u9332</li>\n              </ul>\n            </div>\n            \n            <div class=\"form-actions\">\n              <a href=\"/pages/botanical-record#plans\" class=\"btn btn-primary btn-large\">\n                \uD83C\uDF3F \u6709\u6599\u30D7\u30E9\u30F3\u3092\u898B\u308B\uFF08\u6700\u5B89 \u6708\u00A5250\u301C\uFF09\n              </a>\n              <button onclick=\"window.plantApp.closeAllModals()\" class=\"btn btn-secondary\">\n                \u9589\u3058\u308B\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n    document.body.insertAdjacentHTML('beforeend', modalHtml);\n    return;\n  }\n  \n  // \u6709\u6599\u4F1A\u54E1\u306E\u5834\u5408\n  const currentUsage = errorData.current_usage || errorData.used || '?';\n  const monthlyLimit = errorData.monthly_limit || errorData.limit || 150;\n  const additionalPackCount = errorData.additional_pack_count || errorData.additional_packs || 0;\n  \n  const modalHtml = `\n    <div id=\"consultation-limit-modal\" class=\"modal-overlay\" onclick=\"window.plantApp.closeAllModals()\">\n      <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n        <div class=\"modal-header\">\n          <h3>\uD83D\uDEAB \u4ECA\u6708\u306E\u76F8\u8AC7\u56DE\u6570\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F</h3>\n          <button onclick=\"window.plantApp.closeAllModals()\" class=\"close-btn\">\u00D7</button>\n        </div>\n        \n        <div class=\"modal-body\">\n          <div class=\"limit-warning\">\n            <h4>\u73FE\u5728\u306E\u5229\u7528\u72B6\u6CC1</h4>\n            <div class=\"usage-stats\">\n              <div class=\"stat-row\">\n                <span class=\"stat-label\">\u4F7F\u7528\u56DE\u6570:</span>\n                <span class=\"stat-value highlight\">${currentUsage} / ${monthlyLimit}\u56DE</span>\n              </div>\n              <div class=\"stat-row\">\n                <span class=\"stat-label\">\u8FFD\u52A0\u30D1\u30C3\u30AF\u8CFC\u5165:</span>\n                <span class=\"stat-value\">${additionalPackCount}\u500B</span>\n              </div>\n              <div class=\"stat-row\">\n                <span class=\"stat-label\">\u30EA\u30BB\u30C3\u30C8\u65E5:</span>\n                <span class=\"stat-value\">${resetDate}</span>\n              </div>\n            </div>\n          </div>\n          \n          <div class=\"upgrade-suggestion\">\n            <h4>\uD83D\uDCA1 \u8FFD\u52A0\u30D1\u30C3\u30AF\u3067\u76F8\u8AC7\u56DE\u6570\u3092\u5897\u3084\u305B\u307E\u3059</h4>\n            <div class=\"pack-info\">\n              <p class=\"pack-price\"><strong>\u00A51,000</strong></p>\n              <p class=\"pack-benefit\">+100\u56DE\u306E\u76F8\u8AC7\u304C\u53EF\u80FD</p>\n            </div>\n            \n            <div class=\"purchase-action\">\n              <a href=\"https://leaf-laboratory.com/products/botareco-consultation-pack\" class=\"btn btn-primary btn-large\" target=\"_blank\">\n                \uD83D\uDED2 \u8FFD\u52A0\u30D1\u30C3\u30AF\u3092\u8CFC\u5165\n              </a>\n            </div>\n          </div>\n          \n          <div class=\"alternatives\">\n            <h5>\u305D\u306E\u4ED6\u306E\u9078\u629E\u80A2</h5>\n            <ul>\n              <li>${resetDate}\u306B\u4E0A\u9650\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3059</li>\n              <li>\u8A18\u9332\u306E\u307F\u6295\u7A3F\uFF08\u76F8\u8AC7\u5185\u5BB9\u3092\u7A7A\u6B04\uFF09\u306F\u56DE\u6570\u5236\u9650\u306A\u3057</li>\n              <li>\u65E2\u5B58\u306E\u6295\u7A3F\u306B\u5BFE\u3059\u308B\u8FFD\u52A0\u76F8\u8AC7\uFF08\u5404\u6295\u7A3F5\u56DE\u307E\u3067\uFF09\u3082\u53EF\u80FD</li>\n            </ul>\n          </div>\n          \n          <div class=\"form-actions\">\n            <button onclick=\"window.plantApp.closeAllModals()\" class=\"btn btn-secondary\">\n              \u9589\u3058\u308B\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  `;\n  \n  document.body.insertAdjacentHTML('beforeend', modalHtml);\n}\n\n\npurchaseConsultationPack() {\n  window.open('/products/botareco-consultation-pack', '_blank');\n  this.closeAllModals();\n}\n\npurchaseAdditionalPack() {\n  window.open('/products/botareco-additional-pack', '_blank');\n  this.closeAllModals();\n}\n\n// =====================================================================\n// \u5E83\u544A\u30FB\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30ED\u30C3\u30C8 \u4E00\u5143\u7BA1\u7406\n// =====================================================================\n// \u3010\u4F7F\u3044\u65B9\u3011\n//   \u30FB\u914D\u5217 \u2192 \u30E9\u30F3\u30C0\u30E0\u30671\u4EF6\u8868\u793A\uFF08\u30ED\u30FC\u30C7\u30A3\u30F3\u30B0 tip \u306A\u3069\uFF09\n//   \u30FB\u6587\u5B57\u5217 \u2192 \u305D\u306E\u307E\u307E HTML \u3068\u3057\u3066\u633F\u5165\n//   \u30FBnull  \u2192 \u975E\u8868\u793A\uFF08\u30B9\u30ED\u30C3\u30C8\u3092\u7121\u52B9\u5316\uFF09\n//\n// \u3010\u30B9\u30ED\u30C3\u30C8\u4E00\u89A7\u3011\n//   'loading-tip'    : AI\u5BE9\u67FB\u4E2D\u30ED\u30FC\u30C7\u30A3\u30F3\u30B0\u753B\u9762\u306E\u4E0B\u90E8\uFF08tip or \u7D14\u5E83\u544A\uFF09\n//   'result-bottom'  : AI\u5206\u6790\u7D50\u679C\u306E\u6700\u4E0B\u90E8\uFF08\u7D14\u5E83\u544A\u67A0\uFF09\n//   'sns-feed-top'   : SNS\u30D5\u30A3\u30FC\u30C9\u4E0A\u90E8\uFF08\u7D14\u5E83\u544A\u67A0 \u203B\u73FE\u5728\u7121\u52B9\uFF09\n//\n// \u3010\u7D14\u5E83\u544A\u306E\u8FFD\u52A0\u4F8B\u3011\n//   'result-bottom': `\n//     <a href=\"https://example.com\" target=\"_blank\" rel=\"noopener\" class=\"slot-ad-link\">\n//       <img src=\"https://cdn.shopify.com/.../banner.jpg\" alt=\"\u5E83\u544A\" class=\"slot-ad-img\">\n//     </a>`\n//\n// \u3010\u30ED\u30FC\u30C7\u30A3\u30F3\u30B0 tip \u306B\u7D14\u5E83\u544A\u3092\u6DF7\u305C\u308B\u4F8B\u3011\n//   { type: 'ad', html: '<a href=\"...\"><img src=\"...\" class=\"slot-ad-img\"></a>' }\n// =====================================================================\n\nstatic CONTENT_SLOTS = {\n\n  // --- \u30ED\u30FC\u30C7\u30A3\u30F3\u30B0\u4E2D tip\uFF08\u914D\u5217\u2192\u30E9\u30F3\u30C0\u30E0\u8868\u793A\uFF09---\n  'loading-tip': [\n    {\n      type: 'tip',\n      img: 'https://cdn.shopify.com/s/files/1/0658/5332/5495/files/il1.png?v=1765080480',\n      text: '\u8449\u306E\u8868\u9762\u3092\u8EFD\u304F\u6574\u3048\u3066\u304B\u3089\u64AE\u308B\u3068\u6210\u9577\u304C\u6BD4\u3079\u3084\u3059\u304F\u306A\u308A\u307E\u3059\u3002'\n    },\n    {\n      type: 'tip',\n      img: 'https://cdn.shopify.com/s/files/1/0658/5332/5495/files/il7.png?v=1765080480',\n      text: '\u6BCE\u65E5\u306E\u4E00\u679A\u304C\u3001\u5F8C\u3067\u6210\u9577\u306E\u9053\u7B4B\u3092\u898B\u305B\u3066\u304F\u308C\u307E\u3059\u3002'\n    },\n    // \u2193 \u7D14\u5E83\u544A\u3092\u8FFD\u52A0\u3059\u308B\u5834\u5408\u306F\u3053\u3053\u306B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u8FFD\u52A0\n    // {\n    //   type: 'ad',\n    //   html: `<a href=\"/pages/xxx\" target=\"_blank\" rel=\"noopener\">\n    //            <img src=\"https://cdn.shopify.com/.../ad-banner.jpg\" alt=\"PR\" class=\"slot-ad-img\">\n    //          </a>`\n    // },\n  ],\n\n  // --- AI\u5206\u6790\u7D50\u679C \u6700\u4E0B\u90E8\uFF08null = \u975E\u8868\u793A / HTML\u6587\u5B57\u5217 = \u8868\u793A\uFF09---\n  'result-bottom': null,\n  // \u4F8B: 'result-bottom': `<a href=\"/pages/lp\" class=\"slot-ad-link\"><img src=\"...\" class=\"slot-ad-img\" alt=\"PR\"></a>`,\n\n  // --- SNS\u30D5\u30A3\u30FC\u30C9\u4E0A\u90E8\uFF08null = \u975E\u8868\u793A\uFF09---\n  'sns-feed-top': null,\n\n};\n\n// \u30B9\u30ED\u30C3\u30C8\u3092 HTML \u6587\u5B57\u5217\u3067\u8FD4\u3059\nrenderSlot(slotName) {\n  const slot = PlantConsultationApp.CONTENT_SLOTS[slotName];\n  if (!slot) return '';\n\n  // \u914D\u5217\u306E\u5834\u5408\u306F\u30E9\u30F3\u30C0\u30E0\u9078\u629E\n  if (Array.isArray(slot)) {\n    const item = slot[Math.floor(Math.random() * slot.length)];\n    if (!item) return '';\n    if (item.type === 'ad') {\n      return `<div class=\"content-slot content-slot--ad\" data-slot=\"${slotName}\">${item.html}</div>`;\n    }\n    // tip \u30BF\u30A4\u30D7\uFF08img + text\uFF09\n    return `<div class=\"content-slot content-slot--tip\" data-slot=\"${slotName}\">\n      <div class=\"br-processing-tip-inner\">\n        <img src=\"${item.img}\" alt=\"\u690D\u7269\u30B1\u30A2\u30A2\u30C9\u30D0\u30A4\u30B9\" class=\"br-processing-tip-img\">\n        <p class=\"br-processing-tip-text\">${item.text}</p>\n      </div>\n    </div>`;\n  }\n\n  // \u6587\u5B57\u5217\uFF08\u751F HTML\uFF09\u306E\u5834\u5408\n  if (typeof slot === 'string') {\n    return `<div class=\"content-slot content-slot--ad\" data-slot=\"${slotName}\">${slot}</div>`;\n  }\n\n  return '';\n}\n}  \n\n\n// CSS\u52D5\u7684\u8FFD\u52A0\nconst appDynamicCSS = `\n/*style*/\n`;\n\nif (!document.querySelector('#leafla-app-styles')) {\n  const styleSheet = document.createElement('style');\n  styleSheet.id = 'leafla-app-styles';\n  styleSheet.textContent = appDynamicCSS;\n  document.head.appendChild(styleSheet);\n}\n\n// \u30B0\u30ED\u30FC\u30D0\u30EB\u521D\u671F\u5316\n(function() {\n  'use strict';\n  \n  if (typeof window === 'undefined') {\n    console.warn('Window object not available');\n    return;\n  }\n\n  if (window.plantApp) {\n    console.log('\u65E2\u5B58\u306EPlantApp\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u30AF\u30EA\u30FC\u30F3\u30A2\u30C3\u30D7');\n    if (typeof window.plantApp.closeAllModals === 'function') {\n      window.plantApp.closeAllModals();\n    }\n  }\n\n  try {\n    window.plantApp = new PlantConsultationApp();\n    \n    setTimeout(() => {\n      if (window.plantApp.performSystemIntegrityCheck) {\n        window.plantApp.performSystemIntegrityCheck();\n      }\n    }, 1000);\n    \n    console.log('\u2705 LEAFLA\u690D\u7269\u80B2\u6210\u8A18\u9332\u30A2\u30D7\u30EA \u5B8C\u5168\u7D71\u5408\u7248 v17.1.0 \u521D\u671F\u5316\u5B8C\u4E86');\n    console.log('\uD83D\uDD27 \u7D71\u5408\u5B9F\u88C5\u6A5F\u80FD\u4E00\u89A7:');\n    console.log('  \u2713 \u753B\u50CF\u751F\u6210\uFF08Gemini 2.5-flash-image-preview\uFF09');\n    console.log('  \u2713 \u690D\u7269\u8A18\u9332\u8A73\u7D30\u30E2\u30FC\u30C0\u30EB\uFF084\u30BF\u30D6\u69CB\u6210\uFF09');\n    console.log('  \u2713 \u8FFD\u52A0\u76F8\u8AC7\u6A5F\u80FD\uFF08\u5B8C\u5168\u5C65\u6B74\u5BFE\u5FDC\uFF09');\n    console.log('  \u2713 \u30B1\u30A2\u8A18\u9332\u6A5F\u80FD\uFF08care_records\u30C6\u30FC\u30D6\u30EB\u7D71\u5408\uFF09');\n    console.log('  \u2713 \u30B1\u30A2\u901A\u77E5\u30FB\u30A2\u30E9\u30FC\u30C8\u6A5F\u80FD\uFF08\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u30FB\u5B63\u7BC0\u5BFE\u5FDC\uFF09');\n    console.log('  \u2713 \u6210\u9577\u8A18\u9332\u6BD4\u8F03\u6A5F\u80FD\uFF08\u7D71\u8A08\u5206\u6790\u4ED8\u304D\uFF09');\n    console.log('  \u2713 \u524A\u9664\u6A5F\u80FD\uFF08\u5B8C\u5168\u7248\uFF09');\n    console.log('  \u2713 \u30B1\u30A2\u8A2D\u5B9A\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\uFF08\u6709\u6599\u4F1A\u54E1\u9650\u5B9A\u30FB\u4FDD\u5B58\u30DC\u30BF\u30F3\u5B8C\u5168\u4FEE\u6B63\uFF09');\n    console.log('  \u2713 \u5B63\u7BC0\u5BFE\u5FDC\u30B7\u30B9\u30C6\u30E0\uFF08TypeScript v17.1.0\u6E96\u62E0\uFF09');\n    console.log('  \u2713 \u4F1A\u54E1\u5236\u5EA6\u7D71\u5408\u7BA1\u7406');\n    console.log('  \u2713 \u30A8\u30E9\u30FC\u5831\u544A\u30B7\u30B9\u30C6\u30E0');\n    console.log('  \u2713 \u30B7\u30B9\u30C6\u30E0\u6574\u5408\u6027\u30C1\u30A7\u30C3\u30AF');\n    \n  } catch (error) {\n    console.error('\u274C \u690D\u7269\u80B2\u6210\u8A18\u9332\u30A2\u30D7\u30EA\u306E\u521D\u671F\u5316\u306B\u5931\u6557:', error);\n    \n    window.plantApp = {\n      showError: function(message) {\n        console.error('PlantApp Error:', message);\n        alert('\u30A8\u30E9\u30FC: ' + message);\n      },\n      closeAllModals: function() {\n        const modals = document.querySelectorAll('.modal-overlay');\n        modals.forEach(modal => modal.remove());\n      },\n      showTemporaryNotification: function(message, type = 'error') {\n        console.log(`Notification [${type}]: ${message}`);\n        const notification = document.createElement('div');\n        notification.textContent = message;\n        notification.style.cssText = `\n          position: fixed; top: 20px; right: 20px; z-index: 9999;\n          background: #f8d7da; color: #721c24; padding: 12px;\n          border-radius: 4px; border: 1px solid #f5c6cb;\n        `;\n        document.body.appendChild(notification);\n        setTimeout(() => notification.remove(), 3000);\n      },\n      confirmDeletePost: function() { console.log('Delete function fallback'); },\n      submitFollowUp: function() { console.log('Follow-up function fallback'); },\n      showFollowUpModal: function() { console.log('Follow-up modal fallback'); },\n      showAddCareModal: function() { console.log('Care modal fallback'); },\n      showCareSettingsModal: function() { console.log('Care settings fallback'); },\n      openPlantRecord: function() { console.log('Plant record fallback'); },\n      showImageFullscreen: function() { console.log('Image fullscreen fallback'); },\n      markCareAsDone: function() { console.log('Care done fallback'); },\n      loadCareRecords: function() { console.log('Care records fallback'); },\n      loadGrowthImages: function() { console.log('Growth images fallback'); },\n      saveCareSettings: function() { console.log('Save care settings fallback'); }\n    };\n  }\n  \n  window.addEventListener('error', function(e) {\n    console.error('\uD83D\uDEA8 Global JavaScript Error:', {\n      message: e.message,\n      filename: e.filename,\n      lineno: e.lineno,\n      colno: e.colno,\n      error: e.error,\n      timestamp: new Date().toISOString()\n    });\n    \n    if (window.plantApp && typeof window.plantApp.reportError === 'function') {\n      window.plantApp.reportError(e.error, 'Global error handler');\n    }\n  });\n  \n  window.addEventListener('unhandledrejection', function(e) {\n    console.error('\uD83D\uDEA8 Unhandled Promise Rejection:', {\n      reason: e.reason,\n      promise: e.promise,\n      timestamp: new Date().toISOString()\n    });\n    \n    if (window.plantApp && typeof window.plantApp.reportError === 'function') {\n      const error = new Error('Unhandled Promise Rejection: ' + String(e.reason));\n      window.plantApp.reportError(error, 'Unhandled promise rejection');\n    }\n  });\n\n})();\n// ===== \u65B0\u30D8\u30C3\u30C0\u30FC\u5236\u5FA1JS =====\n(function() {\n  var $ = function(sel) { return document.querySelector(sel); };\n  var btn = $('#brUserBtn');\n  var pop = $('#brUserPopover');\n  var sheet = $('#brSheet');\n  \n  if (!btn || !pop) {\n    console.log('brUserBtn \u307E\u305F\u306F brUserPopover \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093');\n    return;\n  }\n\nfunction updateStats() {\n  // \u2605 #total-records\u7B49\u306F/pages/botareco\u5C02\u7528\u306E\u672C\u6587\u5074\u7D71\u8A08\u8868\u793A\u8981\u7D20\u3067\u3001\u4ED6\u30DA\u30FC\u30B8\u306B\u306F\u5B58\u5728\u3057\u306A\u3044\u3002\n  //   \u5B58\u5728\u3057\u306A\u3044\u5834\u5408\u306BbrXXX\u5074\u3092'0'/'\u2014'\u3067\u4E0A\u66F8\u304D\u3057\u3066\u3057\u307E\u3046\u3068\u3001loadHeaderStats()\u304C\u6B63\u3057\u304F\u53D6\u5F97\u3057\u305F\n  //   \u5024\u3092\u76F4\u5F8C\u306B\u6D88\u3057\u3066\u3057\u307E\u3046\u305F\u3081\u3001\u30BD\u30FC\u30B9\u8981\u7D20\u304C\u5B9F\u5728\u3059\u308B\u5834\u5408\u306E\u307F\u540C\u671F\u3059\u308B\u3002\n  var totalRecords = $('#total-records');\n  var consultations = $('#consultation-count');\n  var period = $('#growth-period');\n  var todayCare = $('#todays-care-count');\n  var quota = $('#quota-display');\n\n  if (totalRecords && $('#brTotalRecords')) $('#brTotalRecords').textContent = totalRecords.textContent;\n  if (consultations && $('#brConsultations')) $('#brConsultations').textContent = consultations.textContent;\n  if (period && $('#brPeriod')) $('#brPeriod').textContent = period.textContent;\n  if (todayCare && $('#brTodayCare')) $('#brTodayCare').textContent = todayCare.textContent;\n\n  if (quota && $('#brQuotas')) $('#brQuotas').innerHTML = quota.innerHTML;\n  \n  // \u2605\u2605\u2605 \u30E6\u30FC\u30B6\u30FC\u540D\u3082\u66F4\u65B0\uFF08plantApp\u304B\u3089\u53D6\u5F97\uFF09 \u2605\u2605\u2605\n  if (window.plantApp && window.plantApp.loadUserNicknameFromSupabase) {\n    window.plantApp.loadUserNicknameFromSupabase();\n  }\n}\n\n  function openPopover() {\n    updateStats();\n    // \u672A\u30ED\u30FC\u30C9\uFF08\"-\"\uFF09\u306E\u307E\u307E\u306A\u3089 API \u304B\u3089\u76F4\u63A5\u53D6\u5F97\n    var brTotal = $('#brTotalRecords');\n    if (brTotal && brTotal.textContent === '-' && window.plantApp && typeof window.plantApp.loadHeaderStats === 'function') {\n      window.plantApp.loadHeaderStats();\n    }\n    pop.hidden = false;\n    btn.setAttribute('aria-expanded', 'true');\n    setTimeout(function() {\n      document.addEventListener('click', onDocClick);\n    }, 0);\n  }\n\n  function closePopover() {\n    pop.hidden = true;\n    btn.setAttribute('aria-expanded', 'false');\n    document.removeEventListener('click', onDocClick);\n  }\n\n  function onDocClick(e) {\n    if (!pop.contains(e.target) && !btn.contains(e.target)) closePopover();\n  }\n\n  btn.addEventListener('click', function(e) {\n    e.stopPropagation();\n    pop.hidden ? openPopover() : closePopover();\n  });\n\n  pop.addEventListener('click', function(e) {\n    if (e.target.closest('[data-close]')) closePopover();\n    var act = e.target.closest('[data-sheet]');\n    if (act) {\n      closePopover();\n      openSheet(act.getAttribute('data-sheet'));\n    }\n  });\n\n  var todayCareBtn = $('#brTodayCareBtn');\n  if (todayCareBtn) {\n    todayCareBtn.addEventListener('click', function() {\n      closePopover();\n      if (window.plantApp && window.plantApp.showTodaysCareList) {\n        window.plantApp.showTodaysCareList();\n      }\n    });\n  }\n\n  function openSheet(type) {\n    console.log('openSheet called with type:', type);\n    updateStats();\n    if (!sheet) {\n      console.log('sheet element not found');\n      return;\n    }\n\n    var titleEl = $('#brSheetTitle');\n    var bodyEl = $('#brSheetBody');\n    if (!titleEl || !bodyEl) {\n      console.log('titleEl or bodyEl not found');\n      return;\n    }\n\n    var titleMap = {\n      care: '\u30B1\u30A2\u8A73\u7D30',\n      consult: '\u76F8\u8AC7\u306E\u8A73\u7D30',\n      illustration: '\u30A4\u30E9\u30B9\u30C8\u5229\u7528\u72B6\u6CC1',\n      membership: '\u4F1A\u54E1\u30D7\u30E9\u30F3'\n    };\n\n    // \u2605\u2605\u2605 \u623B\u308B\u30DC\u30BF\u30F3\u3092\u542B\u3080HTML\u3092\u751F\u6210 \u2605\u2605\u2605\n    var backButtonHtml = '<button class=\"br-sheet-back\" style=\"background:none;border:none;color:#3b82f6;font-size:14px;font-weight:600;cursor:pointer;padding:8px 12px;margin-right:12px;border-radius:6px;\" onclick=\"(function(){document.getElementById(\\'brSheet\\').setAttribute(\\'aria-hidden\\',\\'true\\');document.getElementById(\\'brUserPopover\\').hidden=false;document.getElementById(\\'brUserBtn\\').setAttribute(\\'aria-expanded\\',\\'true\\');})()\">\u2190 \u30E1\u30CB\u30E5\u30FC</button>';\n    \n    titleEl.innerHTML = backButtonHtml + '<span>' + (titleMap[type] || '\u8A73\u7D30') + '</span>';\n    \n    console.log('titleEl.innerHTML after update:', titleEl.innerHTML);\n\n    bodyEl.innerHTML = '<div class=\"loading\">\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>';\n    sheet.setAttribute('aria-hidden', 'false');\n\n    var fallbackContent = {\n      care: '<div class=\"list\"><div class=\"list-item\">\u30B1\u30A2\u8A73\u7D30\u753B\u9762</div></div>',\n      consult: '<div class=\"list\"><div class=\"list-item\">\u76F8\u8AC7\u8A73\u7D30\u753B\u9762</div></div>',\n      illustration: '<div class=\"list\"><div class=\"list-item\">\u30A4\u30E9\u30B9\u30C8\u8A73\u7D30\u753B\u9762</div></div>',\n      membership: '<div class=\"list\"><div class=\"list-item\">\u4F1A\u54E1\u30D7\u30E9\u30F3\u753B\u9762</div></div>'\n    };\n\n    var apiBase = window.plantApp && window.plantApp.apiBase;\n    if (!apiBase) {\n      console.log('apiBase not found, using fallback');\n      bodyEl.innerHTML = fallbackContent[type] || '<p>\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093</p>';\n      return;\n    }\n\n    fetch(apiBase + '?action=header_stat_list', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({\n        user_email: window.plantApp ? window.plantApp.userEmail : null,\n        entitlement: window.plantApp ? window.plantApp.entitlement : null,\n        entitlement_snapshot: window.plantApp ? window.plantApp.entitlementSnapshot : null,\n        list_type: type\n      })\n    })\n    .then(function(res) {\n      if (!res.ok) {\n        throw new Error('HTTP ' + res.status + ': ' + res.statusText);\n      }\n      return res.json();\n    })\n    .then(function(data) {\n      var items = Array.isArray(data.items) ? data.items : [];\n\n      if (!items.length) {\n        bodyEl.innerHTML = fallbackContent[type] || '<p>\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093</p>';\n        return;\n      }\n\n      var escapeHtml = window.plantApp && window.plantApp.escapeHtml ? \n        window.plantApp.escapeHtml.bind(window.plantApp) : \n        function(text) { return String(text); };\n\n      bodyEl.innerHTML = '<div class=\"list\">' + \n        items.map(function(item) {\n          var label = escapeHtml(item.label || '');\n          var value = escapeHtml(String(item.value != null ? item.value : '\u2014'));\n          return '<div class=\"list-item\"><strong>' + label + '</strong><br><span>' + value + '</span></div>';\n        }).join('') + \n        '</div>';\n    })\n    .catch(function(e) {\n      console.error('header_stat_list error', e);\n\n      var escapeHtml = window.plantApp && window.plantApp.escapeHtml ? \n        window.plantApp.escapeHtml.bind(window.plantApp) : \n        function(text) { return String(text); };\n\n      bodyEl.innerHTML = \n        '<div class=\"error-message\">' +\n        '<h5>\u8A73\u7D30\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F</h5>' +\n        '<p>\u4E00\u6642\u7684\u306A\u901A\u4FE1\u30A8\u30E9\u30FC\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002</p>' +\n        '<p><small>' + escapeHtml(e.message) + '</small></p>' +\n        '<div class=\"error-actions\">' +\n        '<button class=\"btn btn-small btn-secondary\" onclick=\"document.getElementById(\\'brSheet\\').setAttribute(\\'aria-hidden\\',\\'true\\')\">\u9589\u3058\u308B</button>' +\n        '</div>' +\n        '</div>';\n\n      if (window.plantApp && window.plantApp.showTemporaryNotification) {\n        window.plantApp.showTemporaryNotification('\u8A73\u7D30\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F', 'error');\n      }\n    });\n  }\n\n  function closeSheet() {\n    sheet.setAttribute('aria-hidden', 'true');\n  }\n\n  sheet.addEventListener('click', function(e) {\n    if (e.target.matches('[data-sheet-close]') || e.target.matches('.br-sheet-backdrop')) {\n      closeSheet();\n    }\n  });\n\n  document.addEventListener('keydown', function(e) {\n    if (e.key === 'Escape') {\n      closePopover();\n      closeSheet();\n    }\n  });\n\n  if (window.plantApp) {\n    var originalLoadHeaderStats = window.plantApp.loadHeaderStats;\n    if (originalLoadHeaderStats) {\n      window.plantApp.loadHeaderStats = async function() {\n        await originalLoadHeaderStats.call(this);\n        updateStats();\n      };\n    }\n    // \u2605 loadHeaderStats()\u306F\u5143\u3005start()\u5185(#leaflabot-root\u304C\u3042\u308B\u30DA\u30FC\u30B8=/pages/botareco\u306E\u307F)\n    //   \u3067\u3057\u304B\u547C\u3070\u308C\u3066\u304A\u3089\u305A\u3001\u30DE\u30A4\u30DA\u30FC\u30B8\u7B49\u306E\u4ED6\u30DA\u30FC\u30B8\u3067\u306F\u30D8\u30C3\u30C0\u30FC\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u7D71\u8A08\u304C\n    //   \u5E38\u306B0\u306E\u307E\u307E\u3060\u3063\u305F\u3002\u65B0\u30D8\u30C3\u30C0\u30FC\u5236\u5FA1JS\u306F\u5168\u30DA\u30FC\u30B8\u3067\u52D5\u304F\u305F\u3081\u3001\u3053\u3053\u3067\u660E\u793A\u7684\u306B\u547C\u3073\u51FA\u3059\u3002\n    if (window.plantApp.isLoggedIn && typeof window.plantApp.getMembershipType === 'function' &&\n        window.plantApp.getMembershipType() !== 'non_member' && !document.getElementById('leaflabot-root')) {\n      window.plantApp.loadHeaderStats();\n    }\n  }\n\n  console.log('\u65B0\u30D8\u30C3\u30C0\u30FC\u5236\u5FA1JS\u521D\u671F\u5316\u5B8C\u4E86');\n/* \n// ========== \u753B\u50CF\u5727\u7E2E\u95A2\u6570 ==========\nasync compressImage(file, maxWidth = 1200, maxHeight = 1200, quality = 0.8) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    \n    reader.onload = (e) => {\n      const img = new Image();\n      \n      img.onload = () => {\n        // \u30AA\u30EA\u30B8\u30CA\u30EB\u30B5\u30A4\u30BA\n        let width = img.width;\n        let height = img.height;\n        \n        // \u30EA\u30B5\u30A4\u30BA\u8A08\u7B97\n        if (width > maxWidth || height > maxHeight) {\n          const ratio = Math.min(maxWidth / width, maxHeight / height);\n          width = Math.floor(width * ratio);\n          height = Math.floor(height * ratio);\n        }\n        \n        // Canvas\u4F5C\u6210\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        \n        const ctx = canvas.getContext('2d');\n        ctx.drawImage(img, 0, 0, width, height);\n        \n        // \u5727\u7E2E\u3057\u3066base64\u306B\u5909\u63DB\n        canvas.toBlob(\n          (blob) => {\n            const compressedReader = new FileReader();\n            compressedReader.onloadend = () => {\n              const base64 = compressedReader.result.split(',')[1];\n              console.log(`\uD83D\uDCCA \u753B\u50CF\u5727\u7E2E: ${(file.size / 1024).toFixed(1)}KB \u2192 ${(blob.size / 1024).toFixed(1)}KB`);\n              resolve({\n                base64: base64,\n                mimeType: blob.type,\n                originalSize: file.size,\n                compressedSize: blob.size\n              });\n            };\n            compressedReader.readAsDataURL(blob);\n          },\n          file.type,\n          quality\n        );\n      };\n      \n      img.onerror = () => reject(new Error('\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F'));\n      img.src = e.target.result;\n    };\n    \n    reader.onerror = () => reject(new Error('\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F'));\n    reader.readAsDataURL(file);\n  });\n}\n*/\n// ============================================================\n// \u30A4\u30E9\u30B9\u30C8\u30B0\u30C3\u30BA\u6CE8\u6587\u30D5\u30ED\u30FC\uFF08Printful \u00D7 Shopify Draft Order\uFF09\n// ============================================================\n\nwindow.plantApp = window.plantApp || {};\n\nObject.assign(window.plantApp, {\n\n  // ============================================================\n  // supabaseFetch: process-consultation \u3078\u306E\u5171\u901A\u30D5\u30A7\u30C3\u30C1\u30D8\u30EB\u30D1\u30FC\n  // ============================================================\n  async supabaseFetch(actionName, data) {\n    const apiBase = this.apiBase || 'https://laixgcjvowdszrtdpxlq.supabase.co/functions/v1/process-consultation';\n    const headers = { 'Content-Type': 'application/json' };\n    const res = await fetch(`${apiBase}?action=${actionName}`, {\n      method: 'POST',\n      headers,\n      body: JSON.stringify({\n        user_email: this.userEmail || '',\n        entitlement: this.entitlement || null,\n        ...data,\n      }),\n    });\n    if (!res.ok) {\n      const err = await res.json().catch(() => ({}));\n      throw new Error(err.error || `HTTP ${res.status}`);\n    }\n    return res.json();\n  },\n\n  // ============================================================\n  // uploadImageForIllustShop: \u30A4\u30E9\u30B9\u30C8\u30B7\u30E7\u30C3\u30D7\u7528\u753B\u50CF\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\n  // ============================================================\n  async uploadImageForIllustShop(file) {\n    const uploadBase = 'https://laixgcjvowdszrtdpxlq.supabase.co/functions/v1/generate-upload-url';\n    const urlRes = await fetch(uploadBase, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ filename: file.name, contentType: file.type }),\n    });\n    if (!urlRes.ok) throw new Error('\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9URL\u53D6\u5F97\u5931\u6557');\n    const { upload_url, public_url } = await urlRes.json();\n    const putRes = await fetch(upload_url, { method: 'PUT', body: file, headers: { 'Content-Type': file.type } });\n    if (!putRes.ok) throw new Error('\u30D5\u30A1\u30A4\u30EB\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u5931\u6557');\n    return public_url;\n  },\n\n  // \u30E2\u30FC\u30C0\u30EB\u3092\u958B\u3044\u3066\u30AB\u30BF\u30ED\u30B0\u3092\u53D6\u5F97\n  async openIllustrationShop(illustrationUrl, postId) {\n    this._illus = { illustrationUrl, postId: postId || null, selectedCatalogId: null, selectedVariantId: null, mockupUrl: null };\n\n    let modal = document.getElementById('illustration-shop-modal');\n    if (!modal) {\n      modal = document.createElement('div');\n      modal.id = 'illustration-shop-modal';\n      modal.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9999;display:flex;align-items:center;justify-content:center;padding:16px;';\n      modal.innerHTML = `\n        <div style=\"background:#fff;border-radius:12px;max-width:540px;width:100%;max-height:90vh;overflow-y:auto;padding:24px;\">\n          <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;\">\n            <h3 style=\"margin:0;font-size:18px;\">\uD83D\uDECD \u30A4\u30E9\u30B9\u30C8\u30B0\u30C3\u30BA\u3092\u4F5C\u308B</h3>\n            <button onclick=\"document.getElementById('illustration-shop-modal').remove()\" style=\"background:none;border:none;font-size:22px;cursor:pointer;\">\u2715</button>\n          </div>\n          <div style=\"display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap;\">\n            <img src=\"${illustrationUrl}\" alt=\"\u30A4\u30E9\u30B9\u30C8\" style=\"width:120px;height:120px;object-fit:cover;border-radius:8px;border:1px solid #eee;\">\n            <div id=\"illus-mockup-preview\" style=\"width:120px;height:120px;border-radius:8px;border:2px dashed #ccc;display:flex;align-items:center;justify-content:center;color:#999;font-size:12px;\">\n              \u5546\u54C1\u3092\u9078\u629E\u3057\u3066\u30D7\u30EC\u30D3\u30E5\u30FC\n            </div>\n          </div>\n          <div id=\"illus-catalog-list\" style=\"display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-bottom:16px;\">\n            <div style=\"text-align:center;padding:20px;color:#999;\">\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>\n          </div>\n          <div id=\"illus-shipping-form\" style=\"display:none;\">\n            <h4 style=\"margin:0 0 12px;font-size:15px;\">\u914D\u9001\u5148\u60C5\u5831</h4>\n            <div style=\"display:flex;flex-direction:column;gap:8px;\">\n              <input id=\"illus-ship-name\" placeholder=\"\u6C0F\u540D\uFF08\u4F8B: \u7530\u4E2D \u592A\u90CE\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n              <input id=\"illus-ship-zip\" placeholder=\"\u90F5\u4FBF\u756A\u53F7\uFF08\u4F8B: 150-0002\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n              <input id=\"illus-ship-province\" placeholder=\"\u90FD\u9053\u5E9C\u770C\uFF08\u4F8B: \u6771\u4EAC\u90FD\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n              <input id=\"illus-ship-city\" placeholder=\"\u5E02\u533A\u753A\u6751\uFF08\u4F8B: \u6E0B\u8C37\u533A\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n              <input id=\"illus-ship-address1\" placeholder=\"\u756A\u5730\u30FB\u5EFA\u7269\u540D\uFF08\u4F8B: \u6E0B\u8C371-1-1\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n              <input id=\"illus-ship-phone\" placeholder=\"\u96FB\u8A71\u756A\u53F7\uFF08\u4F8B: 090-1234-5678\uFF09\" style=\"border:1px solid #ddd;border-radius:6px;padding:8px 12px;font-size:14px;\">\n            </div>\n          </div>\n          <div id=\"illus-step-nav\" style=\"margin-top:16px;display:flex;gap:8px;justify-content:flex-end;\">\n            <button id=\"illus-btn-preview\" onclick=\"window.plantApp.illusPreviewMockup()\" disabled\n              style=\"background:#4caf50;color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:14px;cursor:pointer;opacity:.5;\">\n              \u30D7\u30EC\u30D3\u30E5\u30FC\u78BA\u8A8D\n            </button>\n            <button id=\"illus-btn-order\" style=\"display:none;background:#ff6d00;color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:14px;cursor:pointer;\"\n              onclick=\"window.plantApp.illusSubmitOrder()\">\n              \u6CE8\u6587\u624B\u7D9A\u304D\u3078 \u2192\n            </button>\n          </div>\n          <p id=\"illus-status-msg\" style=\"margin:8px 0 0;font-size:13px;color:#666;min-height:20px;\"></p>\n        </div>`;\n      document.body.appendChild(modal);\n    }\n    modal.style.display = 'flex';\n    await this.illusLoadCatalog(illustrationUrl);\n  },\n\n  async illusLoadCatalog(illustrationUrl) {\n    const listEl = document.getElementById('illus-catalog-list');\n    try {\n      const res = await this.supabaseFetch('get_illustration_catalog', {});\n      const catalog = res.catalog || [];\n      if (!catalog.length) { listEl.innerHTML = '<div style=\"color:#999;text-align:center;padding:20px;\">\u5546\u54C1\u304C\u3042\u308A\u307E\u305B\u3093</div>'; return; }\n      listEl.innerHTML = catalog.map(item => `\n        <div class=\"illus-catalog-item\" data-id=\"${item.id}\"\n          data-variant=\"${item.printful_variant_ids[0]}\"\n          onclick=\"window.plantApp.illusSelectItem('${item.id}', ${item.printful_variant_ids[0]})\"\n          style=\"border:2px solid #eee;border-radius:8px;padding:10px;cursor:pointer;text-align:center;transition:.2s;\">\n          ${item.image_url ? `<img src=\"${item.image_url}\" style=\"width:60px;height:60px;object-fit:cover;border-radius:4px;margin-bottom:6px;\">` : `<div style=\"width:60px;height:60px;background:#f5f5f5;border-radius:4px;margin:0 auto 6px;display:flex;align-items:center;justify-content:center;font-size:24px;\">\uD83D\uDCE6</div>`}\n          <div style=\"font-weight:600;font-size:13px;\">${item.name}</div>\n          <div style=\"color:#ff6d00;font-size:13px;margin-top:2px;\">\u00A5${item.price_jpy.toLocaleString()}</div>\n        </div>`).join('');\n    } catch (e) {\n      listEl.innerHTML = `<div style=\"color:red;padding:20px;\">${e.message}</div>`;\n    }\n  },\n\n  illusSelectItem(catalogId, variantId) {\n    this._illus.selectedCatalogId = catalogId;\n    this._illus.selectedVariantId = variantId;\n    this._illus.mockupUrl = null;\n    document.querySelectorAll('.illus-catalog-item').forEach(el => {\n      el.style.borderColor = el.dataset.id === catalogId ? '#4caf50' : '#eee';\n    });\n    const previewBtn = document.getElementById('illus-btn-preview');\n    previewBtn.disabled = false;\n    previewBtn.style.opacity = '1';\n    document.getElementById('illus-shipping-form').style.display = 'none';\n    document.getElementById('illus-btn-order').style.display = 'none';\n    document.getElementById('illus-mockup-preview').innerHTML = '<span style=\"font-size:12px;color:#999;\">\u30D7\u30EC\u30D3\u30E5\u30FC\u30DC\u30BF\u30F3\u3067\u78BA\u8A8D</span>';\n    document.getElementById('illus-status-msg').textContent = '';\n  },\n\n  async illusPreviewMockup() {\n    const { illustrationUrl, selectedCatalogId, selectedVariantId } = this._illus;\n    if (!selectedCatalogId) return;\n    const statusEl = document.getElementById('illus-status-msg');\n    const previewEl = document.getElementById('illus-mockup-preview');\n    statusEl.textContent = '\u23F3 \u30E2\u30C3\u30AF\u30A2\u30C3\u30D7\u751F\u6210\u4E2D\uFF08\u301C30\u79D2\uFF09...';\n    document.getElementById('illus-btn-preview').disabled = true;\n    try {\n      const userState = this.getUserState ? this.getUserState() : {};\n      const res = await this.supabaseFetch('create_illustration_mockup', {\n        user_email: userState.userEmail || window.__leafla_user_email,\n        entitlement: userState.entitlement || window.__leafla_entitlement,\n        illustration_url: illustrationUrl,\n        catalog_item_id: selectedCatalogId,\n        variant_id: selectedVariantId,\n      });\n      if (!res.success) throw new Error(res.error);\n      this._illus.mockupUrl = res.mockup_url;\n      previewEl.innerHTML = `<img src=\"${res.mockup_url}\" alt=\"\u30E2\u30C3\u30AF\u30A2\u30C3\u30D7\" style=\"width:100%;height:100%;object-fit:cover;border-radius:6px;\">`;\n      statusEl.textContent = '\u2705 \u30D7\u30EC\u30D3\u30E5\u30FC\u5B8C\u4E86\u3002\u914D\u9001\u5148\u3092\u5165\u529B\u3057\u3066\u6CE8\u6587\u3078\u9032\u3093\u3067\u304F\u3060\u3055\u3044\u3002';\n      document.getElementById('illus-shipping-form').style.display = 'block';\n      document.getElementById('illus-btn-order').style.display = 'inline-block';\n    } catch (e) {\n      statusEl.textContent = '\u274C ' + e.message;\n    } finally {\n      document.getElementById('illus-btn-preview').disabled = false;\n    }\n  },\n\n  async illusSubmitOrder() {\n    const { illustrationUrl, postId, selectedCatalogId, selectedVariantId } = this._illus;\n    const name = document.getElementById('illus-ship-name')?.value.trim();\n    const zip = document.getElementById('illus-ship-zip')?.value.trim();\n    const province = document.getElementById('illus-ship-province')?.value.trim();\n    const city = document.getElementById('illus-ship-city')?.value.trim();\n    const address1 = document.getElementById('illus-ship-address1')?.value.trim();\n    const phone = document.getElementById('illus-ship-phone')?.value.trim();\n    if (!name || !zip || !province || !city || !address1) {\n      document.getElementById('illus-status-msg').textContent = '\u274C \u6C0F\u540D\u30FB\u90F5\u4FBF\u756A\u53F7\u30FB\u4F4F\u6240\u306F\u5FC5\u9808\u3067\u3059';\n      return;\n    }\n    const statusEl = document.getElementById('illus-status-msg');\n    statusEl.textContent = '\u23F3 \u6CE8\u6587\u3092\u4F5C\u6210\u4E2D...';\n    document.getElementById('illus-btn-order').disabled = true;\n    try {\n      const userState = this.getUserState ? this.getUserState() : {};\n      const res = await this.supabaseFetch('create_illustration_order', {\n        user_email: userState.userEmail || window.__leafla_user_email,\n        entitlement: userState.entitlement || window.__leafla_entitlement,\n        post_id: postId || null,\n        illustration_url: illustrationUrl,\n        catalog_item_id: selectedCatalogId,\n        printful_variant_id: selectedVariantId,\n        shipping: { name, zip, province, city, address1, phone, country_code: 'JP' },\n      });\n      if (!res.success) throw new Error(res.error);\n      // Shopify \u30C1\u30A7\u30C3\u30AF\u30A2\u30A6\u30C8\u3078\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\n      document.getElementById('illustration-shop-modal')?.remove();\n      window.location.href = res.checkout_url;\n    } catch (e) {\n      statusEl.textContent = '\u274C ' + e.message;\n      document.getElementById('illus-btn-order').disabled = false;\n    }\n  },\n\n});\n\n})();\n// END OF COMPLETE INTEGRATED JAVASCRIPT\n// LEAFLA\u690D\u7269\u80B2\u6210\u8A18\u9332\u30B7\u30B9\u30C6\u30E0 v17.1.0\u5B8C\u5168\u7D71\u5408\u7248\n// \u5168\u6A5F\u80FD\u5B9F\u88C5\u5B8C\u4E86\u30FBnano-banana\u7D71\u5408\u30FB\u69CB\u6587\u30A8\u30E9\u30FC\u4FEE\u6B63\u6E08\u307F\n\n\n\n"],
  "mappings": "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",
  "names": ["consultQuota", "alert", "unbookmarkBtn"]
}
