@gui-chat-plugin/scroll-to-anchor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # @gui-chat-plugin/scroll-to-anchor
2
+
3
+ [![npm version](https://badge.fury.io/js/%40gui-chat-plugin%2Fscroll-to-anchor.svg)](https://www.npmjs.com/package/@gui-chat-plugin/scroll-to-anchor)
4
+
5
+ A scroll-to-anchor plugin for [MulmoChat](https://github.com/receptron/MulmoChat).
6
+
7
+ ## Overview
8
+
9
+ This plugin allows the AI to scroll the view to a specific tool result by its anchor ID. Useful for navigating between multiple results in a conversation.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ yarn add @gui-chat-plugin/scroll-to-anchor
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ### Vue Implementation (for MulmoChat)
20
+
21
+ ```typescript
22
+ // In src/tools/index.ts
23
+ import ScrollToAnchorPlugin from "@gui-chat-plugin/scroll-to-anchor/vue";
24
+
25
+ const pluginList = [
26
+ // ... other plugins
27
+ ScrollToAnchorPlugin,
28
+ ];
29
+
30
+ // In src/main.ts
31
+ import "@gui-chat-plugin/scroll-to-anchor/style.css";
32
+ ```
33
+
34
+ ### Core Only (Framework-agnostic)
35
+
36
+ ```typescript
37
+ import { pluginCore, TOOL_NAME } from "@gui-chat-plugin/scroll-to-anchor";
38
+ ```
39
+
40
+ ## Package Exports
41
+
42
+ | Export | Description |
43
+ |--------|-------------|
44
+ | `@gui-chat-plugin/scroll-to-anchor` | Core (framework-agnostic) |
45
+ | `@gui-chat-plugin/scroll-to-anchor/vue` | Vue implementation |
46
+ | `@gui-chat-plugin/scroll-to-anchor/style.css` | Tailwind CSS styles |
47
+
48
+ ## Test Prompts
49
+
50
+ 1. "Show me the previous image" (after generating multiple images)
51
+ 2. "Go back to the first result"
52
+ 3. "Scroll to the quiz"
53
+
54
+ ## Development
55
+
56
+ ```bash
57
+ yarn install
58
+ yarn dev # Start dev server
59
+ yarn build # Build
60
+ yarn typecheck # Type check
61
+ yarn lint # Lint
62
+ ```
63
+
64
+ ## License
65
+
66
+ MIT
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ScrollToAnchor Tool Definition (Schema)
3
+ */
4
+ import type { ToolDefinition } from "gui-chat-protocol";
5
+ export declare const TOOL_NAME = "scrollToAnchor";
6
+ export declare const TOOL_DEFINITION: ToolDefinition;
7
+ export declare const SYSTEM_PROMPT = "Use the scrollToAnchor API to scroll the document view to a specific anchor when the user asks to read a specific step or navigate to a section. For example, when the user says \"read step 3\" or \"what's next?\", call this function with the appropriate anchor ID (e.g., \"step-3\") BEFORE or AFTER reading the step aloud.";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * ScrollToAnchor Plugin - Core (Framework-agnostic)
3
+ */
4
+ export type { ScrollToAnchorArgs } from "./types";
5
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT, executeScrollToAnchor, pluginCore, } from "./plugin";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ScrollToAnchor Plugin Core (Framework-agnostic)
3
+ */
4
+ import type { ToolPluginCore, ToolContext, ToolResult } from "gui-chat-protocol";
5
+ import type { ScrollToAnchorArgs } from "./types";
6
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT } from "./definition";
7
+ /**
8
+ * Execute the scrollToAnchor function
9
+ * Updates the current result's viewState to trigger scrolling in the document
10
+ */
11
+ export declare const executeScrollToAnchor: (context: ToolContext, args: ScrollToAnchorArgs) => Promise<ToolResult>;
12
+ export declare const pluginCore: ToolPluginCore<unknown, unknown, ScrollToAnchorArgs>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ScrollToAnchor Plugin Types
3
+ */
4
+ /** Arguments passed to the scrollToAnchor tool */
5
+ export interface ScrollToAnchorArgs {
6
+ anchorId: string;
7
+ }
package/dist/core.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t="scrollToAnchor",r={type:"function",name:t,description:"Scroll the current document view to a specific anchor tag. Use this when reading recipe steps aloud or navigating to specific sections.",parameters:{type:"object",properties:{anchorId:{type:"string",description:'The ID of the anchor tag to scroll to (e.g., "step-1", "step-2"). Should match the anchor IDs in the document.'}},required:["anchorId"]}},s=`Use the ${t} API to scroll the document view to a specific anchor when the user asks to read a specific step or navigate to a section. For example, when the user says "read step 3" or "what's next?", call this function with the appropriate anchor ID (e.g., "step-3") BEFORE or AFTER reading the step aloud.`,n=async(e,c)=>{const{anchorId:o}=c;return e.currentResult?{...e.currentResult,message:`Scrolled to ${o}`,updating:!0,viewState:{...e.currentResult.viewState,scrollToAnchor:o,scrollTimestamp:Date.now()},instructions:"Read the step aloud.",instructionsRequired:!0}:{message:"No document is currently displayed to scroll.",updating:!1}},i={toolDefinition:r,execute:n,generatingMessage:"Scrolling to section...",isEnabled:()=>!0,systemPrompt:s};exports.SYSTEM_PROMPT=s;exports.TOOL_DEFINITION=r;exports.TOOL_NAME=t;exports.executeScrollToAnchor=n;exports.pluginCore=i;
package/dist/core.js ADDED
@@ -0,0 +1,47 @@
1
+ const o = "scrollToAnchor", s = {
2
+ type: "function",
3
+ name: o,
4
+ description: "Scroll the current document view to a specific anchor tag. Use this when reading recipe steps aloud or navigating to specific sections.",
5
+ parameters: {
6
+ type: "object",
7
+ properties: {
8
+ anchorId: {
9
+ type: "string",
10
+ description: 'The ID of the anchor tag to scroll to (e.g., "step-1", "step-2"). Should match the anchor IDs in the document.'
11
+ }
12
+ },
13
+ required: ["anchorId"]
14
+ }
15
+ }, n = `Use the ${o} API to scroll the document view to a specific anchor when the user asks to read a specific step or navigate to a section. For example, when the user says "read step 3" or "what's next?", call this function with the appropriate anchor ID (e.g., "step-3") BEFORE or AFTER reading the step aloud.`, c = async (e, r) => {
16
+ const { anchorId: t } = r;
17
+ return e.currentResult ? {
18
+ ...e.currentResult,
19
+ message: `Scrolled to ${t}`,
20
+ updating: !0,
21
+ // This will update the existing result instead of creating a new one
22
+ viewState: {
23
+ ...e.currentResult.viewState,
24
+ scrollToAnchor: t,
25
+ scrollTimestamp: Date.now()
26
+ // Add timestamp to ensure reactivity even with same anchor
27
+ },
28
+ instructions: "Read the step aloud.",
29
+ instructionsRequired: !0
30
+ } : {
31
+ message: "No document is currently displayed to scroll.",
32
+ updating: !1
33
+ };
34
+ }, i = {
35
+ toolDefinition: s,
36
+ execute: c,
37
+ generatingMessage: "Scrolling to section...",
38
+ isEnabled: () => !0,
39
+ systemPrompt: n
40
+ };
41
+ export {
42
+ n as SYSTEM_PROMPT,
43
+ s as TOOL_DEFINITION,
44
+ o as TOOL_NAME,
45
+ c as executeScrollToAnchor,
46
+ i as pluginCore
47
+ };
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./core.cjs");exports.SYSTEM_PROMPT=e.SYSTEM_PROMPT;exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.executeScrollToAnchor=e.executeScrollToAnchor;exports.pluginCore=e.pluginCore;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ScrollToAnchor Plugin
3
+ *
4
+ * Main entry point - re-exports core module.
5
+ */
6
+ export * from "./core";
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ import { SYSTEM_PROMPT as T, TOOL_DEFINITION as e, TOOL_NAME as r, executeScrollToAnchor as c, pluginCore as l } from "./core.js";
2
+ export {
3
+ T as SYSTEM_PROMPT,
4
+ e as TOOL_DEFINITION,
5
+ r as TOOL_NAME,
6
+ c as executeScrollToAnchor,
7
+ l as pluginCore
8
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-bold:700;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mx-auto{margin-inline:auto}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.contents{display:contents}.flex{display:flex}.max-w-3xl{max-width:var(--container-3xl)}.flex-1{flex:1}.gap-2{gap:calc(var(--spacing)*2)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-gray-300{border-color:var(--color-gray-300)}.border-yellow-200{border-color:var(--color-yellow-200)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.p-3{padding:calc(var(--spacing)*3)}.p-5{padding:calc(var(--spacing)*5)}.p-8{padding:calc(var(--spacing)*8)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-2{padding-block:calc(var(--spacing)*2)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-white{color:var(--color-white)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}}}body{margin:calc(var(--spacing)*0);background-color:var(--color-gray-100);padding:calc(var(--spacing)*5);font-family:var(--font-sans)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ScrollToAnchor Plugin - Vue Implementation
3
+ *
4
+ * Note: This plugin has no View or Preview components
5
+ * It only updates the viewState of the current result to trigger scrolling
6
+ */
7
+ import "../style.css";
8
+ import type { ToolPlugin } from "gui-chat-protocol/vue";
9
+ import type { ScrollToAnchorArgs } from "../core/types";
10
+ export declare const plugin: ToolPlugin<unknown, unknown, ScrollToAnchorArgs>;
11
+ export type { ScrollToAnchorArgs } from "../core/types";
12
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT, executeScrollToAnchor, pluginCore, } from "../core/plugin";
13
+ declare const _default: {
14
+ plugin: ToolPlugin<unknown, unknown, ScrollToAnchorArgs, import("gui-chat-protocol/vue").InputHandler, Record<string, unknown>>;
15
+ };
16
+ export default _default;
package/dist/vue.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./core.cjs"),o={...e.pluginCore},l={plugin:o};exports.SYSTEM_PROMPT=e.SYSTEM_PROMPT;exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.executeScrollToAnchor=e.executeScrollToAnchor;exports.pluginCore=e.pluginCore;exports.default=l;exports.plugin=o;
package/dist/vue.js ADDED
@@ -0,0 +1,15 @@
1
+ import { pluginCore as o } from "./core.js";
2
+ import { SYSTEM_PROMPT as T, TOOL_DEFINITION as c, TOOL_NAME as l, executeScrollToAnchor as p } from "./core.js";
3
+ const e = {
4
+ ...o
5
+ // No viewComponent or previewComponent - this plugin updates existing results
6
+ }, t = { plugin: e };
7
+ export {
8
+ T as SYSTEM_PROMPT,
9
+ c as TOOL_DEFINITION,
10
+ l as TOOL_NAME,
11
+ t as default,
12
+ p as executeScrollToAnchor,
13
+ e as plugin,
14
+ o as pluginCore
15
+ };
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@gui-chat-plugin/scroll-to-anchor",
3
+ "version": "0.1.0",
4
+ "description": "Scroll to anchor plugin for GUIChat",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./core": {
16
+ "types": "./dist/core/index.d.ts",
17
+ "import": "./dist/core.js",
18
+ "require": "./dist/core.cjs"
19
+ },
20
+ "./vue": {
21
+ "types": "./dist/vue/index.d.ts",
22
+ "import": "./dist/vue.js",
23
+ "require": "./dist/vue.cjs"
24
+ },
25
+ "./style.css": "./dist/style.css"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "dev": "vite",
32
+ "build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
33
+ "typecheck": "vue-tsc --noEmit",
34
+ "lint": "eslint src demo"
35
+ },
36
+ "peerDependencies": {
37
+ "gui-chat-protocol": "^0.0.1",
38
+ "vue": "^3.5.0"
39
+ },
40
+ "devDependencies": {
41
+ "@tailwindcss/vite": "^4.1.18",
42
+ "@typescript-eslint/eslint-plugin": "^8.53.0",
43
+ "@typescript-eslint/parser": "^8.53.0",
44
+ "@vitejs/plugin-vue": "^6.0.3",
45
+ "eslint": "^9.39.2",
46
+ "eslint-plugin-vue": "^10.6.2",
47
+ "globals": "^17.0.0",
48
+ "gui-chat-protocol": "^0.0.1",
49
+ "tailwindcss": "^4.1.18",
50
+ "typescript": "~5.9.3",
51
+ "vite": "^7.3.1",
52
+ "vue": "^3.5.27",
53
+ "vue-eslint-parser": "^10.2.0",
54
+ "vue-tsc": "^3.2.2"
55
+ },
56
+ "keywords": [
57
+ "guichat",
58
+ "plugin",
59
+ "scroll",
60
+ "anchor"
61
+ ],
62
+ "license": "MIT"
63
+ }