@codeandfunction/pixelnotperfect 0.0.0 → 1.0.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/LICENSE ADDED
@@ -0,0 +1,38 @@
1
+ @codeandfunction/pixelnotperfect Non-Commercial License
2
+
3
+ Copyright © 2026 Code and Function. All rights reserved.
4
+
5
+ This is a legal agreement between you (either an individual or an entity) and Code and Function for the use of @codeandfunction/pixelnotperfect (the "Software").
6
+
7
+ 1. Grant of License
8
+
9
+ Subject to the terms and conditions of this Agreement, Code and Function grants you a non-exclusive, non-transferable, non-sublicensable license to use the Software strictly for Non-Commercial purposes.
10
+
11
+ "Non-Commercial" means use that is not primarily intended for or directed towards commercial advantage or monetary compensation. This includes:
12
+
13
+ - Personal projects and portfolios.
14
+ - Educational use by students or academic institutions.
15
+ - Usage within a non-profit organization.
16
+ - Use in conjunction with the Pixel Not Perfect browser extension.
17
+
18
+ 2. Restrictions
19
+
20
+ You may NOT under any circumstances:
21
+
22
+ a. Use the Software for Commercial purposes without obtaining a separate Commercial License from Code and Function.
23
+ b. Modify, adapt, alter, translate, or create derivative works from the Software.
24
+ c. Wrap, embed, or integrate the Software to create a competing product, library, or framework.
25
+ d. Sublicense, rent, lease, or sell the Software.
26
+ e. Remove or alter any copyright or proprietary notices contained in the Software.
27
+
28
+ 3. Commercial Licensing
29
+
30
+ If you wish to use the Software for commercial purposes (including but not limited to integrating it into a commercial product, a paid service, or an internal corporate tool), you must obtain a Commercial License. Please contact support@codeandfunction.com for commercial licensing inquiries.
31
+
32
+ 4. Termination
33
+
34
+ This license is effective until terminated. Your rights under this License will terminate automatically without notice if you fail to comply with any of its terms.
35
+
36
+ 5. Disclaimer of Warranty
37
+
38
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,117 @@
1
- # @codeandfunction/pixelnotperfect
1
+ # Pixel Not Perfect
2
2
 
