@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 +38 -0
- package/README.md +116 -2
- package/dist/assets/agentRegistry-BTmfO4WX.js +1 -0
- package/dist/client/THIRD_PARTY_LICENSES.md +240 -0
- package/dist/client/widget.bundle.js +3 -0
- package/dist/index.js +30 -0
- package/dist/nativeHost.js +3 -0
- package/dist/protocol.d.ts +118 -0
- package/dist/protocol.js +1 -0
- package/package.json +97 -4
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
|
-
#
|
|
1
|
+
# Pixel Not Perfect
|
|
2
2
|
|
|
3
|
-
|
|
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.
|