feat: GA/SA 추가, 이미지 추가

This commit is contained in:
“hyeonggkim”
2025-09-19 10:16:09 +09:00
parent cb4850cf45
commit ce08a58118
75 changed files with 757 additions and 3 deletions

View File

@@ -5,6 +5,14 @@ import LoadingLocal from '#layers/components/blocks/loading/Local.vue'
import type { GameDataMetaTag, GameDataValue } from '#layers/types/api/gameData' import type { GameDataMetaTag, GameDataValue } from '#layers/types/api/gameData'
const nuxtApp = useNuxtApp() const nuxtApp = useNuxtApp()
const { gtag, initialize } = useGtag()
const { gaId } = useGoogleAnalyticsId()
initialize(gaId.value)
gtag('event', 'screen_view', {
app_name: 'My App',
screen_name: 'Home'
})
const gameDataStore = useGameDataStore() const gameDataStore = useGameDataStore()
const { setGameData } = gameDataStore const { setGameData } = gameDataStore

View File

@@ -0,0 +1,272 @@
import * as amplitude from '@amplitude/analytics-browser'
import type { AnalyticsDetailType } from '../types/AnalyticsType'
import type { IdentityInfo, ActionInfo, MarketingInfo } from '../types/Stove81Plug'
declare const svcLog: any
declare const twq: any
declare const ttq: any
// target에 {XX1, XX2}와 같은 형태가 포함되어 있을 경우 options.clickItem으로부터 값 추출하여 세팅
const findValueFromOption = (target: string, { options = {} }: any) => {
if (target.includes('{') && target.includes('}')) {
const strTargetClickItem = target.substring(target.indexOf('{') + 1, target.indexOf('}'))
const arrTargetClickItem = strTargetClickItem.split(',')
const arrTargetClickItemValue = []
for (let targetClickItem of arrTargetClickItem) {
targetClickItem = targetClickItem.trim()
arrTargetClickItemValue.push(options.clickItem[targetClickItem])
}
target = target.replaceAll(`{${strTargetClickItem}}`, arrTargetClickItemValue.join(','))
}
return target
}
/**
* Google Analytics 전송
*
* @param {AnalyticsDetailType} analytics
* @param {object} options
*/
const sendGA = (analytics: AnalyticsDetailType, { options = {} }: any) => {
try {
const { gtag } = useGtag()
const eventName = findValueFromOption(analytics.event || '', { options })
const eventCategory = findValueFromOption(analytics.eventCategory || '', { options })
const eventLocale = analytics.eventLocale || ''
// GA 클릭 이벤트 명 뒤에 언어 값 추가 노출되도록 개발. ex) GNB_자유게시판_KO
const eventLabel = `${eventCategory}_${eventLocale}`
gtag('set', 'cookie_domain', `${window?.location?.hostname || ''}`) // env 값으로 설정 시 쿠키 생성 안 돼서 window.location.hostname으로 설정
gtag('set', 'cookie_expires', '0') // 0으로 설정 시 쿠키가 Session 기반 쿠키로 전환
gtag('event', `${eventName}`, {
event_category: eventLabel
})
} catch (e) {
console.error('[Exception] useAnalytics.sendGA: ', e)
}
}
/**
* Stove Analytics(81 Plug) 전송
*
* @param {AnalyticsDetailType} analytics
* @param {string} mcode
* @param {object} options
*/
const sendSA = (analytics: AnalyticsDetailType, { mcode = '', options = {} }: any) => {
try {
const runtimeConfig = useRuntimeConfig()
const gameNo = runtimeConfig.public.stoveGameNo
const device = useDevice()
const deviceType = device.isDesktop ? 'pcweb' : 'mobileweb'
const country = `${csrGetCountry()}`
const memberNo = `${csrGetStoveMemberNo()}`
const actionType = analytics.actionType || ''
const logSourceType = analytics.logSourceType || ''
const viewArea = analytics.viewArea || ''
const viewType = analytics.viewType || ''
const clickArea = analytics.clickArea || ''
const clickSarea = findValueFromOption(analytics.clickSarea || '', { options })
const eventLocale = analytics.eventLocale || ''
const identityInfo: IdentityInfo = {
app_id: 'stove',
log_source_type: logSourceType,
country,
locale: eventLocale,
lang_cd: eventLocale,
member_no: memberNo,
channeling_cd: 'SO'
}
const marketingInfo: MarketingInfo = {
marketing_code: mcode || '',
device_type: deviceType,
media_type: '',
media_page: ''
}
let actionParam = {}
if (actionType === 'view') {
actionParam = {
view_area: viewArea,
view_type: viewType,
view_info: {
game_no: gameNo,
lang_cd: eventLocale,
...options?.viewInfo
}
}
} else if (actionType === 'click') {
actionParam = {
click_area: clickArea,
click_sarea: clickSarea,
click_item: {
game_no: gameNo,
lang_cd: eventLocale,
...options?.clickItem
}
}
}
const actionInfo: ActionInfo = {
action_type: actionType,
action_param: actionParam,
marketing_info: marketingInfo
}
const amplitudeActionInfo = {
...actionInfo,
url: `${location?.href || ''}`,
agent: `${navigator?.userAgent || ''}`
}
const amplitudeActionParams: {
event_type: string
event_properties: ActionInfo & { url: string; agent: string }
} = {
event_type: actionType,
event_properties: amplitudeActionInfo
}
svcLog.identity(identityInfo)
svcLog.action(actionInfo, {}, {}) // 81plug warning log 제거를 위해 2번째 인자부터 빈 객체 세팅
amplitude.track(amplitudeActionParams)
} catch (e) {
console.error('[Exception] useAnalytics.sendSA: ', e)
}
}
/**
* 기본 로그 일괄 전송
*
* @param {string} locale
* @param {AnalyticsDetailType} analytics
*/
const sendLog = (locale: string, analytics: AnalyticsDetailType) => {
// 언어 코드 대문자 변환
analytics.eventLocale = locale.toUpperCase()
if (analytics) {
// GA 전송 : eventCategory 유무로 판별
if (analytics.eventCategory && analytics.eventCategory !== '') {
sendGA(analytics, { options: analytics.options })
}
// SA 전송 : actionType, logSourceType 유무로 판별
if (
analytics.actionType &&
analytics.actionType !== '' &&
analytics.logSourceType &&
analytics.logSourceType !== ''
) {
sendSA(analytics, { mcode: analytics.mcode, options: analytics.options })
}
}
}
/**
* Google Analytics 전송 (기본 이벤트만 전송)
*
* @param {string} gaEventName
*/
const sendGAEventOnly = (gaEventName: string) => {
try {
const { gtag } = useGtag()
gtag('set', 'cookie_domain', `${window?.location?.hostname || ''}`) // env 값으로 설정 시 쿠키 생성 안 돼서 window.location.hostname으로 설정
gtag('set', 'cookie_expires', '0') // 0으로 설정 시 쿠키가 Session 기반 쿠키로 전환
gtag('event', `${gaEventName}`)
} catch (e) {
console.error('[Exception] useAnalytics.sendGAEventOnly: ', e)
}
}
/**
* 메타 픽셀 전송
*
* @param {string} fbEventName
* @description 수집 대상 페이지에 useHead({ meta: [loadMetaPixelMeta()] }) 선언
*/
const sendMetaPixel = (fbEventName: string) => {
try {
const { $fbq } = useNuxtApp()
if (typeof $fbq === 'function') {
$fbq('trackCustom', fbEventName)
}
} catch (e) {
console.error('[Exception] useAnalytics.sendMetaPixel: ', e)
}
}
/**
* X(트위터) 픽셀 전송
*
* @param {string} twEventName
* @description 수집 대상 페이지에 useHead({ script: [loadTwitterPixelScript()] }) 선언
*/
const sendTwitterPixel = (twEventName: string) => {
try {
twq('event', twEventName, {})
} catch (e) {
console.error('[Exception] useAnalytics.sendTwitterPixel: ', e)
}
}
/**
* 틱톡 픽셀 전송
*
* @param {string} ttEventName
* @description 수집 대상 페이지에 onMounted(() => { loadTikTokPixelScript() }) 선언
*/
const sendTiktokPixel = (ttEventName: string) => {
try {
ttq.track(ttEventName)
} catch (e) {
console.error('[Exception] useAnalytics.sendTiktokPixel: ', e)
}
}
/**
* 마케팅 인텔리전스 팀 요청 마케팅 스크립트 일괄 전송
*
* @param {string} gaEventName
* @param {string} fbEventName
* @param {string} twEventName
* @param {string} ttEventName
*/
const sendMarketingScript = ({
gaEventName,
fbEventName,
twEventName,
ttEventName
}: {
gaEventName?: string
fbEventName?: string
twEventName?: string
ttEventName?: string
}) => {
if (gaEventName) {
sendGAEventOnly(gaEventName)
}
if (fbEventName) {
sendMetaPixel(fbEventName)
}
if (twEventName) {
sendTwitterPixel(twEventName)
}
if (ttEventName) {
sendTiktokPixel(ttEventName)
}
}
export default () => {
return { sendGA, sendSA, sendLog, sendMarketingScript }
}

