After Width: | Height: | Size: 55 B |
@ -0,0 +1,297 @@ |
|||
@angular/animations |
|||
MIT |
|||
|
|||
@angular/cdk |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2024 Google LLC. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
|||
|
|||
@angular/common |
|||
MIT |
|||
|
|||
@angular/core |
|||
MIT |
|||
|
|||
@angular/forms |
|||
MIT |
|||
|
|||
@angular/material |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2024 Google LLC. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
|||
|
|||
@angular/platform-browser |
|||
MIT |
|||
|
|||
@angular/service-worker |
|||
MIT |
|||
|
|||
rxjs |
|||
Apache-2.0 |
|||
Apache License |
|||
Version 2.0, January 2004 |
|||
http://www.apache.org/licenses/ |
|||
|
|||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
|||
|
|||
1. Definitions. |
|||
|
|||
"License" shall mean the terms and conditions for use, reproduction, |
|||
and distribution as defined by Sections 1 through 9 of this document. |
|||
|
|||
"Licensor" shall mean the copyright owner or entity authorized by |
|||
the copyright owner that is granting the License. |
|||
|
|||
"Legal Entity" shall mean the union of the acting entity and all |
|||
other entities that control, are controlled by, or are under common |
|||
control with that entity. For the purposes of this definition, |
|||
"control" means (i) the power, direct or indirect, to cause the |
|||
direction or management of such entity, whether by contract or |
|||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
|||
outstanding shares, or (iii) beneficial ownership of such entity. |
|||
|
|||
"You" (or "Your") shall mean an individual or Legal Entity |
|||
exercising permissions granted by this License. |
|||
|
|||
"Source" form shall mean the preferred form for making modifications, |
|||
including but not limited to software source code, documentation |
|||
source, and configuration files. |
|||
|
|||
"Object" form shall mean any form resulting from mechanical |
|||
transformation or translation of a Source form, including but |
|||
not limited to compiled object code, generated documentation, |
|||
and conversions to other media types. |
|||
|
|||
"Work" shall mean the work of authorship, whether in Source or |
|||
Object form, made available under the License, as indicated by a |
|||
copyright notice that is included in or attached to the work |
|||
(an example is provided in the Appendix below). |
|||
|
|||
"Derivative Works" shall mean any work, whether in Source or Object |
|||
form, that is based on (or derived from) the Work and for which the |
|||
editorial revisions, annotations, elaborations, or other modifications |
|||
represent, as a whole, an original work of authorship. For the purposes |
|||
of this License, Derivative Works shall not include works that remain |
|||
separable from, or merely link (or bind by name) to the interfaces of, |
|||
the Work and Derivative Works thereof. |
|||
|
|||
"Contribution" shall mean any work of authorship, including |
|||
the original version of the Work and any modifications or additions |
|||
to that Work or Derivative Works thereof, that is intentionally |
|||
submitted to Licensor for inclusion in the Work by the copyright owner |
|||
or by an individual or Legal Entity authorized to submit on behalf of |
|||
the copyright owner. For the purposes of this definition, "submitted" |
|||
means any form of electronic, verbal, or written communication sent |
|||
to the Licensor or its representatives, including but not limited to |
|||
communication on electronic mailing lists, source code control systems, |
|||
and issue tracking systems that are managed by, or on behalf of, the |
|||
Licensor for the purpose of discussing and improving the Work, but |
|||
excluding communication that is conspicuously marked or otherwise |
|||
designated in writing by the copyright owner as "Not a Contribution." |
|||
|
|||
"Contributor" shall mean Licensor and any individual or Legal Entity |
|||
on behalf of whom a Contribution has been received by Licensor and |
|||
subsequently incorporated within the Work. |
|||
|
|||
2. Grant of Copyright License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
copyright license to reproduce, prepare Derivative Works of, |
|||
publicly display, publicly perform, sublicense, and distribute the |
|||
Work and such Derivative Works in Source or Object form. |
|||
|
|||
3. Grant of Patent License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
(except as stated in this section) patent license to make, have made, |
|||
use, offer to sell, sell, import, and otherwise transfer the Work, |
|||
where such license applies only to those patent claims licensable |
|||
by such Contributor that are necessarily infringed by their |
|||
Contribution(s) alone or by combination of their Contribution(s) |
|||
with the Work to which such Contribution(s) was submitted. If You |
|||
institute patent litigation against any entity (including a |
|||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
|||
or a Contribution incorporated within the Work constitutes direct |
|||
or contributory patent infringement, then any patent licenses |
|||
granted to You under this License for that Work shall terminate |
|||
as of the date such litigation is filed. |
|||
|
|||
4. Redistribution. You may reproduce and distribute copies of the |
|||
Work or Derivative Works thereof in any medium, with or without |
|||
modifications, and in Source or Object form, provided that You |
|||
meet the following conditions: |
|||
|
|||
(a) You must give any other recipients of the Work or |
|||
Derivative Works a copy of this License; and |
|||
|
|||
(b) You must cause any modified files to carry prominent notices |
|||
stating that You changed the files; and |
|||
|
|||
(c) You must retain, in the Source form of any Derivative Works |
|||
that You distribute, all copyright, patent, trademark, and |
|||
attribution notices from the Source form of the Work, |
|||
excluding those notices that do not pertain to any part of |
|||
the Derivative Works; and |
|||
|
|||
(d) If the Work includes a "NOTICE" text file as part of its |
|||
distribution, then any Derivative Works that You distribute must |
|||
include a readable copy of the attribution notices contained |
|||
within such NOTICE file, excluding those notices that do not |
|||
pertain to any part of the Derivative Works, in at least one |
|||
of the following places: within a NOTICE text file distributed |
|||
as part of the Derivative Works; within the Source form or |
|||
documentation, if provided along with the Derivative Works; or, |
|||
within a display generated by the Derivative Works, if and |
|||
wherever such third-party notices normally appear. The contents |
|||
of the NOTICE file are for informational purposes only and |
|||
do not modify the License. You may add Your own attribution |
|||
notices within Derivative Works that You distribute, alongside |
|||
or as an addendum to the NOTICE text from the Work, provided |
|||
that such additional attribution notices cannot be construed |
|||
as modifying the License. |
|||
|
|||
You may add Your own copyright statement to Your modifications and |
|||
may provide additional or different license terms and conditions |
|||
for use, reproduction, or distribution of Your modifications, or |
|||
for any such Derivative Works as a whole, provided Your use, |
|||
reproduction, and distribution of the Work otherwise complies with |
|||
the conditions stated in this License. |
|||
|
|||
5. Submission of Contributions. Unless You explicitly state otherwise, |
|||
any Contribution intentionally submitted for inclusion in the Work |
|||
by You to the Licensor shall be under the terms and conditions of |
|||
this License, without any additional terms or conditions. |
|||
Notwithstanding the above, nothing herein shall supersede or modify |
|||
the terms of any separate license agreement you may have executed |
|||
with Licensor regarding such Contributions. |
|||
|
|||
6. Trademarks. This License does not grant permission to use the trade |
|||
names, trademarks, service marks, or product names of the Licensor, |
|||
except as required for reasonable and customary use in describing the |
|||
origin of the Work and reproducing the content of the NOTICE file. |
|||
|
|||
7. Disclaimer of Warranty. Unless required by applicable law or |
|||
agreed to in writing, Licensor provides the Work (and each |
|||
Contributor provides its Contributions) on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
|||
implied, including, without limitation, any warranties or conditions |
|||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
|||
PARTICULAR PURPOSE. You are solely responsible for determining the |
|||
appropriateness of using or redistributing the Work and assume any |
|||
risks associated with Your exercise of permissions under this License. |
|||
|
|||
8. Limitation of Liability. In no event and under no legal theory, |
|||
whether in tort (including negligence), contract, or otherwise, |
|||
unless required by applicable law (such as deliberate and grossly |
|||
negligent acts) or agreed to in writing, shall any Contributor be |
|||
liable to You for damages, including any direct, indirect, special, |
|||
incidental, or consequential damages of any character arising as a |
|||
result of this License or out of the use or inability to use the |
|||
Work (including but not limited to damages for loss of goodwill, |
|||
work stoppage, computer failure or malfunction, or any and all |
|||
other commercial damages or losses), even if such Contributor |
|||
has been advised of the possibility of such damages. |
|||
|
|||
9. Accepting Warranty or Additional Liability. While redistributing |
|||
the Work or Derivative Works thereof, You may choose to offer, |
|||
and charge a fee for, acceptance of support, warranty, indemnity, |
|||
or other liability obligations and/or rights consistent with this |
|||
License. However, in accepting such obligations, You may act only |
|||
on Your own behalf and on Your sole responsibility, not on behalf |
|||
of any other Contributor, and only if You agree to indemnify, |
|||
defend, and hold each Contributor harmless for any liability |
|||
incurred by, or claims asserted against, such Contributor by reason |
|||
of your accepting any such warranty or additional liability. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
APPENDIX: How to apply the Apache License to your work. |
|||
|
|||
To apply the Apache License to your work, attach the following |
|||
boilerplate notice, with the fields enclosed by brackets "[]" |
|||
replaced with your own identifying information. (Don't include |
|||
the brackets!) The text should be enclosed in the appropriate |
|||
comment syntax for the file format. We also recommend that a |
|||
file or class name and description of purpose be included on the |
|||
same "printed page" as the copyright notice for easier |
|||
identification within third-party archives. |
|||
|
|||
Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
|
|||
|
|||
zone.js |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2010-2024 Google LLC. https://angular.io/license |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,213 @@ |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
|
|||
/* fallback */ |
|||
@font-face { |
|||
font-family: 'Material Icons'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: url(./materialicons-v142.woff2) format('woff2'); |
|||
} |
|||
|
|||
.material-icons { |
|||
font-family: 'Material Icons'; |
|||
font-weight: normal; |
|||
font-style: normal; |
|||
font-size: 24px; |
|||
line-height: 1; |
|||
letter-spacing: normal; |
|||
text-transform: none; |
|||
display: inline-block; |
|||
white-space: nowrap; |
|||
word-wrap: normal; |
|||
direction: ltr; |
|||
text-rendering: optimizeLegibility; |
|||
-webkit-font-smoothing: antialiased; |
|||
} |
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 646 B |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 343 B |
After Width: | Height: | Size: 131 B |
After Width: | Height: | Size: 294 B |
After Width: | Height: | Size: 230 B |
After Width: | Height: | Size: 239 B |
After Width: | Height: | Size: 204 B |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,59 @@ |
|||
{ |
|||
"name": "SvgPathEditor", |
|||
"short_name": "SvgPathEditor", |
|||
"theme_color": "#111111", |
|||
"background_color": "#252526", |
|||
"display": "standalone", |
|||
"scope": "./", |
|||
"start_url": "./", |
|||
"icons": [ |
|||
{ |
|||
"src": "assets/icons/icon-72x72.png", |
|||
"sizes": "72x72", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-96x96.png", |
|||
"sizes": "96x96", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-128x128.png", |
|||
"sizes": "128x128", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-144x144.png", |
|||
"sizes": "144x144", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-152x152.png", |
|||
"sizes": "152x152", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-192x192.png", |
|||
"sizes": "192x192", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-384x384.png", |
|||
"sizes": "384x384", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-512x512.png", |
|||
"sizes": "512x512", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,115 @@ |
|||
{ |
|||
"configVersion": 1, |
|||
"timestamp": 1725339129432, |
|||
"index": "/index.html", |
|||
"assetGroups": [ |
|||
{ |
|||
"name": "app", |
|||
"installMode": "prefetch", |
|||
"updateMode": "prefetch", |
|||
"cacheQueryOptions": { |
|||
"ignoreVary": true |
|||
}, |
|||
"urls": [ |
|||
"/favicon.ico", |
|||
"/index.html", |
|||
"/main.19cfcacc3c0bb7eb.js", |
|||
"/manifest.webmanifest", |
|||
"/polyfills.179c8bf8046b88bb.js", |
|||
"/runtime.6f6474d711a7c88e.js", |
|||
"/styles.a4c2c16033803e20.css" |
|||
], |
|||
"patterns": [] |
|||
}, |
|||
{ |
|||
"name": "assets", |
|||
"installMode": "lazy", |
|||
"updateMode": "prefetch", |
|||
"cacheQueryOptions": { |
|||
"ignoreVary": true |
|||
}, |
|||
"urls": [ |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2", |
|||
"/assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2", |
|||
"/assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2", |
|||
"/assets/css.css", |
|||
"/assets/delete.svg", |
|||
"/assets/github.svg", |
|||
"/assets/icons/icon-128x128.png", |
|||
"/assets/icons/icon-144x144.png", |
|||
"/assets/icons/icon-152x152-cropped.png", |
|||
"/assets/icons/icon-152x152.png", |
|||
"/assets/icons/icon-192x192.png", |
|||
"/assets/icons/icon-384x384.png", |
|||
"/assets/icons/icon-512x512.png", |
|||
"/assets/icons/icon-72x72.png", |
|||
"/assets/icons/icon-96x96.png", |
|||
"/assets/logo.svg", |
|||
"/assets/materialicons-v142.woff2", |
|||
"/assets/more.svg", |
|||
"/assets/sponsor.svg", |
|||
"/assets/zoom_fit.svg", |
|||
"/assets/zoom_in.svg", |
|||
"/assets/zoom_out.svg" |
|||
], |
|||
"patterns": [] |
|||
} |
|||
], |
|||
"dataGroups": [], |
|||
"hashTable": { |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2": "a7171422d5c6540cf3eeb0b0c7b7fda3973128f9", |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2": "a7171422d5c6540cf3eeb0b0c7b7fda3973128f9", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2": "117895b042db3c7ce867c807a63f238148c85bf7", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2": "4e14271afc054b53725261e61ff3d6d41282ba05", |
|||
"/assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2": "4b7bad6c115b963523d3cd7ad52ebf717135e24a", |
|||
"/assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2": "5bfe9060f0f5f13b4e777e29e65341bb782095bd", |
|||
"/assets/css.css": "5e572a30d3e070d7d4e01e1400c05aa28384868a", |
|||
"/assets/delete.svg": "c9d8618ebbfb075f6449d7ccd318be36803a2a98", |
|||
"/assets/github.svg": "f49c2d4abc2753aff2edbd161758f852472e22ed", |
|||
"/assets/icons/icon-128x128.png": "990bf9066e18e84df38496afcb581dd032d5dd79", |
|||
"/assets/icons/icon-144x144.png": "1418f7e28c137f14f1e3f52405587500dc2e314e", |
|||
"/assets/icons/icon-152x152-cropped.png": "4252eb7bfb2e454264eef04afedbe46f22abd619", |
|||
"/assets/icons/icon-152x152.png": "149f61864f3e263deedab9a54ae68737417b1b3c", |
|||
"/assets/icons/icon-192x192.png": "a4357613a87087d60ddb19e3f1117cd7116fab7a", |
|||
"/assets/icons/icon-384x384.png": "d98880dd39e8f550e4c12b3c6c6d347a4c79adfe", |
|||
"/assets/icons/icon-512x512.png": "7492b47ba3ea2a411037ca9f65474c1e557b9dbb", |
|||
"/assets/icons/icon-72x72.png": "025fc86cdee053766cb0ba832ec7611d9d2f9e24", |
|||
"/assets/icons/icon-96x96.png": "94a0268ac4b4667655798a2ae84a4ce1197a9775", |
|||
"/assets/logo.svg": "991d4d0400f85453cf8f7cbad937be0201bf0f65", |
|||
"/assets/materialicons-v142.woff2": "aaae93b146d97737fabe87a6bc741113e6899ad3", |
|||
"/assets/more.svg": "b10d6de2d92740c806af17c0ff9c520d3e4bf35f", |
|||
"/assets/sponsor.svg": "7ef4b2531be1d24978c158588ea28851b3cfe579", |
|||
"/assets/zoom_fit.svg": "3bfa12d79ff4a9c32465c0501ef85d3783ea96c3", |
|||
"/assets/zoom_in.svg": "bf3ac558a23c8e5de36d2526618eac96e867af4a", |
|||
"/assets/zoom_out.svg": "2e7c0be5fb00f1468a89685dc13139a63d34588d", |
|||
"/favicon.ico": "5e89bcef8dcf5abfb8442b0a182fbe76dfbf61a9", |
|||
"/index.html": "65bc7e93d913a4e4a58a3464fd55ecf665c5f9e0", |
|||
"/main.19cfcacc3c0bb7eb.js": "4b5dd4dc575ad647161372f7cff0552de1139e81", |
|||
"/manifest.webmanifest": "80b98f13afc36553e06626b0f03032fcaac82c58", |
|||
"/polyfills.179c8bf8046b88bb.js": "67853517b3c4a85d4b49c17da38a5e43d5300e43", |
|||
"/runtime.6f6474d711a7c88e.js": "2fb0c339e14f24885ee4118a95a4513ce37011a6", |
|||
"/styles.a4c2c16033803e20.css": "0375c469df334b800f9a82dd7e6cd42081c0f67b" |
|||
}, |
|||
"navigationUrls": [ |
|||
{ |
|||
"positive": true, |
|||
"regex": "^\\/.*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*\\.[^/]*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$" |
|||
} |
|||
], |
|||
"navigationRequestStrategy": "performance" |
|||
} |
@ -0,0 +1 @@ |
|||
(()=>{"use strict";var e,i={},_={};function n(e){var l=_[e];if(void 0!==l)return l.exports;var r=_[e]={exports:{}};return i[e](r,r.exports,n),r.exports}n.m=i,e=[],n.O=(l,r,s,f)=>{if(!r){var u=1/0;for(a=0;a<e.length;a++){for(var[r,s,f]=e[a],c=!0,o=0;o<r.length;o++)(!1&f||u>=f)&&Object.keys(n.O).every(p=>n.O[p](r[o]))?r.splice(o--,1):(c=!1,f<u&&(u=f));if(c){e.splice(a--,1);var t=s();void 0!==t&&(l=t)}}return l}f=f||0;for(var a=e.length;a>0&&e[a-1][2]>f;a--)e[a]=e[a-1];e[a]=[r,s,f]},n.o=(e,l)=>Object.prototype.hasOwnProperty.call(e,l),(()=>{var e={121:0};n.O.j=s=>0===e[s];var l=(s,f)=>{var o,t,[a,u,c]=f,v=0;if(a.some(h=>0!==e[h])){for(o in u)n.o(u,o)&&(n.m[o]=u[o]);if(c)var d=c(n)}for(s&&s(f);v<a.length;v++)n.o(e,t=a[v])&&e[t]&&e[t][0](),e[t]=0;return n.O(d)},r=self.webpackChunksvg_path_editor=self.webpackChunksvg_path_editor||[];r.forEach(l.bind(null,0)),r.push=l.bind(null,r.push.bind(r))})()})(); |
@ -0,0 +1,30 @@ |
|||
/** |
|||
* @license |
|||
* Copyright Google LLC All Rights Reserved. |
|||
* |
|||
* Use of this source code is governed by an MIT-style license that can be |
|||
* found in the LICENSE file at https://angular.io/license
|
|||
*/ |
|||
|
|||
// tslint:disable:no-console
|
|||
|
|||
self.addEventListener('install', (event) => { |
|||
self.skipWaiting(); |
|||
}); |
|||
|
|||
self.addEventListener('activate', (event) => { |
|||
event.waitUntil(self.clients.claim()); |
|||
|
|||
event.waitUntil( |
|||
self.registration.unregister().then(() => { |
|||
console.log('NGSW Safety Worker - unregistered old service worker'); |
|||
}), |
|||
); |
|||
|
|||
event.waitUntil( |
|||
caches.keys().then((cacheNames) => { |
|||
const ngswCacheNames = cacheNames.filter((name) => /^ngsw:/.test(name)); |
|||
return Promise.all(ngswCacheNames.map((name) => caches.delete(name))); |
|||
}), |
|||
); |
|||
}); |
@ -0,0 +1,30 @@ |
|||
/** |
|||
* @license |
|||
* Copyright Google LLC All Rights Reserved. |
|||
* |
|||
* Use of this source code is governed by an MIT-style license that can be |
|||
* found in the LICENSE file at https://angular.io/license
|
|||
*/ |
|||
|
|||
// tslint:disable:no-console
|
|||
|
|||
self.addEventListener('install', (event) => { |
|||
self.skipWaiting(); |
|||
}); |
|||
|
|||
self.addEventListener('activate', (event) => { |
|||
event.waitUntil(self.clients.claim()); |
|||
|
|||
event.waitUntil( |
|||
self.registration.unregister().then(() => { |
|||
console.log('NGSW Safety Worker - unregistered old service worker'); |
|||
}), |
|||
); |
|||
|
|||
event.waitUntil( |
|||
caches.keys().then((cacheNames) => { |
|||
const ngswCacheNames = cacheNames.filter((name) => /^ngsw:/.test(name)); |
|||
return Promise.all(ngswCacheNames.map((name) => caches.delete(name))); |
|||
}), |
|||
); |
|||
}); |
@ -0,0 +1,237 @@ |
|||
import type { GraphPluginConstructor } from '@maxgraph/core'; |
|||
import { constants, Client, Graph, Point, Cell, Geometry, CellState, ConnectionConstraint, ModelXmlSerializer, styleUtils, eventUtils } from '@maxgraph/core'; |
|||
|
|||
import { |
|||
CellEditorHandler, |
|||
ConnectionHandler, |
|||
ConstraintHandler, |
|||
KeyHandler, |
|||
PanningHandler, |
|||
RubberBandHandler, |
|||
SelectionCellsHandler, |
|||
SelectionHandler, |
|||
} from '@maxgraph/core'; // 默认插件
|
|||
|
|||
import { |
|||
PlatformDragAndDropHandler, |
|||
PlatformEdgeDefineHandler, |
|||
PlatformKeyBindHandler, |
|||
PlatformSelectedCellHandler, |
|||
PlatformVertexDefineHandler, |
|||
PlatformUndoManagerHandler, |
|||
} from './handler'; // 自定义插件
|
|||
import { PlatformStylesheet } from './style/PlatformStylesheet'; //默认样式
|
|||
import { Environment, KeyCode, Tools } from '@/platform'; |
|||
|
|||
// maxgraph 基本配置
|
|||
Client.setBasePath(Environment.getWebContextPath()); |
|||
Client.setImageBasePath(); |
|||
|
|||
// 需要的插件
|
|||
const plugins: GraphPluginConstructor[] = [ |
|||
CellEditorHandler, |
|||
ConnectionHandler, |
|||
ConstraintHandler, |
|||
KeyHandler, |
|||
PanningHandler, |
|||
RubberBandHandler, |
|||
SelectionCellsHandler, |
|||
SelectionHandler, |
|||
|
|||
PlatformDragAndDropHandler, |
|||
PlatformEdgeDefineHandler, |
|||
PlatformKeyBindHandler, |
|||
PlatformSelectedCellHandler, |
|||
PlatformVertexDefineHandler, |
|||
PlatformUndoManagerHandler, |
|||
]; |
|||
|
|||
class PlatformGraph extends Graph { |
|||
constructor(container: HTMLElement) { |
|||
super(container, undefined, plugins); |
|||
this.setConnectable(true); |
|||
this.setPanning(true); |
|||
this.setHtmlLabels(true); |
|||
// this.isCellEditable = function (cell) {
|
|||
// return !cell.isEdge();
|
|||
// };
|
|||
|
|||
// 禁止节点直接连接
|
|||
const connectionHandler: ConnectionHandler = this.getPlugin<ConnectionHandler>('ConnectionHandler'); |
|||
connectionHandler.isConnectableCell = (cell) => { |
|||
return false; |
|||
}; |
|||
} |
|||
|
|||
setVertexDefines(vertexDefines) { |
|||
const vertexHandler: PlatformVertexDefineHandler = this.getPlugin<PlatformVertexDefineHandler>('PlatformVertexDefineHandler'); |
|||
if (vertexHandler) { |
|||
vertexHandler.setDefines(vertexDefines); |
|||
} |
|||
} |
|||
|
|||
setEdgeDefines(edgeDefines) { |
|||
const edgeHandler: PlatformEdgeDefineHandler = this.getPlugin<PlatformEdgeDefineHandler>('PlatformEdgeDefineHandler'); |
|||
if (edgeHandler) { |
|||
edgeHandler.setDefines(edgeDefines); |
|||
} |
|||
} |
|||
|
|||
setSelectedCellReactive(selectedCellReactive) { |
|||
const selectedCellHandler: PlatformSelectedCellHandler = this.getPlugin<PlatformSelectedCellHandler>('PlatformSelectedCellHandler'); |
|||
if (selectedCellHandler) { |
|||
selectedCellHandler.setSelectedCellReactive(selectedCellReactive); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 覆盖 Graph 父类的方法,用于创建默认的样式表对象 |
|||
* @returns 默认的样式表对象 |
|||
*/ |
|||
createStylesheet() { |
|||
return new PlatformStylesheet(); |
|||
} |
|||
|
|||
/** |
|||
* 覆盖 Graph 父类的方法,用于创建默认的节点和边的文本 |
|||
* @param cell 元素 |
|||
* @returns 节点和边的文本 |
|||
*/ |
|||
convertValueToString(cell) { |
|||
if (cell.isVertex()) { |
|||
const dom = cell.value; |
|||
const type = dom.nodeName.toLowerCase(); |
|||
const vertexDefineHandler: PlatformVertexDefineHandler = this.getPlugin<PlatformVertexDefineHandler>('PlatformVertexDefineHandler'); |
|||
if (vertexDefineHandler) { |
|||
const value = vertexDefineHandler.getValue(type, dom); |
|||
return vertexDefineHandler.getLabel(type, value); |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
createEdge(parent = null, id, value, source = null, target = null, style = {}) { |
|||
const sourceCell: Cell = source; |
|||
const targetCell: Cell = target; |
|||
const sourceType = sourceCell.value.nodeName.toLowerCase(); |
|||
const targetType = targetCell.value.nodeName.toLowerCase(); |
|||
|
|||
const ddgeDefineHandler: PlatformEdgeDefineHandler = this.getPlugin<PlatformEdgeDefineHandler>('PlatformEdgeDefineHandler'); |
|||
if (ddgeDefineHandler) { |
|||
const type = ddgeDefineHandler.getType(sourceType, targetType); |
|||
const dom = document.createElement(type); |
|||
dom.setAttribute('wsp', 'wsp'); |
|||
const edge = new Cell(dom, new Geometry(), style); |
|||
edge.setId(id); |
|||
edge.setEdge(true); |
|||
edge.geometry.relative = true; |
|||
return edge; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 覆盖 Graph 的 @maxgraph/core/dist/view/mixinx/ConnectionsMixin.js 方法 |
|||
* @param terminal |
|||
* @param _source |
|||
* @returns |
|||
*/ |
|||
getAllConnectionConstraints(terminal: CellState | null, _source: boolean) { |
|||
if (terminal != null && terminal.cell.isVertex()) { |
|||
const shape = terminal.cell.style.shape; |
|||
if (shape === constants.SHAPE.RECTANGLE) { |
|||
return [ |
|||
new ConnectionConstraint(new Point(0, 0), true), |
|||
new ConnectionConstraint(new Point(0.5, 0), true), |
|||
new ConnectionConstraint(new Point(1, 0), true), |
|||
new ConnectionConstraint(new Point(0, 0.5), true), |
|||
new ConnectionConstraint(new Point(1, 0.5), true), |
|||
new ConnectionConstraint(new Point(0, 1), true), |
|||
new ConnectionConstraint(new Point(0.5, 1), true), |
|||
new ConnectionConstraint(new Point(1, 1), true), |
|||
]; |
|||
} else { |
|||
return [ |
|||
new ConnectionConstraint(new Point(0.5, 0), true), |
|||
new ConnectionConstraint(new Point(1, 0.5), true), |
|||
new ConnectionConstraint(new Point(0.5, 1), true), |
|||
new ConnectionConstraint(new Point(0, 0.5), true), |
|||
]; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* 设置 xml |
|||
* @param xml xml |
|||
*/ |
|||
setXml(xml) { |
|||
new ModelXmlSerializer(this.getDataModel()).import(xml); |
|||
} |
|||
|
|||
/** |
|||
* 获取 xml |
|||
* @returns xml |
|||
*/ |
|||
getXml() { |
|||
return new ModelXmlSerializer(this.getDataModel()).export(); |
|||
} |
|||
|
|||
/** |
|||
* 开启 undo 监听 |
|||
*/ |
|||
startUndoListener() { |
|||
const undoManagerHandler: PlatformUndoManagerHandler = this.getPlugin<PlatformUndoManagerHandler>('PlatformUndoManagerHandler'); |
|||
undoManagerHandler.start(); |
|||
} |
|||
|
|||
/** |
|||
* undo |
|||
*/ |
|||
undo() { |
|||
const undoManagerHandler: PlatformUndoManagerHandler = this.getPlugin<PlatformUndoManagerHandler>('PlatformUndoManagerHandler'); |
|||
undoManagerHandler.undo(); |
|||
} |
|||
|
|||
/** |
|||
* redo |
|||
*/ |
|||
redo() { |
|||
const undoManagerHandler: PlatformUndoManagerHandler = this.getPlugin<PlatformUndoManagerHandler>('PlatformUndoManagerHandler'); |
|||
undoManagerHandler.redo(); |
|||
} |
|||
|
|||
/** |
|||
* 复制选择的节点 |
|||
*/ |
|||
copy() { |
|||
const keyBindHandler: PlatformKeyBindHandler = this.getPlugin<PlatformKeyBindHandler>('PlatformKeyBindHandler'); |
|||
keyBindHandler.copy(); |
|||
} |
|||
|
|||
/** |
|||
* 粘帖选择的节点 |
|||
*/ |
|||
paste() { |
|||
const keyBindHandler: PlatformKeyBindHandler = this.getPlugin<PlatformKeyBindHandler>('PlatformKeyBindHandler'); |
|||
keyBindHandler.paste(); |
|||
} |
|||
|
|||
/** |
|||
* 剪切选择的节点 |
|||
*/ |
|||
cut() { |
|||
const keyBindHandler: PlatformKeyBindHandler = this.getPlugin<PlatformKeyBindHandler>('PlatformKeyBindHandler'); |
|||
keyBindHandler.cut(); |
|||
} |
|||
|
|||
/** |
|||
* 删除选择的节点 |
|||
*/ |
|||
remove() { |
|||
const keyBindHandler: PlatformKeyBindHandler = this.getPlugin<PlatformKeyBindHandler>('PlatformKeyBindHandler'); |
|||
keyBindHandler.remove(); |
|||
} |
|||
} |
|||
|
|||
export { PlatformGraph }; |
@ -0,0 +1,40 @@ |
|||
import { ConnectionHandler, CellState } from '@maxgraph/core'; |
|||
|
|||
class PlatformConnectionHandler extends ConnectionHandler { |
|||
isConnectableCell(cell) { |
|||
return false; |
|||
} |
|||
|
|||
updateEdgeState(pt, constraint) { |
|||
console.log('updateEdgeState...'); |
|||
if (pt != null && this.previous != null) { |
|||
const constraints = this.graph.getAllConnectionConstraints(this.previous); |
|||
let nearestConstraint = null; |
|||
let dist = null; |
|||
for (let i = 0; i < constraints.length; i++) { |
|||
const cp = this.graph.getConnectionPoint(this.previous, constraints[i]); |
|||
if (cp != null) { |
|||
const tmp = (cp.x - pt.x) * (cp.x - pt.x) + (cp.y - pt.y) * (cp.y - pt.y); |
|||
if (dist == null || tmp < dist) { |
|||
nearestConstraint = constraints[i]; |
|||
dist = tmp; |
|||
} |
|||
} |
|||
} |
|||
if (nearestConstraint != null) { |
|||
this.sourceConstraint = nearestConstraint; |
|||
} |
|||
} |
|||
return super.updateEdgeState(pt, constraint); |
|||
} |
|||
|
|||
createEdgeState(me) { |
|||
console.log('createEdgeState...'); |
|||
const edge = this.graph.createEdge(null, null, null, null, null, { |
|||
edgeStyle: 'orthogonalEdgeStyle', |
|||
}); |
|||
return new CellState(this.graph.view, edge, this.graph.getCellStyle(edge)); |
|||
} |
|||
} |
|||
|
|||
export { PlatformConnectionHandler }; |
@ -0,0 +1,9 @@ |
|||
import { ConstraintHandler, mathUtils } from '@maxgraph/core'; |
|||
|
|||
class PlatformConstraintHandler extends ConstraintHandler { |
|||
intersects(icon, point, source, existingEdge) { |
|||
return !source || existingEdge || mathUtils.intersects(icon.bounds, point); |
|||
} |
|||
} |
|||
|
|||
export { PlatformConstraintHandler }; |
@ -0,0 +1,9 @@ |
|||
import { EdgeHandler } from '@maxgraph/core'; |
|||
|
|||
class PlatformEdgeHandler extends EdgeHandler { |
|||
isConnectableCell(cell) { |
|||
return graph.getPlugin('ConnectionHandler').isConnectableCell(cell); |
|||
} |
|||
} |
|||
|
|||
export { PlatformEdgeHandler }; |
@ -1,51 +0,0 @@ |
|||
import type { InternalMouseEvent, GraphPluginConstructor } from '@maxgraph/core'; |
|||
import { |
|||
Graph, |
|||
Geometry, |
|||
Point, |
|||
CellState, |
|||
ConnectionHandler, |
|||
CellEditorHandler, |
|||
SelectionCellsHandler, |
|||
SelectionHandler, |
|||
RubberBandHandler, |
|||
ConnectionConstraint, |
|||
} from '@maxgraph/core'; |
|||
|
|||
class PlatformGeometryClass extends Geometry { |
|||
constraints = [ |
|||
new ConnectionConstraint(new Point(0.25, 0), true), |
|||
new ConnectionConstraint(new Point(0.5, 0), true), |
|||
new ConnectionConstraint(new Point(0.75, 0), true), |
|||
new ConnectionConstraint(new Point(0, 0.25), true), |
|||
new ConnectionConstraint(new Point(0, 0.5), true), |
|||
new ConnectionConstraint(new Point(0, 0.75), true), |
|||
new ConnectionConstraint(new Point(1, 0.25), true), |
|||
new ConnectionConstraint(new Point(1, 0.5), true), |
|||
new ConnectionConstraint(new Point(1, 0.75), true), |
|||
new ConnectionConstraint(new Point(0.25, 1), true), |
|||
new ConnectionConstraint(new Point(0.5, 1), true), |
|||
new ConnectionConstraint(new Point(0.75, 1), true), |
|||
]; |
|||
} |
|||
|
|||
class PlatformConnectionHandler extends ConnectionHandler { |
|||
createEdgeState(_me: InternalMouseEvent) { |
|||
const edge = this.graph.createEdge(null, null!, null, null, null); |
|||
return new CellState(this.graph.view, edge, this.graph.getCellStyle(edge)); |
|||
} |
|||
} |
|||
|
|||
const plugins: GraphPluginConstructor[] = [CellEditorHandler, SelectionCellsHandler, PlatformConnectionHandler, SelectionHandler, RubberBandHandler]; |
|||
|
|||
class PlatformGraph extends Graph { |
|||
constructor(container: HTMLElement) { |
|||
super(container, undefined, plugins); |
|||
new RubberBandHandler(this); |
|||
} |
|||
getAllConnectionConstraints = (terminal: CellState | null, _source: boolean) => { |
|||
return (terminal?.cell?.geometry as PlatformGeometryClass)?.constraints ?? null; |
|||
}; |
|||
} |
|||
|
|||
export { PlatformGraph }; |
@ -0,0 +1,42 @@ |
|||
<template> |
|||
<w-dialog |
|||
ref="dialogRef" |
|||
:title="$t('xml')" |
|||
width="800px" |
|||
:can-maximize="false" |
|||
:buttons="[ |
|||
{ |
|||
label: $t('confirm'), |
|||
noCaps: true, |
|||
click: () => { |
|||
modelValueRef = xmlRef; |
|||
close(); |
|||
}, |
|||
}, |
|||
]" |
|||
> |
|||
<div class="py-1"></div> |
|||
<w-code-mirror v-model="xmlRef" outlined :rows="20" lang="xml" line-number :toolbar="false" /> |
|||
</w-dialog> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref } from 'vue'; |
|||
|
|||
const modelValueRef = defineModel({ type: String, default: '' }); |
|||
const dialogRef = ref(); |
|||
const xmlRef = ref(); |
|||
|
|||
const open = () => { |
|||
xmlRef.value = modelValueRef.value; |
|||
dialogRef.value.show(); |
|||
}; |
|||
|
|||
const close = () => { |
|||
dialogRef.value.hide(); |
|||
}; |
|||
|
|||
defineExpose({ |
|||
open, |
|||
close, |
|||
}); |
|||
</script> |
@ -0,0 +1,66 @@ |
|||
import { Graph, VertexParameters, GraphPlugin, InternalEvent, styleUtils, eventUtils, CellState } from '@maxgraph/core'; |
|||
import { PlatformVertexDefineHandler } from './PlatformVertexDefineHandler'; |
|||
import { Tools } from '@/platform'; |
|||
|
|||
export class PlatformDragAndDropHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformDragAndDropHandler'; |
|||
private graph: Graph; |
|||
private dragover: any; |
|||
private drop: any; |
|||
|
|||
constructor(graph: Graph) { |
|||
this.graph = graph; |
|||
this.dragover = (event) => { |
|||
if (this.graph.isEnabled()) { |
|||
event.stopPropagation(); |
|||
event.preventDefault(); |
|||
} |
|||
}; |
|||
this.drop = (event) => { |
|||
if (this.graph.isEnabled()) { |
|||
event.stopPropagation(); |
|||
event.preventDefault(); |
|||
|
|||
const view = this.graph.getView(); |
|||
const pt = styleUtils.convertPoint(this.graph.getContainer(), eventUtils.getClientX(event), eventUtils.getClientY(event)); |
|||
const tr = view.getTranslate(); |
|||
const scale = view.getScale(); |
|||
const x = pt.x / scale - tr.x; |
|||
const y = pt.y / scale - tr.y; |
|||
|
|||
this.graph.batchUpdate(() => { |
|||
const data = Tools.json2Object(event.dataTransfer.getData('data')); |
|||
const type = data.type; |
|||
const element = document.createElement(type); |
|||
const vertexDefineHandler: PlatformVertexDefineHandler = this.graph.getPlugin<PlatformVertexDefineHandler>('PlatformVertexDefineHandler'); |
|||
if (vertexDefineHandler) { |
|||
const value = vertexDefineHandler.getValue(type) || {}; |
|||
for (const fieldName in value) { |
|||
element.setAttribute(fieldName, value[fieldName]); |
|||
} |
|||
} |
|||
const vertexParameters: VertexParameters = { |
|||
value: element, |
|||
parent: this.graph.getDefaultParent(), |
|||
size: data.size, |
|||
position: [x - data.size[0] / 2, y - data.size[1] / 2], |
|||
style: { |
|||
shape: data.shape, |
|||
}, |
|||
}; |
|||
const vertex = this.graph.insertVertex(vertexParameters); |
|||
this.graph.setSelectionCell(vertex); |
|||
}); |
|||
} |
|||
}; |
|||
|
|||
InternalEvent.addListener(this.graph.getContainer(), 'dragover', this.dragover); |
|||
InternalEvent.addListener(this.graph.getContainer(), 'drop', this.drop); |
|||
} |
|||
|
|||
onDestroy() { |
|||
console.log('onDestroy...'); |
|||
InternalEvent.removeListener(this.graph.getContainer(), 'dragover', this.dragover); |
|||
InternalEvent.removeListener(this.graph.getContainer(), 'drop', this.drop); |
|||
} |
|||
} |
@ -0,0 +1,62 @@ |
|||
import { Graph, GraphPlugin } from '@maxgraph/core'; |
|||
|
|||
export class PlatformEdgeDefineHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformEdgeDefineHandler'; |
|||
private graph: Graph; |
|||
private defines = {}; |
|||
|
|||
setDefines(configures) { |
|||
for (const configure of configures) { |
|||
this.defines[configure.type.toLowerCase()] = { |
|||
fromVertexType: configure.fromVertexType, |
|||
toVertexType: configure.toVertexType, |
|||
getLabel: configure.getLabel, |
|||
getValue: configure.getValue, |
|||
getFormFields: configure.getFormFields, |
|||
}; |
|||
} |
|||
} |
|||
|
|||
getType(fromType, toType) { |
|||
for (const define in this.defines) { |
|||
if (define.fromVertexType === fromType && define.toType === toType) { |
|||
return define; |
|||
} |
|||
} |
|||
} |
|||
|
|||
getLabel(type, value) { |
|||
if (this.defines[type]?.getLabel) { |
|||
return this.defines[type].getLabel(value); |
|||
} |
|||
return ''; |
|||
} |
|||
|
|||
getValue(type, dom) { |
|||
if (this.defines[type]?.getValue) { |
|||
return this.defines[type]?.getValue(dom); |
|||
} else { |
|||
if (dom) { |
|||
const value = {}; |
|||
for (const attributeName of dom.getAttributeNames()) { |
|||
value[attributeName] = dom.getAttribute(attributeName); |
|||
} |
|||
return value; |
|||
} else { |
|||
return {}; |
|||
} |
|||
} |
|||
} |
|||
|
|||
getFormFields(type) { |
|||
if (this.defines[type]?.getFormFields) { |
|||
return this.defines[type]?.getFormFields(); |
|||
} else { |
|||
return []; |
|||
} |
|||
} |
|||
|
|||
createEdge(parent = null, id, value, source = null, target = null, style = {}) {} |
|||
|
|||
onDestroy() {} |
|||
} |
@ -0,0 +1,94 @@ |
|||
import { Client, Graph, GraphPlugin, KeyHandler, Cell, InternalEvent, GraphDataModel, ModelXmlSerializer, cellArrayUtils, styleUtils } from '@maxgraph/core'; |
|||
import { KeyCode } from '@/platform'; |
|||
|
|||
export class PlatformKeyBindHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformKeyBindHandler'; |
|||
private graph: Graph; |
|||
private copy: any; |
|||
private paste: any; |
|||
private cut: any; |
|||
private remove: any; |
|||
|
|||
constructor(graph: Graph) { |
|||
this.graph = graph; |
|||
|
|||
/** |
|||
* 复制 |
|||
*/ |
|||
this.copy = async () => { |
|||
console.log('copy'); |
|||
if (this.graph.isEnabled() && !this.graph.isSelectionEmpty()) { |
|||
const cells = styleUtils.sortCells(cellArrayUtils.getTopmostCells(this.graph.getSelectionCells())); |
|||
const clones = this.graph.cloneCells(cells); |
|||
|
|||
const model = new GraphDataModel(); |
|||
const parent = model.getRoot().getChildAt(0); |
|||
for (const cell of clones) { |
|||
model.add(parent, cell); |
|||
} |
|||
const xml = new ModelXmlSerializer(model).export(); |
|||
await navigator.clipboard.writeText(xml); |
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* 粘贴 |
|||
*/ |
|||
this.paste = async () => { |
|||
const xml = await navigator.clipboard.readText(); |
|||
if (!xml) { |
|||
return; |
|||
} |
|||
const model = this.graph.getDataModel(); |
|||
const importedModel: GraphDataModel = new GraphDataModel(); |
|||
new ModelXmlSerializer(importedModel).import(xml); |
|||
model.beginUpdate(); |
|||
const importedCells: Cell[] = this.graph.importCells(importedModel.getRoot()?.children, 0, 0, model.getRoot()); |
|||
const cells = importedCells[0].children; |
|||
this.graph.moveCells(cells, 10, 10); |
|||
this.graph.setSelectionCells(cells); |
|||
model.endUpdate(); |
|||
}; |
|||
|
|||
/** |
|||
* 剪切 |
|||
*/ |
|||
this.cut = async () => { |
|||
await this.copy(); |
|||
await this.remove(); |
|||
}; |
|||
|
|||
/** |
|||
* 删除 |
|||
*/ |
|||
this.remove = async () => { |
|||
const cells = this.graph.getSelectionCells(); |
|||
if (cells) { |
|||
this.graph.removeCells(cells); |
|||
} |
|||
}; |
|||
|
|||
const keyHandler: KeyHandler = new KeyHandler(this.graph); |
|||
keyHandler.bindKey(KeyCode.BACKSPACE, this.remove); |
|||
keyHandler.bindKey(KeyCode.DELETE, this.remove); |
|||
|
|||
keyHandler.bindControlKey(KeyCode.C, this.copy); |
|||
keyHandler.bindControlKey(KeyCode.V, this.paste); |
|||
keyHandler.bindControlKey(KeyCode.X, this.cut); |
|||
|
|||
const getFunction = keyHandler.getFunction; |
|||
keyHandler.getFunction = (event) => { |
|||
if (Client.IS_MAC && event.metaKey) { |
|||
return keyHandler.controlKeys[event.keyCode]; |
|||
} |
|||
return getFunction(event); |
|||
}; |
|||
} |
|||
|
|||
onDestroy() { |
|||
console.log('onDestroy...'); |
|||
// InternalEvent.removeListener(this.graph.getContainer(), 'copy', this.copy.bind(this));
|
|||
// InternalEvent.removeListener(this.graph.getContainer(), 'paste', this.paste.bind(this));
|
|||
// InternalEvent.removeListener(this.graph.getContainer(), 'cut', this.cut.bind(this));
|
|||
} |
|||
} |
@ -0,0 +1,79 @@ |
|||
import { Graph, GraphPlugin, InternalEvent, CellAttributeChange, ValueChange } from '@maxgraph/core'; |
|||
import { PlatformVertexDefineHandler } from './PlatformVertexDefineHandler'; |
|||
import { PlatformEdgeDefineHandler } from './PlatformEdgeDefineHandler'; |
|||
|
|||
import { Tools } from '@/platform'; |
|||
|
|||
export class PlatformSelectedCellHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformSelectedCellHandler'; |
|||
private graph: Graph; |
|||
private selectedCellReactive; |
|||
private selectionChanged; |
|||
|
|||
constructor(graph: Graph) { |
|||
this.graph = graph; |
|||
|
|||
this.selectionChanged = () => { |
|||
const cell = this.graph.getSelectionCell(); |
|||
if (!cell) { |
|||
this.selectedCellReactive.modelValue = {}; |
|||
this.selectedCellReactive.fields = []; |
|||
return; |
|||
} |
|||
if (cell.isVertex()) { |
|||
const dom = cell.value; |
|||
const type = dom.nodeName.toLowerCase(); |
|||
const vertexDefineHandler: PlatformVertexDefineHandler = this.graph.getPlugin<PlatformVertexDefineHandler>('PlatformVertexDefineHandler'); |
|||
if (vertexDefineHandler) { |
|||
const value = vertexDefineHandler.getValue(type, cell); |
|||
const fields = vertexDefineHandler.getFormFields(type); |
|||
this.selectedCellReactive.modelValue = value; |
|||
this.selectedCellReactive.fields = fields; |
|||
} else { |
|||
this.selectedCellReactive.modelValue = {}; |
|||
this.selectedCellReactive.fields = []; |
|||
} |
|||
} else { |
|||
const dom = cell.value; |
|||
const type = dom.nodeName.toLowerCase(); |
|||
const edgeDefineHandler: PlatformEdgeDefineHandler = this.graph.getPlugin<PlatformEdgeDefineHandler>('PlatformEdgeDefineHandler'); |
|||
if (edgeDefineHandler) { |
|||
const value = edgeDefineHandler.getValue(type, cell); |
|||
const fields = edgeDefineHandler.getFormFields(type); |
|||
this.selectedCellReactive.modelValue = value; |
|||
this.selectedCellReactive.fields = fields; |
|||
} else { |
|||
this.selectedCellReactive.modelValue = {}; |
|||
this.selectedCellReactive.fields = []; |
|||
} |
|||
} |
|||
}; |
|||
|
|||
this.graph.getSelectionModel().addListener(InternalEvent.CHANGE, this.selectionChanged); |
|||
} |
|||
|
|||
setSelectedCellReactive(selectedCellReactive) { |
|||
this.selectedCellReactive = selectedCellReactive; |
|||
} |
|||
|
|||
updateCell(arg) { |
|||
this.graph.batchUpdate(() => { |
|||
let cell = this.graph.getSelectionCell(); |
|||
if (Tools.isArray(cell)) { |
|||
cell = cell[0]; |
|||
} |
|||
const dom = cell.value; |
|||
const formData = arg.form.getData(); |
|||
for (const field in formData) { |
|||
dom.setAttribute(field, formData[field]); |
|||
} |
|||
const edit = new ValueChange(this.graph.getDataModel(), this.graph.getSelectionCell(), dom); |
|||
this.graph.getDataModel().execute(edit); |
|||
//this.graph.updateCellSize(cell);
|
|||
}); |
|||
} |
|||
|
|||
onDestroy() { |
|||
this.graph.getSelectionModel().removeListener(InternalEvent.CHANGE, this.selectionChanged); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
import { Graph, GraphPlugin, UndoManager, InternalEvent } from '@maxgraph/core'; |
|||
|
|||
export class PlatformUndoManagerHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformUndoManagerHandler'; |
|||
private graph: Graph; |
|||
private undoManager: UndoManager; |
|||
|
|||
constructor(graph) { |
|||
this.graph = graph; |
|||
this.undoManager = new UndoManager(); |
|||
} |
|||
|
|||
start() { |
|||
this.undoListener = (sender, event) => { |
|||
this.undoManager.undoableEditHappened(event.getProperty('edit')); |
|||
}; |
|||
this.graph.getDataModel().addListener(InternalEvent.UNDO, this.undoListener); |
|||
this.graph.getView().addListener(InternalEvent.UNDO, this.undoListener); |
|||
} |
|||
|
|||
undo() { |
|||
this.undoManager?.undo(); |
|||
} |
|||
|
|||
redo() { |
|||
this.undoManager?.redo(); |
|||
} |
|||
|
|||
onDestroy() { |
|||
this.undoManager = null; |
|||
} |
|||
} |
@ -0,0 +1,54 @@ |
|||
import { Graph, GraphPlugin, UndoManager, InternalEvent } from '@maxgraph/core'; |
|||
|
|||
export class PlatformVertexDefineHandler implements GraphPlugin { |
|||
public static pluginId: string = 'PlatformVertexDefineHandler'; |
|||
private graph: Graph; |
|||
private defines = {}; |
|||
|
|||
constructor(graph: Graph) { |
|||
this.graph = graph; |
|||
} |
|||
|
|||
setDefines(configures) { |
|||
for (const configure of configures) { |
|||
this.defines[configure.type.toLowerCase()] = { |
|||
getLabel: configure.getLabel, |
|||
getValue: configure.getValue, |
|||
getFormFields: configure.getFormFields, |
|||
}; |
|||
} |
|||
} |
|||
|
|||
getLabel(type, value) { |
|||
if (this.defines[type]?.getLabel) { |
|||
return this.defines[type].getLabel(value); |
|||
} |
|||
return ''; |
|||
} |
|||
|
|||
getValue(type, dom) { |
|||
if (this.defines[type]?.getValue) { |
|||
return this.defines[type]?.getValue(dom); |
|||
} else { |
|||
if (dom) { |
|||
const value = {}; |
|||
for (const attributeName of dom.getAttributeNames()) { |
|||
value[attributeName] = dom.getAttribute(attributeName); |
|||
} |
|||
return value; |
|||
} else { |
|||
return {}; |
|||
} |
|||
} |
|||
} |
|||
|
|||
getFormFields(type) { |
|||
if (this.defines[type]?.getFormFields) { |
|||
return this.defines[type]?.getFormFields(); |
|||
} else { |
|||
return []; |
|||
} |
|||
} |
|||
|
|||
onDestroy() {} |
|||
} |
@ -0,0 +1,15 @@ |
|||
import { PlatformDragAndDropHandler } from '@/platform/components/graph/handler/PlatformDragAndDropHandler'; |
|||
import { PlatformEdgeDefineHandler } from '@/platform/components/graph/handler/PlatformEdgeDefineHandler'; |
|||
import { PlatformKeyBindHandler } from '@/platform/components/graph/handler/PlatformKeyBindHandler'; |
|||
import { PlatformSelectedCellHandler } from '@/platform/components/graph/handler/PlatformSelectedCellHandler'; |
|||
import { PlatformVertexDefineHandler } from '@/platform/components/graph/handler/PlatformVertexDefineHandler'; |
|||
import { PlatformUndoManagerHandler } from '@/platform/components/graph/handler/PlatformUndoManagerHandler'; |
|||
|
|||
export { |
|||
PlatformDragAndDropHandler, |
|||
PlatformEdgeDefineHandler, |
|||
PlatformKeyBindHandler, |
|||
PlatformSelectedCellHandler, |
|||
PlatformVertexDefineHandler, |
|||
PlatformUndoManagerHandler, |
|||
}; |
@ -0,0 +1,68 @@ |
|||
import { constants, Stylesheet, Perimeter } from '@maxgraph/core'; |
|||
|
|||
export class PlatformStylesheet extends Stylesheet { |
|||
/** |
|||
* 创建顶点的样式表 |
|||
* 1. 节点默认图形类型包括: |
|||
* RECTANGLE(rectangle): 矩形 |
|||
* ELLIPSE(ellipse): 椭圆 |
|||
* DOUBLE_ELLIPSE(doubleEllipse): 双椭圆 |
|||
* RHOMBUS(rhombus): 菱形 |
|||
* LINE(line): 带文本的线段 |
|||
* IMAGE(image): 图片 |
|||
* LABEL(label): 文本框 |
|||
* CYLINDER(cylinder): 圆柱体 |
|||
* SWIMLANE(swimlane): 泳道 |
|||
* ACTOR(actor): 人形 |
|||
* CLOUD(cloud): 云型 |
|||
* TRIANGLE(triangle): 三角形 |
|||
* HEXAGON(hexagon): 六边形 |
|||
* CONNECTOR(connector): |
|||
* ARROW(arrow): |
|||
* ARROW_CONNECTOR(arrowConnector): |
|||
* 2. 连接样式: |
|||
* ELLIPSE(ellipsePerimeter): |
|||
* RECTANGLE(rectanglePerimeter): |
|||
* RHOMBUS(rhombusPerimeter): |
|||
* HEXAGON(hexagonPerimeter): |
|||
* TRIANGLE(trianglePerimeter): |
|||
* @returns 顶点的样式表 |
|||
*/ |
|||
createDefaultVertexStyle() { |
|||
const style = {}; |
|||
style.shape = constants.SHAPE.RECTANGLE; |
|||
style.perimeter = constants.PERIMETER.RECTANGLE; |
|||
style.rounded = 0; |
|||
style.verticalAlign = constants.ALIGN.MIDDLE; |
|||
style.align = constants.ALIGN.CENTER; |
|||
style.fillColor = 'white'; |
|||
style.strokeColor = 'black'; |
|||
style.fontColor = 'black'; |
|||
return style; |
|||
} |
|||
|
|||
/** |
|||
* 创建边的样式表 |
|||
* 箭头类型: |
|||
* CLASSIC(classic): 普通尖角箭头 |
|||
* CLASSIC_THIN(classicThin): 细尖角箭头 |
|||
* BLOCK(block): 普通平角箭头 |
|||
* BLOCK_THIN(blockThin): 细平角箭头 |
|||
* OPEN(open): 开放箭头 |
|||
* OPEN_THIN(openThin): 细开放箭头 |
|||
* OVAL(oval): 圆点箭头 |
|||
* DIAMOND(diamond): 实心菱形箭头 |
|||
* DIAMOND_THIN(diamondThin): 细实心菱形箭头 |
|||
* @returns 边的样式表 |
|||
*/ |
|||
createDefaultEdgeStyle() { |
|||
const style = {}; |
|||
style.shape = constants.SHAPE.CONNECTOR; |
|||
style.endArrow = constants.ARROW.CLASSIC; |
|||
style.verticalAlign = constants.ALIGN.MIDDLE; |
|||
style.align = constants.ALIGN.CENTER; |
|||
style.strokeColor = 'black'; |
|||
style.fontColor = 'black'; |
|||
return style; |
|||
} |
|||
} |
@ -0,0 +1,104 @@ |
|||
export class KeyCode { |
|||
static 0 = 48; |
|||
static 1 = 49; |
|||
static 2 = 50; |
|||
static 3 = 51; |
|||
static 4 = 52; |
|||
static 5 = 53; |
|||
static 6 = 54; |
|||
static 7 = 55; |
|||
static 8 = 56; |
|||
static 9 = 57; |
|||
|
|||
static A = 65; |
|||
static B = 66; |
|||
static C = 67; |
|||
static D = 68; |
|||
static E = 69; |
|||
static F = 70; |
|||
static G = 71; |
|||
static H = 72; |
|||
static I = 73; |
|||
static J = 74; |
|||
static K = 75; |
|||
static L = 76; |
|||
static M = 77; |
|||
static N = 78; |
|||
static O = 79; |
|||
static P = 80; |
|||
static Q = 81; |
|||
static R = 82; |
|||
static S = 83; |
|||
static T = 84; |
|||
static U = 85; |
|||
static V = 86; |
|||
static W = 87; |
|||
static X = 88; |
|||
static Y = 89; |
|||
static Z = 90; |
|||
|
|||
static F1 = 112; |
|||
static F2 = 113; |
|||
static F3 = 114; |
|||
static F4 = 115; |
|||
static F5 = 116; |
|||
static F6 = 117; |
|||
static F7 = 118; |
|||
static F8 = 119; |
|||
static F9 = 120; |
|||
static F10 = 121; |
|||
static F11 = 122; |
|||
static F12 = 123; |
|||
|
|||
static Number_Pad_0 = 96; |
|||
static Number_Pad_1 = 97; |
|||
static Number_Pad_2 = 98; |
|||
static Number_Pad_3 = 99; |
|||
static Number_Pad_4 = 100; |
|||
static Number_Pad_5 = 101; |
|||
static Number_Pad_6 = 102; |
|||
static Number_Pad_7 = 103; |
|||
static Number_Pad_8 = 104; |
|||
static Number_Pad_9 = 105; |
|||
|
|||
static BACKSPACE = 8; |
|||
static TAB = 9; |
|||
static ENTER = 13; |
|||
static SHIFT = 16; |
|||
static CTRL = 17; |
|||
static ALT = 18; |
|||
static PAUSE_OR_BREAK = 19; |
|||
static CAPS_LOCK = 20; |
|||
static ESCAPE = 27; |
|||
static PAGE_UP = 33; |
|||
static PAGE_DOWN = 34; |
|||
static END = 35; |
|||
static HOME = 36; |
|||
static LEFT_ARROW = 37; |
|||
static UP_ARROW = 38; |
|||
static RIGHT_ARROW = 39; |
|||
static DOWN_ARROW = 40; |
|||
static INSERT = 45; |
|||
static DELETE = 46; |
|||
static LEFT_WINDOW_KEY = 91; |
|||
static RIGHT_WINDOW_KEY = 92; |
|||
static SELECT_KEY = 93; |
|||
static MULTIPLY = 106; |
|||
static ADD = 107; |
|||
static SUBTRACT = 109; |
|||
static DECIMAL_POINT = 110; |
|||
static DIVIDE = 111; |
|||
static NUM_LOCK = 144; |
|||
static SCROLL_LOCK = 145; |
|||
static SEMI_COLON = 186; |
|||
static EQUAL_SIGN = 187; |
|||
static COMMA = 188; |
|||
static DASH = 189; |
|||
static PERIOD = 190; |
|||
static FORWARD_SLASH = 191; |
|||
static GRAVE_ACCENT = 192; |
|||
static OPEN_BRACKET = 219; |
|||
static BACK_SLASH = 220; |
|||
static CLOSE_BRAKET = 221; |
|||
static SINGLE_QUOTE = 222; |
|||
} |
@ -1,22 +1,185 @@ |
|||
<template> |
|||
<w-graph></w-graph> |
|||
<w-graph v-model="modelValueRef" :vertex-defines="vertexDefines" :edge-defines="edgeDefines"></w-graph> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { onMounted, onUpdated, onActivated, onDeactivated } from 'vue'; |
|||
import { ref } from 'vue'; |
|||
import { $t } from '@/platform'; |
|||
|
|||
onMounted(() => { |
|||
console.log('onMounted...'); |
|||
}); |
|||
const edgeDefines = [ |
|||
{ |
|||
type: 'condition', |
|||
fromVertexType: 'condition', |
|||
toVertexType: null, |
|||
getLabel: (value) => { |
|||
return value.value; |
|||
}, |
|||
getValue: (dom) => { |
|||
if (dom) { |
|||
return { |
|||
condition: dom.getAttribute('condition'), |
|||
}; |
|||
} else { |
|||
return { |
|||
valueType: 'java.lang.String', |
|||
value: '', |
|||
commands: '', |
|||
}; |
|||
} |
|||
}, |
|||
getFormFields: () => { |
|||
return [ |
|||
{ |
|||
name: 'valueType', |
|||
label: 'valueType', |
|||
type: 'w-select', |
|||
}, |
|||
{ |
|||
name: 'value', |
|||
label: 'value', |
|||
type: 'w-text', |
|||
}, |
|||
{ |
|||
name: 'commands', |
|||
label: 'commands', |
|||
type: 'w-code-mirror', |
|||
lang: 'java', |
|||
rows: 10, |
|||
lineWrap: true, |
|||
lineBreak: false, |
|||
placeholder: true, |
|||
}, |
|||
]; |
|||
}, |
|||
}, |
|||
]; |
|||
|
|||
onUpdated(() => { |
|||
console.log('onUpdated...'); |
|||
}); |
|||
|
|||
onActivated(() => { |
|||
console.log('onActivated...'); |
|||
}); |
|||
|
|||
onDeactivated(() => { |
|||
console.log('onDeactivated...'); |
|||
}); |
|||
const vertexDefines = [ |
|||
{ |
|||
type: 'start', |
|||
thumbnail: { shape: 'ellipse', label: $t('start'), rx: 8, ry: 8, strokeColor: 'black', strokeWidth: 1 }, |
|||
cell: { |
|||
shape: 'ellipse', |
|||
size: [50, 50], |
|||
}, |
|||
getLabel: (value) => { |
|||
return $t('start'); |
|||
}, |
|||
getValue: (dom) => { |
|||
return {}; |
|||
}, |
|||
getFormFields: () => { |
|||
return []; |
|||
}, |
|||
}, |
|||
{ |
|||
type: 'condition', |
|||
thumbnail: { shape: 'rhombus', label: $t('condition'), strokeColor: 'black', strokeWidth: 1 }, |
|||
cell: { |
|||
shape: 'rhombus', |
|||
size: [120, 60], |
|||
}, |
|||
getLabel: (value) => { |
|||
return value.condition; |
|||
}, |
|||
getValue: (dom) => { |
|||
if (dom) { |
|||
return { |
|||
condition: dom.getAttribute('condition'), |
|||
}; |
|||
} else { |
|||
return { |
|||
condition: $t('condition'), |
|||
}; |
|||
} |
|||
}, |
|||
getFormFields: () => { |
|||
return [ |
|||
{ |
|||
name: 'condition', |
|||
label: 'condition', |
|||
type: 'w-code-mirror', |
|||
lang: 'java', |
|||
rows: 10, |
|||
lineWrap: true, |
|||
lineBreak: false, |
|||
placeholder: true, |
|||
}, |
|||
]; |
|||
}, |
|||
}, |
|||
{ |
|||
type: 'expression', |
|||
thumbnail: { shape: 'rectangle', label: $t('expression'), strokeColor: 'black', strokeWidth: 1 }, |
|||
cell: { |
|||
shape: 'rectangle', |
|||
size: [120, 60], |
|||
}, |
|||
getLabel: (value) => { |
|||
let html = ''; |
|||
html += '<div style="text-align:center;">' + value.expression + '</div>'; |
|||
html += '<hr size="0.5"/>'; |
|||
html += '<div style="text-align:left;">' + value.commands + '</div>'; |
|||
return html; |
|||
}, |
|||
getValue: (dom) => { |
|||
if (dom) { |
|||
return { |
|||
expression: dom.getAttribute('expression'), |
|||
commands: dom.getAttribute('commands'), |
|||
}; |
|||
} else { |
|||
return { |
|||
expression: 'xxx', |
|||
commands: 'kjsdfi=klsjdf="xxx";\na=b;', |
|||
}; |
|||
} |
|||
}, |
|||
getFormFields: () => { |
|||
return [ |
|||
{ name: 'expression', label: 'expression', type: 'w-text' }, |
|||
{ |
|||
name: 'commands', |
|||
label: 'commands', |
|||
type: 'w-code-mirror', |
|||
lang: 'java', |
|||
rows: 10, |
|||
lineWrap: true, |
|||
lineBreak: true, |
|||
placeholder: true, |
|||
}, |
|||
]; |
|||
}, |
|||
}, |
|||
{ |
|||
type: 'resourceabstract', |
|||
thumbnail: { shape: 'ellipse', label: '资源摘要', rx: 10, ry: 6, strokeColor: 'black', strokeWidth: 1 }, |
|||
cell: { |
|||
shape: 'ellipse', |
|||
size: [120, 60], |
|||
}, |
|||
getLabel: (value) => { |
|||
return value.code; |
|||
}, |
|||
getValue: (dom) => { |
|||
if (dom) { |
|||
return { |
|||
code: dom.getAttribute('code'), |
|||
version: dom.getAttribute('version'), |
|||
}; |
|||
} else { |
|||
return { |
|||
code: '资源摘要', |
|||
version: '', |
|||
}; |
|||
} |
|||
}, |
|||
getFormFields: () => { |
|||
return [ |
|||
{ name: 'code', label: 'code', type: 'w-select' }, |
|||
{ name: 'version', label: 'version', type: 'w-select' }, |
|||
]; |
|||
}, |
|||
}, |
|||
]; |
|||
const modelValueRef = ref(''); |
|||
</script> |
|||
|
@ -0,0 +1,297 @@ |
|||
@angular/animations |
|||
MIT |
|||
|
|||
@angular/cdk |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2024 Google LLC. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
|||
|
|||
@angular/common |
|||
MIT |
|||
|
|||
@angular/core |
|||
MIT |
|||
|
|||
@angular/forms |
|||
MIT |
|||
|
|||
@angular/material |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2024 Google LLC. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
|||
|
|||
@angular/platform-browser |
|||
MIT |
|||
|
|||
@angular/service-worker |
|||
MIT |
|||
|
|||
rxjs |
|||
Apache-2.0 |
|||
Apache License |
|||
Version 2.0, January 2004 |
|||
http://www.apache.org/licenses/ |
|||
|
|||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
|||
|
|||
1. Definitions. |
|||
|
|||
"License" shall mean the terms and conditions for use, reproduction, |
|||
and distribution as defined by Sections 1 through 9 of this document. |
|||
|
|||
"Licensor" shall mean the copyright owner or entity authorized by |
|||
the copyright owner that is granting the License. |
|||
|
|||
"Legal Entity" shall mean the union of the acting entity and all |
|||
other entities that control, are controlled by, or are under common |
|||
control with that entity. For the purposes of this definition, |
|||
"control" means (i) the power, direct or indirect, to cause the |
|||
direction or management of such entity, whether by contract or |
|||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
|||
outstanding shares, or (iii) beneficial ownership of such entity. |
|||
|
|||
"You" (or "Your") shall mean an individual or Legal Entity |
|||
exercising permissions granted by this License. |
|||
|
|||
"Source" form shall mean the preferred form for making modifications, |
|||
including but not limited to software source code, documentation |
|||
source, and configuration files. |
|||
|
|||
"Object" form shall mean any form resulting from mechanical |
|||
transformation or translation of a Source form, including but |
|||
not limited to compiled object code, generated documentation, |
|||
and conversions to other media types. |
|||
|
|||
"Work" shall mean the work of authorship, whether in Source or |
|||
Object form, made available under the License, as indicated by a |
|||
copyright notice that is included in or attached to the work |
|||
(an example is provided in the Appendix below). |
|||
|
|||
"Derivative Works" shall mean any work, whether in Source or Object |
|||
form, that is based on (or derived from) the Work and for which the |
|||
editorial revisions, annotations, elaborations, or other modifications |
|||
represent, as a whole, an original work of authorship. For the purposes |
|||
of this License, Derivative Works shall not include works that remain |
|||
separable from, or merely link (or bind by name) to the interfaces of, |
|||
the Work and Derivative Works thereof. |
|||
|
|||
"Contribution" shall mean any work of authorship, including |
|||
the original version of the Work and any modifications or additions |
|||
to that Work or Derivative Works thereof, that is intentionally |
|||
submitted to Licensor for inclusion in the Work by the copyright owner |
|||
or by an individual or Legal Entity authorized to submit on behalf of |
|||
the copyright owner. For the purposes of this definition, "submitted" |
|||
means any form of electronic, verbal, or written communication sent |
|||
to the Licensor or its representatives, including but not limited to |
|||
communication on electronic mailing lists, source code control systems, |
|||
and issue tracking systems that are managed by, or on behalf of, the |
|||
Licensor for the purpose of discussing and improving the Work, but |
|||
excluding communication that is conspicuously marked or otherwise |
|||
designated in writing by the copyright owner as "Not a Contribution." |
|||
|
|||
"Contributor" shall mean Licensor and any individual or Legal Entity |
|||
on behalf of whom a Contribution has been received by Licensor and |
|||
subsequently incorporated within the Work. |
|||
|
|||
2. Grant of Copyright License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
copyright license to reproduce, prepare Derivative Works of, |
|||
publicly display, publicly perform, sublicense, and distribute the |
|||
Work and such Derivative Works in Source or Object form. |
|||
|
|||
3. Grant of Patent License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
(except as stated in this section) patent license to make, have made, |
|||
use, offer to sell, sell, import, and otherwise transfer the Work, |
|||
where such license applies only to those patent claims licensable |
|||
by such Contributor that are necessarily infringed by their |
|||
Contribution(s) alone or by combination of their Contribution(s) |
|||
with the Work to which such Contribution(s) was submitted. If You |
|||
institute patent litigation against any entity (including a |
|||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
|||
or a Contribution incorporated within the Work constitutes direct |
|||
or contributory patent infringement, then any patent licenses |
|||
granted to You under this License for that Work shall terminate |
|||
as of the date such litigation is filed. |
|||
|
|||
4. Redistribution. You may reproduce and distribute copies of the |
|||
Work or Derivative Works thereof in any medium, with or without |
|||
modifications, and in Source or Object form, provided that You |
|||
meet the following conditions: |
|||
|
|||
(a) You must give any other recipients of the Work or |
|||
Derivative Works a copy of this License; and |
|||
|
|||
(b) You must cause any modified files to carry prominent notices |
|||
stating that You changed the files; and |
|||
|
|||
(c) You must retain, in the Source form of any Derivative Works |
|||
that You distribute, all copyright, patent, trademark, and |
|||
attribution notices from the Source form of the Work, |
|||
excluding those notices that do not pertain to any part of |
|||
the Derivative Works; and |
|||
|
|||
(d) If the Work includes a "NOTICE" text file as part of its |
|||
distribution, then any Derivative Works that You distribute must |
|||
include a readable copy of the attribution notices contained |
|||
within such NOTICE file, excluding those notices that do not |
|||
pertain to any part of the Derivative Works, in at least one |
|||
of the following places: within a NOTICE text file distributed |
|||
as part of the Derivative Works; within the Source form or |
|||
documentation, if provided along with the Derivative Works; or, |
|||
within a display generated by the Derivative Works, if and |
|||
wherever such third-party notices normally appear. The contents |
|||
of the NOTICE file are for informational purposes only and |
|||
do not modify the License. You may add Your own attribution |
|||
notices within Derivative Works that You distribute, alongside |
|||
or as an addendum to the NOTICE text from the Work, provided |
|||
that such additional attribution notices cannot be construed |
|||
as modifying the License. |
|||
|
|||
You may add Your own copyright statement to Your modifications and |
|||
may provide additional or different license terms and conditions |
|||
for use, reproduction, or distribution of Your modifications, or |
|||
for any such Derivative Works as a whole, provided Your use, |
|||
reproduction, and distribution of the Work otherwise complies with |
|||
the conditions stated in this License. |
|||
|
|||
5. Submission of Contributions. Unless You explicitly state otherwise, |
|||
any Contribution intentionally submitted for inclusion in the Work |
|||
by You to the Licensor shall be under the terms and conditions of |
|||
this License, without any additional terms or conditions. |
|||
Notwithstanding the above, nothing herein shall supersede or modify |
|||
the terms of any separate license agreement you may have executed |
|||
with Licensor regarding such Contributions. |
|||
|
|||
6. Trademarks. This License does not grant permission to use the trade |
|||
names, trademarks, service marks, or product names of the Licensor, |
|||
except as required for reasonable and customary use in describing the |
|||
origin of the Work and reproducing the content of the NOTICE file. |
|||
|
|||
7. Disclaimer of Warranty. Unless required by applicable law or |
|||
agreed to in writing, Licensor provides the Work (and each |
|||
Contributor provides its Contributions) on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
|||
implied, including, without limitation, any warranties or conditions |
|||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
|||
PARTICULAR PURPOSE. You are solely responsible for determining the |
|||
appropriateness of using or redistributing the Work and assume any |
|||
risks associated with Your exercise of permissions under this License. |
|||
|
|||
8. Limitation of Liability. In no event and under no legal theory, |
|||
whether in tort (including negligence), contract, or otherwise, |
|||
unless required by applicable law (such as deliberate and grossly |
|||
negligent acts) or agreed to in writing, shall any Contributor be |
|||
liable to You for damages, including any direct, indirect, special, |
|||
incidental, or consequential damages of any character arising as a |
|||
result of this License or out of the use or inability to use the |
|||
Work (including but not limited to damages for loss of goodwill, |
|||
work stoppage, computer failure or malfunction, or any and all |
|||
other commercial damages or losses), even if such Contributor |
|||
has been advised of the possibility of such damages. |
|||
|
|||
9. Accepting Warranty or Additional Liability. While redistributing |
|||
the Work or Derivative Works thereof, You may choose to offer, |
|||
and charge a fee for, acceptance of support, warranty, indemnity, |
|||
or other liability obligations and/or rights consistent with this |
|||
License. However, in accepting such obligations, You may act only |
|||
on Your own behalf and on Your sole responsibility, not on behalf |
|||
of any other Contributor, and only if You agree to indemnify, |
|||
defend, and hold each Contributor harmless for any liability |
|||
incurred by, or claims asserted against, such Contributor by reason |
|||
of your accepting any such warranty or additional liability. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
APPENDIX: How to apply the Apache License to your work. |
|||
|
|||
To apply the Apache License to your work, attach the following |
|||
boilerplate notice, with the fields enclosed by brackets "[]" |
|||
replaced with your own identifying information. (Don't include |
|||
the brackets!) The text should be enclosed in the appropriate |
|||
comment syntax for the file format. We also recommend that a |
|||
file or class name and description of purpose be included on the |
|||
same "printed page" as the copyright notice for easier |
|||
identification within third-party archives. |
|||
|
|||
Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
|
|||
|
|||
zone.js |
|||
MIT |
|||
The MIT License |
|||
|
|||
Copyright (c) 2010-2024 Google LLC. https://angular.io/license |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,213 @@ |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 300; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
font-display: swap; |
|||
src: url(./KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
/* cyrillic-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; |
|||
} |
|||
/* cyrillic */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; |
|||
} |
|||
/* greek-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+1F00-1FFF; |
|||
} |
|||
/* greek */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; |
|||
} |
|||
/* vietnamese */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; |
|||
} |
|||
/* latin-ext */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format('woff2'); |
|||
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; |
|||
} |
|||
/* latin */ |
|||
@font-face { |
|||
font-family: 'Roboto'; |
|||
font-style: normal; |
|||
font-weight: 500; |
|||
font-display: swap; |
|||
src: url(./KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format('woff2'); |
|||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; |
|||
} |
|||
|
|||
/* fallback */ |
|||
@font-face { |
|||
font-family: 'Material Icons'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: url(./materialicons-v142.woff2) format('woff2'); |
|||
} |
|||
|
|||
.material-icons { |
|||
font-family: 'Material Icons'; |
|||
font-weight: normal; |
|||
font-style: normal; |
|||
font-size: 24px; |
|||
line-height: 1; |
|||
letter-spacing: normal; |
|||
text-transform: none; |
|||
display: inline-block; |
|||
white-space: nowrap; |
|||
word-wrap: normal; |
|||
direction: ltr; |
|||
text-rendering: optimizeLegibility; |
|||
-webkit-font-smoothing: antialiased; |
|||
} |
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 646 B |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 343 B |
After Width: | Height: | Size: 131 B |
After Width: | Height: | Size: 294 B |
After Width: | Height: | Size: 230 B |
After Width: | Height: | Size: 239 B |
After Width: | Height: | Size: 204 B |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,59 @@ |
|||
{ |
|||
"name": "SvgPathEditor", |
|||
"short_name": "SvgPathEditor", |
|||
"theme_color": "#111111", |
|||
"background_color": "#252526", |
|||
"display": "standalone", |
|||
"scope": "./", |
|||
"start_url": "./", |
|||
"icons": [ |
|||
{ |
|||
"src": "assets/icons/icon-72x72.png", |
|||
"sizes": "72x72", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-96x96.png", |
|||
"sizes": "96x96", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-128x128.png", |
|||
"sizes": "128x128", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-144x144.png", |
|||
"sizes": "144x144", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-152x152.png", |
|||
"sizes": "152x152", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-192x192.png", |
|||
"sizes": "192x192", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-384x384.png", |
|||
"sizes": "384x384", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
}, |
|||
{ |
|||
"src": "assets/icons/icon-512x512.png", |
|||
"sizes": "512x512", |
|||
"type": "image/png", |
|||
"purpose": "maskable any" |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,115 @@ |
|||
{ |
|||
"configVersion": 1, |
|||
"timestamp": 1725339129432, |
|||
"index": "/index.html", |
|||
"assetGroups": [ |
|||
{ |
|||
"name": "app", |
|||
"installMode": "prefetch", |
|||
"updateMode": "prefetch", |
|||
"cacheQueryOptions": { |
|||
"ignoreVary": true |
|||
}, |
|||
"urls": [ |
|||
"/favicon.ico", |
|||
"/index.html", |
|||
"/main.19cfcacc3c0bb7eb.js", |
|||
"/manifest.webmanifest", |
|||
"/polyfills.179c8bf8046b88bb.js", |
|||
"/runtime.6f6474d711a7c88e.js", |
|||
"/styles.a4c2c16033803e20.css" |
|||
], |
|||
"patterns": [] |
|||
}, |
|||
{ |
|||
"name": "assets", |
|||
"installMode": "lazy", |
|||
"updateMode": "prefetch", |
|||
"cacheQueryOptions": { |
|||
"ignoreVary": true |
|||
}, |
|||
"urls": [ |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2", |
|||
"/assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2", |
|||
"/assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2", |
|||
"/assets/css.css", |
|||
"/assets/delete.svg", |
|||
"/assets/github.svg", |
|||
"/assets/icons/icon-128x128.png", |
|||
"/assets/icons/icon-144x144.png", |
|||
"/assets/icons/icon-152x152-cropped.png", |
|||
"/assets/icons/icon-152x152.png", |
|||
"/assets/icons/icon-192x192.png", |
|||
"/assets/icons/icon-384x384.png", |
|||
"/assets/icons/icon-512x512.png", |
|||
"/assets/icons/icon-72x72.png", |
|||
"/assets/icons/icon-96x96.png", |
|||
"/assets/logo.svg", |
|||
"/assets/materialicons-v142.woff2", |
|||
"/assets/more.svg", |
|||
"/assets/sponsor.svg", |
|||
"/assets/zoom_fit.svg", |
|||
"/assets/zoom_in.svg", |
|||
"/assets/zoom_out.svg" |
|||
], |
|||
"patterns": [] |
|||
} |
|||
], |
|||
"dataGroups": [], |
|||
"hashTable": { |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2": "a7171422d5c6540cf3eeb0b0c7b7fda3973128f9", |
|||
"/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2": "a7171422d5c6540cf3eeb0b0c7b7fda3973128f9", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2": "117895b042db3c7ce867c807a63f238148c85bf7", |
|||
"/assets/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2": "4e14271afc054b53725261e61ff3d6d41282ba05", |
|||
"/assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2": "4b7bad6c115b963523d3cd7ad52ebf717135e24a", |
|||
"/assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2": "5bfe9060f0f5f13b4e777e29e65341bb782095bd", |
|||
"/assets/css.css": "5e572a30d3e070d7d4e01e1400c05aa28384868a", |
|||
"/assets/delete.svg": "c9d8618ebbfb075f6449d7ccd318be36803a2a98", |
|||
"/assets/github.svg": "f49c2d4abc2753aff2edbd161758f852472e22ed", |
|||
"/assets/icons/icon-128x128.png": "990bf9066e18e84df38496afcb581dd032d5dd79", |
|||
"/assets/icons/icon-144x144.png": "1418f7e28c137f14f1e3f52405587500dc2e314e", |
|||
"/assets/icons/icon-152x152-cropped.png": "4252eb7bfb2e454264eef04afedbe46f22abd619", |
|||
"/assets/icons/icon-152x152.png": "149f61864f3e263deedab9a54ae68737417b1b3c", |
|||
"/assets/icons/icon-192x192.png": "a4357613a87087d60ddb19e3f1117cd7116fab7a", |
|||
"/assets/icons/icon-384x384.png": "d98880dd39e8f550e4c12b3c6c6d347a4c79adfe", |
|||
"/assets/icons/icon-512x512.png": "7492b47ba3ea2a411037ca9f65474c1e557b9dbb", |
|||
"/assets/icons/icon-72x72.png": "025fc86cdee053766cb0ba832ec7611d9d2f9e24", |
|||
"/assets/icons/icon-96x96.png": "94a0268ac4b4667655798a2ae84a4ce1197a9775", |
|||
"/assets/logo.svg": "991d4d0400f85453cf8f7cbad937be0201bf0f65", |
|||
"/assets/materialicons-v142.woff2": "aaae93b146d97737fabe87a6bc741113e6899ad3", |
|||
"/assets/more.svg": "b10d6de2d92740c806af17c0ff9c520d3e4bf35f", |
|||
"/assets/sponsor.svg": "7ef4b2531be1d24978c158588ea28851b3cfe579", |
|||
"/assets/zoom_fit.svg": "3bfa12d79ff4a9c32465c0501ef85d3783ea96c3", |
|||
"/assets/zoom_in.svg": "bf3ac558a23c8e5de36d2526618eac96e867af4a", |
|||
"/assets/zoom_out.svg": "2e7c0be5fb00f1468a89685dc13139a63d34588d", |
|||
"/favicon.ico": "5e89bcef8dcf5abfb8442b0a182fbe76dfbf61a9", |
|||
"/index.html": "65bc7e93d913a4e4a58a3464fd55ecf665c5f9e0", |
|||
"/main.19cfcacc3c0bb7eb.js": "4b5dd4dc575ad647161372f7cff0552de1139e81", |
|||
"/manifest.webmanifest": "80b98f13afc36553e06626b0f03032fcaac82c58", |
|||
"/polyfills.179c8bf8046b88bb.js": "67853517b3c4a85d4b49c17da38a5e43d5300e43", |
|||
"/runtime.6f6474d711a7c88e.js": "2fb0c339e14f24885ee4118a95a4513ce37011a6", |
|||
"/styles.a4c2c16033803e20.css": "0375c469df334b800f9a82dd7e6cd42081c0f67b" |
|||
}, |
|||
"navigationUrls": [ |
|||
{ |
|||
"positive": true, |
|||
"regex": "^\\/.*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*\\.[^/]*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*$" |
|||
}, |
|||
{ |
|||
"positive": false, |
|||
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$" |
|||
} |
|||
], |
|||
"navigationRequestStrategy": "performance" |
|||
} |