diff --git a/apps/api/scripts/test-events.ts b/apps/api/scripts/test-events.ts index 06f12faf..fe456aaf 100644 --- a/apps/api/scripts/test-events.ts +++ b/apps/api/scripts/test-events.ts @@ -1,44 +1,44 @@ -import { omit, prop, uniqBy } from "ramda"; +import { omit, prop, uniqBy } from 'ramda'; -import { generateProfileId, getTime, toISOString } from "@openpanel/common"; -import type { Event, IServiceCreateEventPayload } from "@openpanel/db"; +import { generateProfileId, getTime, toISOString } from '@openpanel/common'; +import type { Event, IServiceCreateEventPayload } from '@openpanel/db'; import { createEvent as createClickhouseEvent, db, formatClickhouseDate, getSalts, -} from "@openpanel/db"; +} from '@openpanel/db'; -import { parseIp } from "../src/utils/parseIp"; -import { parseUserAgent } from "../src/utils/parseUserAgent"; +import { parseIp } from '../src/utils/parseIp'; +import { parseUserAgent } from '../src/utils/parseUserAgent'; const clean = omit([ - "ip", - "os", - "ua", - "url", - "hash", - "host", - "path", - "device", - "screen", - "hostname", - "language", - "referrer", - "timezone", + 'ip', + 'os', + 'ua', + 'url', + 'hash', + 'host', + 'path', + 'device', + 'screen', + 'hostname', + 'language', + 'referrer', + 'timezone', ]); async function main() { const events = await db.event.findMany({ where: { - project_id: "4e2798cb-e255-4e9d-960d-c9ad095aabd7", - name: "screen_view", + project_id: '4e2798cb-e255-4e9d-960d-c9ad095aabd7', + name: 'screen_view', createdAt: { - gte: new Date("2024-01-01"), - lt: new Date("2024-02-04"), + gte: new Date('2024-01-01'), + lt: new Date('2024-02-04'), }, }, orderBy: { - createdAt: "asc", + createdAt: 'asc', }, }); @@ -50,7 +50,7 @@ async function main() { const properties = event.properties as Record; - if (properties.ua?.includes("bot")) { + if (properties.ua?.includes('bot')) { // console.log('IGNORE', event.id); continue; } @@ -67,20 +67,20 @@ async function main() { } } - console.log("Total users", Object.keys(grouped).length); + console.log('Total users', Object.keys(grouped).length); let uidx = -1; for (const profile_id of Object.keys(grouped)) { uidx++; console.log(`User index ${uidx}`); - const events = uniqBy(prop("createdAt"), grouped[profile_id] || []); + const events = uniqBy(prop('createdAt'), grouped[profile_id] || []); if (events) { let lastSessionStart = null; let screenViews = 0; let totalDuration = 0; - console.log("new user..."); + console.log('new user...'); let eidx = -1; for (const event of events) { eidx++; @@ -93,7 +93,7 @@ async function main() { const projectId = event.project_id; const path = properties.path!; const ip = properties.ip!; - const origin = "https://openpanel.kiddo.se"; + const origin = 'https://openpanel.kiddo.se'; const ua = properties.ua!; const uaInfo = parseUserAgent(ua); const salts = await getSalts(); @@ -133,8 +133,8 @@ async function main() { ? nextEvent.createdAt.getTime() - event.createdAt.getTime() : 0, path, - referrer: properties?.referrer?.host ?? "", // TODO - referrerName: properties?.referrer?.host ?? "", // TODO + referrer: properties?.referrer?.host ?? '', // TODO + referrerName: properties?.referrer?.host ?? '', // TODO }; if (!prevEventAt) { @@ -173,8 +173,8 @@ async function main() { async function createEvent(event: IServiceCreateEventPayload) { console.log( `Create ${event.name} - ${event.path} - ${formatClickhouseDate( - event.createdAt, - )} - ${event.duration / 1000} sec`, + event.createdAt + )} - ${event.duration / 1000} sec` ); await createClickhouseEvent(event); } @@ -183,7 +183,7 @@ async function createSessionStart(event: IServiceCreateEventPayload) { const session: IServiceCreateEventPayload = { ...event, duration: 0, - name: "session_start", + name: 'session_start', createdAt: toISOString(getTime(event.createdAt) - 100), }; @@ -197,7 +197,7 @@ async function createSessionEnd( options: { screenViews: number; totalDuration: number; - }, + } ) { const properties: Record = {}; if (options.screenViews === 1) { @@ -213,7 +213,7 @@ async function createSessionEnd( ...sessionStart.properties, }, duration: options.totalDuration, - name: "session_end", + name: 'session_end', createdAt: toISOString(prevEventAt.getTime() + 10), }; diff --git a/apps/api/src/controllers/event.controller.ts b/apps/api/src/controllers/event.controller.ts index 412aea75..9d96dd4c 100644 --- a/apps/api/src/controllers/event.controller.ts +++ b/apps/api/src/controllers/event.controller.ts @@ -1,19 +1,19 @@ -import { logger, logInfo, noop } from "@/utils/logger"; -import { getClientIp, parseIp } from "@/utils/parseIp"; -import { getReferrerWithQuery, parseReferrer } from "@/utils/parseReferrer"; -import { isUserAgentSet, parseUserAgent } from "@/utils/parseUserAgent"; -import { isSameDomain, parsePath } from "@/utils/url"; -import type { FastifyReply, FastifyRequest } from "fastify"; -import { omit } from "ramda"; -import { v4 as uuid } from "uuid"; +import { logger, logInfo, noop } from '@/utils/logger'; +import { getClientIp, parseIp } from '@/utils/parseIp'; +import { getReferrerWithQuery, parseReferrer } from '@/utils/parseReferrer'; +import { isUserAgentSet, parseUserAgent } from '@/utils/parseUserAgent'; +import { isSameDomain, parsePath } from '@/utils/url'; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import { omit } from 'ramda'; +import { v4 as uuid } from 'uuid'; -import { generateDeviceId, getTime, toISOString } from "@openpanel/common"; -import type { IServiceCreateEventPayload } from "@openpanel/db"; -import { createEvent, getEvents, getSalts } from "@openpanel/db"; -import type { JobsOptions } from "@openpanel/queue"; -import { eventsQueue } from "@openpanel/queue"; -import { findJobByPrefix } from "@openpanel/queue/src/utils"; -import type { PostEventPayload } from "@openpanel/sdk"; +import { generateDeviceId, getTime, toISOString } from '@openpanel/common'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; +import { createEvent, getEvents, getSalts } from '@openpanel/db'; +import type { JobsOptions } from '@openpanel/queue'; +import { eventsQueue } from '@openpanel/queue'; +import { findJobByPrefix } from '@openpanel/queue/src/utils'; +import type { PostEventPayload } from '@openpanel/sdk'; const SESSION_TIMEOUT = 1000 * 60 * 30; const SESSION_END_TIMEOUT = SESSION_TIMEOUT + 1000; @@ -55,7 +55,7 @@ export async function postEvent( request: FastifyRequest<{ Body: PostEventPayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const contextLogger = createContextLogger(request); let deviceId: string | null = null; @@ -65,23 +65,23 @@ export async function postEvent( // replace thing is just for older sdks when we didn't have `__` // remove when kiddokitchen app (24.09.02) is not used anymore return ( - ((properties[name] || properties[name.replace("__", "")]) as + ((properties[name] || properties[name.replace('__', '')]) as | string | null | undefined) ?? undefined ); }; - const profileId = body.profileId ?? ""; + const profileId = body.profileId ?? ''; const createdAt = new Date(body.timestamp); - const url = getProperty("__path"); + const url = getProperty('__path'); const { path, hash, query } = parsePath(url); - const referrer = isSameDomain(getProperty("__referrer"), url) + const referrer = isSameDomain(getProperty('__referrer'), url) ? null - : parseReferrer(getProperty("__referrer")); + : parseReferrer(getProperty('__referrer')); const utmReferrer = getReferrerWithQuery(query); const ip = getClientIp(request)!; const origin = request.headers.origin!; - const ua = request.headers["user-agent"]!; + const ua = request.headers['user-agent']!; const uaInfo = parseUserAgent(ua); const salts = await getSalts(); const currentDeviceId = generateDeviceId({ @@ -101,48 +101,48 @@ export async function postEvent( if (isServerEvent) { const [event] = await withTiming( - "Get last event (server-event)", + 'Get last event (server-event)', getEvents( - `SELECT * FROM events WHERE name = 'screen_view' AND profile_id = '${profileId}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1`, - ), + `SELECT * FROM events WHERE name = 'screen_view' AND profile_id = '${profileId}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1` + ) ); - const payload: Omit = { + const payload: Omit = { name: body.name, - deviceId: event?.deviceId || "", - sessionId: event?.sessionId || "", + deviceId: event?.deviceId || '', + sessionId: event?.sessionId || '', profileId, projectId, properties: Object.assign( {}, - omit(["__path", "__referrer"], properties), + omit(['__path', '__referrer'], properties), { hash, query, - }, + } ), createdAt, - country: event?.country ?? "", - city: event?.city ?? "", - region: event?.region ?? "", - continent: event?.continent ?? "", - os: event?.os ?? "", - osVersion: event?.osVersion ?? "", - browser: event?.browser ?? "", - browserVersion: event?.browserVersion ?? "", - device: event?.device ?? "", - brand: event?.brand ?? "", - model: event?.model ?? "", + country: event?.country ?? '', + city: event?.city ?? '', + region: event?.region ?? '', + continent: event?.continent ?? '', + os: event?.os ?? '', + osVersion: event?.osVersion ?? '', + browser: event?.browser ?? '', + browserVersion: event?.browserVersion ?? '', + device: event?.device ?? '', + brand: event?.brand ?? '', + model: event?.model ?? '', duration: 0, - path: event?.path ?? "", - referrer: event?.referrer ?? "", - referrerName: event?.referrerName ?? "", - referrerType: event?.referrerType ?? "", + path: event?.path ?? '', + referrer: event?.referrer ?? '', + referrerName: event?.referrerName ?? '', + referrerType: event?.referrerType ?? '', profile: undefined, meta: undefined, - } + }; - contextLogger.send("server event is queued", { + contextLogger.send('server event is queued', { ip, origin, ua, @@ -156,27 +156,27 @@ export async function postEvent( prevEvent: event, }); - eventsQueue.add("event", { - type: "createEvent", + eventsQueue.add('event', { + type: 'createEvent', payload, }); - return reply.status(200).send(""); + return reply.status(200).send(''); } const [geo, sessionEndJobCurrentDeviceId, sessionEndJobPreviousDeviceId] = await withTiming( - "Get geo and jobs from queue", + 'Get geo and jobs from queue', Promise.all([ parseIp(ip), findJobByPrefix( eventsQueue, - `sessionEnd:${projectId}:${currentDeviceId}:`, + `sessionEnd:${projectId}:${currentDeviceId}:` ), findJobByPrefix( eventsQueue, - `sessionEnd:${projectId}:${previousDeviceId}:`, + `sessionEnd:${projectId}:${previousDeviceId}:` ), - ]), + ]) ); const createSessionStart = @@ -194,9 +194,9 @@ export async function postEvent( deviceId = currentDeviceId; // Queue session end eventsQueue.add( - "event", + 'event', { - type: "createSessionEnd", + type: 'createSessionEnd', payload: { deviceId, }, @@ -204,27 +204,27 @@ export async function postEvent( { delay: SESSION_END_TIMEOUT, jobId: `sessionEnd:${projectId}:${deviceId}:${Date.now()}`, - }, + } ); } const [[sessionStartEvent], prevEventJob] = await withTiming( - "Get session start event", + 'Get session start event', Promise.all([ getEvents( - `SELECT * FROM events WHERE name = 'session_start' AND device_id = '${deviceId}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1`, + `SELECT * FROM events WHERE name = 'session_start' AND device_id = '${deviceId}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1` ), findJobByPrefix(eventsQueue, `event:${projectId}:${deviceId}:`), - ]), + ]) ); - const payload: Omit = { + const payload: Omit = { name: body.name, deviceId, profileId, projectId, - sessionId: createSessionStart ? uuid() : sessionStartEvent?.sessionId ?? "", - properties: Object.assign({}, omit(["__path", "__referrer"], properties), { + sessionId: createSessionStart ? uuid() : sessionStartEvent?.sessionId ?? '', + properties: Object.assign({}, omit(['__path', '__referrer'], properties), { hash, query, }), @@ -243,27 +243,27 @@ export async function postEvent( duration: 0, path: path, referrer: referrer?.url, - referrerName: referrer?.name ?? utmReferrer?.name ?? "", - referrerType: referrer?.type ?? utmReferrer?.type ?? "", + referrerName: referrer?.name ?? utmReferrer?.name ?? '', + referrerType: referrer?.type ?? utmReferrer?.type ?? '', profile: undefined, meta: undefined, }; const isDelayed = prevEventJob ? await prevEventJob?.isDelayed() : false; - if (isDelayed && prevEventJob && prevEventJob.data.type === "createEvent") { + if (isDelayed && prevEventJob && prevEventJob.data.type === 'createEvent') { const prevEvent = prevEventJob.data.payload; const duration = getTime(payload.createdAt) - getTime(prevEvent.createdAt); - contextLogger.add("prevEvent", prevEvent); + contextLogger.add('prevEvent', prevEvent); // Set path from prev screen_view event if current event is not a screen_view - if (payload.name != "screen_view") { + if (payload.name != 'screen_view') { payload.path = prevEvent.path; } - if (payload.name === "screen_view") { + if (payload.name === 'screen_view') { if (duration < 0) { - contextLogger.send("duration is wrong", { + contextLogger.send('duration is wrong', { payload, duration, }); @@ -271,21 +271,21 @@ export async function postEvent( // Skip update duration if it's wrong // Seems like request is not in right order await withTiming( - "Update previous job with duration", + 'Update previous job with duration', prevEventJob.updateData({ - type: "createEvent", + type: 'createEvent', payload: { ...prevEvent, duration, }, - }), + }) ); } - await withTiming("Promote previous job", prevEventJob.promote()); + await withTiming('Promote previous job', prevEventJob.promote()); } - } else if (payload.name !== "screen_view") { - contextLogger.send("no previous job", { + } else if (payload.name !== 'screen_view') { + contextLogger.send('no previous job', { prevEventJob, payload, }); @@ -294,23 +294,23 @@ export async function postEvent( if (createSessionStart) { // We do not need to queue session_start await withTiming( - "Create session start event", + 'Create session start event', createEvent({ ...payload, - name: "session_start", + name: 'session_start', // @ts-expect-error createdAt: toISOString(getTime(payload.createdAt) - 100), - }), + }) ); } const options: JobsOptions = {}; - if (payload.name === "screen_view") { + if (payload.name === 'screen_view') { options.delay = SESSION_TIMEOUT; options.jobId = `event:${projectId}:${deviceId}:${Date.now()}`; } - contextLogger.send("event is queued", { + contextLogger.send('event is queued', { ip, origin, ua, @@ -328,14 +328,14 @@ export async function postEvent( // Queue current event eventsQueue .add( - "event", + 'event', { - type: "createEvent", + type: 'createEvent', payload, }, - options, + options ) - .catch(noop("Failed to queue event")); + .catch(noop('Failed to queue event')); reply.status(202).send(deviceId); } diff --git a/apps/api/src/controllers/live.controller.ts b/apps/api/src/controllers/live.controller.ts index 08db054e..93de1e83 100644 --- a/apps/api/src/controllers/live.controller.ts +++ b/apps/api/src/controllers/live.controller.ts @@ -1,13 +1,13 @@ -import type { FastifyReply, FastifyRequest } from "fastify"; -import type * as WebSocket from "ws"; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import type * as WebSocket from 'ws'; -import { getSafeJson } from "@openpanel/common"; -import type { IServiceCreateEventPayload } from "@openpanel/db"; -import { getEvents, getLiveVisitors } from "@openpanel/db"; -import { redis, redisPub, redisSub } from "@openpanel/redis"; +import { getSafeJson } from '@openpanel/common'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; +import { getEvents, getLiveVisitors } from '@openpanel/db'; +import { redis, redisPub, redisSub } from '@openpanel/redis'; export function getLiveEventInfo(key: string) { - return key.split(":").slice(2) as [string, string]; + return key.split(':').slice(2) as [string, string]; } export async function test( @@ -16,20 +16,20 @@ export async function test( projectId: string; }; }>, - reply: FastifyReply, + reply: FastifyReply ) { const [event] = await getEvents( - `SELECT * FROM events WHERE project_id = '${req.params.projectId}' AND name = 'screen_view' LIMIT 1`, + `SELECT * FROM events WHERE project_id = '${req.params.projectId}' AND name = 'screen_view' LIMIT 1` ); if (!event) { - return reply.status(404).send("No event found"); + return reply.status(404).send('No event found'); } - redisPub.publish("event", JSON.stringify(event)); + redisPub.publish('event', JSON.stringify(event)); redis.set( `live:event:${event.projectId}:${Math.random() * 1000}`, - "", - "EX", - 10, + '', + 'EX', + 10 ); reply.status(202).send(event); } @@ -42,15 +42,15 @@ export function wsVisitors( Params: { projectId: string; }; - }>, + }> ) { const { params } = req; - redisSub.subscribe("event"); - redisSub.psubscribe("__key*:expired"); + redisSub.subscribe('event'); + redisSub.psubscribe('__key*:expired'); const message = (channel: string, message: string) => { - if (channel === "event") { + if (channel === 'event') { const event = getSafeJson(message); if (event?.projectId === params.projectId) { getLiveVisitors(params.projectId).then((count) => { @@ -68,14 +68,14 @@ export function wsVisitors( } }; - redisSub.on("message", message); - redisSub.on("pmessage", pmessage); + redisSub.on('message', message); + redisSub.on('pmessage', pmessage); - connection.socket.on("close", () => { - redisSub.unsubscribe("event"); - redisSub.punsubscribe("__key*:expired"); - redisSub.off("message", message); - redisSub.off("pmessage", pmessage); + connection.socket.on('close', () => { + redisSub.unsubscribe('event'); + redisSub.punsubscribe('__key*:expired'); + redisSub.off('message', message); + redisSub.off('pmessage', pmessage); }); } @@ -87,11 +87,11 @@ export function wsEvents( Params: { projectId: string; }; - }>, + }> ) { const { params } = req; - redisSub.subscribe("event"); + redisSub.subscribe('event'); const message = (channel: string, message: string) => { const event = getSafeJson(message); @@ -100,10 +100,10 @@ export function wsEvents( } }; - redisSub.on("message", message); + redisSub.on('message', message); - connection.socket.on("close", () => { - redisSub.unsubscribe("event"); - redisSub.off("message", message); + connection.socket.on('close', () => { + redisSub.unsubscribe('event'); + redisSub.off('message', message); }); } diff --git a/apps/api/src/controllers/misc.controller.ts b/apps/api/src/controllers/misc.controller.ts index daa3ee7b..2932b5be 100644 --- a/apps/api/src/controllers/misc.controller.ts +++ b/apps/api/src/controllers/misc.controller.ts @@ -1,9 +1,9 @@ -import type { FastifyReply, FastifyRequest } from "fastify"; -import icoToPng from "ico-to-png"; -import sharp from "sharp"; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import icoToPng from 'ico-to-png'; +import sharp from 'sharp'; -import { createHash } from "@openpanel/common"; -import { redis } from "@openpanel/redis"; +import { createHash } from '@openpanel/common'; +import { redis } from '@openpanel/redis'; interface GetFaviconParams { url: string; @@ -12,9 +12,9 @@ interface GetFaviconParams { async function getImageBuffer(url: string) { try { const res = await fetch(url); - const contentType = res.headers.get("content-type"); + const contentType = res.headers.get('content-type'); - if (!contentType?.includes("image")) { + if (!contentType?.includes('image')) { return null; } @@ -22,7 +22,7 @@ async function getImageBuffer(url: string) { return null; } - if (contentType === "image/x-icon" || url.endsWith(".ico")) { + if (contentType === 'image/x-icon' || url.endsWith('.ico')) { const arrayBuffer = await res.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); return await icoToPng(buffer, 30); @@ -30,36 +30,36 @@ async function getImageBuffer(url: string) { return await sharp(await res.arrayBuffer()) .resize(30, 30, { - fit: "cover", + fit: 'cover', }) .png() .toBuffer(); } catch (e) { - console.log("Failed to get image from url", url); + console.log('Failed to get image from url', url); console.log(e); } } -const imageExtensions = ["svg", "png", "jpg", "jpeg", "gif", "webp", "ico"]; +const imageExtensions = ['svg', 'png', 'jpg', 'jpeg', 'gif', 'webp', 'ico']; export async function getFavicon( request: FastifyRequest<{ Querystring: GetFaviconParams; }>, - reply: FastifyReply, + reply: FastifyReply ) { function sendBuffer(buffer: Buffer, cacheKey?: string) { if (cacheKey) { - redis.set(`favicon:${cacheKey}`, buffer.toString("base64")); + redis.set(`favicon:${cacheKey}`, buffer.toString('base64')); } - reply.type("image/png"); - console.log("buffer", buffer.byteLength); + reply.type('image/png'); + console.log('buffer', buffer.byteLength); return reply.send(buffer); } if (!request.query.url) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const url = decodeURIComponent(request.query.url); @@ -69,7 +69,7 @@ export async function getFavicon( const cacheKey = createHash(url, 32); const cache = await redis.get(`favicon:${cacheKey}`); if (cache) { - return sendBuffer(Buffer.from(cache, "base64")); + return sendBuffer(Buffer.from(cache, 'base64')); } const buffer = await getImageBuffer(url); if (buffer && buffer.byteLength > 0) { @@ -80,7 +80,7 @@ export async function getFavicon( const { hostname, origin } = new URL(url); const cache = await redis.get(`favicon:${hostname}`); if (cache) { - return sendBuffer(Buffer.from(cache, "base64")); + return sendBuffer(Buffer.from(cache, 'base64')); } // TRY FAVICON.ICO @@ -94,7 +94,7 @@ export async function getFavicon( function findFavicon(res: string) { const match = res.match( - /(\|\)/, + /(\|\)/ ); if (!match) { return null; @@ -112,16 +112,16 @@ export async function getFavicon( } } - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } export async function clearFavicons( request: FastifyRequest, - reply: FastifyReply, + reply: FastifyReply ) { - const keys = await redis.keys("favicon:*"); + const keys = await redis.keys('favicon:*'); for (const key of keys) { await redis.del(key); } - return reply.status(404).send("OK"); + return reply.status(404).send('OK'); } diff --git a/apps/api/src/controllers/profile.controller.ts b/apps/api/src/controllers/profile.controller.ts index 14befafb..5bb787c8 100644 --- a/apps/api/src/controllers/profile.controller.ts +++ b/apps/api/src/controllers/profile.controller.ts @@ -1,24 +1,24 @@ -import { getClientIp, parseIp } from "@/utils/parseIp"; -import { isUserAgentSet, parseUserAgent } from "@/utils/parseUserAgent"; -import type { FastifyReply, FastifyRequest } from "fastify"; -import { assocPath, pathOr } from "ramda"; +import { getClientIp, parseIp } from '@/utils/parseIp'; +import { isUserAgentSet, parseUserAgent } from '@/utils/parseUserAgent'; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import { assocPath, pathOr } from 'ramda'; -import { getProfileById, upsertProfile } from "@openpanel/db"; +import { getProfileById, upsertProfile } from '@openpanel/db'; import type { IncrementProfilePayload, UpdateProfilePayload, -} from "@openpanel/sdk"; +} from '@openpanel/sdk'; export async function updateProfile( request: FastifyRequest<{ Body: UpdateProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, properties, ...rest } = request.body; const projectId = request.projectId; const ip = getClientIp(request)!; - const ua = request.headers["user-agent"]!; + const ua = request.headers['user-agent']!; const uaInfo = parseUserAgent(ua); const geo = await parseIp(ip); @@ -40,29 +40,29 @@ export async function incrementProfileProperty( request: FastifyRequest<{ Body: IncrementProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, property, value } = request.body; const projectId = request.projectId; const profile = await getProfileById(profileId); if (!profile) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const parsed = parseInt( - pathOr("0", property.split("."), profile.properties), - 10, + pathOr('0', property.split('.'), profile.properties), + 10 ); if (isNaN(parsed)) { - return reply.status(400).send("Not number"); + return reply.status(400).send('Not number'); } profile.properties = assocPath( - property.split("."), + property.split('.'), parsed + value, - profile.properties, + profile.properties ); await upsertProfile({ @@ -78,29 +78,29 @@ export async function decrementProfileProperty( request: FastifyRequest<{ Body: IncrementProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, property, value } = request.body; const projectId = request.projectId; const profile = await getProfileById(profileId); if (!profile) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const parsed = parseInt( - pathOr("0", property.split("."), profile.properties), - 10, + pathOr('0', property.split('.'), profile.properties), + 10 ); if (isNaN(parsed)) { - return reply.status(400).send("Not number"); + return reply.status(400).send('Not number'); } profile.properties = assocPath( - property.split("."), + property.split('.'), parsed - value, - profile.properties, + profile.properties ); await upsertProfile({ diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 3b53201b..cd0be00d 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1,43 +1,43 @@ -import cors from "@fastify/cors"; -import Fastify from "fastify"; +import cors from '@fastify/cors'; +import Fastify from 'fastify'; -import { redisPub } from "@openpanel/redis"; +import { redisPub } from '@openpanel/redis'; -import eventRouter from "./routes/event.router"; -import liveRouter from "./routes/live.router"; -import miscRouter from "./routes/misc.router"; -import profileRouter from "./routes/profile.router"; -import { logger, logInfo } from "./utils/logger"; +import eventRouter from './routes/event.router'; +import liveRouter from './routes/live.router'; +import miscRouter from './routes/misc.router'; +import profileRouter from './routes/profile.router'; +import { logger, logInfo } from './utils/logger'; -declare module "fastify" { +declare module 'fastify' { interface FastifyRequest { projectId: string; } } -const port = parseInt(process.env.API_PORT || "3000", 10); +const port = parseInt(process.env.API_PORT || '3000', 10); const startServer = async () => { - logInfo("Starting server"); + logInfo('Starting server'); try { const fastify = Fastify({ logger: logger, }); fastify.register(cors, { - origin: "*", + origin: '*', }); - fastify.decorateRequest("projectId", ""); - fastify.register(eventRouter, { prefix: "/event" }); - fastify.register(profileRouter, { prefix: "/profile" }); - fastify.register(liveRouter, { prefix: "/live" }); - fastify.register(miscRouter, { prefix: "/misc" }); + fastify.decorateRequest('projectId', ''); + fastify.register(eventRouter, { prefix: '/event' }); + fastify.register(profileRouter, { prefix: '/profile' }); + fastify.register(liveRouter, { prefix: '/live' }); + fastify.register(miscRouter, { prefix: '/misc' }); fastify.setErrorHandler((error, request, reply) => { fastify.log.error(error); }); - fastify.get("/", (request, reply) => { - reply.send({ name: "openpanel sdk api" }); + fastify.get('/', (request, reply) => { + reply.send({ name: 'openpanel sdk api' }); }); // fastify.get('/health-check', async (request, reply) => { // try { @@ -47,8 +47,8 @@ const startServer = async () => { // reply.status(500).send() // } // }) - if (process.env.NODE_ENV === "production") { - for (const signal of ["SIGINT", "SIGTERM"]) { + if (process.env.NODE_ENV === 'production') { + for (const signal of ['SIGINT', 'SIGTERM']) { process.on(signal, (err) => { logger.fatal(err, `uncaught exception detected ${signal}`); fastify.close().then((err) => { @@ -59,12 +59,12 @@ const startServer = async () => { } await fastify.listen({ - host: process.env.NODE_ENV === "production" ? "0.0.0.0" : "localhost", + host: process.env.NODE_ENV === 'production' ? '0.0.0.0' : 'localhost', port, }); // Notify when keys expires - redisPub.config("SET", "notify-keyspace-events", "Ex"); + redisPub.config('SET', 'notify-keyspace-events', 'Ex'); } catch (e) { console.error(e); } diff --git a/apps/api/src/routes/event.router.ts b/apps/api/src/routes/event.router.ts index fffc39be..65f34b93 100644 --- a/apps/api/src/routes/event.router.ts +++ b/apps/api/src/routes/event.router.ts @@ -1,56 +1,56 @@ -import { isBot } from "@/bots"; -import * as controller from "@/controllers/event.controller"; -import { validateSdkRequest } from "@/utils/auth"; -import type { FastifyPluginCallback, FastifyRequest } from "fastify"; +import { isBot } from '@/bots'; +import * as controller from '@/controllers/event.controller'; +import { validateSdkRequest } from '@/utils/auth'; +import type { FastifyPluginCallback, FastifyRequest } from 'fastify'; -import { createBotEvent } from "@openpanel/db"; -import type { PostEventPayload } from "@openpanel/sdk"; +import { createBotEvent } from '@openpanel/db'; +import type { PostEventPayload } from '@openpanel/sdk'; const eventRouter: FastifyPluginCallback = (fastify, opts, done) => { fastify.addHook( - "preHandler", + 'preHandler', async ( req: FastifyRequest<{ Body: PostEventPayload; }>, - reply, + reply ) => { try { const projectId = await validateSdkRequest(req.headers); req.projectId = projectId; - const bot = req.headers["user-agent"] - ? isBot(req.headers["user-agent"]) + const bot = req.headers['user-agent'] + ? isBot(req.headers['user-agent']) : null; if (bot) { const path = (req.body?.properties?.__path || req.body?.properties?.path) as string | undefined; - req.log.warn({ ...req.headers, bot }, "Bot detected (event)"); + req.log.warn({ ...req.headers, bot }, 'Bot detected (event)'); await createBotEvent({ ...bot, projectId, - path: path ?? "", + path: path ?? '', createdAt: new Date(req.body?.timestamp), }); - reply.status(202).send("OK"); + reply.status(202).send('OK'); } } catch (e) { - req.log.error(e, "Failed to create bot event"); + req.log.error(e, 'Failed to create bot event'); reply.status(401).send(); return; } - }, + } ); fastify.route({ - method: "POST", - url: "/", + method: 'POST', + url: '/', handler: controller.postEvent, }); fastify.route({ - method: "GET", - url: "/", + method: 'GET', + url: '/', handler: controller.postEvent, }); done(); diff --git a/apps/api/src/utils/parseReferrer.ts b/apps/api/src/utils/parseReferrer.ts index 0ff61a1b..97358228 100644 --- a/apps/api/src/utils/parseReferrer.ts +++ b/apps/api/src/utils/parseReferrer.ts @@ -1,41 +1,41 @@ -import { stripTrailingSlash } from "@openpanel/common"; +import { stripTrailingSlash } from '@openpanel/common'; -import referrers from "../referrers"; +import referrers from '../referrers'; function getHostname(url: string | undefined) { if (!url) { - return ""; + return ''; } try { return new URL(url).hostname; } catch (e) { - return ""; + return ''; } } export function parseReferrer(url: string | undefined) { const hostname = getHostname(url); - const match = referrers[hostname] ?? referrers[hostname.replace("www.", "")]; + const match = referrers[hostname] ?? referrers[hostname.replace('www.', '')]; return { - name: match?.name ?? "", - type: match?.type ?? "unknown", - url: stripTrailingSlash(url ?? ""), + name: match?.name ?? '', + type: match?.type ?? 'unknown', + url: stripTrailingSlash(url ?? ''), }; } export function getReferrerWithQuery( - query: Record | undefined, + query: Record | undefined ) { if (!query) { return null; } - const source = query.utm_source ?? query.ref ?? query.utm_referrer ?? ""; + const source = query.utm_source ?? query.ref ?? query.utm_referrer ?? ''; const match = Object.values(referrers).find( - (referrer) => referrer.name.toLowerCase() === source?.toLowerCase(), + (referrer) => referrer.name.toLowerCase() === source?.toLowerCase() ); if (!match) { @@ -45,6 +45,6 @@ export function getReferrerWithQuery( return { name: match.name, type: match.type, - url: "", + url: '', }; } diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 40a0519c..fdef1dbd 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -8,7 +8,7 @@ "build": "next build", "start": "next start", "lint": "eslint .", - "format": "prettier --write \"**/*.{tsx,mjs,ts,md,json}\"", + "format": "prettier --check \"**/*.{tsx,mjs,ts,md,json}\"", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env -c --" }, diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx index 13be6c69..e451c55f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx @@ -13,14 +13,15 @@ import { } from '@/components/ui/dropdown-menu'; import { useAppParams } from '@/hooks/useAppParams'; import { cn } from '@/utils/cn'; +import { ChevronRight, MoreHorizontal, PlusIcon, Trash } from 'lucide-react'; +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; + import { getDefaultIntervalByDates, getDefaultIntervalByRange, } from '@openpanel/constants'; import type { getReportsByDashboardId } from '@openpanel/db'; -import { ChevronRight, MoreHorizontal, PlusIcon, Trash } from 'lucide-react'; -import Link from 'next/link'; -import { useRouter } from 'next/navigation'; import { OverviewReportRange } from '../../overview-sticky-header'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx index 5bf0b73a..a26d773a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx @@ -1,8 +1,9 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; -import { getDashboardById, getReportsByDashboardId } from '@openpanel/db'; import { notFound } from 'next/navigation'; +import { getDashboardById, getReportsByDashboardId } from '@openpanel/db'; + import { ListReports } from './list-reports'; interface PageProps { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx index c035e02e..bce4e21b 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx @@ -7,12 +7,13 @@ import { Button } from '@/components/ui/button'; import { ToastAction } from '@/components/ui/toast'; import { useAppParams } from '@/hooks/useAppParams'; import { pushModal } from '@/modals'; -import type { IServiceDashboards } from '@openpanel/db'; import { LayoutPanelTopIcon, Pencil, PlusIcon, Trash } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; +import type { IServiceDashboards } from '@openpanel/db'; + interface ListDashboardsProps { dashboards: IServiceDashboards; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx index e3025033..398ab32f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx @@ -1,5 +1,6 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; + import { getDashboardsByProjectId } from '@openpanel/db'; import { HeaderDashboards } from './header-dashboards'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-chart.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-chart.tsx index 445b21ee..99292a96 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-chart.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-chart.tsx @@ -1,4 +1,5 @@ import { ChartSwitchShortcut } from '@/components/report/chart'; + import type { IChartEvent } from '@openpanel/validation'; interface Props { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx index b06b4892..6eb32fcc 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx @@ -13,9 +13,10 @@ import { useEventQueryFilters, useEventQueryNamesFilter, } from '@/hooks/useEventQueryFilters'; -import type { IServiceCreateEventPayload } from '@openpanel/db'; import { round } from 'mathjs'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; + interface Props { event: IServiceCreateEventPayload; open: boolean; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx index 28836790..684df1e8 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx @@ -12,10 +12,11 @@ import { SheetTitle, } from '@/components/ui/sheet'; import { cn } from '@/utils/cn'; -import type { IServiceCreateEventPayload } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; + import { EventIconColors, EventIconMapper, diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx index 186f348c..aedb3172 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx @@ -12,7 +12,6 @@ import { SheetTrigger, } from '@/components/ui/sheet'; import { cn } from '@/utils/cn'; -import type { EventMeta } from '@openpanel/db'; import type { VariantProps } from 'class-variance-authority'; import { cva } from 'class-variance-authority'; import type { LucideIcon } from 'lucide-react'; @@ -20,6 +19,8 @@ import * as Icons from 'lucide-react'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; +import type { EventMeta } from '@openpanel/db'; + const variants = cva('flex items-center justify-center shrink-0 rounded-full', { variants: { size: { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx index 272fa67e..1f295f9d 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx @@ -9,6 +9,7 @@ import { useEventQueryFilters } from '@/hooks/useEventQueryFilters'; import { useNumber } from '@/hooks/useNumerFormatter'; import { cn } from '@/utils/cn'; import { getProfileName } from '@/utils/getters'; + import type { IServiceCreateEventPayload } from '@openpanel/db'; import { EventDetails } from './event-details'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx index 2fff9d84..3e847f98 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx @@ -8,10 +8,11 @@ import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/useAppParams'; import { useCursor } from '@/hooks/useCursor'; import { useEventQueryFilters } from '@/hooks/useEventQueryFilters'; -import type { IServiceCreateEventPayload } from '@openpanel/db'; import { isSameDay } from 'date-fns'; import { GanttChartIcon } from 'lucide-react'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; + import { EventListItem } from './event-list-item'; import EventListener from './event-listener'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx index 6ea7627d..aedfb812 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx @@ -8,13 +8,14 @@ import { } from '@/components/ui/tooltip'; import { useAppParams } from '@/hooks/useAppParams'; import { cn } from '@/utils/cn'; -import type { IServiceCreateEventPayload } from '@openpanel/db'; import { useQueryClient } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import useWebSocket from 'react-use-websocket'; import { toast } from 'sonner'; +import type { IServiceCreateEventPayload } from '@openpanel/db'; + const AnimatedNumbers = dynamic(() => import('react-animated-numbers'), { ssr: false, loading: () =>
0
, diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx index 69f19d6f..2fcd2774 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx @@ -6,9 +6,10 @@ import { eventQueryNamesFilter, } from '@/hooks/useEventQueryFilters'; import { getExists } from '@/server/pageExists'; -import { getEventList, getEventsCount } from '@openpanel/db'; import { parseAsInteger } from 'nuqs'; +import { getEventList, getEventsCount } from '@openpanel/db'; + import { StickyBelowHeader } from '../layout-sticky-below-header'; import { EventChart } from './event-chart'; import { EventList } from './event-list'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx index 8ce1c010..692ff0f7 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx @@ -2,10 +2,11 @@ import { Combobox } from '@/components/ui/combobox'; import { useAppParams } from '@/hooks/useAppParams'; -import type { IServiceOrganization } from '@openpanel/db'; import { Building } from 'lucide-react'; import { useRouter } from 'next/navigation'; +import type { IServiceOrganization } from '@openpanel/db'; + interface LayoutOrganizationSelectorProps { organizations: IServiceOrganization[]; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx index 5b180cf1..aabc6029 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx @@ -2,9 +2,10 @@ import { Combobox } from '@/components/ui/combobox'; import { useAppParams } from '@/hooks/useAppParams'; -import type { getProjectsByOrganizationSlug } from '@openpanel/db'; import { usePathname, useRouter } from 'next/navigation'; +import type { getProjectsByOrganizationSlug } from '@openpanel/db'; + interface LayoutProjectSelectorProps { projects: Awaited>; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx index 71970307..bb2f402e 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx @@ -4,12 +4,13 @@ import { useEffect, useState } from 'react'; import { Logo } from '@/components/Logo'; import { buttonVariants } from '@/components/ui/button'; import { cn } from '@/utils/cn'; -import type { IServiceDashboards, IServiceOrganization } from '@openpanel/db'; import { Rotate as Hamburger } from 'hamburger-react'; import { PlusIcon } from 'lucide-react'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; +import type { IServiceDashboards, IServiceOrganization } from '@openpanel/db'; + import LayoutMenu from './layout-menu'; import LayoutOrganizationSelector from './layout-organization-selector'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx index 1bfe9b58..a84cc38d 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx @@ -12,6 +12,9 @@ import { import { getExists } from '@/server/pageExists'; import { cn } from '@/utils/cn'; import { getProfileName } from '@/utils/getters'; +import { notFound } from 'next/navigation'; +import { parseAsInteger, parseAsString } from 'nuqs'; + import type { GetEventListOptions } from '@openpanel/db'; import { getConversionEventNames, @@ -20,8 +23,6 @@ import { getProfileById, } from '@openpanel/db'; import type { IChartEvent, IChartInput } from '@openpanel/validation'; -import { notFound } from 'next/navigation'; -import { parseAsInteger, parseAsString } from 'nuqs'; import { EventList } from '../../events/event-list'; import { StickyBelowHeader } from '../../layout-sticky-below-header'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx index 55f19bba..54a24563 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx @@ -3,9 +3,10 @@ import { OverviewFiltersButtons } from '@/components/overview/filters/overview-f import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { eventQueryFiltersParser } from '@/hooks/useEventQueryFilters'; import { getExists } from '@/server/pageExists'; -import { getProfileList, getProfileListCount } from '@openpanel/db'; import { parseAsInteger } from 'nuqs'; +import { getProfileList, getProfileListCount } from '@openpanel/db'; + import { StickyBelowHeader } from '../layout-sticky-below-header'; import { ProfileList } from './profile-list'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list-item.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list-item.tsx index 028e8a04..7822e586 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list-item.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list-item.tsx @@ -6,6 +6,7 @@ import { KeyValue, KeyValueSubtle } from '@/components/ui/key-value'; import { useAppParams } from '@/hooks/useAppParams'; import { useEventQueryFilters } from '@/hooks/useEventQueryFilters'; import { getProfileName } from '@/utils/getters'; + import type { IServiceProfile } from '@openpanel/db'; type ProfileListItemProps = IServiceProfile; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list.tsx index e783ab9d..e8610a59 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list.tsx @@ -6,9 +6,10 @@ import { Pagination } from '@/components/Pagination'; import { Button } from '@/components/ui/button'; import { useCursor } from '@/hooks/useCursor'; import { useEventQueryFilters } from '@/hooks/useEventQueryFilters'; -import type { IServiceProfile } from '@openpanel/db'; import { UsersIcon } from 'lucide-react'; +import type { IServiceProfile } from '@openpanel/db'; + import { ProfileListItem } from './profile-list-item'; interface ProfileListProps { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx index 5eb5ef32..88c4ad59 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx @@ -1,9 +1,10 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; -import { getOrganizationBySlug, getReportById } from '@openpanel/db'; import { Pencil } from 'lucide-react'; import { notFound } from 'next/navigation'; +import { getOrganizationBySlug, getReportById } from '@openpanel/db'; + import ReportEditor from '../report-editor'; interface PageProps { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx index 1558745f..636f0555 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx @@ -1,9 +1,10 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; -import { getOrganizationBySlug } from '@openpanel/db'; import { Pencil } from 'lucide-react'; import { notFound } from 'next/navigation'; +import { getOrganizationBySlug } from '@openpanel/db'; + import ReportEditor from './report-editor'; interface PageProps { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx index ad308f52..b2301658 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx @@ -22,10 +22,11 @@ import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; import { useAppParams } from '@/hooks/useAppParams'; import { useDispatch, useSelector } from '@/redux'; -import type { IServiceReport } from '@openpanel/db'; import { endOfDay, startOfDay } from 'date-fns'; import { GanttChartSquareIcon } from 'lucide-react'; +import type { IServiceReport } from '@openpanel/db'; + interface ReportEditorProps { report: IServiceReport | null; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/list-clients.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/list-clients.tsx index 3dea79e4..ff1a48cb 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/list-clients.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/list-clients.tsx @@ -6,9 +6,10 @@ import { DataTable } from '@/components/DataTable'; import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/useAppParams'; import { pushModal } from '@/modals'; -import type { getClientsByOrganizationId } from '@openpanel/db'; import { PlusIcon } from 'lucide-react'; +import type { getClientsByOrganizationId } from '@openpanel/db'; + interface ListClientsProps { clients: Awaited>; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/page.tsx index 7f66f77e..694d9adf 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/clients/page.tsx @@ -1,5 +1,6 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; + import { getClientsByOrganizationId } from '@openpanel/db'; import ListClients from './list-clients'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx index 21090a8e..e2e15e65 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx @@ -4,12 +4,13 @@ import { api, handleError } from '@/app/_trpc/client'; import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { Widget, WidgetBody, WidgetHead } from '@/components/Widget'; -import type { getOrganizationBySlug } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { getOrganizationBySlug } from '@openpanel/db'; + const validator = z.object({ id: z.string().min(2), name: z.string().min(2), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invite-user.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invite-user.tsx index 4c058e0e..5d4eebc6 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invite-user.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invite-user.tsx @@ -3,13 +3,14 @@ import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/useAppParams'; import { zodResolver } from '@hookform/resolvers/zod'; -import { zInviteUser } from '@openpanel/validation'; import { SendIcon } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; +import { zInviteUser } from '@openpanel/validation'; + type IForm = z.infer; export function InviteUser() { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invited-users.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invited-users.tsx index 38835d4e..2b8d34d4 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invited-users.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invited-users.tsx @@ -9,6 +9,7 @@ import { TableRow, } from '@/components/ui/table'; import { Widget, WidgetBody, WidgetHead } from '@/components/Widget'; + import type { IServiceInvites } from '@openpanel/db'; import { InviteUser } from './invite-user'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx index cbc8edbe..30652cf3 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx @@ -1,8 +1,9 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { clerkClient } from '@clerk/nextjs'; -import { getInvites, getOrganizationBySlug } from '@openpanel/db'; import { notFound } from 'next/navigation'; +import { getInvites, getOrganizationBySlug } from '@openpanel/db'; + import EditOrganization from './edit-organization'; import InvitedUsers from './invited-users'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx index 6adeea31..937e11a2 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx @@ -5,12 +5,13 @@ import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { Widget, WidgetBody, WidgetHead } from '@/components/Widget'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { getUserById } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { getUserById } from '@openpanel/db'; + const validator = z.object({ firstName: z.string().min(2), lastName: z.string().min(2), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx index 1fb4d25d..1c7a02f2 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx @@ -1,6 +1,7 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; import { auth } from '@clerk/nextjs'; + import { getUserById } from '@openpanel/db'; import EditProfile from './edit-profile'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx index deb3a173..231cedd8 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx @@ -6,9 +6,10 @@ import { columns } from '@/components/projects/table'; import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/useAppParams'; import { pushModal } from '@/modals'; -import type { getProjectsByOrganizationSlug } from '@openpanel/db'; import { PlusIcon } from 'lucide-react'; +import type { getProjectsByOrganizationSlug } from '@openpanel/db'; + interface ListProjectsProps { projects: Awaited>; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx index b6976bb4..700431ab 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx @@ -1,5 +1,6 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; + import { getProjectsByOrganizationSlug } from '@openpanel/db'; import ListProjects from './list-projects'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx index d4270a29..9304a7e1 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx @@ -5,9 +5,10 @@ import { DataTable } from '@/components/DataTable'; import { columns } from '@/components/references/table'; import { Button } from '@/components/ui/button'; import { pushModal } from '@/modals'; -import type { IServiceReference } from '@openpanel/db'; import { PlusIcon } from 'lucide-react'; +import type { IServiceReference } from '@openpanel/db'; + interface ListProjectsProps { data: IServiceReference[]; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx index ca5e8c01..8a082f16 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx @@ -1,5 +1,6 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { getExists } from '@/server/pageExists'; + import { getReferences } from '@openpanel/db'; import ListReferences from './list-references'; diff --git a/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx b/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx index c875dc85..5c19d9cf 100644 --- a/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx +++ b/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx @@ -11,9 +11,10 @@ import OverviewTopEvents from '@/components/overview/overview-top-events'; import OverviewTopGeo from '@/components/overview/overview-top-geo'; import OverviewTopPages from '@/components/overview/overview-top-pages'; import OverviewTopSources from '@/components/overview/overview-top-sources'; -import { getOrganizationBySlug, getShareOverviewById } from '@openpanel/db'; import { notFound } from 'next/navigation'; +import { getOrganizationBySlug, getShareOverviewById } from '@openpanel/db'; + interface PageProps { params: { id: string; diff --git a/apps/dashboard/src/components/clients/ClientActions.tsx b/apps/dashboard/src/components/clients/ClientActions.tsx index 20c1f38e..cf163685 100644 --- a/apps/dashboard/src/components/clients/ClientActions.tsx +++ b/apps/dashboard/src/components/clients/ClientActions.tsx @@ -3,11 +3,12 @@ import { api } from '@/app/_trpc/client'; import { pushModal, showConfirm } from '@/modals'; import { clipboard } from '@/utils/clipboard'; -import type { IServiceClientWithProject } from '@openpanel/db'; import { MoreHorizontal } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; +import type { IServiceClientWithProject } from '@openpanel/db'; + import { Button } from '../ui/button'; import { DropdownMenu, diff --git a/apps/dashboard/src/components/clients/table.tsx b/apps/dashboard/src/components/clients/table.tsx index 86d2ffce..797c704f 100644 --- a/apps/dashboard/src/components/clients/table.tsx +++ b/apps/dashboard/src/components/clients/table.tsx @@ -1,7 +1,8 @@ import { formatDate } from '@/utils/date'; -import type { IServiceClientWithProject } from '@openpanel/db'; import type { ColumnDef } from '@tanstack/react-table'; +import type { IServiceClientWithProject } from '@openpanel/db'; + import { ClientActions } from './ClientActions'; export const columns: ColumnDef[] = [ diff --git a/apps/dashboard/src/components/overview/filters/overview-filters-drawer-content.tsx b/apps/dashboard/src/components/overview/filters/overview-filters-drawer-content.tsx index 9f2a8c80..80756190 100644 --- a/apps/dashboard/src/components/overview/filters/overview-filters-drawer-content.tsx +++ b/apps/dashboard/src/components/overview/filters/overview-filters-drawer-content.tsx @@ -11,13 +11,14 @@ import { import { useEventValues } from '@/hooks/useEventValues'; import { useProfileProperties } from '@/hooks/useProfileProperties'; import { useProfileValues } from '@/hooks/useProfileValues'; +import { XIcon } from 'lucide-react'; +import type { Options as NuqsOptions } from 'nuqs'; + import type { IChartEventFilter, IChartEventFilterOperator, IChartEventFilterValue, } from '@openpanel/validation'; -import { XIcon } from 'lucide-react'; -import type { Options as NuqsOptions } from 'nuqs'; export interface OverviewFiltersDrawerContentProps { projectId: string; diff --git a/apps/dashboard/src/components/overview/overview-live-histogram.tsx b/apps/dashboard/src/components/overview/overview-live-histogram.tsx index a436aac8..1db04697 100644 --- a/apps/dashboard/src/components/overview/overview-live-histogram.tsx +++ b/apps/dashboard/src/components/overview/overview-live-histogram.tsx @@ -3,10 +3,11 @@ import { Fragment } from 'react'; import { api } from '@/app/_trpc/client'; import { cn } from '@/utils/cn'; -import type { IChartInput } from '@openpanel/validation'; import { ChevronsUpDownIcon } from 'lucide-react'; import AnimateHeight from 'react-animate-height'; +import type { IChartInput } from '@openpanel/validation'; + import { redisSub } from '../../../../../packages/redis'; import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'; import { useOverviewOptions } from './useOverviewOptions'; diff --git a/apps/dashboard/src/components/overview/overview-metrics.tsx b/apps/dashboard/src/components/overview/overview-metrics.tsx index a1b7b5b5..241bfc8a 100644 --- a/apps/dashboard/src/components/overview/overview-metrics.tsx +++ b/apps/dashboard/src/components/overview/overview-metrics.tsx @@ -6,6 +6,7 @@ import { ChartSwitch } from '@/components/report/chart'; import { Widget, WidgetBody } from '@/components/Widget'; import { useEventQueryFilters } from '@/hooks/useEventQueryFilters'; import { cn } from '@/utils/cn'; + import type { IChartInput } from '@openpanel/validation'; interface OverviewMetricsProps { diff --git a/apps/dashboard/src/components/overview/overview-share.tsx b/apps/dashboard/src/components/overview/overview-share.tsx index 5d07e022..1635c594 100644 --- a/apps/dashboard/src/components/overview/overview-share.tsx +++ b/apps/dashboard/src/components/overview/overview-share.tsx @@ -2,11 +2,12 @@ import { api } from '@/app/_trpc/client'; import { pushModal } from '@/modals'; -import type { ShareOverview } from '@openpanel/db'; import { EyeIcon, Globe2Icon, LockIcon } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; +import type { ShareOverview } from '@openpanel/db'; + import { Button } from '../ui/button'; import { DropdownMenu, diff --git a/apps/dashboard/src/components/overview/useOverviewOptions.ts b/apps/dashboard/src/components/overview/useOverviewOptions.ts index 7a4000ad..613e96b5 100644 --- a/apps/dashboard/src/components/overview/useOverviewOptions.ts +++ b/apps/dashboard/src/components/overview/useOverviewOptions.ts @@ -1,9 +1,3 @@ -import { - getDefaultIntervalByDates, - getDefaultIntervalByRange, - timeRanges, -} from '@openpanel/constants'; -import { mapKeys } from '@openpanel/validation'; import { parseAsBoolean, parseAsInteger, @@ -12,6 +6,13 @@ import { useQueryState, } from 'nuqs'; +import { + getDefaultIntervalByDates, + getDefaultIntervalByRange, + timeRanges, +} from '@openpanel/constants'; +import { mapKeys } from '@openpanel/validation'; + const nuqsOptions = { history: 'push' } as const; export function useOverviewOptions() { diff --git a/apps/dashboard/src/components/overview/useOverviewWidget.tsx b/apps/dashboard/src/components/overview/useOverviewWidget.tsx index 2eefa355..7a2e3da5 100644 --- a/apps/dashboard/src/components/overview/useOverviewWidget.tsx +++ b/apps/dashboard/src/components/overview/useOverviewWidget.tsx @@ -1,6 +1,7 @@ +import { parseAsStringEnum, useQueryState } from 'nuqs'; + import { mapKeys } from '@openpanel/validation'; import type { IChartInput } from '@openpanel/validation'; -import { parseAsStringEnum, useQueryState } from 'nuqs'; export function useOverviewWidget( key: string, diff --git a/apps/dashboard/src/components/profiles/ProfileAvatar.tsx b/apps/dashboard/src/components/profiles/ProfileAvatar.tsx index e40417f5..ff4d539e 100644 --- a/apps/dashboard/src/components/profiles/ProfileAvatar.tsx +++ b/apps/dashboard/src/components/profiles/ProfileAvatar.tsx @@ -1,11 +1,12 @@ 'use client'; import { cn } from '@/utils/cn'; -import type { IServiceProfile } from '@openpanel/db'; import { AvatarImage } from '@radix-ui/react-avatar'; import type { VariantProps } from 'class-variance-authority'; import { cva } from 'class-variance-authority'; +import type { IServiceProfile } from '@openpanel/db'; + import { Avatar, AvatarFallback } from '../ui/avatar'; interface ProfileAvatarProps diff --git a/apps/dashboard/src/components/projects/ProjectActions.tsx b/apps/dashboard/src/components/projects/ProjectActions.tsx index 6b58e124..510ad8a1 100644 --- a/apps/dashboard/src/components/projects/ProjectActions.tsx +++ b/apps/dashboard/src/components/projects/ProjectActions.tsx @@ -3,11 +3,12 @@ import { api } from '@/app/_trpc/client'; import { pushModal, showConfirm } from '@/modals'; import { clipboard } from '@/utils/clipboard'; -import type { IServiceProject } from '@openpanel/db'; import { MoreHorizontal } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; +import type { IServiceProject } from '@openpanel/db'; + import { Button } from '../ui/button'; import { DropdownMenu, diff --git a/apps/dashboard/src/components/projects/table.tsx b/apps/dashboard/src/components/projects/table.tsx index df97965f..0fe220d0 100644 --- a/apps/dashboard/src/components/projects/table.tsx +++ b/apps/dashboard/src/components/projects/table.tsx @@ -1,7 +1,8 @@ import { formatDate } from '@/utils/date'; +import type { ColumnDef } from '@tanstack/react-table'; + import { IServiceProject } from '@openpanel/db'; import type { Project as IProject } from '@openpanel/db'; -import type { ColumnDef } from '@tanstack/react-table'; import { ProjectActions } from './ProjectActions'; diff --git a/apps/dashboard/src/components/references/table.tsx b/apps/dashboard/src/components/references/table.tsx index 6fd734ea..175617d9 100644 --- a/apps/dashboard/src/components/references/table.tsx +++ b/apps/dashboard/src/components/references/table.tsx @@ -1,7 +1,8 @@ import { formatDate, formatDateTime } from '@/utils/date'; -import type { IServiceReference } from '@openpanel/db'; import type { ColumnDef } from '@tanstack/react-table'; +import type { IServiceReference } from '@openpanel/db'; + export const columns: ColumnDef[] = [ { accessorKey: 'title', diff --git a/apps/dashboard/src/components/report/ReportChartType.tsx b/apps/dashboard/src/components/report/ReportChartType.tsx index 58f1243d..ad7e48cc 100644 --- a/apps/dashboard/src/components/report/ReportChartType.tsx +++ b/apps/dashboard/src/components/report/ReportChartType.tsx @@ -1,7 +1,8 @@ import { useDispatch, useSelector } from '@/redux'; +import { LineChartIcon } from 'lucide-react'; + import { chartTypes } from '@openpanel/constants'; import { objectToZodEnums } from '@openpanel/validation'; -import { LineChartIcon } from 'lucide-react'; import { Combobox } from '../ui/combobox'; import { changeChartType } from './reportSlice'; diff --git a/apps/dashboard/src/components/report/ReportInterval.tsx b/apps/dashboard/src/components/report/ReportInterval.tsx index 9cc6e141..087ede36 100644 --- a/apps/dashboard/src/components/report/ReportInterval.tsx +++ b/apps/dashboard/src/components/report/ReportInterval.tsx @@ -1,10 +1,11 @@ import { useDispatch, useSelector } from '@/redux'; +import { ClockIcon } from 'lucide-react'; + import { isHourIntervalEnabledByRange, isMinuteIntervalEnabledByRange, } from '@openpanel/constants'; import type { IInterval } from '@openpanel/validation'; -import { ClockIcon } from 'lucide-react'; import { Combobox } from '../ui/combobox'; import { changeInterval } from './reportSlice'; diff --git a/apps/dashboard/src/components/report/ReportLineType.tsx b/apps/dashboard/src/components/report/ReportLineType.tsx index cada47fa..2e2e29b2 100644 --- a/apps/dashboard/src/components/report/ReportLineType.tsx +++ b/apps/dashboard/src/components/report/ReportLineType.tsx @@ -1,7 +1,8 @@ import { useDispatch, useSelector } from '@/redux'; +import { Tv2Icon } from 'lucide-react'; + import { lineTypes } from '@openpanel/constants'; import { objectToZodEnums } from '@openpanel/validation'; -import { Tv2Icon } from 'lucide-react'; import { Combobox } from '../ui/combobox'; import { changeLineType } from './reportSlice'; diff --git a/apps/dashboard/src/components/report/ReportRange.tsx b/apps/dashboard/src/components/report/ReportRange.tsx index d71f81c7..5c052c2e 100644 --- a/apps/dashboard/src/components/report/ReportRange.tsx +++ b/apps/dashboard/src/components/report/ReportRange.tsx @@ -9,12 +9,13 @@ import { import { useBreakpoint } from '@/hooks/useBreakpoint'; import { useDispatch, useSelector } from '@/redux'; import { cn } from '@/utils/cn'; -import { timeRanges } from '@openpanel/constants'; -import type { IChartRange } from '@openpanel/validation'; import { endOfDay, format, startOfDay } from 'date-fns'; import { CalendarIcon, ChevronsUpDownIcon } from 'lucide-react'; import type { SelectRangeEventHandler } from 'react-day-picker'; +import { timeRanges } from '@openpanel/constants'; +import type { IChartRange } from '@openpanel/validation'; + import type { ExtendedComboboxProps } from '../ui/combobox'; import { ToggleGroup, ToggleGroupItem } from '../ui/toggle-group'; import { changeDates, changeEndDate, changeStartDate } from './reportSlice'; diff --git a/apps/dashboard/src/components/report/chart/Chart.tsx b/apps/dashboard/src/components/report/chart/Chart.tsx index 4b935fb3..3fc7d554 100644 --- a/apps/dashboard/src/components/report/chart/Chart.tsx +++ b/apps/dashboard/src/components/report/chart/Chart.tsx @@ -1,6 +1,7 @@ 'use client'; import { api } from '@/app/_trpc/client'; + import type { IChartInput } from '@openpanel/validation'; import { ChartEmpty } from './ChartEmpty'; diff --git a/apps/dashboard/src/components/report/chart/ChartProvider.tsx b/apps/dashboard/src/components/report/chart/ChartProvider.tsx index d4554e77..6cbd98b1 100644 --- a/apps/dashboard/src/components/report/chart/ChartProvider.tsx +++ b/apps/dashboard/src/components/report/chart/ChartProvider.tsx @@ -10,6 +10,7 @@ import { useState, } from 'react'; import type { IChartSerie } from '@/server/api/routers/chart'; + import type { IChartInput } from '@openpanel/validation'; import { ChartLoading } from './ChartLoading'; diff --git a/apps/dashboard/src/components/report/chart/MetricCard.tsx b/apps/dashboard/src/components/report/chart/MetricCard.tsx index e924aa67..04bfafe0 100644 --- a/apps/dashboard/src/components/report/chart/MetricCard.tsx +++ b/apps/dashboard/src/components/report/chart/MetricCard.tsx @@ -4,10 +4,11 @@ import type { IChartData } from '@/app/_trpc/client'; import { ColorSquare } from '@/components/ColorSquare'; import { fancyMinutes, useNumber } from '@/hooks/useNumerFormatter'; import { theme } from '@/utils/theme'; -import type { IChartMetric } from '@openpanel/validation'; import AutoSizer from 'react-virtualized-auto-sizer'; import { Area, AreaChart } from 'recharts'; +import type { IChartMetric } from '@openpanel/validation'; + import { getDiffIndicator, PreviousDiffIndicatorText, diff --git a/apps/dashboard/src/components/report/chart/ReportAreaChart.tsx b/apps/dashboard/src/components/report/chart/ReportAreaChart.tsx index f3f4bf23..1f1e54ec 100644 --- a/apps/dashboard/src/components/report/chart/ReportAreaChart.tsx +++ b/apps/dashboard/src/components/report/chart/ReportAreaChart.tsx @@ -5,7 +5,6 @@ import { useNumber } from '@/hooks/useNumerFormatter'; import { useRechartDataModel } from '@/hooks/useRechartDataModel'; import { useVisibleSeries } from '@/hooks/useVisibleSeries'; import { getChartColor } from '@/utils/theme'; -import type { IChartLineType, IInterval } from '@openpanel/validation'; import { Area, AreaChart, @@ -15,6 +14,8 @@ import { YAxis, } from 'recharts'; +import type { IChartLineType, IInterval } from '@openpanel/validation'; + import { getYAxisWidth } from './chart-utils'; import { useChartContext } from './ChartProvider'; import { ReportChartTooltip } from './ReportChartTooltip'; diff --git a/apps/dashboard/src/components/report/chart/ReportBarChart.tsx b/apps/dashboard/src/components/report/chart/ReportBarChart.tsx index 0187a337..6b8846cb 100644 --- a/apps/dashboard/src/components/report/chart/ReportBarChart.tsx +++ b/apps/dashboard/src/components/report/chart/ReportBarChart.tsx @@ -6,6 +6,7 @@ import { Progress } from '@/components/ui/progress'; import { useNumber } from '@/hooks/useNumerFormatter'; import { cn } from '@/utils/cn'; import { getChartColor } from '@/utils/theme'; + import { NOT_SET_VALUE } from '@openpanel/constants'; import { PreviousDiffIndicatorText } from '../PreviousDiffIndicator'; diff --git a/apps/dashboard/src/components/report/chart/ReportHistogramChart.tsx b/apps/dashboard/src/components/report/chart/ReportHistogramChart.tsx index f8eddaec..6a63526d 100644 --- a/apps/dashboard/src/components/report/chart/ReportHistogramChart.tsx +++ b/apps/dashboard/src/components/report/chart/ReportHistogramChart.tsx @@ -5,9 +5,10 @@ import { useNumber } from '@/hooks/useNumerFormatter'; import { useRechartDataModel } from '@/hooks/useRechartDataModel'; import { useVisibleSeries } from '@/hooks/useVisibleSeries'; import { getChartColor, theme } from '@/utils/theme'; -import type { IInterval } from '@openpanel/validation'; import { Bar, BarChart, CartesianGrid, Tooltip, XAxis, YAxis } from 'recharts'; +import type { IInterval } from '@openpanel/validation'; + import { getYAxisWidth } from './chart-utils'; import { useChartContext } from './ChartProvider'; import { ReportChartTooltip } from './ReportChartTooltip'; diff --git a/apps/dashboard/src/components/report/chart/ReportLineChart.tsx b/apps/dashboard/src/components/report/chart/ReportLineChart.tsx index 581945a0..ce2d0665 100644 --- a/apps/dashboard/src/components/report/chart/ReportLineChart.tsx +++ b/apps/dashboard/src/components/report/chart/ReportLineChart.tsx @@ -7,8 +7,6 @@ import { useNumber } from '@/hooks/useNumerFormatter'; import { useRechartDataModel } from '@/hooks/useRechartDataModel'; import { useVisibleSeries } from '@/hooks/useVisibleSeries'; import { getChartColor } from '@/utils/theme'; -import type { IServiceReference } from '@openpanel/db'; -import type { IChartLineType, IInterval } from '@openpanel/validation'; import { CartesianGrid, Line, @@ -19,6 +17,9 @@ import { YAxis, } from 'recharts'; +import type { IServiceReference } from '@openpanel/db'; +import type { IChartLineType, IInterval } from '@openpanel/validation'; + import { getYAxisWidth } from './chart-utils'; import { useChartContext } from './ChartProvider'; import { ReportChartTooltip } from './ReportChartTooltip'; diff --git a/apps/dashboard/src/components/report/chart/SerieIcon.tsx b/apps/dashboard/src/components/report/chart/SerieIcon.tsx index 26049ae0..11edb716 100644 --- a/apps/dashboard/src/components/report/chart/SerieIcon.tsx +++ b/apps/dashboard/src/components/report/chart/SerieIcon.tsx @@ -1,5 +1,4 @@ import { useMemo } from 'react'; -import { NOT_SET_VALUE } from '@openpanel/constants'; import type { LucideIcon, LucideProps } from 'lucide-react'; import { ActivityIcon, @@ -15,6 +14,8 @@ import { TabletIcon, } from 'lucide-react'; +import { NOT_SET_VALUE } from '@openpanel/constants'; + interface SerieIconProps extends LucideProps { name: string; } diff --git a/apps/dashboard/src/components/report/funnel/index.tsx b/apps/dashboard/src/components/report/funnel/index.tsx index f0ab77a1..3ce8342c 100644 --- a/apps/dashboard/src/components/report/funnel/index.tsx +++ b/apps/dashboard/src/components/report/funnel/index.tsx @@ -2,6 +2,7 @@ import type { RouterOutputs } from '@/app/_trpc/client'; import { api } from '@/app/_trpc/client'; + import type { IChartInput } from '@openpanel/validation'; import { ChartEmpty } from '../chart/ChartEmpty'; diff --git a/apps/dashboard/src/components/report/reportSlice.ts b/apps/dashboard/src/components/report/reportSlice.ts index b31f228c..addef9f8 100644 --- a/apps/dashboard/src/components/report/reportSlice.ts +++ b/apps/dashboard/src/components/report/reportSlice.ts @@ -1,4 +1,8 @@ import { start } from 'repl'; +import { createSlice } from '@reduxjs/toolkit'; +import type { PayloadAction } from '@reduxjs/toolkit'; +import { isSameDay, isSameMonth } from 'date-fns'; + import { alphabetIds, getDefaultIntervalByDates, @@ -15,9 +19,6 @@ import type { IChartType, IInterval, } from '@openpanel/validation'; -import { createSlice } from '@reduxjs/toolkit'; -import type { PayloadAction } from '@reduxjs/toolkit'; -import { isSameDay, isSameMonth } from 'date-fns'; type InitialState = IChartInput & { dirty: boolean; diff --git a/apps/dashboard/src/components/report/sidebar/EventPropertiesCombobox.tsx b/apps/dashboard/src/components/report/sidebar/EventPropertiesCombobox.tsx index 6e18e8bf..a46989aa 100644 --- a/apps/dashboard/src/components/report/sidebar/EventPropertiesCombobox.tsx +++ b/apps/dashboard/src/components/report/sidebar/EventPropertiesCombobox.tsx @@ -3,9 +3,10 @@ import { Combobox } from '@/components/ui/combobox'; import { useAppParams } from '@/hooks/useAppParams'; import { useDispatch } from '@/redux'; import { cn } from '@/utils/cn'; -import type { IChartEvent } from '@openpanel/validation'; import { DatabaseIcon } from 'lucide-react'; +import type { IChartEvent } from '@openpanel/validation'; + import { changeEvent } from '../reportSlice'; interface EventPropertiesComboboxProps { diff --git a/apps/dashboard/src/components/report/sidebar/ReportBreakdowns.tsx b/apps/dashboard/src/components/report/sidebar/ReportBreakdowns.tsx index 0f8b422a..bd23be75 100644 --- a/apps/dashboard/src/components/report/sidebar/ReportBreakdowns.tsx +++ b/apps/dashboard/src/components/report/sidebar/ReportBreakdowns.tsx @@ -5,9 +5,10 @@ import { ColorSquare } from '@/components/ColorSquare'; import { Combobox } from '@/components/ui/combobox'; import { useAppParams } from '@/hooks/useAppParams'; import { useDispatch, useSelector } from '@/redux'; -import type { IChartBreakdown } from '@openpanel/validation'; import { SplitIcon } from 'lucide-react'; +import type { IChartBreakdown } from '@openpanel/validation'; + import { addBreakdown, changeBreakdown, removeBreakdown } from '../reportSlice'; import { ReportBreakdownMore } from './ReportBreakdownMore'; import type { ReportEventMoreProps } from './ReportEventMore'; diff --git a/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx b/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx index 24b6fc52..db2f93f2 100644 --- a/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx +++ b/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx @@ -9,9 +9,10 @@ import { useAppParams } from '@/hooks/useAppParams'; import { useDebounceFn } from '@/hooks/useDebounceFn'; import { useEventNames } from '@/hooks/useEventNames'; import { useDispatch, useSelector } from '@/redux'; -import type { IChartEvent } from '@openpanel/validation'; import { GanttChart, GanttChartIcon, Users } from 'lucide-react'; +import type { IChartEvent } from '@openpanel/validation'; + import { addEvent, changeEvent, diff --git a/apps/dashboard/src/components/report/sidebar/filters/FilterItem.tsx b/apps/dashboard/src/components/report/sidebar/filters/FilterItem.tsx index a5294c4e..b41f9ca9 100644 --- a/apps/dashboard/src/components/report/sidebar/filters/FilterItem.tsx +++ b/apps/dashboard/src/components/report/sidebar/filters/FilterItem.tsx @@ -7,6 +7,8 @@ import { RenderDots } from '@/components/ui/RenderDots'; import { useAppParams } from '@/hooks/useAppParams'; import { useMappings } from '@/hooks/useMappings'; import { useDispatch } from '@/redux'; +import { SlidersHorizontal, Trash } from 'lucide-react'; + import { operators } from '@openpanel/constants'; import type { IChartEvent, @@ -14,7 +16,6 @@ import type { IChartEventFilterValue, } from '@openpanel/validation'; import { mapKeys } from '@openpanel/validation'; -import { SlidersHorizontal, Trash } from 'lucide-react'; import { changeEvent } from '../../reportSlice'; diff --git a/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx b/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx index d29c381a..cb1c0341 100644 --- a/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx +++ b/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx @@ -2,9 +2,10 @@ import { api } from '@/app/_trpc/client'; import { Combobox } from '@/components/ui/combobox'; import { useAppParams } from '@/hooks/useAppParams'; import { useDispatch } from '@/redux'; -import type { IChartEvent } from '@openpanel/validation'; import { FilterIcon } from 'lucide-react'; +import type { IChartEvent } from '@openpanel/validation'; + import { changeEvent } from '../../reportSlice'; interface FiltersComboboxProps { diff --git a/apps/dashboard/src/components/ui/accordion.tsx b/apps/dashboard/src/components/ui/accordion.tsx index 71398b45..4f43db91 100644 --- a/apps/dashboard/src/components/ui/accordion.tsx +++ b/apps/dashboard/src/components/ui/accordion.tsx @@ -1,10 +1,9 @@ -import * as React from "react" -import * as AccordionPrimitive from "@radix-ui/react-accordion" -import { ChevronDown } from "lucide-react" +import * as React from 'react'; +import { cn } from '@/utils/cn'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; +import { ChevronDown } from 'lucide-react'; -import { cn } from "@/utils/cn" - -const Accordion = AccordionPrimitive.Root +const Accordion = AccordionPrimitive.Root; const AccordionItem = React.forwardRef< React.ElementRef, @@ -12,11 +11,11 @@ const AccordionItem = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -AccordionItem.displayName = "AccordionItem" +)); +AccordionItem.displayName = 'AccordionItem'; const AccordionTrigger = React.forwardRef< React.ElementRef, @@ -26,7 +25,7 @@ const AccordionTrigger = React.forwardRef< svg]:rotate-180", + 'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', className )} {...props} @@ -35,8 +34,8 @@ const AccordionTrigger = React.forwardRef< -)) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; const AccordionContent = React.forwardRef< React.ElementRef, @@ -47,10 +46,10 @@ const AccordionContent = React.forwardRef< className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" {...props} > -
{children}
+
{children}
-)) +)); -AccordionContent.displayName = AccordionPrimitive.Content.displayName +AccordionContent.displayName = AccordionPrimitive.Content.displayName; -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/apps/dashboard/src/components/ui/calendar.tsx b/apps/dashboard/src/components/ui/calendar.tsx index 9fd16ef5..da706261 100644 --- a/apps/dashboard/src/components/ui/calendar.tsx +++ b/apps/dashboard/src/components/ui/calendar.tsx @@ -1,11 +1,10 @@ -import * as React from "react" -import { ChevronLeft, ChevronRight } from "lucide-react" -import { DayPicker } from "react-day-picker" +import * as React from 'react'; +import { buttonVariants } from '@/components/ui/button'; +import { cn } from '@/utils/cn'; +import { ChevronLeft, ChevronRight } from 'lucide-react'; +import { DayPicker } from 'react-day-picker'; -import { cn } from "@/utils/cn" -import { buttonVariants } from "@/components/ui/button" - -export type CalendarProps = React.ComponentProps +export type CalendarProps = React.ComponentProps; function Calendar({ className, @@ -16,39 +15,39 @@ function Calendar({ return ( - ) + ); } -Calendar.displayName = "Calendar" +Calendar.displayName = 'Calendar'; -export { Calendar } +export { Calendar }; diff --git a/apps/dashboard/src/components/ui/tabs.tsx b/apps/dashboard/src/components/ui/tabs.tsx index 003982ce..48914cb7 100644 --- a/apps/dashboard/src/components/ui/tabs.tsx +++ b/apps/dashboard/src/components/ui/tabs.tsx @@ -1,9 +1,8 @@ -import * as React from "react" -import * as TabsPrimitive from "@radix-ui/react-tabs" +import * as React from 'react'; +import { cn } from '@/utils/cn'; +import * as TabsPrimitive from '@radix-ui/react-tabs'; -import { cn } from "@/utils/cn" - -const Tabs = TabsPrimitive.Root +const Tabs = TabsPrimitive.Root; const TabsList = React.forwardRef< React.ElementRef, @@ -12,13 +11,13 @@ const TabsList = React.forwardRef< -)) -TabsList.displayName = TabsPrimitive.List.displayName +)); +TabsList.displayName = TabsPrimitive.List.displayName; const TabsTrigger = React.forwardRef< React.ElementRef, @@ -27,13 +26,13 @@ const TabsTrigger = React.forwardRef< -)) -TabsTrigger.displayName = TabsPrimitive.Trigger.displayName +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; const TabsContent = React.forwardRef< React.ElementRef, @@ -42,12 +41,12 @@ const TabsContent = React.forwardRef< -)) -TabsContent.displayName = TabsPrimitive.Content.displayName +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; -export { Tabs, TabsList, TabsTrigger, TabsContent } +export { Tabs, TabsList, TabsTrigger, TabsContent }; diff --git a/apps/dashboard/src/components/ui/toggle-group.tsx b/apps/dashboard/src/components/ui/toggle-group.tsx index 87cb456b..a2981b22 100644 --- a/apps/dashboard/src/components/ui/toggle-group.tsx +++ b/apps/dashboard/src/components/ui/toggle-group.tsx @@ -1,16 +1,15 @@ -import * as React from "react" -import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group" -import { VariantProps } from "class-variance-authority" - -import { cn } from "@/utils/cn" -import { toggleVariants } from "@/components/ui/toggle" +import * as React from 'react'; +import { toggleVariants } from '@/components/ui/toggle'; +import { cn } from '@/utils/cn'; +import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'; +import { VariantProps } from 'class-variance-authority'; const ToggleGroupContext = React.createContext< VariantProps >({ - size: "default", - variant: "default", -}) + size: 'default', + variant: 'default', +}); const ToggleGroup = React.forwardRef< React.ElementRef, @@ -19,23 +18,23 @@ const ToggleGroup = React.forwardRef< >(({ className, variant, size, children, ...props }, ref) => ( {children} -)) +)); -ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName +ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName; const ToggleGroupItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & VariantProps >(({ className, children, variant, size, ...props }, ref) => { - const context = React.useContext(ToggleGroupContext) + const context = React.useContext(ToggleGroupContext); return ( {children} - ) -}) + ); +}); -ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName +ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName; -export { ToggleGroup, ToggleGroupItem } +export { ToggleGroup, ToggleGroupItem }; diff --git a/apps/dashboard/src/components/ui/toggle.tsx b/apps/dashboard/src/components/ui/toggle.tsx index 0569a7bc..45151920 100644 --- a/apps/dashboard/src/components/ui/toggle.tsx +++ b/apps/dashboard/src/components/ui/toggle.tsx @@ -1,30 +1,29 @@ -import * as React from "react" -import * as TogglePrimitive from "@radix-ui/react-toggle" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/utils/cn" +import * as React from 'react'; +import { cn } from '@/utils/cn'; +import * as TogglePrimitive from '@radix-ui/react-toggle'; +import { cva, type VariantProps } from 'class-variance-authority'; const toggleVariants = cva( - "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground", + 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground', { variants: { variant: { - default: "bg-transparent", + default: 'bg-transparent', outline: - "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground", + 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground', }, size: { - default: "h-10 px-3", - sm: "h-9 px-2.5", - lg: "h-11 px-5", + default: 'h-10 px-3', + sm: 'h-9 px-2.5', + lg: 'h-11 px-5', }, }, defaultVariants: { - variant: "default", - size: "default", + variant: 'default', + size: 'default', }, } -) +); const Toggle = React.forwardRef< React.ElementRef, @@ -36,8 +35,8 @@ const Toggle = React.forwardRef< className={cn(toggleVariants({ variant, size, className }))} {...props} /> -)) +)); -Toggle.displayName = TogglePrimitive.Root.displayName +Toggle.displayName = TogglePrimitive.Root.displayName; -export { Toggle, toggleVariants } +export { Toggle, toggleVariants }; diff --git a/apps/dashboard/src/hooks/useDebounceFn.ts b/apps/dashboard/src/hooks/useDebounceFn.ts index dfbc92f2..ccd82d79 100644 --- a/apps/dashboard/src/hooks/useDebounceFn.ts +++ b/apps/dashboard/src/hooks/useDebounceFn.ts @@ -4,7 +4,7 @@ import debounce from 'lodash.debounce'; export function useDebounceFn(fn: T, ms = 500): T { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call const debouncedFn = debounce(fn as any, ms); - + useEffect(() => { return () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-call @@ -12,5 +12,5 @@ export function useDebounceFn(fn: T, ms = 500): T { }; }); - return debouncedFn as T + return debouncedFn as T; } diff --git a/apps/dashboard/src/lottie/airplane.json b/apps/dashboard/src/lottie/airplane.json index 925ed2f2..9b368a17 100644 --- a/apps/dashboard/src/lottie/airplane.json +++ b/apps/dashboard/src/lottie/airplane.json @@ -1 +1,714 @@ -{"v":"5.5.8","fr":50,"ip":0,"op":147,"w":800,"h":600,"nm":"Paperplane","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"planete Outlines - Group 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[50]},{"t":120,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[468.336,323.378,0],"to":[-29,0,0],"ti":[29,0,0]},{"t":102,"s":[294.336,323.378,0]}],"ix":2},"a":{"a":0,"k":[453.672,304.756,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.742,0],[0.741,-0.14],[0,0.074],[13.484,0],[1.669,-0.361],[19.79,0],[3.317,-19.082],[2.691,0],[0,-13.484],[-0.048,-0.629],[2.405,0],[0,-6.742],[-6.742,0],[0,0],[0,6.743]],"o":[[-0.781,0],[0.001,-0.074],[0,-13.484],[-1.778,0],[-3.594,-18.742],[-20.03,0],[-2.421,-0.804],[-13.485,0],[0,0.642],[-1.89,-1.199],[-6.742,0],[0,6.743],[0,0],[6.742,0],[0,-6.742]],"v":[[75.134,16.175],[72.85,16.396],[72.856,16.175],[48.44,-8.241],[43.262,-7.685],[3.406,-40.591],[-36.571,-6.995],[-44.269,-8.241],[-68.685,16.175],[-68.604,18.079],[-75.133,16.175],[-87.341,28.383],[-75.133,40.592],[75.134,40.592],[87.342,28.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.815686334348,0.823529471603,0.827451040231,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[453.672,304.756],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Merged Shape Layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.547],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.845],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":77,"s":[35]},{"t":150,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[390.319,298.2,0],"to":[0,-2.583,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[390.319,282.7,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[390.319,319.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150,"s":[390.319,298.2,0]}],"ix":2},"a":{"a":0,"k":[664.319,256.2,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[18.967,-3.189],[-18.967,19.935],[-0.949,-19.935]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.223528981209,0.192156970501,0.674510002136,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.879,292.737],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[633.939,275.369],"ix":2},"a":{"a":0,"k":[236.879,292.737],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-98.335,64.79],[-105.619,4.984],[105.619,-64.79],[-80.316,24.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.278430998325,0.294117987156,0.847059011459,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[316.247,247.882],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[673.623,252.941],"ix":2},"a":{"a":0,"k":[316.247,247.882],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-133.812,-42.171],[133.812,-75.141],[5.765,75.141],[-61.708,18.402],[124.227,-71.307],[-87.011,-1.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.365000009537,0.407999992371,0.976000010967,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.638,254.4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[664.319,256.2],"ix":2},"a":{"a":0,"k":[297.638,254.4],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"planete Outlines - Group 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":102,"s":[100]},{"t":150,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[327.38,267.583,0],"to":[25.833,0,0],"ti":[-25.833,0,0]},{"t":150,"s":[482.38,267.583,0]}],"ix":2},"a":{"a":0,"k":[171.76,193.166,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.485,0],[4.38,-4.171],[21.913,0],[3.575,-18.765],[1.851,0],[0,-13.484],[-0.011,-0.291],[1.599,0],[0,-6.743],[-6.742,0],[0,0],[0,13.485]],"o":[[-6.526,0],[-0.793,-21.719],[-19.806,0],[-1.734,-0.391],[-13.485,0],[0,0.293],[-1.4,-0.559],[-6.742,0],[0,6.742],[0,0],[13.485,0],[0,-13.484]],"v":[[59.669,-8.242],[42.84,-1.506],[2.287,-40.592],[-37.576,-7.638],[-42.962,-8.242],[-67.378,16.174],[-67.356,17.049],[-71.878,16.174],[-84.086,28.383],[-71.878,40.591],[59.669,40.591],[84.086,16.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.823999980852,0.827000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.76,193.166],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[406,306,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[179,179,100],"ix":6}},"ao":0,"w":800,"h":600,"ip":0,"op":147,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{ + "v": "5.5.8", + "fr": 50, + "ip": 0, + "op": 147, + "w": 800, + "h": 600, + "nm": "Paperplane", + "ddd": 0, + "assets": [ + { + "id": "comp_0", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "planete Outlines - Group 4", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 38, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 88, + "s": [50] + }, + { "t": 120, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 0, + "s": [468.336, 323.378, 0], + "to": [-29, 0, 0], + "ti": [29, 0, 0] + }, + { "t": 102, "s": [294.336, 323.378, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [453.672, 304.756, 0], "ix": 1 }, + "s": { "a": 0, "k": [50, 50, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [6.742, 0], + [0.741, -0.14], + [0, 0.074], + [13.484, 0], + [1.669, -0.361], + [19.79, 0], + [3.317, -19.082], + [2.691, 0], + [0, -13.484], + [-0.048, -0.629], + [2.405, 0], + [0, -6.742], + [-6.742, 0], + [0, 0], + [0, 6.743] + ], + "o": [ + [-0.781, 0], + [0.001, -0.074], + [0, -13.484], + [-1.778, 0], + [-3.594, -18.742], + [-20.03, 0], + [-2.421, -0.804], + [-13.485, 0], + [0, 0.642], + [-1.89, -1.199], + [-6.742, 0], + [0, 6.743], + [0, 0], + [6.742, 0], + [0, -6.742] + ], + "v": [ + [75.134, 16.175], + [72.85, 16.396], + [72.856, 16.175], + [48.44, -8.241], + [43.262, -7.685], + [3.406, -40.591], + [-36.571, -6.995], + [-44.269, -8.241], + [-68.685, 16.175], + [-68.604, 18.079], + [-75.133, 16.175], + [-87.341, 28.383], + [-75.133, 40.592], + [75.134, 40.592], + [87.342, 28.383] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.815686334348, 0.823529471603, 0.827451040231, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [453.672, 304.756], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 4", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 151, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Merged Shape Layer", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.547], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.845], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 77, + "s": [35] + }, + { "t": 150, "s": [0] } + ], + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 0, + "s": [390.319, 298.2, 0], + "to": [0, -2.583, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 44, + "s": [390.319, 282.7, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 110, + "s": [390.319, 319.25, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { "t": 150, "s": [390.319, 298.2, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [664.319, 256.2, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [18.967, -3.189], + [-18.967, 19.935], + [-0.949, -19.935] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.223528981209, 0.192156970501, 0.674510002136, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [236.879, 292.737], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [633.939, 275.369], "ix": 2 }, + "a": { "a": 0, "k": [236.879, 292.737], "ix": 1 }, + "s": { "a": 0, "k": [50, 50], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "planete Outlines - Group 1", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-98.335, 64.79], + [-105.619, 4.984], + [105.619, -64.79], + [-80.316, 24.919] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.278430998325, 0.294117987156, 0.847059011459, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [316.247, 247.882], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [673.623, 252.941], "ix": 2 }, + "a": { "a": 0, "k": [316.247, 247.882], "ix": 1 }, + "s": { "a": 0, "k": [50, 50], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "planete Outlines - Group 2", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-133.812, -42.171], + [133.812, -75.141], + [5.765, 75.141], + [-61.708, 18.402], + [124.227, -71.307], + [-87.011, -1.534] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.365000009537, 0.407999992371, 0.976000010967, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [297.638, 254.4], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [664.319, 256.2], "ix": 2 }, + "a": { "a": 0, "k": [297.638, 254.4], "ix": 1 }, + "s": { "a": 0, "k": [50, 50], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "planete Outlines - Group 3", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 151, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "planete Outlines - Group 5", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 45, + "s": [100] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 102, + "s": [100] + }, + { "t": 150, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 0, + "s": [327.38, 267.583, 0], + "to": [25.833, 0, 0], + "ti": [-25.833, 0, 0] + }, + { "t": 150, "s": [482.38, 267.583, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [171.76, 193.166, 0], "ix": 1 }, + "s": { "a": 0, "k": [50, 50, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [13.485, 0], + [4.38, -4.171], + [21.913, 0], + [3.575, -18.765], + [1.851, 0], + [0, -13.484], + [-0.011, -0.291], + [1.599, 0], + [0, -6.743], + [-6.742, 0], + [0, 0], + [0, 13.485] + ], + "o": [ + [-6.526, 0], + [-0.793, -21.719], + [-19.806, 0], + [-1.734, -0.391], + [-13.485, 0], + [0, 0.293], + [-1.4, -0.559], + [-6.742, 0], + [0, 6.742], + [0, 0], + [13.485, 0], + [0, -13.484] + ], + "v": [ + [59.669, -8.242], + [42.84, -1.506], + [2.287, -40.592], + [-37.576, -7.638], + [-42.962, -8.242], + [-67.378, 16.174], + [-67.356, 17.049], + [-71.878, 16.174], + [-84.086, 28.383], + [-71.878, 40.591], + [59.669, 40.591], + [84.086, 16.174] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.816000007181, 0.823999980852, 0.827000038297, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [171.76, 193.166], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 5", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 151, + "st": 0, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 0, + "nm": "Pre-comp 1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [406, 306, 0], "ix": 2 }, + "a": { "a": 0, "k": [400, 300, 0], "ix": 1 }, + "s": { "a": 0, "k": [179, 179, 100], "ix": 6 } + }, + "ao": 0, + "w": 800, + "h": 600, + "ip": 0, + "op": 147, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} diff --git a/apps/dashboard/src/lottie/ballon.json b/apps/dashboard/src/lottie/ballon.json index f140f81f..4e48787e 100644 --- a/apps/dashboard/src/lottie/ballon.json +++ b/apps/dashboard/src/lottie/ballon.json @@ -1 +1,1102 @@ -{"v":"4.7.0","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":720,"h":720,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 12","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"eye","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[435.703,334.578,0]},"a":{"a":0,"k":[75.656,-25.094,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":55,"s":[68.389,68.389,100],"e":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":71,"s":[100,0,100],"e":[68.389,68.389,100]},{"t":90.0000036657751}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20.563,20.563]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.6705883,0.6442907,0.6442907,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[75.656,-25.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"out eye","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[359.953,360.328,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.5,27.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9294118,0.8783852,0.8783852,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[75.75,-25.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"duoi","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[0],"e":[-32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[-32],"e":[0]},{"t":76.0000030955435}]},"p":{"a":0,"k":[232.901,264.898,0]},"a":{"a":0,"k":[-146.691,-122.142,0]},"s":{"a":0,"k":[108.07,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.257,-29.886],[-0.011,0.582],[0,0],[-8.139,-12.838],[-17.886,27.356]],"o":[[0,0],[0.004,0.509],[0.5,-26.125],[0,0],[17.343,27.356],[8.5,-13]],"v":[[-95.5,-206.75],[-132.419,-164.682],[-132.209,-166.586],[-168.75,-202.5],[-167.25,-169],[-98.605,-168.936]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.4745098,0.7490196,0.827451,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-146.5,-122.5],"ix":2},"a":{"a":0,"k":[-131.308,-148.646],"ix":1},"s":{"a":0,"k":[72.59,72.59],"ix":3},"r":{"a":0,"k":-39.108,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"a1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-67,61.5],[36.911,23.822],[147.5,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-67,61.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":33,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":49,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-67,61.5],[36.911,23.822],[147.5,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-67,61.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":89,"s":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}],"e":[{"i":[[81.462,0],[26.998,-29.979],[3.641,-5.283],[2.87,-5.56],[0,-24.352],[-49.64,11.681],[-39.551,-6.305],[-22.411,0.678],[0,64.505]],"o":[[-43.52,0],[-4.281,4.754],[-3.529,5.12],[-10.45,20.243],[0,57.766],[68.927,-16.219],[34.5,5.5],[59.831,-1.811],[0,-81.462]],"v":[[0,-147.5],[-107.887,-100.173],[-132.786,-102.352],[-131.148,-67.568],[-147.5,0],[-84.927,26.219],[-39,77.5],[36.911,23.822],[147.5,0]],"c":true}]},{"t":100.000004073084}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.4737563,0.7483898,0.827451,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 8","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 7","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.929412,0.929412,0.929412,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[220,-157.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 6","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.929412,0.929412,0.929412,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[300.5,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[175,175]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[320,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[215,215]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9254902,0.9254902,0.9254902,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[340.5,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[255,255]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8862745,0.8862745,0.8862745,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[295,295]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8039216,0.8039216,0.8039216,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"}],"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1}]} \ No newline at end of file +{ + "v": "4.7.0", + "fr": 29.9700012207031, + "ip": 0, + "op": 90.0000036657751, + "w": 720, + "h": 720, + "nm": "Comp 1", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Shape Layer 12", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "eye", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [435.703, 334.578, 0] }, + "a": { "a": 0, "k": [75.656, -25.094, 0] }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "n": ["0p667_1_0p333_0", "0p667_1_0p333_0", "0p667_1_0p333_0"], + "t": 55, + "s": [68.389, 68.389, 100], + "e": [100, 0, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "n": ["0p667_1_0p333_0", "0p667_1_0p333_0", "0p667_1_0p333_0"], + "t": 71, + "s": [100, 0, 100], + "e": [68.389, 68.389, 100] + }, + { "t": 90.0000036657751 } + ] + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [20.563, 20.563] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.6705883, 0.6442907, 0.6442907, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [75.656, -25.094], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "ix": 1, + "mn": "ADBE Vector Group" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "out eye", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [359.953, 360.328, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [27.5, 27.5] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.9294118, 0.8783852, 0.8783852, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [75.75, -25.75], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "ix": 1, + "mn": "ADBE Vector Group" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "duoi", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "n": ["0p833_0p833_0p167_0p167"], + "t": 17, + "s": [0], + "e": [-32] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "n": ["0p833_0p833_0p167_0p167"], + "t": 47, + "s": [-32], + "e": [0] + }, + { "t": 76.0000030955435 } + ] + }, + "p": { "a": 0, "k": [232.901, 264.898, 0] }, + "a": { "a": 0, "k": [-146.691, -122.142, 0] }, + "s": { "a": 0, "k": [108.07, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-0.257, -29.886], + [-0.011, 0.582], + [0, 0], + [-8.139, -12.838], + [-17.886, 27.356] + ], + "o": [ + [0, 0], + [0.004, 0.509], + [0.5, -26.125], + [0, 0], + [17.343, 27.356], + [8.5, -13] + ], + "v": [ + [-95.5, -206.75], + [-132.419, -164.682], + [-132.209, -166.586], + [-168.75, -202.5], + [-167.25, -169], + [-98.605, -168.936] + ], + "c": true + } + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.4745098, 0.7490196, 0.827451, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [-146.5, -122.5], "ix": 2 }, + "a": { "a": 0, "k": [-131.308, -148.646], "ix": 1 }, + "s": { "a": 0, "k": [72.59, 72.59], "ix": 3 }, + "r": { "a": 0, "k": -39.108, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 2, + "cix": 2, + "ix": 1, + "mn": "ADBE Vector Group" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "a1", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p667_1_0p333_0", + "t": 0, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-67, 61.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p667_1_0p333_0", + "t": 15, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-67, 61.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p667_1_0p333_0", + "t": 33, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p667_1_0p333_0", + "t": 49, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-67, 61.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p667_1_0p333_0", + "t": 75, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-67, 61.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.333, "y": 0 }, + "n": "0p833_0p833_0p333_0", + "t": 89, + "s": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ], + "e": [ + { + "i": [ + [81.462, 0], + [26.998, -29.979], + [3.641, -5.283], + [2.87, -5.56], + [0, -24.352], + [-49.64, 11.681], + [-39.551, -6.305], + [-22.411, 0.678], + [0, 64.505] + ], + "o": [ + [-43.52, 0], + [-4.281, 4.754], + [-3.529, 5.12], + [-10.45, 20.243], + [0, 57.766], + [68.927, -16.219], + [34.5, 5.5], + [59.831, -1.811], + [0, -81.462] + ], + "v": [ + [0, -147.5], + [-107.887, -100.173], + [-132.786, -102.352], + [-131.148, -67.568], + [-147.5, 0], + [-84.927, 26.219], + [-39, 77.5], + [36.911, 23.822], + [147.5, 0] + ], + "c": true + } + ] + }, + { "t": 100.000004073084 } + ] + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.4737563, 0.7483898, 0.827451, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Shape Layer 8", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Shape Layer 7", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "st", + "c": { "a": 0, "k": [1, 0, 0, 1] }, + "o": { "a": 0, "k": 100 }, + "w": { "a": 0, "k": 5 }, + "lc": 1, + "lj": 1, + "ml": 4, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.929412, 0.929412, 0.929412, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [220, -157.5], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 2, + "cix": 2, + "ix": 1, + "mn": "ADBE Vector Group" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Shape Layer 6", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "st", + "c": { "a": 0, "k": [1, 0, 0, 1] }, + "o": { "a": 0, "k": 100 }, + "w": { "a": 0, "k": 5 }, + "lc": 1, + "lj": 1, + "ml": 4, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.929412, 0.929412, 0.929412, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 2, + "cix": 2, + "ix": 1, + "mn": "ADBE Vector Group" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Shape Layer 4", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [300.5, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [175, 175] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 10, + "ty": 4, + "nm": "Shape Layer 3", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [320, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [215, 215] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.9254902, 0.9254902, 0.9254902, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 11, + "ty": 4, + "nm": "Shape Layer 2", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [340.5, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [255, 255] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.8862745, 0.8862745, 0.8862745, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + }, + { + "ddd": 0, + "ind": 12, + "ty": 4, + "nm": "Shape Layer 1", + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [360, 360, 0] }, + "a": { "a": 0, "k": [0, 0, 0] }, + "s": { "a": 0, "k": [100, 100, 100] } + }, + "ao": 0, + "shapes": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [295, 295] }, + "p": { "a": 0, "k": [0, 0] }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.8039216, 0.8039216, 0.8039216, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill" + } + ], + "ip": 0, + "op": 90.0000036657751, + "st": 0, + "bm": 0, + "sr": 1 + } + ] +} diff --git a/apps/dashboard/src/lottie/no-data.json b/apps/dashboard/src/lottie/no-data.json index 1d8c0de0..03bc2a39 100644 --- a/apps/dashboard/src/lottie/no-data.json +++ b/apps/dashboard/src/lottie/no-data.json @@ -1 +1,1941 @@ -{"v":"5.5.9","fr":60,"ip":0,"op":180,"w":426,"h":290,"nm":"search_empty","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"mouth","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[211,145,0],"to":[0,0.667,0],"ti":[0,-0.667,0]},{"t":69,"s":[211,149,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100]},{"t":68,"s":[105,105,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.5,0.25],[-1.715,0.372]],"o":[[-13.025,-6.512],[7.5,-1.625]],"v":[[-10,12.25],[-31.75,12.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40784313725490196,0.4627450980392157,0.5176470588235295,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"汗","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[0]},{"t":95,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":51,"s":[248,95.252,0],"to":[0,1.5,0],"ti":[0,-1.5,0]},{"t":94,"s":[248,104.252,0]}],"ix":2},"a":{"a":0,"k":[0,-19.333,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":51,"s":[40,40,100]},{"t":95,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.94,0],[0,7.27],[0,0],[0,-7.27]],"o":[[9.94,0],[0,-7.27],[0,0],[0,7.27]],"v":[[0,19],[18,5.84],[0,-19],[-18,5.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.69,0.976,1,0.5,0.714,0.954,0.997,1,0.738,0.932,0.994],"ix":9}},"s":{"a":0,"k":[0.019,-9.236],"ix":5},"e":{"a":0,"k":[10.208,19],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"汗","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"eye","parent":1,"sr":1,"ks":{"o":{"a":0,"k":92,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.064,-11.347,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,20,100]},{"t":56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.466,16.135],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23529411764705882,0.26666666666666666,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"eye","parent":1,"sr":1,"ks":{"o":{"a":0,"k":92,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.767,-11.347,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,20,100]},{"t":56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.466,16.135],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23529411764705882,0.26666666666666666,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"magnifier","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,145,0],"ix":2},"a":{"a":0,"k":[213,145,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.40784313725490196,0.4627450980392157,0.5176470588235295,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[190.106,142.222,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[99.994,100.091],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[192.013,142.223,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-26.81,22.62],[22.49,26.96],[26.8,-22.62],[-22.5,-26.95]],"o":[[26.81,-22.62],[-22.49,-26.96],[-26.81,22.62],[22.49,26.96]],"v":[[40.727,48.812],[48.537,-40.958],[-40.723,-48.808],[-48.533,40.952]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3764705882352941,0.596078431372549,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[268.024,226.941,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[42.094,74.507],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2980392156862745,0.49019607843137253,0.8392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[238.933,197.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[24.446,44.702],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847000002861,0.847000002861,0.847000002861,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"t":265,"s":[360]}],"ix":10},"p":{"a":0,"k":[208,27,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.796078026295,0.835294008255,0.843137025833,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"t":358,"s":[360]}],"ix":10},"p":{"a":0,"k":[418,107,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.796078026295,0.835294008255,0.843137025833,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"t":281,"s":[360]}],"ix":10},"p":{"a":0,"k":[31,196,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.796078026295,0.835294008255,0.843137025833,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":281,"s":[360]}],"ix":10},"p":{"a":0,"k":[70,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960980892,0.756862998009,0.776471018791,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,9,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.701960980892,0.756862998009,0.776471018791,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[376,179,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.701960980892,0.768626987934,0.776471018791,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8,115,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.701960980892,0.768626987934,0.776471018791,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[191,145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":150,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":180,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":210,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":240,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":270,"s":[50,100,100]},{"t":295,"s":[70,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56.697,6.631],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.848757874732,0.861812935623,0.876608455882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-9.651,124.815],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[213,145,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":240,"s":[213,145,0],"to":[0,0,0],"ti":[0,-0.833,0]},{"t":270,"s":[213,150,0]}],"ix":2},"a":{"a":0,"k":[213,145,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"decoration1","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.981],"y":[1.128]},"o":{"x":[0.39],"y":[0.019]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[80]},{"t":73,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,289,0],"ix":2},"a":{"a":0,"k":[213,289,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.667],"y":[0.866,0.866,1]},"o":{"x":[0.37,0.37,0.333],"y":[-0.029,-0.029,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":72,"s":[80,80,100]},{"t":133,"s":[90,90,100]}],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"decoratio2","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[100]},{"t":72,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[211,291,0],"ix":2},"a":{"a":0,"k":[211,291,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[99.442,99.442,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[84.442,84.442,100]},{"t":133,"s":[90,90,100]}],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0}],"markers":[{"tm":180,"cm":"1","dr":0},{"tm":3600,"cm":"2","dr":0}]} \ No newline at end of file +{ + "v": "5.5.9", + "fr": 60, + "ip": 0, + "op": 180, + "w": 426, + "h": 290, + "nm": "search_empty", + "ddd": 0, + "assets": [ + { + "id": "comp_0", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "mouth", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 44, + "s": [211, 145, 0], + "to": [0, 0.667, 0], + "ti": [0, -0.667, 0] + }, + { "t": 69, "s": [211, 149, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 44, + "s": [100, 100, 100] + }, + { "t": 68, "s": [105, 105, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0.5, 0.25], + [-1.715, 0.372] + ], + "o": [ + [-13.025, -6.512], + [7.5, -1.625] + ], + "v": [ + [-10, 12.25], + [-31.75, 12.625] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.40784313725490196, 0.4627450980392157, + 0.5176470588235295, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "汗", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 51, + "s": [0] + }, + { "t": 95, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 51, + "s": [248, 95.252, 0], + "to": [0, 1.5, 0], + "ti": [0, -1.5, 0] + }, + { "t": 94, "s": [248, 104.252, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0, -19.333, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 51, + "s": [40, 40, 100] + }, + { "t": 95, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [-9.94, 0], + [0, 7.27], + [0, 0], + [0, -7.27] + ], + "o": [ + [9.94, 0], + [0, -7.27], + [0, 0], + [0, 7.27] + ], + "v": [ + [0, 19], + [18, 5.84], + [0, -19], + [-18, 5.84] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "gf", + "o": { "a": 0, "k": 100, "ix": 10 }, + "r": 1, + "bm": 0, + "g": { + "p": 3, + "k": { + "a": 0, + "k": [ + 0, 0.69, 0.976, 1, 0.5, 0.714, 0.954, 0.997, 1, 0.738, + 0.932, 0.994 + ], + "ix": 9 + } + }, + "s": { "a": 0, "k": [0.019, -9.236], "ix": 5 }, + "e": { "a": 0, "k": [10.208, 19], "ix": 6 }, + "t": 1, + "nm": "Gradient Fill 1", + "mn": "ADBE Vector Graphic - G-Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "汗", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "eye", + "parent": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 92, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-7.064, -11.347, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 0, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 3, + "s": [100, 20, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 6, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 9, + "s": [100, 20, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 12, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 50, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 53, + "s": [100, 20, 100] + }, + { "t": 56, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [8.466, 16.135], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.23529411764705882, 0.26666666666666666, + 0.29411764705882354, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "eye", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "eye", + "parent": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 92, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-33.767, -11.347, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 0, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 3, + "s": [100, 20, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 6, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 9, + "s": [100, 20, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 12, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 50, + "s": [100, 100, 100] + }, + { + "i": { + "x": [0.833, 0.833, 0.833], + "y": [0.833, 0.833, 0.833] + }, + "o": { + "x": [0.167, 0.167, 0.167], + "y": [0.167, 0.167, 0.167] + }, + "t": 53, + "s": [100, 20, 100] + }, + { "t": 56, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [8.466, 16.135], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.23529411764705882, 0.26666666666666666, + 0.29411764705882354, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "eye", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 0, + "nm": "magnifier", + "refId": "comp_1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [213, 145, 0], "ix": 2 }, + "a": { "a": 0, "k": [213, 145, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "w": 426, + "h": 290, + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + } + ] + }, + { + "id": "comp_1", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Shape Layer 1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [213, 145, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.40784313725490196, 0.4627450980392157, + 0.5176470588235295, 1 + ], + "ix": 3 + }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2, "ix": 5 }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": -5, "ix": 10 }, + "p": { "a": 0, "k": [190.106, 142.222, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [99.994, 100.091], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": -40, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": -5, "ix": 10 }, + "p": { "a": 0, "k": [192.013, 142.223, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [-26.81, 22.62], + [22.49, 26.96], + [26.8, -22.62], + [-22.5, -26.95] + ], + "o": [ + [26.81, -22.62], + [-22.49, -26.96], + [-26.81, 22.62], + [22.49, 26.96] + ], + "v": [ + [40.727, 48.812], + [48.537, -40.958], + [-40.723, -48.808], + [-48.533, 40.952] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.3764705882352941, 0.596078431372549, 1, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "矩形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": -5, "ix": 10 }, + "p": { "a": 0, "k": [268.024, 226.941, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [42.094, 74.507], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 10, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.2980392156862745, 0.49019607843137253, + 0.8392156862745098, 1 + ], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": -40, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "矩形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "矩形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": -5, "ix": 10 }, + "p": { "a": 0, "k": [238.933, 197.25, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [24.446, 44.702], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.847000002861, 0.847000002861, 0.847000002861, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": -40, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "矩形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + } + ] + }, + { + "id": "comp_2", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "合併形狀", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 60, + "s": [0] + }, + { "t": 265, "s": [360] } + ], + "ix": 10 + }, + "p": { "a": 0, "k": [208, 27, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [16, 2], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [2, 18], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 2", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "mm", + "mm": 2, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.796078026295, 0.835294008255, 0.843137025833, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "合併形狀", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "合併形狀", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 5, + "s": [0] + }, + { "t": 358, "s": [360] } + ], + "ix": 10 + }, + "p": { "a": 0, "k": [418, 107, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [16, 2], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [2, 18], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 2", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "mm", + "mm": 2, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.796078026295, 0.835294008255, 0.843137025833, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "合併形狀", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "合併形狀", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 5, + "s": [0] + }, + { "t": 281, "s": [360] } + ], + "ix": 10 + }, + "p": { "a": 0, "k": [31, 196, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [16, 2], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [2, 18], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 2", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "mm", + "mm": 2, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.796078026295, 0.835294008255, 0.843137025833, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "合併形狀", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 0, + "s": [0] + }, + { "t": 281, "s": [360] } + ], + "ix": 10 + }, + "p": { "a": 0, "k": [70, 33, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [24, 24], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [0.701960980892, 0.756862998009, 0.776471018791, 1], + "ix": 3 + }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2, "ix": 5 }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + } + ] + }, + { + "id": "comp_3", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [306, 9, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [16, 16], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [0.701960980892, 0.756862998009, 0.776471018791, 1], + "ix": 3 + }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2, "ix": 5 }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [376, 179, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [16, 16], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.701960980892, 0.768626987934, 0.776471018791, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "橢圓形", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [8, 115, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [16, 16], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.701960980892, 0.768626987934, 0.776471018791, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "橢圓形", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "shadow", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [191, 145, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 0, + "s": [70, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 30, + "s": [50, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 60, + "s": [70, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 90, + "s": [50, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 120, + "s": [70, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 150, + "s": [50, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 180, + "s": [70, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 210, + "s": [50, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 240, + "s": [70, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 270, + "s": [50, 100, 100] + }, + { "t": 295, "s": [70, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [56.697, 6.631], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.848757874732, 0.861812935623, 0.876608455882, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [-9.651, 124.815], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 0, + "nm": "main", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 0, + "s": [213, 145, 0], + "to": [0, 0.833, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 30, + "s": [213, 150, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 60, + "s": [213, 145, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 90, + "s": [213, 150, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 120, + "s": [213, 145, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 150, + "s": [213, 150, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 180, + "s": [213, 145, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 210, + "s": [213, 150, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 240, + "s": [213, 145, 0], + "to": [0, 0, 0], + "ti": [0, -0.833, 0] + }, + { "t": 270, "s": [213, 150, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [213, 145, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "w": 426, + "h": 290, + "ip": 0, + "op": 3600, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 0, + "nm": "decoration1", + "refId": "comp_2", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.981], "y": [1.128] }, + "o": { "x": [0.39], "y": [0.019] }, + "t": 8, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 40, + "s": [100] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 72, + "s": [80] + }, + { "t": 73, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [213, 289, 0], "ix": 2 }, + "a": { "a": 0, "k": [213, 289, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.667], "y": [0.866, 0.866, 1] }, + "o": { "x": [0.37, 0.37, 0.333], "y": [-0.029, -0.029, 0] }, + "t": 0, + "s": [0, 0, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 40, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 72, + "s": [80, 80, 100] + }, + { "t": 133, "s": [90, 90, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "w": 426, + "h": 290, + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 0, + "nm": "decoratio2", + "refId": "comp_3", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 41, + "s": [100] + }, + { "t": 72, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [211, 291, 0], "ix": 2 }, + "a": { "a": 0, "k": [211, 291, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 0, + "s": [0, 0, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 43, + "s": [99.442, 99.442, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0.167] }, + "t": 72, + "s": [84.442, 84.442, 100] + }, + { "t": 133, "s": [90, 90, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "w": 426, + "h": 290, + "ip": 0, + "op": 569, + "st": 0, + "bm": 0 + } + ], + "markers": [ + { "tm": 180, "cm": "1", "dr": 0 }, + { "tm": 3600, "cm": "2", "dr": 0 } + ] +} diff --git a/apps/dashboard/src/modals/AddReference.tsx b/apps/dashboard/src/modals/AddReference.tsx index 2ab88741..b71802f5 100644 --- a/apps/dashboard/src/modals/AddReference.tsx +++ b/apps/dashboard/src/modals/AddReference.tsx @@ -7,12 +7,13 @@ import { Button } from '@/components/ui/button'; import { Calendar } from '@/components/ui/calendar'; import { useAppParams } from '@/hooks/useAppParams'; import { zodResolver } from '@hookform/resolvers/zod'; -import { zCreateReference } from '@openpanel/validation'; import { useRouter } from 'next/navigation'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; +import { zCreateReference } from '@openpanel/validation'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/modals/EditClient.tsx b/apps/dashboard/src/modals/EditClient.tsx index 9c83eafb..4b295e47 100644 --- a/apps/dashboard/src/modals/EditClient.tsx +++ b/apps/dashboard/src/modals/EditClient.tsx @@ -5,12 +5,13 @@ import { ButtonContainer } from '@/components/ButtonContainer'; import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { IServiceClient } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { IServiceClient } from '@openpanel/db'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/modals/EditDashboard.tsx b/apps/dashboard/src/modals/EditDashboard.tsx index 5028e52d..52b8c500 100644 --- a/apps/dashboard/src/modals/EditDashboard.tsx +++ b/apps/dashboard/src/modals/EditDashboard.tsx @@ -5,12 +5,13 @@ import { ButtonContainer } from '@/components/ButtonContainer'; import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { IServiceDashboard } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { IServiceDashboard } from '@openpanel/db'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/modals/EditProject.tsx b/apps/dashboard/src/modals/EditProject.tsx index 2a43bcab..f5c1a8e4 100644 --- a/apps/dashboard/src/modals/EditProject.tsx +++ b/apps/dashboard/src/modals/EditProject.tsx @@ -5,12 +5,13 @@ import { ButtonContainer } from '@/components/ButtonContainer'; import { InputWithLabel } from '@/components/forms/InputWithLabel'; import { Button } from '@/components/ui/button'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { IServiceProject } from '@openpanel/db'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { IServiceProject } from '@openpanel/db'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/modals/SaveReport.tsx b/apps/dashboard/src/modals/SaveReport.tsx index 9f2b8090..337301b4 100644 --- a/apps/dashboard/src/modals/SaveReport.tsx +++ b/apps/dashboard/src/modals/SaveReport.tsx @@ -8,12 +8,13 @@ import { Combobox } from '@/components/ui/combobox'; import { Label } from '@/components/ui/label'; import { useAppParams } from '@/hooks/useAppParams'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { IChartInput } from '@openpanel/validation'; import { useRouter, useSearchParams } from 'next/navigation'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; +import type { IChartInput } from '@openpanel/validation'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/modals/ShareOverviewModal.tsx b/apps/dashboard/src/modals/ShareOverviewModal.tsx index 8631aa5f..89cfe684 100644 --- a/apps/dashboard/src/modals/ShareOverviewModal.tsx +++ b/apps/dashboard/src/modals/ShareOverviewModal.tsx @@ -7,12 +7,13 @@ import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { useAppParams } from '@/hooks/useAppParams'; import { zodResolver } from '@hookform/resolvers/zod'; -import { zShareOverview } from '@openpanel/validation'; import { useRouter } from 'next/navigation'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; +import { zShareOverview } from '@openpanel/validation'; + import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; diff --git a/apps/dashboard/src/server/api/routers/chart.helpers.ts b/apps/dashboard/src/server/api/routers/chart.helpers.ts index 4fe96cf3..220dc277 100644 --- a/apps/dashboard/src/server/api/routers/chart.helpers.ts +++ b/apps/dashboard/src/server/api/routers/chart.helpers.ts @@ -1,5 +1,8 @@ import { getDaysOldDate } from '@/utils/date'; import { round } from '@/utils/math'; +import * as mathjs from 'mathjs'; +import { sort } from 'ramda'; + import { alphabetIds, NOT_SET_VALUE } from '@openpanel/constants'; import { chQuery, convertClickhouseDateToJs, getChartSql } from '@openpanel/db'; import type { @@ -9,8 +12,6 @@ import type { IGetChartDataInput, IInterval, } from '@openpanel/validation'; -import * as mathjs from 'mathjs'; -import { sort } from 'ramda'; export type GetChartDataResult = Awaited>; export interface ResultItem { diff --git a/apps/dashboard/src/server/api/routers/chart.ts b/apps/dashboard/src/server/api/routers/chart.ts index b187493f..b4f0f158 100644 --- a/apps/dashboard/src/server/api/routers/chart.ts +++ b/apps/dashboard/src/server/api/routers/chart.ts @@ -4,6 +4,9 @@ import { publicProcedure, } from '@/server/api/trpc'; import { average, max, min, round, sum } from '@/utils/math'; +import { flatten, map, pipe, prop, repeat, reverse, sort, uniq } from 'ramda'; +import { z } from 'zod'; + import { chQuery, createSqlBuilder, @@ -12,8 +15,6 @@ import { } from '@openpanel/db'; import { zChartInput } from '@openpanel/validation'; import type { IChartEvent, IChartInput } from '@openpanel/validation'; -import { flatten, map, pipe, prop, repeat, reverse, sort, uniq } from 'ramda'; -import { z } from 'zod'; import { getChartData, diff --git a/apps/dashboard/src/server/api/routers/dashboard.ts b/apps/dashboard/src/server/api/routers/dashboard.ts index f093024f..029bcf31 100644 --- a/apps/dashboard/src/server/api/routers/dashboard.ts +++ b/apps/dashboard/src/server/api/routers/dashboard.ts @@ -1,9 +1,10 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import { db, getId } from '@/server/db'; -import type { Prisma } from '@openpanel/db'; import { PrismaError } from 'prisma-error-enum'; import { z } from 'zod'; +import type { Prisma } from '@openpanel/db'; + export const dashboardRouter = createTRPCRouter({ get: protectedProcedure .input(z.object({ id: z.string() })) diff --git a/apps/dashboard/src/server/api/routers/event.ts b/apps/dashboard/src/server/api/routers/event.ts index fd027d7f..69a8f7eb 100644 --- a/apps/dashboard/src/server/api/routers/event.ts +++ b/apps/dashboard/src/server/api/routers/event.ts @@ -1,7 +1,8 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; -import { db } from '@openpanel/db'; import { z } from 'zod'; +import { db } from '@openpanel/db'; + export const eventRouter = createTRPCRouter({ updateEventMeta: protectedProcedure .input( diff --git a/apps/dashboard/src/server/api/routers/organization.ts b/apps/dashboard/src/server/api/routers/organization.ts index eaae290c..395e323c 100644 --- a/apps/dashboard/src/server/api/routers/organization.ts +++ b/apps/dashboard/src/server/api/routers/organization.ts @@ -1,8 +1,9 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import { clerkClient } from '@clerk/nextjs'; +import { z } from 'zod'; + import { getOrganizationBySlug } from '@openpanel/db'; import { zInviteUser } from '@openpanel/validation'; -import { z } from 'zod'; export const organizationRouter = createTRPCRouter({ list: protectedProcedure.query(() => { diff --git a/apps/dashboard/src/server/api/routers/profile.ts b/apps/dashboard/src/server/api/routers/profile.ts index b139cb02..2e3ee6a6 100644 --- a/apps/dashboard/src/server/api/routers/profile.ts +++ b/apps/dashboard/src/server/api/routers/profile.ts @@ -4,10 +4,11 @@ import { publicProcedure, } from '@/server/api/trpc'; import { db } from '@/server/db'; -import { chQuery, createSqlBuilder } from '@openpanel/db'; import { flatten, map, pipe, prop, sort, uniq } from 'ramda'; import { z } from 'zod'; +import { chQuery, createSqlBuilder } from '@openpanel/db'; + export const profileRouter = createTRPCRouter({ list: protectedProcedure .input( diff --git a/apps/dashboard/src/server/api/routers/report.ts b/apps/dashboard/src/server/api/routers/report.ts index 240aae2d..3767a594 100644 --- a/apps/dashboard/src/server/api/routers/report.ts +++ b/apps/dashboard/src/server/api/routers/report.ts @@ -1,8 +1,9 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import { db } from '@/server/db'; +import { z } from 'zod'; + import { transformReport } from '@openpanel/db'; import { zChartInput } from '@openpanel/validation'; -import { z } from 'zod'; export const reportRouter = createTRPCRouter({ get: protectedProcedure diff --git a/apps/dashboard/src/server/api/routers/share.ts b/apps/dashboard/src/server/api/routers/share.ts index 758b408f..450d0044 100644 --- a/apps/dashboard/src/server/api/routers/share.ts +++ b/apps/dashboard/src/server/api/routers/share.ts @@ -1,8 +1,9 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import { db } from '@/server/db'; -import { zShareOverview } from '@openpanel/validation'; import ShortUniqueId from 'short-unique-id'; +import { zShareOverview } from '@openpanel/validation'; + const uid = new ShortUniqueId({ length: 6 }); export const shareRouter = createTRPCRouter({ diff --git a/apps/dashboard/src/server/api/routers/user.ts b/apps/dashboard/src/server/api/routers/user.ts index e1a71699..69e586eb 100644 --- a/apps/dashboard/src/server/api/routers/user.ts +++ b/apps/dashboard/src/server/api/routers/user.ts @@ -1,8 +1,9 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import { clerkClient } from '@clerk/nextjs'; -import { transformUser } from '@openpanel/db'; import { z } from 'zod'; +import { transformUser } from '@openpanel/db'; + export const userRouter = createTRPCRouter({ update: protectedProcedure .input( diff --git a/apps/dashboard/src/server/db.ts b/apps/dashboard/src/server/db.ts index 52cfb321..183f31b3 100644 --- a/apps/dashboard/src/server/db.ts +++ b/apps/dashboard/src/server/db.ts @@ -1,4 +1,5 @@ import { slug } from '@/utils/slug'; + import { db } from '@openpanel/db'; export { db } from '@openpanel/db'; diff --git a/apps/dashboard/src/server/pageExists.tsx b/apps/dashboard/src/server/pageExists.tsx index 7e262276..b93e25e8 100644 --- a/apps/dashboard/src/server/pageExists.tsx +++ b/apps/dashboard/src/server/pageExists.tsx @@ -1,6 +1,7 @@ -import { getOrganizationBySlug, getProjectById } from '@openpanel/db'; import { notFound } from 'next/navigation'; +import { getOrganizationBySlug, getProjectById } from '@openpanel/db'; + export async function getExists(organizationSlug: string, projectId?: string) { const promises: Promise[] = [getOrganizationBySlug(organizationSlug)]; diff --git a/apps/docs/package.json b/apps/docs/package.json index 5459f19b..6df3c31e 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "eslint .", - "format": "prettier --write \"**/*.{tsx,mjs,ts,md,json}\"", + "format": "prettier --check \"**/*.{tsx,mjs,ts,md,json}\"", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env -c --" }, diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index f25ad65e..d17f2ec2 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -3,9 +3,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "plugins": [ { @@ -15,11 +13,6 @@ "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", "strictNullChecks": true }, - "include": [ - ".", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": [".", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/apps/public/package.json b/apps/public/package.json index ee88b426..0df48ea6 100644 --- a/apps/public/package.json +++ b/apps/public/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "eslint .", - "format": "prettier --write \"**/*.{tsx,mjs,ts,md,json}\"", + "format": "prettier --check \"**/*.{tsx,mjs,ts,md,json}\"", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env -c --" }, diff --git a/apps/public/tsconfig.json b/apps/public/tsconfig.json index 5df87e7a..d17f2ec2 100644 --- a/apps/public/tsconfig.json +++ b/apps/public/tsconfig.json @@ -3,16 +3,16 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": ["./src/*"], + "@/*": ["./src/*"] }, "plugins": [ { - "name": "next", - }, + "name": "next" + } ], "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", - "strictNullChecks": true, + "strictNullChecks": true }, "include": [".", ".next/types/**/*.ts"], - "exclude": ["node_modules"], + "exclude": ["node_modules"] } diff --git a/apps/test/package.json b/apps/test/package.json index 68f85cae..4de60c78 100644 --- a/apps/test/package.json +++ b/apps/test/package.json @@ -8,7 +8,7 @@ "build": "next build", "start": "next start", "lint": "eslint .", - "format": "prettier --write \"**/*.{tsx,mjs,ts,md,json}\"", + "format": "prettier --check \"**/*.{tsx,mjs,ts,md,json}\"", "typecheck": "tsc --noEmit" }, "dependencies": { diff --git a/apps/test/src/analytics.ts b/apps/test/src/analytics.ts index daa3ee7b..2932b5be 100644 --- a/apps/test/src/analytics.ts +++ b/apps/test/src/analytics.ts @@ -1,9 +1,9 @@ -import type { FastifyReply, FastifyRequest } from "fastify"; -import icoToPng from "ico-to-png"; -import sharp from "sharp"; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import icoToPng from 'ico-to-png'; +import sharp from 'sharp'; -import { createHash } from "@openpanel/common"; -import { redis } from "@openpanel/redis"; +import { createHash } from '@openpanel/common'; +import { redis } from '@openpanel/redis'; interface GetFaviconParams { url: string; @@ -12,9 +12,9 @@ interface GetFaviconParams { async function getImageBuffer(url: string) { try { const res = await fetch(url); - const contentType = res.headers.get("content-type"); + const contentType = res.headers.get('content-type'); - if (!contentType?.includes("image")) { + if (!contentType?.includes('image')) { return null; } @@ -22,7 +22,7 @@ async function getImageBuffer(url: string) { return null; } - if (contentType === "image/x-icon" || url.endsWith(".ico")) { + if (contentType === 'image/x-icon' || url.endsWith('.ico')) { const arrayBuffer = await res.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); return await icoToPng(buffer, 30); @@ -30,36 +30,36 @@ async function getImageBuffer(url: string) { return await sharp(await res.arrayBuffer()) .resize(30, 30, { - fit: "cover", + fit: 'cover', }) .png() .toBuffer(); } catch (e) { - console.log("Failed to get image from url", url); + console.log('Failed to get image from url', url); console.log(e); } } -const imageExtensions = ["svg", "png", "jpg", "jpeg", "gif", "webp", "ico"]; +const imageExtensions = ['svg', 'png', 'jpg', 'jpeg', 'gif', 'webp', 'ico']; export async function getFavicon( request: FastifyRequest<{ Querystring: GetFaviconParams; }>, - reply: FastifyReply, + reply: FastifyReply ) { function sendBuffer(buffer: Buffer, cacheKey?: string) { if (cacheKey) { - redis.set(`favicon:${cacheKey}`, buffer.toString("base64")); + redis.set(`favicon:${cacheKey}`, buffer.toString('base64')); } - reply.type("image/png"); - console.log("buffer", buffer.byteLength); + reply.type('image/png'); + console.log('buffer', buffer.byteLength); return reply.send(buffer); } if (!request.query.url) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const url = decodeURIComponent(request.query.url); @@ -69,7 +69,7 @@ export async function getFavicon( const cacheKey = createHash(url, 32); const cache = await redis.get(`favicon:${cacheKey}`); if (cache) { - return sendBuffer(Buffer.from(cache, "base64")); + return sendBuffer(Buffer.from(cache, 'base64')); } const buffer = await getImageBuffer(url); if (buffer && buffer.byteLength > 0) { @@ -80,7 +80,7 @@ export async function getFavicon( const { hostname, origin } = new URL(url); const cache = await redis.get(`favicon:${hostname}`); if (cache) { - return sendBuffer(Buffer.from(cache, "base64")); + return sendBuffer(Buffer.from(cache, 'base64')); } // TRY FAVICON.ICO @@ -94,7 +94,7 @@ export async function getFavicon( function findFavicon(res: string) { const match = res.match( - /(\|\)/, + /(\|\)/ ); if (!match) { return null; @@ -112,16 +112,16 @@ export async function getFavicon( } } - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } export async function clearFavicons( request: FastifyRequest, - reply: FastifyReply, + reply: FastifyReply ) { - const keys = await redis.keys("favicon:*"); + const keys = await redis.keys('favicon:*'); for (const key of keys) { await redis.del(key); } - return reply.status(404).send("OK"); + return reply.status(404).send('OK'); } diff --git a/apps/test/src/app/app-dir/page.tsx b/apps/test/src/app/app-dir/page.tsx index 14befafb..5bb787c8 100644 --- a/apps/test/src/app/app-dir/page.tsx +++ b/apps/test/src/app/app-dir/page.tsx @@ -1,24 +1,24 @@ -import { getClientIp, parseIp } from "@/utils/parseIp"; -import { isUserAgentSet, parseUserAgent } from "@/utils/parseUserAgent"; -import type { FastifyReply, FastifyRequest } from "fastify"; -import { assocPath, pathOr } from "ramda"; +import { getClientIp, parseIp } from '@/utils/parseIp'; +import { isUserAgentSet, parseUserAgent } from '@/utils/parseUserAgent'; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import { assocPath, pathOr } from 'ramda'; -import { getProfileById, upsertProfile } from "@openpanel/db"; +import { getProfileById, upsertProfile } from '@openpanel/db'; import type { IncrementProfilePayload, UpdateProfilePayload, -} from "@openpanel/sdk"; +} from '@openpanel/sdk'; export async function updateProfile( request: FastifyRequest<{ Body: UpdateProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, properties, ...rest } = request.body; const projectId = request.projectId; const ip = getClientIp(request)!; - const ua = request.headers["user-agent"]!; + const ua = request.headers['user-agent']!; const uaInfo = parseUserAgent(ua); const geo = await parseIp(ip); @@ -40,29 +40,29 @@ export async function incrementProfileProperty( request: FastifyRequest<{ Body: IncrementProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, property, value } = request.body; const projectId = request.projectId; const profile = await getProfileById(profileId); if (!profile) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const parsed = parseInt( - pathOr("0", property.split("."), profile.properties), - 10, + pathOr('0', property.split('.'), profile.properties), + 10 ); if (isNaN(parsed)) { - return reply.status(400).send("Not number"); + return reply.status(400).send('Not number'); } profile.properties = assocPath( - property.split("."), + property.split('.'), parsed + value, - profile.properties, + profile.properties ); await upsertProfile({ @@ -78,29 +78,29 @@ export async function decrementProfileProperty( request: FastifyRequest<{ Body: IncrementProfilePayload; }>, - reply: FastifyReply, + reply: FastifyReply ) { const { profileId, property, value } = request.body; const projectId = request.projectId; const profile = await getProfileById(profileId); if (!profile) { - return reply.status(404).send("Not found"); + return reply.status(404).send('Not found'); } const parsed = parseInt( - pathOr("0", property.split("."), profile.properties), - 10, + pathOr('0', property.split('.'), profile.properties), + 10 ); if (isNaN(parsed)) { - return reply.status(400).send("Not number"); + return reply.status(400).send('Not number'); } profile.properties = assocPath( - property.split("."), + property.split('.'), parsed - value, - profile.properties, + profile.properties ); await upsertProfile({ diff --git a/apps/test/src/pages/_app.tsx b/apps/test/src/pages/_app.tsx index 348016a3..22c38e90 100644 --- a/apps/test/src/pages/_app.tsx +++ b/apps/test/src/pages/_app.tsx @@ -1,51 +1,15 @@ -{ - "name": "@openpanel/api", - "version": "0.0.1", - "scripts": { - "dev": "dotenv -e ../../.env -c -v WATCH=1 tsup", - "testing": "API_PORT=3333 pnpm dev", - "start": "node dist/index.js", - "build": "rm -rf dist && tsup", - "lint": "eslint .", - "format": "prettier --check \"**/*.{mjs,ts,md,json}\"", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@fastify/cors": "^9.0.0", - "@fastify/websocket": "^8.3.1", - "@logtail/pino": "^0.4.19", - "@openpanel/common": "workspace:*", - "@openpanel/db": "workspace:*", - "@openpanel/queue": "workspace:*", - "@openpanel/redis": "workspace:*", - "fastify": "^4.25.2", - "ico-to-png": "^0.2.1", - "pino": "^8.17.2", - "pino-pretty": "^10.3.1", - "ramda": "^0.29.1", - "sharp": "^0.33.2", - "ua-parser-js": "^1.0.37", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@openpanel/eslint-config": "workspace:*", - "@openpanel/prettier-config": "workspace:*", - "@openpanel/sdk": "workspace:*", - "@openpanel/tsconfig": "workspace:*", - "@types/ramda": "^0.29.6", - "@types/ua-parser-js": "^0.7.39", - "@types/uuid": "^9.0.8", - "@types/ws": "^8.5.10", - "eslint": "^8.48.0", - "prettier": "^3.0.3", - "tsup": "^7.2.0", - "typescript": "^5.2.2" - }, - "eslintConfig": { - "root": true, - "extends": [ - "@openpanel/eslint-config/base" - ] - }, - "prettier": "@openpanel/prettier-config" +import { OpenpanelProvider } from '@openpanel-test/nextjs'; +import type { AppProps } from 'next/app'; + +export default function MyApp({ Component, pageProps }: AppProps) { + return ( + <> + + + + ); } diff --git a/apps/test/tsconfig.json b/apps/test/tsconfig.json index f25ad65e..d17f2ec2 100644 --- a/apps/test/tsconfig.json +++ b/apps/test/tsconfig.json @@ -3,9 +3,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "plugins": [ { @@ -15,11 +13,6 @@ "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", "strictNullChecks": true }, - "include": [ - ".", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": [".", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json index 5df87e7a..d17f2ec2 100644 --- a/apps/worker/tsconfig.json +++ b/apps/worker/tsconfig.json @@ -3,16 +3,16 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": ["./src/*"], + "@/*": ["./src/*"] }, "plugins": [ { - "name": "next", - }, + "name": "next" + } ], "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", - "strictNullChecks": true, + "strictNullChecks": true }, "include": [".", ".next/types/**/*.ts"], - "exclude": ["node_modules"], + "exclude": ["node_modules"] } diff --git a/packages/db/src/services/chart.service.ts b/packages/db/src/services/chart.service.ts index 2ea800e7..bfb74501 100644 --- a/packages/db/src/services/chart.service.ts +++ b/packages/db/src/services/chart.service.ts @@ -1,4 +1,7 @@ -import type { IChartEventFilter, IGetChartDataInput } from '@openpanel/validation'; +import type { + IChartEventFilter, + IGetChartDataInput, +} from '@openpanel/validation'; import { formatClickhouseDate } from '../clickhouse-client'; import type { SqlBuilderObject } from '../sql-builder'; diff --git a/packages/db/src/services/event.service.ts b/packages/db/src/services/event.service.ts index 3d9be664..d1f11595 100644 --- a/packages/db/src/services/event.service.ts +++ b/packages/db/src/services/event.service.ts @@ -1,22 +1,22 @@ -import { omit, uniq } from "ramda"; -import { v4 as uuid } from "uuid"; +import { omit, uniq } from 'ramda'; +import { v4 as uuid } from 'uuid'; -import { randomSplitName, toDots } from "@openpanel/common"; -import { redis, redisPub } from "@openpanel/redis"; -import type { IChartEventFilter } from "@openpanel/validation"; +import { randomSplitName, toDots } from '@openpanel/common'; +import { redis, redisPub } from '@openpanel/redis'; +import type { IChartEventFilter } from '@openpanel/validation'; import { ch, chQuery, convertClickhouseDateToJs, formatClickhouseDate, -} from "../clickhouse-client"; -import type { EventMeta, Prisma } from "../prisma-client"; -import { db } from "../prisma-client"; -import { createSqlBuilder } from "../sql-builder"; -import { getEventFiltersWhereClause } from "./chart.service"; -import { getProfileById, getProfiles, upsertProfile } from "./profile.service"; -import type { IServiceProfile } from "./profile.service"; +} from '../clickhouse-client'; +import type { EventMeta, Prisma } from '../prisma-client'; +import { db } from '../prisma-client'; +import { createSqlBuilder } from '../sql-builder'; +import { getEventFiltersWhereClause } from './chart.service'; +import { getProfileById, getProfiles, upsertProfile } from './profile.service'; +import type { IServiceProfile } from './profile.service'; export interface IClickhouseEvent { id: string; @@ -49,7 +49,7 @@ export interface IClickhouseEvent { } export function transformEvent( - event: IClickhouseEvent, + event: IClickhouseEvent ): IServiceCreateEventPayload { return { id: event.id, @@ -124,7 +124,7 @@ export async function getLiveVisitors(projectId: string) { export async function getEvents( sql: string, - options: GetEventsOptions = {}, + options: GetEventsOptions = {} ): Promise { const events = await chQuery(sql); if (options.profile) { @@ -155,17 +155,17 @@ export async function getEvents( } export async function createEvent( - payload: Omit, + payload: Omit ) { if (!payload.profileId) { payload.profileId = payload.deviceId; } console.log( - `create event ${payload.name} for deviceId: ${payload.deviceId} profileId ${payload.profileId}`, + `create event ${payload.name} for deviceId: ${payload.deviceId} profileId ${payload.profileId}` ); const exists = await getProfileById(payload.profileId); - if (!exists && payload.profileId !== "") { + if (!exists && payload.profileId !== '') { const { firstName, lastName } = randomSplitName(); await upsertProfile({ id: payload.profileId, @@ -198,40 +198,40 @@ export async function createEvent( profile_id: payload.profileId, project_id: payload.projectId, session_id: payload.sessionId, - properties: toDots(omit(["_path"], payload.properties)), - path: payload.path ?? "", + properties: toDots(omit(['_path'], payload.properties)), + path: payload.path ?? '', created_at: formatClickhouseDate(payload.createdAt), - country: payload.country ?? "", - city: payload.city ?? "", - region: payload.region ?? "", - os: payload.os ?? "", - os_version: payload.osVersion ?? "", - browser: payload.browser ?? "", - browser_version: payload.browserVersion ?? "", - device: payload.device ?? "", - brand: payload.brand ?? "", - model: payload.model ?? "", + country: payload.country ?? '', + city: payload.city ?? '', + region: payload.region ?? '', + os: payload.os ?? '', + os_version: payload.osVersion ?? '', + browser: payload.browser ?? '', + browser_version: payload.browserVersion ?? '', + device: payload.device ?? '', + brand: payload.brand ?? '', + model: payload.model ?? '', duration: payload.duration, - referrer: payload.referrer ?? "", - referrer_name: payload.referrerName ?? "", - referrer_type: payload.referrerType ?? "", + referrer: payload.referrer ?? '', + referrer_name: payload.referrerName ?? '', + referrer_type: payload.referrerType ?? '', }; const res = await ch.insert({ - table: "events", + table: 'events', values: [event], - format: "JSONEachRow", + format: 'JSONEachRow', clickhouse_settings: { - date_time_input_format: "best_effort", + date_time_input_format: 'best_effort', }, }); - redisPub.publish("event", JSON.stringify(transformEvent(event))); + redisPub.publish('event', JSON.stringify(transformEvent(event))); redis.set( `live:event:${event.project_id}:${event.profile_id}`, - "", - "EX", - 60 * 5, + '', + 'EX', + 60 * 5 ); return { @@ -270,7 +270,7 @@ export async function getEventList({ if (events && events.length > 0) { sb.where.events = `name IN (${join( events.map((n) => `'${n}'`), - ",", + ',' )})`; } @@ -285,7 +285,7 @@ export async function getEventList({ // sb.where.cursor = `created_at <= '${formatClickhouseDate(cursor)}'`; // } - sb.orderBy.created_at = "created_at DESC"; + sb.orderBy.created_at = 'created_at DESC'; return getEvents(getSql(), { profile: true, meta: true }); } @@ -295,7 +295,7 @@ export async function getEventsCount({ profileId, events, filters, -}: Omit) { +}: Omit) { const { sb, getSql, join } = createSqlBuilder(); sb.where.projectId = `project_id = '${projectId}'`; if (profileId) { @@ -305,7 +305,7 @@ export async function getEventsCount({ if (events && events.length > 0) { sb.where.events = `name IN (${join( events.map((n) => `'${n}'`), - ",", + ',' )})`; } @@ -317,7 +317,7 @@ export async function getEventsCount({ } const res = await chQuery<{ count: number }>( - getSql().replace("*", "count(*) as count"), + getSql().replace('*', 'count(*) as count') ); return res[0]?.count ?? 0; @@ -339,8 +339,8 @@ export function createBotEvent({ path, }: CreateBotEventPayload) { return ch.insert({ - table: "events_bots", - format: "JSONEachRow", + table: 'events_bots', + format: 'JSONEachRow', values: [ { name, diff --git a/packages/db/src/services/profile.service.ts b/packages/db/src/services/profile.service.ts index a64f6587..ad794c8c 100644 --- a/packages/db/src/services/profile.service.ts +++ b/packages/db/src/services/profile.service.ts @@ -1,17 +1,17 @@ -import { toDots, toObject } from "@openpanel/common"; -import type { IChartEventFilter } from "@openpanel/validation"; +import { toDots, toObject } from '@openpanel/common'; +import type { IChartEventFilter } from '@openpanel/validation'; -import { ch, chQuery } from "../clickhouse-client"; -import { createSqlBuilder } from "../sql-builder"; -import { getEventFiltersWhereClause } from "./chart.service"; +import { ch, chQuery } from '../clickhouse-client'; +import { createSqlBuilder } from '../sql-builder'; +import { getEventFiltersWhereClause } from './chart.service'; export async function getProfileById(id: string) { - if (id === "") { + if (id === '') { return null; } const [profile] = await chQuery( - `SELECT * FROM profiles WHERE id = '${id}' ORDER BY created_at DESC LIMIT 1`, + `SELECT * FROM profiles WHERE id = '${id}' ORDER BY created_at DESC LIMIT 1` ); if (!profile) { @@ -30,15 +30,15 @@ interface GetProfileListOptions { function getProfileSelectFields() { return [ - "id", - "argMax(first_name, created_at) as first_name", - "argMax(last_name, created_at) as last_name", - "argMax(email, created_at) as email", - "argMax(avatar, created_at) as avatar", - "argMax(properties, created_at) as properties", - "argMax(project_id, created_at) as project_id", - "max(created_at) as max_created_at", - ].join(", "); + 'id', + 'argMax(first_name, created_at) as first_name', + 'argMax(last_name, created_at) as last_name', + 'argMax(email, created_at) as email', + 'argMax(avatar, created_at) as avatar', + 'argMax(properties, created_at) as properties', + 'argMax(project_id, created_at) as project_id', + 'max(created_at) as max_created_at', + ].join(', '); } interface GetProfilesOptions { @@ -53,9 +53,9 @@ export async function getProfiles({ ids }: GetProfilesOptions) { `SELECT ${getProfileSelectFields()} FROM profiles - WHERE id IN (${ids.map((id) => `'${id}'`).join(",")}) + WHERE id IN (${ids.map((id) => `'${id}'`).join(',')}) GROUP BY id - `, + ` ); return data.map(transformProfile); @@ -85,7 +85,7 @@ export async function getProfileList({ } sb.limit = take; sb.offset = (cursor ?? 0) * take; - sb.orderBy.created_at = "max_created_at DESC"; + sb.orderBy.created_at = 'max_created_at DESC'; const data = await chQuery(getSql()); return data.map(transformProfile); } @@ -93,9 +93,9 @@ export async function getProfileList({ export async function getProfileListCount({ projectId, filters, -}: Omit) { +}: Omit) { const { sb, getSql } = createSqlBuilder(); - sb.select.count = "count(id) as count"; + sb.select.count = 'count(id) as count'; sb.from = getProfileInnerSelect(projectId); if (filters) { sb.where = { @@ -109,7 +109,7 @@ export async function getProfileListCount({ export async function getProfilesByExternalId( externalId: string | null, - projectId: string, + projectId: string ) { if (externalId === null) { return []; @@ -121,7 +121,7 @@ export async function getProfilesByExternalId( FROM profiles GROUP BY id HAVING project_id = '${projectId}' AND external_id = '${externalId}' - `, + ` ); return data.map(transformProfile); @@ -129,7 +129,7 @@ export async function getProfilesByExternalId( export type IServiceProfile = Omit< IClickhouseProfile, - "max_created_at" | "properties" + 'max_created_at' | 'properties' > & { createdAt: Date; properties: Record; @@ -177,27 +177,27 @@ export async function upsertProfile({ projectId, }: IServiceUpsertProfile) { const [profile] = await chQuery( - `SELECT * FROM profiles WHERE id = '${id}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1`, + `SELECT * FROM profiles WHERE id = '${id}' AND project_id = '${projectId}' ORDER BY created_at DESC LIMIT 1` ); await ch.insert({ - table: "profiles", - format: "JSONEachRow", + table: 'profiles', + format: 'JSONEachRow', clickhouse_settings: { - date_time_input_format: "best_effort", + date_time_input_format: 'best_effort', }, values: [ { id, - first_name: firstName ?? profile?.first_name ?? "", - last_name: lastName ?? profile?.last_name ?? "", - email: email ?? profile?.email ?? "", - avatar: avatar ?? profile?.avatar ?? "", + first_name: firstName ?? profile?.first_name ?? '', + last_name: lastName ?? profile?.last_name ?? '', + email: email ?? profile?.email ?? '', + avatar: avatar ?? profile?.avatar ?? '', properties: toDots({ ...(profile?.properties ?? {}), ...(properties ?? {}), }), - project_id: projectId ?? profile?.project_id ?? "", + project_id: projectId ?? profile?.project_id ?? '', created_at: new Date(), }, ], diff --git a/packages/db/src/services/reports.service.ts b/packages/db/src/services/reports.service.ts index 7a5cfa92..86703076 100644 --- a/packages/db/src/services/reports.service.ts +++ b/packages/db/src/services/reports.service.ts @@ -1,4 +1,4 @@ -import { alphabetIds, lineTypes, timeRanges } from "@openpanel/constants"; +import { alphabetIds, lineTypes, timeRanges } from '@openpanel/constants'; import type { IChartBreakdown, IChartEvent, @@ -6,42 +6,42 @@ import type { IChartInput, IChartLineType, IChartRange, -} from "@openpanel/validation"; +} from '@openpanel/validation'; -import { db } from "../prisma-client"; -import type { Report as DbReport } from "../prisma-client"; +import { db } from '../prisma-client'; +import type { Report as DbReport } from '../prisma-client'; export type IServiceReport = Awaited>; export function transformFilter( filter: Partial, - index: number, + index: number ): IChartEventFilter { return { - id: filter.id ?? alphabetIds[index] ?? "A", - name: filter.name ?? "Unknown Filter", - operator: filter.operator ?? "is", + id: filter.id ?? alphabetIds[index] ?? 'A', + name: filter.name ?? 'Unknown Filter', + operator: filter.operator ?? 'is', value: - typeof filter.value === "string" ? [filter.value] : filter.value ?? [], + typeof filter.value === 'string' ? [filter.value] : filter.value ?? [], }; } export function transformReportEvent( event: Partial, - index: number, + index: number ): IChartEvent { return { - segment: event.segment ?? "event", + segment: event.segment ?? 'event', filters: (event.filters ?? []).map(transformFilter), id: event.id ?? alphabetIds[index]!, - name: event.name || "unknown_event", + name: event.name || 'unknown_event', displayName: event.displayName, property: event.property, }; } export function transformReport( - report: DbReport, + report: DbReport ): IChartInput & { id: string } { return { id: report.id, @@ -51,11 +51,11 @@ export function transformReport( chartType: report.chart_type, lineType: (report.line_type as IChartLineType) ?? lineTypes.monotone, interval: report.interval, - name: report.name || "Untitled", - range: (report.range as IChartRange) ?? timeRanges["1m"], + name: report.name || 'Untitled', + range: (report.range as IChartRange) ?? timeRanges['1m'], previous: report.previous ?? false, formula: report.formula ?? undefined, - metric: report.metric ?? "sum", + metric: report.metric ?? 'sum', unit: report.unit ?? undefined, }; } diff --git a/packages/sdks/sdk/tsup.config.ts b/packages/sdks/sdk/tsup.config.ts index 93de8b48..76b96e47 100644 --- a/packages/sdks/sdk/tsup.config.ts +++ b/packages/sdks/sdk/tsup.config.ts @@ -1,7 +1,5 @@ import { defineConfig } from 'tsup'; -import config from '@openpanel/tsconfig/tsup.config.json' assert { - type: 'json' -} +import config from '@openpanel/tsconfig/tsup.config.json' assert { type: 'json' }; export default defineConfig(config as any); diff --git a/tooling/prettier/index.mjs b/tooling/prettier/index.mjs index 5ec65785..bb2243ac 100644 --- a/tooling/prettier/index.mjs +++ b/tooling/prettier/index.mjs @@ -14,7 +14,12 @@ const config = { '^[../]', '^[./]', ], - importOrderParserPlugins: ['typescript', 'jsx', 'decorators-legacy'], + importOrderParserPlugins: [ + 'typescript', + 'jsx', + 'decorators-legacy', + 'importAssertions', + ], importOrderTypeScriptVersion: '4.4.0', singleQuote: true, semi: true,