View File

@@ -0,0 +1,19 @@
export const useGoogleAnalyticsId = () => {
const nuxtApp = useNuxtApp()
// SSR에서 context에서 가져오기
const getGAIdFromServer = () => {
return import.meta.server
? (nuxtApp.ssrContext?.event.context.googleAnalyticsId ?? null)
: null
}
// useState로 SSR/CSR 상태 동기화
const gaId = useState<string | null>('googleAnalyticsId', () => {
return getGAIdFromServer()
})
return {
gaId
}
}

View File

@@ -9,5 +9,5 @@ export default defineNuxtConfig({
components: { components: {
dirs: ['components'], dirs: ['components'],
global: true, global: true,
}, }
}) })

View File

@@ -0,0 +1,41 @@
import * as amplitude from '@amplitude/analytics-browser'
// Nuxt 플러그인 정의
export default defineNuxtPlugin((nuxtApp) => {
// const { memberNo } = useAnalytics() as { memberNo: string }
const memberNo = csrGetStoveMemberNo()
// Amplitude 초기화
amplitude.init('6bfa2705264260f060e02493ecf882ad', {
// 원하는 설정을 여기에 추가하세요
defaultTracking: {
attribution: false, // 기본 추적 설정: 속성 추적 비활성화
pageViews: true, // 페이지 뷰 추적 활성화
sessions: false, // 세션 추적 비활성화
formInteractions: false, // 폼 상호작용 추적 비활성화
fileDownloads: false // 파일 다운로드 추적 비활성화
},
autocapture: {
attribution: true
}
})
// Identify 이벤트 생성 및 설정
const identifyEvent = new amplitude.Identify()
identifyEvent.set('member_no', memberNo)
// Identify 이벤트 전송 및 사용자 ID 설정
amplitude.identify(identifyEvent)
amplitude.setUserId(`${memberNo}`)
;(window as any).amplitude = amplitude // amplitude 객체 전역으로 설정(Stove GNB에서 사용)
// 페이지가 숨겨질 때 이벤트 리스너 추가
window.addEventListener('pagehide', () => {
amplitude.setTransport('beacon') // 전송 방식 설정
amplitude.flush() // Amplitude 데이터 전송
})
// Nuxt 앱에 amplitude 인스턴스 제공
nuxtApp.provide('amplitude', amplitude)
})

View File

@@ -0,0 +1,42 @@
import type { AnalyticsDetailType } from '../types/AnalyticsType'
export default defineNuxtPlugin((nuxtApp) => {
// 공통 함수 정의
const createEventHandler = (eventName: string, sendFunction: Function) => {
return (el: any, binding: any) => {
const eventHandler = (event: Event) => {
const bindingValue = binding.value
if (bindingValue) {
sendFunction(bindingValue)
}
// 기존의 @click 핸들러 호출
if (typeof binding.value === 'function') {
binding.value(event)
}
}
el.addEventListener(eventName, eventHandler)
el[`__${eventName}EventHandler__`] = eventHandler
}
}
const removeEventHandler = (eventName: string) => {
return (el: any) => {
if (el[`__${eventName}EventHandler__`]) {
el.removeEventListener(eventName, el[`__${eventName}EventHandler__`])
delete el[`__${eventName}EventHandler__`]
}
}
}
// analytics
nuxtApp.vueApp.directive('analytics', {
mounted: createEventHandler('click', (bindingValue: AnalyticsDetailType) => {
const { sendLog } = useAnalytics()
const i18n = nuxtApp.$i18n as { locale: { value: string } }
sendLog(i18n.locale.value, bindingValue)
}),
beforeUnmount: removeEventHandler('click')
})
})

View File

@@ -60,6 +60,13 @@ export default defineEventHandler(async event => {
query: queryParams, query: queryParams,
}) })
const gaId = (response as any).value?.ga_code
if (gaId) {
// 환경변수에 동적 설정
event.context.googleAnalyticsId = gaId
}
// 타입 단언을 사용하여 response의 타입 오류를 해결 // 타입 단언을 사용하여 response의 타입 오류를 해결
const res = response as { code?: number; value?: unknown } const res = response as { code?: number; value?: unknown }

View File

