diff --git a/Compliance/隐私政策信息.md b/Compliance/隐私政策信息.md new file mode 100644 index 0000000..27d5f66 --- /dev/null +++ b/Compliance/隐私政策信息.md @@ -0,0 +1,222 @@ +隐私政策信息 +隐私政策 + + +发布日期:2025 年 2 月 5 日 + +生效日期:2025 年 2 月 5 日 + +上海达诺新晨信息科技有限公司(以下简称 "达诺" 或 "我们")负责处理您在本网站上的个人信息。 + +请仔细阅读本隐私政策,其中描述了我们收集有关访问本网站的个人信息的方式("个人数据"),我们如何收集、使用、存储、对外提供、保护您的个人信息及您享有何种权利。 + +本隐私政策自 2025 年 2 月 5 日起生效,除非本隐私政策的内容有所更新,其内容将持续有效。 + + + +1. 用户 + +通过使用我们的网站,您同意并接受向达诺提供能直接或间接识别您身份的信息(以下简称 "个人信息" 或 "个人数据"),并将这类信息收集、处理和存储在中国境内。 + +若您位于欧盟或欧洲经济区并通过我们的网站提供了您的个人信息,您有权根据欧盟《一般数据保护条例》(以下简称 "GDPR")获取任何有关达诺处理您个人信息的准确信息以及行使您在 GDPR 项下的权利。 + + + +2. 我们收集哪些您的个人信息 + +达诺收集并处理如下您的个人信息: + +(1) 通过 "联系我们 - 业务咨询 / RFP""联系我们 - 媒体与投资者咨询" 与 "联系我们 - 客户反馈" 版块,我们可能会通过在线表格收集诸如您的姓名、电子邮件、联系电话、公司、职位、国家等信息; + +(2) 如果您对达诺在业务活动及相关事宜中有任何疑虑,您可以通过 "联系我们 - 合规疑虑" 版块联系我们,您可以通过填写在线表格的方式报告该疑虑事件,我们可能会收集诸如您的姓名、电话、邮箱等个人信息; + +(3) 如果您通过邮箱、电话或其他书面形式联系我们,达诺会保留您的相关信息。 + +除上述信息外,达诺还通过跟踪系统收集用户在浏览网站时产生的信息,这类信息包括:您的设备信息,包含用户 IP 地址或其他标识符,设备位置,浏览器信息,操作系统信息以及您的上网记录信息,包含浏览的页面和文件、搜索、操作系统和系统配置信息以及与您的使用相关的日期 / 时间戳,该等信息可能符合作为个人信息的条件。该信息用于分析总体趋势,帮助我们提供和改进我们的产品和服务,并保证其安全性和持续正常运行。具体内容,详见第 4 部分。 + + + +3. 我们如何使用您的个人信息 + +达诺根据个人信息首次收集之目的为限度存储和处理个人信息,并且不会超过数据处理目的之必要。当您的个人信息已不再需要被处理时,达诺将确保以安全的方式处理或删除您的个人信息。达诺已使用符合业界标准的安全防护措施保护您提供的个人信息,使其免受意外、非法或未经授权的破坏、损失、变更、修改、存取、披露或使用。 + +达诺基于合法的理由处理您的个人信息,这些法定依据包括: + +(1) 为了与您缔结及履行合同之必要; + +(2) 您同意您的个人信息为一个或多个特定目的而处理; + +(3) 处理是基于达诺追求合法利益之必要,且该利益不与您所追求的利益或基本权利自由相冲突。 + +达诺基于如下目的使用您的个人信息: + +(1) 个性化您在我们网站的体验; + +(2) 为您提供我们的服务(我们通过使用您的个人信息为了与您缔约合同;回答您的疑虑;介绍我们的产品或业务等); + +(3) 回复您发送给我们的邮件; + +(4) 分析您在我们网站的使用习惯,以便达诺能不断改进网站和您的用户体验; + +若您对达诺的合规有任何疑虑,达诺将使用您留下的联系方式与您联系。 + +若达诺是基于您的同意处理个人信息,您有权随时撤回同意并要求达诺删除有关您的任何信息。具体内容,详见第 11 部分。 + + + +4.Cookies + +当您访问我们网站时,我们通过 Cookies 以及网络信标等去记录我们的业绩以及网站的使用情况。Cookie 是发送到您的浏览器上并在您的电脑硬盘驱动器上存储的小量数据。只有当您使用您的电脑进入我们网站时,Cookie 才能够被发送到您的电脑硬盘上。 Cookies 常用于记录访问者浏览我们网站上的各个项目时的习惯以及偏好。Cookies 所搜集的资料是不记名的集体统计数据,不载有个人资料。Cookies 不能用于取得您的硬盘上的数据、您的电邮地址、及您的私人数据。当您重新上访我们网站时,可以省却您再次登记的步骤。大多数浏览器都预设为可以接受 Cookies。您可以选择将您的浏览器设定为不接受 Cookies, 或如果 Cookies 一被装上就通知您。不过,若设定为禁止 Cookies, 您或许便不能启动或使用我们网站的某些功能。 + +若您不禁止或除去 cookies, 每次您使用同一台电脑进入我们的网站时,我们的网络服务器会通知我们你上访了我们网站,继而我们会辨认出您及接达您的登记数据及付款数据,搜集有关使用量、巿场研究、行迹进程及参与推广活动的资料等。 + +您可以改动您用来进入我们网站的电脑的浏览器上的设定来决定是否接受 cookie。若您愿意,您可以改变浏览器上的设定。若您将您的偏好放在浏览器上,让您可以接受所有的 cookies, 收到 cookies 发出的通知,甚至可以拒绝一切 cookies。然而,若在您的浏览器选用不要 cookies 或拒绝所有 cookies, 您有可能不能使用或启动我们网站的某些功能,或有可能需要重新登入您的资料。 + + + +5. 个人信息的分享或披露 + +为了保证您的个人信息安全,我们承诺,所有的共享和披露仅限您的必要个人信息,且受本隐私声明的约束;如果我们要改变个人信息的使用及处理目的,我们将再次征求您的授权同意。同时我们将会严格遵守相关法律法规对数据跨境传输的各项要求。 + +我们会将您的个人信息分享或披露给以下第三方: + +(1) 获得您的明确同意后,我们会与其他方共享或披露您的个人信息。 + +(2) 我们可能会将您的部分个人信息共享给为我们提供网站运营服务的第三方供应商; + +(3) 共享给达诺集团成员。您可通过 "关于我们" 的版块自行查询达诺关联方的名称和联系方式及其位置列表。 + +如果我们出售或放弃我们的业务或部分业务且您的个人数据与此出售的或放弃的此部分业务有关,或我们同其它业务合并,我们将与此业务的新的所有者或并购伙伴共享您的个人数据; + +如被依法强制要求,达诺将会与执法机构和其它政府机构共享我们收集的数据。 + +在上述情形下,达诺将实施适当的技术性和组织性措施,以确保与风险相适应的安全等级,防止任何未经授权或非法的处理,第三方或关联公司的意外毁损、丢失或损害。 + + + +6. 个人信息的跨境传输 + +原则上,我们在中华人民共和国境内收集和产生的个人信息,将存储在中华人民共和国境内。但基于统一集团运营和管理的需要,我们可能会将您的个人信息传输或转移到境外管辖区,或者受到来自这些管辖区的访问。该等国家可能并未设立与信息原始收集国一样的数据保护法律。若您是处于欧洲经济区且达诺将您的信息传输至欧洲经济区(EEA)之外的国家时,达诺会依据其应适用的法律法规,采取相应措施保护该等信息。 + +我们向其传输数据的接收方所在国家或地区的个人信息保护法律可能与中国的法律不同。当我们将您的个人信息转移到中国境外时,我们将采取适当措施保护您的个人信息,例如与接收方签订包含标准数据保护条款的数据转移协议或通过数据出境安全评估,并相应履行个人信息跨境传输的义务。 + +对于传输至欧洲经济区外的信息,达诺使用被称之为标准合同条款(SCC)的方式确保恰当的足够的保护。 + +当您在使用达诺的网站和 / 或服务时或当您向达诺提供产品和 / 或服务时,我们收集的您的个人数据会被传输到我们在中国的集团公司。 + + + +7. 儿童的信息 + +达诺网站通常不收集 18 周岁以下未成年人的个人信息,且网站也不针对 18 周岁以下的未成年人。 + +如果有未成年人使用达诺的产品或网站的服务时,我们会遵循最小必要的原则和目的限制原则,在家长或监护人的明确同意下,直接从家长或监护人处收集未满 14 周岁未成年人的个人信息。 + +若您是不满 14 周岁的儿童的监护人,当您在帮助儿童完成网站产品或服务的注册、使用前,应当仔细阅读本隐私声明、产品或服务具体的隐私保护声明(如有)以便儿童能使用我们提供的产品或服务。 + + + +8. 个人信息的保存期限 + +达诺会按照您所在地区相关法律法规及行业惯例的规定保存您的个人信息。达诺只会在符合上述目的的情况下保存您的个人信息。 + +我们将始终按照法律要求的期限以及根据与法律诉讼或涉及到达诺的调查相关的需求来保留您的个人信息。在您的个人信息存储期限到期后,除根据法律法规规定必须继续存储更长时间的个人信息外,我们将对您的个人信息进行删除或匿名化处理,使其处于不可被访问的状态,并留存相关删除或匿名化处理记录。 + + + +9. 第三方网站 + +达诺的网站可能会提供第三方网站的链接,以便提供给用户更方便快捷的体验。达诺不对第三方网站做任何背书,不为该类第三方网站的内容、提供的服务、安全性以及可用性负责。同时,达诺的网站会使用第三方社交媒体,诸如微信,社交媒体可能会收集您的个人信息和 / 或使用 Cookies 功能。这些第三方网站不受本隐私政策的约束,因此,达诺建议您在访问第三方网站时详细阅读该类网站的隐私政策。 + + + + +10. 安全 + +达诺已使用符合业界标准的安全防护措施保护您的个人信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。 + +但达诺无法保证您在网上披露的任何信息的安全性。若发生任何数据泄露事件,达诺按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。 + +请记住,虽然达诺会采取一切合理的措施保护您的个人信息的安全,但因互联网环境的特点,达诺不能保证所有您的个人信息的绝对安全,在适用法律的合理范围内,我们不承担任何未经授权访问、使用或披露您的个人信息的所有责任。 + + + +11. 您的权利和请求 + +(1) 知情权 + +达诺通过本隐私政策向您提供任何关于处理您的个人数据的信息。此外,您还可以通过本隐私政策第 13 条中的联系方式向达诺获取任何有关您个人数据处理的信息。 + +(2) 数据访问权 + +您有权从达诺处以免费的形式获取一份有关您个人信息处理的副本。 + +(3) 更正权 + +您有权要求达诺及时更正您不准确的个人信息。考虑到处理的目的,您应当有权将不完整的个人数据补充完整,包括通过提供补充声明的方式。 + +(4) 删除权(被遗忘权) + +您有权基于如下理由要求达诺删除您的个人信息: + +l 处理目的已实现、无法实现或者为实现处理目的不再必要; + +l 我们不再为您提供产品或服务,或者保存期限已届满; + +l 您撤回了同意; + +l 我们违反法律、行政法规或者违反约定处理您的个人信息; + +l 法律、行政法规规定的其他情形; + +若法律、行政法规规定的保存期限未届满,或者删除您的个人信息从技术上难以实现的,我们将停止除存储和采取必要的安全措施之外的处理。 + +(5) 限制处理权 + +您有权基于如下理由要求限制达诺处理您的个人数据,我们会在解除限制之前通知您: + +l 您对您个人数据的准确性提出质疑,有权利要求达诺在核实申请和更正数据所需的时间内对您个人数据的处理进行限制; + +l 您认为达诺的处理是非法的,但您反对删除个人数据,有权利要求限制使用个人数据; + +l 基于处理目的,达诺已不再需要您的个人数据,但您提出、行使或抗辩法律诉求而需要该个人数据。 + +(6) 可携带权 + +您有权获得您已向达诺提供的个人数据,以结构化的、普遍使用的机器可读的形式,并有权不受达诺限制地将该等数据提供给其他控制者。达诺不对该类接受者的数据处理承担任何责任。 + +(7) 反对权 + +您有权在特定情况下随时反对达诺对您个人信息的处理,除非达诺能够证明其合法利益高于您的权益、权利和自由,或者法定请求权的确立、行使和抗辩有强有力的法律依据。 + +(8) 撤回同意的权利 + +若达诺是基于您的同意处理个人信息,您有权随时撤回同意。同意的撤回不应影响在撤回前基于同意作出的数据处理的合法性。 + +(9) 申诉权 + +当您认为您的权利受到侵害时,您有权向人民法院依法提起诉讼。 + +您可以通过本隐私政策第 13 条中的联系方式行使您的上述权利。达诺在收到您的任何请求时,会在 15 个工作日内做出答复。 + + + +12. 本隐私政策如何更新 + +通过在本网站上发布新的隐私政策,我们可能会不时更改或更新此隐私政策。 + +未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。 + + + +13. 联系我们 + +如果您对本隐私政策或者达诺的数据保护有任何疑问、意见或建议,通过以下方式与我们联系: + +邮箱:RMO@vdano.com + +公司:上海达诺新晨信息科技有限公司(简称:达诺) + + + +上海达诺新晨信息科技有限公司 diff --git a/index.html b/index.html index b70dac9..888179e 100644 --- a/index.html +++ b/index.html @@ -7,8 +7,8 @@ RMO一站式临床试验风险管理 -
- +
+ diff --git a/package-lock.json b/package-lock.json index ca68fb1..d6cf844 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,190 +8,22 @@ "name": "rmo-website", "version": "1.0.0", "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.20.0" + "pinia": "^2.1.0", + "vue": "^3.4.0", + "vue-router": "^4.2.0" }, "devDependencies": { - "@types/react": "^18.2.43", - "@types/react-dom": "^18.2.17", - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.55.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", + "@vitejs/plugin-vue": "^5.0.0", + "@vue/tsconfig": "^0.5.0", "typescript": "^5.2.2", - "vite": "^5.0.8" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "vite": "^5.0.8", + "vue-tsc": "^1.8.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -201,44 +33,18 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -247,77 +53,10 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -718,257 +457,10 @@ "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -1321,51 +813,6 @@ "win32" ] }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1373,357 +820,190 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", + "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", + "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", + "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.28", + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", + "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.28.tgz", + "integrity": "sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.28.tgz", + "integrity": "sha512-POVHTdbgnrBBIpnbYU4y7pOMNlPn2QVxVzkvEA2pEgvzbelQq4ZOUxbp2oiyo+BOtiYlm8Q44wShHJoBvDPAjQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.28.tgz", + "integrity": "sha512-4SXxSF8SXYMuhAIkT+eBRqOkWEfPu6nhccrzrkioA6l0boiq7sp18HCOov9qWJA5HML61kW8p/cB4MmBiG9dSA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.28", + "@vue/runtime-core": "3.5.28", + "@vue/shared": "3.5.28", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.28.tgz", + "integrity": "sha512-pf+5ECKGj8fX95bNincbzJ6yp6nyzuLDhYZCeFxUNp8EBrQpPpQaLX3nNCp49+UbgbPun3CeVE+5CXVV1Xydfg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28" + }, + "peerDependencies": { + "vue": "3.5.28" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", + "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", "license": "MIT" }, - "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1731,16 +1011,6 @@ "dev": true, "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", - "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -1751,215 +1021,38 @@ "balanced-match": "^1.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { + "node_modules/computeds": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", "dev": true, "license": "MIT" }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true, "license": "MIT" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", "engines": { - "node": ">=6.0" + "node": ">=0.12" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true, - "license": "ISC" - }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -1999,360 +1092,12 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", - "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2368,392 +1113,23 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" + "he": "bin/he" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/minimatch": { @@ -2772,10 +1148,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", "dev": true, "license": "MIT" }, @@ -2783,7 +1159,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -2798,158 +1173,45 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, - "node_modules/picomatch": { + "node_modules/pinia": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", + "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2974,152 +1236,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", - "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", - "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.2", - "react-router": "6.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", @@ -3165,39 +1281,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -3211,152 +1294,20 @@ "node": ">=10" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -3366,47 +1317,6 @@ "node": ">=14.17" } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", @@ -3467,57 +1377,95 @@ } } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", + "node_modules/vue": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", + "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-sfc": "3.5.28", + "@vue/runtime-dom": "3.5.28", + "@vue/server-renderer": "3.5.28", + "@vue/shared": "3.5.28" }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", "bin": { - "node-which": "bin/node-which" + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" } } } diff --git a/package.json b/package.json index c5c2d10..4f19305 100644 --- a/package.json +++ b/package.json @@ -3,28 +3,23 @@ "version": "1.0.0", "description": "RMO一站式临床试验风险管理网站", "private": true, + "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "vite build", "preview": "vite preview", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" + "lint": "eslint . --ext ts,tsx,vue --report-unused-disable-directives --max-warnings 0" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.20.0" + "vue": "^3.4.0", + "vue-router": "^4.2.0", + "pinia": "^2.1.0" }, "devDependencies": { - "@types/react": "^18.2.43", - "@types/react-dom": "^18.2.17", - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.55.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", + "@vitejs/plugin-vue": "^5.0.0", + "@vue/tsconfig": "^0.5.0", "typescript": "^5.2.2", - "vite": "^5.0.8" + "vite": "^5.0.8", + "vue-tsc": "^1.8.0" } } - diff --git a/pic/Home_Page.png b/pic/Home_Page.png new file mode 100644 index 0000000..37a15d0 Binary files /dev/null and b/pic/Home_Page.png differ diff --git a/public/pic/Home_Page.png b/public/pic/Home_Page.png new file mode 100644 index 0000000..37a15d0 Binary files /dev/null and b/public/pic/Home_Page.png differ diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 4e2e23c..0000000 --- a/src/App.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' -import Layout from './components/Layout' -import ProtectedRoute from './components/ProtectedRoute' -import DashboardLayout from './components/DashboardLayout' -import { QuoteModalProvider } from './contexts/QuoteModalContext' -import QuoteRequestModal from './components/QuoteRequestModal' -import Home from './pages/Home' -import RmoMode from './pages/RmoMode' -import ResourceCenter from './pages/ResourceCenter' -import RiskDutiesOverview from './pages/RiskDutiesOverview' -import PostMarket from './pages/PostMarket' -import Overseas from './pages/Overseas' -import FAQ from './pages/FAQ' -import Login from './pages/Login' -import Sponsor from './pages/Sponsor' -import Institution from './pages/Institution' -import Participant from './pages/Participant' -import ServiceProvider from './pages/ServiceProvider' -import Holder from './pages/Holder' -import SmartAcquisition from './pages/SmartAcquisition' -import PVReport from './pages/PVReport' -import DrugSafetyDict from './pages/DrugSafetyDict' -// 登录后系统页面 -import Dashboard from './pages/dashboard/Dashboard' -import ProjectList from './pages/dashboard/ProjectList' -import ProjectDetail from './pages/dashboard/ProjectDetail' -import InquiryList from './pages/dashboard/InquiryList' -import InquiryDetail from './pages/dashboard/InquiryDetail' -import ClaimProgress from './pages/dashboard/ClaimProgress' -import ClaimDetail from './pages/dashboard/ClaimDetail' -import Tools from './pages/dashboard/Tools' -import PremiumCalculator from './pages/dashboard/PremiumCalculator' -import ProjectQuotes from './pages/dashboard/ProjectQuotes' -import ICFEditor from './pages/dashboard/ICFEditor' -import RiskScoring from './pages/dashboard/RiskScoring' -import ProtocolRiskAssessment from './pages/dashboard/ProtocolRiskAssessment' -import DrugSafetyQuery from './pages/dashboard/DrugSafetyQuery' - -function App() { - return ( - - - - {/* 免登录浏览区路由 */} - - - } /> - - {/* 风险职责(原各方关注)路由 */} - } /> - } /> - } /> - } /> - } /> - - {/* 风险数据路由 */} - } /> - } /> - } /> - - {/* 风险活动:临床试验(原RMO模式)路由 */} - } /> - } /> - } /> - } /> - - {/* 风险活动:上市应用路由 */} - } /> - - {/* 海外风险路由 */} - } /> - - {/* 资源中心(原体系管理)路由,含常见问题 */} - } /> - } /> - } /> - } /> - } /> - - {/* 常见问题保留原路径以兼容 */} - } /> - - {/* 其他路由 */} - } /> - } /> - - - } /> - - {/* 登录后系统路由(需权限验证) */} - - - - } /> - {/* 投保人可见 */} - } /> - } /> - } /> - {/* 保险人可见 */} - } /> - } /> - {/* 投保人、保险人可见 */} - } /> - } /> - {/* 投保人可见 */} - } /> - } /> - } /> - } /> - } /> - } /> - - - - } /> - - - - - ) -} - -export default App diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..4fe4631 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,8 @@ + + + diff --git a/src/components/CookieConsent.css b/src/components/CookieConsent.css new file mode 100644 index 0000000..bd532e3 --- /dev/null +++ b/src/components/CookieConsent.css @@ -0,0 +1,164 @@ +.cookie-consent-overlay { + position: fixed !important; + bottom: 0 !important; + left: 0 !important; + right: 0 !important; + z-index: 99999 !important; + padding: 0; + background: transparent; + animation: slideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1); + pointer-events: auto; +} + +@keyframes slideUp { + from { + transform: translateY(100%); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.cookie-consent { + max-width: 100%; + margin: 0; + background: var(--white, #ffffff) !important; + border-top: 1px solid var(--border-color, #e0e0e0); + padding: 20px 24px; + box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1); + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + width: 100%; + box-sizing: border-box; +} + +.cookie-consent-content { + flex: 1; + max-width: 1200px; + margin: 0 auto; + display: flex; + align-items: center; + gap: 24px; +} + +.cookie-consent-title { + font-size: 16px; + font-weight: 600; + margin: 0; + color: var(--text-color); + white-space: nowrap; + flex-shrink: 0; +} + +.cookie-consent-text { + font-size: 14px; + line-height: 1.6; + color: var(--text-light); + margin: 0; + flex: 1; +} + +.cookie-link { + color: var(--brand-primary, #0ea5e9); + text-decoration: underline; + transition: color 0.2s ease; +} + +.cookie-link:hover { + color: var(--brand-primary-dark, #0284c7); +} + +.cookie-consent-actions { + display: flex; + gap: 12px; + flex-shrink: 0; + margin-left: auto; +} + +.cookie-btn { + padding: 10px 24px; + border-radius: 4px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + white-space: nowrap; + min-width: 80px; +} + +.cookie-btn-reject { + background: var(--white); + color: var(--text-color); + border: 1px solid var(--border-color, #e0e0e0); +} + +.cookie-btn-reject:hover { + background: var(--bg-color, #f5f5f5); + border-color: var(--text-light, #999); +} + +.cookie-btn-accept { + background: var(--brand-primary, #0ea5e9); + color: var(--white); + border: 1px solid var(--brand-primary); +} + +.cookie-btn-accept:hover { + background: var(--brand-primary-dark, #0284c7); + border-color: var(--brand-primary-dark); +} + +@media (max-width: 768px) { + .cookie-consent { + flex-direction: column; + padding: 16px 20px; + gap: 16px; + align-items: flex-start; + } + + .cookie-consent-content { + flex-direction: column; + gap: 12px; + align-items: flex-start; + } + + .cookie-consent-title { + font-size: 16px; + } + + .cookie-consent-text { + font-size: 13px; + line-height: 1.5; + } + + .cookie-consent-actions { + width: 100%; + display: flex; + gap: 12px; + margin-left: 0; + } + + .cookie-btn { + flex: 1; + padding: 10px 20px; + } +} + +@media (max-width: 480px) { + .cookie-consent { + padding: 16px; + } + + .cookie-consent-actions { + flex-direction: column; + } + + .cookie-btn { + width: 100%; + } +} diff --git a/src/components/CookieConsent.tsx b/src/components/CookieConsent.tsx new file mode 100644 index 0000000..96ce96a --- /dev/null +++ b/src/components/CookieConsent.tsx @@ -0,0 +1,78 @@ +import { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import './CookieConsent.css' + +function CookieConsent() { + const [showConsent, setShowConsent] = useState(false) + + useEffect(() => { + // 检查用户是否已经做出过选择 + try { + const consent = localStorage.getItem('cookieConsent') + console.log('[CookieConsent] Checking localStorage, consent =', consent) + + if (!consent) { + console.log('[CookieConsent] No consent found, will show after delay') + // 延迟显示,让页面先加载完成 + const timer = setTimeout(() => { + console.log('[CookieConsent] Setting showConsent to true') + setShowConsent(true) + }, 1000) // 减少延迟时间到1秒 + return () => { + console.log('[CookieConsent] Cleaning up timer') + clearTimeout(timer) + } + } else { + console.log('[CookieConsent] Consent already given, not showing. To test, clear localStorage: localStorage.removeItem("cookieConsent")') + } + } catch (error) { + console.error('[CookieConsent] Error accessing localStorage:', error) + // 如果localStorage不可用,仍然显示 + const timer = setTimeout(() => { + setShowConsent(true) + }, 1000) + return () => clearTimeout(timer) + } + }, []) + + const handleAccept = () => { + console.log('CookieConsent: User accepted') + localStorage.setItem('cookieConsent', 'accepted') + setShowConsent(false) + } + + const handleReject = () => { + console.log('CookieConsent: User rejected') + localStorage.setItem('cookieConsent', 'rejected') + setShowConsent(false) + } + + console.log('CookieConsent: Rendering, showConsent =', showConsent) + + if (!showConsent) { + return null + } + + return ( +
+
+
+

Cookies

+

+ 本网站使用 Cookies 以使您获得最佳的体验。为了继续浏览本网站,您需同意我们对 Cookies 的使用。想要了解更多有关于 Cookies 的信息,或不希望当您使用网站时出现 Cookies,请阅读我们的 Cookies 声明。 +

+
+
+ + +
+
+
+ ) +} + +export default CookieConsent diff --git a/src/components/CookieConsent.vue b/src/components/CookieConsent.vue new file mode 100644 index 0000000..e83932c --- /dev/null +++ b/src/components/CookieConsent.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/DashboardLayout.vue b/src/components/DashboardLayout.vue new file mode 100644 index 0000000..a837361 --- /dev/null +++ b/src/components/DashboardLayout.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/components/Footer.vue b/src/components/Footer.vue new file mode 100644 index 0000000..0e9649e --- /dev/null +++ b/src/components/Footer.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/Header.css b/src/components/Header.css index a7d7ba5..b472bbb 100644 --- a/src/components/Header.css +++ b/src/components/Header.css @@ -4,20 +4,21 @@ top: 0; left: 0; right: 0; - background: var(--white); - border-bottom: 1px solid var(--border-color, #e0e0e0); + background: #ffffff; + border-bottom: 1px solid #e5e7eb; z-index: 1000; - height: 56px; + height: 64px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .header-content { display: flex; justify-content: space-between; align-items: center; - height: 56px; - max-width: 1200px; + height: 64px; + max-width: 1400px; margin: 0 auto; - padding: 0 24px; + padding: 0 32px; } .logo { @@ -29,15 +30,15 @@ } .logo h1 { - font-size: 22px; - font-weight: 600; - color: var(--brand-primary); + font-size: 24px; + font-weight: 700; + color: #1f2937; letter-spacing: -0.02em; } .logo span { - font-size: 13px; - color: var(--text-light, #666); + font-size: 12px; + color: #6b7280; font-weight: 400; } @@ -55,12 +56,12 @@ display: inline-flex; align-items: center; height: 100%; - padding: 0 16px; - color: var(--text-color, #333); - font-size: 14px; + padding: 0 20px; + color: #1f2937; + font-size: 15px; font-weight: 500; text-decoration: none; - transition: color 0.15s ease, background 0.15s ease; + transition: color 0.2s ease, background 0.2s ease; position: relative; box-sizing: border-box; } @@ -68,13 +69,13 @@ .nav > a:hover, .nav .nav-dropdown:hover > a, .nav .nav-dropdown:hover .nav-dropdown-trigger { - color: var(--brand-primary); + color: #0ea5e9; } .nav > a.active, .nav .nav-dropdown > a.active, .nav .nav-dropdown-trigger.active { - color: var(--brand-primary); + color: #0ea5e9; font-weight: 600; } @@ -85,14 +86,15 @@ content: ''; position: absolute; bottom: 0; - left: 16px; - right: 16px; - height: 2px; - background: var(--brand-primary); + left: 20px; + right: 20px; + height: 3px; + background: #0ea5e9; } .nav .nav-dropdown { height: 100%; + position: relative; } .nav .nav-dropdown > a, @@ -102,13 +104,15 @@ .dropdown-arrow { font-size: 10px; - margin-left: 4px; - opacity: 0.8; + margin-left: 6px; + opacity: 0.7; transition: transform 0.2s ease; + color: #6b7280; } .nav-dropdown:hover .dropdown-arrow { transform: rotate(180deg); + opacity: 1; } /* 下拉面板:白底、细边框、左对齐(vdano 风格) */ @@ -116,33 +120,46 @@ position: absolute; top: 100%; left: 0; - min-width: 200px; - background: var(--white); - border: 1px solid var(--border-color, #e0e0e0); + min-width: 220px; + background: #ffffff; + border: 1px solid #e5e7eb; border-top: none; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); padding: 8px 0; z-index: 1001; + animation: fadeInDown 0.2s ease-out; +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } } .dropdown-menu a { display: block; - padding: 10px 20px; - color: var(--text-color, #333); + padding: 10px 24px; + color: #374151; font-size: 14px; font-weight: 400; text-decoration: none; - transition: background 0.15s ease, color 0.15s ease; + transition: background 0.2s ease, color 0.2s ease; + white-space: nowrap; } .dropdown-menu a:hover { - background: rgba(14, 165, 233, 0.06); - color: var(--brand-primary); + background: #f3f4f6; + color: #0ea5e9; } .dropdown-menu a.active { - background: rgba(14, 165, 233, 0.08); - color: var(--brand-primary); + background: #eff6ff; + color: #0ea5e9; font-weight: 500; } @@ -150,87 +167,142 @@ display: none; } -/* 三级菜单:风险活动 - 分组标题与子项 */ +.dropdown-divider { + height: 1px; + background: #e5e7eb; + margin: 8px 12px; + border: none; +} + +/* 三级菜单:多列布局(vdano 风格) */ .dropdown-menu-level3-wrapper { - min-width: 220px; - padding: 8px 0; + display: flex; + min-width: 680px; + padding: 0; + border-top: none; } .dropdown-submenu { - padding: 6px 0; - border-bottom: 1px solid var(--border-color, #eee); + flex: 1; + padding: 20px 0; + border-right: 1px solid #e5e7eb; + min-width: 200px; } .dropdown-submenu:last-of-type { - border-bottom: none; + border-right: none; +} + +/* 如果子菜单只有标题链接,调整样式 */ +.dropdown-submenu:has(.dropdown-submenu-title-link:only-child) { + min-width: 180px; } .dropdown-submenu-title { - padding: 8px 20px 6px; - font-size: 12px; - color: var(--text-light, #888); + padding: 0 24px 10px; + font-size: 11px; + color: #9ca3af; font-weight: 600; - letter-spacing: 0.02em; + letter-spacing: 0.08em; + text-transform: uppercase; + margin-bottom: 6px; } .dropdown-submenu .dropdown-submenu-title-link { display: block; - padding: 10px 20px; - font-size: 14px; - font-weight: 400; - color: var(--text-color, #333); + padding: 10px 24px; + font-size: 15px; + font-weight: 600; + color: #1f2937; + margin-bottom: 6px; + transition: background 0.2s ease, color 0.2s ease; + position: relative; } .dropdown-submenu .dropdown-submenu-title-link:hover { - background: rgba(14, 165, 233, 0.06); - color: var(--brand-primary); + background: #f3f4f6; + color: #0ea5e9; +} + +.dropdown-submenu .dropdown-submenu-title-link.active { + background: #eff6ff; + color: #0ea5e9; + font-weight: 600; +} + +/* 如果标题链接是唯一子元素,增加底部间距 */ +.dropdown-submenu:has(.dropdown-submenu-title-link:only-child) .dropdown-submenu-title-link { + margin-bottom: 0; } .dropdown-submenu a:not(.dropdown-submenu-title-link) { - padding: 8px 20px 8px 28px; - font-size: 13px; - color: var(--text-color, #333); + display: block; + padding: 8px 24px 8px 36px; + font-size: 14px; + color: #4b5563; + font-weight: 400; + transition: background 0.2s ease, color 0.2s ease; + position: relative; +} + +.dropdown-submenu a:not(.dropdown-submenu-title-link)::before { + content: '•'; + position: absolute; + left: 24px; + color: #9ca3af; + font-size: 12px; } .dropdown-submenu a:not(.dropdown-submenu-title-link):hover { - background: rgba(14, 165, 233, 0.06); - color: var(--brand-primary); + background: #f3f4f6; + color: #0ea5e9; +} + +.dropdown-submenu a:not(.dropdown-submenu-title-link):hover::before { + color: #0ea5e9; +} + +.dropdown-submenu a:not(.dropdown-submenu-title-link).active { + background: #eff6ff; + color: #0ea5e9; + font-weight: 500; } /* 风险活动触发项(无链接,仅展开) */ .nav-dropdown-trigger { - color: var(--text-color, #333); - font-size: 14px; + color: #1f2937; + font-size: 15px; font-weight: 500; - padding: 0 16px; + padding: 0 20px; cursor: default; user-select: none; } .nav-dropdown-trigger.active::after { - left: 16px; - right: 16px; + left: 20px; + right: 20px; } /* 登录按钮:vdano 风格多为线框或文字按钮 */ .login-btn { - margin-left: 16px; - padding: 8px 20px; + margin-left: 20px; + padding: 8px 24px; font-size: 14px; font-weight: 500; - color: var(--brand-primary); + color: #0ea5e9; background: transparent; - border: 1px solid var(--brand-primary); - border-radius: 4px; + border: 1px solid #0ea5e9; + border-radius: 6px; text-decoration: none; - transition: background 0.15s ease, color 0.15s ease; + transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease; display: inline-flex; align-items: center; } .login-btn:hover { - background: var(--brand-primary); - color: var(--white); + background: #0ea5e9; + color: #ffffff; + border-color: #0ea5e9; } .login-btn.active, @@ -287,14 +359,14 @@ @media (max-width: 768px) { .header { height: auto; - min-height: 56px; + min-height: 64px; } .header-content { flex-direction: column; align-items: stretch; height: auto; - padding: 12px 16px; + padding: 12px 20px; } .nav { @@ -319,10 +391,26 @@ .dropdown-menu { position: static; box-shadow: none; - border: 1px solid var(--border-color, #eee); - border-radius: 4px; + border: 1px solid #e5e7eb; + border-radius: 6px; margin-top: 4px; margin-left: 12px; + min-width: auto; + } + + .dropdown-menu-level3-wrapper { + flex-direction: column; + min-width: auto; + } + + .dropdown-submenu { + border-right: none; + border-bottom: 1px solid var(--border-color, #eee); + padding: 12px 0; + } + + .dropdown-submenu:last-of-type { + border-bottom: none; } .login-btn { diff --git a/src/components/Header.tsx b/src/components/Header.tsx index e57cf09..b47832c 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -7,10 +7,9 @@ function Header() { const location = useLocation() const navigate = useNavigate() const { isAuthenticated, user, logout } = useAuth() - const [concernOpen, setConcernOpen] = useState(false) - const [riskDataOpen, setRiskDataOpen] = useState(false) - const [riskActivitiesOpen, setRiskActivitiesOpen] = useState(false) - const [resourceOpen, setResourceOpen] = useState(false) + const [aboutRmoOpen, setAboutRmoOpen] = useState(false) + const [solutionsOpen, setSolutionsOpen] = useState(false) + const [knowledgeOpen, setKnowledgeOpen] = useState(false) const isActive = (path: string) => location.pathname === path const isActiveParent = (paths: string[]) => paths.some(p => location.pathname.startsWith(p)) @@ -33,106 +32,102 @@ function Header() { 首页 - {/* 一级:风险职责(二级菜单) */} -
setConcernOpen(true)} - onMouseLeave={() => setConcernOpen(false)} - > - - 风险职责 - - - {concernOpen && ( -
- 申办者职责 - 持有人职责 - 受试者专区 - 研究中心 - CXO职责 -
- )} -
- - {/* 一级:风险数据(二级菜单) */} -
setRiskDataOpen(true)} - onMouseLeave={() => setRiskDataOpen(false)} - > - - 风险数据 - - - {riskDataOpen && ( -
- 智能获取 - PV报告 - 药安字典 -
- )} -
- - {/* 一级:风险活动(二级+三级菜单:临床试验下含保险方案等,上市应用) */} + {/* 一级:关于RMO(二级+三级菜单) */}
setRiskActivitiesOpen(true)} - onMouseLeave={() => setRiskActivitiesOpen(false)} - > - - 风险活动 - - - {riskActivitiesOpen && ( -
-
- 保险方案 - 保证方案 - 保险保证 -
-
- 上市应用 -
-
- )} -
- - {/* 一级:海外风险 */} - - 海外风险 - - - {/* 一级:资源中心(二级菜单) */} -
setResourceOpen(true)} - onMouseLeave={() => setResourceOpen(false)} + onMouseEnter={() => setAboutRmoOpen(true)} + onMouseLeave={() => setAboutRmoOpen(false)} > - 资源中心 + 关于RMO - {resourceOpen && ( -
- 法律法规 - 实践指南 - 培训材料 - 常见问题 + {aboutRmoOpen && ( +
+ {/* RMO概述 */} +
+ RMO概述 +
+ {/* 风险职责 */} +
+ 风险职责 + 申办者 + 持有人 + 研究中心 + 参与者 + CXO +
)}
+ {/* 一级:解决方案(二级菜单) */} +
setSolutionsOpen(true)} + onMouseLeave={() => setSolutionsOpen(false)} + > + + 解决方案 + + + {solutionsOpen && ( +
+ {/* 药物警戒(风险数据) */} +
+ 药物警戒 + PV服务 + AI工具 +
+ {/* 临床保险(风险活动) */} +
+ 临床保险 + 保险方案 + 保证设计 +
+ {/* 产品责任 */} +
+ 产品保险 + 保险方案 + 保证设计 +
+
+ )} +
+ + {/* 一级:知识资源(二级菜单) */} +
setKnowledgeOpen(true)} + onMouseLeave={() => setKnowledgeOpen(false)} + > + + 知识资源 + + + {knowledgeOpen && ( +
+ 法规指南 + 保险知识 + PV与保险 + 常见问题 +
+ )} +
+ + {/* 一级:联系我们 */} + + 联系我们 + + {/* 登录/用户信息 */} {isAuthenticated ? (
diff --git a/src/components/Header.vue b/src/components/Header.vue new file mode 100644 index 0000000..1ef6b80 --- /dev/null +++ b/src/components/Header.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/components/Layout.css b/src/components/Layout.css index 1ec3d37..3728e0f 100644 --- a/src/components/Layout.css +++ b/src/components/Layout.css @@ -6,6 +6,6 @@ .main-content { flex: 1; - padding-top: 56px; + padding-top: 64px; } diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index f2d8f98..6f49f73 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,6 +1,7 @@ import { ReactNode } from 'react' import Header from './Header' import Footer from './Footer' +import CookieConsent from './CookieConsent' import './Layout.css' interface LayoutProps { @@ -15,6 +16,7 @@ function Layout({ children }: LayoutProps) { {children}
+
) } diff --git a/src/components/Layout.vue b/src/components/Layout.vue new file mode 100644 index 0000000..48801bb --- /dev/null +++ b/src/components/Layout.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/components/PageContainer.vue b/src/components/PageContainer.vue new file mode 100644 index 0000000..42eae6a --- /dev/null +++ b/src/components/PageContainer.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/components/PageHeader.vue b/src/components/PageHeader.vue new file mode 100644 index 0000000..e9f1318 --- /dev/null +++ b/src/components/PageHeader.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ProtectedRoute.vue b/src/components/ProtectedRoute.vue new file mode 100644 index 0000000..7354690 --- /dev/null +++ b/src/components/ProtectedRoute.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/QuoteRequestModal.vue b/src/components/QuoteRequestModal.vue new file mode 100644 index 0000000..632e53a --- /dev/null +++ b/src/components/QuoteRequestModal.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..323c78a --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..58d23a0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import App from './App.vue' +import router from './router' +import { useAuthStore } from './stores/auth' +import './index.css' +import './styles/common.css' + +const app = createApp(App) +const pinia = createPinia() +app.use(pinia) +useAuthStore().restoreAuth() +app.use(router) +app.mount('#app') diff --git a/src/main.tsx b/src/main.tsx deleted file mode 100644 index b042fd4..0000000 --- a/src/main.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import { AuthProvider } from './contexts/AuthContext' -import './index.css' -import './styles/common.css' - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - , -) - diff --git a/src/pages/AboutOverview.css b/src/pages/AboutOverview.css new file mode 100644 index 0000000..13d44d2 --- /dev/null +++ b/src/pages/AboutOverview.css @@ -0,0 +1,102 @@ +.about-overview { + min-height: 100%; +} + +.content-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 24px; + margin-top: 32px; +} + +.content-card { + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 32px; +} + +.content-card h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-color); +} + +.content-card p { + font-size: 16px; + color: var(--text-light); + line-height: 1.6; + margin: 0; +} + +.content-card ul { + list-style: none; + padding: 0; + margin: 0; +} + +.content-card li { + padding: 8px 0; + padding-left: 24px; + position: relative; + font-size: 16px; + color: var(--text-light); + line-height: 1.6; +} + +.content-card li::before { + content: "✓"; + position: absolute; + left: 0; + color: var(--brand-primary); + font-weight: bold; +} + +.services-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 24px; + margin-top: 32px; +} + +.service-item { + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 32px 24px; + text-align: center; + transition: all 0.3s ease; +} + +.service-item:hover { + border-color: var(--brand-primary); + box-shadow: 0 4px 12px rgba(14, 165, 233, 0.1); + transform: translateY(-2px); +} + +.service-icon { + font-size: 48px; + margin-bottom: 16px; +} + +.service-item h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; + color: var(--text-color); +} + +.service-item p { + font-size: 14px; + color: var(--text-light); + line-height: 1.6; + margin: 0; +} + +@media (max-width: 768px) { + .content-grid, + .services-grid { + grid-template-columns: 1fr; + } +} diff --git a/src/pages/AboutOverview.tsx b/src/pages/AboutOverview.tsx new file mode 100644 index 0000000..210c8cc --- /dev/null +++ b/src/pages/AboutOverview.tsx @@ -0,0 +1,76 @@ +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './AboutOverview.css' + +function AboutOverview() { + return ( + +
+ +
+
+
+

关于RMO

+
+
+

我们的使命

+

+ RMO致力于为生命科学行业提供全方位的风险管理解决方案,通过系统化的数据收集、监测和分析,识别潜在风险信号,为风险管理决策提供科学依据。 +

+
+
+

我们的愿景

+

+ 成为生命科学领域最具影响力的风险管理平台,为临床试验和上市后药物安全提供专业、高效的风险管理服务。 +

+
+
+

核心价值

+
    +
  • 专业:基于行业最佳实践和法规要求
  • +
  • 高效:系统化的流程和智能化的工具
  • +
  • 可靠:严格的质量控制和数据安全
  • +
  • 创新:持续的技术创新和服务优化
  • +
+
+
+
+
+ +
+
+

服务范围

+
+
+
📊
+

药物警戒

+

系统化的数据收集、监测和分析服务

+
+
+
🛡️
+

临床保险

+

为临床试验提供全面的保险保障服务

+
+
+
💼
+

产品保险

+

上市后药物安全与风险管理保障

+
+
+
📚
+

知识资源

+

法规指南、保险知识、行业洞见

+
+
+
+
+
+
+
+ ) +} + +export default AboutOverview diff --git a/src/pages/Contact.css b/src/pages/Contact.css new file mode 100644 index 0000000..c815ebb --- /dev/null +++ b/src/pages/Contact.css @@ -0,0 +1,85 @@ +.contact-page { + min-height: 100%; +} + +.contact-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 24px; + margin-top: 32px; +} + +.contact-card { + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 32px 24px; + text-align: center; +} + +.contact-card h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-color); +} + +.contact-card p { + font-size: 16px; + color: var(--text-light); + line-height: 1.8; + margin: 8px 0; +} + +.newsletter-form { + max-width: 600px; + margin: 32px auto 0; +} + +.form-group { + display: flex; + gap: 12px; + margin-bottom: 16px; +} + +.form-input { + flex: 1; + padding: 12px 16px; + border: 1px solid var(--border-color); + border-radius: 6px; + font-size: 16px; + transition: border-color 0.3s ease; +} + +.form-input:focus { + outline: none; + border-color: var(--brand-primary); +} + +.form-note { + font-size: 12px; + color: var(--text-light); + line-height: 1.6; + margin: 0; + text-align: center; +} + +.privacy-link { + color: var(--brand-primary, #0ea5e9); + text-decoration: underline; + transition: color 0.2s ease; +} + +.privacy-link:hover { + color: var(--brand-primary-dark, #0284c7); +} + +@media (max-width: 768px) { + .contact-grid { + grid-template-columns: 1fr; + } + + .form-group { + flex-direction: column; + } +} diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx new file mode 100644 index 0000000..d0eb933 --- /dev/null +++ b/src/pages/Contact.tsx @@ -0,0 +1,72 @@ +import { Link } from 'react-router-dom' +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './Contact.css' + +function Contact() { + return ( + +
+ +
+
+
+
+
+

客户服务中心

+

邮箱:clientservice@rmo.com

+

电话:400-XXX-XXXX

+
+
+

业务咨询/RFP

+

邮箱:marketing@rmo.com

+

电话:400-XXX-XXXX

+
+
+

媒体与投资者咨询

+

邮箱:PR@rmo.com

+

电话:400-XXX-XXXX

+
+
+

合规疑虑

+

邮箱:compliance@rmo.com

+

电话:400-XXX-XXXX

+
+
+
+
+ +
+
+

订阅我们的通讯

+

+ 马上注册RMO通讯简报,第一时间获取我们的企业动态、白皮书、行业报告。 +

+
+
+ + +
+

+ RMO承诺对您在本网页下提供的任何信息,包括您的个人信息将按照相关的法律法规及RMO《隐私政策》的规定进行严格保密。 +

+
+
+
+
+
+
+ ) +} + +export default Contact diff --git a/src/pages/Home.css b/src/pages/Home.css index 1913426..8a448e0 100644 --- a/src/pages/Home.css +++ b/src/pages/Home.css @@ -1,29 +1,125 @@ -.hero { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: var(--white); - padding: 120px 0 80px; - text-align: center; +/* ========== 全屏滚动首页样式 ========== */ +.home-fullscreen { + position: relative; + height: 100vh; + overflow-y: auto; + scroll-snap-type: y mandatory; + scroll-behavior: smooth; } -.hero-compact { - padding: 60px 0 40px; +.home-section { + height: 100vh; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + scroll-snap-align: start; + position: relative; + padding: 80px 24px 24px; + box-sizing: border-box; +} + +/* ========== 滚动指示器 ========== */ +.scroll-indicator { + position: fixed; + right: 24px; + top: 50%; + transform: translateY(-50%); + z-index: 999; + display: flex; + flex-direction: column; + gap: 12px; +} + +.indicator-dot { + width: 10px; + height: 10px; + border-radius: 50%; + border: 2px solid var(--brand-primary, #0ea5e9); + background: transparent; + cursor: pointer; + transition: all 0.3s ease; + padding: 0; +} + +.indicator-dot:hover { + background: rgba(14, 165, 233, 0.3); + transform: scale(1.2); +} + +.indicator-dot.active { + background: var(--brand-primary, #0ea5e9); + transform: scale(1.3); +} + +/* ========== Hero Section ========== */ +.hero-section { + background-image: url('/pic/Home_Page.png'); + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + background-attachment: fixed; + color: var(--white); + text-align: center; + position: relative; + overflow: hidden; + min-height: 100vh; +} + +.hero-section::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 135deg, + rgba(14, 165, 233, 0.25) 0%, + rgba(2, 132, 199, 0.25) 100% + ); + z-index: 0; + pointer-events: none; +} + +.hero-section::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.15); + z-index: 0; + pointer-events: none; } .hero-content { - max-width: 800px; + max-width: 900px; margin: 0 auto; + z-index: 1; + position: relative; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); } .hero-title { - font-size: 48px; + font-size: 64px; font-weight: 700; - margin-bottom: 20px; + margin-bottom: 24px; + line-height: 1.2; + letter-spacing: -0.02em; + color: var(--white); + text-shadow: 0 2px 12px rgba(0, 0, 0, 0.5); } .hero-subtitle { - font-size: 20px; - margin-bottom: 40px; - opacity: 0.9; + font-size: 24px; + margin-bottom: 48px; + opacity: 0.95; + line-height: 1.6; + font-weight: 400; + color: var(--white); + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.4); } .hero-buttons { @@ -33,406 +129,286 @@ flex-wrap: wrap; } -.hero-buttons .btn-quote { - background: rgba(255, 255, 255, 0.95); - color: var(--brand-primary, #0ea5e9); - border: 2px solid rgba(255, 255, 255, 0.95); -} - -.hero-buttons .btn-quote:hover { - background: var(--white); - color: var(--brand-primary-dark, #0284c7); - border-color: var(--white); -} - -/* 智能工具快捷入口 - 页面中部左侧 */ -.home-quick-tools { - position: fixed; - left: 24px; - top: 50%; - transform: translateY(-50%); - z-index: 100; - display: flex; - flex-direction: column; - align-items: center; - gap: 12px; -} - -.home-quick-tool-icon { +.hero-scroll-hint { + position: absolute; + bottom: 40px; + left: 50%; + transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; gap: 8px; - width: 120px; - padding: 12px; + color: var(--white); + opacity: 0.8; + font-size: 14px; + animation: bounce 2s infinite; +} + +.scroll-arrow { + font-size: 24px; +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + transform: translateX(-50%) translateY(0); + } + 40% { + transform: translateX(-50%) translateY(-10px); + } + 60% { + transform: translateX(-50%) translateY(-5px); + } +} + +/* ========== Section通用样式 ========== */ +.section-content { + max-width: 1200px; + margin: 0 auto; + width: 100%; + padding: 0 24px; +} + +.section-title { + font-size: 48px; + font-weight: 600; + margin-bottom: 16px; + text-align: center; + color: var(--text-color); + letter-spacing: -0.02em; +} + +.section-subtitle { + font-size: 20px; + color: var(--text-light); + text-align: center; + margin-bottom: 48px; + line-height: 1.6; +} + +/* ========== 解决方案 Section ========== */ +.solutions-section { background: var(--white); +} + +.solutions-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 32px; + margin-top: 48px; +} + +.solution-card { + background: var(--white); + border: 1px solid var(--border-color); border-radius: 12px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12); + padding: 40px 32px; + text-align: center; text-decoration: none; color: var(--text-color); - transition: transform 0.2s ease, box-shadow 0.2s ease; + transition: all 0.3s ease; + display: flex; + flex-direction: column; + align-items: center; } -.home-quick-tool-icon:hover { - transform: scale(1.04); - box-shadow: 0 6px 24px rgba(0, 0, 0, 0.18); +.solution-card:hover { + border-color: var(--brand-primary); + box-shadow: 0 8px 24px rgba(14, 165, 233, 0.15); + transform: translateY(-4px); } -.home-quick-tool-icon img { - width: 88px; - height: auto; - display: block; - border-radius: 8px; +.solution-icon { + font-size: 64px; + margin-bottom: 24px; } -.home-quick-tool-icon .quick-tool-emoji { - font-size: 48px; +.solution-card h3 { + font-size: 24px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-color); +} + +.solution-card p { + font-size: 16px; + color: var(--text-light); + line-height: 1.6; + margin-bottom: 24px; + flex: 1; +} + +.solution-link { + color: var(--brand-primary); + font-weight: 500; + font-size: 16px; +} + +/* ========== 核心能力 Section ========== */ +.capabilities-section { + background: linear-gradient( + 135deg, + rgba(14, 165, 233, 0.05) 0%, + rgba(2, 132, 199, 0.05) 100% + ); +} + +.capabilities-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 48px; + margin-top: 48px; +} + +.capability-item { + text-align: center; +} + +.capability-number { + font-size: 56px; + font-weight: 700; + color: var(--brand-primary); + margin-bottom: 12px; line-height: 1; } -.home-quick-tool-icon .quick-tool-label { - font-size: 13px; +.capability-label { + font-size: 18px; + color: var(--text-light); font-weight: 500; - text-align: center; - line-height: 1.3; } -.logic-section { - background: var(--bg-color); - padding: 80px 0; -} - -.logic-content { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); - gap: 40px; - margin-top: 40px; -} - -.logic-card { - background: var(--white); - border-radius: 12px; - padding: 40px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.logic-card:hover { - transform: translateY(-5px); - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); -} - -.logic-header { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 25px; - padding-bottom: 20px; - border-bottom: 2px solid var(--border-color); -} - -.logic-icon { - font-size: 48px; -} - -.logic-header h3 { - font-size: 24px; - color: var(--primary-color); - margin: 0; -} - -.logic-body p { - font-size: 16px; - color: var(--text-color); - line-height: 1.6; - margin-bottom: 20px; -} - -.logic-list { - list-style: none; - padding: 0; - margin: 0; -} - -.logic-list li { - padding: 12px 0; - padding-left: 25px; - position: relative; - font-size: 15px; - color: var(--text-color); - line-height: 1.6; -} - -.logic-list li::before { - content: "✓"; - position: absolute; - left: 0; - color: var(--primary-color); - font-weight: bold; - font-size: 18px; -} - -.action-steps { - display: flex; - flex-direction: column; - gap: 20px; -} - -.action-step { - display: flex; - gap: 20px; - align-items: flex-start; - padding: 20px; - background: var(--bg-color); - border-radius: 8px; - transition: background 0.3s ease; -} - -.action-step:hover { - background: rgba(var(--brand-primary-rgb), 0.05); -} - -.step-number { - width: 40px; - height: 40px; - background: var(--primary-color); - color: var(--white); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; - font-size: 18px; - flex-shrink: 0; -} - -.step-content { - flex: 1; -} - -.step-content h4 { - font-size: 18px; - color: var(--text-color); - margin: 0 0 8px 0; -} - -.step-content p { - font-size: 14px; - color: var(--text-light); - margin: 0; - line-height: 1.5; -} - -.model-section { +/* ========== 知识资源 Section ========== */ +.knowledge-section { background: var(--white); } -.model-diagram { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - gap: 20px; - margin-top: 40px; -} - -.model-card { - background: var(--bg-color); - padding: 30px; - border-radius: 12px; - text-align: center; - min-width: 200px; - flex: 1; - max-width: 250px; -} - -a.model-card { - text-decoration: none; - color: inherit; - display: flex; - flex-direction: column; - align-items: center; - transition: background 0.2s ease, box-shadow 0.2s ease; -} - -a.model-card:hover { - background: rgba(14, 165, 233, 0.08); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); -} - -.model-icon { - font-size: 48px; - margin-bottom: 15px; -} - -.model-card h3 { - font-size: 20px; - margin-bottom: 10px; - color: var(--text-color); -} - -.model-card p { - font-size: 14px; - color: var(--text-light); -} - -.model-arrow { - font-size: 32px; - color: var(--primary-color); - font-weight: bold; -} - -.intro-section { - background: var(--bg-color); -} - -.intro-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 30px; -} - -.intro-grid .card h3 { - font-size: 24px; - margin-bottom: 15px; - color: var(--primary-color); -} - -.value-list { - list-style: none; - padding: 0; -} - -.value-list li { - padding: 10px 0; - font-size: 16px; - color: var(--text-color); -} - -.nav-section { - background: var(--white); -} - -.nav-grid { +.knowledge-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 30px; - margin-top: 40px; + gap: 24px; + margin-top: 48px; } -.nav-card { - background: var(--white); - border: 2px solid var(--border-color); +.knowledge-card { + background: var(--bg-color); + border: 1px solid var(--border-color); border-radius: 12px; - padding: 40px 30px; - text-align: center; + padding: 32px 24px; + text-decoration: none; + color: var(--text-color); transition: all 0.3s ease; - display: block; } -.nav-card:hover { - border-color: rgba(var(--brand-primary-rgb), 0.3); - box-shadow: var(--shadow-hover); - filter: brightness(1.02); +.knowledge-card:hover { + border-color: var(--brand-primary); + box-shadow: 0 4px 12px rgba(14, 165, 233, 0.1); + transform: translateY(-2px); } -.nav-icon { - font-size: 64px; - margin-bottom: 20px; -} - -.nav-card h3 { - font-size: 22px; - margin-bottom: 15px; +.knowledge-card h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; color: var(--text-color); } -.nav-card p { +.knowledge-card p { font-size: 14px; color: var(--text-light); + line-height: 1.6; + margin: 0; } +/* ========== 联系我们 Section ========== */ +.contact-section { + background: linear-gradient( + 135deg, + rgba(14, 165, 233, 0.95) 0%, + rgba(2, 132, 199, 0.95) 100% + ); + color: var(--white); +} + +.contact-section .section-title, +.contact-section .section-subtitle { + color: var(--white); +} + +.contact-actions { + display: flex; + gap: 20px; + justify-content: center; + flex-wrap: wrap; + margin-top: 32px; +} + +/* ========== 响应式设计 ========== */ @media (max-width: 768px) { + .home-section { + padding: 100px 16px 24px; + } + + .hero-section { + background-attachment: scroll; /* 移动端禁用fixed,提升性能 */ + } + .hero-title { - font-size: 32px; + font-size: 36px; } .hero-subtitle { + font-size: 18px; + } + + .section-title { + font-size: 32px; + } + + .section-subtitle { font-size: 16px; } - .hero-buttons { - flex-direction: column; - align-items: center; - } - - .model-diagram { - flex-direction: column; - } - - .model-arrow { - transform: rotate(90deg); - } - - .intro-grid, - .nav-grid { + .solutions-grid, + .knowledge-grid { grid-template-columns: 1fr; + gap: 24px; } - .logic-content { - grid-template-columns: 1fr; - gap: 30px; + .capabilities-grid { + grid-template-columns: repeat(2, 1fr); + gap: 32px; } - .logic-card { - padding: 30px 20px; + .scroll-indicator { + right: 12px; } - .logic-header { + .hero-buttons, + .contact-actions { flex-direction: column; - text-align: center; - gap: 10px; + align-items: stretch; } - .logic-header h3 { - font-size: 20px; - } - - .action-step { - flex-direction: column; - text-align: center; - gap: 15px; - } - - .step-number { - margin: 0 auto; - } - - .home-quick-tools { - position: static; - transform: none; - left: auto; - flex-direction: row; - justify-content: center; - gap: 16px; - margin: 16px 0; - padding: 0 16px; - } - - .home-quick-tool-icon { - width: 100px; - } - - .home-quick-tool-icon:hover { - transform: scale(1.02); - } - - .home-quick-tool-icon img { - width: 72px; - } - - .home-quick-tool-icon .quick-tool-emoji { - font-size: 40px; + .hero-buttons .btn, + .contact-actions .btn { + width: 100%; } } +@media (max-width: 480px) { + .hero-title { + font-size: 28px; + } + + .section-title { + font-size: 24px; + } + + .capabilities-grid { + grid-template-columns: 1fr; + } + + .capability-number { + font-size: 40px; + } +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 246463d..2299fc8 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,155 +1,201 @@ import { Link } from 'react-router-dom' -import PageContainer from '../components/PageContainer' +import { useEffect, useRef, useState } from 'react' import { useQuoteModal } from '../contexts/QuoteModalContext' import './Home.css' function Home() { const { openQuoteModal } = useQuoteModal() + const [currentSection, setCurrentSection] = useState(0) + const sectionsRef = useRef<(HTMLElement | null)[]>([]) + + useEffect(() => { + const handleWheel = (e: WheelEvent) => { + e.preventDefault() + const delta = e.deltaY > 0 ? 1 : -1 + const nextSection = Math.max(0, Math.min(sectionsRef.current.length - 1, currentSection + delta)) + + if (nextSection !== currentSection) { + setCurrentSection(nextSection) + sectionsRef.current[nextSection]?.scrollIntoView({ behavior: 'smooth' }) + } + } + + window.addEventListener('wheel', handleWheel, { passive: false }) + return () => window.removeEventListener('wheel', handleWheel) + }, [currentSection]) + + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + const index = sectionsRef.current.indexOf(entry.target as HTMLElement) + if (index !== -1) { + setCurrentSection(index) + } + } + }) + }, + { threshold: 0.5 } + ) + + sectionsRef.current.forEach((section) => { + if (section) observer.observe(section) + }) + + return () => observer.disconnect() + }, []) return ( - -
- {/* Hero Section */} -
-
-
-

生命科学风险管理的保险与保证方案

-
- 保险方案 - 保证方案 - -
-
-
-
- - {/* 智能工具快捷入口 - 页面中部左侧 */} -
- - 📋 - 全部保司报价 - - - 上传方案进行评估 - 方案风险评估 - - - 🔍 - 药安查 - +
+ {/* 导航指示器 */} +
+ {[0, 1, 2, 3, 4].map((index) => ( +
- {/* 风险管理逻辑区域 */} -
-
-

风险管理业务

-
- {/* 基于数据,发现分析 */} -
-
-
📈
-

安全数据服务

-
-
-

通过系统化的数据收集、监测和分析,识别潜在风险信号,为风险管理决策提供科学依据。

-
    -
  • 数据收集与整合:多渠道数据源整合,建立统一的风险数据库
  • -
  • 信号检测:运用统计学方法和数据挖掘技术,及时发现异常信号
  • -
  • 风险分析:深入分析风险特征、发生频率和严重程度
  • -
  • 趋势评估:持续监测风险变化趋势,预测潜在风险
  • -
-
-
- - {/* 管理行动 */} -
-
-
⚙️
-

风险管理业务

-
-
-

基于风险分析结果,采取系统化的管理行动,形成完整的风险管理闭环。

-
    -
  • 风险预防:制定预防性措施,从源头降低风险发生概率
  • -
  • 措施执行:落实风险控制措施,确保各项管理要求有效实施
  • -
  • 效果评估:定期评估风险管理措施的有效性,监测风险控制效果
  • -
  • 改进完善:根据评估结果持续优化风险管理策略,提升管理水平
  • -
-
-
+ {/* Section 1: Hero - 主视觉 */} +
(sectionsRef.current[0] = el)} + className="home-section hero-section" + style={{ + backgroundImage: "url('/pic/Home_Page.png')", + backgroundPosition: 'center center', + backgroundSize: 'cover', + backgroundRepeat: 'no-repeat', + backgroundAttachment: 'fixed' + }} + > +
+

赋能生命科学风险管理

+

+ 为临床试验和上市后药物安全提供全方位的风险管理解决方案 +

+
+ 了解更多 +
+
+ 向下滚动 +
+
- {/* 风险管理体系区域 */} -
-
-

风险管理体系

-
- -
📜
-

法律法规

-

临床试验风险主体,承担主要责任

- -
-
-
📚
-

实践指南

-

协助风险管理,保障受试者安全

-
-
-
-
📊
-

行业动态

-

风险提示与行业信息

-
-
-
-
🔍
+ {/* Section 2: 解决方案 */} +
(sectionsRef.current[1] = el)} + className="home-section solutions-section" + > +
+

一体化风险管理解决方案

+

提供全流程研发服务与解决方案

+
+ +
📊

药物警戒

-

全面保障,确保安全

+

系统化的数据收集、监测和分析,识别潜在风险信号

+ 了解更多 → + + +
🛡️
+

临床保险

+

为临床试验提供全面的保险保障服务

+ 了解更多 → + + +
💼
+

产品保险

+

上市后药物安全与风险管理保障

+ 了解更多 → + +
+
+
+ + {/* Section 3: 核心能力 */} +
(sectionsRef.current[2] = el)} + className="home-section capabilities-section" + > +
+

核心能力

+
+
+
10,000+
+
服务项目
+
+
+
3,600+
+
合作客户
+
+
+
180+
+
服务网络
+
+
+
130+
+
创新药项目
- {/* 快速导航 */} -
-
-

各方职责

-
- -
💼
-

申办者职责

-

风险管理体系

+ {/* Section 4: 知识资源 */} +
(sectionsRef.current[3] = el)} + className="home-section knowledge-section" + > +
+

知识资源

+

分享我们的行业洞见和研发咨询

+
+ +

法规指南

+

最新的法律法规与实践指南

- -
📋
-

持有人职责

-

负责上市后药物安全

+ +

保险知识

+

保险方案设计与风险管理知识

- -
🏥
-

研究中心

-

机构、研究者、伦理委员会支持

+ +

PV与保险

+

药物警戒与保险的深度融合

- -
👤
-

受试者专区

-

临床试验介绍、权益保障、损害救济

- - -
🤝
-

CXO职责

-

CRO、CDMO、SMO支持服务

+ +

常见问题

+

解答您关心的问题

+ + {/* Section 5: 联系我们 */} +
(sectionsRef.current[4] = el)} + className="home-section contact-section" + > +
+

联系我们

+

获取RMO最新资讯,第一时间了解我们的企业动态

+
+ 立即联系 + 关于RMO +
+
+
- ) } diff --git a/src/pages/KnowledgeBase.css b/src/pages/KnowledgeBase.css new file mode 100644 index 0000000..a72636e --- /dev/null +++ b/src/pages/KnowledgeBase.css @@ -0,0 +1,44 @@ +.knowledge-page { + min-height: 100%; +} + +.knowledge-content { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 24px; + margin-top: 32px; +} + +.knowledge-card { + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 32px 24px; + transition: all 0.3s ease; +} + +.knowledge-card:hover { + border-color: var(--brand-primary); + box-shadow: 0 4px 12px rgba(14, 165, 233, 0.1); + transform: translateY(-2px); +} + +.knowledge-card h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-color); +} + +.knowledge-card p { + font-size: 16px; + color: var(--text-light); + line-height: 1.6; + margin: 0; +} + +@media (max-width: 768px) { + .knowledge-content { + grid-template-columns: 1fr; + } +} diff --git a/src/pages/KnowledgeInsurance.tsx b/src/pages/KnowledgeInsurance.tsx new file mode 100644 index 0000000..689a86e --- /dev/null +++ b/src/pages/KnowledgeInsurance.tsx @@ -0,0 +1,38 @@ +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './KnowledgeBase.css' + +function KnowledgeInsurance() { + return ( + +
+ +
+
+
+
+
+

保险方案设计

+

了解如何设计适合临床试验的保险方案,包括基础保障和全面保障。

+
+
+

风险管理

+

学习风险管理的最佳实践,降低临床试验风险。

+
+
+

理赔流程

+

了解保险理赔的流程和要求,确保及时获得保障。

+
+
+
+
+
+
+
+ ) +} + +export default KnowledgeInsurance diff --git a/src/pages/KnowledgePvInsurance.tsx b/src/pages/KnowledgePvInsurance.tsx new file mode 100644 index 0000000..d129507 --- /dev/null +++ b/src/pages/KnowledgePvInsurance.tsx @@ -0,0 +1,38 @@ +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './KnowledgeBase.css' + +function KnowledgePvInsurance() { + return ( + +
+ +
+
+
+
+
+

PV数据在保险中的应用

+

如何利用药物警戒数据优化保险方案设计和风险评估。

+
+
+

风险信号识别

+

通过PV系统识别风险信号,为保险决策提供依据。

+
+
+

综合风险管理

+

将PV与保险相结合,形成完整的风险管理体系。

+
+
+
+
+
+
+
+ ) +} + +export default KnowledgePvInsurance diff --git a/src/pages/KnowledgeRegulations.tsx b/src/pages/KnowledgeRegulations.tsx new file mode 100644 index 0000000..ec44d06 --- /dev/null +++ b/src/pages/KnowledgeRegulations.tsx @@ -0,0 +1,38 @@ +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './KnowledgeBase.css' + +function KnowledgeRegulations() { + return ( + +
+ +
+
+
+
+
+

法律法规

+

临床试验相关的法律法规要求,包括GCP、药物管理法等。

+
+
+

实践指南

+

行业最佳实践指南,协助风险管理,保障受试者安全。

+
+
+

行业动态

+

最新的风险提示与行业信息,及时了解行业变化。

+
+
+
+
+
+
+
+ ) +} + +export default KnowledgeRegulations diff --git a/src/pages/PrivacyPolicy.css b/src/pages/PrivacyPolicy.css new file mode 100644 index 0000000..4100d84 --- /dev/null +++ b/src/pages/PrivacyPolicy.css @@ -0,0 +1,131 @@ +.privacy-policy-page { + min-height: 100%; +} + +.privacy-content { + max-width: 900px; + margin: 0 auto; + padding: 40px; + line-height: 1.8; +} + +.privacy-meta { + margin-bottom: 32px; + padding-bottom: 24px; + border-bottom: 1px solid var(--border-color); +} + +.privacy-meta p { + margin: 8px 0; + font-size: 14px; + color: var(--text-light); +} + +.privacy-intro { + margin-bottom: 40px; +} + +.privacy-intro p { + margin-bottom: 16px; + font-size: 16px; + color: var(--text-color); +} + +.privacy-section { + margin-bottom: 40px; +} + +.privacy-section h2 { + font-size: 24px; + font-weight: 600; + margin-bottom: 20px; + color: var(--text-color); + padding-bottom: 12px; + border-bottom: 2px solid var(--brand-primary); +} + +.privacy-section p { + margin-bottom: 16px; + font-size: 16px; + color: var(--text-color); + line-height: 1.8; +} + +.privacy-section ol { + margin: 16px 0; + padding-left: 24px; +} + +.privacy-section ol li { + margin-bottom: 12px; + font-size: 16px; + color: var(--text-color); + line-height: 1.8; +} + +.privacy-section ul { + margin: 12px 0; + padding-left: 24px; + list-style-type: disc; +} + +.privacy-section ul li { + margin-bottom: 8px; + font-size: 15px; + color: var(--text-color); + line-height: 1.7; +} + +.privacy-section strong { + font-weight: 600; + color: var(--text-color); +} + +.contact-info { + background: var(--bg-color); + padding: 24px; + border-radius: 8px; + margin-top: 16px; +} + +.contact-info p { + margin-bottom: 12px; +} + +.contact-info a { + color: var(--brand-primary); + text-decoration: none; +} + +.contact-info a:hover { + text-decoration: underline; +} + +.privacy-footer { + margin-top: 48px; + padding-top: 24px; + border-top: 1px solid var(--border-color); + text-align: center; +} + +.privacy-footer p { + font-size: 16px; + font-weight: 500; + color: var(--text-color); + margin: 0; +} + +@media (max-width: 768px) { + .privacy-content { + padding: 24px 20px; + } + + .privacy-section h2 { + font-size: 20px; + } + + .privacy-section p, + .privacy-section ol li { + font-size: 15px; + } +} diff --git a/src/pages/PrivacyPolicy.tsx b/src/pages/PrivacyPolicy.tsx new file mode 100644 index 0000000..b48a18e --- /dev/null +++ b/src/pages/PrivacyPolicy.tsx @@ -0,0 +1,274 @@ +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './PrivacyPolicy.css' + +function PrivacyPolicy() { + return ( + +
+ +
+
+
+
+
+

发布日期:2025 年 2 月 5 日

+

生效日期:2025 年 2 月 5 日

+
+ +
+

+ 上海达诺新晨信息科技有限公司(以下简称 "达诺" 或 "我们")负责处理您在本网站上的个人信息。 +

+

+ 请仔细阅读本隐私政策,其中描述了我们收集有关访问本网站的个人信息的方式("个人数据"),我们如何收集、使用、存储、对外提供、保护您的个人信息及您享有何种权利。 +

+

+ 本隐私政策自 2025 年 2 月 5 日起生效,除非本隐私政策的内容有所更新,其内容将持续有效。 +

+
+ +
+

1. 用户

+

+ 通过使用我们的网站,您同意并接受向达诺提供能直接或间接识别您身份的信息(以下简称 "个人信息" 或 "个人数据"),并将这类信息收集、处理和存储在中国境内。 +

+

+ 若您位于欧盟或欧洲经济区并通过我们的网站提供了您的个人信息,您有权根据欧盟《一般数据保护条例》(以下简称 "GDPR")获取任何有关达诺处理您个人信息的准确信息以及行使您在 GDPR 项下的权利。 +

+
+ +
+

2. 我们收集哪些您的个人信息

+

达诺收集并处理如下您的个人信息:

+
    +
  1. + 通过 "联系我们 - 业务咨询 / RFP""联系我们 - 媒体与投资者咨询" 与 "联系我们 - 客户反馈" 版块,我们可能会通过在线表格收集诸如您的姓名、电子邮件、联系电话、公司、职位、国家等信息; +
  2. +
  3. + 如果您对达诺在业务活动及相关事宜中有任何疑虑,您可以通过 "联系我们 - 合规疑虑" 版块联系我们,您可以通过填写在线表格的方式报告该疑虑事件,我们可能会收集诸如您的姓名、电话、邮箱等个人信息; +
  4. +
  5. + 如果您通过邮箱、电话或其他书面形式联系我们,达诺会保留您的相关信息。 +
  6. +
+

+ 除上述信息外,达诺还通过跟踪系统收集用户在浏览网站时产生的信息,这类信息包括:您的设备信息,包含用户 IP 地址或其他标识符,设备位置,浏览器信息,操作系统信息以及您的上网记录信息,包含浏览的页面和文件、搜索、操作系统和系统配置信息以及与您的使用相关的日期 / 时间戳,该等信息可能符合作为个人信息的条件。该信息用于分析总体趋势,帮助我们提供和改进我们的产品和服务,并保证其安全性和持续正常运行。具体内容,详见第 4 部分。 +

+
+ +
+

3. 我们如何使用您的个人信息

+

+ 达诺根据个人信息首次收集之目的为限度存储和处理个人信息,并且不会超过数据处理目的之必要。当您的个人信息已不再需要被处理时,达诺将确保以安全的方式处理或删除您的个人信息。达诺已使用符合业界标准的安全防护措施保护您提供的个人信息,使其免受意外、非法或未经授权的破坏、损失、变更、修改、存取、披露或使用。 +

+

达诺基于合法的理由处理您的个人信息,这些法定依据包括:

+
    +
  1. 为了与您缔结及履行合同之必要;
  2. +
  3. 您同意您的个人信息为一个或多个特定目的而处理;
  4. +
  5. 处理是基于达诺追求合法利益之必要,且该利益不与您所追求的利益或基本权利自由相冲突。
  6. +
+

达诺基于如下目的使用您的个人信息:

+
    +
  1. 个性化您在我们网站的体验;
  2. +
  3. 为您提供我们的服务(我们通过使用您的个人信息为了与您缔约合同;回答您的疑虑;介绍我们的产品或业务等);
  4. +
  5. 回复您发送给我们的邮件;
  6. +
  7. 分析您在我们网站的使用习惯,以便达诺能不断改进网站和您的用户体验;
  8. +
+

+ 若您对达诺的合规有任何疑虑,达诺将使用您留下的联系方式与您联系。 +

+

+ 若达诺是基于您的同意处理个人信息,您有权随时撤回同意并要求达诺删除有关您的任何信息。具体内容,详见第 11 部分。 +

+
+ +
+

4. Cookies

+

+ 当您访问我们网站时,我们通过 Cookies 以及网络信标等去记录我们的业绩以及网站的使用情况。Cookie 是发送到您的浏览器上并在您的电脑硬盘驱动器上存储的小量数据。只有当您使用您的电脑进入我们网站时,Cookie 才能够被发送到您的电脑硬盘上。 Cookies 常用于记录访问者浏览我们网站上的各个项目时的习惯以及偏好。Cookies 所搜集的资料是不记名的集体统计数据,不载有个人资料。Cookies 不能用于取得您的硬盘上的数据、您的电邮地址、及您的私人数据。当您重新上访我们网站时,可以省却您再次登记的步骤。大多数浏览器都预设为可以接受 Cookies。您可以选择将您的浏览器设定为不接受 Cookies, 或如果 Cookies 一被装上就通知您。不过,若设定为禁止 Cookies, 您或许便不能启动或使用我们网站的某些功能。 +

+

+ 若您不禁止或除去 cookies, 每次您使用同一台电脑进入我们的网站时,我们的网络服务器会通知我们你上访了我们网站,继而我们会辨认出您及接达您的登记数据及付款数据,搜集有关使用量、巿场研究、行迹进程及参与推广活动的资料等。 +

+

+ 您可以改动您用来进入我们网站的电脑的浏览器上的设定来决定是否接受 cookie。若您愿意,您可以改变浏览器上的设定。若您将您的偏好放在浏览器上,让您可以接受所有的 cookies, 收到 cookies 发出的通知,甚至可以拒绝一切 cookies。然而,若在您的浏览器选用不要 cookies 或拒绝所有 cookies, 您有可能不能使用或启动我们网站的某些功能,或有可能需要重新登入您的资料。 +

+
+ +
+

5. 个人信息的分享或披露

+

+ 为了保证您的个人信息安全,我们承诺,所有的共享和披露仅限您的必要个人信息,且受本隐私声明的约束;如果我们要改变个人信息的使用及处理目的,我们将再次征求您的授权同意。同时我们将会严格遵守相关法律法规对数据跨境传输的各项要求。 +

+

我们会将您的个人信息分享或披露给以下第三方:

+
    +
  1. 获得您的明确同意后,我们会与其他方共享或披露您的个人信息。
  2. +
  3. 我们可能会将您的部分个人信息共享给为我们提供网站运营服务的第三方供应商;
  4. +
  5. 共享给达诺集团成员。您可通过 "关于我们" 的版块自行查询达诺关联方的名称和联系方式及其位置列表。
  6. +
+

+ 如果我们出售或放弃我们的业务或部分业务且您的个人数据与此出售的或放弃的此部分业务有关,或我们同其它业务合并,我们将与此业务的新的所有者或并购伙伴共享您的个人数据; +

+

+ 如被依法强制要求,达诺将会与执法机构和其它政府机构共享我们收集的数据。 +

+

+ 在上述情形下,达诺将实施适当的技术性和组织性措施,以确保与风险相适应的安全等级,防止任何未经授权或非法的处理,第三方或关联公司的意外毁损、丢失或损害。 +

+
+ +
+

6. 个人信息的跨境传输

+

+ 原则上,我们在中华人民共和国境内收集和产生的个人信息,将存储在中华人民共和国境内。但基于统一集团运营和管理的需要,我们可能会将您的个人信息传输或转移到境外管辖区,或者受到来自这些管辖区的访问。该等国家可能并未设立与信息原始收集国一样的数据保护法律。若您是处于欧洲经济区且达诺将您的信息传输至欧洲经济区(EEA)之外的国家时,达诺会依据其应适用的法律法规,采取相应措施保护该等信息。 +

+

+ 我们向其传输数据的接收方所在国家或地区的个人信息保护法律可能与中国的法律不同。当我们将您的个人信息转移到中国境外时,我们将采取适当措施保护您的个人信息,例如与接收方签订包含标准数据保护条款的数据转移协议或通过数据出境安全评估,并相应履行个人信息跨境传输的义务。 +

+

+ 对于传输至欧洲经济区外的信息,达诺使用被称之为标准合同条款(SCC)的方式确保恰当的足够的保护。 +

+

+ 当您在使用达诺的网站和 / 或服务时或当您向达诺提供产品和 / 或服务时,我们收集的您的个人数据会被传输到我们在中国的集团公司。 +

+
+ +
+

7. 儿童的信息

+

+ 达诺网站通常不收集 18 周岁以下未成年人的个人信息,且网站也不针对 18 周岁以下的未成年人。 +

+

+ 如果有未成年人使用达诺的产品或网站的服务时,我们会遵循最小必要的原则和目的限制原则,在家长或监护人的明确同意下,直接从家长或监护人处收集未满 14 周岁未成年人的个人信息。 +

+

+ 若您是不满 14 周岁的儿童的监护人,当您在帮助儿童完成网站产品或服务的注册、使用前,应当仔细阅读本隐私声明、产品或服务具体的隐私保护声明(如有)以便儿童能使用我们提供的产品或服务。 +

+
+ +
+

8. 个人信息的保存期限

+

+ 达诺会按照您所在地区相关法律法规及行业惯例的规定保存您的个人信息。达诺只会在符合上述目的的情况下保存您的个人信息。 +

+

+ 我们将始终按照法律要求的期限以及根据与法律诉讼或涉及到达诺的调查相关的需求来保留您的个人信息。在您的个人信息存储期限到期后,除根据法律法规规定必须继续存储更长时间的个人信息外,我们将对您的个人信息进行删除或匿名化处理,使其处于不可被访问的状态,并留存相关删除或匿名化处理记录。 +

+
+ +
+

9. 第三方网站

+

+ 达诺的网站可能会提供第三方网站的链接,以便提供给用户更方便快捷的体验。达诺不对第三方网站做任何背书,不为该类第三方网站的内容、提供的服务、安全性以及可用性负责。同时,达诺的网站会使用第三方社交媒体,诸如微信,社交媒体可能会收集您的个人信息和 / 或使用 Cookies 功能。这些第三方网站不受本隐私政策的约束,因此,达诺建议您在访问第三方网站时详细阅读该类网站的隐私政策。 +

+
+ +
+

10. 安全

+

+ 达诺已使用符合业界标准的安全防护措施保护您的个人信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。 +

+

+ 但达诺无法保证您在网上披露的任何信息的安全性。若发生任何数据泄露事件,达诺按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。 +

+

+ 请记住,虽然达诺会采取一切合理的措施保护您的个人信息的安全,但因互联网环境的特点,达诺不能保证所有您的个人信息的绝对安全,在适用法律的合理范围内,我们不承担任何未经授权访问、使用或披露您的个人信息的所有责任。 +

+
+ +
+

11. 您的权利和请求

+
    +
  1. + 知情权 +

    达诺通过本隐私政策向您提供任何关于处理您的个人数据的信息。此外,您还可以通过本隐私政策第 13 条中的联系方式向达诺获取任何有关您个人数据处理的信息。

    +
  2. +
  3. + 数据访问权 +

    您有权从达诺处以免费的形式获取一份有关您个人信息处理的副本。

    +
  4. +
  5. + 更正权 +

    您有权要求达诺及时更正您不准确的个人信息。考虑到处理的目的,您应当有权将不完整的个人数据补充完整,包括通过提供补充声明的方式。

    +
  6. +
  7. + 删除权(被遗忘权) +

    您有权基于如下理由要求达诺删除您的个人信息:

    +
      +
    • 处理目的已实现、无法实现或者为实现处理目的不再必要;
    • +
    • 我们不再为您提供产品或服务,或者保存期限已届满;
    • +
    • 您撤回了同意;
    • +
    • 我们违反法律、行政法规或者违反约定处理您的个人信息;
    • +
    • 法律、行政法规规定的其他情形;
    • +
    +

    若法律、行政法规规定的保存期限未届满,或者删除您的个人信息从技术上难以实现的,我们将停止除存储和采取必要的安全措施之外的处理。

    +
  8. +
  9. + 限制处理权 +

    您有权基于如下理由要求限制达诺处理您的个人数据,我们会在解除限制之前通知您:

    +
      +
    • 您对您个人数据的准确性提出质疑,有权利要求达诺在核实申请和更正数据所需的时间内对您个人数据的处理进行限制;
    • +
    • 您认为达诺的处理是非法的,但您反对删除个人数据,有权利要求限制使用个人数据;
    • +
    • 基于处理目的,达诺已不再需要您的个人数据,但您提出、行使或抗辩法律诉求而需要该个人数据。
    • +
    +
  10. +
  11. + 可携带权 +

    您有权获得您已向达诺提供的个人数据,以结构化的、普遍使用的机器可读的形式,并有权不受达诺限制地将该等数据提供给其他控制者。达诺不对该类接受者的数据处理承担任何责任。

    +
  12. +
  13. + 反对权 +

    您有权在特定情况下随时反对达诺对您个人信息的处理,除非达诺能够证明其合法利益高于您的权益、权利和自由,或者法定请求权的确立、行使和抗辩有强有力的法律依据。

    +
  14. +
  15. + 撤回同意的权利 +

    若达诺是基于您的同意处理个人信息,您有权随时撤回同意。同意的撤回不应影响在撤回前基于同意作出的数据处理的合法性。

    +
  16. +
  17. + 申诉权 +

    当您认为您的权利受到侵害时,您有权向人民法院依法提起诉讼。

    +
  18. +
+

+ 您可以通过本隐私政策第 13 条中的联系方式行使您的上述权利。达诺在收到您的任何请求时,会在 15 个工作日内做出答复。 +

+
+ +
+

12. 本隐私政策如何更新

+

+ 通过在本网站上发布新的隐私政策,我们可能会不时更改或更新此隐私政策。 +

+

+ 未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。 +

+
+ +
+

13. 联系我们

+

+ 如果您对本隐私政策或者达诺的数据保护有任何疑问、意见或建议,通过以下方式与我们联系: +

+
+

邮箱:RMO@vdano.com

+

公司:上海达诺新晨信息科技有限公司(简称:达诺)

+
+
+ +
+

上海达诺新晨信息科技有限公司

+
+
+
+
+
+
+
+ ) +} + +export default PrivacyPolicy diff --git a/src/pages/Solutions.css b/src/pages/Solutions.css new file mode 100644 index 0000000..e4a18f6 --- /dev/null +++ b/src/pages/Solutions.css @@ -0,0 +1,59 @@ +.solutions-page { + min-height: 100%; +} + +.solutions-nav { + display: flex; + gap: 16px; + margin-bottom: 32px; + flex-wrap: wrap; +} + +.solution-nav-link { + padding: 12px 24px; + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 6px; + text-decoration: none; + color: var(--text-color); + font-weight: 500; + transition: all 0.3s ease; +} + +.solution-nav-link:hover { + border-color: var(--brand-primary); + color: var(--brand-primary); +} + +.solutions-content { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 24px; +} + +.solution-item { + background: var(--white); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 32px 24px; +} + +.solution-item h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-color); +} + +.solution-item p { + font-size: 16px; + color: var(--text-light); + line-height: 1.6; + margin: 0; +} + +@media (max-width: 768px) { + .solutions-content { + grid-template-columns: 1fr; + } +} diff --git a/src/pages/SolutionsClinicalInsurance.tsx b/src/pages/SolutionsClinicalInsurance.tsx new file mode 100644 index 0000000..6b27aac --- /dev/null +++ b/src/pages/SolutionsClinicalInsurance.tsx @@ -0,0 +1,43 @@ +import { Link } from 'react-router-dom' +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './Solutions.css' + +function SolutionsClinicalInsurance() { + return ( + +
+ +
+
+
+
+ 保险方案 + 保证设计 +
+
+
+

基础保障

+

满足基础合规要求的保险保障方案

+
+
+

全面保障

+

扩大保障范围、优化理赔流程与医疗直付等服务

+
+
+

风险减量

+

提供风险减量相关服务,降低风险发生概率

+
+
+
+
+
+
+
+ ) +} + +export default SolutionsClinicalInsurance diff --git a/src/pages/SolutionsPharmacovigilance.tsx b/src/pages/SolutionsPharmacovigilance.tsx new file mode 100644 index 0000000..ba1d6b8 --- /dev/null +++ b/src/pages/SolutionsPharmacovigilance.tsx @@ -0,0 +1,47 @@ +import { Link } from 'react-router-dom' +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './Solutions.css' + +function SolutionsPharmacovigilance() { + return ( + +
+ +
+
+
+
+ PV服务 + AI工具 +
+
+
+

数据收集与整合

+

多渠道数据源整合,建立统一的风险数据库

+
+
+

信号检测

+

运用统计学方法和数据挖掘技术,及时发现异常信号

+
+
+

风险分析

+

深入分析风险特征、发生频率和严重程度

+
+
+

趋势评估

+

持续监测风险变化趋势,预测潜在风险

+
+
+
+
+
+
+
+ ) +} + +export default SolutionsPharmacovigilance diff --git a/src/pages/SolutionsProductInsurance.tsx b/src/pages/SolutionsProductInsurance.tsx new file mode 100644 index 0000000..2d6134b --- /dev/null +++ b/src/pages/SolutionsProductInsurance.tsx @@ -0,0 +1,43 @@ +import { Link } from 'react-router-dom' +import PageContainer from '../components/PageContainer' +import PageHeader from '../components/PageHeader' +import './Solutions.css' + +function SolutionsProductInsurance() { + return ( + +
+ +
+
+
+
+ 保险方案 + 保证设计 +
+
+
+

上市后监测

+

持续监测上市后药物的安全性

+
+
+

风险管理

+

系统化的风险管理措施和保障方案

+
+
+

合规保障

+

确保符合上市后监管要求

+
+
+
+
+
+
+
+ ) +} + +export default SolutionsProductInsurance diff --git a/src/pages/dashboard/PremiumCalculator.tsx b/src/pages/dashboard/PremiumCalculator.tsx index 1be69c8..2eee0f6 100644 --- a/src/pages/dashboard/PremiumCalculator.tsx +++ b/src/pages/dashboard/PremiumCalculator.tsx @@ -38,9 +38,9 @@ function PremiumCalculator() {
- + handleChange('riskLevel', e.target.value)} required @@ -69,10 +69,10 @@ function PremiumCalculator() {
- + handleChange('coverageAmount', e.target.value)} placeholder="请输入保障金额" @@ -81,10 +81,10 @@ function PremiumCalculator() {
- + handleChange('participantCount', e.target.value)} placeholder="请输入受试者人数" @@ -93,10 +93,10 @@ function PremiumCalculator() {
- + handleChange('duration', e.target.value)} placeholder="请输入试验周期" diff --git a/src/pages/dashboard/RiskScoring.tsx b/src/pages/dashboard/RiskScoring.tsx index 9d03c96..173b807 100644 --- a/src/pages/dashboard/RiskScoring.tsx +++ b/src/pages/dashboard/RiskScoring.tsx @@ -53,9 +53,9 @@ function RiskScoring() {
- + handleChange('drugType', e.target.value)} required @@ -85,10 +85,10 @@ function RiskScoring() {
- + handleChange('participantCount', e.target.value)} placeholder="请输入受试者人数" diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..21392d6 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,137 @@ +import { createRouter, createWebHistory } from 'vue-router' +import Layout from '@/components/Layout.vue' +import DashboardLayout from '@/components/DashboardLayout.vue' +import ProtectedRoute from '@/components/ProtectedRoute.vue' +import { useAuthStore } from '@/stores/auth' + +// 页面组件 +import Home from '@/views/Home.vue' +import AboutOverview from '@/views/AboutOverview.vue' +import RiskDutiesOverview from '@/views/RiskDutiesOverview.vue' +import Sponsor from '@/views/Sponsor.vue' +import Holder from '@/views/Holder.vue' +import Institution from '@/views/Institution.vue' +import ServiceProvider from '@/views/ServiceProvider.vue' +import Participant from '@/views/Participant.vue' +import SolutionsPharmacovigilance from '@/views/SolutionsPharmacovigilance.vue' +import SolutionsClinicalInsurance from '@/views/SolutionsClinicalInsurance.vue' +import SolutionsProductInsurance from '@/views/SolutionsProductInsurance.vue' +import SmartAcquisition from '@/views/SmartAcquisition.vue' +import PVReport from '@/views/PVReport.vue' +import DrugSafetyDict from '@/views/DrugSafetyDict.vue' +import RmoMode from '@/views/RmoMode.vue' +import PostMarket from '@/views/PostMarket.vue' +import KnowledgeRegulations from '@/views/KnowledgeRegulations.vue' +import KnowledgeInsurance from '@/views/KnowledgeInsurance.vue' +import KnowledgePvInsurance from '@/views/KnowledgePvInsurance.vue' +import ResourceCenter from '@/views/ResourceCenter.vue' +import Overseas from '@/views/Overseas.vue' +import FAQ from '@/views/FAQ.vue' +import Contact from '@/views/Contact.vue' +import PrivacyPolicy from '@/views/PrivacyPolicy.vue' +import Login from '@/views/Login.vue' + +// Dashboard +import Dashboard from '@/views/dashboard/Dashboard.vue' +import ProjectList from '@/views/dashboard/ProjectList.vue' +import ProjectDetail from '@/views/dashboard/ProjectDetail.vue' +import InquiryList from '@/views/dashboard/InquiryList.vue' +import InquiryDetail from '@/views/dashboard/InquiryDetail.vue' +import ClaimProgress from '@/views/dashboard/ClaimProgress.vue' +import ClaimDetail from '@/views/dashboard/ClaimDetail.vue' +import Tools from '@/views/dashboard/Tools.vue' +import PremiumCalculator from '@/views/dashboard/PremiumCalculator.vue' +import ProjectQuotes from '@/views/dashboard/ProjectQuotes.vue' +import ICFEditor from '@/views/dashboard/ICFEditor.vue' +import RiskScoring from '@/views/dashboard/RiskScoring.vue' +import ProtocolRiskAssessment from '@/views/dashboard/ProtocolRiskAssessment.vue' +import DrugSafetyQuery from '@/views/dashboard/DrugSafetyQuery.vue' + +const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + component: Layout, + children: [ + { path: '', component: Home }, + { path: 'about/overview', component: AboutOverview }, + { path: 'concern', component: RiskDutiesOverview }, + { path: 'sponsor', component: Sponsor }, + { path: 'holder', component: Holder }, + { path: 'institution', component: Institution }, + { path: 'service-provider', component: ServiceProvider }, + { path: 'participant', component: Participant }, + { path: 'solutions/pharmacovigilance', component: SolutionsPharmacovigilance }, + { path: 'solutions/clinical-insurance', component: SolutionsClinicalInsurance }, + { path: 'solutions/product-insurance', component: SolutionsProductInsurance }, + { path: 'risk-data/smart-acquisition', component: SmartAcquisition }, + { path: 'risk-data/pv-report', component: PVReport }, + { path: 'risk-data/drug-safety-dict', component: DrugSafetyDict }, + { path: 'risk-data/pv-service', component: PVReport }, + { path: 'risk-data/ai-tools', component: SmartAcquisition }, + { path: 'rmo-mode', component: RmoMode }, + { path: 'rmo-mode/insurance', component: RmoMode }, + { path: 'rmo-mode/guarantee', component: RmoMode }, + { path: 'rmo-mode/insurance-guarantee', component: RmoMode }, + { path: 'post-market', component: PostMarket }, + { path: 'post-market/insurance', component: PostMarket }, + { path: 'post-market/guarantee', component: PostMarket }, + { path: 'knowledge/regulations', component: KnowledgeRegulations }, + { path: 'knowledge/insurance', component: KnowledgeInsurance }, + { path: 'knowledge/pv-insurance', component: KnowledgePvInsurance }, + { path: 'system-management', component: ResourceCenter }, + { path: 'system-management/laws', component: ResourceCenter }, + { path: 'system-management/practice-guide', component: ResourceCenter }, + { path: 'system-management/training', component: ResourceCenter }, + { path: 'system-management/faq', component: FAQ }, + { path: 'faq', component: FAQ }, + { path: 'contact', component: Contact }, + { path: 'privacy-policy', component: PrivacyPolicy }, + { path: 'overseas', component: Overseas }, + { path: 'login', component: Login }, + ] + }, + { + path: '/dashboard', + component: ProtectedRoute, + children: [ + { + path: '', + component: DashboardLayout, + children: [ + { path: '', component: Dashboard }, + { path: 'project-quotes', component: ProjectQuotes }, + { path: 'projects', component: ProjectList }, + { path: 'projects/:id', component: ProjectDetail }, + { path: 'inquiries', component: InquiryList }, + { path: 'inquiries/:id', component: InquiryDetail }, + { path: 'claims', component: ClaimProgress }, + { path: 'claims/:id', component: ClaimDetail }, + { path: 'tools', component: Tools }, + { path: 'tools/premium-calculator', component: PremiumCalculator }, + { path: 'tools/icf-editor', component: ICFEditor }, + { path: 'tools/risk-scoring', component: RiskScoring }, + { path: 'tools/protocol-risk', component: ProtocolRiskAssessment }, + { path: 'tools/drug-safety', component: DrugSafetyQuery }, + ] + } + ] + } + ] +}) + +router.beforeEach((to, from, next) => { + const auth = useAuthStore() + if (!auth.loading && auth.token === null && auth.user === null) { + auth.restoreAuth() + } + // 保护 /dashboard 路由 + if (to.path.startsWith('/dashboard') && !auth.isAuthenticated && !auth.loading) { + next({ path: '/login', query: { from: to.fullPath } }) + } else { + next() + } +}) + +export default router diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..df32c21 --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,78 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' + +export type UserRole = '投保人' | '保险人' + +export interface User { + id: string + name: string + email: string + role: UserRole + avatar?: string +} + +export const useAuthStore = defineStore('auth', () => { + const user = ref(null) + const token = ref(null) + const loading = ref(true) + + const isAuthenticated = computed(() => !!user.value && !!token.value) + + function restoreAuth() { + const savedToken = localStorage.getItem('rmo_token') + const savedUser = localStorage.getItem('rmo_user') + if (savedToken && savedUser) { + try { + token.value = savedToken + user.value = JSON.parse(savedUser) + } catch { + localStorage.removeItem('rmo_token') + localStorage.removeItem('rmo_user') + } + } + loading.value = false + } + + async function login(username: string, password: string) { + loading.value = true + try { + await new Promise((r) => setTimeout(r, 500)) + const mockUsers: Record = { + policyholder: { + user: { id: '1', name: '投保人', email: 'policyholder@rmo.com', role: '投保人' }, + token: 'mock_token_policyholder' + }, + insurer: { + user: { id: '2', name: '保险人', email: 'insurer@rmo.com', role: '保险人' }, + token: 'mock_token_insurer' + }, + admin: { + user: { id: '1', name: '投保人', email: 'admin@rmo.com', role: '投保人' }, + token: 'mock_token_admin' + } + } + const mockData = mockUsers[username.toLowerCase()] || mockUsers['admin'] + if (password === '123456') { + user.value = mockData.user + token.value = mockData.token + localStorage.setItem('rmo_token', mockData.token) + localStorage.setItem('rmo_user', JSON.stringify(mockData.user)) + } else { + throw new Error('用户名或密码错误') + } + } catch (e) { + throw e + } finally { + loading.value = false + } + } + + function logout() { + user.value = null + token.value = null + localStorage.removeItem('rmo_token') + localStorage.removeItem('rmo_user') + } + + return { user, token, loading, isAuthenticated, login, logout, restoreAuth } +}) diff --git a/src/stores/quoteModal.ts b/src/stores/quoteModal.ts new file mode 100644 index 0000000..9e2a13f --- /dev/null +++ b/src/stores/quoteModal.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export const useQuoteModalStore = defineStore('quoteModal', () => { + const isOpen = ref(false) + + function openQuoteModal() { + isOpen.value = true + } + + function closeQuoteModal() { + isOpen.value = false + } + + return { isOpen, openQuoteModal, closeQuoteModal } +}) diff --git a/src/views/AboutOverview.vue b/src/views/AboutOverview.vue new file mode 100644 index 0000000..0888f9d --- /dev/null +++ b/src/views/AboutOverview.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/views/Contact.vue b/src/views/Contact.vue new file mode 100644 index 0000000..0e6684c --- /dev/null +++ b/src/views/Contact.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/views/DrugSafetyDict.vue b/src/views/DrugSafetyDict.vue new file mode 100644 index 0000000..ac48b85 --- /dev/null +++ b/src/views/DrugSafetyDict.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/views/FAQ.vue b/src/views/FAQ.vue new file mode 100644 index 0000000..2edab59 --- /dev/null +++ b/src/views/FAQ.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/views/Holder.vue b/src/views/Holder.vue new file mode 100644 index 0000000..eb6459e --- /dev/null +++ b/src/views/Holder.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/views/Home.vue b/src/views/Home.vue new file mode 100644 index 0000000..f3abd88 --- /dev/null +++ b/src/views/Home.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/views/Institution.vue b/src/views/Institution.vue new file mode 100644 index 0000000..c4e5774 --- /dev/null +++ b/src/views/Institution.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/views/KnowledgeInsurance.vue b/src/views/KnowledgeInsurance.vue new file mode 100644 index 0000000..8c2454e --- /dev/null +++ b/src/views/KnowledgeInsurance.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/views/KnowledgePvInsurance.vue b/src/views/KnowledgePvInsurance.vue new file mode 100644 index 0000000..88b4abc --- /dev/null +++ b/src/views/KnowledgePvInsurance.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/views/KnowledgeRegulations.vue b/src/views/KnowledgeRegulations.vue new file mode 100644 index 0000000..422b54a --- /dev/null +++ b/src/views/KnowledgeRegulations.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..9b5f87a --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/views/Overseas.vue b/src/views/Overseas.vue new file mode 100644 index 0000000..9d9c5e6 --- /dev/null +++ b/src/views/Overseas.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/views/PVReport.vue b/src/views/PVReport.vue new file mode 100644 index 0000000..f4b6c53 --- /dev/null +++ b/src/views/PVReport.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/views/Participant.vue b/src/views/Participant.vue new file mode 100644 index 0000000..c7a93f3 --- /dev/null +++ b/src/views/Participant.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/views/PostMarket.vue b/src/views/PostMarket.vue new file mode 100644 index 0000000..3aa8c12 --- /dev/null +++ b/src/views/PostMarket.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/views/PrivacyPolicy.vue b/src/views/PrivacyPolicy.vue new file mode 100644 index 0000000..b833424 --- /dev/null +++ b/src/views/PrivacyPolicy.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/ResourceCenter.vue b/src/views/ResourceCenter.vue new file mode 100644 index 0000000..e6c5bac --- /dev/null +++ b/src/views/ResourceCenter.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/views/ResourceCenterLaws.vue b/src/views/ResourceCenterLaws.vue new file mode 100644 index 0000000..ed93add --- /dev/null +++ b/src/views/ResourceCenterLaws.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/views/ResourceCenterOverview.vue b/src/views/ResourceCenterOverview.vue new file mode 100644 index 0000000..d69f9df --- /dev/null +++ b/src/views/ResourceCenterOverview.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/views/ResourceCenterPracticeGuide.vue b/src/views/ResourceCenterPracticeGuide.vue new file mode 100644 index 0000000..ae9a4ca --- /dev/null +++ b/src/views/ResourceCenterPracticeGuide.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/views/ResourceCenterTraining.vue b/src/views/ResourceCenterTraining.vue new file mode 100644 index 0000000..de89b98 --- /dev/null +++ b/src/views/ResourceCenterTraining.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/views/RiskDutiesOverview.vue b/src/views/RiskDutiesOverview.vue new file mode 100644 index 0000000..112beb3 --- /dev/null +++ b/src/views/RiskDutiesOverview.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/views/RmoMode.vue b/src/views/RmoMode.vue new file mode 100644 index 0000000..fa69609 --- /dev/null +++ b/src/views/RmoMode.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/views/RmoModeGuarantee.vue b/src/views/RmoModeGuarantee.vue new file mode 100644 index 0000000..c6728e8 --- /dev/null +++ b/src/views/RmoModeGuarantee.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/RmoModeInsurance.vue b/src/views/RmoModeInsurance.vue new file mode 100644 index 0000000..a110cc0 --- /dev/null +++ b/src/views/RmoModeInsurance.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/views/RmoModeInsuranceGuarantee.vue b/src/views/RmoModeInsuranceGuarantee.vue new file mode 100644 index 0000000..35c31e1 --- /dev/null +++ b/src/views/RmoModeInsuranceGuarantee.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/RmoModeOverview.vue b/src/views/RmoModeOverview.vue new file mode 100644 index 0000000..317f331 --- /dev/null +++ b/src/views/RmoModeOverview.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/views/ServiceProvider.vue b/src/views/ServiceProvider.vue new file mode 100644 index 0000000..96b1687 --- /dev/null +++ b/src/views/ServiceProvider.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/views/SmartAcquisition.vue b/src/views/SmartAcquisition.vue new file mode 100644 index 0000000..0b1767e --- /dev/null +++ b/src/views/SmartAcquisition.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/views/SolutionsClinicalInsurance.vue b/src/views/SolutionsClinicalInsurance.vue new file mode 100644 index 0000000..90d4d38 --- /dev/null +++ b/src/views/SolutionsClinicalInsurance.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/views/SolutionsPharmacovigilance.vue b/src/views/SolutionsPharmacovigilance.vue new file mode 100644 index 0000000..cd88735 --- /dev/null +++ b/src/views/SolutionsPharmacovigilance.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/views/SolutionsProductInsurance.vue b/src/views/SolutionsProductInsurance.vue new file mode 100644 index 0000000..9720569 --- /dev/null +++ b/src/views/SolutionsProductInsurance.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/views/Sponsor.vue b/src/views/Sponsor.vue new file mode 100644 index 0000000..446838c --- /dev/null +++ b/src/views/Sponsor.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/views/dashboard/ClaimDetail.vue b/src/views/dashboard/ClaimDetail.vue new file mode 100644 index 0000000..1820e79 --- /dev/null +++ b/src/views/dashboard/ClaimDetail.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/views/dashboard/ClaimProgress.vue b/src/views/dashboard/ClaimProgress.vue new file mode 100644 index 0000000..35b360c --- /dev/null +++ b/src/views/dashboard/ClaimProgress.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/Dashboard.vue b/src/views/dashboard/Dashboard.vue new file mode 100644 index 0000000..119aa44 --- /dev/null +++ b/src/views/dashboard/Dashboard.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/views/dashboard/DrugSafetyQuery.vue b/src/views/dashboard/DrugSafetyQuery.vue new file mode 100644 index 0000000..a302ae3 --- /dev/null +++ b/src/views/dashboard/DrugSafetyQuery.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/ICFEditor.vue b/src/views/dashboard/ICFEditor.vue new file mode 100644 index 0000000..9e4163d --- /dev/null +++ b/src/views/dashboard/ICFEditor.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/InquiryDetail.vue b/src/views/dashboard/InquiryDetail.vue new file mode 100644 index 0000000..372d4bd --- /dev/null +++ b/src/views/dashboard/InquiryDetail.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/views/dashboard/InquiryList.vue b/src/views/dashboard/InquiryList.vue new file mode 100644 index 0000000..114aedf --- /dev/null +++ b/src/views/dashboard/InquiryList.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/PremiumCalculator.vue b/src/views/dashboard/PremiumCalculator.vue new file mode 100644 index 0000000..4da733e --- /dev/null +++ b/src/views/dashboard/PremiumCalculator.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/dashboard/ProjectDetail.vue b/src/views/dashboard/ProjectDetail.vue new file mode 100644 index 0000000..b4b2e80 --- /dev/null +++ b/src/views/dashboard/ProjectDetail.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/views/dashboard/ProjectList.vue b/src/views/dashboard/ProjectList.vue new file mode 100644 index 0000000..393ef04 --- /dev/null +++ b/src/views/dashboard/ProjectList.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/views/dashboard/ProjectQuotes.vue b/src/views/dashboard/ProjectQuotes.vue new file mode 100644 index 0000000..f91e0f3 --- /dev/null +++ b/src/views/dashboard/ProjectQuotes.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/ProtocolRiskAssessment.vue b/src/views/dashboard/ProtocolRiskAssessment.vue new file mode 100644 index 0000000..c71c80b --- /dev/null +++ b/src/views/dashboard/ProtocolRiskAssessment.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/RiskScoring.vue b/src/views/dashboard/RiskScoring.vue new file mode 100644 index 0000000..87f612b --- /dev/null +++ b/src/views/dashboard/RiskScoring.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/dashboard/Tools.vue b/src/views/dashboard/Tools.vue new file mode 100644 index 0000000..87f1ca3 --- /dev/null +++ b/src/views/dashboard/Tools.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/tsconfig.json b/tsconfig.json index 256e8d8..bf8edc5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,15 +12,20 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx", + + /* Vue */ + "jsx": "preserve", /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } }, - "include": ["src"], + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], "references": [{ "path": "./tsconfig.node.json" }] } - diff --git a/vite.config.ts b/vite.config.ts index f6a465a..bec8aa8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,12 +1,17 @@ import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import vue from '@vitejs/plugin-vue' +import { fileURLToPath, URL } from 'node:url' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, server: { port: 3000, open: true } }) -