From c9ab1702a59775467788799d36c476262ebb68c3 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Sep 2024 10:15:10 -0500 Subject: [PATCH 01/11] update --- .github/workflows/release.yml | 39 ++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 767e233..a0c74c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,22 +48,23 @@ jobs: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Copy files run: yarn copy - - name: Create release pull request - if: github.event_name == 'push' - uses: changesets/action@v1 - with: - title: "release: version packages" - commit: "release: version packages" - publish: yarn publish - setupGitUser: true - createGithubReleases: true - bump: "patch" - env: - GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - continue-on-error: true - - name: Publish to npm - if: github.event_name == 'push' - run: yarn publish --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + ## - name: Create release pull request + ## if: github.event_name == 'push' + ## uses: changesets/action@v1 + ## with: + ## title: "release: version packages" + ## commit: "release: version packages" + ## publish: yarn publish + ## setupGitUser: true + ## createGithubReleases: true + ## bump: "patch" +## env: +## GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} +## NPM_TOKEN: ${{ secrets.NPM_TOKEN }} +## continue-on-error: true +## - name: Publish to npm +## if: github.event_name == 'push' +## run: yarn publish --access public +## env: +## NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From f043ba8d113d45443abd3b3305f6f35cd7213616 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Sep 2024 10:27:38 -0500 Subject: [PATCH 02/11] update --- package.json | 1 + .../message-kit/src/lib/handlerContext.ts | 27 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 269a43a..176e529 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "changeset": "yarn copy && changeset add --type patch", "clean": "turbo run clean && rm -rf node_modules && rm -rf .turbo && yarn cache clean", "copy": "cd packages/create-message-kit && yarn copy && cd .. && cd ..", + "dev": "cd packages/message-kit && yarn build:watch ", "dev:docs": "cd packages/docs && yarn dev", "dev:gm": "cd examples/gm && yarn dev", "dev:group": "cd examples/group && yarn dev", diff --git a/packages/message-kit/src/lib/handlerContext.ts b/packages/message-kit/src/lib/handlerContext.ts index b548e20..a1f2491 100644 --- a/packages/message-kit/src/lib/handlerContext.ts +++ b/packages/message-kit/src/lib/handlerContext.ts @@ -154,28 +154,45 @@ export default class HandlerContext { return context; } - async getReplyChain(reference: string): Promise<{ + async getReplyChain( + reference: string, + botAddress: boolean, + ): Promise<{ messageChain: string; receiverFromChain: string; + isReceiverInChain: boolean; }> { const msg = await this.getMessageById(reference); let receiver = this.members?.find( (member) => member.inboxId === msg?.senderInboxId, ); - if (!msg) return { messageChain: "", receiverFromChain: "" }; + if (!msg) + return { + messageChain: "", + receiverFromChain: "", + isReceiverInChain: false, + }; let chain = `${msg?.content?.content ?? msg?.content}\n\n`; + let isReceiverInChainReturn = false; if (msg?.content?.reference) { - const { messageChain, receiverFromChain } = await this.getReplyChain( - msg?.content?.reference, - ); + const { + messageChain, + receiverFromChain, + isReceiverInChain: isReceiverInChainBoolean, + } = await this.getReplyChain(msg?.content?.reference, botAddress); receiver = this.members?.find( (member) => member.address === receiverFromChain, ); + isReceiverInChainReturn = + isReceiverInChainBoolean ?? + receiver?.address.toString() === botAddress.toString(); + chain = `${messageChain}\nUser:${chain}`; } return { messageChain: chain, receiverFromChain: receiver?.address ?? "", + isReceiverInChain: isReceiverInChainReturn as boolean, }; } async reply(message: string) { From 90914828a21d71f08d51f514c35bca32a9c419af Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Sep 2024 12:21:44 -0500 Subject: [PATCH 03/11] update --- package.json | 2 +- .../message-kit/src/lib/handlerContext.ts | 61 ++++++++----------- packages/message-kit/src/lib/runner.ts | 18 +++--- 3 files changed, 36 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index 176e529..242da38 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "changeset": "yarn copy && changeset add --type patch", "clean": "turbo run clean && rm -rf node_modules && rm -rf .turbo && yarn cache clean", "copy": "cd packages/create-message-kit && yarn copy && cd .. && cd ..", - "dev": "cd packages/message-kit && yarn build:watch ", + "dev": "cd packages/message-kit && yarn build:watch && bun link", "dev:docs": "cd packages/docs && yarn dev", "dev:gm": "cd examples/gm && yarn dev", "dev:group": "cd examples/group && yarn dev", diff --git a/packages/message-kit/src/lib/handlerContext.ts b/packages/message-kit/src/lib/handlerContext.ts index a1f2491..2e2b389 100644 --- a/packages/message-kit/src/lib/handlerContext.ts +++ b/packages/message-kit/src/lib/handlerContext.ts @@ -125,16 +125,6 @@ export default class HandlerContext { sent: sentAt, }; - if (process?.env?.MSG_LOG) { - //trim spaces from text - let content = - typeof message?.content === "string" - ? message?.content - : message?.contentType.typeId; - - console.log("content", content, senderAddress); - } - return context; } else { context.message = { @@ -156,43 +146,42 @@ export default class HandlerContext { async getReplyChain( reference: string, - botAddress: boolean, + botAddress?: string, ): Promise<{ - messageChain: string; - receiverFromChain: string; - isReceiverInChain: boolean; + chainPrompt: string; + arrayChain: Array<{ address: string; content: string }>; + isSenderInChain: boolean; }> { const msg = await this.getMessageById(reference); - let receiver = this.members?.find( + let sender = this.members?.find( (member) => member.inboxId === msg?.senderInboxId, ); if (!msg) return { - messageChain: "", - receiverFromChain: "", - isReceiverInChain: false, + chainPrompt: "", + arrayChain: [], + isSenderInChain: false, }; - let chain = `${msg?.content?.content ?? msg?.content}\n\n`; - let isReceiverInChainReturn = false; + let content = msg?.content?.content ?? msg?.content; + let chain = `${content}\n\n`; + let isSenderInChainReturn = + sender?.address.toLowerCase() === botAddress?.toLowerCase(); + let arrayChain: Array<{ address: string; content: string }> = []; if (msg?.content?.reference) { - const { - messageChain, - receiverFromChain, - isReceiverInChain: isReceiverInChainBoolean, - } = await this.getReplyChain(msg?.content?.reference, botAddress); - receiver = this.members?.find( - (member) => member.address === receiverFromChain, - ); - isReceiverInChainReturn = - isReceiverInChainBoolean ?? - receiver?.address.toString() === botAddress.toString(); - - chain = `${messageChain}\nUser:${chain}`; + const { chainPrompt, arrayChain, isSenderInChain } = + await this.getReplyChain(msg?.content?.reference, botAddress); + isSenderInChainReturn = isSenderInChainReturn || isSenderInChain; + let userOrBot = sender?.address === botAddress ? "Bot" : "User"; + chain = `${chainPrompt}\n${userOrBot}:${chain}`; + arrayChain.push({ + address: sender?.address ?? "", + content: content, + }); } return { - messageChain: chain, - receiverFromChain: receiver?.address ?? "", - isReceiverInChain: isReceiverInChainReturn as boolean, + chainPrompt: chain, + arrayChain: arrayChain, + isSenderInChain: isSenderInChainReturn, }; } async reply(message: string) { diff --git a/packages/message-kit/src/lib/runner.ts b/packages/message-kit/src/lib/runner.ts index 13a20be..ea9ccb1 100644 --- a/packages/message-kit/src/lib/runner.ts +++ b/packages/message-kit/src/lib/runner.ts @@ -62,10 +62,11 @@ export default async function run(handler: Handler, config?: Config) { for await (const message of stream) { if (process?.env?.MSG_LOG) { console.log( - `incoming_${version}:`, + `msg_${version}:`, typeof message?.content === "string" - ? message?.content - : message?.contentType.typeId, + ? message?.content.substring(0, 100) + : message?.contentType?.typeId ?? + message?.content?.contentType?.typeId, ); } @@ -85,10 +86,11 @@ export default async function run(handler: Handler, config?: Config) { for await (const message of stream) { if (process?.env?.MSG_LOG) { console.log( - `incoming_${version}:`, + `msg_${version}:`, typeof message?.content === "string" - ? message?.content - : message?.contentType.typeId, + ? message?.content.substring(0, 100) + : message?.contentType?.typeId ?? + message?.content?.contentType?.typeId, ); } @@ -108,7 +110,7 @@ export default async function run(handler: Handler, config?: Config) { try { for await (const conversation of stream) { if (process?.env?.MSG_LOG) - console.log(`incoming_${version}`, conversation?.id); + console.log(`conv_${version}`, conversation?.id); handleConversation(version, conversation); } } catch (e) { @@ -121,7 +123,7 @@ export default async function run(handler: Handler, config?: Config) { try { for await (const conversation of stream) { if (process?.env?.MSG_LOG) - console.log(`incoming_${version}`, conversation?.topic); + console.log(`conv_${version}`, conversation?.topic); handleConversation(version, conversation); } } catch (e) { From ff17c817d49e434e28ecd35254534c84d830f0c0 Mon Sep 17 00:00:00 2001 From: fabri Date: Tue, 24 Sep 2024 16:22:02 -0500 Subject: [PATCH 04/11] update --- packages/message-kit/package.json | 2 +- packages/message-kit/src/helpers/types.ts | 1 + .../message-kit/src/lib/handlerContext.ts | 62 +++++++++++++------ packages/message-kit/src/lib/runner.ts | 41 +++++------- 4 files changed, 61 insertions(+), 45 deletions(-) diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 872580a..4d41948 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -1,6 +1,6 @@ { "name": "@xmtp/message-kit", - "version": "0.0.19", + "version": "0.0.21", "license": "MIT", "type": "module", "exports": { diff --git a/packages/message-kit/src/helpers/types.ts b/packages/message-kit/src/helpers/types.ts index 12c4a70..a7db85b 100644 --- a/packages/message-kit/src/helpers/types.ts +++ b/packages/message-kit/src/helpers/types.ts @@ -7,6 +7,7 @@ export type MessageAbstracted = { id: string; sent: Date; content: any; + version: string; sender: { inboxId: string; username: string; diff --git a/packages/message-kit/src/lib/handlerContext.ts b/packages/message-kit/src/lib/handlerContext.ts index 2e2b389..f0e61eb 100644 --- a/packages/message-kit/src/lib/handlerContext.ts +++ b/packages/message-kit/src/lib/handlerContext.ts @@ -4,6 +4,7 @@ import { Client as ClientV2, Conversation as ConversationV2, } from "@xmtp/xmtp-js"; + import type { Reaction } from "@xmtp/content-type-reaction"; import { populateUsernames } from "../helpers/usernames.js"; import { ContentTypeText } from "@xmtp/content-type-text"; @@ -123,6 +124,7 @@ export default class HandlerContext { sender: sender, typeId: message.contentType.typeId, sent: sentAt, + version: version as string, }; return context; @@ -138,6 +140,7 @@ export default class HandlerContext { }, typeId: "new_" + (context.isGroup ? "group" : "conversation"), sent: conversation.createdAt, + version: version as string, }; } @@ -146,42 +149,61 @@ export default class HandlerContext { async getReplyChain( reference: string, + version: "v2" | "v3", botAddress?: string, ): Promise<{ - chainPrompt: string; arrayChain: Array<{ address: string; content: string }>; isSenderInChain: boolean; }> { - const msg = await this.getMessageById(reference); - let sender = this.members?.find( - (member) => member.inboxId === msg?.senderInboxId, - ); - if (!msg) + let msg: DecodedMessage | DecodedMessageV2 | null = null; + let senderAddress: string = ""; + console.log(version); + if (version === "v3") { + msg = await this.getMessageById(reference); + let sender = this.members?.find( + (member) => member.inboxId === (msg as DecodedMessage).senderInboxId, + ); + senderAddress = sender?.address ?? ""; + } else if (version === "v2") { + const conversations = await this.v2client.conversations.list(); + for (const conversation of conversations) { + const messages = await conversation.messages(); + if (messages.find((m) => m.id === reference)) { + msg = messages.find((m) => m.id === reference) as DecodedMessageV2; + let sender = this.members?.find( + (member) => + member.address === (msg as DecodedMessageV2).senderAddress, + ); + senderAddress = sender?.address ?? ""; + break; + } + } + } + if (!msg) { return { - chainPrompt: "", arrayChain: [], isSenderInChain: false, }; + } let content = msg?.content?.content ?? msg?.content; - let chain = `${content}\n\n`; - let isSenderInChainReturn = - sender?.address.toLowerCase() === botAddress?.toLowerCase(); - let arrayChain: Array<{ address: string; content: string }> = []; - if (msg?.content?.reference) { - const { chainPrompt, arrayChain, isSenderInChain } = - await this.getReplyChain(msg?.content?.reference, botAddress); - isSenderInChainReturn = isSenderInChainReturn || isSenderInChain; - let userOrBot = sender?.address === botAddress ? "Bot" : "User"; - chain = `${chainPrompt}\n${userOrBot}:${chain}`; + let isSenderBot = senderAddress.toLowerCase() === botAddress?.toLowerCase(); + let ref = msg?.content?.reference; + let arrayChain = [{ address: senderAddress, content: content }]; + if (ref) { + const { arrayChain, isSenderInChain } = await this.getReplyChain( + ref, + version, + botAddress, + ); + isSenderBot = isSenderBot || isSenderInChain; arrayChain.push({ - address: sender?.address ?? "", + address: senderAddress, content: content, }); } return { - chainPrompt: chain, arrayChain: arrayChain, - isSenderInChain: isSenderInChainReturn, + isSenderInChain: isSenderBot, }; } async reply(message: string) { diff --git a/packages/message-kit/src/lib/runner.ts b/packages/message-kit/src/lib/runner.ts index ea9ccb1..87ac888 100644 --- a/packages/message-kit/src/lib/runner.ts +++ b/packages/message-kit/src/lib/runner.ts @@ -38,6 +38,16 @@ export default async function run(handler: Handler, config?: Config) { return; } + if (process?.env?.MSG_LOG) { + console.log( + `msg_${version}:`, + typeof message?.content === "string" + ? message?.content.substring(0, 20) + + (message?.content.length > 20 ? "..." : "") + : message?.contentType?.typeId ?? + message?.content?.contentType?.typeId, + ); + } const context = await HandlerContext.create( conversation, message, @@ -60,16 +70,6 @@ export default async function run(handler: Handler, config?: Config) { const stream = await client.conversations.streamAllMessages(); try { for await (const message of stream) { - if (process?.env?.MSG_LOG) { - console.log( - `msg_${version}:`, - typeof message?.content === "string" - ? message?.content.substring(0, 100) - : message?.contentType?.typeId ?? - message?.content?.contentType?.typeId, - ); - } - const conversation = await client.conversations.getConversationById( message?.conversationId ?? "", ); @@ -84,16 +84,6 @@ export default async function run(handler: Handler, config?: Config) { const stream = await v2client.conversations.streamAllMessages(); try { for await (const message of stream) { - if (process?.env?.MSG_LOG) { - console.log( - `msg_${version}:`, - typeof message?.content === "string" - ? message?.content.substring(0, 100) - : message?.contentType?.typeId ?? - message?.content?.contentType?.typeId, - ); - } - handleMessage(version, message, message.conversation); } } catch (e) { @@ -109,8 +99,6 @@ export default async function run(handler: Handler, config?: Config) { const stream = await client.conversations.stream(); try { for await (const conversation of stream) { - if (process?.env?.MSG_LOG) - console.log(`conv_${version}`, conversation?.id); handleConversation(version, conversation); } } catch (e) { @@ -122,8 +110,6 @@ export default async function run(handler: Handler, config?: Config) { const stream = await v2client.conversations.stream(); try { for await (const conversation of stream) { - if (process?.env?.MSG_LOG) - console.log(`conv_${version}`, conversation?.topic); handleConversation(version, conversation); } } catch (e) { @@ -137,6 +123,13 @@ export default async function run(handler: Handler, config?: Config) { conversation: any, ) => { if (conversation) { + if (process?.env?.MSG_LOG) + console.log( + `conv_${version}`, + conversation?.id ?? conversation.topic, + conversation, + ); + try { const context = await HandlerContext.create( conversation, From 14d3c9e40f54de035399f9c24f8d06ee4d27ea36 Mon Sep 17 00:00:00 2001 From: fabri Date: Tue, 1 Oct 2024 10:57:13 -0400 Subject: [PATCH 05/11] update --- package.json | 2 +- packages/docs/pages/directory.mdx | 6 ++ packages/docs/pages/use-cases/group/index.mdx | 1 + packages/message-kit/package.json | 2 +- packages/message-kit/rollup.config.js | 1 + .../message-kit/src/lib/handlerContext.ts | 65 ++++++++++--------- packages/message-kit/src/lib/runner.ts | 10 +-- 7 files changed, 47 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 242da38..dbbc55e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "dev:one-to-one": "cd examples/one-to-one && yarn dev", "format": "turbo run format", "format:check": "turbo run format:check", - "publish": "turbo run build --filter='./packages/*' --filter='!./packages/docs' && changeset publish", + "publish": "turbo run build --filter='./packages/*' --filter='!./packages/docs' && yarn copy && changeset publish", "test": "FORCE_COLOR=1 turbo run test --force", "typecheck": "FORCE_COLOR=1 turbo run typecheck" }, diff --git a/packages/docs/pages/directory.mdx b/packages/docs/pages/directory.mdx index 477d150..1c5f47d 100644 --- a/packages/docs/pages/directory.mdx +++ b/packages/docs/pages/directory.mdx @@ -26,6 +26,12 @@ These are some open source examples of mini-apps built with MessageKit. - **How to use**: [Send a DM](https://converse.xyz/dm/wordlebot.eth) to `wordlebot.eth` in Converse. - **Source Code**: [Bot](https://github.com/ephemerahq/wordle-bot) +#### 💱 Swapbot + +- **Description**: Swap tokens through messaging. +- **How to use**: [Send a DM](https://converse.xyz/dm/swapbot.converse.xyz) to `swapbot.converse.xyz` in Converse. +- **Source Code**: [Bot](https://github.com/fabriguespe/swap-bot) + ### 🎫 Invite Bot - **Description**: Invite bot for Events linked to a Notion db. diff --git a/packages/docs/pages/use-cases/group/index.mdx b/packages/docs/pages/use-cases/group/index.mdx index 9f06474..032a3dc 100644 --- a/packages/docs/pages/use-cases/group/index.mdx +++ b/packages/docs/pages/use-cases/group/index.mdx @@ -303,6 +303,7 @@ const commandHandlers: CommandHandlers = { "- 💧 faucetbot.eth : Delivers Faucet funds to devs on Testnet\n\n\n" + "- 🛍️ thegeneralstore.eth : Simple ecommerce storefront for hackathon goods\n\n\n" + "- 📅 wordlebot.eth : Play daily to the WORDLE game through messaging.\n\n\n" + + "- 💱 swapbot.converse.xyz : Swap tokens through messaging.\n\n\n" + "- 🪨 urltomint.eth : Turn a Zora url into a mint frame.\n\n\n" + "To learn how to build your own app, visit MessageKit: https://message-kit.vercel.app/\n\n" + "To publish your app, visit Directory: https://message-kit.vercel.app/directory\n\n" + diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 4d41948..8495e65 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -1,6 +1,6 @@ { "name": "@xmtp/message-kit", - "version": "0.0.21", + "version": "0.0.23", "license": "MIT", "type": "module", "exports": { diff --git a/packages/message-kit/rollup.config.js b/packages/message-kit/rollup.config.js index 769f31d..d8b0e6a 100644 --- a/packages/message-kit/rollup.config.js +++ b/packages/message-kit/rollup.config.js @@ -13,6 +13,7 @@ const external = [ "ethers", "@xmtp/proto", "@xmtp/grpc-api-client", + "path", "viem", "viem/accounts", "fs", diff --git a/packages/message-kit/src/lib/handlerContext.ts b/packages/message-kit/src/lib/handlerContext.ts index f0e61eb..52095ad 100644 --- a/packages/message-kit/src/lib/handlerContext.ts +++ b/packages/message-kit/src/lib/handlerContext.ts @@ -4,6 +4,7 @@ import { Client as ClientV2, Conversation as ConversationV2, } from "@xmtp/xmtp-js"; +import path from "path"; import type { Reaction } from "@xmtp/content-type-reaction"; import { populateUsernames } from "../helpers/usernames.js"; @@ -147,62 +148,64 @@ export default class HandlerContext { return context; } + async getV2MessageById(reference: string): Promise { + const conversations = await this.v2client.conversations.list(); + for (const conversation of conversations) { + const messages = await conversation.messages(); + if (messages.find((m) => m.id === reference)) { + return messages.find((m) => m.id === reference) as DecodedMessageV2; + } + } + return null; + } + async getReplyChain( reference: string, version: "v2" | "v3", botAddress?: string, ): Promise<{ - arrayChain: Array<{ address: string; content: string }>; + chain: Array<{ address: string; content: string }>; isSenderInChain: boolean; }> { let msg: DecodedMessage | DecodedMessageV2 | null = null; let senderAddress: string = ""; - console.log(version); - if (version === "v3") { - msg = await this.getMessageById(reference); - let sender = this.members?.find( - (member) => member.inboxId === (msg as DecodedMessage).senderInboxId, - ); - senderAddress = sender?.address ?? ""; - } else if (version === "v2") { - const conversations = await this.v2client.conversations.list(); - for (const conversation of conversations) { - const messages = await conversation.messages(); - if (messages.find((m) => m.id === reference)) { - msg = messages.find((m) => m.id === reference) as DecodedMessageV2; - let sender = this.members?.find( - (member) => - member.address === (msg as DecodedMessageV2).senderAddress, - ); - senderAddress = sender?.address ?? ""; - break; - } - } - } + + if (version === "v3") msg = await this.getMessageById(reference); + else if (version === "v2") msg = await this.getV2MessageById(reference); + if (!msg) { return { - arrayChain: [], + chain: [], isSenderInChain: false, }; } + + let sender = this.members?.find( + (member) => + member.inboxId === (msg as DecodedMessage).senderInboxId || + member.address === (msg as DecodedMessageV2).senderAddress, + ); + senderAddress = sender?.address ?? ""; + let content = msg?.content?.content ?? msg?.content; let isSenderBot = senderAddress.toLowerCase() === botAddress?.toLowerCase(); - let ref = msg?.content?.reference; - let arrayChain = [{ address: senderAddress, content: content }]; - if (ref) { - const { arrayChain, isSenderInChain } = await this.getReplyChain( - ref, + let chain = [{ address: senderAddress, content: content }]; + if (msg?.content?.reference) { + const { chain: replyChain, isSenderInChain } = await this.getReplyChain( + msg.content.reference, version, botAddress, ); + chain = replyChain; isSenderBot = isSenderBot || isSenderInChain; - arrayChain.push({ + + chain.push({ address: senderAddress, content: content, }); } return { - arrayChain: arrayChain, + chain: chain, isSenderInChain: isSenderBot, }; } diff --git a/packages/message-kit/src/lib/runner.ts b/packages/message-kit/src/lib/runner.ts index 87ac888..815e287 100644 --- a/packages/message-kit/src/lib/runner.ts +++ b/packages/message-kit/src/lib/runner.ts @@ -38,7 +38,7 @@ export default async function run(handler: Handler, config?: Config) { return; } - if (process?.env?.MSG_LOG) { + if (process?.env?.MSG_LOG === "true") { console.log( `msg_${version}:`, typeof message?.content === "string" @@ -123,12 +123,8 @@ export default async function run(handler: Handler, config?: Config) { conversation: any, ) => { if (conversation) { - if (process?.env?.MSG_LOG) - console.log( - `conv_${version}`, - conversation?.id ?? conversation.topic, - conversation, - ); + if (process?.env?.MSG_LOG === "true") + console.log(`conv_${version}`, conversation?.id ?? conversation.topic); try { const context = await HandlerContext.create( From 0fb7410fb60fdb71379f5de741cd7cfbaac5c7ef Mon Sep 17 00:00:00 2001 From: fabri Date: Thu, 3 Oct 2024 19:56:49 -0300 Subject: [PATCH 06/11] update --- packages/message-kit/package.json | 2 +- packages/message-kit/rollup.config.js | 1 + packages/message-kit/src/lib/handlerContext.ts | 16 +++++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 8495e65..d7d8f21 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -1,6 +1,6 @@ { "name": "@xmtp/message-kit", - "version": "0.0.23", + "version": "0.0.24-beta.0", "license": "MIT", "type": "module", "exports": { diff --git a/packages/message-kit/rollup.config.js b/packages/message-kit/rollup.config.js index d8b0e6a..588a7cd 100644 --- a/packages/message-kit/rollup.config.js +++ b/packages/message-kit/rollup.config.js @@ -16,6 +16,7 @@ const external = [ "path", "viem", "viem/accounts", + "fs/promises", "fs", "viem/chains", "dotenv/config", diff --git a/packages/message-kit/src/lib/handlerContext.ts b/packages/message-kit/src/lib/handlerContext.ts index 52095ad..efeb2ca 100644 --- a/packages/message-kit/src/lib/handlerContext.ts +++ b/packages/message-kit/src/lib/handlerContext.ts @@ -4,7 +4,7 @@ import { Client as ClientV2, Conversation as ConversationV2, } from "@xmtp/xmtp-js"; -import path from "path"; +import fs from "fs/promises"; import type { Reaction } from "@xmtp/content-type-reaction"; import { populateUsernames } from "../helpers/usernames.js"; @@ -37,7 +37,6 @@ export default class HandlerContext { members?: User[]; commandHandlers?: CommandHandlers; getMessageById!: (id: string) => DecodedMessage | null; - private constructor( conversation: Conversation | ConversationV2, { client, v2client }: { client: Client; v2client: ClientV2 }, @@ -144,7 +143,6 @@ export default class HandlerContext { version: version as string, }; } - return context; } @@ -259,6 +257,18 @@ export default class HandlerContext { } } + async getCacheCreationDate() { + //Gets the creation date of the cache folder + //Could be used to check if the cache is outdated + //Generally indicates the deployment date of the bot + try { + const stats = await fs.stat(".cache"); + const cacheCreationDate = new Date(stats.birthtime); + return cacheCreationDate; + } catch (err) { + console.error(err); + } + } async sendTo(message: string, receivers: string[]) { const conversations = await this.v2client.conversations.list(); //Sends a 1 to 1 to multiple users From 1918cbca5bebdacc4ab7a6c211c9b44c10985cc1 Mon Sep 17 00:00:00 2001 From: fabri Date: Thu, 3 Oct 2024 20:01:53 -0300 Subject: [PATCH 07/11] update --- packages/docs/pages/deployment.mdx | 6 ++++++ packages/docs/public/img/railway/volume.png | Bin 0 -> 43531 bytes 2 files changed, 6 insertions(+) create mode 100644 packages/docs/public/img/railway/volume.png diff --git a/packages/docs/pages/deployment.mdx b/packages/docs/pages/deployment.mdx index 4845ba3..cbe7ba5 100644 --- a/packages/docs/pages/deployment.mdx +++ b/packages/docs/pages/deployment.mdx @@ -40,3 +40,9 @@ REDIS_CONNECTION_STRING= # the connection string for the Redis database 4. **Environment Variables**: Set up environment variables in Railway. ![](/img/railway/5.gif) + +5. **Cache**: The cache is stored in the `.cache` folder where the conversation history is stored. If deleted or restarted, the bot will not have access to previous messages. + +![](/img/railway/volume.png) + +- Railway allows to attach a volume to the container to preserve the cache between deployments. diff --git a/packages/docs/public/img/railway/volume.png b/packages/docs/public/img/railway/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..e3163f5b312e40b7d7e795d91ff47e2738ab75ca GIT binary patch literal 43531 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 Date: Thu, 3 Oct 2024 21:33:28 -0300 Subject: [PATCH 08/11] update --- packages/docs/pages/deployment.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/pages/deployment.mdx b/packages/docs/pages/deployment.mdx index cbe7ba5..f1a690e 100644 --- a/packages/docs/pages/deployment.mdx +++ b/packages/docs/pages/deployment.mdx @@ -45,4 +45,4 @@ REDIS_CONNECTION_STRING= # the connection string for the Redis database ![](/img/railway/volume.png) -- Railway allows to attach a volume to the container to preserve the cache between deployments. +- Railway allows to attach a volume to the container to preserve the cache between deployments From 9c7d932880bf7dfdea63679a5a129073f9544fb1 Mon Sep 17 00:00:00 2001 From: fabri Date: Fri, 4 Oct 2024 19:24:22 -0300 Subject: [PATCH 09/11] update --- packages/docs/pages/index.mdx | 48 ++++++++++++++++++----------------- packages/docs/vocs.config.ts | 2 +- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/docs/pages/index.mdx b/packages/docs/pages/index.mdx index ea0aa41..35a06a5 100644 --- a/packages/docs/pages/index.mdx +++ b/packages/docs/pages/index.mdx @@ -1,23 +1,25 @@ ---- -layout: landing ---- - -import { HomePage } from "vocs/components"; - - - - SDK for building messaging mini apps - - - Build use cases on top of messaging apps powered by - [xmtp](https://docs.xmtp.org) - - - - Get started - - - GitHub - - - +# MessageKit + +MessageKit is a powerful framework that simplifies the process of building messaging bots on [xmtp](https://docs.xmtp.org). Here’s a step-by-step guide to get you started. + +### CLI + +This tool simplifies the creation and configuration of new apps. + +:::code-group + +```bash [bun] +bun create message-kit +``` + +```bash [yarn] +yarn create message-kit +``` + +```bash [npm] +npm init message-kit +``` + +::: + +_Refer to [structure](/concepts/structure) of the app so see the folder is created._ diff --git a/packages/docs/vocs.config.ts b/packages/docs/vocs.config.ts index 12aa71e..b2b86d9 100644 --- a/packages/docs/vocs.config.ts +++ b/packages/docs/vocs.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vocs"; export default defineConfig({ title: "MessageKit", - rootDir: ".", + rootDir: "./", theme: { colorScheme: "dark", accentColor: { From 1fb965bb5ce4ce554abfdb4cd53251beb776d364 Mon Sep 17 00:00:00 2001 From: fabri Date: Sat, 5 Oct 2024 11:56:38 -0300 Subject: [PATCH 10/11] update --- packages/docs/components/CustomHomePage.tsx | 100 ++++++++++ packages/docs/pages/index.mdx | 64 ++++++- packages/docs/public/messagekit-logo.png | Bin 0 -> 29461 bytes packages/docs/styles.css | 172 ++++++++++++++++++ .../docs/{vocs.config.ts => vocs.config.tsx} | 19 +- 5 files changed, 345 insertions(+), 10 deletions(-) create mode 100644 packages/docs/components/CustomHomePage.tsx create mode 100644 packages/docs/public/messagekit-logo.png rename packages/docs/{vocs.config.ts => vocs.config.tsx} (91%) diff --git a/packages/docs/components/CustomHomePage.tsx b/packages/docs/components/CustomHomePage.tsx new file mode 100644 index 0000000..39e175d --- /dev/null +++ b/packages/docs/components/CustomHomePage.tsx @@ -0,0 +1,100 @@ +import React from "react"; + +const Root: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
{children}
+); + +const Headline: React.FC<{ children: React.ReactNode }> = ({ children }) => { + return ( +

+ {React.Children.map(children, (child) => { + if (React.isValidElement(child) && child.type === "p") { + return React.cloneElement(child, { + className: + `custom-homepage-headline-text ${child.props.className || ""}`.trim(), + }); + } + return {child}; + })} +

+ ); +}; + +const Subhead: React.FC<{ children: React.ReactNode }> = ({ children }) => { + return ( +
+ {React.Children.map(children, (child) => { + if (React.isValidElement(child) && child.type === "p") { + return React.cloneElement(child, { + className: + `custom-homepage-subhead-text ${child.props.className || ""}`.trim(), + }); + } + return {child}; + })} +
+ ); +}; + +const TileGrid: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
{children}
+); + +interface TileProps { + href: string; + title: string; + description: string; + icon?: string; + isExternal?: boolean; +} + +const ExternalLinkIcon = () => ( + + + + + +); + +const Tile: React.FC = ({ + href, + title, + description, + icon, + isExternal, +}) => ( + + {icon && {icon}} +

{title}

+

{description}

+ {isExternal && ( + + )} +
+); + +export const CustomHomePage = { + Root, + Headline, + Subhead, + TileGrid, + Tile, +}; diff --git a/packages/docs/pages/index.mdx b/packages/docs/pages/index.mdx index 35a06a5..a0a48d4 100644 --- a/packages/docs/pages/index.mdx +++ b/packages/docs/pages/index.mdx @@ -1,11 +1,22 @@ -# MessageKit +import { HomePage } from "vocs/components"; +import { CustomHomePage } from "../components/CustomHomePage"; -MessageKit is a powerful framework that simplifies the process of building messaging bots on [xmtp](https://docs.xmtp.org). Here’s a step-by-step guide to get you started. - -### CLI - -This tool simplifies the creation and configuration of new apps. + + + Build with MessageKit + + + An open SDK for building messaging mini-apps that run in apps built with [XMTP](https://docs.xmtp.org) + +
:::code-group ```bash [bun] @@ -22,4 +33,43 @@ npm init message-kit ::: -_Refer to [structure](/concepts/structure) of the app so see the folder is created._ +
+ + + + + + + + +
diff --git a/packages/docs/public/messagekit-logo.png b/packages/docs/public/messagekit-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb16001cfc504ee00cd0d31e2484d86c185b013 GIT binary patch literal 29461 zcmeFYWn3Ixw>^jk4G=WAy9M{gLvVKw0fM_j0|`!WcXtaG+}$C#ySqC~@x1T--*@iZ z`8uD5rhi>sRY&Wbz1LcMcd&w-#Ct?MLvs{28fBrU+w^s!UtLw0wS(!1cN0fr;GHR=x$q`OC1E6fPP(q z`Ln}Q8|Ql>!3ZP>^!Ijn%n>O_=cEv4QsrM#Q6UruQ)Gv5Bw3Dxq>-WhT%#~e`|a{D z3kJ?XNwS^{NE_G?u`1jIcJCmH)k)=<*Gz=oPlJO9{rP>-AUJrtK@APcu4n}!mhY{^ z(4?<%%>?(pJ;}0JX~c95eC)lb?N3(nA(4;mN_z3m-}J6qA{dB7m7Y^&?IErF%hA=m zJerP9)kBANi!e!+LlSU{c2BZ4a76l4Nb?FA;d-`BLhxG%A`=?n$jkt-AL_@S)&P(zB{2dN0m(aDAJikP;qhM-^Fe4t zn?fJ%Fvvjt`02aM_}f3B`n?HFwk13wneZ7SNBZB%la9g~lECRnf2;QET0!r?=!bt< zPlM*e=}m!da(r676g_eYKuEHMCC9z^qK;oh@eUn2h_ss|`+a%Dl;H~&M&i65J7 zM3$3h9W_5?4F(a0H99YX3l&mGkDxd%BySctk_^X8a0jZ+FS)#4@Z|k;7Hj#>LuijB z*ayRn*70ikZ<-?nGG}B92*)FenV{OQeR-~~E&@@<<)k*1RjyT8 z;cLV%0Vk#GF>c`;;Vt3%TSoU!BKv%Jzw?9gLt$}~?j5O~$j7W=(|28S{J8LC*J0G9aRXG&bPTfadfW zF~FaLz4-y12}uB5(7|Jis{_l`AyDtp*nu>Ty5c(q|05EOPDJzy&8QoyQZyCq-NsKC zvh^S7C@?&EM?bZ6;_&(x`Tt`ZdJPC;s7E_V!67}Y^+ zLDE6^!A{-E-OgWe?0m$?_M?uztmM+52gb_Nk(N;(lcrJVk~_tKXlUti>3L{jY4d0h z;zHsEkE=j+$neN;Hp|3Yi+5Mk&@+ zJXEGG(Jro@;yI|Erk{!^bSXsrKF;3zUCeCDoMB?F%uX>!A|}_Y2)A%xQYW)P_VSkr z&ikCC2@Q58E07i6F+-VlXrXal&&=Roy2*u->HO)6vZCYcv_joN-7GJiCS|zE$|=Lc ztv!ZGo=gYn-AVYa55pgxK7>k4h1YX#w48j=71V9DF0xKLkzJN|cWe=Av24L|fA5ZZ zW#^^+{PEfBA?0f9;5KXuZ=WNYugY=DH_GL`0<`u|ji0#h7Lm2yze5f~{`p=!;PCy} z#~a-JkN3F7xMiHYhEo2Z*vZj9>_73+LufQ14F=!aU18OmxF=P2^ z`3U(v`A+$$!!#zy)sEHECL<=#JH0y}cGyNNhEKI389!ntVOubcYB$%_RLNB7e4jU% zH_Ef<`9oJ#T-j(NTYFQRZmw(W)fMo)>-WH)`R@+X*tJfzBQ<5eTfPP^G|VF$aW2$G zko~&&NJ*f|QQW21lWwMOpl|frFWg7Elr@*tvA+HNa)LHT{TE2^Atk58D16ho&%=nl z&o7*oXp()WHl_??wy1MIfNh$m-!0rB=aL?W52tmADq*pleHMP!zkH-ze|c%S+q%}e z-76{IR4j*s@uVvh2v?q8FL2jqnk?I zmHZWg)3TK`kYk2Q1|uk~m8z9sm2R~UYy#$QBLt5nat<@>5ba2NOL$kl8ou5#$j>m$ z6hSbMaA&e-GAgirBDED=>mr%V{FRxU`C>4;hTBmf0#9m4N-x4Y7huWMl)OxQK*UR5 zLn%Yaz+@>pw`sd*Yv-yAgZBZil5PW>E1vtQiWE_-GDl5ZAm~p>I-VDMz()*1|L29MmGAe3WBQ7t8Z=cu&Z=#hMgv8N);DCJCIyEmXC<)C$PIlz&_ zEC^wX?3F8#Ioz$Pw`gE?1vgJO>$P%uQ@(08x;zYCr6ZsIQpIgaYE9Zs@`8#t__?O4 z_GM`HKF(g*Ap)Mmf4(!G_Omi#K~3n97-jZoQM&T1%rQ=2u*(*y z8^$HxW$jvoXGyo#Md+5Iue`8$N1$2oBnq}UCL)q{!J?c#|Ffo|!h{Xm8SWD92%D_Q zXv+O}Y=@bd`TnDt`4NZV9frh70WQ~*a<^Ew`AaafGlQPylQa15Q$B0}(hk$!1La*p zGWs;Son)U#g?|dpdMHfj0yZDBUfZ2EZN-&Rl98s{d;;YXWdfM+@~}}KE+L=UN_*#z z<)r;Sofh0%hID! z!0z#W^<$gr>G-PRpUp$L_0dt?$|kMi<&qK?{3AWJpEF;~-EU>)9Gq<0S9-M`7s{M? zos1vbK?AM3kIJ{JylBpu_avJJ$E2a6ae-!m(uYwG``6F!lisI=4TK#_h(xe+xp5GJ z4s0EFSz?T^`f4MX`Gk2Y*SgmRvSXkN#0nndOjA$H)0aF?hwIt6w7zOBj0U8&*fQ-c zC0!0*QZu{ib30F5ZbV7{l764C%rslq_=o6a`TDlY%G&B$eW`+7@49|r3iRi>n`70Y zpaM=u(B-Gs=EX>V%5fdK_3}yL_=H=EOVh60XqvhU(h0bg>lU;Q-iN-1+eUp)r1orh zDWO}Sy?ZVJ8KFhoC(t_EbL@UjaXOH20xMr6Ka_zhSaM=_z%zqC<#By~x4XL9a-Jo}OGGvf63@qlh=wkTj8%g`fkD;UQol z(IKFLBS_!{0f`3z`_C~1gcKzH|2bBIr1|$fP!JG-W)Lv{zDEoAeEW+8-azSpe?mtG zK)?at(1EvKCe(l34SAIb{olvHH3(s4QAtVQQ`yMg*x1_PyN%=0)Q1(|1cL1sO$P`F zY|6Jcq@)tX83Y8hn3;-(qlT;uuaS)vli@d;uf|NSR<>{TK=8Zr0*6+{j)o+zR+iQd zysiRd|J=a~9KW4rCL{Uh7Do#KG7VV;5>Xp_V-ilLPfVZ4K!_wHB>eW@On8;VKL5Ko z@J)d1yQ8BmFEg`?iwlzr8r8DjO?wU|MT~+ej2-){dY^&4*wn&FhJ(FE6glRpP2u* zVvc4e|1ZVfuKcUmKjZpWbNp|W@hX_P8e3|JnOOl-4Rj5}@#z!)Kh69>xxMVKj=})J?R2*AgP8$w`@m z^wy%sma$1M2md;`=_2Ji5fLbS7!n9bcp(TVG#`ln|M36wd5A*$@@tE7#rJLQeecN5 z&bm;k8FlJ^uQj_}h7fVvX4ZVQ0dGe~M-LJSf}5MerT5ik+M;=xqY@J}box3L?a~PT zwsa=>^myINIEY4($hYHj!*$){CSfraG{e(aiK-S<#^c{vT z{3MmiW-14M4k^{F&i4aTa#<~W15-MmuITFct07=%^<1UW9)*0@7xUL7CB&Jj$Q-@g zZ}tfvVa^!6c2$a=KU{hmjxRRdQZYBExHM|?R+*LQa2Y;w0*m$0E)dVSg@li^{Cr3f zxr%I{Hbo`mb3QTvdIhyhT~0i;!tYJP!*l<;ncMSfZ=$Ow1dC56UnVI>HkqBL(P4LV z3IT&E_W&1BQ#k0lOur3$k3z`nxKL$0q;;}bcd9cWVKboe9&R&@>=i_#UcU5reK?zO zf6{bnov_-khl1cEG6soOM`{3HC?wtde6xsTwNzhu^>BSyV!hJb&{`U+);O&QD<8_8 zU8B$NqLTUw{4;1)ZT%gLqp#pTu9=*fE!A`gEGLYlbYTy7?UqrAv-WSj+X(#=eV!86 zn&3|RHM)VZ_!np{Q}|~@>(j+h86y6mKn#pXmMN6K^trT5-8XuGPRQ)Req3=3m5upw;Rz(4yz{ z!F0r6&ZX5ggL`;|ivMQ(AFD-hksA3VVvq9=2t-1~AZe(daHw*6P0m(DarEkHt8L!i z7{c7zZJ>v^P-&7;arcDg4_97?^33~zgZFyM3msy=i9^W z<+f{S=YDOzW;ZFUzNq3z%bG5`wuWGlTkVh!E5G4CB8k=BMN20zm9-l6g_~3n@C`xc z)DQV>qoFR!wtHs0ewG4fwS#sFi7DM|NBFp!uJa6Kr@~!Bea_FIxFespu)jOOQ`5@X^QUGeB0P>7H=n`aEh< z|A4!Dii%9UQ#)R$ZJWNG6qE?VGj^9SP57oMK^1;lW3&2F<8(L^h7P5iB+%eS;+2#9 z8oQg2I2fX}xy7Fi*0^2UXE>qm@Q zMAiQ$@S$b(w_%sQoZ$0Sm{IR9mX^nPR#Mv;P1Cse=?BYF&8;LcjxNfaxoiAPl+sH_ za%)UJM1h|lZ8ub*x&q$Q=gXO2<1lJD`gU^5z^cGj1jO0$$hBiGFqf$AEHddfmU=#4 z&yGYk*RQZ2m9`Hjv7M@d+_=kyDJX_xzP729VGM2fLL&+gDa{AkHE)LVg}gi*R)k$2 zH`VVyC#<@RZan3eu#KOv8(b}HBd zfAi^Luaz?GI>G4)CMvAv)|iAS%7?6tg@MrEHUCdVJsatVxN94%Z4rRkV?|57fe)dGY1`pIqOa4_DkcV0+T zUB6%ho#3DEBDvPdy)&N0!A0-=iIfNSkNdwUQk#eG*sp>gt!4#0Zk8&>Ij@|95On#` zB6UVpFrFvVc%2?jMz~g&=<@bb$a$ z)5@Pz#=H2BEzN>IORs=OT*eiCegunaYQ+lnI>^58t+pNjGU629BBTcNkhblycDngtffB5qv?*(STAh>rH&3feA zZ^k(j{`oHM6?nkRaU!n;B7K;}E7D{lv24DS$+5Xvh_3RSO}G1#1@)i3hZWd|9eXS% zD9@JNcGG5;$7IiFuJ#bcmKtuRl;yErwqoQ*wJX2&V1#(?taeWi$XXd`Rd1Rw(J-3?3ZJlWsKu%IT4_R6Fn)369>*b%dPMW z6HAOwqQg|O$x||HwE~%mH(|$f=uNJqBqdMun!6@FEMuCx4|*%2>&YLP&DQPtmFd(< z=Uhiqd4_aRB<5Cf#=Aaaw=whI%o!OQhoLS2JIW~A*5040BxX^Pl@uHLc9OTFV;2T8 zVzAFRL08Rgt3OIxEC`rcDDWW3VhAZ?-h#7_-;M005klLbpUJ|sR52JV76Z^W=b_t7q-EECsgLFsSl36(1fj*=p;(GaRmpixNgnTzXvG>T+Pf&wP$Pp}yw2$r6GUeK1 z4uV2!nAT^Kn;Yex1kIPDe6OcsX#ABi=v;$O;;>Yi!;C{n_jZ4t6f^vJlBMb@sr|@s ze1C6I;6z+}DaH8Y-`|6yza$hNQrX+o=k6Iy41)|=*0S;(%G{c`frUp!EEW9gFSt;> z6Z3R^T#ld@+o)Mx;z$!)xn55W{Z;_+VR@y&RNOxSPn?T${8>uXBnD%{NOJ{Om27y}96a z!fd?t>%Bp{KANwN#ujIZX@EazamZ#OmgkA*?ok zb0vS4#y05RYq4S&t=qf~(pR|tfrUj{j&A(8OwUH?yf>begq`B5toW_5|D&vFHWm>i z?U-OJHJ*oX7O?jl<^WJIe0Tect=%7oGTk{|2sKPGQBMA29x!Y??l z19^Xsw3SyH8ANcK3kC$BQC`y%lUsWy|14J;^|=zNv-$riI@k7~H<@wUOMf(j5oyra zJqsoTF>3!gdfhL`ko*02s;nhmSiov$IO&jKXvwcDx^BD$t9SfxhUaz?UV~rcmh+-P zLiRNMK0jQfPHCa-u^TY{90Im$?T;ZMUay~jMvAuMLTQoyHh6t`M&;Yo-f8_fB$rmQ zbHMbh#VWCtQj$#cCo4Zt_sAb2XS^j6G0LB`(qtt0I)Z@bB3#erLlQHI^f8AW@;$LKlY1w)3Ti;MWwPeC?|QUa+f&{Aypx-r}M< z9omb+q>@ll3Kdm#WgxVDq!VcTo75N#Ye=ZKx~`L|;s`&s!p_!gVt<7(m0ao_GmiK{ z?ySZhwW8~5CiwZG=k|D!ON5kg<9Qri1l~2&r&X0%WpYn{2_=pyk|nepCg0hKkKvA3 z0IDyXu%y;(GGBGVfyFc7_js4-&K>>%zp{|p{jt)Hhe{4Ajf43Oi(++wcuz+>W!P=& z^!YIUMiy^*dcL&iKwD*kcP;CpSe-}9E>aYioPbz6d|!t5%e;0Ajdz^W#H6S&IStww zp)Vx#JLGhBv%f4j(CLM$O;m%g2TTDSY86PBG?5Bb-v;~;vFIqie>dm^9$>mcqvO7x zh(97F%?ZN8R3wS?%*?0yJ=c3+dpO;!w0OKa(j&7sG>L=Yyzx0LHC)Eh1v2(o+{<^{ zLl)8cgMDI$4@0pT@nR<(oL4He>#Rk?KC_hI_IA$zguw6JdpwG%a$S#*!IFxaubbHy z+e0>LTQ>(TLTxz@Nood{^qCn+L3tMdSk!uhw4S*1gaBGd{cXG6>DS;O8~Blc zIgE}$C1Y!h35&RF#QIH5D22^*lm^x!v+u`eTaqr*CO_@qg4> z{R@3cl%g}S`fkkQ8k;yiYzH>hsAiy&X%&hw{K{so&<`XA3^TF0fEkDJU@VMR;0&d{ zjW>YapOvk5?DxfLspdYm>|7*MUrx2(VDQ(m8VJc8*@{~yT+PaTK z>=&BlVx)WB%nxk#hLtdtJn`Ga z9g+HY)Ew?_O}$L86tAkMfnbw7TQRb(Xe|l>^#Q&9sA}lI!kK%PmrfOcVfpSt6~8{+ zl{c&Xv7Gm7dp@>F0dN%WB(6(&td&;TV8?hNRBVma<&GY6I4+wZz=vQ7uXyS78VvJt z#&e<_*LlcsoX^pr>=7{Ul#vzm~9L>Rlwtq&7fr5De9i~!>fM*;l&L*qJYg) zC%8#G6nneQa{j_!&l2Nis2NZM{KSO@*LY;99Hcdv#m^1B_?UA(Sw>{X{NcU6nv^dn z-2UBy*`R4Zubg7idvvqpFea$No2tKjyOEyV2Di_qr*`RcYE+|-?o!3-M?08c}z-O zuvDc^npH#1FzowxeQurMYMLwCVE^+cgpwz!mJ7>|73VZCBxrK6=L%iY{Zx+K&}&DlJRdIV&| zHegxgOkI1qw=x)1jOE|AZrS=^S@Ye}T+vL%MN$@LNLrvzeJcU+4ph@7OpM0^r?d1WFu4I_KtaV9c1>5W8es@*?*e-d^1il?V z;rK501A~pTX<+{$HF{;MAC1fP+l_B*KmG6_;AVz9SgU0Undf6D$Q>TLv~OH>n$<;6 z+L5J5XjR>zzB_5V-$_Z)wI87Ly*f7sO^We^dp>lCpwg$9JpVRPIjFMR?4@<@yd*TJ z3Ws$eLBogn)-a+3=I<(-D~z-L^K`Ryt6PQ>b+!@8tjDl@8>Q`;eO&RkF@p*XuR<