@@ -0,0 +1,84 @@
interface AnalyticsMetaType {
gameId: string
metaNo: number
metaType?: string
metaCode?: string
metaValue?: number
metaName?: string
metaOption?: string
metaDesc?: string
refMetaNo?: number
sort?: number
status?: boolean
}
interface AnalyticsType {
analyticsNo: number
gameId: string
analyticsType?: AnalyticsMetaType
analyticsVersion?: AnalyticsMetaType
analyticsCode?: string
analyticsName?: string
analyticsDesc?: string
sort?: number
status?: boolean
}
interface AnalyticsDetailType extends AnalyticsType {
detailNo: number
// analyticsNo in AnalyticsType
sbNo?: string
areaNo?: string
event?: string
eventCategory?: string
actionType?: string
areaNm?: string
clickAreaNm?: string
logSourceType?: string
// View -----
viewArea?: string
viewType?: string
viewInfo?: string
// Click -----
clickArea?: string
clickSarea?: string
gameNo?: string // Y/N
langCd?: string // Y/N
locale?: string // Y/N
memberNo?: string // Y/N
country?: string // Y/N
description?: string
clickItem?: string
opinion?: string
devOption?: string
// 가공 -----
arrViewInfo?: String[]
mapClickItem?: Map<String, Object>
eventLocale?: string
// 옵션 -----
mcode?: string
options?: object
}
// [API] Req / Res -----
interface ReqGetAnalytics {
baseApiUrl: string
fileName?: string
}
interface ResGetAnalytics {
code: number
message: string
value?: {
analyticsDetail?: AnalyticsDetailType
}
}
export type {
AnalyticsType,
AnalyticsDetailType,
AnalyticsMetaType,
// [API] Req / Res -----
ReqGetAnalytics,
ResGetAnalytics
}

View File

@@ -0,0 +1,38 @@
export interface IdentityInfo {
app_id: string
log_source_type: string
country: string
locale: string
lang_cd: string
member_no: string
channeling_cd: string
}
export interface ClickItem {
game_no: string
}
export interface ActionParam {
click_area?: string
click_sarea?: string
click_item?: ClickItem
view_area?: string
view_type?: string
view_info?: {
game_no: string
lang_cd: string
}
}
export interface MarketingInfo {
marketing_code: string
device_type: string
media_type: string
media_page: string
}
export interface ActionInfo {
action_type: string
action_param: ActionParam
marketing_info?: MarketingInfo
}

View File