3
- Placeholder release. The Pixel Not Perfect MCP server will be published under this name.
3
+ > Model Context Protocol (MCP) server for AI visual regression and interactive design review.
4
+
5
+ > **Early development**: expect breaking changes between major versions. Not for production use.
6
+
7
+ Pixel Not Perfect lets AI coding agents and human reviewers verify frontend implementations against visual design references (mockups, screenshots, multi-page PDFs or live URLs) at pixel precision. Learn more at [pixelnotperfect.dev](https://pixelnotperfect.dev/).
8
+
9
+ - **Visual regression**: compare a rendered page against a design reference and get the mismatch, the regions that differ and whether they are layout or colour changes.
10
+ - **Self-healing UI loop**: agents fix the differences and compare again until the page matches.
11
+ - **Interactive review**: reviewers pin feedback on the live page, discuss each item with the agent, and approve or reject every fix with before and after captures.
12
+ - **Secure by default**: network targets, file access and the agent's protocol stream are guarded.
13
+
14
+ ---
15
+
16
+ ## Quick Start
17
+
18
+ ### Prerequisites
19
+
20
+ - **Node.js** 20 or later.
21
+ - **Google Chrome or Chromium** installed.
22
+
23
+ ### Connect Your MCP Client
24
+
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "pixelnotperfect": {
29
+ "command": "npx",
30
+ "args": ["-y", "@codeandfunction/pixelnotperfect"],
31
+ "env": {
32
+ "PIXELNOTPERFECT_ALLOWED_ROOTS": "~/Designs"
33
+ }
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ List the folders that hold your reference images and PDFs in `PIXELNOTPERFECT_ALLOWED_ROOTS`; files outside the allowed folders are refused. Keep the list as narrow as practical: every folder you add is readable by the agent.
40
+
41
+ ---
42
+
43
+ ## Using It
44
+
45
+ **Compare against a design.** Ask your agent to compare a page with a reference, for example _"Compare `http://localhost:3000/login` with `~/Designs/login.png` and fix the differences."_ The agent renders the page, compares it, fixes the code and repeats until the mismatch is within the threshold.
46
+
47
+ **Review with a person in the loop.** Ask your agent to start a visual review of a page. The reviewer pins feedback in the browser and sends it; the agent fixes each item and the reviewer approves or rejects every change.
48
+
49
+ **Review in your own browser.** With the Pixel Not Perfect browser extension, reviews run in your everyday browser with your existing logins.
50
+
51
+ ### Tools
52
+
53
+ | Tool | Purpose |
54
+ | :--------------------------- | :--------------------------------------------------------------------- |
55
+ | `visual_diff` | Compare a rendered page against a design reference. |
56
+ | `approve_reference` | Make the captured page of a run the new reference. |
57
+ | `inspect_layout_offset` | Tell a shifted layout apart from missing or restyled elements. |
58
+ | `start_visual_review` | Start a review, optionally in a new browser window. |
59
+ | `wait_for_review_submission` | Wait until the reviewer sends feedback or ends the review. |
60
+ | `get_visual_review` | Read the feedback the reviewer has sent. |
61
+ | `resolve_visual_annotation` | Change the status of a feedback item, with a note for the reviewer. |
62
+ | `reply_to_visual_annotation` | Reply to a feedback item without changing its status. |
63
+ | `get_visual_review_status` | Summarise a review. |
64
+ | `update_queue_status` | Hand the review back to the reviewer while the agent is still working. |
65
+ | `close_visual_review` | End a review. |
66
+ | `get_status` | Report the server's health and version. |
67
+
68
+ ### Prompts
69
+
70
+ | Prompt | Purpose |
71
+ | :---------------------------------- | :------------------------------------------------------------- |
72
+ | `pixelnotperfect:visual_diff` | Compare once and report findings without changing code. |
73
+ | `pixelnotperfect:self_healing_ui` | Plan fixes, wait for approval, then fix and compare in a loop. |
74
+ | `pixelnotperfect:visual_review` | Work through the feedback of a review. |
75
+ | `pixelnotperfect:approve_reference` | Make the capture of a previous run the new reference. |
76
+
77
+ ---
78
+
79
+ ## Configuration
80
+
81
+ Set these in the `env` block of your MCP client configuration.
82
+
83
+ | Variable | Purpose | Default |
84
+ | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------ |
85
+ | `PIXELNOTPERFECT_ALLOWED_ROOTS` | Extra folders the server may read reference images and PDFs from, separated by commas or the OS path delimiter. `ALLOWED_ROOTS` is also accepted. | The working directory, the system temp directory and `PIXELNOTPERFECT_DATA_DIR` |
86
+ | `PIXELNOTPERFECT_CHROME_PATH` | Path to your Chrome or Chromium program, when Google Chrome is not installed in its standard location. | Google Chrome's standard install location |
87
+ | `PIXELNOTPERFECT_DATA_DIR` | Where runs, review sessions, captures and reports are stored. | `.pixelnotperfect` in the system temp directory |
88
+ | `PIXELNOTPERFECT_HOST_REGISTRATION` | Set to `off` to stop the server from registering the browser extension's companion host at startup. | Registration on |
89
+ | `PIXELNOTPERFECT_REVIEW_PORT` | Port of the local review server. It always listens on loopback only, whatever the port. | Chosen by the OS |
90
+
91
+ ### Browser Extension
92
+
93
+ The browser extension reaches the agent through a small companion program that ships with this package. When the server starts, it registers the companion for the current user with every supported browser that is installed (Chrome, Chromium, Edge, Brave and Firefox), without administrator rights. Set `PIXELNOTPERFECT_HOST_REGISTRATION=off` to turn this off.
94
+
95
+ ```bash
96
+ # Register the companion now
97
+ npx @codeandfunction/pixelnotperfect install-native-host
98
+
99
+ # Remove every registration
100
+ npx @codeandfunction/pixelnotperfect uninstall-native-host
101
+ ```
102
+
103
+ > **Note**: browsers installed as Snap or Flatpak packages run sandboxed and may not be able to start the companion. Use a browser installed from the vendor's own package.
104
+
105
+ ---
106
+
107
+ ## Reporting a Vulnerability
108
+
109
+ Email [support@codeandfunction.com](mailto:support@codeandfunction.com) with the details. Please do not disclose the issue publicly until it has been addressed.
110
+
111
+ ---
112
+
113
+ ## License
114
+
115
+ Free for non-commercial use under the [Pixel Not Perfect Non-Commercial License](https://pixelnotperfect.dev/license); see `LICENSE`. For commercial licensing, contact [support@codeandfunction.com](mailto:support@codeandfunction.com).
116
+
117
+ © Code and Function. All rights reserved.
@@ -0,0 +1 @@
1
+ import e from"node:os";import{z as t}from"zod";import n from"node:fs/promises";import r from"node:path";import{fileTypeFromFile as i}from"file-type";import a from"node:crypto";var o=`pixelnotperfect`,s=`@codeandfunction/pixelnotperfect`,c=`127.0.0.1`,l=`Bearer `,u=`com.codeandfunction.pixelnotperfect`,d=`PIXELNOTPERFECT_HOST_REGISTRATION`,f=`PIXELNOTPERFECT_CHROME_PATH`,p=`pixelnotperfect@codeandfunction.com`,m=[`gjbnnagcebaiafccfelfomjnnigjedjd`],h=class extends Error{code=`VALIDATION`;constructor(e){super(e),this.name=`ValidationError`}},g=class extends Error{code=`NOT_FOUND`;constructor(e){super(e),this.name=`NotFoundError`}},_=class extends Error{code=`CONFLICT`;constructor(e){super(e),this.name=`ConflictError`}},v=class extends Error{code=`FORBIDDEN`;constructor(e){super(e),this.name=`ForbiddenError`}},y=class extends Error{code=`TIMEOUT`;constructor(e){super(e),this.name=`TimeoutError`}},b=class extends Error{code=`UNAUTHORIZED`;constructor(e){super(e),this.name=`UnauthorizedError`}},x=({context:e,error:t})=>{let n=t instanceof Error?t.message:String(t);process.stderr.write(`[pixelnotperfect] ${e}: ${n}\n`)},S=/^[a-zA-Z0-9_-]+$/,C=t.object({version:t.string().min(1).describe(`Version of this package`)}),w=3840,ee=t.object({height:t.number().int().min(100).max(w).default(800).describe(`Viewport height in pixels`),name:t.string().default(`default`).describe(`Viewport identifier`),width:t.number().int().min(100).max(w).default(1280).describe(`Viewport width in pixels`)}),T=function(e){return e.IMAGE=`image`,e.PDF=`pdf`,e}({}),E=new Set([`169.254.169.254`,`metadata.google.internal`,`metadata.internal`,`0.0.0.0`,`::`]),D=new Set([`http:`,`https:`]),O=new Set([`.png`,`.jpg`,`.jpeg`,`.webp`,`.pdf`]),k=new Set([`image/png`,`image/jpeg`,`image/webp`]),A=new Set([`application/pdf`]),j=t=>{if(!t||typeof t!=`string`)return t;let n=e.homedir();return t===`~`?n:t.startsWith(`~${r.sep}`)||t.startsWith(`~/`)||t.startsWith(`~\\`)?r.join(n,t.slice(2)):t},M=()=>process.env.PIXELNOTPERFECT_DATA_DIR?r.resolve(j(process.env.PIXELNOTPERFECT_DATA_DIR.trim())):r.join(e.tmpdir(),`.pixelnotperfect`),N=()=>{let t=r.resolve(M()),n=[r.resolve(process.cwd()),r.resolve(e.tmpdir()),t],i=r.resolve(`/tmp`);e.platform()!==`win32`&&!n.includes(i)&&n.push(i);let a=process.env.PIXELNOTPERFECT_ALLOWED_ROOTS??process.env.ALLOWED_ROOTS;if(a){let e=a.split(r.delimiter).flatMap(e=>e.split(`,`)).map(e=>e.trim()).filter(Boolean).map(e=>r.resolve(j(e)));n.push(...e)}return Array.from(new Set(n.map(e=>r.resolve(e))))},P=e=>{let t;try{t=new URL(e)}catch{throw new h(`Invalid URL provided: "${e}". Must be a valid absolute HTTP or HTTPS URL.`)}if(!D.has(t.protocol))throw new h(`Prohibited protocol "${t.protocol}". Only "http:" and "https:" URLs are allowed.`);let n=t.hostname.toLowerCase();if(E.has(n)||n.startsWith(`169.254.`))throw new h(`Target host "${n}" is blocked for security reasons (cloud metadata / link-local).`);if(t.port){let e=Number.parseInt(t.port,10);if(Number.isNaN(e)||e<1||e>65535)throw new h(`Invalid port "${t.port}" in URL.`)}return t.toString()},F=async({allowedRoots:e=N(),filePath:t})=>{if(!t||typeof t!=`string`)throw new h(`File path must be a non-empty string.`);let i=j(t.trim()),a=r.resolve(i),o=r.extname(a).toLowerCase();if(!O.has(o))throw new h(`Prohibited file extension "${o}". Allowed extensions: ${Array.from(O).join(`, `)}`);if(!e.some(e=>{let t=r.resolve(e);return a===t||a.startsWith(t+r.sep)}))throw new h(`Access denied: File "${a}" is outside of allowed workspace boundaries.\nAllowed roots: [${e.map(e=>R(e)).join(`, `)}].\nRemediation for agents: Copy the reference file into the MCP cache directory (${R(M())}), your active workspace, or system temp directory, or configure PIXELNOTPERFECT_ALLOWED_ROOTS in your MCP client settings.`);try{await n.access(a)}catch{throw new g(`File does not exist: "${a}"`)}return a},I=e=>{let t=e?e.trim():``;if(!t||!S.test(t))throw new h(`Invalid runId "${e}". Must contain only alphanumeric characters, dashes, and underscores.`);return t},L=async({expectedType:e,filePath:t})=>{let n=await i(t);if(!n)throw new h(`File content verification failed: "${t}" does not have a valid binary image or PDF signature.`);if(e===`image`){if(!k.has(n.mime))throw new h(`File content mismatch: "${t}" has content type "${n.mime}", but expected an image (PNG, JPEG, or WebP).`)}else if(e===`pdf`){if(!A.has(n.mime))throw new h(`File content mismatch: "${t}" has content type "${n.mime}", but expected a PDF document.`)}else if(!k.has(n.mime)&&!A.has(n.mime))throw new h(`Prohibited file content type "${n.mime}" in "${t}". Allowed types: PNG, JPEG, WebP, PDF.`);return n},R=t=>{if(t instanceof Error){let n=t.message,i=e.homedir();return i&&i!==`/`&&i!==r.sep&&(n=n.split(i).join(`~`)),n=n.replace(/\/home\/[a-zA-Z0-9_-]+/g,`~`),n}return String(t)},z=e=>e instanceof Error&&`code`in e&&e.code===`ENOENT`,B=async e=>{try{return await n.realpath(e)}catch(e){if(z(e))return;throw e}},te=async({directory:e,filePath:t})=>{let[n,i]=await Promise.all([B(e),B(t)]);return n!==void 0&&(i?.startsWith(n+r.sep)??!1)},V=async e=>{try{return await n.access(e),!0}catch{return!1}},H=65535,U=t.object({sessionId:t.string().regex(S).describe(`Review session identifier`),targetUrl:t.string().url().describe(`URL the review session was started for`),token:t.string().min(1).describe(`Access token of the review session`)}).strict(),W=t.object({clientName:t.string().optional().describe(`Name of the MCP client connected to the agent`),pid:t.number().int().positive().describe(`Process id of the MCP server`),port:t.number().int().min(1).max(H).describe(`Loopback port of the review server`),sessions:t.array(U).describe(`Active review sessions`)}).strict(),G=/^(\d+)\.json$/,K=448,q=384,J=63,Y=()=>r.join(e.tmpdir(),`.pixelnotperfect`,`agents`),X=e=>r.join(Y(),`${e}.json`),Z=e=>!process.getuid||e.uid===process.getuid(),Q=async e=>{let t=await n.lstat(e);return t.isDirectory()&&Z(t)},$=async e=>{try{return await Q(e)}catch(e){if(z(e))return!1;throw e}},ne=e=>{try{return process.kill(e,0),!0}catch{return!1}},re=async({directory:e,fileName:t})=>{let i=Number(G.exec(t)?.[1]);if(!i||!ne(i))return;let a=r.join(e,t);try{let e=await n.lstat(a);if(!e.isFile()||!Z(e))return;let t=W.safeParse(JSON.parse(await n.readFile(a,`utf8`)));return t.success&&t.data.pid===i?t.data:void 0}catch(e){if(z(e)||e instanceof SyntaxError)return;throw e}},ie=async()=>{let e=Y();return await $(e)?(await Promise.all((await n.readdir(e)).map(t=>re({directory:e,fileName:t})))).filter(e=>e!==void 0):[]},ae=async e=>{if(await n.mkdir(e,{mode:K,recursive:!0}),!await Q(e))throw Error(`Agent registry "${e}" is not a directory owned by this user.`);((await n.stat(e)).mode&J)!==0&&await n.chmod(e,K)},oe=async e=>{await ae(Y());let t=X(e.pid),r=`${t}.${a.randomUUID()}.tmp`;await n.writeFile(r,JSON.stringify(e),{flag:`wx`,mode:q});try{await n.rename(r,t)}catch(e){throw await n.rm(r,{force:!0}),e}},se=async e=>{await $(Y())&&await n.rm(X(e),{force:!0})};export{c as A,h as C,f as D,m as E,s as M,o as N,p as O,b as S,l as T,ee as _,z as a,g as b,M as c,F as d,I as f,w as g,S as h,V as i,u as j,d as k,R as l,C as m,se as n,te as o,P as p,oe as r,T as s,ie as t,L as u,_ as v,x as w,y as x,v as y};
@@ -0,0 +1,240 @@
1
+ # Licenses
2
+
3
+ The app bundles dependencies which contain the following licenses:
4
+
5
+ ## @codeandfunction/callaloo-tokens - 1.5.0 (MIT)
6
+
7
+ The MIT License (MIT)
8
+
9
+ Copyright (c) 2016-present - Code+Function
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+ ## @codeandfunction/callaloo-types - 1.5.0 (MIT)
30
+
31
+ The MIT License (MIT)
32
+
33
+ Copyright (c) 2016-present - Code+Function
34
+
35
+ Permission is hereby granted, free of charge, to any person obtaining a copy
36
+ of this software and associated documentation files (the "Software"), to deal
37
+ in the Software without restriction, including without limitation the rights
38
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39
+ copies of the Software, and to permit persons to whom the Software is
40
+ furnished to do so, subject to the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be included in all
43
+ copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
51
+ SOFTWARE.
52
+
53
+ ## @codeandfunction/callaloo - 5.19.0 (MIT)
54
+
55
+ The MIT License (MIT)
56
+
57
+ Copyright (c) 2016-present - Code+Function
58
+
59
+ Permission is hereby granted, free of charge, to any person obtaining a copy
60
+ of this software and associated documentation files (the "Software"), to deal
61
+ in the Software without restriction, including without limitation the rights
62
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
63
+ copies of the Software, and to permit persons to whom the Software is
64
+ furnished to do so, subject to the following conditions:
65
+
66
+ The above copyright notice and this permission notice shall be included in all
67
+ copies or substantial portions of the Software.
68
+
69
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
70
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
71
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
72
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
73
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
75
+ SOFTWARE.
76
+
77
+ ## @floating-ui/core - 1.8.0 (MIT)
78
+
79
+ MIT License
80
+
81
+ Copyright (c) 2021-present Floating UI contributors
82
+
83
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
84
+ this software and associated documentation files (the "Software"), to deal in
85
+ the Software without restriction, including without limitation the rights to
86
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
87
+ the Software, and to permit persons to whom the Software is furnished to do so,
88
+ subject to the following conditions:
89
+
90
+ The above copyright notice and this permission notice shall be included in all
91
+ copies or substantial portions of the Software.
92
+
93
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
94
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
95
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
96
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
97
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
98
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
99
+
100
+ ## @floating-ui/dom - 1.8.0 (MIT)
101
+
102
+ MIT License
103
+
104
+ Copyright (c) 2021-present Floating UI contributors
105
+
106
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
107
+ this software and associated documentation files (the "Software"), to deal in
108
+ the Software without restriction, including without limitation the rights to
109
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
110
+ the Software, and to permit persons to whom the Software is furnished to do so,
111
+ subject to the following conditions:
112
+
113
+ The above copyright notice and this permission notice shall be included in all
114
+ copies or substantial portions of the Software.
115
+
116
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
117
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
118
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
119
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
120
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
121
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
122
+
123
+ ## @floating-ui/utils - 0.2.12 (MIT)
124
+
125
+ MIT License
126
+
127
+ Copyright (c) 2021-present Floating UI contributors
128
+
129
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
130
+ this software and associated documentation files (the "Software"), to deal in
131
+ the Software without restriction, including without limitation the rights to
132
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
133
+ the Software, and to permit persons to whom the Software is furnished to do so,
134
+ subject to the following conditions:
135
+
136
+ The above copyright notice and this permission notice shall be included in all
137
+ copies or substantial portions of the Software.
138
+
139
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
140
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
141
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
142
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
143
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
144
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
145
+
146
+ ## @vue/reactivity - 3.5.43 (MIT)
147
+
148
+ The MIT License (MIT)
149
+
150
+ Copyright (c) 2018-present, Yuxi (Evan) You
151
+
152
+ Permission is hereby granted, free of charge, to any person obtaining a copy
153
+ of this software and associated documentation files (the "Software"), to deal
154
+ in the Software without restriction, including without limitation the rights
155
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
156
+ copies of the Software, and to permit persons to whom the Software is
157
+ furnished to do so, subject to the following conditions:
158
+
159
+ The above copyright notice and this permission notice shall be included in
160
+ all copies or substantial portions of the Software.
161
+
162
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
165
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
166
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
167
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
168
+ THE SOFTWARE.
169
+
170
+ ## @vue/runtime-core - 3.5.43 (MIT)
171
+
172
+ The MIT License (MIT)
173
+
174
+ Copyright (c) 2018-present, Yuxi (Evan) You
175
+
176
+ Permission is hereby granted, free of charge, to any person obtaining a copy
177
+ of this software and associated documentation files (the "Software"), to deal
178
+ in the Software without restriction, including without limitation the rights
179
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
180
+ copies of the Software, and to permit persons to whom the Software is
181
+ furnished to do so, subject to the following conditions:
182
+
183
+ The above copyright notice and this permission notice shall be included in
184
+ all copies or substantial portions of the Software.
185
+
186
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
187
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
188
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
189
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
190
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
191
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
192
+ THE SOFTWARE.
193
+
194
+ ## @vue/runtime-dom - 3.5.43 (MIT)
195
+
196
+ The MIT License (MIT)
197
+
198
+ Copyright (c) 2018-present, Yuxi (Evan) You
199
+
200
+ Permission is hereby granted, free of charge, to any person obtaining a copy
201
+ of this software and associated documentation files (the "Software"), to deal
202
+ in the Software without restriction, including without limitation the rights
203
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
204
+ copies of the Software, and to permit persons to whom the Software is
205
+ furnished to do so, subject to the following conditions:
206
+
207
+ The above copyright notice and this permission notice shall be included in
208
+ all copies or substantial portions of the Software.
209
+
210
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
211
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
212
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
213
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
214
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
215
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
216
+ THE SOFTWARE.
217
+
218
+ ## @vue/shared - 3.5.43 (MIT)
219
+
220
+ The MIT License (MIT)
221
+
222
+ Copyright (c) 2018-present, Yuxi (Evan) You
223
+
224
+ Permission is hereby granted, free of charge, to any person obtaining a copy
225
+ of this software and associated documentation files (the "Software"), to deal
226
+ in the Software without restriction, including without limitation the rights
227
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
228
+ copies of the Software, and to permit persons to whom the Software is
229
+ furnished to do so, subject to the following conditions:
230
+
231
+ The above copyright notice and this permission notice shall be included in
232
+ all copies or substantial portions of the Software.
233
+
234
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
235
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
236
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
237
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
238
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
239
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
240
+ THE SOFTWARE.