mHT<2aKVXDrZk*5SNdz<2xt!`>9<}<{7 zP_idCr%Hdcu0;jU*hup^q_K5gfzuc->N1~`KDjmeNy9Etb>U!Nd`9K(SxZmiC19(^ zh&E{Lsu7f3j<-PHj>VOKq92`a%o@M+Q5RsKH@9riEHo(G{>AXK-SEGCxNiih!GP!< zNavnLr~ZuKkg(uZ3vr5}8~to%LEG^6sOYWSassP-q*B{wV>K-Z#t5%guJir*>Rn@V zFlu)KY@wP&*S8AdzSqB`oqZ zlq8W%g7$W}>k|tWj+emh`Q62B29~ zdW`6irKd(VMZp3lt%Cl+K7FKXZcuofja@xLFVo^})mK`CeaJB`)t)4r*3EW3Sn5aD zUsb-9q5k31p}G15Z$TsF_WoL75Irua;Jte*d5DE~q zo-HyEF`4K}=Lzp7w80Y+NdRA=D-e~rkSf}Sk^pt! zsDI^R4df}}&T0A^EfSS_yQ?Obr+ipek<3_+S+p_5=VOB{%X5>a9?AgOQ^RE^WSPLKlns z_4>=@fR{alMZ$h6J)_pFwQB42w-qH>fmbP1FwD`m$Si3-n~F|1&G2&m0fOfLV8d## zu~?*B@Jg?oKl}*H!mZMk6`^vVe>zJM#&y_c0KmS7m5%8LrrLj47y_Qg?Td~7nK@Vi z)n#()WRQx=cR-YZ(|Ra$<{KA5eiKxev3w{NJ*VpBJ)FpT+?4{iW!YKQxIBE?{u7n) zORijBqI5579XPeCD;l<1f~c7hl~Ow1vCK{L!mcr4D+i#$`E{@5KI6TstIqHBrLUFT zzktjalaOf~C#Fkn1`eKXl2B}h%0FA7|9I5Y{(dG5YK{~H5LZoKe>PG|c813Iodvgs z;32=`X}6ab=t=0M{;%+O_w0!5xt!Hpni!NMohf{Vpv2>Zp+S%tNfi~PrYbVFG0ES()bMS zkq+q>v%Q7ft*tHO?M8$QN$Nw>w7`?&#)`_lKl{3i1e~_btplvg1*0|=n4;Br_XHTNXQ!91wUMEtIw%5=Fr&YP_OO3j9R6dO}t zGY&{>3o0YDC2^fJ4r4()kiJ5W@R$r5<5>Q!E~k3(aRro8v7dyN59HC(x`&(SJ>+cr zo1_)(JLGuIVQ%H+RBtiXsjlc^|=4|Np4HqUBG1I4FqksTQdqH`hY4tn~S zoA{CQVb{ts%$i@RE?v&le6FK}OhyR_fq zK8Fd6S!sA{J{4I36ZLCrLQ}qPGYbcYlL}_iIwlOsnjw_ZUU{sA`GUYso?BN>M{YDd z13v{3EOMYi$!Fr>0T*T@|YtvR9>CVN_&k+J z9x~VV>Lv$d3a@OxOOsh2YlymSeMFnLkgm;{tTqlhopmmCVB+bnrNEQaJ|(&1tSIER zkiYQtl3mBr_-(u{>u7481Vhf-AMV6YVxc9&`p`+7UYi@Kj`RyHw?Wb*V{sG@) zO?rvSU&uqWVTA}a4j%ru(Uj7|ekbCcA!0}TI_@jYZoZ_y^ni)%Dkc89h>d~R0>muY5UEc+Ws0W?Xz5qC05Mv_XgW@(Nybwt~0svw=u|jK%hvM;@-#G*98sUx7 zT~=vrX4f@sB=K7>)l<8it{m6qe)+8pdMX^p(Dyv=DTr0trC*0a=p{n=j1~#K)gJv5 zaN}4=m?$W(W;G+$%!BK2#GVS$G+MmBy0A_GN!W2B#iljssK@csg&{TO>hv7D-7j4A z`}{No+cyu+)i4ygrs=0k~+*4p9dM;G8=5A0=;?R9b zI~I3~72!hiyP^S9+;7xLbNjOZ-F+(5vU|0=J2R{}_=$S;+?s?=r2MfvD^siL%R8nqkf9qKm$4L5OwW=won$neoHI}pcxjOx-QEcl7_`u zA!m5Ig>#!RJ12sN7emai5>irwlBmtyi!f5|ma&)*184J2Yx`73dM)m?ynvF$Ms?8( z#WsQvPl?UVHT$Erz=0Tqy9Ie4bod02KhIec#KXDD%{qX?^;}4A{>33^fv(E+tCf~_P1pN#es#3xrHHl@o z?7P`ra?-%xS}AesjpuF*dCSI~WQ&8si%LPRF^_#*+Dlec(A`=ii%~D;jZ(cx7ug@; zLEbist46}z^qTPz8C#{DRl3fB_#R{N^vhpPpIqC!2JuZI_`gL4zT`6?>}+n?+1p=0 z>&ZuWoHP_f^O`61lu2<9P*s3wo3~HfUSCw-h~hir6Y-TWd@e9W#reqbV>yC{Gb8~J zIQ42IE}W-ZXXPK{;r{^(!-+H=r4#Wkxrcp0=4BCCnPXV?1oqug| zj3?Q(^m=I)ifxI$+jiUrXe}jMG8`PiUcTPC%j0j|no?4*Ay^iasjH{9u7quJH2FOr7O`2h%25Tmaq{16zX30qnBemt(j@!HD@ocSVr zGsDcD*r8~9?Fxv!%kEcul~RYPa10I=LpA^c5S)^VJ-}p_r*#x>?gx})Q<&MtVY>i_ zr~%v2=U@D5F;Q?AQBe}91A&My+G%t$)n~iG$lGy&_Yp(_yu$IP1wbs=OVyAmR@_sk zq4aEP_TyzidGo~}ZGJ*)E$$z^9c^G&vZ!gK&3WWg<%>zGP)7$B+c~+AZQMaZ!gs^@ z?xuT`|D%F7VQMRvGe)k4>0St0+HhRi{p878~a8+*;7G zL2RlReJX<~(&25-&Ai4aE`Qa>H1?8@)|8}^;AZQQkw@8fs9oF1>mz|Dkq}6$oL^rg z6LHA*;slmr4$F`qSNPqDXU2YfyXu`meP3LVvDusP!~lf<^ds7?{z|{XtL=cJZrR58 zFZDb2Pr55NgJU&wRWKL??KZj@la@E}-ckXY(P$Jh+vjR6X7w^~xGpZr_suGb47dj0 z&+_hxT#E(zN-f`>3hg^oVM^Yv`b?W+F*NyU^dy2oAP0uR@Rin&~ zylCb0j^sx%cICq`$Z`(&R!l*sa^K}_QaVP$Y!koQ6mQq z?0bv0L7Vw1V+=sAYV-p_@VRgCR$=jd-RBv4kfP#=)MU1~*6Ewh5fwu%Z+&sIXoGL* zE0+?L>#}ByvnqJIlF)LX1>Zvx@QIAtoNP0LO>YV-yTuHHaJ+{Ipg@Ml(kOma zoX8e`odR2(Z}dbQt+olOUX~?HR0On+ap?k)Zmcj9sZW!&Od7vQcC@}RH*7_3m^-cP z2K;KsAD5rf7`gjtVl74>NcxuEv1V`Ml2boC7*#E{JUQ9Xo1h{l@TYEn(aqpFs<0^) z3GQ-x16P}99*CPw0|8z<^UzIhL?And#IOBixv6bdjE!D|3D}YS=8~mbjdja}ct5_;Fy^C>Q`Xf?UtmqAzzw9tU9N*xjlC9bO3ZyNLjh17xK+Uc&)$ z!}QFk-|89B>y{ALTvyB2T7PQUP}~Z0JpI8sMmihoY$lBAwi^(bz3F^g+ed;nxd4>m z4RZomn2?7CUNN=JCZyuoXXgoKJa1aG6qcFY*h)aIcCz}OD?WW5Y`kF3Hb@YP96Ah7 zY7Zz!v~cDqgkQ11*2mY3f_Z>1+~vWwxkxIzKU$OJT6V0~zQ8=H$iZ$*UWnl!t|&^v zMn!??drL`5B|Ce%9BbmiIvV(H-haZ!+wimni{dFMBzs&oWhChJ!wtu1z0m(JSH`wEK&Tnx?x=cE zs~~7O0KlQa2MQU=8uKcWTg?PsMiY*e13F+Jw#_`1Q9%LW$!5M4O!#-Kmd~4g5rW@S zP(N@VePOKixIK}bM*3aAA&UN3lk{O70xrfh3VL^2=+eK9@g)3)bgisa&G-G@JtSceJjK+o%XIz6#cmLOc; zb=_axye-vpJ=Bv$A?_2KOUo|jBGvf&XkasDl}zFc#K|Us*Q18+a?yh z*Ki_>1h3PUK-O8iBow{sm)WTE^@XQJYEkAETCFg=1A#FiP`WyMKfYQSk*17xdKr^ z^53I`auvA_n67%Gp;X*0w#hE+AS%iwKiDY%^I9{yIoIh9Wz}l&n}g9*9b;r;u*E2QLxE zYLtdRbOt{f+5fX{YyGgI?d7PbAf1jN^|Kz&OktK+6+sFe|Ead22soQgFfDgDwBg)p$KY}14QF@04Jkjzwpt{g&86jM58mJV=LgZ=mn z(dOcllNWT5f*M*ieu!puwMIzzL^bA5fVyD5DJ zDiDlOvhueJ4eZ*#&y+L`i#g$C#Exz7CFJl2++UlEde{VeL-kwhXB@r&qLu}31XG82 z@StlQTlBnn5!G#`02LSnN^36_mPV;(bbgLkAs9uTdnuLVCD>keNUO+_IJw4Q$hRy? zVvK$u1TkP49t}Flnudux-o?2Jdm@)HH}c=(C}I zF(7XUmBPeN;_KzKzTki66V z!SE#rMoFy3#e?m56N3}|q}j(9qjJKz8ZPZw$rzx5%T`{A1V z)o6^1h$6+kY9FCUeNfr^n-`i9EBqC}2--tr&nmq$1M*pR8lbTfK#zQVqmJ^kHKjj^ zb~Uqxc)hPTLF&JkWUS@@EmWdMB>*6Xw7j|1=}Rp8 zOSxbC)si_7OzDE&FY=WO&FPxF+mcx+S>^}J>12U9GuohPA^Z1${qR|Yk>fkA*#&Hh zM<_9tpW+d7^I4}RYpdRezDDcnnj!DJ5vj6p&hKmOzN;Q)VIEBz_y^YMn2oi~8Gc*e zCaZkjC4Zdnf@~ns@7ChU+*!mo9Zp;im9x+Ce-6GBi(7Ouu8bJ}M(6dF#><3GP81-p zS4|tSD@Z&@@Rja76^LHt?d+kd+}%h(XM|`V8Dsw%Uu+Fbic~xvHv{pGo?M7WsSlvC zK^LAjfBg_X@%7d=fMVN#@3#}EAMNfLi6)S3x@EVq=+)R)jgph_(&y*8AbCiLyG40E zdE6WoCFs}>?EC&0>+?p!VOlD{{kyW#=wtyayQnK}W(uM{x^M@neblc2e5&$@g}#_W zMTA&V0g_=i;7qNo zytu16D`n&F+N9&?uI&KTL(Qzaqw=E>QSF{s?zk*m=x&BLI6_2`-JG<8^zA9Wko|rI zY*l&rg>7KlkF>{ebGb*)gF78zHBSp#HMW-9Jom+ul?%45*+)Ed0ogVzo0jVt$a~zn z)gFfotqd_WWH>=;vXrV`Ek?mg9{N$7*|ZI&GBhW5b^sn*siQxcJAaNmJnb_7HDS zTY+qztZF=OTtC)Sl>9u> zC0e}5ti9)0A=}bwHXang+kI#`FyCMVN^$33Bu`I1${Iw7)6XI<%TVPQ-=WYx4G@Jw zcf92#uW3Rl?O?p=TcN;mG*ip}_S44-#=dNPvBpf<3h3Qa5%<@Ma$2Qz;ZwRwrM}aks$_+X?!^3}%)r zpWAD`S|l%x0s`fW3fn5~u9+7@C{wCfLsYmeA5S43G%(K@!0=_Qr;Dc( zCvqe%_gOO~ziw6l`Khv3lJ0R|FU!EP&PQ{0b@(hpsxgnM>bk0q8{NT=OYkJ%H_#Tu z0ac7t;R#x zYtN$Vf|OH`L5wFU@oAZ4UW z27ddkAkAQ=HRm%h-~otV&-;kOZ<6}sM3@yaeKa4Rh713;v%KvnJ2@fQ>g8+Mme;fO zF2Q6Lqj#ZAcS1zH5ybj$1ly(<{ifze%637_bcs4K4}kC~sB>adsBXo=1i60nF6_$X zBZC14W+(oZN8{agJ)`|vVzOXlhh_IF#%b5?1DVzeZ2kfBN~Xk6g97WtKa84c9_CEx zVT0s6&LNZ0K6zUhgZy;$b}(HVK|AlG!)L1j;Cx30jP0#b0Us{>G2eF#Y4Zgzg&U+(I2Iqr>n zEjPIkXFkOn@etBv-iP7=`2@}K86aKemaD&n4|*UnB{zV~+^Z@gsW1@?p5wbW*l+)l z${gJ8WF-1mZv7s{oFkAOs`Ci|s`}gPE$caBx4EHzor05}3V>w*euxUUNNbJ?gm!Wr zE zAaq$e$HD#W00Lyc2Hpy+GJ9(v0=1okH)lyOG$W!;?GxbcqR4sb@a8K3ZbNxCO$nIy zme#{^yP3tg%MqH359FWOCx^XkP8MoQf(cnH$1{bQ-%F-`4_wT$-pL)WQ1V+v_6m0R z=NB8cY3;Y_I(9tl?EyaS$Ccw<)g($%CV z{;Zk+2gmgcpnEtC0xFXY5ZPJXw;o8+Qv6I$XqmCVC5@zu*m44N<;9Ur@eGidfvLZc zG58E@DdJ-w1dr@xvl?SM%YWdbxKXzX_P`pcT#>jee9icw*-I~M1>hTXS=P(i<@Euj ztdd7C@w7Flk`JOD^`Fs>qDA^QiVr>~0Sbxd0-(ubDfz&qozD~L%Q!s5(kh$FW`Mlf zfy|uKDCYFke12e=zSaRr>u^U|ktgQyh`Os|uQ`1uGTyP||2)$m7AO;`$ys`}Qf_fX zaBzTz)iec7{%I_=#|S>Xj=iW@c%vECES-PQ%Mz!)@=(d|z6SU9c z+vrHv2%)MrlykWYiheE+_lDt*Spdc|HWAqlLZm5Mv!?ytP2A;)uj8 zgR=ihgTwAuErRwNBDaY!#PTjy^1jTaoV@RT!MGK)x)fF4Fd zUqEg{0574f?e=62i()*mvvrczo;lrqCRGIS(bdPgHx~`8*>e#g-fMF&3GX2wCObB4 z=eE>d9A@gAVe!vw0{3jC`#73!E(sFO$7s@C#Yge&Iv|gB^pL7~wzN&XyJuoxPan33$asY60N#J^MDp zAb;b2(7zf)+l85;9oT1b6A27E!&A8czM6o5&S71^=Q9#+sBe*-R zTMbFPJzkL01gWw;#jgA|gm$Q36en=`XJjP*S9#z4Pxb%C%}H5hr;?16tRj0ml%#A~ z5z350M##t^A!S7Np2^-jlDI%H(s*Bjr@<9DKQAAqU5gFa#RSZq8lQYP0h-KXr- z(a6? zzKwZZ(sAzVLxNu(rSG(*?Qqd)oMIT$uAqr4V+ z1AO>&e>-{fniBE>GE$10=zl#rqz~K~d16I9g*tv?#8ar5q=FcKq%ym)iqF&GFs|AK zhU?5Y!%Xiuo%AvTn%9DL_+w}PTL;P@+kNMa#i0e<)SX`I_#YEFa{1WDiA_w`nFZRg zbXTUENO4p*J$5|387`5XYmpNuUn2c{W?{UI=HL40b^C@J9ejeuwZ|Ch&QSuV5#(c! zn()b5_2O{R{UI;AKNIR_GVwcY#>MNPo`;3sWKC%45ELVZrI}3379bL1@dDlqhJuGr zPTg;1)~}>G6SeN3YaZeki(mWnUj|Zwv+rih!zrhG!&TH*( zf?eoO!(K2C_xSUFen-#4l(8@wIS0lDOQwcb(!3Z=t~N<6RG!Z#A{35z>wCCUnaC$S zvSY`TbbM1GtR63>Ys-G#dl4Zp4`$bz;7%Bqh#GZke_FS4J{BrBdUL9#8>cP>-Kq+_ zYy|RgG}%FTLf;or0rT4s{_)3MBkZ&<07IiHu^M_2uekS{>u{0b5O-&&PaD9Ua66w9 z2PY6{&0+_Evy~S;E01P?oBFnrlBBWOCQJfodxcra)fd)i{tIun5&)R&$SEUAYk3MHs z*c(mcW`jX4gJA3`^-*BvbE3z1l?WxBBzLJE_-U(?cPbF zeStw84?B0}qqF+zt^Z<f177d%5G1N+6wW_})RV!1b3ah;)=P=7SWveMbHh+52DA6!6#q9FIQ_=23y@7zi z5cYhn_H}5_aZ7`TE6~1BUAR`-YBUI9xr3~j7{jfmrZ!wEmJ>;)%NIw>anC&eCt)AI zhz}ty$jTX+VR%h1cEYTyoX#qlL#4fZ&lma9ZUreTMhjl8KwMhV;li&DpN3{qKmpah z0M3MlrLV46|1=gBVFjKnc<9}2{?zbrtA6*b!^Qt`kxan!h+>@D$-ymY5UEu6IhpHp zMHPP+i<`OVW<-4P@qim0<>ZVLEbs8PZa8CbbuDC=f)HFVPBo;ZU(&dp=t0BWs{C~Y zF*entdb|tO=WQd^4_6%IP15LWD#GHHs9EDU{leyNF2UlE8(LX}*U-s%Sw%9jCw#a~Ix(e^Q{zcYm3t&ejHoCUy2<-Bm>Ifwxn~&pyHRFP$ni%t= zq+qW8MmJ9@Jvo<28@c&$X=cBBl90Fj8)zL4_e}xwa$n6}aT7qcZamR)NzXZjNUF0f zl%#Ydqoz)0vYH^|`2_Rs>RH$|Xm=(l?SDTMw&w2nlzB*&h<8|wfJ%yr&$O*Sw#O~! zXfHC^aNuh!-dcikWhTS%Px<>~?`zi7ppPpt2$Os0;^~ojcwRC6EGmVj?Kxo5+Z@P< zF!{y4c#|pMZe)#l6jeJYDGshe4_hcQr)?9UunlnVB~9_!YJH4&C@q2Z;Y^=CNXl&yt|1V&D(r zRxLL4{xCf#jfZ#99q9!yG+`z4$#f$nm_=@}i`g=zGR)rTb#&H4ZV<1080T@5e>F+ zdvxshi_8X{%fh4GXrs~-7C$1_F1s}^%@QE7jOEm6j(caXamNX zyqlGl?bnZ*4=^zhe=Ohq1m4euykE~cwW~?^_+!N!JEQ<_qN%2R*5wwVj}tzcnY#p% znr3DGRTK&0Ix}z_?tJ(Vm*s1}CSy!=?C2}wW-~51Ms2Omkq3zl2ftKY{%Li#dtT5*4gGw?P)DN)q8hS z8Ejf=Vs`xA$b`$rX@kN_5trqu!B-+aC7%5a#qgK_R)pD!OBClJzNyU+7v|tzsZrwc z5YT(8i%BLL+Z+!iaWX0YjZ6vk@3}r87{qZiC(XX`S&+CbkJcgHm0#RGin)%0N5?FS zYE!S***aJDn)26PPZn_Z&=+RSX$mAhFwBWg<5$<^aRI$-r`skI<3u3VwoWwNHNkb+ zVk<$T=fySMk|*iG8r)AGr^<)Q*e?|K(W+6`*RhHC@Ex6*TuN=G`Kn0Nhi8x6$zSnW z&{p`h4wl;mw%n0Q`)XH^sS{~d9$##7f^ouYM|v-Te%Vw63%9r=V$!t!(P*iA?{tNq z9$c<3bpfWS*7s-oeSpzGl@(lD0)*nQRTxEQvRFwKLl3JX=c_35DftU7pTufT3$7o9 z&)YEWYRQ`XKALA+< zCe=$u$3G*++3DA}wj-|9_Mj5aI2 zd#adASb3g_81hM1Pb8njIIc=tSj^!TewB9eKc4v8u1Pv{Q(yBRdSMtRO7w;BFuoF9 zRsk1LFP)?0m9>g9olmt8X- z1zokfo=Yp#c#Sj_ z7`2q!!Qn;c$F87Xoj&-rF@KNyp+43_6@Q&;z76y~v`pjyz}_KR^bGy=J{?7l>}$s% z*JNaat4dsh>`%pPTJ+nM*~)fR(jjbyO5zt;Am6vKjwwVu2j{$A90SOPBh>Z1_ENXH z;ahlgpn|wEuq*wpTU|iyz5bqN|JoZK%Pl zoZ+i;2XFT%q!uPpZxRaX;hDbvNjsKN2+F@cKnOK(ceMZda_1=RA^=RAdnC5dtaFcd zGioH@g0*caUhK1mbAdBX(f<{yqg0q;xVYU0F4rVaWpgSnYR(AoC-|LM>MZT}d6X^0 zu&OBkf|C<2x?o+jYu7F#MERY*oV4hCyM=m|pvlBhk$@qctZmW;r|MFfMPf7_c*K$u zrdozR4HtiF7dZ-{walo>6J+$-4}r+XY^l=Yx&*EDim{4W;N=cggDa-6J)cy7Z~W>W zLnH4&nJl%UMOI|dGdHNMI+b?PZb(K5!=wBAi}yYY=Wa(4-`-IkTtekE3&oMpz?|3D zfJ)vcR||!QU+(X!zXTVybcGgg;kMoZ=YUUi)35e*<@0RbYMQCg6)s@(q1+1O^6e6Z-uk5-U5mCOW0Vy>%5)f&YrP__qeev9I0~>r>~J!k z(RX_IcVpPaI{U-x{DKY8DXM^|$0a06+O@PrF^h;`<)F@LB`At(`U^Xo;k^Gd`)YMP zwr&8J-~A}g2=nfc%=ZZ9dYNq3-lf!cJCDu{P~F3x3fOUo*LW7Q7ii=_$A!SEdPx*%Jl zOI4(}I(nGmiche1X9TNOS5f_8BoCRa^FxhIh)l|fhsEor-1roIPX4MJWvfdkr~R=S z@C0h~0)+c{Vm&>nXHtdQS5!A3q- zARa-*9XpC5;hyQ#qOBly1dShwE4bAB9ke;w80Zg>8gvY`itJ+G{@zAS`|FeEsHo?o zeWGJNtIx1{f@)%gdAs`#}&oMUNLf(+n=#IHvF*#7`Y^iJq8 zZ<5n0SqS@8XCG*QLfxB?rt%aB7{?N4;{ zOF_~PffGqLXb!VkQXumjTZ8zh-{l{t^gZWoHI^d3xoXKA&S>8+$QE!kzkev4&|zE2 zZg=_AY~8uRDCrsC;uRy!bC7HbB8+jK0c>TTXDJ_*aDgu zQHM{ea}L>-hsAVlA3UA z<+s`0ET=<f-;qv6Wi*_5*nKb1$JT5!iD=B5kjZq z6KN9^DK&0ECcpDT)GS^M^(+~CDxgo_B^wKrnfcVt)3a}Zc*%&&ckm!5^ONlqB23XGT_=zq8WoRq1T&ml67CAIrovClv!iCo_! zm0(67D~du8lj;0v=t@@(+}7y2sQ9}~eda`H=!?&mIptGE?0-qyoIf6~bH3$|0wGRG z9%PnvC!G6#q}~m$F>hMYRA()ey;Yl~M(g+s%pCzE5XF}=S+x~|ttlPxd=Ku_Knj&f z!zmB^WA_oGnu|EqrI8aX*RI-g78^gl^y$iE@<22(DesViVz>4sou`97=Jye2MflohBvPDx5v27L2l|Bg9a&d`~6neP`### zTW8BxpKX~cD079h(n#cNVGJ^$z75xt>@+$EmqCOmfGd{RO!hou(2>&^qnS*$HR_v) zSToytJ^?zh_50GAFbd+o6LP6`b%#T`H(X2NP zIzpf&eZSfoIz#RDi9y8HxM(bZm)!i=#@?81ak2SmuY%k*qths6x|los{rexRbXH?0 zka=XJbXxubgL~2v%3kS4GZjI`K_WrkoM|naK}bd)(GSgw5Ok#CzEZ~fH>nmuUy$tS zks#v}kaWmqLXzlOWd8kPmMzN+!_OagE(8)Zbk>yt?Ri)7Z@0REeDK5UZ4qW-G2j3$ zU?wDI4@Qm1YDPgUDl1`>%kqXJXB@~bo>CD2PDSk<039f<*DiiV)&x!Sn}`%AO@ z0>w^e6zn-mLCTSHqW0$P2q#%V|B*JIxe1;n$0t6?L?q5^LvG4`|)4Y(=|v} zUE@PT@7+3g39Iu~f?gqA8iXXvAL;4a!nq9?vja@01`@h-`%^!=aPyE2nXdm!`#b|$ zx7@5Rzql@(T?U5iEfZ3F5KfNzf#NdkJ@5Yghc_al32@(EdoLP3LXz6QQysBl8ZFgt z2^TtEI>jHT>Z?P1)YU@G^5P#^nv7TxCdTBzl!LLrjztD+IH5~fNsB@ORyI*NFGzd3}eo{iP zB*Ps>PZWMUWq)dmKI5tA-Cy;7)IytFe+Yz7D7Lpm2|u^qXxfP7{G6nf+8p&_F>Q-b zz2{ymw5Kyt+n=s8W#e&d>td@dv+UORop)Cl*C4iW^O?MP_>Fd(;K#44Mp8MS-~NX9 z{b?7G`YB+nr&@_9%t0W_j>^E9H$lU?;j;i)Ql^W4V_c#zOcP#8kxgTEUaH>cWsr0& z^VSrd%Oq4QEKtY}FOM&uB#8(7N3N}Ol@_+K*Gia_-}h?v)0K;!YGTWFojEOPbP8j&a*=Uav~ z9Js#6s84~Lk^#4k))hPzJ?` z&bCTVB4rgXgGahcb7`;Ars13!{XUeUJ7;WU0N(opQlZ**$o<@rE!KgR5_`4+x8B z9=RpA^@yJ#B61NvD~%=-XD2l6|2c%%++IR)*$cLtT}l%MwvtVMDtuZqKdRfMF^{`H zes6^m+QhANr_lhGPYyMr0oPj1>xkj3Z))z?C3JxGGH9TgJiHn3`E#p~Ru4FUap#P_ zc*#!5`@gmK8wpE(&=PV3v6%4|G>GK_CDn^$BF?FQnCSE6nX+l#wwHZ#&4P>`Hvk!S z?z=5tDrurkFOMzSy_Eay`Y}*saj@IJj@e=vdc+zEdrQ?ynz{)))kHOux=suX7M%f-+x3+Yy)rNaJ!}jGPzM2eD*(m z0_x+d(4DBqwKz0?y-a;{<%%wfZSBd5)9Mrmy?bXtGaEhCj-}*41bz23QVeE57t0y7 zV-ox#o$+0>HWj-8HSBb*Ekvv}3Ldu+X41ruBoXLz&UKq0aRO76F{1`qWl_@an$&tJ za}es@c^$EpmG}1RXcE>fY^H!LE((nIPbEnO>%2V-h}t-SW+D2k6#vP3?3adgl2NpQ zT7V5Jmc2tx#s)dAd@Y086Q)L>iDT;As#PczEr8NC8!?l8nd^Su0OT5L6iJW3<1&=RpAwuU6Nwo9+89Z->({I;BY?HLMZ*8eG zNE+CjLw#n=lWw2l?#|YAw1uq|_Lg46wkFr;#wardGd|6WSEDg66seouJ}9&K?Vz;f zBSo={k70+t2lVLyPoy5#g%r~%J#Qj>$m&ax7YkR$^ZH;H8?ar)uMSw|x>1*tRuSXB zqz;;txO?4c=`CN!rv8UtCZM_K6riY5%K z9U)q2xR;{%%Y7%4!X2)~l$y=s7!{OS@7wP*YEaZx;_O1NC^PAcHy)fB23;- z!%n99iPO+eQ`iK1SdUy1#IS@M~>v)%A(IMu!re^?#8u@x*Vv6>LPMX?o?h z^F1q1?6z=|j^;I)pqFq#zyp<*e-S%3b>xV}JCJLN%|8A1^l0a3otHIYe*8$!F#h}x z)oqRLw>_4=?;AEkNOA;dSEFaIfP8 zd5?=r@cJ)ki}4bD(KNJ3wZAbn;a&a1T{;q=jL`RxMCT2kYvZOBgCt*WHM8vA)+wPu zn?QH})I3EyfkQN|o*G}ki#5Y>xs-0ePH%)iuyEsyPZy}vL-u#3rMS$_D@TTv$<%%& z$iqHRh=Hqhi7eYr^2;}-Q3qp!UNT0>ogK3{=c&LZ{b^|Xf`|Hk#X}}gvP-Z0qms>4 z#Ly{H{vyIh{090)iB%kc`~DX9g+}UsA_=L}YxH|F87et^XK*6l{V2B`nC8{(r=*6F zm>!-?>}0kp%6Tr^KDL2s5f9+yRQ2`Fo8KxO$@@x9b>^_ydU8cNVI2yORl+&y39k<*FT zPPnJ4GsOJXKqh#RGNBprW4PI?<@D`OtvA@)k`4qURCK}~O22ZpZTZ>J+!TB*` zHzG3r0SPCMa;3=B-~)y`{*2pev+CcMaI%}oLtjxfnR9p#Pl{he%@Js!V@Jc}o$mp4 zt6$(%>wZdhJ~`1`UGaD;8MzJhAzJP0F-wrXK%LCL>Fgy9Mh=Fv(D%{yq~AGJgiEm@ z!RK0251Lqzfn#fB0IWfXGc^59mPUWbWCwM2`M=a~{Q;^|8#aeTz}PD^cx?tAeQ^20 zVeq}sOnIs$FvL}kA6$$45M5N?zlyf1$oK;-EX}#3Z;{>fdrZ)g!f%cpEr9+OFB@by zD6!+Gk(pdkf~LS9Og@v$4@%5e0mr=06H7V%fYwjyU^;HzuC@2I!*iS<{UIb})qubLYzk5E#66ha%mFzRKc zhw{r3sP7`F0{0l5!wl&WOc)PC&@QN{*D^`bTW-|5)e8u?J#V})g%t9B$QdSDoA2X} zr`gJ7vy%(m!hg3=)5H^aXY4o8!7HMfd~1n9%NJU9Y#?Uln7uA#${43OnDit$MCdr3 z(Dqbgsu6NK@mI{|-$Qit4pFI-V z5R$Gaf{t3=z$g><+r)fC{^C(%eupZ=AQlXCo1^)D;}-Gp&#{Gp5nmYuvJJ92thVf4 zbsRgIIX3E`hjE*JgD3fmbu~q&AFlL&oPAcw8zA2D-p}sfI~24SyEXnWXXBH5S&$OA z=uB{3IUm-va>%#bj7CfAOc1`+xaPyRaPo{rzK`UY^o=V*kZ{Fm^T=8jU8dSVwmh2Y zA}Vn9YS!u?pVJidoy(%2e5`*&O!Z5n{XHW77V~LO#hA5>=amiiS2|jEJqtRb<3>eL z`>MWq9fhWOw_IP?FAhdB%*RnbKpjpG{z1#@-a2^`E4Le^Ip4On2%de+WE^Qce&mi2 zS3txPr%qReki?GHp53W|8{kulPsqCj1ljj>L7ikLp~R%5q%<&xkNsUE&*tjW8E^C_ zseL)!7Fj5!FHK>6ut}DgF@TnzQp+3vDYNegw39ORv8Wz5wi<#%u1JYOMJ{(y^sSJ$ zq(N6foL$mBUI8+4_>pBP474=TQ0E$xPGnRUXEX<7S$032?)t&jgb?S`gob_9JFjNZ zG^s7R3)(MU(>u`FrMt!*Q11488j-OhIRz2xa+cDg<~u^5Xo999=}tD6L=LoT;40zA z0LY}NNwAxP-C!px%~VETUYH%F?V`FnakvIzsQB5mk-% zF!jLKX$Eii%?N4L+z#EoSiP|XPVJbNlOMD+FG#tI)0TN0N<6`Xvq^hiq_Q^JbZ-^R zO&_$OL3$6gSMBaEd8)ewz1GkC7@U!VEcUbV_SJ%_(hp$pz6%hJvAi?BtRSy^M|KGnYxU{@~vB>9QU}#A_@_)I=%PQT>kumiAKXwiT<^TWy literal 0 HcmV?d00001 diff --git a/packages/docs/styles.css b/packages/docs/styles.css index 843b7a9..9cc1fc9 100644 --- a/packages/docs/styles.css +++ b/packages/docs/styles.css @@ -1,3 +1,175 @@ .vocs_Code { max-height: 800px; } + +/* Custom Homepage text styles */ + +.custom-homepage { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; +} + +.custom-homepage-headline { + margin-bottom: 1rem; + text-align: center; + max-width: 800px; + margin-left: auto; + margin-right: auto; + line-height: 1.2; +} + +.custom-homepage-headline-text { + font-size: 2.5rem; + font-weight: bold; + display: inline-block; +} + +.custom-homepage-headline * { + line-height: inherit; + margin: 0; + padding: 0; +} + +/* For smaller screens */ +@media (max-width: 768px) { + .custom-homepage-headline-text { + font-size: 2rem; + line-height: 1.3; + } +} + +.custom-homepage-subhead { + margin-bottom: 1rem; + text-align: center; + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.custom-homepage-subhead-text { + font-size: 1.25rem; + line-height: 1.5; + display: inline-block; +} + +.custom-homepage-subhead * { + line-height: inherit; + margin: 0; + padding: 0; +} + +/* For smaller screens */ +@media (max-width: 768px) { + .custom-homepage-subhead-text { + font-size: 1.1rem; + } +} + +/* Custom Homepage tiles */ + +.custom-homepage-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.5rem; +} + +.custom-homepage-tile { + position: relative; /* Add this line */ + background-color: var(--vocs-color-bg-soft); + border: 1px solid var(--vocs-color-border); + border-radius: 8px; + padding: 1.5rem; + text-decoration: none; + color: var(--vocs-color-text); + transition: all 0.3s ease; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} + +.custom-homepage-tile:hover { + transform: translateY(-5px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + border-color: var(--vocs-color-primary); +} + +.custom-homepage-tile-icon { + font-size: 1.5rem; + display: block; + margin-bottom: 0.75rem; +} + +:root { + --tile-external-icon-color: rgba( + 76, + 76, + 76, + 0.7 + ); /* Default color for light mode */ +} + +.dark { + --tile-external-icon-color: rgba( + 207, + 207, + 207, + 0.7 + ); /* Use the text color in dark mode */ +} + +.custom-homepage-tile-external-icon { + position: absolute; + top: 0.5rem; + right: 0.5rem; + width: 0.75rem; + height: 0.75rem; + opacity: 0.7; + transition: + opacity 0.3s ease, + filter 0.3s ease; + filter: invert(0%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(0%) + contrast(100%); + display: block; /* Add this line */ +} + +.dark .custom-homepage-tile-external-icon { + filter: invert(100%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) + contrast(100%); +} + +.custom-homepage-tile-title { + font-size: 1.25rem; + font-weight: bold; + margin-bottom: 0.5rem; +} + +.custom-homepage-tile-description { + font-size: 0.9rem; + color: var(--vocs-color-text-soft); + line-height: 1.5; /* Added this line to reduce line height */ + margin: 0; /* Added to remove any default margins */ +} + +/* Dark mode adjustments */ +.dark .custom-homepage-tile { + background-color: rgba( + 255, + 255, + 255, + 0.01 + ); /* Slightly lighter than the background */ + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 1px 3px rgba(255, 255, 255, 0.05); +} + +.dark .custom-homepage-tile:hover { + transform: translateY(-5px); + background-color: rgba(255, 255, 255, 0.01); /* Slightly lighter on hover */ + box-shadow: 0 4px 12px rgba(255, 255, 255, 0.02); + border-color: var(--vocs-color-primary); +} + +.custom-homepage-tile-grid-container .vocs_Tabs_list { + display: flex; + justify-content: center; + outline: none; /* Keep existing style */ +} diff --git a/packages/docs/vocs.config.ts b/packages/docs/vocs.config.tsx similarity index 91% rename from packages/docs/vocs.config.ts rename to packages/docs/vocs.config.tsx index b2b86d9..6d71bd8 100644 --- a/packages/docs/vocs.config.ts +++ b/packages/docs/vocs.config.tsx @@ -1,13 +1,26 @@ import { defineConfig } from "vocs"; export default defineConfig({ + head: () => { + // console.log(`Generating head content... ${new Date().toISOString()}`) + return ( + <> +