@@ -29,6 +29,8 @@ export default defineNuxtConfig({
'@nuxtjs/i18n', '@nuxtjs/i18n',
'@pinia/nuxt', '@pinia/nuxt',
'@nuxtjs/tailwindcss', '@nuxtjs/tailwindcss',
'nuxt-gtag',
'@nuxtjs/device',
], ],
imports: { imports: {
dirs: [ dirs: [

View File

@@ -19,12 +19,16 @@
"check": "pnpm typecheck && pnpm lint && pnpm format:check" "check": "pnpm typecheck && pnpm lint && pnpm format:check"
}, },
"dependencies": { "dependencies": {
"@amplitude/analytics-browser": "^2.24.0",
"@amplitude/analytics-node": "^1.5.9",
"@nuxtjs/device": "^3.2.4",
"@nuxtjs/i18n": "^10.0.6", "@nuxtjs/i18n": "^10.0.6",
"@pinia/nuxt": "^0.6.1", "@pinia/nuxt": "^0.6.1",
"@vueuse/core": "^13.6.0", "@vueuse/core": "^13.6.0",
"@vueuse/nuxt": "^13.6.0", "@vueuse/nuxt": "^13.6.0",
"h3": "^1.15.4", "h3": "^1.15.4",
"nuxt": "^4.0.3", "nuxt": "^4.0.3",
"nuxt-gtag": "^4.0.0",
"pinia": "^2.3.1", "pinia": "^2.3.1",
"vue": "^3.5.0", "vue": "^3.5.0",
"vue-dompurify-html": "^5.3.0" "vue-dompurify-html": "^5.3.0"

165
pnpm-lock.yaml generated
View File

@@ -8,6 +8,15 @@ importers:
.: .:
dependencies: dependencies:
'@amplitude/analytics-browser':
specifier: ^2.24.0
version: 2.24.0
'@amplitude/analytics-node':
specifier: ^1.5.9
version: 1.5.9
'@nuxtjs/device':
specifier: ^3.2.4
version: 3.2.4
'@nuxtjs/i18n': '@nuxtjs/i18n':
specifier: ^10.0.6 specifier: ^10.0.6
version: 10.0.6(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.50.0)(vue@3.5.21(typescript@5.9.2)) version: 10.0.6(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.50.0)(vue@3.5.21(typescript@5.9.2))
@@ -26,6 +35,9 @@ importers:
nuxt: nuxt:
specifier: ^4.0.3 specifier: ^4.0.3
version: 4.1.1(@parcel/watcher@2.5.1)(@types/node@24.3.1)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.50.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1) version: 4.1.1(@parcel/watcher@2.5.1)(@types/node@24.3.1)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.50.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1)
nuxt-gtag:
specifier: ^4.0.0
version: 4.0.0(magicast@0.3.5)
pinia: pinia:
specifier: ^2.3.1 specifier: ^2.3.1
version: 2.3.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) version: 2.3.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))
@@ -97,6 +109,48 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'} engines: {node: '>=10'}
'@amplitude/analytics-browser@2.24.0':
resolution: {integrity: sha512-tlr5V3WjIf+Lv9AMVPs5OBbDo6n9VWz2sKXap86jYlKgnZz6++AEYHVw88rC9i+OdXeqMOvhxgIK6hT2N/1M2A==}
'@amplitude/analytics-client-common@2.3.41':
resolution: {integrity: sha512-yIzPSsf0DZQEU9TAR2ugfNtWRhuoGi+554qBBH/H3AzY/2TI3peuXmnmah8/cK/HdHg4dyln08/scRGL83Z8lg==}
'@amplitude/analytics-connector@1.6.4':
resolution: {integrity: sha512-SpIv0IQMNIq6SH3UqFGiaZyGSc7PBZwRdq7lvP0pBxW8i4Ny+8zwI0pV+VMfMHQwWY3wdIbWw5WQphNjpdq1/Q==}
'@amplitude/analytics-core@1.2.8':
resolution: {integrity: sha512-Krxpr5uvS3HmmjvpYqPfbMbs2kcZZu09L+6KwQnPiofWRzoXWIM217fRfy6aSD/QrAoPGbZjvtVitw9cB7Cx+A==}
'@amplitude/analytics-core@2.24.0':
resolution: {integrity: sha512-hYjVIme2tpW+dgDVVAbgrpjTosgrAg2m3M5/kgXEObnitw36BPnwKL6d8EyJPsx5O+bRal5E0txIsu39I4LM2w==}
'@amplitude/analytics-node@1.5.9':
resolution: {integrity: sha512-BTB7zrUOGhM8NRCYFdNas+9eIJtMitK0KZ55N+qnSc2HbiJBvGjx/pfnAdSeHpbts6jQ8075YIuCEIQw077RJA==}
'@amplitude/analytics-remote-config@0.4.1':
resolution: {integrity: sha512-BYl6kQ9qjztrCACsugpxO+foLaQIC0aSEzoXEAb/gwOzInmqkyyI+Ub+aWTBih4xgB/lhWlOcidWHAmNiTJTNw==}
'@amplitude/analytics-remote-config@0.6.3':
resolution: {integrity: sha512-icE0ogCzdHAtQi9jiOFQUmKrvWQc5YEO6bLZUfQXCT/yTTNXppWnT1zHMKzXa3SMDosfrLwU/X8sro1PTI+jZQ==}
'@amplitude/analytics-types@1.4.0':
resolution: {integrity: sha512-RiMPHBqdrJ8ktTqG+Wzj2htnN/PCG9jGZG0SXtTFnWwVvcAJYbYm55/nrP1TTyrx1OlLhvF2VG3lVUP/xGAU8w==}
'@amplitude/analytics-types@2.10.0':
resolution: {integrity: sha512-WP8eEbJh10MmFVnxkHjg92i5DBxBFsRvSZxjDQPXEGL8ZP+i7rSsleiH2K3VrwoKksYfZ/1eAqrZvevAmjSlig==}
'@amplitude/plugin-autocapture-browser@1.12.2':
resolution: {integrity: sha512-Rs/GyQv8OsllNb1EzFvHYtys+2INkMEuy9aSMfJjN+/Hke87en9tVSTi+lQLe1aTCz5y+4fZ5V1+GOG65Xh5CA==}
'@amplitude/plugin-network-capture-browser@1.6.0':
resolution: {integrity: sha512-KlnRkhchrbDMIEG+P+IuWg6c985rp2IbODVCrzNzHaX/DIN/N+xhPOh+ZZYoSKUsD2q70z6471A84lvB8CmZ3A==}
'@amplitude/plugin-page-view-tracking-browser@2.3.47':
resolution: {integrity: sha512-rJSNt8DZUb0L6wKp6IHVur6qad4WreR7OnLnOdCou3Tv30F6x7KXQbW+pBJmuXDZkInkibeG7tAExRaXW80JUA==}
'@amplitude/plugin-web-vitals-browser@0.1.0-frustrationanalytics.0':
resolution: {integrity: sha512-xv4sje6/D8r+SgNFTA22FJ5PhtdhN+VSydvs63Frll+qWlyQwaZ1IgDbPyqjzryEkldHRPD7GUaQual+geoIYg==}
'@antfu/install-pkg@1.1.0': '@antfu/install-pkg@1.1.0':
resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
@@ -666,6 +720,9 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.3.4 vue: ^3.3.4
'@nuxtjs/device@3.2.4':
resolution: {integrity: sha512-jIvN6QeodBNrUrL/1FCHk4bebsiLsGHlJd8c/m2ksLrGY4IZ0npA8IYhDTdYV92epGxoe8+3iZOzCjav+6TshQ==}
'@nuxtjs/i18n@10.0.6': '@nuxtjs/i18n@10.0.6':
resolution: {integrity: sha512-SQqJP6NDlmaoLzs7A74cx0Q3W4Vc+JSBlu3AN0q9+Q07Nvba5osab99GJEQ+PGnjaRwBFh35braUA2hRz9bdSA==} resolution: {integrity: sha512-SQqJP6NDlmaoLzs7A74cx0Q3W4Vc+JSBlu3AN0q9+Q07Nvba5osab99GJEQ+PGnjaRwBFh35braUA2hRz9bdSA==}
engines: {node: '>=20.11.1'} engines: {node: '>=20.11.1'}
@@ -3378,6 +3435,9 @@ packages:
nuxt-define@1.0.0: nuxt-define@1.0.0:
resolution: {integrity: sha512-CYZ2WjU+KCyCDVzjYUM4eEpMF0rkPmkpiFrybTqqQCRpUbPt2h3snswWIpFPXTi+osRCY6Og0W/XLAQgDL4FfQ==} resolution: {integrity: sha512-CYZ2WjU+KCyCDVzjYUM4eEpMF0rkPmkpiFrybTqqQCRpUbPt2h3snswWIpFPXTi+osRCY6Og0W/XLAQgDL4FfQ==}
nuxt-gtag@4.0.0:
resolution: {integrity: sha512-7Mz8d3Cbrp2WsskJmzTsxO5lYpX7oVLsmsMQPInM+r0/8aGM1LnDnQYdFtTO+j7fsVhMuCa+XZyNrH43EKNfHA==}
nuxt@4.1.1: nuxt@4.1.1:
resolution: {integrity: sha512-xLDbWgz3ggAfUjcbmTzmLLPWOEB61thnjnqyasZlYyh/Ty2EDT1qvOiM9HT+9ycBxElI2DmyYewY8WOPRxWMiQ==} resolution: {integrity: sha512-xLDbWgz3ggAfUjcbmTzmLLPWOEB61thnjnqyasZlYyh/Ty2EDT1qvOiM9HT+9ycBxElI2DmyYewY8WOPRxWMiQ==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
@@ -3964,6 +4024,9 @@ packages:
run-parallel@1.2.0: run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
safe-buffer@5.1.2: safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
@@ -4618,6 +4681,9 @@ packages:
typescript: typescript:
optional: true optional: true
web-vitals@5.1.0:
resolution: {integrity: sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==}
webidl-conversions@3.0.1: webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
@@ -4726,6 +4792,83 @@ snapshots:
'@alloc/quick-lru@5.2.0': {} '@alloc/quick-lru@5.2.0': {}
'@amplitude/analytics-browser@2.24.0':
dependencies:
'@amplitude/analytics-core': 2.24.0
'@amplitude/analytics-remote-config': 0.4.1
'@amplitude/plugin-autocapture-browser': 1.12.2
'@amplitude/plugin-network-capture-browser': 1.6.0
'@amplitude/plugin-page-view-tracking-browser': 2.3.47
'@amplitude/plugin-web-vitals-browser': 0.1.0-frustrationanalytics.0
tslib: 2.8.1
'@amplitude/analytics-client-common@2.3.41':
dependencies:
'@amplitude/analytics-connector': 1.6.4
'@amplitude/analytics-core': 2.24.0
'@amplitude/analytics-types': 2.10.0
tslib: 2.8.1
'@amplitude/analytics-connector@1.6.4': {}
'@amplitude/analytics-core@1.2.8':
dependencies:
'@amplitude/analytics-types': 1.4.0
tslib: 2.8.1
'@amplitude/analytics-core@2.24.0':
dependencies:
'@amplitude/analytics-connector': 1.6.4
tslib: 2.8.1
'@amplitude/analytics-node@1.5.9':
dependencies:
'@amplitude/analytics-core': 2.24.0
tslib: 2.8.1
'@amplitude/analytics-remote-config@0.4.1':
dependencies:
'@amplitude/analytics-client-common': 2.3.41
'@amplitude/analytics-core': 2.24.0
'@amplitude/analytics-types': 2.10.0
tslib: 2.8.1
'@amplitude/analytics-remote-config@0.6.3':
dependencies:
'@amplitude/analytics-core': 1.2.8
'@amplitude/analytics-types': 1.4.0
tslib: 2.8.1
'@amplitude/analytics-types@1.4.0': {}
'@amplitude/analytics-types@2.10.0': {}
'@amplitude/plugin-autocapture-browser@1.12.2':
dependencies:
'@amplitude/analytics-core': 2.24.0
'@amplitude/analytics-remote-config': 0.6.3
rxjs: 7.8.2
tslib: 2.8.1
'@amplitude/plugin-network-capture-browser@1.6.0':
dependencies:
'@amplitude/analytics-core': 2.24.0
rxjs: 7.8.2
tslib: 2.8.1
'@amplitude/plugin-page-view-tracking-browser@2.3.47':
dependencies:
'@amplitude/analytics-client-common': 2.3.41
'@amplitude/analytics-types': 2.10.0
tslib: 2.8.1
'@amplitude/plugin-web-vitals-browser@0.1.0-frustrationanalytics.0':
dependencies:
'@amplitude/analytics-core': 2.24.0
rxjs: 7.8.2
tslib: 2.8.1
web-vitals: 5.1.0
'@antfu/install-pkg@1.1.0': '@antfu/install-pkg@1.1.0':
dependencies: dependencies:
package-manager-detector: 1.3.0 package-manager-detector: 1.3.0
@@ -5529,6 +5672,10 @@ snapshots:
- vue-tsc - vue-tsc
- yaml - yaml
'@nuxtjs/device@3.2.4':
dependencies:
defu: 6.1.4
'@nuxtjs/i18n@10.0.6(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.50.0)(vue@3.5.21(typescript@5.9.2))': '@nuxtjs/i18n@10.0.6(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.50.0)(vue@3.5.21(typescript@5.9.2))':
dependencies: dependencies:
'@intlify/core': 11.1.12 '@intlify/core': 11.1.12
@@ -8223,6 +8370,15 @@ snapshots:
nuxt-define@1.0.0: {} nuxt-define@1.0.0: {}
nuxt-gtag@4.0.0(magicast@0.3.5):
dependencies:
'@nuxt/kit': 4.1.1(magicast@0.3.5)
defu: 6.1.4
pathe: 2.0.3
ufo: 1.6.1
transitivePeerDependencies:
- magicast
nuxt@4.1.1(@parcel/watcher@2.5.1)(@types/node@24.3.1)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.50.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1): nuxt@4.1.1(@parcel/watcher@2.5.1)(@types/node@24.3.1)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.35.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.50.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1):
dependencies: dependencies:
'@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/cli': 3.28.0(magicast@0.3.5)
@@ -8980,6 +9136,10 @@ snapshots:
dependencies: dependencies:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
safe-buffer@5.1.2: {} safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {} safe-buffer@5.2.1: {}
@@ -9303,8 +9463,7 @@ snapshots:
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
tslib@2.8.1: tslib@2.8.1: {}
optional: true
tsscmp@1.0.6: {} tsscmp@1.0.6: {}
@@ -9688,6 +9847,8 @@ snapshots:
optionalDependencies: optionalDependencies:
typescript: 5.9.2 typescript: 5.9.2
web-vitals@5.1.0: {}
webidl-conversions@3.0.1: {} webidl-conversions@3.0.1: {}
webpack-virtual-modules@0.6.2: {} webpack-virtual-modules@0.6.2: {}

View File

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 415 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 994 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -0,0 +1,19 @@
<svg width="126" height="40" viewBox="0 0 126 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4430_8893)">
<path d="M22.0265 8.77515C22.9737 7.57867 23.6003 5.90666 23.4254 4.25C22.0702 4.31136 20.4381 5.20105 19.4618 6.39753C18.5874 7.45595 17.8297 9.15864 18.0337 10.7846C19.5346 10.9073 21.0793 9.97163 22.0265 8.77515Z" fill="white"/>
<path d="M24.1784 11.3853L23.8464 11.3574C22.5604 11.2572 21.3837 11.6296 20.3897 12.0069L19.3814 12.3981C18.917 12.5722 18.5149 12.6972 18.1869 12.6972C17.8232 12.6972 17.3973 12.5679 16.9256 12.3916L15.7142 11.9204C14.9662 11.6419 14.1546 11.4003 13.3246 11.4212C10.8217 11.4531 8.526 12.8727 7.23469 15.1216C4.63612 19.6354 6.56512 26.3024 9.09991 29.9708L9.53965 30.5946L9.84388 31.0098L10.1578 31.4174C11.1678 32.689 12.3337 33.7497 13.755 33.703C14.523 33.6702 15.0938 33.4589 15.6575 33.2216L16.1434 33.0155C16.8008 32.7416 17.5202 32.4909 18.5855 32.4909C19.511 32.4909 20.1636 32.6964 20.7491 32.9348L21.4811 33.246C22.0469 33.481 22.6338 33.6749 23.4478 33.6552C25.1351 33.6284 26.305 32.3637 27.3637 30.8914L27.6635 30.466L28.1083 29.8128C28.254 29.5914 28.3903 29.3714 28.5175 29.1552L28.76 28.7285C28.7984 28.6584 28.8359 28.5889 28.8723 28.5201L29.0796 28.1159C29.1123 28.0501 29.144 27.9851 29.1747 27.921L29.3482 27.5483L29.4998 27.2015L29.6302 26.8848L29.7873 26.4749L29.9 26.155L30 25.8398L29.8843 25.7918L29.5934 25.6516L29.2859 25.4809L29.0483 25.3338L28.7907 25.1589C27.6392 24.3393 26.0767 22.7067 26.0464 19.8746C26.0241 17.2734 27.512 15.6173 28.4644 14.8256L28.6993 14.6386C28.736 14.6106 28.7714 14.5843 28.8052 14.5597L29.0641 14.3809L29.2348 14.2763C28.0657 12.5643 26.4786 11.8661 25.2717 11.5719L24.9218 11.4951L24.5996 11.439L24.3097 11.3998C24.2644 11.3944 24.2206 11.3896 24.1784 11.3853Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M62.758 5.31069C63.9193 5.31077 64.889 5.76947 65.6646 6.68764C66.4422 7.60687 66.8302 8.81546 66.8303 10.3142C66.8303 11.9884 66.3775 13.312 65.4728 14.2835C64.6624 15.1483 63.6556 15.5805 62.4544 15.5806C61.1575 15.5806 60.2252 15.1148 59.6578 14.1832H59.617V19.3696H57.4295V8.75352C57.4295 7.70107 57.4021 6.62093 57.3487 5.51311H59.2726L59.3942 7.07294H59.4359C60.1654 5.89745 61.2725 5.31069 62.758 5.31069ZM62.0487 7.05164C61.509 7.05166 61.0183 7.23275 60.5803 7.58875C60.1414 7.94774 59.8544 8.41637 59.72 8.99677C59.6523 9.26741 59.618 9.48915 59.6179 9.6635V11.3059C59.618 12.0219 59.8376 12.6262 60.2766 13.1196C60.7158 13.6131 61.2865 13.8592 61.9883 13.8592C62.812 13.8591 63.4535 13.5414 63.9121 12.9075C64.3717 12.2724 64.601 11.4345 64.601 10.3941C64.601 9.43608 64.3858 8.64631 63.9529 8.02465C63.48 7.37623 62.8448 7.05164 62.0487 7.05164Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M74.0826 5.31069C75.2428 5.31076 76.2124 5.76946 76.9901 6.68764C77.7646 7.60686 78.153 8.81544 78.1531 10.3142C78.1531 11.9886 77.7007 13.3128 76.7947 14.2844C75.9853 15.1491 74.9785 15.5806 73.7772 15.5806C72.4805 15.5805 71.5487 15.1147 70.9824 14.1832H70.9416V19.3696H68.7541V8.75441C68.7541 7.7018 68.7266 6.62111 68.6733 5.51311H70.5971L70.7188 7.07383H70.7605C71.4889 5.89806 72.5959 5.31069 74.0826 5.31069ZM73.3723 7.05164C72.8316 7.05164 72.3422 7.23273 71.9031 7.58875C71.4641 7.94773 71.1781 8.41635 71.0437 8.99677C70.977 9.26763 70.9416 9.48997 70.9416 9.66438V11.3059C70.9416 12.0219 71.1615 12.6262 71.5985 13.1196C72.0377 13.612 72.6082 13.8592 73.312 13.8592C74.1357 13.8591 74.7772 13.5414 75.2358 12.9075C75.6954 12.2724 75.9247 11.4345 75.9247 10.3941C75.9247 9.43616 75.7086 8.64627 75.2757 8.02465C74.8028 7.37624 74.1695 7.05164 73.3723 7.05164Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M104.183 5.31247C105.627 5.31254 106.789 5.79161 107.667 6.75068C108.506 7.68122 108.925 8.88284 108.925 10.3551C108.925 11.8684 108.491 13.1113 107.627 14.0829C106.722 15.083 105.519 15.5815 104.02 15.5815C102.576 15.5815 101.426 15.1024 100.568 14.1441C99.7102 13.1859 99.2815 11.9763 99.2814 10.5184C99.2814 8.9928 99.7224 7.7427 100.608 6.7711C101.491 5.7985 102.684 5.31247 104.183 5.31247ZM104.105 6.91225C103.226 6.91225 102.557 7.30463 102.098 8.08946C101.705 8.73991 101.512 9.53127 101.512 10.4669C101.512 11.3747 101.706 12.1535 102.098 12.8018C102.571 13.5877 103.233 13.9799 104.085 13.9799C104.92 13.9799 105.576 13.5796 106.049 12.7814C106.452 12.1197 106.655 11.3329 106.655 10.4261C106.655 9.51811 106.461 8.7389 106.069 8.08946C105.61 7.30371 104.954 6.91231 104.105 6.91225Z" fill="white"/>
<path d="M87.1898 1.50476C88.4321 1.50476 89.4644 1.72103 90.2882 2.15284L89.7413 3.9364C88.9719 3.51789 88.1021 3.30875 87.1286 3.30874C86.3591 3.30874 85.7581 3.49854 85.3272 3.87603C84.9631 4.21351 84.7804 4.62461 84.7804 5.11183C84.7804 5.65149 84.9885 6.09794 85.4071 6.44883C85.7714 6.77301 86.4329 7.12408 87.3931 7.50263C88.5678 7.97558 89.4304 8.52878 89.9854 9.16279C90.5384 9.79479 90.8146 10.5857 90.8146 11.5296C90.8146 12.691 90.4114 13.6357 89.6019 14.3652C88.7124 15.1624 87.4742 15.561 85.883 15.561C84.4139 15.561 83.2358 15.2778 82.3443 14.7105L82.8512 12.887C83.8115 13.4677 84.8655 13.7588 86.0135 13.7588C86.8372 13.7588 87.4785 13.5726 87.9391 13.2013C88.3977 12.8299 88.6262 12.3307 88.6262 11.709C88.6262 11.155 88.4375 10.6883 88.0589 10.3098C87.6824 9.93122 87.0533 9.57946 86.1751 9.25423C83.7847 8.36269 82.5903 7.05644 82.5902 5.3391C82.5902 4.21668 83.0091 3.296 83.8473 2.57987C84.6824 1.86276 85.7966 1.50479 87.1898 1.50476Z" fill="white"/>
<path d="M95.6353 5.51044H98.0465V7.15373H95.6353V11.9344C95.6354 13.1499 96.0605 13.7571 96.9119 13.7571C97.3026 13.757 97.6268 13.7235 97.8832 13.6559L97.9435 15.3169C97.5126 15.4779 96.9452 15.5584 96.2425 15.5584C95.3789 15.5584 94.7039 15.2952 94.2166 14.7691C93.7313 14.2418 93.4869 13.3571 93.4869 12.1147V7.15196H92.0504V5.51044H93.4869V3.70735L95.6353 3.05927V5.51044Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M121.727 5.29294C123.146 5.29296 124.22 5.81967 124.95 6.8723C125.527 7.70842 125.818 8.74273 125.818 9.97067C125.818 10.3624 125.792 10.6926 125.737 10.9623H119.176C119.201 11.9348 119.518 12.6786 120.127 13.1916C120.68 13.6502 121.396 13.8805 122.274 13.8805C123.246 13.8805 124.132 13.7252 124.93 13.4144L125.272 14.9334C124.341 15.3397 123.241 15.5415 121.971 15.5415C120.445 15.5415 119.246 15.0924 118.374 14.1947C117.504 13.297 117.068 12.0911 117.068 10.5788C117.068 9.09424 117.474 7.85826 118.285 6.8723C119.135 5.81965 120.283 5.29294 121.727 5.29294ZM121.564 6.80927C120.849 6.8093 120.267 7.10571 119.823 7.70061C119.459 8.17349 119.243 8.74104 119.176 9.4016L123.732 9.40338C123.746 8.75496 123.604 8.194 123.308 7.72102C122.929 7.11271 122.347 6.80927 121.564 6.80927Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.527 15.3595H53.1966L51.9208 11.3485H47.4846L46.2683 15.3595H44L48.3954 1.7054H51.1103L55.527 15.3595ZM49.6525 3.52891C49.5181 4.10961 49.301 4.9673 49.0036 6.10082L47.8699 9.66616H51.5355L50.3814 6.10082C50.2593 5.73663 50.0308 4.87886 49.6934 3.52891H49.6525Z" fill="white"/>
<path d="M115.488 5.31069C115.69 5.31069 115.873 5.32501 116.035 5.35064V7.43693C115.818 7.39695 115.588 7.3757 115.346 7.37568C114.576 7.37568 113.981 7.66664 113.562 8.24837C113.198 8.76133 113.015 9.4099 113.015 10.1926V15.3577H110.829L110.849 8.61325C110.849 7.47861 110.822 6.44552 110.768 5.51399H112.673L112.753 7.39787H112.813C113.044 6.75055 113.408 6.22892 113.907 5.83804C114.394 5.48616 114.921 5.31073 115.488 5.31069Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_4430_8893">
<rect width="126" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -0,0 +1,19 @@
<svg width="146" height="40" viewBox="0 0 146 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4430_8891)">
<g clip-path="url(#clip1_4430_8891)">
<path d="M17.7529 19.34L5.04785 32.6225C5.46035 34.025 6.78035 35.0975 8.34785 35.0975C9.00785 35.0975 9.58535 34.9325 10.0804 34.6025L24.4354 26.435L17.7529 19.34Z" fill="#EA4335"/>
<path d="M30.6224 17.0299L24.4349 13.4824L17.5049 19.5874L24.5174 26.4349L30.7049 22.9699C31.7774 22.3924 32.5199 21.2374 32.5199 19.9999C32.4374 18.7624 31.6949 17.6074 30.6224 17.0299Z" fill="#FBBC04"/>
<path d="M5.04734 7.37756C4.96484 7.62506 4.96484 7.95506 4.96484 8.28506V31.7976C4.96484 32.1276 4.96484 32.3751 5.04734 32.7051L18.2473 19.7526L5.04734 7.37756Z" fill="#4285F4"/>
<path d="M17.8354 20L24.4354 13.4825L10.1629 5.39747C9.66785 5.06747 9.00785 4.90247 8.34785 4.90247C6.78035 4.90247 5.37785 5.97497 5.04785 7.37747L17.8354 20Z" fill="#34A853"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M44.0034 7.7563C44.0034 3.48096 47.7006 0 52.0994 0C54.5313 0 56.2616 0.928146 57.5673 2.13686L56.03 3.63103C55.0969 2.77955 53.8314 2.11891 52.0978 2.11891C48.8855 2.11891 46.3748 4.63257 46.3748 7.75467C46.3748 10.8768 48.8855 13.3937 52.0961 13.3937C54.1789 13.3937 55.3637 12.5814 56.124 11.8408C56.7466 11.2356 57.1545 10.3662 57.3122 9.1738H52.0994V7.05978H59.437C59.5142 7.43822 59.5544 7.89169 59.5544 8.38268C59.5544 9.96982 59.1063 11.9387 57.6647 13.3399C56.2616 14.759 54.4726 15.5159 52.0978 15.5159C47.6973 15.5159 44 12.0382 44 7.75956L44.0034 7.7563ZM65.4855 5.52483C62.6442 5.52483 60.3248 7.6258 60.3248 10.5179C60.3248 13.3953 62.6425 15.511 65.4855 15.511C68.3286 15.511 70.6429 13.3921 70.6429 10.5163C70.6429 7.62417 68.3269 5.5232 65.4855 5.52483ZM65.4855 13.547C63.9297 13.547 62.5854 12.2992 62.5854 10.5195C62.5854 8.72196 63.9281 7.49205 65.4855 7.49205C67.0413 7.49205 68.3839 8.72033 68.3839 10.5195C68.3839 12.2975 67.043 13.547 65.4855 13.547ZM76.7385 5.52483C73.8971 5.52483 71.5811 7.6258 71.5811 10.5179C71.5811 13.3953 73.8971 15.511 76.7385 15.511C79.5798 15.511 81.8959 13.3921 81.8959 10.5163C81.8959 7.62417 79.5815 5.5232 76.7385 5.52483ZM76.7385 13.547C75.1827 13.547 73.8384 12.2992 73.8384 10.5195C73.8384 8.72196 75.181 7.49205 76.7385 7.49205C78.2943 7.49205 79.6386 8.72033 79.6386 10.5195C79.6386 12.2975 78.2943 13.547 76.7385 13.547ZM90.5492 5.82824V6.64057H90.472C89.9668 6.05171 88.9934 5.5232 87.7682 5.5232C85.1988 5.5232 82.8408 7.71878 82.8408 10.5391C82.8408 13.3366 85.1971 15.5142 87.7682 15.5142C88.9934 15.5142 89.9668 14.9857 90.472 14.3806H90.5492V15.0983C90.5492 17.0084 89.4986 18.0312 87.8052 18.0312C86.4222 18.0312 85.5663 17.0655 85.2155 16.2548L83.2486 17.0492C83.8125 18.3721 85.3129 20 87.8035 20C90.4485 20 92.6873 18.4846 92.6873 14.7965V5.8266L90.5492 5.82824ZM87.9612 13.547C86.4055 13.547 85.0981 12.278 85.0981 10.5391C85.0981 8.78069 86.4038 7.49368 87.9612 7.49368C89.4986 7.49368 90.7052 8.77906 90.7052 10.5391C90.7069 12.278 89.5002 13.547 87.9612 13.547ZM94.2465 0.530136H96.5054V15.2108H94.2465V0.530136ZM102.697 13.547C101.549 13.547 100.73 13.0348 100.208 12.0349L107.079 9.27004L106.842 8.70239C106.416 7.58829 105.11 5.52483 102.443 5.52483C99.7966 5.52483 97.5963 7.54914 97.5963 10.5195C97.5963 13.317 99.7764 15.5126 102.697 15.5126C105.053 15.5126 106.416 14.1147 106.98 13.2991L105.228 12.1654C104.642 12.9989 103.843 13.5486 102.697 13.547ZM102.52 7.45453C103.415 7.45453 104.174 7.89006 104.427 8.51317L99.8318 10.3678C99.7747 8.43814 101.371 7.45453 102.52 7.45453ZM116.991 0.530136H111.59V15.2108H113.844V9.65011H116.992C119.491 9.65011 121.948 7.89169 121.948 5.08931C121.948 2.29182 119.493 0.531767 116.996 0.531767L116.991 0.530136ZM117.049 7.60623H113.844V2.57238H117.049C118.734 2.57238 119.694 3.93116 119.694 5.08931C119.694 6.22788 118.734 7.60623 117.049 7.60623ZM125.444 15.2108V0.530136H123.19V15.2108H125.444ZM135.569 15.1847V9.55713C135.569 6.95049 133.566 5.4971 130.979 5.4971C129.35 5.4971 127.66 6.19688 126.96 7.74488L128.96 8.55558C129.388 7.74488 130.184 7.479 131.021 7.479C132.186 7.479 133.371 8.1592 133.389 9.36954V9.52125C132.981 9.29451 132.109 8.95359 131.038 8.95359C128.881 8.95359 126.686 10.1052 126.686 12.2584C126.686 14.224 128.455 15.4881 130.437 15.4881C131.954 15.4881 132.788 14.8275 133.312 14.0543H133.389V15.188H135.568L135.569 15.1847ZM130.711 13.5438C129.972 13.5438 128.942 13.1849 128.942 12.2992C128.942 11.1655 130.226 10.7283 131.333 10.7283C132.325 10.7283 132.79 10.9355 133.394 11.2193C133.221 12.5373 132.075 13.5274 130.711 13.5438ZM143.496 5.81845L140.911 12.1817H140.834L138.152 5.81845H135.724L139.745 14.7149L137.451 19.6623H139.802L146 5.81845H143.496Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_4430_8891">
<rect width="146" height="40" fill="white"/>
</clipPath>
<clipPath id="clip1_4430_8891">
<rect width="33" height="33" fill="white" transform="translate(1.5 3.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,15 @@
<svg width="112" height="40" viewBox="0 0 112 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4430_8889)">
<path d="M16.875 8.5475L31.5 6.5V19.4375H16.875V8.5475Z" fill="white"/>
<path d="M15.75 8.705L4.5 10.28V19.4375H15.75V8.705Z" fill="white"/>
<path d="M15.75 20.5625H4.5V29.72L15.75 31.295V20.5625Z" fill="white"/>
<path d="M16.875 31.4525L31.5 33.5V20.5625H16.875V31.4525Z" fill="white"/>
<path d="M62.0266 17.234C58.6966 17.234 56.1406 14.732 56.1406 10.412C56.1406 6.074 58.7506 3.5 62.1166 3.5C63.7726 3.5 65.0686 4.292 65.8786 5.174L64.7446 6.506C64.0426 5.804 63.2326 5.318 62.1526 5.318C59.8486 5.318 58.2826 7.244 58.2826 10.34C58.2826 13.49 59.7586 15.416 62.0986 15.416C63.3226 15.416 64.2406 14.876 65.0326 14.012L66.1486 15.326C65.0686 16.55 63.7546 17.234 62.0266 17.234Z" fill="white"/>
<path d="M45.7275 3.75201H49.7415C52.6935 3.75201 54.7995 4.77802 54.7995 7.74802C54.7995 10.646 52.6935 11.978 49.8135 11.978H47.8155V17H45.7275V3.75201ZM49.6155 10.304C51.7935 10.304 52.7475 9.49401 52.7475 7.74802C52.7475 6.00202 51.6495 5.42601 49.5435 5.42601H47.8155V10.304H49.6155Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_4430_8889">
<rect width="112" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,4 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.0265 6.77515C22.9737 5.57867 23.6003 3.90666 23.4254 2.25C22.0702 2.31136 20.4381 3.20105 19.4618 4.39753C18.5874 5.45595 17.8297 7.15864 18.0337 8.78462C19.5346 8.90734 21.0793 7.97163 22.0265 6.77515Z" fill="white"/>
<path d="M24.1784 9.38534L23.8464 9.35745C22.5604 9.25719 21.3837 9.62957 20.3897 10.0069L19.3814 10.3981C18.917 10.5722 18.5149 10.6972 18.1869 10.6972C17.8232 10.6972 17.3973 10.5679 16.9256 10.3916L15.7142 9.92036C14.9662 9.64193 14.1546 9.40031 13.3246 9.42125C10.8217 9.45315 8.526 10.8727 7.23469 13.1216C4.63612 17.6354 6.56512 24.3024 9.09991 27.9708L9.53965 28.5946L9.84388 29.0098L10.1578 29.4174C11.1678 30.689 12.3337 31.7497 13.755 31.703C14.523 31.6702 15.0938 31.4589 15.6575 31.2216L16.1434 31.0155C16.8008 30.7416 17.5202 30.4909 18.5855 30.4909C19.511 30.4909 20.1636 30.6964 20.7491 30.9348L21.4811 31.246C22.0469 31.481 22.6338 31.6749 23.4478 31.6552C25.1351 31.6284 26.305 30.3637 27.3637 28.8914L27.6635 28.466L28.1083 27.8128C28.254 27.5914 28.3903 27.3714 28.5175 27.1552L28.76 26.7285C28.7984 26.6584 28.8359 26.5889 28.8723 26.5201L29.0796 26.1159C29.1123 26.0501 29.144 25.9851 29.1747 25.921L29.3482 25.5483L29.4998 25.2015L29.6302 24.8848L29.7873 24.4749L29.9 24.155L30 23.8398L29.8843 23.7918L29.5934 23.6516L29.2859 23.4809L29.0483 23.3338L28.7907 23.1589C27.6392 22.3393 26.0767 20.7067 26.0464 17.8746C26.0241 15.2734 27.512 13.6173 28.4644 12.8256L28.6993 12.6386C28.736 12.6106 28.7714 12.5843 28.8052 12.5597L29.0641 12.3809L29.2348 12.2763C28.0657 10.5643 26.4786 9.86607 25.2717 9.57188L24.9218 9.49514L24.5996 9.43898L24.3097 9.39975C24.2644 9.39442 24.2206 9.38964 24.1784 9.38534Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,13 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3298_5174)">
<path d="M17.7524 17.3401L5.04736 30.6226C5.45986 32.0251 6.77986 33.0976 8.34736 33.0976C9.00736 33.0976 9.58486 32.9326 10.0799 32.6026L24.4349 24.4351L17.7524 17.3401Z" fill="#EA4335"/>
<path d="M30.6224 15.03L24.4349 11.4825L17.5049 17.5875L24.5174 24.435L30.7049 20.97C31.7774 20.3925 32.5199 19.2375 32.5199 18C32.4374 16.7625 31.6949 15.6075 30.6224 15.03Z" fill="#FBBC04"/>
<path d="M5.04734 5.37769C4.96484 5.62519 4.96484 5.95519 4.96484 6.28519V29.7977C4.96484 30.1277 4.96484 30.3752 5.04734 30.7052L18.2473 17.7527L5.04734 5.37769Z" fill="#4285F4"/>
<path d="M17.8349 18.0001L24.4349 11.4826L10.1624 3.39759C9.66736 3.06759 9.00736 2.90259 8.34736 2.90259C6.77986 2.90259 5.37736 3.97509 5.04736 5.37759L17.8349 18.0001Z" fill="#34A853"/>
</g>
<defs>
<clipPath id="clip0_3298_5174">
<rect width="33" height="33" fill="white" transform="translate(1.5 1.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,6 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.875 6.5475L31.5 4.5V17.4375H16.875V6.5475Z" fill="white"/>
<path d="M15.75 6.705L4.5 8.28V17.4375H15.75V6.705Z" fill="white"/>
<path d="M15.75 18.5625H4.5V27.72L15.75 29.295V18.5625Z" fill="white"/>
<path d="M16.875 29.4525L31.5 31.5V18.5625H16.875V29.4525Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 390 B