Commit eed47846 authored by lg's avatar lg

chore: temp

parent 58a3fa49
import requestModule from '@/api/request.js'
const {api} = requestModule
import {homeConfig} from "./home/config";
import {ActivityInfo, CodeResponse} from "@/activities/1015/types";
/**
* 获取页面配置
* @returns
*/
export function fetchPageConfig() {
//return api.get('/c/front/content', {type: 'act915',version: '1'})
return Promise.resolve({
data: homeConfig,
})
}
/**
* 获取抽奖配置
* @returns
*/
export function fetchLotteryConfig (){
return api.get('/c/front/content', {type: 'act915Lottery',version: '1'})
}
/**
* 获取915活动首页信息
* @returns
*/
export function fetchActivityInfo (){
return api.post('/c/activity/use_invite_915/invitation/home') as Promise<CodeResponse<ActivityInfo>>
}
/**
* 邀请助力
* @returns
*/
export function invitationAssist(inviterUserId, unionId) {
return api.post('/c/activity/use_invite_915/invitation/assist', {invitationCode: inviterUserId, wxUnionId: unionId})
}
/**
* 获取抽奖信息
* @returns
*/
export function fetchLotteryInfo (){
return api.get('/c/activity/turntable_lottery_915/home')
}
/**
* 抽奖
* @returns
*/
export function lotteryDraw (){
return api.post('/c/activity/turntable_lottery_915/lottery/draw')
}
<script setup lang="ts">
import {computed, inject} from 'vue'
import {jump} from '@/utils'
import {MdConfig} from "../types";
import {useMD} from "../use-md";
const props = defineProps<{
properties?: {
area?: { x: number, y: number, width: number, height: number }
link?: { type: number, url: string, extra: any }
mdConfig?: MdConfig
}
openType?: string
debugMode?: boolean
}>()
const pageName = inject('pageName', '')
const style = computed(() => {
const area = props.properties.area
return {
left: area.x + 'rpx',
top: area.y + 'rpx',
width: area.width + 'rpx',
height: area.height + 'rpx',
}
})
const {logClick} = useMD(props.properties.mdConfig || {})
const emit = defineEmits<{
(e: 'click', e: any): void
(e: 'getphonenumber', e: any): void
}>()
function onClick(e) {
emit('click', e)
if (props.properties.link) {
jump(props.properties.link)
}
logClick()
}
</script>
<template>
<button class="click-area" :class="{'debug-mode': debugMode}" :style="style"
:open-type="openType"
@click="onClick"
@getphonenumber="(e) => emit('getphonenumber', e)"
/>
</template>
<style scoped lang="less">
.click-area {
position: absolute;
border: none;
border-radius: 0;
&.debug-mode {
background-color: rgba(255, 0, 0, 0.3);
}
&::after {
border: none;
}
}
</style>
\ No newline at end of file
@import "@/common.less";
<template>
<view class="got-prize-modal" v-if="visible">
<!-- 蒙层 -->
<view class="got-prize-modal-mask" @click="handleCloseClick"></view>
.drawsucmodal {
<!-- 弹窗内容 -->
<view class="got-prize-modal-content">
<span class="got-prize-modal-bg"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.background)})` }"></span>
<image class="got-prize-modal-awardimg" :src="`${$baseUrl}${awardImageUrl}`" mode="aspectFit"
v-if="awardImageUrl" @error="console.log('奖品图片加载失败')"></image>
<span class="got-prize-modal-awardname">{{ awardName }}</span>
<span class="got-prize-modal-happygetbtn"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.happyGetBtn)})` }"
@click="handleHappyGetClick"></span>
<span class="got-prize-modal-closebtn"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.closeBtn)})` }"
@click="handleCloseClick"></span>
</view>
</view>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import {config, getImageUrl} from './GotPrizeModal/config.js'
import './GotPrizeModal/index.less'
export interface ShowGotPrizeModalOptions {
awardName: string
awardImageUrl: string
}
const visible = ref(false)
const options = ref<ShowGotPrizeModalOptions>()
// Emits
const emit = defineEmits<{
(e: 'close'): void
(e: 'confirm'): void
}>()
function show(options: ShowGotPrizeModalOptions) {
options.value = options
visible.value = true
}
function hide() {
visible.value = false
}
defineExpose({
show,
hide,
})
</script>
<style scoped>
.got-prize-modal {
width: 100vw;
height: 100vh;
left: 0rpx;
......@@ -12,7 +67,8 @@
justify-content: center;
// 蒙层
.drawsucmodal-mask {
&-mask {
width: 100%;
height: 100%;
position: absolute;
......@@ -21,7 +77,8 @@
}
// 弹窗内容
.drawsucmodal-content {
&-content {
width: 550rpx;
height: 616rpx;
position: relative;
......@@ -32,7 +89,7 @@
justify-content: center;
}
.drawsucmodalbg {
&-bg {
width: 550rpx;
height: 616rpx;
position: absolute;
......@@ -43,7 +100,7 @@
background-position: center;
}
.drawsucmodalawardimg {
&-awardimg {
width: 180rpx;
height: 180rpx;
position: absolute;
......@@ -53,7 +110,7 @@
z-index: 3;
}
.drawsucmodalawardname {
&-awardname {
width: 348rpx;
height: 30rpx;
position: absolute;
......@@ -68,7 +125,7 @@
white-space: nowrap;
}
.drawsucmodalhappygetbtn {
&-happygetbtn {
width: 465rpx;
height: 97rpx;
position: absolute;
......@@ -84,7 +141,7 @@
}
}
.drawsucmodalclosebtn {
&-closebtn {
width: 60rpx;
height: 59rpx;
position: absolute;
......@@ -100,3 +157,5 @@
}
}
}
</style>
<script setup lang="ts">
import {onMounted, ref} from 'vue'
import {LinkType, MdConfig} from "../types"
import {useMD} from "../use-md"
import {jump} from '@/utils'
export interface ImageSwiperItem {
image: string
link?: LinkType
}
const props = defineProps<{
properties?: {
autoplay?: boolean
interval?: number
duration?: number
circular?: boolean
indicatorDots?: boolean
items: ImageSwiperItem[]
}
style?: Record<string, any>
}>()
const mds = ref([])
onMounted(() => {
mds.value = props.properties.items.map(item => {
const md = useMD(item.mdConfig || {}, false)
md.logExposure()
return md
})
})
function onClickItem(item: ImageSwiperItem, index: number) {
if (item.link) {
jump(item.link)
}
mds.value[index].logClick()
}
</script>
<template>
<swiper class="comp-swiper"
:style="style"
:indicator-dots="properties.indicatorDots"
:autoplay="properties.autoplay"
:circular="properties.circular"
:interval="properties.interval"
:duration="500">
<swiper-item v-for="(item, index) in properties.items" :key="index" @click="onClickItem(item, index)">
<image class="comp-swiper-item" :src="item.image" mode="aspectFill"></image>
</swiper-item>
</swiper>
</template>
<style scoped lang="less">
.comp-swiper {
&-item {
width: 100%;
height: 100%;
}
}
</style>
\ No newline at end of file
<script setup lang="ts">
import {ref, computed, watch, inject} from 'vue'
import ClickArea from "./ClickArea.vue";
import {ActivityInfo} from "../types"
import {invitationAssist} from "../api";
const isAssist = ref(false)
const isLogin = inject('isLogin')
const updateActivityInfo = inject('updateActivityInfo')
const onGetPhoneNumber = inject('onGetPhoneNumber')
const props = defineProps<{
properties?: {
area?: { x: number, y: number, width: number, height: number }
mdConfig?: MdConfig
}
activityData?: ActivityInfo
debugMode?: boolean
}>()
const inviteBtnProperties = computed(() => {
return {
area: {x: 220, y: 110, width: 165, height: 55},
mdConfig: props.properties.mdConfig,
}
})
const style = computed(() => {
const area = props.properties.area
return {
left: area.x + 'rpx',
top: area.y + 'rpx',
width: area.width + 'rpx',
height: area.height + 'rpx',
}
})
watch(() => props.activityData, (activityData) => {
if (activityData) {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options;
const invitationCode = options.invitationCode;
if (invitationCode && !isAssist.value && isLogin.value) {
handleInvitationAssist(invitationCode);
}
}
})
// 处理邀请助力的通用函数
const handleInvitationAssist = async (incomingCode) => {
try {
console.log('处理助力邀请码:', incomingCode)
const unionId = uni.getStorageSync('unionId');
const res = await invitationAssist(incomingCode, unionId);
if (res && res.success) {
uni.showToast({
title: '助力成功',
icon: 'none',
duration: 2000
});
isAssist.value = true;
// 助力成功后重新获取数据
await updateActivityInfo();
return Promise.resolve();
} else {
uni.showToast({
title: res.message,
icon: 'none',
duration: 2000
});
return Promise.reject();
}
} catch (error) {
console.error('助力请求失败:', error)
uni.showToast({
title: error.message,
icon: 'none',
duration: 2000
});
return Promise.reject();
}
}
function clickInvite() {
}
</script>
<template>
<view class="invite-task" :class="{'debug-mode': debugMode}" :style="style">
<ClickArea
:properties="inviteBtnProperties"
:open-type="isLogin ? 'share' : 'getPhoneNumber'"
@click="clickInvite"
@getphonenumber="onGetPhoneNumber"
debug-mode
/>
</view>
</template>
<style scoped lang="less">
.invite-task {
position: absolute;
&.debug-mode {
background-color: rgba(255, 0, 0, 0.3);
}
}
</style>
\ No newline at end of file
const version = 'v1'
// 915活动页面配置
export const act915Config = {
// 页面状态
states: {
NORMAL: 'normal',
INVITED: 'invited',
COMPLETED: 'completed'
},
import bgUrl from '../images/bg.png'
import banner0Url from '../images/banner-0.png'
import banner1Url from '../images/banner-1.png'
// 图片配置
images: {
background: `Act915Page/${version}/Act915PageBg.png`,
goods1: `Act915Page/${version}/Act915PageGoods1.png`,
goods3: `Act915Page/${version}/Act915PageGoods3.png`,
goodslist2: `Act915Page/${version}/Act915PageGoodsList2.png`,
goodslist1: `Act915Page/${version}/Act915PageGoodsList1.png`,
inviteConBg: `Act915Page/${version}/Act915PageInviteConBg.png`,
inviteConBtn: `Act915Page/${version}/Act915PageInviteConBtn.png`,
inviteConStatusNo2: `Act915Page/${version}/Act915PageInviteConStatusNo2.png`,
inviteConStatusNo1: `Act915Page/${version}/Act915PageInviteConStatusNo1.png`,
inviteConStatusYes2: `Act915Page/${version}/Act915PageInviteConStatusYes2.png`,
inviteConStatusYes1: `Act915Page/${version}/Act915PageInviteConStatusYes1.png`,
inviteConImg: `Act915Page/${version}/Act915PageInviteConImg.png`,
lotteryBanner: `Act915Page/${version}/Act915PageLotteryBanner.png`,
banner: `Act915Page/${version}/Act915PageBanner.png`,
banner2: `Act915Page/${version}/Act915PageBanner.png`,
banner3: `Act915Page/${version}/Act915PageBanner.png`
},
const pageName = '1015专题活动页面'
// 文本配置
texts: {
inviteTitle: '邀请好友助力得XXXXX',
inviteBtnText: '立即邀请',
lotteryTitle: '抽奖活动',
goodsTitle: '商品展示'
// 页面配置
export const homeConfig = {
"background": {
image: bgUrl,
style: {
backgroundPosition: {y: "calc(4937rpx + 845rpx)"}
}
},
// 活动配置
activity: {
maxInvites: 2, // 最大邀请人数
reward: 'XXXXX', // 奖励内容
startTime: '2024-09-15 00:00:00',
endTime: '2024-09-30 23:59:59'
shareConfig: {
title: '星妈会超级品牌周来啦!',
path: '/activities/1015/home/index',
imageUrl: 'https://course.feihe.com/momclub-picture/Act915Page/v2/act915ShareImg.png',
},
components: [
{
type: "image-swiper",
properties: {
autoplay: true,
interval: 3000,
duration: 500,
circular: true,
indicatorDots: true,
items: [{
image: banner0Url,
mdConfig: {
pageName,
componentName: "banner头图",
componentContent: "北纬47 °",
logExposure: true,
},
}, {
image: banner1Url,
mdConfig: {
pageName,
componentName: "banner头图",
componentContent: "国际大米节金奖",
logExposure: true,
},
link: {
type: 2,
url: "subPackages/shopMainProcess/product/index?productId=643246351932056828&skuId=643246351932056829&entrySource=xmh_wechatmp_activity_1015ppz",
extra: {envVersion: "release", appId: "wx4205ec55b793245e"},
}
}]
},
style: {
height: "845rpx",
}
},
{
type: "click-area",
properties: {
area: {x: 35, y: 915, width: 685, height: 245},
mdConfig: {
pageName,
componentName: "商品banner",
componentContent: "商品banner",
logExposure: true,
logClick: true,
},
link: {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=720448018529899563&skuId=720448018529899564&entrySource=xmh_wechatmp_activity_1015ppz"
},
},
},
{
type: "click-area",
properties: {
area: {x: 50, y: 2095, width: 320, height: 390},
mdConfig: {
pageName,
componentName: "品牌宣传1",
componentContent: "商品名称1",
logExposure: true,
logClick: true,
},
link: {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=643246351932056828&skuId=643246351932056829&entrySource=xmh_wechatmp_activity_1015ppz"
},
}
},
{
type: "click-area",
properties: {
area: {x: 380, y: 2095, width: 320, height: 390},
mdConfig: {
pageName,
componentName: "品牌宣传1",
componentContent: "商品名称2",
logExposure: true,
logClick: true,
},
link: {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=643245114369684591&skuId=643245114369684592&entrySource=xmh_wechatmp_activity_1015ppz"
},
}
},
{
type: "click-area",
properties: {
area: {x: 50, y: 3405, width: 320, height: 390},
mdConfig: {
pageName,
componentName: "品牌宣传2",
componentContent: "商品名称1",
logExposure: true,
logClick: true,
},
link: {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=368848644886521333&skuId=368848644886521334&entrySource=xmh_wechatmp_activity_1015ppz"
},
}
},
{
type: "click-area",
properties: {
area: {x: 380, y: 3405, width: 320, height: 390},
mdConfig: {
pageName,
componentName: "品牌宣传2",
componentContent: "商品名称2",
logExposure: true,
logClick: true,
},
link: {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=367056951412568222&skuId=367056951412568223&entrySource=xmh_wechatmp_activity_1015ppz"
},
}
},
{
type: "invite-task",
properties: {
area: {x: 35, y: 3865, width: 685, height: 195},
mdConfig: {
pageName,
componentName: "邀请得好礼",
componentContent: "立即邀请",
logExposure: true,
logClick: true,
},
},
},
{
type: "click-area",
properties: {
area: {x: 35, y: 4080, width: 685, height: 245},
mdConfig: {
pageName,
componentName: "中部抽奖banner",
componentContent: "中部抽奖banner",
logExposure: true,
logClick: true,
},
link: {
"type": 1,
"url": "/activities/1015/lottery/index"
},
},
},
{
"type": "click-area",
"properties": {
"area": {"x": 50, "y": 4405, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品1",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=643243579803297229&skuId=643243579803297230&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 270, "y": 4405, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品2",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=367070126091559975&skuId=367070126091559976&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 490, "y": 4405, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品3",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=367072891644670759&skuId=367072891644670760&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 50, "y": 4705, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品4",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=649435440113431085&skuId=649435440113431086&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 270, "y": 4705, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品5",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=662389781175669644&skuId=662389781175669645&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 490, "y": 4705, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品1",
componentContent: "商品6",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=759248536249386165&skuId=759248536249386166&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 50, "y": 5110, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品1",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=399302177175705120&skuId=399302177175705121&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 270, "y": 5110, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品2",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=650599779914081413&skuId=650599779914081414&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 490, "y": 5110, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品3",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=667527760599458548&skuId=667527760599458549&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 50, "y": 5410, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品4",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=548984197069284758&skuId=548984197069284759&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 270, "y": 5410, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品5",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=792232869316748776&skuId=792232869316748777&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
{
"type": "click-area",
"properties": {
"area": {"x": 490, "y": 5410, "width": 200, "height": 285},
"mdConfig": {
pageName,
componentName: "6组商品2",
componentContent: "商品6",
logExposure: true,
logClick: true,
},
"link": {
"extra": {"envVersion": "release", "appId": "wx4205ec55b793245e"},
"type": 2,
"url": "subPackages/shopMainProcess/product/index?productId=704050114989893289&skuId=704050114989893290&entrySource=xmh_wechatmp_activity_1015ppz"
}
}
},
],
"lottery": {
"image": "act1015Page/v3/act1015PageLotteryBanner.png",
"link": {"type": 1, "url": "/activity0915/lottery/lottery"}
},
"invite": {
"image": "act1015Page/v3/act1015PageInviteConBg.png",
"link": {"type": 1, "url": "/pages/invite/invite"},
"inviteConStatusNo1Img": "act1015Page/v3/act1015PageInviteConStatusNo.png",
"inviteConStatusYes2Img": "act1015Page/v3/act1015PageInviteConStatusYes.png",
"inviteConStatusYes1Img": "act1015Page/v3/act1015PageInviteConStatusYes.png",
"inviteConStatusNo2Img": "act1015Page/v3/act1015PageInviteConStatusNo.png"
}
}
//console.log('page-config:', JSON.stringify(act1015Config, null, 2))
// 获取图片URL的工具函数
export const getImageUrl = (imagePath) => {
return imagePath
......
// 加载状态样式
.loading-container {
.activity-page {
width: 750rpx;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
text {
font-size: 32rpx;
color: #666;
}
}
// 915活动页面样式
.act915page {
width: 750rpx;
height: 1624rpx;
left: 0rpx;
top: 0rpx;
position: absolute;
height: calc(4937rpx + 845rpx);
position: relative;
max-width: 100vw; // 确保不超过视口宽度
overflow-x: hidden; // 防止水平滚动
background-size: contain;
background-repeat: no-repeat;
background-position: left 845rpx;
// 返回按钮样式
.nav-left {
......@@ -35,420 +20,4 @@
height: 60rpx;
}
}
.act915pagebg {
width: 750rpx;
height: 4238rpx;
left: 0rpx;
top: 0rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoods1 {
width: 685rpx;
height: 244rpx;
left: 32rpx;
top: 1370rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoods3-container {
width: 701rpx;
height: 370rpx;
left: 24rpx;
top: 1648rpx;
position: absolute;
.act915pagegoods3bg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoods3products {
position: absolute;
top: 13rpx;
left: 10rpx;
width: 203rpx;
height: 286rpx;
display: flex;
gap: 14rpx; // 商品之间的间距
padding: 25rpx; // 容器内边距
pointer-events: none; // 让子元素可以点击
.act915pagegoods3product {
flex: 1;
height: 286rpx; // 固定高度,确保商品项有足够空间
position: relative;
pointer-events: auto; // 恢复点击事件
transition: all 0.3s ease;
min-width: 200rpx; // 最小宽度确保可点击性
&:hover {
opacity: 0.8;
transform: scale(1.02);
}
// 为不同位置的商品设置不同的点击区域
&.product-left {
// 左侧商品点击区域
}
&.product-center {
// 中间商品点击区域
}
&.product-right {
// 右侧商品点击区域
}
}
}
}
.act915pagegoodslist2 {
width: 701rpx;
height: 791rpx;
left: 24rpx;
top: 3369rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoodslist2-container {
width: 701rpx;
height: 791rpx;
left: 24rpx;
top: 3369rpx;
position: absolute;
.act915pagegoodslist2bg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoodslist2products {
position: absolute;
top: 110rpx;
left: 10rpx;
width: 654rpx;
height: 316 * 2rpx;
display: grid;
grid-template-columns: 1fr 1fr 1fr; // 3列等宽
grid-template-rows: 1fr 1fr; // 2行等高
gap: 0rpx; // 网格间距
padding: 20rpx; // 容器内边距
pointer-events: none; // 让子元素可以点击
.act915pagegoodslist2product {
position: relative;
pointer-events: auto; // 恢复点击事件
transition: all 0.3s ease;
width: 204rpx;
height: 295rpx;
&:hover {
opacity: 0.8;
transform: scale(1.02);
}
// 为不同位置的商品设置不同的点击区域
&.product-1 {
// 第一行左侧商品
}
&.product-2 {
// 第一行中间商品
}
&.product-3 {
// 第一行右侧商品
}
&.product-4 {
// 第二行左侧商品
}
&.product-5 {
// 第二行中间商品
}
&.product-6 {
// 第二行右侧商品
}
}
}
}
.act915pagegoodslist1-container {
width: 701rpx;
height: 795rpx;
left: 24rpx;
top: 2546rpx;
position: absolute;
.act915pagegoodslist1bg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pagegoodslist1products {
position: absolute;
top: 113rpx;
left: 10rpx;
width: 654rpx;
height: 316 * 2rpx;
display: grid;
grid-template-columns: 1fr 1fr 1fr; // 3列等宽
grid-template-rows: 1fr 1fr; // 2行等高
gap: 0rpx; // 网格间距
padding: 20rpx; // 容器内边距
pointer-events: none; // 让子元素可以点击
.act915pagegoodslist1product {
position: relative;
pointer-events: auto; // 恢复点击事件
transition: all 0.3s ease;
width: 204rpx;
height: 295rpx;
&:hover {
opacity: 0.8;
transform: scale(1.02);
}
// 为不同位置的商品设置不同的点击区域
&.product-1 {
// 第一行左侧商品
}
&.product-2 {
// 第一行中间商品
}
&.product-3 {
// 第一行右侧商品
}
&.product-4 {
// 第二行左侧商品
}
&.product-5 {
// 第二行中间商品
}
&.product-6 {
// 第二行右侧商品
}
}
}
}
.act915pageinvitecon {
width: 686rpx;
height: 210rpx;
left: 31rpx;
top: 2045rpx;
position: absolute;
.act915pageinviteconbg {
width: 686rpx;
height: 210rpx;
left: 0rpx;
top: 0rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
// 重置button默认样式
border: none;
outline: none;
padding: 0;
margin: 0;
background-color: transparent;
// 移除button的默认样式
&::after {
border: none;
}
// 移除button的默认边框
&::before {
border: none;
}
}
.act915pageinviteconbtn {
width: 164rpx;
height: 63rpx;
left: 205rpx;
top: 107rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
transition: opacity 0.3s ease;
&:hover {
opacity: 0.8;
}
}
.act915pageinviteconstatus {
width: 148rpx;
height: 67rpx;
left: 28rpx;
top: 104rpx;
pointer-events: none;
position: absolute;
.act915pageinviteconstatusno2 {
width: 65rpx;
height: 66rpx;
left: 83rpx;
top: 0rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pageinviteconstatusno1 {
width: 65rpx;
height: 66rpx;
left: 0rpx;
top: 1rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pageinviteconstatusyes2 {
width: 64rpx;
height: 65rpx;
left: 84rpx;
top: 0rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.act915pageinviteconstatusyes1 {
width: 64rpx;
height: 65rpx;
left: 2rpx;
top: 1rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
}
.act915pageinvitecontitle {
width: 347rpx;
height: 31rpx;
left: 30rpx;
top: 36rpx;
position: absolute;
font-size: 32rpx;
line-height: 31rpx;
color: rgba(255, 255, 255, 1);
}
.act915pageinviteconimg {
width: 155rpx;
height: 155rpx;
left: 497rpx;
top: 28rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
}
.act915pagelotterybanner {
width: 685rpx;
height: 210rpx;
left: 32rpx;
top: 2294rpx;
position: absolute;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.mask-background {
width: 750rpx;
height: 459rpx;
left: 0rpx;
top: 2045rpx;
position: absolute;
.auth-button {
width: 750rpx;
height: 459rpx;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
border: none !important;
outline: none !important;
padding: 0;
margin: 0;
background-color: transparent !important;
}
.auth-button::after {
border: none !important;
outline: none !important;
border-radius: 0 !important;
}
}
.act915pagebanner {
width: 750rpx;
height: 1332rpx;
left: 0rpx;
top: 0rpx;
position: absolute;
.act915pagebanneritem {
width: 100%;
height: 100%;
display: block;
}
}
}
<template>
<view class="act915page" v-if="!loading">
<view class="activity-page" v-if="!loading" :style="bgStyle">
<!-- 返回按钮 -->
<view class="nav-left">
<image class="back-btn" :src="$baseUrl + 'xingmaLab/1001/backBtn.png'" mode="aspectFit"
@click="handleBack" />
<image class="back-btn" src="@/assets/images/backBtn.png" mode="aspectFit"
@click="handleBack"/>
</view>
<span class="act915pagebg" :style="getBackgroundStyle()"></span>
<span class="act915pagegoods1" :style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('goods1')})` }"
@click="handleGoods1Click"></span>
<!-- 商品3区域 - 分成3个点击区域 -->
<view class="act915pagegoods3-container">
<span class="act915pagegoods3bg"
:style="{ backgroundImage: `url(${$baseUrl}${getGoodsImage('goods3')})` }"></span>
<!-- 三个商品点击区域 -->
<view class="act915pagegoods3products">
<!-- 商品1 - 左侧 -->
<view class="act915pagegoods3product product-left" @click="handleGoods3Click(1)"></view>
<!-- 商品2 - 中间 -->
<view class="act915pagegoods3product product-center" @click="handleGoods3Click(2)"></view>
<!-- 商品3 - 右侧 -->
<view class="act915pagegoods3product product-right" @click="handleGoods3Click(3)"></view>
</view>
</view>
<!-- 商品列表2区域 - 分成6个点击区域 -->
<view class="act915pagegoodslist2-container">
<span class="act915pagegoodslist2bg"
:style="{ backgroundImage: `url(${$baseUrl}${getGoodsImage('goodslist2')})` }"></span>
<!-- 6个商品点击区域 -->
<view class="act915pagegoodslist2products">
<!-- 商品1 - 第一行左侧 -->
<view class="act915pagegoodslist2product product-1" @click="handleGoodsList2Click(1)"></view>
<!-- 商品2 - 第一行中间 -->
<view class="act915pagegoodslist2product product-2" @click="handleGoodsList2Click(2)"></view>
<!-- 商品3 - 第一行右侧 -->
<view class="act915pagegoodslist2product product-3" @click="handleGoodsList2Click(3)"></view>
<!-- 商品4 - 第二行左侧 -->
<view class="act915pagegoodslist2product product-4" @click="handleGoodsList2Click(4)"></view>
<!-- 商品5 - 第二行中间 -->
<view class="act915pagegoodslist2product product-5" @click="handleGoodsList2Click(5)"></view>
<!-- 商品6 - 第二行右侧 -->
<view class="act915pagegoodslist2product product-6" @click="handleGoodsList2Click(6)"></view>
</view>
</view>
<!-- 商品列表1区域 - 分成6个点击区域 -->
<view class="act915pagegoodslist1-container">
<span class="act915pagegoodslist1bg"
:style="{ backgroundImage: `url(${$baseUrl}${getGoodsImage('goodslist1')})` }"></span>
<!-- 6个商品点击区域 -->
<view class="act915pagegoodslist1products">
<!-- 商品1 - 第一行左侧 -->
<view class="act915pagegoodslist1product product-1" @click="handleGoodsList1Click(1)"></view>
<!-- 商品2 - 第一行中间 -->
<view class="act915pagegoodslist1product product-2" @click="handleGoodsList1Click(2)"></view>
<!-- 商品3 - 第一行右侧 -->
<view class="act915pagegoodslist1product product-3" @click="handleGoodsList1Click(3)"></view>
<!-- 商品4 - 第二行左侧 -->
<view class="act915pagegoodslist1product product-4" @click="handleGoodsList1Click(4)"></view>
<!-- 商品5 - 第二行中间 -->
<view class="act915pagegoodslist1product product-5" @click="handleGoodsList1Click(5)"></view>
<!-- 商品6 - 第二行右侧 -->
<view class="act915pagegoodslist1product product-6" @click="handleGoodsList1Click(6)"></view>
</view>
</view>
<div class="act915pageinvitecon">
<button class="act915pageinviteconbg" @click="handleInviteClick"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('inviteConBg')})` }"
open-type="share"></button>
<div class="act915pageinviteconstatus">
<!-- 根据邀请人数动态显示状态 -->
<span v-if="nextRewardNeedCount == 1" class="act915pageinviteconstatusyes1"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('inviteConStatusYes1')})` }"></span>
<span v-else class="act915pageinviteconstatusno1"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('inviteConStatusNo1')})` }"></span>
<span v-if="nextRewardNeedCount == 0" class="act915pageinviteconstatusyes2"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('inviteConStatusYes2')})` }"></span>
<span v-else class="act915pageinviteconstatusno2"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('inviteConStatusNo2')})` }"></span>
</div>
</div>
<span class="act915pagelotterybanner"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl('lotteryBanner')})` }"
@click="handleLotteryClick"></span>
<!-- Banner轮播图 -->
<swiper class="act915pagebanner" :indicator-dots="true" :autoplay="true" :circular="true" :interval="3000"
:duration="500">
<swiper-item v-for="(banner, index) in bannerList" :key="index" @click="handleBannerClick(index)">
<image class="act915pagebanneritem" :src="$baseUrl + getBannerImage(banner)" mode="aspectFill"></image>
</swiper-item>
</swiper>
<!-- Full screen mask for new users -->
<view class="mask-background" v-if="showMask">
<button class="auth-button" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">
</button>
</view>
<!-- 抽奖成功弹窗 -->
<DrawSucModal :visible="showDrawSucModal" :award-name="currentAwardName" :award-image-url="currentAwardImageUrl"
@close="handleDrawSucModalClose" @happy-get="handleHappyGet" />
<template v-for="(component, index) in pageConfig.components" :key="'comp-' + index">
<ImageSwiper
v-if="component.type === 'image-swiper'"
v-bind="component"
:activity-data="activityInfo"
/>
<ClickArea
v-else-if="component.type === 'click-area'"
v-bind="component"
debug-mode
:activity-data="activityInfo"
/>
<InviteTask
v-else-if="component.type === 'invite-task'"
v-bind="component"
:debug-mode="false"
:activity-data="activityInfo"
/>
</template>
<GotPrizeModal :visible="showGotPrizeModal" :award-name="currentAwardName" :award-image-url="currentAwardImageUrl"
@close="handleGotPrizeModalClose" @happy-get="handleHappyGet"/>
</view>
</template>
<script setup>
import { ref, onMounted, computed, getCurrentInstance } from 'vue'
import { fetchAct915JSON, getAct915Home } from '@/api/activity0915/index.js'
import { useHomeStore } from '@/stores/home'; // Assuming homeStore path
import { useUserStore } from '@/stores/user'; // Import userStore
import { invitationAssist } from '@/api/activity0915/index.js'; // Import invitationAssist
import { jump } from '@/utils/index.js'; // Import jump function
import DrawSucModal from '../lottery/components/drawSucModal/drawSucModal.vue'; // Import DrawSucModal if needed
<script setup lang="ts">
import {ref, onMounted, computed, getCurrentInstance, provide} from 'vue'
import {fetchPageConfig, fetchActivityInfo, invitationAssist} from '../api.ts'
import {useHomeStore} from '@/stores/home'; // Assuming homeStore path
import {useUserStore} from '@/stores/user'; // Import userStore
import {jump, JumpType} from '@/utils/index.js'; // Import jump function
import GotPrizeModal from '../components/GotPrizeModal.vue'; // Import GotPrizeModal if needed
import md from '@/md.js';
// 组件名称
defineOptions({
name: 'Act915Page'
})
// 定义分享函数
const getShareData = (type) => {
console.log('getShareData 被调用', type)
const { proxy } = getCurrentInstance()
const $baseUrl = proxy.$baseUrl
const shareTitle = '星妈会超级品牌周来啦!666积分兑换爱本纤纤3日装!'
const shareImage = $baseUrl + 'Act915Page/v2/act915ShareImg.png'
const sharePath = type.from == 'button' ? `/activity0915/act0915/act0915?invitationCode=${invitationCode.value}` : `/activity0915/act0915/act0915`
console.log('分享参数:', {
title: shareTitle,
imageUrl: shareImage,
path: sharePath,
invitationCode: invitationCode.value
})
return {
title: shareTitle,
path: sharePath,
imageUrl: shareImage
}
}
import ClickArea from "../components/ClickArea.vue";
import ImageSwiper from "../components/ImageSwiper.vue";
import './index.less'
import InviteTask from "../components/InviteTask.vue";
import {ActivityInfo} from "../types";
// 响应式数据
const currentState = ref('normal') // 页面状态
const config = ref({}) // 配置对象
const bannerList = ref([]) // Banner列表
const pageConfig = ref({}) // 配置对象
const loading = ref(true) // 加载状态
// 邀请相关数据
const showMask = ref(true);
const showDrawSucModal = ref(false);
const showGotPrizeModal = ref(true);
const currentAwardName = ref('');
const currentAwardImageUrl = ref('');
const invitationCode = ref('');
const invitationText = ref('');
const invitationImageUrl = ref('');
const invitedCount = ref(0);
const nextRewardNeedCount = ref(2);
const unclaimedPrizes = ref([]);
const receivedPrizes = ref([]);
const isLogin = ref(false);
const isAssist = ref(false);
const activityInfo = ref<ActivityInfo>(undefined)
const shareData = ref({
title: '星妈会超级品牌周来啦!',
imageUrl: 'https://course.feihe.com/momclub-picture/Act915Page/v2/act915ShareImg.png',
path: '/activities/1015/home/index',
})
// 获取store实例
const homeStore = useHomeStore();
const userStore = useUserStore();
function updateShareData(data) {
shareData.value = data
}
// 获取背景样式的辅助函数
const getBackgroundStyle = () => {
const backgroundImage = getImageUrl('background')
const bgStyle = computed(() => {
const backgroundImage = pageConfig.value?.background?.image
if (backgroundImage) {
// 获取全局属性
const { proxy } = getCurrentInstance()
const {proxy} = getCurrentInstance()
const $baseUrl = proxy.$baseUrl
return {
backgroundImage: `url(${$baseUrl}${backgroundImage})`
//backgroundImage: `url(${$baseUrl}${backgroundImage})`
backgroundImage: `url(${backgroundImage})`
}
} else {
// 如果背景图片不存在,使用渐变背景
return {
background: `linear-gradient(to bottom, ${config.value?.background?.color}, ${config.value?.background?.color2})`
background: `linear-gradient(to bottom, ${pageConfig.value?.background?.color}, ${pageConfig.value?.background?.color2})`
}
}
})
// 定义分享函数
const getShareData = (type) => {
console.log('getShareData 被调用', type)
const {title, imageUrl, path} = shareData.value
const sharePath = type.from == 'button' ? `${path}?invitationCode=${invitationCode.value}` : path
console.log('分享参数:', {
title,
path: sharePath,
imageUrl,
invitationCode: invitationCode.value,
})
return {
title,
path: sharePath,
imageUrl,
}
}
// 返回按钮处理
const handleBack = () => {
console.log('点击返回按钮')
// md.sensorComponentLogTake({
// xcxComponentClick: "true",
// pageName: "915专题活动首页",
// componentName: "返回按钮",
// componentContent: "返回"
// });
try {
uni.navigateBack({
......@@ -244,161 +136,34 @@ const handleBack = () => {
}
}
// 商品1区域点击处理
const handleGoods1Click = () => {
console.log('点击商品1区域')
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
componentName: "商品单列图",
componentContent: config.value?.goods?.goods1?.title || "商品单列图"
});
jump(config.value?.goods?.goods1?.link)
}
// 获取图片URL的辅助函数
const getImageUrl = (imageKey) => {
// 根据不同的图片类型从对应的结构中获取
switch (imageKey) {
case 'background':
return config.value?.background?.image || ''
case 'goods1':
return config.value?.goods?.goods1?.image || ''
case 'inviteConBg':
return config.value?.invite?.image || ''
case 'inviteConStatusNo2':
return config.value?.invite?.inviteConStatusNo2Img || ''
case 'inviteConStatusNo1':
return config.value?.invite?.inviteConStatusNo1Img || ''
case 'inviteConStatusYes2':
return config.value?.invite?.inviteConStatusYes2Img || ''
case 'inviteConStatusYes1':
return config.value?.invite?.inviteConStatusYes1Img || ''
case 'lotteryBanner':
return config.value?.lottery?.image || ''
default:
// 兼容原有的结构
if (config.value?.images?.[imageKey]) {
return config.value.images[imageKey]
}
if (config.value?.config?.images?.[imageKey]) {
return config.value.config.images[imageKey]
}
if (config.value && config.value[imageKey]) {
return config.value[imageKey]
}
return ''
}
}
// 获取Banner图片的辅助函数
const getBannerImage = (banner) => {
// 如果是融合结构(包含 image 和 link)
if (banner && typeof banner === 'object' && banner.image) {
return banner.image
}
// 兼容原有的字符串结构
return banner || ''
}
// 获取商品图片的辅助函数
const getGoodsImage = (goodsKey) => {
// 从商品数据结构中获取图片
const goodsData = config.value.goods?.[goodsKey]
if (goodsData && goodsData.image) {
return goodsData.image
}
// 兼容原有的 config.images 结构
return getImageUrl(goodsKey)
}
// 获取配置数据
const fetchConfig = async () => {
const updatePageConfig = async () => {
try {
loading.value = true
const response = await fetchAct915JSON()
console.log('915活动配置数据:', response)
const response = await fetchPageConfig()
if (response && response.data) {
config.value = response.data
// 设置Banner列表
if (config.value.act915pagebanner && Array.isArray(config.value.act915pagebanner)) {
// 检查是否是融合结构(包含 image 和 link)
if (config.value.act915pagebanner[0] && typeof config.value.act915pagebanner[0] === 'object' && config.value.act915pagebanner[0].image) {
bannerList.value = config.value.act915pagebanner
} else {
// 兼容原有的字符串数组结构
bannerList.value = config.value.act915pagebanner
}
} else if (config.value.config?.images) {
bannerList.value = [
config.value.config.images.banner,
config.value.config.images.banner2,
config.value.config.images.banner3
].filter(Boolean)
}
}
} catch (error) {
pageConfig.value = response.data
updateShareData(pageConfig.value.shareConfig)
}
} finally {
loading.value = false
}
}
// 获取915活动首页信息
const fetchAct915HomeData = async () => {
const updateActivityInfo = async () => {
try {
console.log('开始请求 getAct915Home 接口...')
const response = await getAct915Home()
console.log('getAct915Home 接口返回结果:', response)
console.log('开始请求 fetchActivityInfo 接口...')
const response = await fetchActivityInfo()
console.log('fetchActivityInfo 接口返回结果:', response)
if (response && response.ok && response.data) {
const data = response.data
activityInfo.value = data
// 更新邀请相关数据
invitationCode.value = data.invitationCode
invitationText.value = data.invitationText
invitationImageUrl.value = data.invitationImageUrl
invitedCount.value = data.invitedCount || 0
nextRewardNeedCount.value = data.nextRewardNeedCount || 2
unclaimedPrizes.value = data.unclaimedPrizes || []
receivedPrizes.value = data.receivedPrizes || []
// 判断是否登录(根据notLogin字段或邀请码)
isLogin.value = !data.notLogin
// 检查是否有未领取的奖品需要弹窗
if (unclaimedPrizes.value?.length > 0) {
showPrizeModal()
}
// 检查URL参数中的邀请码
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options;
const incomingCode = options.invitationCode;
if (incomingCode && !isAssist.value) {
console.log('检测到邀请码:', incomingCode)
// 根据登录状态决定助力处理方式
if (isLogin.value) {
showMask.value = false
// 已登录用户直接调用助力接口
console.log('用户已登录,直接调用助力接口')
await handleInvitationAssist(incomingCode);
} else {
// 未登录用户需要先授权
console.log('用户未登录,显示授权弹窗')
showMask.value = true
}
}
if (isLogin.value) {
showMask.value = false
}else{
showMask.value = true
}
invitationCode.value = data.invitationCode
}
return response
......@@ -416,281 +181,48 @@ const showPrizeModal = () => {
const firstPrize = unclaimedPrizes.value[0]
currentAwardName.value = `${firstPrize.prizeName} × ${totalQuantity}`
currentAwardImageUrl.value = firstPrize.prizeImageUrl
showDrawSucModal.value = true
showGotPrizeModal.value = true
}
}
const handleLotteryClick = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
pageName: "1015专题活动首页",
componentName: "中部抽奖banner",
componentContent: "中部抽奖banner"
});
// 从配置中获取抽奖banner链接
const lotteryLink = config.value?.lottery?.link
const lotteryLink = pageConfig.value?.lottery?.link
if (lotteryLink) {
jump(lotteryLink)
} else {
uni.navigateTo({
url: '/activity0915/lottery/lottery'
url: '/activity01015/lottery/lottery'
})
}
}
// 商品3区域点击处理
const handleGoods3Click = (productId) => {
console.log('点击商品3区域商品:', productId)
// 从配置中获取商品信息
const goods3Data = config.value.goods?.goods3
const goods3List = goods3Data?.items || []
const product = goods3List.find(item => item.id === productId)
// 添加埋点
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
componentName: "商品三列图",
componentContent: product?.title || `商品三列图-商品${productId}`
});
if (product && product.link) {
// 直接处理跳转链接
jump(product.link)
} else {
// 使用默认处理
// uni.showToast({
// title: `商品${productId}暂无跳转链接`,
// icon: 'none'
// })
}
}
// 商品列表1区域点击处理
const handleGoodsList1Click = (productId) => {
console.log('点击商品列表1区域商品:', productId)
// 从配置中获取商品信息
const goodsList1Data = config.value.goods?.goodslist1
const goodsList1 = goodsList1Data?.items || []
const product = goodsList1.find(item => item.id === productId)
// 添加埋点
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
componentName: "爆品不错过商品专区",
componentContent: product?.title || `爆品不错过商品专区-商品${productId}`
});
if (product && product.link) {
// 直接处理跳转链接
jump(product.link)
} else {
// // 使用默认处理
// uni.showToast({
// title: `商品列表1-商品${productId}暂无跳转链接`,
// icon: 'none'
// })
}
}
// 商品列表2区域点击处理
const handleGoodsList2Click = (productId) => {
console.log('点击商品列表2区域商品:', productId)
// 从配置中获取商品信息
const goodsList2Data = config.value.goods?.goodslist2
const goodsList2 = goodsList2Data?.items || []
const product = goodsList2.find(item => item.id === productId)
// 添加埋点
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
componentName: "好物等你来商品专区",
componentContent: product?.title || `好物等你来商品专区-商品${productId}`
});
if (product && product.link) {
// 直接处理跳转链接
jump(product.link)
} else {
// 使用默认处理
// uni.showToast({
// title: `商品列表2-商品${productId}暂无跳转链接`,
// icon: 'none'
// })
}
}
// Banner点击处理
const handleBannerClick = (index) => {
console.log('点击Banner:', index)
// 获取当前Banner数据
const currentBanner = bannerList.value[index]
// 如果是融合结构(包含 image 和 link)
if (currentBanner && typeof currentBanner === 'object' && currentBanner.link) {
jump(currentBanner.link)
} else {
// 兼容原有的分离结构
const bannerLinks = config.value.links?.banner
if (bannerLinks && bannerLinks[index]) {
jump(bannerLinks[index])
} else {
// uni.showToast({
// title: `Banner ${index + 1} 暂无跳转链接`,
// icon: 'none'
// })
}
}
}
// 处理邀请助力的通用函数
const handleInvitationAssist = async (incomingCode) => {
try {
console.log('处理助力邀请码:', incomingCode)
const unionId = uni.getStorageSync('unionId');
const res = await invitationAssist(incomingCode, unionId);
if (res && res.success) {
uni.showToast({
title: '助力成功',
icon: 'none',
duration: 2000
});
isAssist.value = true;
// 助力成功后重新获取数据
await fetchAct915HomeData();
return Promise.resolve();
} else {
uni.showToast({
title: res.message,
icon: 'none',
duration: 2000
});
return Promise.reject();
}
} catch (error) {
console.error('助力请求失败:', error)
uni.showToast({
title: error.message,
icon: 'none',
duration: 2000
});
return Promise.reject();
}
}
// 邀请按钮点击处理
const handleInviteClick = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "915专题活动首页",
componentName: "邀请得好礼",
componentContent: "立即邀请"
});
console.log('点击邀请按钮')
// 检查是否登录
if (!isLogin.value) {
// 未登录用户需要先授权
showMask.value = true
return
}
}
// 页面初始化逻辑
const initPage = async () => {
console.log('开始初始化页面...')
// 获取页面配置
await fetchConfig()
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "banner头图",
componentContent: "banner头图"
});
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "商品单列图",
componentContent: config.value?.goods?.goods1?.title || "商品单列图"
});
// 商品三列图埋点 - 遍历每个商品
if (config.value?.goods?.goods3?.items) {
config.value.goods.goods3.items.forEach((item, index) => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "商品三列图",
componentContent: item.title || `商品三列图-商品${index + 1}`
});
});
}
await updatePageConfig()
console.log('配置数据:', pageConfig.value)
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "邀请得好礼",
componentContent: "立即邀请"
});
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "中部抽奖banner",
componentContent: "中部抽奖banner"
});
// 爆品不错过商品专区埋点 - 遍历每个商品
if (config.value?.goods?.goodslist1?.items) {
config.value.goods.goodslist1.items.forEach((item, index) => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "爆品不错过商品专区",
componentContent: item.title || `爆品不错过商品专区-商品${index + 1}`
});
});
}
// 请求 getAct915Home 接口(包含助力逻辑处理)
await updateActivityInfo();
// 好物等你来商品专区埋点 - 遍历每个商品
if (config.value?.goods?.goodslist2?.items) {
config.value.goods.goodslist2.items.forEach((item, index) => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "915专题活动首页",
componentName: "好物等你来商品专区",
componentContent: item.title || `好物等你来商品专区-商品${index + 1}`
});
});
if (unclaimedPrizes.value?.length > 0) {
showPrizeModal()
}
console.log('Banner列表:', bannerList.value)
console.log('配置数据:', config.value)
// 请求 getAct915Home 接口(包含助力逻辑处理)
await fetchAct915HomeData();
}
// 生命周期
onMounted(async () => {
console.log('915活动页面已加载')
console.log('1015活动页面已加载')
// 先进行自动登录获取基础信息,登录成功后执行页面初始化
try {
......@@ -717,6 +249,7 @@ onMounted(async () => {
// Phone authorization
const onGetPhoneNumber = async (e) => {
console.log('onGetPhoneNumber', e.detail)
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options;
......@@ -727,48 +260,34 @@ const onGetPhoneNumber = async (e) => {
// console.warn('onGetPhoneNumber', e.detail)
// 隐藏授权弹窗
userStore.phoneCallback(e.detail, null, null, async () => {
showMask.value = false;
// 重新获取用户信息(登录后)
await fetchAct915HomeData();
await updateActivityInfo();
console.warn('授权后重新获取用户信息')
// 检查是否有邀请码需要处理助力
// if (incomingCode) {
// // 使用统一的助力处理函数
// await handleInvitationAssist(incomingCode);
// }
}, {
wxLoginBusinessDTO: {
activityUserInvite915Code: incomingCode
activityUserInvite1015Code: incomingCode
}
})
} catch (error) {
console.error('授权后处理失败:', error)
uni.showToast({ title: '授权失败', icon: 'none' });
uni.showToast({title: '授权失败', icon: 'none'});
}
} else {
uni.showToast({ title: '授权失败', icon: 'none' });
uni.showToast({title: '授权失败', icon: 'none'});
}
};
// 处理蒙层点击
const handleMaskClick = () => {
showMask.value = false;
};
// 抽奖成功弹窗关闭处理
const handleDrawSucModalClose = () => {
const handleGotPrizeModalClose = () => {
console.log('关闭抽奖成功弹窗');
showDrawSucModal.value = false;
showGotPrizeModal.value = false;
};
// 开心领取处理
const handleHappyGet = () => {
console.log('点击开心领取');
showDrawSucModal.value = false;
showGotPrizeModal.value = false;
// uni.showToast({
// title: '奖品领取成功',
// icon: 'success'
......@@ -779,29 +298,24 @@ const handleHappyGet = () => {
defineExpose({
getShareData
})
</script>
<style lang="less" scoped>
@import 'index.less';
</style>
provide('pageName', '1015专题活动首页')
provide('isLogin', isLogin)
provide('updateShareData', updateShareData)
provide('updateActivityInfo', updateActivityInfo)
provide('onGetPhoneNumber', onGetPhoneNumber)
</script>
<script>
<script lang="ts">
// 微信小程序分享配置 - 使用 Options API
export default {
// 自定义分享内容
onShareAppMessage(type) {
console.log('onShareAppMessage 被调用', type)
onShareAppMessage(event) {
console.log('onShareAppMessage 被调用', event)
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
const pageInstance = currentPage.$vm
return pageInstance.getShareData(type)
return pageInstance.getShareData(event)
},
// 朋友圈分享已禁用
// onShareTimeline() {
// console.log('onShareTimeline 被调用')
// // 朋友圈分享功能已禁用
// return null
// }
}
</script>
......@@ -51,7 +51,9 @@ activity0915/lottery/
## 使用方法
### 在主页面中引入组件
```vue
<template>
<view class="lotterypage">
<!-- 主页面内容 -->
......@@ -80,38 +82,38 @@ activity0915/lottery/
</template>
<script setup>
import RuleModal from './components/ruleModal/ruleModal.vue'
import DrawSucModal from './components/drawSucModal/drawSucModal.vue'
import DrawFailModal from './components/drawFailModal/drawFailModal.vue'
// 弹窗状态
const showRuleModal = ref(false)
const showDrawSucModal = ref(false)
const showDrawFailModal = ref(false)
const currentAwardName = ref('')
// 事件处理
const handleRuleModalClose = () => {
import RuleModal from './components/ruleModal/ruleModal.vue'
import DrawSucModal from '../components/drawSucModal/drawSucModal.vue'
import DrawFailModal from './components/drawFailModal/drawFailModal.vue'
// 弹窗状态
const showRuleModal = ref(false)
const showDrawSucModal = ref(false)
const showDrawFailModal = ref(false)
const currentAwardName = ref('')
// 事件处理
const handleRuleModalClose = () => {
showRuleModal.value = false
}
}
const handleDrawSucModalClose = () => {
const handleDrawSucModalClose = () => {
showDrawSucModal.value = false
}
}
const handleHappyGet = () => {
const handleHappyGet = () => {
showDrawSucModal.value = false
// 处理奖品领取逻辑
}
}
const handleDrawFailModalClose = () => {
const handleDrawFailModalClose = () => {
showDrawFailModal.value = false
}
}
const handleIKnow = () => {
const handleIKnow = () => {
showDrawFailModal.value = false
// 处理失败确认逻辑
}
}
</script>
```
......
......@@ -3,9 +3,9 @@ const version = 'v1'
export const drawFailModalConfig = {
// 图片配置
images: {
background: `Act915Component/DrawFailModal/${version}/DrawFailModalBg.png`,
iKnowBtn: `Act915Component/DrawFailModal/${version}/DrawFailModalBgIKnowBtn.png`,
closeBtn: `Act915Component/DrawFailModal/${version}/DrawFailModalBgCloseBtn.png`
background: `act1015Component/DrawFailModal/${version}/DrawFailModalBg.png`,
iKnowBtn: `act1015Component/DrawFailModal/${version}/DrawFailModalBgIKnowBtn.png`,
closeBtn: `act1015Component/DrawFailModal/${version}/DrawFailModalBgCloseBtn.png`
},
// 文本配置
......
const version = 'v1'
// 抽奖成功弹窗配置
export const drawSucModalConfig = {
// 图片配置
images: {
background: `Act915Component/DrawSucModal/${version}/DrawSucModalBg.png`,
happyGetBtn: `Act915Component/DrawSucModal/${version}/DrawSucModalHappyGetBtn.png`,
closeBtn: `Act915Component/DrawSucModal/${version}/DrawSucModalCloseBtn.png`
},
// 文本配置
texts: {
defaultAwardName: '奖品名称奖品名称',
happyGetButton: '开心领取',
closeButton: '关闭'
},
// 弹窗配置
modal: {
width: 550,
height: 616,
animationDuration: 300
}
}
// 获取图片URL的工具函数
export const getImageUrl = (imagePath) => {
return imagePath
}
<template>
<view class="drawsucmodal" v-if="visible">
<!-- 蒙层 -->
<view class="drawsucmodal-mask" @click="handleCloseClick"></view>
<!-- 弹窗内容 -->
<view class="drawsucmodal-content">
<span class="drawsucmodalbg"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.background)})` }"></span>
<image class="drawsucmodalawardimg" :src="`${$baseUrl}${awardImageUrl}`" mode="aspectFit"
v-if="awardImageUrl" @error="console.log('奖品图片加载失败')"></image>
<span class="drawsucmodalawardname">{{ awardName }}</span>
<span class="drawsucmodalhappygetbtn"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.happyGetBtn)})` }"
@click="handleHappyGetClick"></span>
<span class="drawsucmodalclosebtn"
:style="{ backgroundImage: `url(${$baseUrl}${getImageUrl(config.images.closeBtn)})` }"
@click="handleCloseClick"></span>
</view>
</view>
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue'
import { drawSucModalConfig, getImageUrl } from './config.js'
// 组件名称
defineOptions({
name: 'DrawSucModal'
})
// Props
defineProps({
visible: {
type: Boolean,
default: false
},
awardName: {
type: String,
default: ''
},
awardImageUrl: {
type: String,
default: ''
}
})
// Emits
const emit = defineEmits(['close', 'happy-get'])
// 配置对象
const config = drawSucModalConfig
// 获取$baseUrl
const instance = getCurrentInstance()
const $baseUrl = instance.proxy.$baseUrl
// 开心领取按钮点击处理
const handleHappyGetClick = () => {
console.log('点击开心领取按钮')
emit('happy-get')
}
// 关闭按钮点击处理
const handleCloseClick = () => {
console.log('关闭抽奖成功弹窗')
emit('close')
}
</script>
<style lang="less" scoped>
@import './drawsucmodal.less';
</style>
const version = 'v1'
// 活动规则弹窗配置
export const act915RuleModalConfig = {
export const act1015RuleModalConfig = {
// 图片配置
images: {
background: `Act915Component/Act915RuleModal/${version}/Act915RuleModalBg.png`,
textImg: `Act915Component/Act915RuleModal/${version}/Act915RuleModalTextImg.png`,
closeBtn: `Act915Component/Act915RuleModal/${version}/Act915RuleModalCloseBtn.png`
background: `act1015Component/act1015RuleModal/${version}/act1015RuleModalBg.png`,
textImg: `act1015Component/act1015RuleModal/${version}/act1015RuleModalTextImg.png`,
closeBtn: `act1015Component/act1015RuleModal/${version}/act1015RuleModalCloseBtn.png`
},
// 文本配置
......
......@@ -25,7 +25,7 @@
</template>
<script setup>
import { act915RuleModalConfig, getImageUrl } from './config.js'
import { act1015RuleModalConfig, getImageUrl } from './config.js'
import { getCurrentInstance } from 'vue'
// 组件名称
......@@ -57,7 +57,7 @@ const props = defineProps({
const emit = defineEmits(['close'])
// 配置对象
const config = act915RuleModalConfig
const config = act1015RuleModalConfig
// 获取规则图片URL
const getRuleImgUrl = () => {
......
......@@ -109,8 +109,8 @@
@close="handleRuleModalClose" />
<!-- 抽奖成功弹窗 -->
<DrawSucModal :visible="showDrawSucModal" :award-name="currentAwardName"
:award-image-url="currentAwardImageUrl" @close="handleDrawSucModalClose" @happy-get="handleHappyGet" />
<GotPrizeModal :visible="showGotPrizeModal" :award-name="currentAwardName"
:award-image-url="currentAwardImageUrl" @close="handleGotPrizeModalClose" @happy-get="handleHappyGet" />
<!-- 抽奖失败弹窗 -->
<DrawFailModal :visible="showDrawFailModal" @close="handleDrawFailModalClose" @i-know="handleIKnow" />
......@@ -122,9 +122,9 @@
import { ref, onMounted, computed, getCurrentInstance, onUnmounted } from 'vue'
import { lotteryConfig, getImageUrl } from './config.js'
import RuleModal from './components/ruleModal/ruleModal.vue'
import DrawSucModal from './components/drawSucModal/drawSucModal.vue'
import GotPrizeModal from '../components/GotPrizeModal.vue'
import DrawFailModal from './components/drawFailModal/drawFailModal.vue'
import { getAct915LotteryDraw, getAct915LotteryInfo, fetchAct915LotteryJSON } from '@/api/activity0915/index.js'
import { lotteryDraw, fetchLotteryInfo, fetchLotteryConfig } from '../api.ts'
import md from '@/md.js'
import { jump, JumpType } from '@/utils/index.js'
......@@ -151,7 +151,7 @@ const isResetting = ref(false) // 是否正在重置轮播位置
// 弹窗状态
const showRuleModal = ref(false) // 规则弹窗
const showDrawSucModal = ref(false) // 抽奖成功弹窗
const showGotPrizeModal = ref(false) // 抽奖成功弹窗
const showDrawFailModal = ref(false) // 抽奖失败弹窗
const currentAwardName = ref('') // 当前中奖奖品名称
const currentAwardImageUrl = ref('') // 当前中奖奖品图片URL
......@@ -340,7 +340,7 @@ const handleAwardClick = () => {
const loadRuleModalConfig = async () => {
try {
console.log('开始请求 fetchAct915LotteryJSON 接口...')
const response = await fetchAct915LotteryJSON()
const response = await fetchLotteryConfig()
console.log('fetchAct915LotteryJSON 接口返回结果:', response)
if (response && response.ok && response.data) {
......@@ -358,7 +358,7 @@ const loadRuleModalConfig = async () => {
const loadLotteryInfo = async () => {
try {
console.log('开始请求 getAct915LotteryInfo 接口...')
const response = await getAct915LotteryInfo()
const response = await fetchLotteryInfo()
console.log('getAct915LotteryInfo 接口返回结果:', response)
if (response && response.ok) {
......@@ -450,7 +450,7 @@ const handleDrawClick = async () => {
// })
try {
const response = await getAct915LotteryDraw()
const response = await lotteryDraw()
console.log('getAct915LotteryDraw 接口返回结果:', response)
if (response && response.ok) {
......@@ -523,7 +523,7 @@ const startHighlightAnimation = (targetIndex, isWin) => {
if (isWin) {
currentAwardName.value = turntablePrizes.value[targetIndex].prizeName
currentAwardImageUrl.value = turntablePrizes.value[targetIndex].prizeImageUrl
showDrawSucModal.value = true
showGotPrizeModal.value = true
} else {
showDrawFailModal.value = true
}
......@@ -547,14 +547,14 @@ const startHighlightAnimation = (targetIndex, isWin) => {
}
// 抽奖成功弹窗关闭处理
const handleDrawSucModalClose = () => {
showDrawSucModal.value = false
const handleGotPrizeModalClose = () => {
showGotPrizeModal.value = false
}
// 开心领取处理
const handleHappyGet = () => {
console.log('点击开心领取')
showDrawSucModal.value = false
showGotPrizeModal.value = false
// uni.showToast({
// title: '奖品领取成功',
// icon: 'success'
......
export enum JumpType {
INNER = 1, // 内部小程序页面跳转
MINI = 2, // 其他小程序页面跳转
H5 = 3, // https 网络连接跳转
}
export interface LinkType {
type: JumpType
url: string
extra?: Record<string, any>
}
export interface MdConfig {
pageName: string
componentName: string
componentContent: string
logExposure?: boolean
logClick?: boolean
}
export interface CodeResponse<T> {
code: number
message: string
data: T
success: boolean
ok: boolean
}
export interface Prize{
prizeName: string
prizeImageUrl: string
}
export interface ActivityInfo {
invitationCode: string
invitationText: string
invitationImageUrl: string
invitedCount: number
nextRewardNeedCount: number
unclaimedPrizes: Prize[]
receivedPrizes: Prize[]
}
import {onMounted} from 'vue'
import md from '@/md.js'
import {MdConfig} from "./types";
export function useMD(mdConfig: MdConfig, autoLogExposure = true) {
function logExposure() {
const {pageName, componentName, componentContent} = mdConfig || {}
if (!pageName || !componentName || !componentContent) {
return
}
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName,
componentName,
componentContent,
})
}
function logClick() {
const {pageName, componentName, componentContent} = mdConfig || {}
if (!pageName || !componentName || !componentContent) {
return
}
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName,
componentName,
componentContent,
})
}
if (autoLogExposure) {
onMounted(() => {
if (mdConfig?.logExposure) {
logExposure()
}
})
}
return {
logClick,
logExposure,
}
}
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"allowJs": true,
"skipLibCheck": true,
"baseUrl": ".",
"paths": {
"@/*": ["../*"]
},
"lib": ["DOM", "ESNext"]
}
}
......@@ -105,13 +105,13 @@ const sensorComponentLog = (evt) => {
trackObj[key] = logObj[key];
}
if (xcxComponentExposure && xcxComponentExposure.length > 0) {
console.warn("-----exposure-----", trackObj);
console.warn("💡 %s / %s / %s", trackObj.pageName, trackObj.componentName, trackObj.componentContent);
sensors.track("xcxComponentExposure", {
...trackObj,
});
}
if (xcxComponentClick && xcxComponentClick.length > 0) {
console.warn("-----click-----", trackObj);
console.warn("🖱 %s / %s / %s", trackObj.pageName, trackObj.componentName, trackObj.componentContent);
sensors.track("xcxComponentClick", {
...trackObj,
});
......
{
"name": "20250528_FHQ1",
"lockfileVersion": 3,
"requires": true,
"lockfileVersion": 1,
"packages": {
"": {
"dependencies": {
"crypto-js": {
"@vue/language-server": "^3.1.0",
"crypto-js": "^4.2.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.28.4",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.4"
},
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/types": {
"version": "7.28.4",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz",
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@emmetio/abbreviation": {
"version": "2.3.3",
"resolved": "https://registry.npmmirror.com/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz",
"integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==",
"license": "MIT",
"dependencies": {
"@emmetio/scanner": "^1.0.4"
}
},
"node_modules/@emmetio/css-abbreviation": {
"version": "2.1.8",
"resolved": "https://registry.npmmirror.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz",
"integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==",
"license": "MIT",
"dependencies": {
"@emmetio/scanner": "^1.0.4"
}
},
"node_modules/@emmetio/css-parser": {
"version": "0.4.0",
"resolved": "git+ssh://git@github.com/ramya-rao-a/css-parser.git#370c480ac103bd17c7bcfb34bf5d577dc40d3660",
"license": "MIT",
"dependencies": {
"@emmetio/stream-reader": "^2.2.0",
"@emmetio/stream-reader-utils": "^0.1.0"
}
},
"node_modules/@emmetio/html-matcher": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz",
"integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==",
"license": "ISC",
"dependencies": {
"@emmetio/scanner": "^1.0.0"
}
},
"node_modules/@emmetio/scanner": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/@emmetio/scanner/-/scanner-1.0.4.tgz",
"integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==",
"license": "MIT"
},
"node_modules/@emmetio/stream-reader": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz",
"integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==",
"license": "MIT"
},
"node_modules/@emmetio/stream-reader-utils": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz",
"integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==",
"license": "MIT"
},
"node_modules/@johnsoncodehk/pug-beautify": {
"version": "0.2.2",
"resolved": "https://registry.npmmirror.com/@johnsoncodehk/pug-beautify/-/pug-beautify-0.2.2.tgz",
"integrity": "sha512-qqNS/YD0Nck5wtQLCPHAfGVgWbbGafxSPjNh0ekYPFSNNqnDH2kamnduzYly8IiADmeVx/MfAE1njMEjVeHTMA==",
"license": "MIT"
},
"node_modules/@volar/language-core": {
"version": "2.4.23",
"resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.23.tgz",
"integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==",
"license": "MIT",
"dependencies": {
"@volar/source-map": "2.4.23"
}
},
"node_modules/@volar/language-server": {
"version": "2.4.23",
"resolved": "https://registry.npmmirror.com/@volar/language-server/-/language-server-2.4.23.tgz",
"integrity": "sha512-k0iO+tybMGMMyrNdWOxgFkP0XJTdbH0w+WZlM54RzJU3WZSjHEupwL30klpM7ep4FO6qyQa03h+VcGHD4Q8gEg==",
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.23",
"@volar/language-service": "2.4.23",
"@volar/typescript": "2.4.23",
"path-browserify": "^1.0.1",
"request-light": "^0.7.0",
"vscode-languageserver": "^9.0.1",
"vscode-languageserver-protocol": "^3.17.5",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@volar/language-service": {
"version": "2.4.23",
"resolved": "https://registry.npmmirror.com/@volar/language-service/-/language-service-2.4.23.tgz",
"integrity": "sha512-h5mU9DZ/6u3LCB9xomJtorNG6awBNnk9VuCioGsp6UtFiM8amvS5FcsaC3dabdL9zO0z+Gq9vIEMb/5u9K6jGQ==",
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.23",
"vscode-languageserver-protocol": "^3.17.5",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@volar/source-map": {
"version": "2.4.23",
"resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.23.tgz",
"integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==",
"license": "MIT"
},
"node_modules/@volar/typescript": {
"version": "2.4.23",
"resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.23.tgz",
"integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==",
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.23",
"path-browserify": "^1.0.1",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vscode/emmet-helper": {
"version": "2.11.0",
"resolved": "https://registry.npmmirror.com/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz",
"integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==",
"license": "MIT",
"dependencies": {
"emmet": "^2.4.3",
"jsonc-parser": "^2.3.0",
"vscode-languageserver-textdocument": "^1.0.1",
"vscode-languageserver-types": "^3.15.1",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vscode/l10n": {
"version": "0.0.18",
"resolved": "https://registry.npmmirror.com/@vscode/l10n/-/l10n-0.0.18.tgz",
"integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==",
"license": "MIT"
},
"node_modules/@vue/compiler-core": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz",
"integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.4",
"@vue/shared": "3.5.22",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz",
"integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==",
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.5.22",
"@vue/shared": "3.5.22"
}
},
"node_modules/@vue/language-core": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.1.0.tgz",
"integrity": "sha512-a7ns+X9vTbdmk7QLrvnZs8s4E1wwtxG/sELzr6F2j4pU+r/OoAv6jJGSz+5tVTU6e4+3rjepGhSP8jDmBBcb3w==",
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.23",
"@vue/compiler-dom": "^3.5.0",
"@vue/shared": "^3.5.0",
"alien-signals": "^3.0.0",
"muggle-string": "^0.4.1",
"path-browserify": "^1.0.1",
"picomatch": "^4.0.2"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@vue/language-server": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@vue/language-server/-/language-server-3.1.0.tgz",
"integrity": "sha512-T5KnkZxJxKuLx4scLMp+wQyYLl8Id/wZ+SQ/Fhz4OgQToBuyEm8BVm45ycsN5fRd9djOPzX895cYQJM+6UKaFw==",
"license": "MIT",
"dependencies": {
"@volar/language-server": "2.4.23",
"@vue/language-core": "3.1.0",
"@vue/language-service": "3.1.0",
"@vue/typescript-plugin": "3.1.0",
"vscode-uri": "^3.0.8"
},
"bin": {
"vue-language-server": "bin/vue-language-server.js"
},
"peerDependencies": {
"typescript": "*"
}
},
"node_modules/@vue/language-service": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@vue/language-service/-/language-service-3.1.0.tgz",
"integrity": "sha512-LibzrvZz9sB4doS1j1ea7AezkkgCH44dpu9OGFFOHjldq3yYOjP3Wwf7RXrnyqhlBl40O4RL5B5qPnZt3qDdfQ==",
"license": "MIT",
"dependencies": {
"@volar/language-service": "2.4.23",
"@vue/language-core": "3.1.0",
"@vue/shared": "^3.5.0",
"path-browserify": "^1.0.1",
"volar-service-css": "0.0.65",
"volar-service-emmet": "0.0.65",
"volar-service-html": "0.0.65",
"volar-service-json": "0.0.65",
"volar-service-pug": "0.0.65",
"volar-service-pug-beautify": "0.0.65",
"volar-service-typescript": "0.0.65",
"vscode-html-languageservice": "^5.2.0",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vue/shared": {
"version": "3.5.22",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz",
"integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==",
"license": "MIT"
},
"node_modules/@vue/typescript-plugin": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@vue/typescript-plugin/-/typescript-plugin-3.1.0.tgz",
"integrity": "sha512-7/1yeN+ZaHQJzCM80EXd1H9JHbNCmqL7jrtwc3bxL7AyArLvDq3RXnh6CLeIKDUb93rP5MTp1VCTDIyjT+5iAw==",
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.23",
"@vue/language-core": "3.1.0",
"@vue/shared": "^3.5.0",
"path-browserify": "^1.0.1"
}
},
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/alien-signals": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.0.0.tgz",
"integrity": "sha512-JHoRJf18Y6HN4/KZALr3iU+0vW9LKG+8FMThQlbn4+gv8utsLIkwpomjElGPccGeNwh0FI2HN6BLnyFLo6OyLQ==",
"license": "MIT"
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz",
"integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==",
"license": "MIT",
"dependencies": {
"is-regex": "^1.0.3"
}
},
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "http://npm.dui88.com:80/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/emmet": {
"version": "2.4.11",
"resolved": "https://registry.npmmirror.com/emmet/-/emmet-2.4.11.tgz",
"integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==",
"license": "MIT",
"workspaces": [
"./packages/scanner",
"./packages/abbreviation",
"./packages/css-abbreviation",
"./"
],
"dependencies": {
"@emmetio/abbreviation": "^2.3.3",
"@emmetio/css-abbreviation": "^2.1.8"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/is-expression/-/is-expression-4.0.0.tgz",
"integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
"license": "MIT",
"dependencies": {
"acorn": "^7.1.1",
"object-assign": "^4.1.1"
}
},
"node_modules/is-regex": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
"gopd": "^1.2.0",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/jsonc-parser": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
"integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
"license": "MIT"
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/muggle-string": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
"license": "MIT"
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
"license": "MIT"
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pug-error": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/pug-error/-/pug-error-2.1.0.tgz",
"integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==",
"license": "MIT"
},
"node_modules/pug-lexer": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/pug-lexer/-/pug-lexer-5.0.1.tgz",
"integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
"license": "MIT",
"dependencies": {
"character-parser": "^2.2.0",
"is-expression": "^4.0.0",
"pug-error": "^2.0.0"
}
},
"node_modules/pug-parser": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/pug-parser/-/pug-parser-6.0.0.tgz",
"integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
"license": "MIT",
"dependencies": {
"pug-error": "^2.0.0",
"token-stream": "1.0.0"
}
},
"node_modules/request-light": {
"version": "0.7.0",
"resolved": "https://registry.npmmirror.com/request-light/-/request-light-0.7.0.tgz",
"integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
"license": "MIT"
},
"node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/token-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/token-stream/-/token-stream-1.0.0.tgz",
"integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==",
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/typescript-auto-import-cache": {
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz",
"integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==",
"license": "MIT",
"dependencies": {
"semver": "^7.3.8"
}
},
"node_modules/volar-service-css": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-css/-/volar-service-css-0.0.65.tgz",
"integrity": "sha512-oaImNguZF/8NfQh5jJZ2lJYBtF3aFS5H2w+6GmH7ykESAgBJ1UC7DrhmH5smBGGF7OOzzc9AzrrnriafoFJBdA==",
"license": "MIT",
"dependencies": {
"vscode-css-languageservice": "^6.3.0",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-uri": "^3.0.8"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/volar-service-emmet": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-emmet/-/volar-service-emmet-0.0.65.tgz",
"integrity": "sha512-YkAPlkJnjyAAUZGtG7STgy3ENFy7C0n3dl6MffUYkcovosfUUNgpUOmsj4t1qw1c7t5KMvLfAZHsEC3Ig5Qs3w==",
"license": "MIT",
"dependencies": {
"@emmetio/css-parser": "ramya-rao-a/css-parser#vscode",
"@emmetio/html-matcher": "^1.3.0",
"@vscode/emmet-helper": "^2.9.3",
"vscode-uri": "^3.0.8"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/volar-service-html": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-html/-/volar-service-html-0.0.65.tgz",
"integrity": "sha512-AxXckCTbCr5j5z81d3bNiRRL32xCaBSa8lmYhq0QfzBPVPaRv06YYaxp22XizM061f96iizM7ZkSHCu1RuSwRA==",
"license": "MIT",
"dependencies": {
"vscode-html-languageservice": "^5.3.0",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-uri": "^3.0.8"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/volar-service-json": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-json/-/volar-service-json-0.0.65.tgz",
"integrity": "sha512-fqm4aIVkXtoQhOcD2pBBEbnloC1ULEHBm2lZRfZloRAKiIJxakw0jDdQh5F/ClzUzQgegkniLbfPsVOubtLM0Q==",
"license": "MIT",
"dependencies": {
"vscode-json-languageservice": "^5.4.0",
"vscode-uri": "^3.0.8"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/volar-service-pug": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-pug/-/volar-service-pug-0.0.65.tgz",
"integrity": "sha512-QTpxpLmpwNjSPASM4n5d+MF9DHKaBUuHeoV7SXVH5wmrx513da6wljlXNk34IU1npBglNp9sO0qaNokP1Gn42g==",
"license": "MIT",
"dependencies": {
"@volar/language-service": "~2.4.0",
"muggle-string": "^0.4.1",
"pug-lexer": "^5.0.1",
"pug-parser": "^6.0.0",
"volar-service-html": "0.0.65",
"vscode-html-languageservice": "^5.3.0",
"vscode-languageserver-textdocument": "^1.0.11"
}
},
"node_modules/volar-service-pug-beautify": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-pug-beautify/-/volar-service-pug-beautify-0.0.65.tgz",
"integrity": "sha512-dD8kyuZvrRqOccBIWIBupc3gi9jx/Y8bIDdFJ7IxtEOqGclJxlzvutJckJSVjyz+TrzFXTcI7hCyEV3SCcir+A==",
"license": "MIT",
"dependencies": {
"@johnsoncodehk/pug-beautify": "^0.2.2"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/volar-service-typescript": {
"version": "0.0.65",
"resolved": "https://registry.npmmirror.com/volar-service-typescript/-/volar-service-typescript-0.0.65.tgz",
"integrity": "sha512-zPJuLIMs7lkQCvL+Rza8+3/EIoXEIkX8+DL7bNNfPgnbalbvRDhqWLVMJ6Zk3pINjLJafDqyhSbw8srfkUv97w==",
"license": "MIT",
"dependencies": {
"path-browserify": "^1.0.1",
"semver": "^7.6.2",
"typescript-auto-import-cache": "^0.3.5",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-nls": "^5.2.0",
"vscode-uri": "^3.0.8"
},
"peerDependencies": {
"@volar/language-service": "~2.4.0"
},
"peerDependenciesMeta": {
"@volar/language-service": {
"optional": true
}
}
},
"node_modules/vscode-css-languageservice": {
"version": "6.3.8",
"resolved": "https://registry.npmmirror.com/vscode-css-languageservice/-/vscode-css-languageservice-6.3.8.tgz",
"integrity": "sha512-dBk/9ullEjIMbfSYAohGpDOisOVU1x2MQHOeU12ohGJQI7+r0PCimBwaa/pWpxl/vH4f7ibrBfxIZY3anGmHKQ==",
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-html-languageservice": {
"version": "5.5.2",
"resolved": "https://registry.npmmirror.com/vscode-html-languageservice/-/vscode-html-languageservice-5.5.2.tgz",
"integrity": "sha512-QpaUhCjvb7U/qThOzo4V6grwsRE62Jk/vf8BRJZoABlMw3oplLB5uovrvcrLO9vYhkeMiSjyqLnCxbfHzzZqmw==",
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "^3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-json-languageservice": {
"version": "5.6.2",
"resolved": "https://registry.npmmirror.com/vscode-json-languageservice/-/vscode-json-languageservice-5.6.2.tgz",
"integrity": "sha512-miojUH15R/yKxgWkAw1zofv2LDn3Hv3nqIBK+11nGgvdieVClf6ZWOqybPeROruAAMOtX9R6hPptuWYzj3q9NA==",
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"jsonc-parser": "^3.3.1",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "^3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-json-languageservice/node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"license": "MIT"
},
"node_modules/vscode-jsonrpc": {
"version": "8.2.0",
"resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
"integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vscode-languageserver": {
"version": "9.0.1",
"resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
"integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
"license": "MIT",
"dependencies": {
"vscode-languageserver-protocol": "3.17.5"
},
"bin": {
"installServerIntoExtension": "bin/installServerIntoExtension"
}
},
"node_modules/vscode-languageserver-protocol": {
"version": "3.17.5",
"resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
"integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
"license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.2.0",
"vscode-languageserver-types": "3.17.5"
}
},
"node_modules/vscode-languageserver-textdocument": {
"version": "1.0.12",
"resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
"integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
"license": "MIT"
},
"node_modules/vscode-languageserver-types": {
"version": "3.17.5",
"resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
"integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
"license": "MIT"
},
"node_modules/vscode-nls": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/vscode-nls/-/vscode-nls-5.2.0.tgz",
"integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==",
"license": "MIT"
},
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz",
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
"license": "MIT"
}
}
}
......@@ -284,7 +284,8 @@
"navigationBarTitleText": "",
"shareAppMessage": true,
"shareTimeline": false,
"navigationStyle": "custom"
"navigationStyle": "custom",
"backgroundColor": "#FBE8C2"
}
},
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment