Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/search.kt.map

1 line
53 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"sources":["pages/mall/consumer/search.uvue","pages/user/profile.uvue","uni_modules/ak-req/ak-req.uts","pages/mall/consumer/index.uvue","pages/user/change-password.uvue","pages/user/terms.uvue","pages/user/login.uvue","pages/user/center.uvue"],"sourcesContent":["<template>\r\n\t<view class=\"search-page\">\r\n\t\t<!-- 搜索头部 -->\r\n\t\t<view class=\"search-header\" :style=\"{ paddingTop: statusBarHeight + 'px' }\">\r\n\t\t\t<view class=\"search-bar-container\">\r\n\t\t\t\t<!-- 返回按钮:小于号加粗 -->\r\n\t\t\t\t<view class=\"back-btn\" @click=\"goBack\">\r\n\t\t\t\t\t<text class=\"back-icon\">&lt;</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<!-- 搜索框 -->\r\n\t\t\t\t<view class=\"search-input-container\">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass=\"search-input\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t:value=\"searchKeyword\"\r\n\t\t\t\t\t\t@input=\"onInput\"\r\n\t\t\t\t\t\t@confirm=\"onSearch\"\r\n\t\t\t\t\t\tplaceholder=\"请输入商品名称、店铺\"\r\n\t\t\t\t\t\tplaceholder-class=\"placeholder\"\r\n\t\t\t\t\t\t:focus=\"autoFocus\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 清除按钮 -->\r\n\t\t\t\t\t<view v-if=\"searchKeyword\" class=\"clear-btn\" @click=\"clearSearch\">\r\n\t\t\t\t\t\t<text class=\"clear-icon\">×</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 相机图标 -->\r\n\t\t\t\t\t<view class=\"camera-btn\" @click=\"openCamera\">\r\n\t\t\t\t\t\t<text class=\"camera-icon\">📷</text>\r\n\t\t\t\t\t</view>\r\n\r\n\t\t\t\t\t<!-- 搜索按钮:移入输入框内部 -->\r\n\t\t\t\t\t<view class=\"inner-search-btn\" @click=\"onSearch\">\r\n\t\t\t\t\t\t<text class=\"inner-search-text\">搜索</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 错误状态(模拟服务器超时) -->\r\n\t\t<view v-if=\"isError\" class=\"error-state\" @click=\"retryLoad\">\r\n\t\t\t<view class=\"error-content\">\r\n\t\t\t\t<text class=\"error-icon\">⚠️</text>\r\n\t\t\t\t<text class=\"error-title\">加载服务器超时</text>\r\n\t\t\t\t<text class=\"error-desc\">请点击屏幕重试</text>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 主内容区域 -->\r\n\t\t<scroll-view \r\n\t\t\tv-else \r\n\t\t\tscroll-y \r\n\t\t\tclass=\"main-content\" \r\n\t\t\t:style=\"{ height: scrollHeight + 'px' }\"\r\n\t\t\t@scrolltolower=\"loadMore\"\r\n\t\t>\r\n\t\t\t<!-- 初始状态(无搜索词) -->\r\n\t\t\t<view v-if=\"!searchKeyword && !showResults\">\r\n\t\t\t\t<!-- 搜索历史 -->\r\n\t\t\t\t<view v-if=\"searchHistory.length > 0\" class=\"search-history\">\r\n\t\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t\t<text class=\"section-title\">搜索历史</text>\r\n\t\t\t\t\t\t<view class=\"header-right\" @click=\"clearHistory\">\r\n\t\t\t\t\t\t\t<text class=\"clear-text\">清空</text>\r\n\t\t\t\t\t\t\t<text class=\"clear-icon-trash\">🗑️</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"history-tags\">\r\n\t\t\t\t\t\t<view\r\n\t\t\t\t\t\t\tv-for=\"(item, index) in searchHistory\"\r\n\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\tclass=\"history-tag\"\r\n\t\t\t\t\t\t\t@click=\"searchFromHistory(item)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<text class=\"history-text\">{{ item }}</text>\r\n\t\t\t\t\t\t\t<view class=\"delete-tag-btn\" @click.stop=\"deleteHistoryItem(index)\">\r\n\t\t\t\t\t\t\t\t<text class=\"delete-icon\">×</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\r\n\t\t\t\t<!-- 热门搜索 -->\r\n\t\t\t\t<view class=\"hot-search\">\r\n\t\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t\t<text class=\"section-title\">热门搜索</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"hot-tags\">\r\n\t\t\t\t\t\t<view\r\n\t\t\t\t\t\t\tv-for=\"(item, index) in hotSearchList\"\r\n\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\tclass=\"hot-tag\"\r\n\t\t\t\t\t\t\t:class=\"{ 'hot': item.hot }\"\r\n\t\t\t\t\t\t\t@click=\"searchFromHot(item.keyword)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<text class=\"hot-rank\" :class=\"{ 'top-three': index < 3 }\">{{ index + 1 }}</text>\r\n\t\t\t\t\t\t\t<text class=\"hot-text\">{{ item.keyword }}</text>\r\n\t\t\t\t\t\t\t<text v-if=\"item.hot\" class=\"hot-icon\">🔥</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<!-- 猜你需要 (新增功能) -->\r\n\t\t\t\t<view class=\"guess-you-like\">\r\n\t\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t\t<view class=\"title-with-icon\">\r\n\t\t\t\t\t\t\t<text class=\"section-icon\">✨</text>\r\n\t\t\t\t\t\t\t<text class=\"section-title\">猜你需要</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"refresh-btn\" @click=\"refreshGuessList\">换一批</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"guess-grid\">\r\n\t\t\t\t\t\t<view \r\n\t\t\t\t\t\t\tv-for=\"item in guessList\" \r\n\t\t\t\t\t\t\t:key=\"item.id\" \r\n\t\t\t\t\t\t\tclass=\"guess-item\"\r\n\t\t\t\t\t\t\t@click=\"viewProductDetail(item)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<view class=\"guess-img-box\">\r\n\t\t\t\t\t\t\t\t<image class=\"guess-img\" :src=\"item.image\" mode=\"aspectFill\" />\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"guess-info\">\r\n\t\t\t\t\t\t\t\t<text class=\"guess-name\">{{ item.name }}</text>\r\n\t\t\t\t\t\t\t\t<view class=\"guess-price-row\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"price-symbol\">¥</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"price-num\">{{ item.price }}</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"sales-text\">已售{{ item.sales }}</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 搜索建议 -->\r\n\t\t\t<view v-if=\"searchKeyword && !showResults\" class=\"search-suggestions\">\r\n\t\t\t\t<view class=\"suggestions-list\">\r\n\t\t\t\t\t<view\r\n\t\t\t\t\t\tv-for=\"(suggestion, index) in searchSuggestions\"\r\n\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\tclass=\"suggestion-item\"\r\n\t\t\t\t\t\t@click=\"selectSuggestion(suggestion)\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<view class=\"suggestion-icon\">🔍</view>\r\n\t\t\t\t\t\t<text class=\"suggestion-text\">{{ suggestion }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 搜索结果 -->\r\n\t\t\t<view v-if=\"showResults\" class=\"search-results\">\r\n\t\t\t\t<!-- 店铺搜索结果 -->\r\n\t\t\t\t<view v-if=\"searchShopResults.length > 0\" class=\"shop-results-section\">\r\n\t\t\t\t\t<view class=\"section-top\">\r\n\t\t\t\t\t\t<text class=\"result-title-sm\">相关店铺</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<scroll-view scroll-x class=\"shop-list-scroll\">\r\n\t\t\t\t\t\t<view class=\"shop-list-row\">\r\n\t\t\t\t\t\t\t<view \r\n\t\t\t\t\t\t\t\tv-for=\"shop in searchShopResults\" \r\n\t\t\t\t\t\t\t\t:key=\"shop.id\" \r\n\t\t\t\t\t\t\t\tclass=\"shop-card\"\r\n\t\t\t\t\t\t\t\t@click=\"viewShopDetail(shop)\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<image class=\"shop-logo\" :src=\"shop.logo\" mode=\"aspectFill\" />\r\n\t\t\t\t\t\t\t\t<view class=\"shop-info\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"shop-name-txt\">{{ shop.name }}</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"shop-products-txt\">共{{ shop.productCount }}件商品</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</scroll-view>\r\n\t\t\t\t</view>\r\n\r\n\t\t\t\t<view class=\"results-header\">\r\n\t\t\t\t\t<text class=\"results-title\">商品结果</text>\r\n\t\t\t\t\t<view class=\"filter-tabs\">\r\n\t\t\t\t\t\t<text \r\n\t\t\t\t\t\t\tclass=\"filter-tab\" \r\n\t\t\t\t\t\t\t:class=\"{ active: activeSort === 'default' }\"\r\n\t\t\t\t\t\t\t@click=\"switchSort('default')\"\r\n\t\t\t\t\t\t>综合</text>\r\n\t\t\t\t\t\t<text \r\n\t\t\t\t\t\t\tclass=\"filter-tab\" \r\n\t\t\t\t\t\t\t:class=\"{ active: activeSort === 'sales' }\"\r\n\t\t\t\t\t\t\t@click=\"switchSort('sales')\"\r\n\t\t\t\t\t\t>销量</text>\r\n\t\t\t\t\t\t<text \r\n\t\t\t\t\t\t\tclass=\"filter-tab\" \r\n\t\t\t\t\t\t\t:class=\"{ active: activeSort === 'price' }\"\r\n\t\t\t\t\t\t\t@click=\"switchSort('price')\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t价格 {{ activeSort === 'price' ? (priceSortAsc ? '↑' : '↓') : '' }}\r\n\t\t\t\t\t\t</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<view v-if=\"searchResults.length > 0\" class=\"results-list\">\r\n\t\t\t\t\t<view\r\n\t\t\t\t\t\tv-for=\"product in searchResults\"\r\n\t\t\t\t\t\t:key=\"product.id\"\r\n\t\t\t\t\t\tclass=\"result-item\"\r\n\t\t\t\t\t\t@click=\"viewProductDetail(product)\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<image class=\"product-image\" :src=\"product.image\" mode=\"aspectFill\" />\r\n\t\t\t\t\t\t<view class=\"product-info\">\r\n\t\t\t\t\t\t\t<text class=\"product-name\">{{ product.name }}</text>\r\n\t\t\t\t\t\t\t<view class=\"product-tags-row\" v-if=\"product.tag\">\r\n\t\t\t\t\t\t\t\t<text class=\"product-tag\">{{ product.tag }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<text class=\"product-spec\">{{ product.specification }}</text>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<view class=\"product-bottom\">\r\n\t\t\t\t\t\t\t\t<view class=\"price-box\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"price-symbol\">¥</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"price-value\">{{ product.price }}</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view class=\"add-cart-btn\" @click.stop=\"addToCart(product)\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"cart-icon\">+</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<!-- 空结果 - 仅在非加载状态且无结果时显示 -->\r\n\t\t\t\t<view v-if=\"!loading && searchResults.length === 0\" class=\"empty-result\">\r\n\t\t\t\t\t<text class=\"empty-icon\">🤔</text>\r\n\t\t\t\t\t<text class=\"empty-text\">未找到相关商品</text>\r\n\t\t\t\t\t<text class=\"empty-sub\">换个关键词试试吧</text>\r\n\t\t\t\t</view>\r\n\r\n\t\t\t\t<!-- 加载更多/加载中 - 在加载状态或有更多数据时显示 -->\r\n\t\t\t\t<view v-if=\"loading\" class=\"loading-more\">\r\n\t\t\t\t\t<view class=\"loading-spinner\"></view>\r\n\t\t\t\t\t<text class=\"loading-text\">加载中...</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<view v-if=\"!hasMore && searchResults.length > 0\" class=\"no-more\">\r\n\t\t\t\t\t<text class=\"no-more-text\">--- 到底了 ---</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 底部安全区域 -->\r\n\t\t\t<view class=\"safe-area\"></view>\r\n\t\t</scroll-view>\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, reactive, onMounted, computed } from 'vue'\r\nimport { supabaseService } from '@/utils/supabaseService.uts'\r\nimport type { Product } from '@/utils/supabaseService.uts'\r\n\r\n// 状态定义\r\nconst statusBarHeight = ref(0)\r\nconst scrollHeight = ref(0)\r\nconst searchKeyword = ref('')\r\nconst showResults = ref(false)\r\nconst loading = ref(false)\r\nconst hasMore = ref(true)\r\nconst isError = ref(false) // 错误状态控制\r\nconst autoFocus = ref(true)\r\nconst activeSort = ref('default') // 当前排序方式: default, sales, price\r\nconst priceSortAsc = ref(false) // 价格排序是否为升序\r\n\r\n// 数据定义\r\nconst searchHistory = ref<string[]>([])\r\nconst hotSearchList = ref<any[]>([])\r\nconst guessList = ref<any[]>([])\r\nconst allGuessItems = ref<any[]>([]) // 缓存所有猜你喜欢商品\r\nconst searchResults = ref<any[]>([])\r\nconst searchShopResults = ref<any[]>([]) // 搜索到的店铺\r\n\r\n\r\n\r\nonMounted(() => {\r\n\tinitPage()\r\n})\r\n\r\n\r\nconst initPage = () => {\r\n\ttry {\r\n\t\tconst systemInfo = uni.getSystemInfoSync()\r\n\t\tstatusBarHeight.value = systemInfo.statusBarHeight ?? 0\r\n\t\tconst windowHeight = systemInfo.windowHeight\r\n\t\t// 减去头部高度 (约60px + statusBarHeight)\r\n\t\tscrollHeight.value = windowHeight - (60 + statusBarHeight.value)\r\n\t\t\r\n\t\tloadData()\r\n\t\t\r\n\t\t// 检查页面参数\r\n\t\tconst pages = getCurrentPages()\r\n\t\tif (pages.length > 0) {\r\n\t\t\tconst currentPage = pages[pages.length - 1]\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst options = currentPage.options\r\n\t\t\tif (options && options['keyword']) {\r\n\t\t\t\tconst keyword = decodeURIComponent(options['keyword'])\r\n\t\t\t\tsearchKeyword.value = keyword\r\n\t\t\t\t\r\n\t\t\t\tif (options['type'] === 'family' || options['type'] === 'brand') {\r\n\t\t\t\t\t// 如果是家庭常备药或品牌类型,直接添加到历史并搜索\r\n\t\t\t\t\tif (options['type'] === 'family') {\r\n\t\t\t\t\t addToHistory(keyword)\r\n }\r\n\t\t\t\t\t// 立即显示结果区域并设置为加载中\r\n\t\t\t\t\tshowResults.value = true\r\n\t\t\t\t\tloading.value = true\r\n\t\t\t\t\t// 确保searchResults不为空数组导致闪烁虽然loading=true已经拦截了empty-result但双重保险\r\n\t\t\t\t\t// 此时不要置空searchResults或者给一个初始值\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 直接调用搜索移除setTimeout防止中间状态\r\n\t\t\t\t\tperformSearch()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (e) {\r\n\t\tconsole.error('初始化失败', e)\r\n\t\tisError.value = true\r\n\t}\r\n}\r\n\r\n// 加载基础数据\r\nconst loadData = async () => {\r\n\tisError.value = false\r\n\t\r\n\ttry {\r\n loadSearchHistory()\r\n // 获取热门商品作为热门搜索推荐和猜你喜欢\r\n // 获取更多数据以便\"换一批\"\r\n const hotProducts = await supabaseService.getHotProducts(30)\r\n \r\n hotSearchList.value = hotProducts.slice(0, 10).map((p: any) => ({\r\n keyword: p.name,\r\n hot: true\r\n }))\r\n \r\n allGuessItems.value = hotProducts.map((p: any) => ({\r\n id: p.id,\r\n name: p.name,\r\n price: p.base_price,\r\n image: p.main_image_url ?? '/static/default.jpg',\r\n sales: typeof p.sale_count === 'number' ? p.sale_count : 0\r\n }))\r\n \r\n // 初始显示随机6个\r\n refreshGuessListItems()\r\n\r\n\t} catch (e) {\r\n\t\tconsole.error('Load data failed', e)\r\n\t\tisError.value = true\r\n\t}\r\n}\r\n\r\n// 点击重试\r\nconst retryLoad = () => {\r\n\tuni.showLoading({ title: '重新加载中' })\r\n\tsetTimeout(() => {\r\n\t\tuni.hideLoading()\r\n\t\tloadData()\r\n\t}, 1000)\r\n}\r\n\r\n// 历史记录管理\r\nconst loadSearchHistory = () => {\r\n\tconst history = uni.getStorageSync('searchHistory')\r\n\tif (history) {\r\n\t\ttry {\r\n\t\t\t// 确保是数组\r\n\t\t\tconst parsed = JSON.parse(history as string)\r\n\t\t\tif (Array.isArray(parsed)) {\r\n\t\t\t\tsearchHistory.value = parsed as string[]\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tsearchHistory.value = []\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst saveSearchHistory = () => {\r\n\tuni.setStorageSync('searchHistory', JSON.stringify(searchHistory.value))\r\n}\r\n\r\nconst addToHistory = (keyword: string) => {\r\n\tif (keyword == '') return\r\n\tconst index = searchHistory.value.indexOf(keyword)\r\n\tif (index > -1) {\r\n\t\tsearchHistory.value.splice(index, 1)\r\n\t}\r\n\tsearchHistory.value.unshift(keyword)\r\n\tif (searchHistory.value.length > 10) searchHistory.value.pop()\r\n\tsaveSearchHistory()\r\n}\r\n\r\nconst clearHistory = () => {\r\n\tuni.showModal({\r\n\t\ttitle: '提示',\r\n\t\tcontent: '确定清空搜索历史吗?',\r\n\t\tsuccess: (res) => {\r\n\t\t\tif (res.confirm) {\r\n\t\t\t\tsearchHistory.value = []\r\n\t\t\t\tuni.removeStorageSync('searchHistory')\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst deleteHistoryItem = (index: number) => {\r\n\tsearchHistory.value.splice(index, 1)\r\n\tsaveSearchHistory()\r\n}\r\n\r\n// 搜索建议 - 改为实时获取\r\nconst searchSuggestions = ref<string[]>([])\r\nlet suggestTimer = 0\r\n\r\n// 搜索逻辑\r\nconst onInput = (e: any) => {\r\n\tconst val = e.detail.value\r\n searchKeyword.value = val\r\n\tif (val == '') {\r\n\t\tshowResults.value = false\r\n searchSuggestions.value = []\r\n return\r\n\t}\r\n \r\n // Debounce suggestion search\r\n if (suggestTimer > 0) clearTimeout(suggestTimer)\r\n suggestTimer = setTimeout(() => {\r\n fetchSuggestions(val)\r\n }, 300)\r\n}\r\n\r\nconst fetchSuggestions = async (kw: string) => {\r\n if (kw == '' || showResults.value) return\r\n \r\n // 简单搜索前5个相关商品作为建议\r\n try {\r\n const res = await supabaseService.searchProducts(kw.trim(), 1, 5)\r\n if (Array.isArray(res.data) && res.data.length > 0) {\r\n // 去重\r\n const names = res.data.map((p:any) :string => {\r\n if(p instanceof UTSJSONObject){\r\n return p.getString('name') ?? ''\r\n }\r\n return p['name'] as string\r\n })\r\n // @ts-ignore\r\n searchSuggestions.value = Array.from(new Set(names))\r\n } else {\r\n searchSuggestions.value = []\r\n }\r\n } catch(e) {\r\n searchSuggestions.value = []\r\n }\r\n}\r\n\r\nconst clearSearch = () => {\r\n\tsearchKeyword.value = ''\r\n\tshowResults.value = false\r\n}\r\n\r\nconst onSearch = () => {\r\n\tif (searchKeyword.value.trim() == '') return\r\n\taddToHistory(searchKeyword.value.trim())\r\n\tperformSearch()\r\n}\r\n\r\nconst searchFromHistory = (keyword: string) => {\r\n\tsearchKeyword.value = keyword\r\n\tperformSearch()\r\n}\r\n\r\nconst searchFromHot = (keyword: string) => {\r\n\tsearchKeyword.value = keyword\r\n\taddToHistory(keyword)\r\n\tperformSearch()\r\n}\r\n\r\nconst selectSuggestion = (suggestion: string) => {\r\n\tsearchKeyword.value = suggestion\r\n\taddToHistory(suggestion)\r\n\tperformSearch()\r\n}\r\n\r\nconst currentPage = ref(1)\r\n\r\nconst performSearch = async () => {\r\n\t// 再次强制设置状态,确保万无一失\r\n\tshowResults.value = true\r\n\tloading.value = true\r\n\t// 重置页码\r\n\tcurrentPage.value = 1\r\n\t\r\n\t// 使用 Supabase 搜索真实数据\r\n\tconst keyword = searchKeyword.value.trim()\r\n\tif (keyword == '') {\r\n\t\tloading.value = false\r\n\t\treturn\r\n\t}\r\n\t\r\n\t// 确定排序方式\r\n\tlet sortBy = 'sales'\r\n\tlet ascending = false\r\n\tif (activeSort.value === 'price') {\r\n\t\tsortBy = 'price'\r\n\t\tascending = priceSortAsc.value\r\n\t} else if (activeSort.value === 'default') {\r\n sortBy = 'default'\r\n }\r\n\t\r\n try {\r\n // 并行请求:商品搜索 + 店铺搜索\r\n const [prodResp, shopResp] = await Promise.all([\r\n supabaseService.searchProducts(keyword, currentPage.value, 20, sortBy, ascending),\r\n // 只有第一页搜索且非价格排序时搜索店铺,避免重复和无关搜索\r\n currentPage.value === 1 && activeSort.value === 'default' \r\n ? supabaseService.searchShops(keyword) \r\n : Promise.resolve({ data: [], total: 0, page: 1, limit: 0, hasmore: false })\r\n ])\r\n \r\n // 处理店铺结果\r\n if (shopResp.data.length > 0) {\r\n searchShopResults.value = shopResp.data.map((s: any) => ({\r\n id: s.id,\r\n name: s.shop_name,\r\n logo: s.shop_logo ?? '/static/shop_logo_default.png',\r\n productCount: s.product_count ?? 0\r\n }))\r\n } else {\r\n searchShopResults.value = []\r\n }\r\n\r\n // 处理商品结果\r\n searchResults.value = prodResp.data.map((p: any) => {\r\n let tag = ''\r\n if (p.tags) {\r\n try {\r\n const tags = (typeof p.tags === 'string') ? JSON.parse(p.tags) : p.tags\r\n if (Array.isArray(tags) && tags.length > 0) tag = String(tags[0])\r\n } catch(e) {}\r\n }\r\n \r\n return {\r\n id: p.id,\r\n name: p.name,\r\n image: p.main_image_url ?? '/static/default.jpg',\r\n price: p.base_price,\r\n specification: p.specification ?? '标准规格',\r\n tag: tag,\r\n sales: p.sale_count ?? 0\r\n }\r\n })\r\n \r\n hasMore.value = prodResp.hasmore\r\n } catch(e) {\r\n console.error('Search failed', e)\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n// 切换排序\r\nconst switchSort = (type: string) => {\r\n\tif (type === 'price') {\r\n\t\tif (activeSort.value === 'price') {\r\n\t\t\tpriceSortAsc.value = !priceSortAsc.value\r\n\t\t} else {\r\n\t\t\tactiveSort.value = 'price'\r\n\t\t\tpriceSortAsc.value = true // 默认升序\r\n\t\t}\r\n\t} else {\r\n\t\tactiveSort.value = type\r\n\t}\r\n\t// 重新执行搜索以获取正确排序的数据\r\n\tperformSearch()\r\n}\r\n\r\nconst loadMore = async () => {\r\n\tif (loading.value || !hasMore.value || searchKeyword.value.trim() == '') return\r\n\tloading.value = true\r\n\t\r\n\t// 增加页码\r\n\tcurrentPage.value++\r\n\t\r\n\tconst keyword = searchKeyword.value.trim()\r\n\t// 确定排序方式\r\n\tlet sortBy = 'sales'\r\n\tlet ascending = false\r\n\tif (activeSort.value === 'price') {\r\n\t\tsortBy = 'price'\r\n\t\tascending = priceSortAsc.value\r\n\t} else if (activeSort.value === 'default') {\r\n sortBy = 'default'\r\n }\r\n\t\r\n try {\r\n const response = await supabaseService.searchProducts(keyword, currentPage.value, 20, sortBy, ascending)\r\n const newItems = response.data.map((p: any) => {\r\n let tag = ''\r\n if (p.tags) {\r\n try {\r\n const tags = (typeof p.tags === 'string') ? JSON.parse(p.tags) : p.tags\r\n if (Array.isArray(tags) && tags.length > 0) tag = String(tags[0])\r\n } catch(e) {}\r\n }\r\n \r\n return {\r\n id: p.id,\r\n name: p.name,\r\n image: p.main_image_url ?? '/static/default.jpg',\r\n price: p.base_price,\r\n specification: p.specification ?? '标准规格',\r\n tag: tag,\r\n sales: p.sale_count ?? 0\r\n }\r\n })\r\n searchResults.value.push(...newItems)\r\n hasMore.value = response.hasmore\r\n } catch(e) {\r\n console.error('Load more failed', e)\r\n hasMore.value = false\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\nconst refreshGuessList = () => {\r\n\tuni.showLoading({ title: '刷新中' })\r\n setTimeout(() => {\r\n refreshGuessListItems()\r\n uni.hideLoading()\r\n }, 500)\r\n}\r\n\r\nconst refreshGuessListItems = () => {\r\n if (allGuessItems.value.length > 0) {\r\n // 简单的随机乱序并取前6个\r\n const shuffled = [...allGuessItems.value].sort(() => Math.random() - 0.5)\r\n guessList.value = shuffled.slice(0, 6)\r\n }\r\n}\r\n\r\nconst viewProductDetail = (item: any) => {\r\n\t// 跳转详情页逻辑 - 传递必要的参数作为预加载/fallback\r\n\tuni.navigateTo({\r\n\t\turl: `/pages/mall/consumer/product-detail?productId=${item.id}&price=${item.price}&name=${encodeURIComponent(item.name)}`\r\n\t})\r\n}\r\n\r\nconst viewShopDetail = (shop: any) => {\r\n uni.navigateTo({\r\n url: `/pages/mall/consumer/shop-detail?id=${shop.id}`\r\n })\r\n}\r\n\r\n// 添加到购物车 - 搜索列表无法选择规格,跳转详情页\r\nconst addToCart = (product: any) => {\r\n uni.showToast({ title: '请选择规格', icon: 'none' })\r\n\tsetTimeout(() => {\r\n viewProductDetail(product)\r\n }, 800)\r\n}\r\n\r\nconst openCamera = () => {\r\n\tuni.chooseImage({\r\n\t\tcount: 1,\r\n\t\tsourceType: ['camera'],\r\n\t\tsuccess: (res) => {\r\n\t\t\tconsole.log('拍摄图片路径:', res.tempFilePaths[0])\r\n\t\t\tuni.showToast({ title: '已启用相机', icon: 'none' })\r\n\t\t},\r\n\t\tfail: (err) => {\r\n\t\t\tconsole.error('启用相机失败', err)\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst goBack = () => {\r\n\tif (showResults.value) {\r\n\t\t// 如果在搜索结果页,先返回到搜索初始页\r\n\t\tshowResults.value = false\r\n\t\tsearchKeyword.value = ''\r\n\t} else {\r\n\t\t// 如果在搜索初始页,则返回上一页\r\n const pages = getCurrentPages()\r\n if (pages.length > 1) {\r\n\t\t uni.navigateBack()\r\n } else {\r\n // 如果只有一页(由于深链接或重定向),返回首页\r\n uni.switchTab({\r\n url: '/pages/mall/consumer/index'\r\n })\r\n }\r\n\t}\r\n}\r\n</script>\r\n\r\n<style>\r\n.search-page {\r\n\twidth: 100%;\r\n\tflex: 1; /* Fixed 100vh */\r\n\tbackground-color: #f5f5f5;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n/* 店铺搜索结果 */\r\n.shop-results-section {\r\n background-color: #fff;\r\n margin-bottom: 10px;\r\n padding: 10px 0;\r\n}\r\n\r\n.section-top {\r\n padding: 0 12px 10px;\r\n}\r\n\r\n.result-title-sm {\r\n font-size: 14px;\r\n font-weight: bold;\r\n color: #333;\r\n}\r\n\r\n.shop-list-scroll {\r\n width: 100%;\r\n white-space: nowrap;\r\n}\r\n\r\n.shop-list-row {\r\n display: flex;\r\n flex-direction: row;\r\n padding: 0 12px;\r\n}\r\n\r\n.shop-card {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n width: 80px;\r\n margin-right: 15px;\r\n background-color: #f9f9f9;\r\n padding: 10px 5px;\r\n border-radius: 8px;\r\n}\r\n\r\n.shop-logo {\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 24px;\r\n margin-bottom: 5px;\r\n border: 1px solid #f0f0f0;\r\n background-color: white;\r\n}\r\n\r\n.shop-info {\r\n width: 100%;\r\n text-align: center;\r\n}\r\n\r\n.shop-name-txt {\r\n font-size: 12px;\r\n color: #333;\r\n width: 100%;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n /* display: block; REMOVED */\r\n margin-bottom: 2px;\r\n}\r\n\r\n.shop-products-txt {\r\n font-size: 10px;\r\n color: #999;\r\n}\r\n\r\n/* 头部样式 */\r\n.search-header {\r\n\tbackground-color: #ffffff;\r\n\tpadding-bottom: 10px;\r\n\r\n\r\n\r\n}\r\n\r\n.search-bar-container {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 必须显式设置 row */\r\n\talign-items: center;\r\n\tpadding: 10px 16px;\r\n\twidth: 100%; /* 确保占满宽度 */\r\n}\r\n\r\n.back-btn {\r\n\tpadding: 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twidth: 32px; /* 固定宽度防止压缩 */\r\n\theight: 32px;\r\n\tmargin-right: 12px;\r\n}\r\n\r\n.back-icon {\r\n\tfont-size: 24px;\r\n\tcolor: #333;\r\n\tfont-weight: bold;\r\n\tfont-family: monospace;\r\n}\r\n\r\n.search-input-container {\r\n\tflex: 1; /* 占据剩余空间 */\r\n\theight: 40px; /*稍微增高一点以容纳按钮*/\r\n\tbackground-color: #f0f0f0;\r\n\tborder-radius: 20px;\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 必须显式设置 row */\r\n\talign-items: center;\r\n\tpadding: 0 4px 0 12px;\r\n}\r\n\r\n.search-input {\r\n\tflex: 1;\r\n\tfont-size: 14px;\r\n\tcolor: #333;\r\n\theight: 100%;\r\n\tbackground-color: transparent; /* 确保背景透明 */\r\n}\r\n\r\n.placeholder {\r\n\tcolor: #999;\r\n}\r\n\r\n.clear-btn {\r\n\tpadding: 4px;\r\n\tmargin-right: 2px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.clear-icon {\r\n\tfont-size: 16px;\r\n\tcolor: #999;\r\n}\r\n\r\n.camera-btn {\r\n\tpadding: 4px 8px 4px 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder-right-width: 1px; /* UVUE 边框写法 */\r\n\tborder-right-style: solid;\r\n\tborder-right-color: #ddd;\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.camera-icon {\r\n\tfont-size: 20px;\r\n}\r\n\r\n/* 内部搜索按钮样式 */\r\n.inner-search-btn {\r\n\tpadding: 0 16px;\r\n\tbackground-color: #87CEEB;\r\n\tborder-radius: 16px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\theight: 32px;\r\n}\r\n\r\n.inner-search-text {\r\n\tfont-size: 13px;\r\n\tcolor: #ffffff;\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* 内容区域 */\r\n.main-content {\r\n\tflex: 1;\r\n\tpadding: 12px;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n/* 模块通用头部 */\r\n.section-header {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 12px;\r\n\tmargin-top: 8px;\r\n\twidth: 100%;\r\n}\r\n\r\n.section-title {\r\n\tfont-size: 15px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n\tflex: 1; /* 占据左侧空间 */\r\n}\r\n\r\n.header-right {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\talign-items: center;\r\n\t/* gap: 4px; REMOVED */\r\n\tflex-shrink: 0; /* 防止被压缩 */\r\n}\r\n\r\n.clear-text {\r\n margin-right: 4px; /* REPLACED gap */\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n}\r\n\r\n.clear-icon-trash {\r\n\tfont-size: 14px;\r\n}\r\n\r\n/* 搜索历史 */\r\n.search-history {\r\n\tmargin-bottom: 24px;\r\n\tpadding: 0 4px; /* 微调内边距 */\r\n}\r\n\r\n.history-tags {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\t/* gap: 10px; REMOVED */\r\n\tflex-wrap: wrap; /* 允许换行 */\r\n\tpadding: 0 4px;\r\n\talign-items: center;\r\n}\r\n\r\n.history-tag {\r\n\tbackground-color: #fff;\r\n\tpadding: 6px 12px;\r\n\tborder-radius: 16px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\t/* gap: 6px; REMOVED */\r\n\tflex-shrink: 0; /* 防止被压缩 */\r\n margin-right: 10px; /* REPLACED gap */\r\n margin-bottom: 10px; /* REPLACED gap */\r\n}\r\n\r\n.history-text {\r\n\tfont-size: 13px;\r\n\tcolor: #666;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n margin-right: 6px; /* REPLACED gap */\r\n}\r\n\r\n.delete-tag-btn {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twidth: 16px;\r\n\theight: 16px;\r\n\tborder-radius: 8px;\r\n\tbackground-color: #f0f0f0;\r\n}\r\n\r\n.delete-icon {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n\tline-height: 1;\r\n}\r\n\r\n/* 热门搜索 */\r\n.hot-search {\r\n\tmargin-bottom: 24px;\r\n}\r\n\r\n.hot-tags {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\tflex-wrap: wrap; /* 允许换行 */\r\n\t/* gap: 10px; REMOVED */\r\n\tpadding: 0 4px;\r\n}\r\n\r\n.hot-tag {\r\n /* ... existing styles ... */\r\n margin-right: 10px; /* REPLACED gap */\r\n margin-bottom: 10px; /* REPLACED gap */\r\n}\r\n\r\n.hot-tag {\r\n\tbackground-color: #fff;\r\n\tpadding: 6px 12px;\r\n\tborder-radius: 16px; /* 增加圆角,像胶囊一样 */\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tflex-shrink: 0; /* 防止被压缩 */\r\n\tmargin-right: 10px; /* REPLACED gap */\r\n margin-bottom: 10px; /* REPLACED gap */\r\n}\r\n\r\n.hot-tag.hot {\r\n\tbackground-color: #fff0f0;\r\n}\r\n\r\n.hot-rank {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n\tfont-weight: bold;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.hot-rank.top-three {\r\n\tcolor: #ff5000;\r\n}\r\n\r\n.hot-text {\r\n\tfont-size: 13px;\r\n\tcolor: #333;\r\n}\r\n\r\n.hot-icon {\r\n\tfont-size: 12px;\r\n\tmargin-left: 4px;\r\n}\r\n\r\n/* 猜你需要 */\r\n.guess-you-like {\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.title-with-icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.section-icon {\r\n\tfont-size: 16px;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.refresh-btn {\r\n\tfont-size: 12px;\r\n\tcolor: #4CAF50;\r\n}\r\n\r\n.guess-grid {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: space-between;\r\n\tpadding: 0 4px;\r\n}\r\n\r\n.guess-item {\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n\tpadding-bottom: 8px;\r\n\twidth: 48%;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.guess-img-box {\r\n\twidth: 100%;\r\n\theight: 0;\r\n\tpadding-bottom: 100%;\r\n\tposition: relative;\r\n\tbackground-color: #f0f0f0;\r\n}\r\n\r\n.guess-img {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.guess-info {\r\n\tpadding: 8px;\r\n}\r\n\r\n.guess-name {\r\n\tfont-size: 13px;\r\n\tcolor: #333;\r\n\tmargin-bottom: 6px;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\tline-height: 1.3;\r\n\theight: 34px; /* 限制2行高度 */\r\n}\r\n\r\n.guess-price-row {\r\n\tdisplay: flex;\r\n\talign-items: flex-end; /* REPLACED baseline */\r\n}\r\n\r\n.price-symbol {\r\n\tfont-size: 12px;\r\n\tcolor: #ff5000;\r\n}\r\n\r\n.price-num {\r\n\tfont-size: 16px;\r\n\tcolor: #ff5000;\r\n\tfont-weight: bold;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.sales-text {\r\n\tfont-size: 10px;\r\n\tcolor: #999;\r\n}\r\n\r\n/* 搜索建议列表 */\r\n.search-suggestions {\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\tpadding: 0 12px;\r\n}\r\n\r\n.suggestion-item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\theight: 44px;\r\n\tborder-bottom: 1px solid #f5f5f5;\r\n}\r\n\r\n.suggestion-icon {\r\n\tmargin-right: 10px;\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n\r\n.suggestion-text {\r\n\tfont-size: 14px;\r\n\tcolor: #333;\r\n}\r\n\r\n/* 搜索结果 */\r\n.search-results {\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.results-header {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 12px;\r\n\tflex-wrap: wrap; /* 允许换行以适应小屏 */\r\n}\r\n\r\n.results-title {\r\n\tfont-size: 15px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n margin-right: 8px;\r\n}\r\n\r\n.filter-tabs {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\tflex: 1; /* 自适应填充剩余空间 */\r\n\tjustify-content: flex-end; /* 靠右对齐 */\r\n}\r\n\r\n.filter-tab {\r\n\tfont-size: 13px;\r\n\tcolor: #666;\r\n\tpadding: 4px 8px; /* 增加点击区域 */\r\n\tmargin-left: 16px;\r\n}\r\n\r\n.filter-tab.active {\r\n\tcolor: #4CAF50;\r\n\tfont-weight: bold; /* REPLACED 500 */\r\n}\r\n\r\n.results-list {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: space-between;\r\n\tpadding: 0 4px;\r\n}\r\n\r\n/* 响应式布局 */\r\n/* 平板设备 (768px以上) */\r\n@media screen and (min-width: 768px) {\r\n\t.results-list {\r\n\t\tpadding: 0 16px;\r\n\t}\r\n\t\r\n .result-item {\r\n width: 32%;\r\n }\r\n\r\n\t.guess-item {\r\n\t\twidth: 24%; /* 猜你喜欢在平板上显示4列 */\r\n\t}\r\n}\r\n\r\n/* 桌面设备 (1024px以上) */\r\n@media screen and (min-width: 1024px) {\r\n\t.results-list {\r\n\t\tpadding: 0 24px;\r\n\t}\r\n \r\n .result-item {\r\n width: 24%;\r\n }\r\n\t\r\n\t.guess-item {\r\n\t\twidth: 16%; /* 猜你喜欢在桌面上显示6列 */\r\n\t}\r\n\t\r\n\t/* 桌面端调整图片高度 */\r\n\t.product-image {\r\n\t\theight: 160px;\r\n\t}\r\n}\r\n\r\n.result-item {\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\tpadding: 8px;\r\n\tdisplay: flex;\r\n\tflex-direction: column; /* 垂直排列 */\r\n\twidth: 48%;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.product-image {\r\n\twidth: 100%;\r\n\theight: 120px; /* 调整图片高度 */\r\n\tborder-radius: 4px;\r\n\tbackground-color: #f0f0f0;\r\n}\r\n\r\n.product-info {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.product-name {\r\n\tfont-size: 13px; /* 减小字号 */\r\n\tcolor: #333;\r\n\tfont-weight: bold;\r\n\tline-height: 1.3;\r\n\theight: 34px; /* 限制高度 */\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n.product-tags-row {\r\n\tmargin-top: 2px;\r\n\tdisplay: none; /* 隐藏标签以保持简洁 */\r\n}\r\n\r\n.product-spec {\r\n\tdisplay: none; /* 隐藏规格 */\r\n}\r\n\r\n.product-bottom {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center; /* 垂直居中 */\r\n\tmargin-top: 4px;\r\n}\r\n\r\n.price-box {\r\n\tcolor: #ff5000;\r\n\tdisplay: flex;\r\n\talign-items: flex-end;\r\n}\r\n\r\n.price-symbol {\r\n\tfont-size: 10px;\r\n}\r\n\r\n.price-value {\r\n\tfont-size: 16px; /* 减小价格字号 */\r\n\tfont-weight: 700;\r\n}\r\n\r\n.add-cart-btn {\r\n\twidth: 24px;\r\n\theight: 24px;\r\n\tbackground-color: #4CAF50;\r\n\tborder-radius: 12px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.cart-icon {\r\n\tcolor: #fff;\r\n\tfont-size: 14px;\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* 错误状态 */\r\n.error-state {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.error-content {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n}\r\n\r\n.error-icon {\r\n\tfont-size: 48px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.error-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.error-desc {\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n\r\n/* 加载更多 */\r\n.loading-more {\r\n\tpadding: 20px 0;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n}\r\n\r\n.loading-spinner {\r\n\twidth: 24px;\r\n\theight: 24px;\r\n\tborder: 2px solid #f0f0f0;\r\n\tborder-top-color: #4CAF50;\r\n\tborder-radius: 12px;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.loading-text {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n}\r\n\r\n.no-more {\r\n\tpadding: 20px 0;\r\n\ttext-align: center;\r\n}\r\n\r\n.no-more-text {\r\n\tfont-size: 12px;\r\n\tcolor: #ccc;\r\n}\r\n\r\n.empty-result {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tpadding: 40px 0;\r\n}\r\n\r\n.empty-icon {\r\n\tfont-size: 40px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.empty-text {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.empty-sub {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n}\r\n\r\n.safe-area {\r\n\theight: 20px;\r\n}\r\n</style>\r\n",null,null,null,null,null,null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BAsdC,eAAA;+BAvMK,kBAAA;+BAgQM,qBAAA;+BA/OV,eAAA;+BA/BK,gBAAA;+BAgQF,cAAA;;+BA1PL,kBAAA;+BAYM,eAAA;+BA6FA,aAAA;+BA4HL,aAAA;+BA/LG,aAAA;;;;;;;;;YA3CJ,IAAM,kBAAkB,IAAI,CAAC;YAC7B,IAAM,eAAe,IAAI,CAAC;YAC1B,IAAM,gBAAgB,IAAI;YAC1B,IAAM,cAAc,IAAI,KAAK;YAC7B,IAAM,UAAU,IAAI,KAAK;YACzB,IAAM,UAAU,IAAI,IAAI;YACxB,IAAM,UAAU,IAAI,KAAK;YACzB,IAAM,YAAY,IAAI,IAAI;YAC1B,IAAM,aAAa,IAAI;YACvB,IAAM,eAAe,IAAI,KAAK;YAG9B,IAAM,gBAAgB,QAAI,MAAM;YAChC,IAAM,gBAAgB,QAAI,GAAG;YAC7B,IAAM,YAAY,QAAI,GAAG;YACzB,IAAM,gBAAgB,QAAI,GAAG;YAC7B,IAAM,gBAAgB,QAAI,GAAG;YAC7B,IAAM,oBAAoB,QAAI,GAAG;YAIjC,UAAU,KAAK;gBACd;YACD;;YAGA,IAAM,WAAW,KAAK;gBACrB,IAAI;oBACH,IAAM,aAAa,AAiPT;oBAhPV,gBAAgB,KAAK,GAAG,WAAW,eAAe,CAAA,EAAA,CAAI,CAAC;oBACvD,IAAM,eAAe,WAAW,YAAY;oBAE5C,aAAa,KAAK,GAAG,aAAY,CAAA,CAAG,CAAC,EAAE,CAAA,CAAA,CAAG,gBAAgB,KAAK;oBAE/D;oBAGA,IAAM,QAAQ;oBACd,IAAI,MAAM,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;wBACrB,IAAM,cAAc,KAAK,CAAC,MAAM,MAAM,CAAA,CAAA,CAAG,CAAC,CAAC;wBAE3C,IAAM,UAAU,YAAY,OAAO;wBACnC,IAAI,QAAO,EAAA,CAAI,OAAO,CAAC,UAAU,EAAE;4BAClC,IAAM,UAAS,WAAA,iBAAA,CAAC,mBAAmB,OAAO,CAAC,UAAU,GAAA;4BACrD,cAAc,KAAK,GAAG;4BAEtB,IAAI,OAAO,CAAC,OAAO,CAAA,GAAA,CAAK,SAAQ,EAAA,CAAI,OAAO,CAAC,OAAO,CAAA,GAAA,CAAK,SAAS;gCAEhE,IAAI,OAAO,CAAC,OAAO,CAAA,GAAA,CAAK,UAAU;oCAC9B,aAAa;;gCAGjB,YAAY,KAAK,GAAG,IAAI;gCACxB,QAAQ,KAAK,GAAG,IAAI;gCAKpB;;;;;iBAIF,OAAO,cAAG;oBACX,QAAQ,KAAK,CAAC,SAAS,GAAA;oBACvB,QAAQ,KAAK,GAAG,IAAI;;YAEtB;YAGA,IAAM,WAAW,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC3B,QAAQ,KAAK,GAAG,KAAK;wBAErB,IAAI;4BACG;4BAGA,IAAM,cAAc,MAAM,gBAAgB,cAAc,CAAC,EAAE;4BAE3D,cAAc,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAC,GAAG,GAAG,GAAA;uCAAM,CAAA;oCAC5D,IAAA,UAAS,EAAE,IAAI;oCACf,IAAA,MAAK,IAAI;iCACZ;;;4BAED,cAAc,KAAK,GAAG,YAAY,GAAG,CAAC,IAAC,GAAG,GAAG,GAAA;uCAAM,CAAA;oCAC9C,IAAA,KAAI,EAAE,EAAE;oCACR,IAAA,OAAM,EAAE,IAAI;oCACZ,IAAA,QAAO,EAAE,UAAU;oCACnB,IAAA,QAAO,EAAE,cAAc,CAAA,EAAA,CAAI;oCAC3B,IAAA,QAAO,IAAA,oBAAO,EAAE,UAAU,EAAA,GAAA,CAAK,UAAW;wCAAA,EAAE,UAAU;oCAAV,EAAa,IAAC,CAAD;AAAA,yCAAC;oCAAD;iCAC7D;;;4BAGD;;yBAEL,OAAO,cAAG;4BACX,QAAQ,KAAK,CAAC,oBAAoB,GAAA;4BAClC,QAAQ,KAAK,GAAG,IAAI;;iBAErB;YAAD;YAGA,IAAM,YAAY,KAAK;gBApFjB,mCAqFa,QAAO;gBACzB,WAAW,KAAK;oBAzEf;oBA2EA;gBACD;kBAAG,IAAI;YACR;YAGA,IAAM,oBAAoB,KAAK;gBAC9B,IAAM,UAAU,AAlGX,mBAkG8B;gBACnC,IAAI,SAAS;oBACZ,IAAI;wBAEH,IAAM,SAAQ,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,QAAO,EAAA,CAAI,MAAM,GAAA;wBAC3C,IAAI,SAAM,OAAO,CAAC,SAAS;4BAC1B,cAAc,KAAK,GAAG,OAAM,EAAA,UAAI,MAAM;;;qBAEtC,OAAO,cAAG;wBACX,cAAc,KAAK,GAAG,KAAE;;;YAG3B;YAEA,IAAM,oBAAoB,KAAK;gBAxH/B,mBAyHoB,iBAAiB,KAAK,SAAS,CAAC,cAAc,KAAK;YACvE;YAEA,IAAM,eAAe,IAAC,SAAS,MAAM,CAAI;gBACxC,IAAI,QAAO,EAAA,CAAI;oBAAI;;gBACnB,IAAM,QAAQ,cAAc,KAAK,CAAC,OAAO,CAAC;gBAC1C,IAAI,MAAK,CAAA,CAAG,CAAC,CAAC,EAAE;oBACf,cAAc,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;;gBAEpC,cAAc,KAAK,CAAC,OAAO,CAAC;gBAC5B,IAAI,cAAc,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,EAAE;oBAAE,cAAc,KAAK,CAAC,GAAG;;gBAC5D;YACD;YAEA,IAAM,eAAe,KAAK;gBA9BpB,+BAgCJ,QAAO,MACP,UAAS,cACT,UAAS,IAAC,IAAO;oBAChB,IAAI,IAAI,OAAO,EAAE;wBAChB,cAAc,KAAK,GAAG,KAAE;8CACF;;gBAExB;;YAEF;YAEA,IAAM,oBAAoB,IAAC,OAAO,MAAM,CAAI;gBAC3C,cAAc,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBACnC;YACD;YAGA,IAAM,oBAAoB,QAAI,MAAM;YACpC,IAAI,uBAAe,CAAC;YAGpB,IAAM,UAAU,IAAC,GAAG,GAAG,CAAI;gBAC1B,IAAM,OAAM,EAAE,MAAM,CAAC,KAAK;gBACvB,cAAc,KAAK,GADhB;gBAEN,IAAI,AAFE,KAEC,EAAA,CAAI,IAAI;oBACd,YAAY,KAAK,GAAG,KAAK;oBACnB,kBAAkB,KAAK,GAAG,KAAE;oBAC5B;;gBAIJ,IAAI,aAAY,CAAA,CAAG,CAAC;oBAAE,aAAa;;gBACnC,eAAe,WAAW,KAAK;oBAC3B,iBAXD;gBAYH;kBAAG,GAAG;YACV;YAEA,IAAM,mBAAmB,IAAO,IAAI,MAAM,GAAA,WAAA,IAAA,EAAI;gBAAA,OAAA,eAAA;wBAC1C,IAAI,GAAE,EAAA,CAAI,GAAE,EAAA,CAAI,YAAY,KAAK;4BAAE;;wBAGnC,IAAI;4BACA,IAAM,MAAM,MAAM,gBAAgB,cAAc,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;4BAChE,IAAI,SAAM,OAAO,CAAC,IAAI,IAAI,EAAC,EAAA,CAAI,IAAI,IAAI,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;gCAEhD,IAAM,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAC,GAAE,GAAG,GAAG,MAAM,CAAG;oCACzC,IAAG,EAAC,EAAA,CAAY,eAAc;wCAC3B,OAAO,CAAA,EAAC,EAAA,CAAA,aAAA,EAAC,SAAS,CAAC,QAAO,EAAA,CAAI;;oCAEjC,OAAO,CAAC,CAAC,OAAO,CAAA,EAAA,CAAI,MAAM;gCAC9B;gCAEA,kBAAkB,KAAK,GAAG,SAAM,IAAI,CAAC,AAAI,IAAI;8BAC1C,IAEN,CAFM;gCACH,kBAAkB,KAAK,GAAG,KAAE;;;yBAElC,OAAM,cAAG;4BACP,kBAAkB,KAAK,GAAG,KAAE;;iBAEnC;YAAD;YAEA,IAAM,cAAc,KAAK;gBACxB,cAAc,KAAK,GAAG;gBACtB,YAAY,KAAK,GAAG,KAAK;YAC1B;YAEA,IAAM,WAAW,KAAK;gBACrB,IAAI,cAAc,KAAK,CAAC,IAAI,GAAE,EAAA,CAAI;oBAAI;;gBACtC,aAAa,cAAc,KAAK,CAAC,IAAI;gBACrC;YACD;YAEA,IAAM,oBAAoB,IAAC,SAAS,MAAM,CAAI;gBAC7C,cAAc,KAAK,GAAG;gBACtB;YACD;YAEA,IAAM,gBAAgB,IAAC,SAAS,MAAM,CAAI;gBACzC,cAAc,KAAK,GAAG;gBACtB,aAAa;gBACb;YACD;YAEA,IAAM,mBAAmB,IAAC,YAAY,MAAM,CAAI;gBAC/C,cAAc,KAAK,GAAG;gBACtB,aAAa;gBACb;YACD;YAEA,IAAM,cAAc,IAAI,CAAC;YAEzB,IAAM,gBAAgB,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAEhC,YAAY,KAAK,GAAG,IAAI;wBACxB,QAAQ,KAAK,GAAG,IAAI;wBAEpB,YAAY,KAAK,GAAG,CAAC;wBAGrB,IAAM,UAAU,cAAc,KAAK,CAAC,IAAI;wBACxC,IAAI,QAAO,EAAA,CAAI,IAAI;4BAClB,QAAQ,KAAK,GAAG,KAAK;4BACrB;;wBAID,IAAI,SAAS;wBACb,IAAI,YAAY,KAAK;wBACrB,IAAI,WAAW,KAAK,CAAA,GAAA,CAAK,SAAS;4BACjC,SAAS;4BACT,YAAY,aAAa,KAAK;0BACxB,IAEH,CAFG,IAAI,WAAW,KAAK,CAAA,GAAA,CAAK,WAAW;4BACpC,SAAS;;wBAGb,IAAI;4BAEA,IAA6B,OAAA,MAAM,WAAQ,GAAG,CAAC;gCAC3C,gBAAgB,cAAc,CAAC,SAAS,YAAY,KAAK,EAAE,EAAE,EAAE,QAAQ;gCAEvE,IAAA,YAAY,KAAK,CAAA,GAAA,CAAK,CAAC,CAAA,EAAA,CAAI,WAAW,KAAK,CAAA,GAAA,CAAK,WAC1C;oCAAA,gBAAgB,WAAW,CAAC;gCAAO,EACnC,IAA0E,CAA1E;oCAAA,WAAQ,OAAO,CAAC;wCAAE,IAAA,OAAM,KAAE;wCAAE,IAAA,gBAAO,CAAC;wCAAE,IAAA,eAAM,CAAC;wCAAE,IAAA,gBAAO,CAAC;wCAAE,IAAA,UAAS,KAAK;qCAAE;gCAAA;6BAClF;gCANM,WAAsB;gCAAZ,WAAY;4BAS7B,IAAI,SAAS,IAAI,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;gCAC1B,kBAAkB,KAAK,GAAG,SAAS,IAAI,CAAC,GAAG,CAAC,IAAC,GAAG,GAAG,GAAA;2CAAM,CAAA;wCACrD,IAAA,KAAI,EAAE,EAAE;wCACR,IAAA,OAAM,EAAE,SAAS;wCACjB,IAAA,OAAM,EAAE,SAAS,CAAA,EAAA,CAAI;wCACrB,IAAA,eAAc,EAAE,aAAa,CAAA,EAAA,CAAI,CAAC;qCACrC;;8BACE,IAEN,CAFM;gCACH,kBAAkB,KAAK,GAAG,KAAE;;4BAIhC,cAAc,KAAK,GAAG,SAAS,IAAI,CAAC,GAAG,CAAC,IAAC,GAAG,GAAG,GAAA,cAAI;gCAC/C,IAAI,MAAM;gCACV,IAAI,EAAE,IAAI,EAAE;oCACR,IAAI;wCACD,IAAM,OAAO,IAAA,CAAC,oBAAO,EAAE,IAAI,EAAA,GAAA,CAAK,QAAQ,GAAG;4CAAA,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,EAAE,IAAI,GAAA;wCAAA,EAAI,IAAM,CAAN;4CAAA,EAAE,IAAI;wCAAJ;wCACnE,IAAI,SAAM,OAAO,CAAC,MAAK,EAAA,CAAI,CAAA,KAAI,EAAA,UAAA,GAAA,CAAA,EAAC,MAAM,CAAA,CAAA,CAAG,CAAC;4CAAE,MAAM,OAAO,CAAA,KAAI,EAAA,UAAA,GAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;;qCACjE,OAAM,cAAG,CAAA;;gCAGf,OAAO,IACH,QAAI,EAAE,EAAE,EACR,UAAM,EAAE,IAAI,EACZ,YAAO,EAAE,cAAc,CAAA,EAAA,CAAI,wBAC3B,WAAO,EAAE,UAAU,EACnB,oBAAe,EAAE,aAAa,CAAA,EAAA,CAAI,SAClC,SAAK,KACL,YAAO,EAAE,UAAU,CAAA,EAAA,CAAI,CAAC;4BAEhC;;4BAEA,QAAQ,KAAK,GAAG,SAAS,OAAO;;yBAClC,OAAM,cAAG;4BACP,QAAQ,KAAK,CAAC,iBAAiB,GAAA;;iCACzB;4BACN,QAAQ,KAAK,GAAG,KAAK;;iBAE5B;YAAD;YAGA,IAAM,aAAa,IAAC,MAAM,MAAM,CAAI;gBACnC,IAAI,KAAI,GAAA,CAAK,SAAS;oBACrB,IAAI,WAAW,KAAK,CAAA,GAAA,CAAK,SAAS;wBACjC,aAAa,KAAK,GAAG,CAAC,aAAa,KAAK;sBAClC,IAGN,CAHM;wBACN,WAAW,KAAK,GAAG;wBACnB,aAAa,KAAK,GAAG,IAAI;qBACzB;kBACK,IAEN,CAFM;oBACN,WAAW,KAAK,GAAG;;gBAGpB;YACD;YAEA,IAAM,WAAW,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC3B,IAAI,QAAQ,KAAK,CAAA,EAAA,CAAI,CAAC,QAAQ,KAAK,CAAA,EAAA,CAAI,cAAc,KAAK,CAAC,IAAI,GAAE,EAAA,CAAI;4BAAI;;wBACzE,QAAQ,KAAK,GAAG,IAAI;wBAGpB,YAAY,KAAK;wBAEjB,IAAM,UAAU,cAAc,KAAK,CAAC,IAAI;wBAExC,IAAI,SAAS;wBACb,IAAI,YAAY,KAAK;wBACrB,IAAI,WAAW,KAAK,CAAA,GAAA,CAAK,SAAS;4BACjC,SAAS;4BACT,YAAY,aAAa,KAAK;0BACxB,IAEH,CAFG,IAAI,WAAW,KAAK,CAAA,GAAA,CAAK,WAAW;4BACpC,SAAS;;wBAGb,IAAI;4BACA,IAAM,WAAW,MAAM,gBAAgB,cAAc,CAAC,SAAS,YAAY,KAAK,EAAE,EAAE,EAAE,QAAQ;4BAC9F,IAAM,WAAW,SAAS,IAAI,CAAC,GAAG,CAAC,IAAC,GAAG,GAAG,GAAA,cAAI;gCAC1C,IAAI,MAAM;gCACV,IAAI,EAAE,IAAI,EAAE;oCACR,IAAI;wCACD,IAAM,OAAO,IAAA,CAAC,oBAAO,EAAE,IAAI,EAAA,GAAA,CAAK,QAAQ,GAAG;4CAAA,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,EAAE,IAAI,GAAA;wCAAA,EAAI,IAAM,CAAN;4CAAA,EAAE,IAAI;wCAAJ;wCACnE,IAAI,SAAM,OAAO,CAAC,MAAK,EAAA,CAAI,CAAA,KAAI,EAAA,UAAA,GAAA,CAAA,EAAC,MAAM,CAAA,CAAA,CAAG,CAAC;4CAAE,MAAM,OAAO,CAAA,KAAI,EAAA,UAAA,GAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;;qCACjE,OAAM,cAAG,CAAA;;gCAGf,OAAO,IACH,QAAI,EAAE,EAAE,EACR,UAAM,EAAE,IAAI,EACZ,YAAO,EAAE,cAAc,CAAA,EAAA,CAAI,wBAC3B,WAAO,EAAE,UAAU,EACnB,oBAAe,EAAE,aAAa,CAAA,EAAA,CAAI,SAClC,SAAK,KACL,YAAO,EAAE,UAAU,CAAA,EAAA,CAAI,CAAC;4BAEhC;;4BACA,cAAc,KAAK,CAAC,IAAI,EAAI;4BAC5B,QAAQ,KAAK,GAAG,SAAS,OAAO;;yBAClC,OAAM,cAAG;4BACP,QAAQ,KAAK,CAAC,oBAAoB,GAAA;4BAClC,QAAQ,KAAK,GAAG,KAAK;;iCACf;4BACN,QAAQ,KAAK,GAAG,KAAK;;iBAE5B;YAAD;YAEA,IAAM,mBAAmB,KAAK;gBApWxB,mCAqWa,QAAO;gBACtB,WAAW,KAAK;oBACZ;oBA1VN;gBA4VE;kBAAG,GAAG;YACV;YAEA,IAAM,wBAAwB,KAAK;gBAC/B,IAAI,cAAc,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;oBAEhC,IAAM,WAAW,AAAI,cAAc,KAAK,SAAE,IAAI,CAAC,IAAA,IAAA,KAAA,MAAA;+BAAM,KAAK,MAAM,GAAE,CAAA,CAAG,GAAG;;;oBACxE,UAAU,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;;YAE7C;YAEA,IAAM,oBAAoB,IAAC,MAAM,GAAG,CAAI;gBAtInC,iCAyIH,MAAK,mDAAiD,KAAK,EAAE,GAAA,YAAU,KAAK,KAAK,GAAA,WAAQ,WAAA,iBAAA,CAAC,mBAAmB,KAAK,IAAI,GAAA;YAExH;YAEA,IAAM,iBAAiB,IAAC,MAAM,GAAG,CAAI;gBA7IhC,iCA+IG,MAAK,yCAAuC,KAAK,EAAE;YAE3D;YAGA,IAAM,YAAY,IAAC,SAAS,GAAG,CAAI;gBAzKlC,+BA0KmB,QAAO,SAAS,OAAM;gBACzC,WAAW,KAAK;oBACT,kBAAkB;gBACtB;kBAAG,GAAG;YACV;YAEA,IAAM,aAAa,KAAK;gBAtMvB,mCAwMC,QAAO,CAAC,EACR,aAAY;oBAAC;iBAAS,EACtB,UAAS,IAAC,IAAO;oBAChB,QAAQ,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC,CAAA,EAAA;oBArL5C,+BAsLkB,QAAO,SAAS,OAAM;gBACvC;kBACA,OAAM,IAAC,IAAO;oBACb,QAAQ,KAAK,CAAC,UAAU,KAAE;gBAC3B;;YAEF;YAEA,IAAM,SAAS,KAAK;gBACnB,IAAI,YAAY,KAAK,EAAE;oBAEtB,YAAY,KAAK,GAAG,KAAK;oBACzB,cAAc,KAAK,GAAG;kBAChB,IAWN,CAXM;oBAEA,IAAM,QAAQ;oBACd,IAAI,MAAM,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;wBAjbvB;sBAmbQ,IAKN,CALM;wBAvYX,+BA0YY,MAAK;;;YAIrB;;uBA1rBC,IAwPO,QAAA,IAxPD,WAAM,gBAAa;oBAExB,IAoCO,QAAA,IApCD,WAAM,iBAAiB,WAAK,IAAE,IAAA,iBAAA,gBAAA,KAAA,CAAA,CAAA,CAAA;wBACnC,IAkCO,QAAA,IAlCD,WAAM,yBAAsB;4BAEjC,IAEO,QAAA,IAFD,WAAM,YAAY,aAAO;gCAC9B,IAAmC,QAAA,IAA7B,WAAM,cAAY;;4BAIzB,IA0BO,QAAA,IA1BD,WAAM,2BAAwB;gCACnC,IASE,SAAA,IARD,WAAM,gBACN,UAAK,QACJ,WAAO,cAAA,KAAa,EACpB,aAAO,SACP,eAAS,UACV,iBAAY,cACZ,uBAAkB,eACjB,WAAO,UAAA,KAAS;;;;2CAIN,cAAA,KAAa,GAAzB;oCAAA,IAEO,QAAA,gBAFoB,WAAM,aAAa,aAAO;wCACpD,IAAiC,QAAA,IAA3B,WAAM,eAAa;;;;;;gCAI1B,IAEO,QAAA,IAFD,WAAM,cAAc,aAAO;oCAChC,IAAmC,QAAA,IAA7B,WAAM,gBAAc;;gCAI3B,IAEO,QAAA,IAFD,WAAM,oBAAoB,aAAO;oCACtC,IAAyC,QAAA,IAAnC,WAAM,sBAAoB;;;;;+BAOxB,QAAA,KAAO,GAAnB;wBAAA,IAMO,QAAA,gBANc,WAAM,eAAe,aAAO;4BAChD,IAIO,QAAA,IAJD,WAAM,kBAAe;gCAC1B,IAAkC,QAAA,IAA5B,WAAM,eAAa;gCACzB,IAAwC,QAAA,IAAlC,WAAM,gBAAc;gCAC1B,IAAuC,QAAA,IAAjC,WAAM,eAAa;;;sBAK3B,KAAA;wBAAA,IAqMc,eAAA,gBAnMb,cAAA,IACA,WAAM,gBACL,WAAK,IAAE,IAAA,aAAA,aAAA,KAAA,CAAA,CAAA,CAAA,SACP,qBAAe;wCAGH,cAAA,KAAa,CAAA,EAAA,CAAA,CAAK,YAAA,KAAW,GAA1C;gCAAA,IA4EO,QAAA,IAAA,SAAA,CAAA,GAAA;oCA1EM,IAAA,cAAA,KAAa,CAAC,MAAM,CAAA,CAAA,CAAA,CAAA,EAAhC;wCAAA,IAqBO,QAAA,gBArB+B,WAAM;4CAC3C,IAMO,QAAA,IAND,WAAM,mBAAgB;gDAC3B,IAAuC,QAAA,IAAjC,WAAM,kBAAgB;gDAC5B,IAGO,QAAA,IAHD,WAAM,gBAAgB,aAAO;oDAClC,IAAkC,QAAA,IAA5B,WAAM,eAAa;oDACzB,IAAyC,QAAA,IAAnC,WAAM,qBAAmB;;;4CAGjC,IAYO,QAAA,IAZD,WAAM,iBAAc;gDACzB,IAUO,UAAA,IAAA,EAAA,cAAA,UAAA,CATkB,cAAA,KAAa,EAAA,IAA7B,MAAM,OAAN,SAAI,UAAA,GAAA,CAAA;2DADb,IAUO,QAAA,IARL,SAAK,OACN,WAAM,eACL,aAAK,KAAA;wDAAE,kBAAkB;oDAAI;wDAE9B,IAA4C,QAAA,IAAtC,WAAM,iBAAc,IAAI,OAAI,CAAA;wDAClC,IAEO,QAAA,IAFD,WAAM,kBAAkB,aAAK,cAAA,KAAA;4DAAO,kBAAkB;wDAAK,GAAA;4DAAA;yDAAA;4DAChE,IAAkC,QAAA,IAA5B,WAAM,gBAAc;;;;;;;;;;;;;oCAO9B,IAiBO,QAAA,IAjBD,WAAM,eAAY;wCACvB,IAEO,QAAA,IAFD,WAAM,mBAAgB;4CAC3B,IAAuC,QAAA,IAAjC,WAAM,kBAAgB;;wCAE7B,IAYO,QAAA,IAZD,WAAM,aAAU;4CACrB,IAUO,UAAA,IAAA,EAAA,cAAA,UAAA,CATkB,cAAA,KAAa,EAAA,IAA7B,MAAM,OAAN,SAAI,UAAA,GAAA,CAAA;uDADb,IAUO,QAAA,IARL,SAAK,OACN,WAAK,IAAA;oDAAC;oDACE,IAAA,SAAA,KAAA,GAAA;iDAAmB,GAC1B,aAAK,KAAA;oDAAE,cAAc,KAAK,OAAO;gDAAA;oDAElC,IAAiF,QAAA,IAA3E,WAAK,IAAA;wDAAC;wDAAmB,IAAA,gBAAA,MAAA,CAAA,CAAA,CAAA;qDAA0B,QAAK,MAAK,CAAA,CAAA,CAAA,GAAA,CAAA;oDACnE,IAAgD,QAAA,IAA1C,WAAM,aAAU,IAAI,KAAK,OAAO,GAAA,CAAA;+DAC1B,KAAK,GAAG,GAApB;wDAAA,IAAgD,QAAA,gBAA1B,WAAM,aAAW;oDAAE;;;;;;;;;oCAM5C,IA6BO,QAAA,IA7BD,WAAM,mBAAgB;wCAC3B,IAMO,QAAA,IAND,WAAM,mBAAgB;4CAC3B,IAGO,QAAA,IAHD,WAAM,oBAAiB;gDAC5B,IAAmC,QAAA,IAA7B,WAAM,iBAAe;gDAC3B,IAAuC,QAAA,IAAjC,WAAM,kBAAgB;;4CAE7B,IAA8D,QAAA,IAAxD,WAAM,eAAe,aAAO,mBAAkB;;wCAGrD,IAmBO,QAAA,IAnBD,WAAM,eAAY;4CACvB,IAiBO,UAAA,IAAA,EAAA,cAAA,UAAA,CAhBS,UAAA,KAAS,EAAA,IAAjB,MAAA,OAAA,SAAI,UAAA,GAAA,CAAA;uDADZ,IAiBO,QAAA,IAfL,SAAK,KAAK,EAAE,EACb,WAAM,cACL,aAAK,KAAA;oDAAE,kBAAkB;gDAAI;oDAE9B,IAEO,QAAA,IAFD,WAAM,kBAAe;wDAC1B,IAA+D,SAAA,IAAxD,WAAM,aAAa,SAAK,KAAK,KAAK,EAAE,UAAK;;;;oDAEjD,IAOO,QAAA,IAPD,WAAM,eAAY;wDACvB,IAA+C,QAAA,IAAzC,WAAM,eAAY,IAAI,KAAK,IAAI,GAAA,CAAA;wDACrC,IAIO,QAAA,IAJD,WAAM,oBAAiB;4DAC5B,IAAmC,QAAA,IAA7B,WAAM,iBAAe;4DAC3B,IAA+C,QAAA,IAAzC,WAAM,cAAW,IAAI,KAAK,KAAK,GAAA,CAAA;4DACrC,IAAkD,QAAA,IAA5C,WAAM,eAAa,KAAE,CAAA,CAAA,IAAG,KAAK,KAAK,GAAA,CAAA;;;;;;;;;;;;;;uCASlC,cAAA,KAAa,CAAA,EAAA,CAAA,CAAK,YAAA,KAAW,GAAzC;gCAAA,IAYO,QAAA,gBAZoC,WAAM;oCAChD,IAUO,QAAA,IAVD,WAAM,qBAAkB;wCAC7B,IAQO,UAAA,IAAA,EAAA,cAAA,UAAA,CAPwB,kBAAA,KAAiB,EAAA,IAAvC,YAAY,OAAZ,SAAU,UAAA,GAAA,CAAA;mDADnB,IAQO,QAAA,IANL,SAAK,OACN,WAAM,mBACL,aAAK,KAAA;gDAAE,iBAAiB;4CAAU;gDAEnC,IAAuC,QAAA,IAAjC,WAAM,oBAAkB;gDAC9B,IAAqD,QAAA,IAA/C,WAAM,oBAAiB,IAAI,aAAU,CAAA;;;;;;;;;;;uCAMlC,YAAA,KAAW,GAAvB;gCAAA,IA2FO,QAAA,gBA3FkB,WAAM;oCAElB,IAAA,kBAAA,KAAiB,CAAC,MAAM,CAAA,CAAA,CAAA,CAAA,EAApC;wCAAA,IAoBO,QAAA,gBApBmC,WAAM;4CAC/C,IAEO,QAAA,IAFD,WAAM,gBAAa;gDACxB,IAAyC,QAAA,IAAnC,WAAM,oBAAkB;;4CAE/B,IAec,eAAA,IAfD,cAAA,IAAS,WAAM;gDAC3B,IAaO,QAAA,IAbD,WAAM,kBAAe;oDAC1B,IAWO,UAAA,IAAA,EAAA,cAAA,UAAA,CAVS,kBAAA,KAAiB,EAAA,IAAzB,MAAA,OAAA,SAAI,UAAA,GAAA,CAAA;+DADZ,IAWO,QAAA,IATL,SAAK,KAAK,EAAE,EACb,WAAM,aACL,aAAK,KAAA;4DAAE,eAAe;wDAAI;4DAE3B,IAA8D,SAAA,IAAvD,WAAM,aAAa,SAAK,KAAK,IAAI,EAAE,UAAK;;;4DAC/C,IAGO,QAAA,IAHD,WAAM,cAAW;gEACtB,IAAkD,QAAA,IAA5C,WAAM,kBAAe,IAAI,KAAK,IAAI,GAAA,CAAA;gEACxC,IAAkE,QAAA,IAA5D,WAAM,sBAAoB,IAAC,CAAA,CAAA,IAAG,KAAK,YAAY,EAAA,CAAA,CAAG,OAAG,CAAA;;;;;;;;;;;;oCAOhE,IAqBO,QAAA,IArBD,WAAM,mBAAgB;wCAC3B,IAAuC,QAAA,IAAjC,WAAM,kBAAgB;wCAC5B,IAkBO,QAAA,IAlBD,WAAM,gBAAa;4CACxB,IAIU,QAAA,IAHT,WAAK,IAAA;gDAAC;gDACE,IAAA,aAAA,WAAA,KAAA,CAAA,GAAA,CAAA;6CAAoC,GAC3C,aAAK,KAAA;gDAAE,WAAU;4CAAA,IAClB,MAAE,EAAA,EAAA;gDAAA;6CAAA;4CACH,IAIU,QAAA,IAHT,WAAK,IAAA;gDAAC;gDACE,IAAA,aAAA,WAAA,KAAA,CAAA,GAAA,CAAA;6CAAkC,GACzC,aAAK,KAAA;gDAAE,WAAU;4CAAA,IAClB,MAAE,EAAA,EAAA;gDAAA;6CAAA;4CACH,IAMO,QAAA,IALN,WAAK,IAAA;gDAAC;gDACE,IAAA,aAAA,WAAA,KAAA,CAAA,GAAA,CAAA;6CAAkC,GACzC,aAAK,KAAA;gDAAE,WAAU;4CAAA,IAClB,OACG,CAAA,CAAA,IAAG,IAAA,WAAA,KAAU,CAAA,GAAA,CAAA,SAAgB;gDAAA,IAAA,aAAA,KAAY,EAAA;oDAAA;gDAAA,EAAA,IAAA,CAAA;oDAAA;gDAAA,CAAA;4CAAA,EAAA,IAAA,CAAA;gDAAA;4CAAA,CAAA,GAAA,EAAA,EAAA;gDAAA;6CAAA;;;oCAKnC,IAAA,cAAA,KAAa,CAAC,MAAM,CAAA,CAAA,CAAA,CAAA,EAAhC;wCAAA,IA0BO,QAAA,gBA1B+B,WAAM;4CAC3C,IAwBO,UAAA,IAAA,EAAA,cAAA,UAAA,CAvBY,cAAA,KAAa,EAAA,IAAxB,SAAA,OAAA,SAAO,UAAA,GAAA,CAAA;uDADf,IAwBO,QAAA,IAtBL,SAAK,QAAQ,EAAE,EAChB,WAAM,eACL,aAAK,KAAA;oDAAE,kBAAkB;gDAAO;oDAEjC,IAAsE,SAAA,IAA/D,WAAM,iBAAiB,SAAK,QAAQ,KAAK,EAAE,UAAK;;;oDACvD,IAgBO,QAAA,IAhBD,WAAM,iBAAc;wDACzB,IAAoD,QAAA,IAA9C,WAAM,iBAAc,IAAI,QAAQ,IAAI,GAAA,CAAA;mEACL,QAAQ,GAAG,GAAhD;4DAAA,IAEO,QAAA,gBAFD,WAAM;gEACX,IAAkD,QAAA,IAA5C,WAAM,gBAAa,IAAI,QAAQ,GAAG,GAAA,CAAA;;;;;wDAEzC,IAA6D,QAAA,IAAvD,WAAM,iBAAc,IAAI,QAAQ,aAAa,GAAA,CAAA;wDAEnD,IAQO,QAAA,IARD,WAAM,mBAAgB;4DAC3B,IAGO,QAAA,IAHD,WAAM,cAAW;gEACtB,IAAmC,QAAA,IAA7B,WAAM,iBAAe;gEAC3B,IAAoD,QAAA,IAA9C,WAAM,gBAAa,IAAI,QAAQ,KAAK,GAAA,CAAA;;4DAE3C,IAEO,QAAA,IAFD,WAAM,gBAAgB,aAAK,cAAA,KAAA;gEAAO,UAAU;4DAAO,GAAA;gEAAA;6DAAA;gEACxD,IAAgC,QAAA,IAA1B,WAAM,cAAY;;;;;;;;;;;;;;gDAQhB,QAAA,KAAO,CAAA,EAAA,CAAI,cAAA,KAAa,CAAC,MAAM,CAAA,GAAA,CAAA,CAAA,GAA5C;wCAAA,IAIO,QAAA,gBAJ6C,WAAM;4CACzD,IAAkC,QAAA,IAA5B,WAAM,eAAa;4CACzB,IAAuC,QAAA,IAAjC,WAAM,eAAa;4CACzB,IAAuC,QAAA,IAAjC,WAAM,cAAY;;;;;+CAIb,QAAA,KAAO,GAAnB;wCAAA,IAGO,QAAA,gBAHc,WAAM;4CAC1B,IAAqC,QAAA,IAA/B,WAAM;4CACZ,IAAwC,QAAA,IAAlC,WAAM,iBAAe;;;;;gDAGf,QAAA,KAAO,CAAA,EAAA,CAAI,cAAA,KAAa,CAAC,MAAM,CAAA,CAAA,CAAA,CAAA,GAA5C;wCAAA,IAEO,QAAA,gBAF2C,WAAM;4CACvD,IAA6C,QAAA,IAAvC,WAAM,iBAAe;;;;;;;;;;4BAK7B,IAA+B,QAAA,IAAzB,WAAM"}