update
661
LICENSE.txt
Normal file
|
|
@ -0,0 +1,661 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
10
manifest.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "simple-mind-map",
|
||||
"name": "Simple mind map",
|
||||
"version": "0.1.8",
|
||||
"minAppVersion": "1.8.3",
|
||||
"description": "A relatively powerful mind map.",
|
||||
"author": "wanglin",
|
||||
"authorUrl": "https://github.com/wanglin2",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
12
src/.babelrc
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"presets": [["@babel/preset-env"]],
|
||||
"plugins": [
|
||||
[
|
||||
"component",
|
||||
{
|
||||
"libraryName": "element-ui",
|
||||
"styleLibraryName": "theme-chalk"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
1
src/.env.library
Normal file
|
|
@ -0,0 +1 @@
|
|||
NODE_ENV=library
|
||||
11
src/.prettierignore
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
src/assets
|
||||
*/.DS_Store
|
||||
node_modules
|
||||
public
|
||||
*.json
|
||||
*.md
|
||||
.eslintrc.js
|
||||
.prettierignore
|
||||
.prettierrc
|
||||
package-lock.json
|
||||
package.json
|
||||
5
src/.prettierrc
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
semi: false
|
||||
singleQuote: true
|
||||
printWidth: 80
|
||||
trailingComma: 'none'
|
||||
arrowParens: 'avoid'
|
||||
872
src/SmmEditView.js
Normal file
|
|
@ -0,0 +1,872 @@
|
|||
import { Notice, TextFileView, TFile, setIcon, Platform } from 'obsidian'
|
||||
import {
|
||||
SMM_VIEW_TYPE,
|
||||
SAVE_ICON,
|
||||
IMPORT_ICON,
|
||||
EXPORT_ICON,
|
||||
SMM_TAG,
|
||||
OUTLINE_ICON,
|
||||
MINDMAP_ICON,
|
||||
PRINT_ICON,
|
||||
getSmmEditViewCount
|
||||
} from './ob/constant.js'
|
||||
import { initApp } from './src/main.js'
|
||||
import {
|
||||
assembleMarkdownText,
|
||||
parseMarkdownText,
|
||||
createDefaultText
|
||||
} from './ob/metadataAndMarkdown.js'
|
||||
import {
|
||||
hideTargetMenu,
|
||||
smmFilePathToFileName,
|
||||
formatFileName
|
||||
} from './ob/utils.js'
|
||||
import LZString from 'lz-string'
|
||||
import { base64ToFile } from './src/utils'
|
||||
import ModifyFileName from './ob/ModifyFileName.js'
|
||||
|
||||
class SmmEditView extends TextFileView {
|
||||
constructor(leaf, plugin) {
|
||||
super(leaf)
|
||||
this.plugin = plugin
|
||||
this.contentEl.style.padding = 0
|
||||
this.warpEl = this.contentEl.createDiv('smmMindmapEditContainer')
|
||||
this.warpEl.classList.add('smm-common-full-size')
|
||||
this.mindMapData = ''
|
||||
this.parsedMindMapData = null
|
||||
this.mindMapAPP = null
|
||||
|
||||
this.isActive = true
|
||||
this.resizeObserver = null
|
||||
this.isUnSave = false
|
||||
this.isOuterChange = false
|
||||
this.isNotTriggerDataChange = false
|
||||
this.isHidden = false
|
||||
this.needResize = false
|
||||
this.isOutlineEditMode = false
|
||||
this.saveButton = null
|
||||
this.exportButton = null
|
||||
this.importButton = null
|
||||
this.printOutlineButton = null
|
||||
this.changeToOutlineButton = null
|
||||
this.changeToMindmapButton = null
|
||||
this.savingTipEl = null
|
||||
this.isReadonlyMode = false
|
||||
this.toggleReadonlyButton = null
|
||||
this.modifyFileName = new ModifyFileName(this)
|
||||
this.popScope = null
|
||||
this.id = getSmmEditViewCount()
|
||||
}
|
||||
|
||||
getViewType() {
|
||||
return SMM_VIEW_TYPE
|
||||
}
|
||||
|
||||
getIcon() {
|
||||
return 'smm-icon'
|
||||
}
|
||||
|
||||
onPaneMenu(menu, source) {
|
||||
super.onPaneMenu(menu, source)
|
||||
hideTargetMenu(menu, '在新窗口中打开')
|
||||
hideTargetMenu(menu, '移动至新窗口')
|
||||
}
|
||||
|
||||
async switchToMarkdownView() {
|
||||
if (!this.file || !this.leaf) return
|
||||
const mdViewType = this.app.viewRegistry.getTypeByExtension('md')
|
||||
await this.leaf.setViewState({
|
||||
type: mdViewType,
|
||||
state: {
|
||||
...this.leaf.getViewState().state,
|
||||
isSwitchToMarkdownViewFromSmmView: true
|
||||
},
|
||||
popstate: true
|
||||
})
|
||||
}
|
||||
|
||||
async onOpen() {
|
||||
this.registerEvent(
|
||||
this.app.vault.on('modify', this._handleExternalChange.bind(this))
|
||||
)
|
||||
// 注册激活状态监听
|
||||
this.registerEvent(
|
||||
this.app.workspace.on(
|
||||
'active-leaf-change',
|
||||
this._handleActiveChange.bind(this)
|
||||
)
|
||||
)
|
||||
this.registerEvent(
|
||||
this.app.workspace.on('resize', this._handleResize.bind(this))
|
||||
)
|
||||
|
||||
this._addActionBtns()
|
||||
|
||||
this._initThemeMode()
|
||||
|
||||
this.modifyFileName.setupTitleEditing()
|
||||
this._registerHotkeyOverrides()
|
||||
}
|
||||
|
||||
getViewData() {
|
||||
return this.mindMapData
|
||||
}
|
||||
|
||||
async setViewData(data, isClear) {
|
||||
if (this.isHidden) {
|
||||
return
|
||||
}
|
||||
if (isClear) {
|
||||
this.clear()
|
||||
}
|
||||
let rawData = data.trim()
|
||||
try {
|
||||
if (!rawData) {
|
||||
throw new Error(this.plugin._t('tip.fileIsEmpty'))
|
||||
} else {
|
||||
this.parsedMindMapData = parseMarkdownText(rawData)
|
||||
const content = this.parsedMindMapData.metadata.content
|
||||
if (content) {
|
||||
let passedContent = ''
|
||||
try {
|
||||
const json = JSON.parse(content)
|
||||
if (json && json.root) {
|
||||
passedContent = content
|
||||
}
|
||||
} catch (error) {}
|
||||
if (!passedContent) {
|
||||
this.parsedMindMapData.metadata.content = LZString.decompressFromBase64(
|
||||
content
|
||||
)
|
||||
}
|
||||
} else {
|
||||
throw new Error('文件格式错误')
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
rawData = createDefaultText(
|
||||
'',
|
||||
this.plugin._getCreateDefaultMindMapOptions()
|
||||
)
|
||||
}
|
||||
this.mindMapData = rawData
|
||||
if (!this.parsedMindMapData) {
|
||||
this.parsedMindMapData = parseMarkdownText(rawData)
|
||||
this.parsedMindMapData.metadata.content = LZString.decompressFromBase64(
|
||||
this.parsedMindMapData.metadata.content
|
||||
)
|
||||
}
|
||||
if (isClear) {
|
||||
this._renderMindMap()
|
||||
} else if (this.mindMapAPP) {
|
||||
this.isNotTriggerDataChange = true
|
||||
this.mindMapAPP.$bus.$emit(
|
||||
'updateMindMapDataFromOb',
|
||||
this.parsedMindMapData.metadata.content
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
_clearObserver() {
|
||||
if (this.resizeObserver) {
|
||||
this.resizeObserver.disconnect()
|
||||
this.resizeObserver = null
|
||||
}
|
||||
}
|
||||
|
||||
_renderMindMap() {
|
||||
this.warpEl.empty()
|
||||
const el = this.warpEl.createDiv('smmMindMapEdit')
|
||||
el.classList.add('smm-common-full-size')
|
||||
this._clearObserver()
|
||||
this.resizeObserver = new ResizeObserver(entries => {
|
||||
for (const entry of entries) {
|
||||
const { width, height } = entry.contentRect
|
||||
if (width > 10 && height > 10) {
|
||||
this._initializeMindMap(el)
|
||||
this._clearObserver()
|
||||
break
|
||||
}
|
||||
}
|
||||
})
|
||||
this.resizeObserver.observe(el)
|
||||
}
|
||||
|
||||
_initializeMindMap(el) {
|
||||
if (this.mindMapAPP) return
|
||||
const filePath = this.file?.path
|
||||
let initLocationNodeId = ''
|
||||
const { fileToSubpathMap } = this.plugin
|
||||
if (fileToSubpathMap && fileToSubpathMap[filePath]) {
|
||||
initLocationNodeId = fileToSubpathMap[filePath]
|
||||
delete fileToSubpathMap[filePath]
|
||||
}
|
||||
this.mindMapAPP = initApp(el, {
|
||||
getInitMindMapData: () => {
|
||||
return this.parsedMindMapData.metadata.content
|
||||
},
|
||||
getInitLocationNodeId: () => {
|
||||
return initLocationNodeId
|
||||
},
|
||||
getMindMapCurrentData: (content, linkData, textData) => {
|
||||
this.parsedMindMapData.metadata.content = content
|
||||
const {
|
||||
metadata,
|
||||
svgdata,
|
||||
svgdataUpdateAt,
|
||||
linkdata
|
||||
} = this.parsedMindMapData
|
||||
this.mindMapData = assembleMarkdownText({
|
||||
metadata: {
|
||||
path: `${this.file?.path}`,
|
||||
tags: Array.from(new Set([SMM_TAG, ...metadata.tags])),
|
||||
content: LZString.compressToBase64(content),
|
||||
yaml: metadata.yaml
|
||||
},
|
||||
svgdata,
|
||||
svgdataUpdateAt,
|
||||
linkdata: linkData || linkdata || [],
|
||||
textdata: textData || []
|
||||
})
|
||||
},
|
||||
saveMindMapData: async (_, svgData) => {
|
||||
try {
|
||||
this._showSavingTip()
|
||||
const { embedImageIsSeparateFile } = this.plugin.settings
|
||||
if (svgData) {
|
||||
if (embedImageIsSeparateFile) {
|
||||
const res = await this._getFileSvgData(svgData)
|
||||
if (res) {
|
||||
this.parsedMindMapData.svgdata = `![[${res}]]`
|
||||
this.parsedMindMapData.svgdataUpdateAt = moment().format(
|
||||
'YYYY-MM-DD HH:mm:ss'
|
||||
)
|
||||
} else {
|
||||
new Notice(this.plugin._t('tip.imgCreateFail'))
|
||||
}
|
||||
} else {
|
||||
this.parsedMindMapData.svgdata = LZString.compressToBase64(
|
||||
svgData
|
||||
)
|
||||
}
|
||||
}
|
||||
this.forceSave()
|
||||
} catch (error) {}
|
||||
},
|
||||
getMindMapConfig: () => {
|
||||
return this.plugin.settings.mindMapConfig || {}
|
||||
},
|
||||
saveMindMapConfig: newConfig => {
|
||||
this.plugin.settings.mindMapConfig = newConfig
|
||||
this.plugin._saveSettings()
|
||||
},
|
||||
getMindMapLocalConfig: () => {
|
||||
const { mindMapLocalConfig, themeMode } = this.plugin.settings
|
||||
const config = mindMapLocalConfig || {}
|
||||
config.isDark =
|
||||
themeMode === 'follow'
|
||||
? this.plugin._getObIsDark()
|
||||
: themeMode === 'dark'
|
||||
return config
|
||||
},
|
||||
saveMindMapLocalConfig: newConfig => {
|
||||
this.plugin.settings.mindMapLocalConfig = newConfig
|
||||
this.plugin._saveSettings()
|
||||
},
|
||||
getSettings: () => {
|
||||
return this.plugin.settings || {}
|
||||
},
|
||||
updateSettings: data => {
|
||||
this.plugin.settings = {
|
||||
...this.plugin.settings,
|
||||
...data
|
||||
}
|
||||
this.plugin._saveSettings()
|
||||
},
|
||||
getObAllFiles: (extraSelf = true) => {
|
||||
const fileList = this.app.vault.getFiles()
|
||||
if (extraSelf && this.file) {
|
||||
return fileList.filter(item => {
|
||||
return item.path !== this.file.path
|
||||
})
|
||||
}
|
||||
return fileList
|
||||
},
|
||||
createLinkInfoFromFilePath: (filePath, subpath = '', alias = '') => {
|
||||
const file = this.tryGetFileByPath(filePath)
|
||||
if (!file) {
|
||||
return null
|
||||
}
|
||||
const linkText = this.app.fileManager.generateMarkdownLink(
|
||||
file,
|
||||
this.file?.path || '',
|
||||
subpath,
|
||||
alias
|
||||
)
|
||||
return {
|
||||
link: file.path,
|
||||
linkText
|
||||
}
|
||||
},
|
||||
openFile: (filePath, isNewTab = false, createOnNoExist = false) => {
|
||||
if (!filePath) return
|
||||
const arr = filePath.split(/(#|^|\|)/)
|
||||
filePath = arr[0]
|
||||
let postfix = ''
|
||||
if (arr.length > 1 && arr[1] !== '|') {
|
||||
postfix = arr.slice(1).join('')
|
||||
}
|
||||
const file = this.tryGetFileByPath(filePath)
|
||||
if (file && file instanceof TFile) {
|
||||
this.app.workspace.openLinkText(
|
||||
file.path + postfix,
|
||||
this.file?.path || '',
|
||||
isNewTab
|
||||
)
|
||||
} else if (createOnNoExist) {
|
||||
this.app.workspace.openLinkText(
|
||||
/\.md$/.test(filePath) ? filePath : filePath + '.md',
|
||||
this.file?.path || '',
|
||||
isNewTab
|
||||
)
|
||||
}
|
||||
},
|
||||
openWebLink: url => {
|
||||
if (this.app.openExternal) {
|
||||
this.app.openExternal(url)
|
||||
return
|
||||
}
|
||||
try {
|
||||
if (window.require) {
|
||||
const { shell } = window.require('electron')
|
||||
shell.openExternal(url)
|
||||
return
|
||||
}
|
||||
} catch (e) {}
|
||||
window.open(url, '_blank', 'noopener,noreferrer')
|
||||
},
|
||||
saveFileToVault: async (...args) => {
|
||||
const res = await this.saveFileToVault(...args)
|
||||
return res
|
||||
},
|
||||
getResourcePath: vaultPath => {
|
||||
return this.app.vault.adapter.getResourcePath(vaultPath)
|
||||
},
|
||||
getObInternalLink: (...args) => {
|
||||
return this.app.fileManager.generateMarkdownLink(this.file, '', ...args)
|
||||
},
|
||||
showTip: tip => {
|
||||
new Notice(tip)
|
||||
},
|
||||
getFileFromUri: uri => {
|
||||
const params = new URLSearchParams(uri.split('?')[1])
|
||||
const vault = decodeURIComponent(params.get('vault') || '')
|
||||
const filePath = decodeURIComponent(params.get('file') || '')
|
||||
if (!vault || !filePath) return null
|
||||
if (this.app.vault.getName() !== vault) {
|
||||
new Notice(this.plugin._t('tip.onlyEnableSelectCurrentVaultFile'))
|
||||
return null
|
||||
}
|
||||
return this.tryGetFileByPath(filePath)
|
||||
},
|
||||
isMobile: () => {
|
||||
return Platform.isMobile
|
||||
},
|
||||
getObsidianApp: () => {
|
||||
return this.app
|
||||
},
|
||||
getFormatFileName: (str, ignores = []) => {
|
||||
return formatFileName(str, {
|
||||
notename: this.file?.basename.split('.')[0],
|
||||
ignores
|
||||
})
|
||||
}
|
||||
})
|
||||
setTimeout(() => {
|
||||
this._listenMindMapEvent()
|
||||
}, 100)
|
||||
}
|
||||
|
||||
tryGetFileByPath(filePath) {
|
||||
let res = this.app.vault.getFileByPath(filePath)
|
||||
if (!res) {
|
||||
res = this.app.vault.getFileByPath(filePath + '.md')
|
||||
}
|
||||
if (!res) {
|
||||
res = this.app.metadataCache.getFirstLinkpathDest(
|
||||
filePath,
|
||||
this.file?.path
|
||||
)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
async _getFileSvgData(svgData) {
|
||||
const targetFileName = smmFilePathToFileName(this.file?.path, '.svg')
|
||||
const { embedImageIsSeparateFileFolder } = this.plugin.settings
|
||||
const originSvgData = this.parsedMindMapData.svgdata
|
||||
if (originSvgData && /^!\[\[/.test(originSvgData)) {
|
||||
const match = originSvgData.match(/!\[\[([^\]]+)\]\]/)
|
||||
if (match && match[1]) {
|
||||
const filePath = match[1]
|
||||
const fileName = filePath.split('/').pop()
|
||||
if (fileName !== targetFileName) {
|
||||
const exist = await this.app.vault.exists(filePath)
|
||||
if (exist) {
|
||||
await this.app.vault.adapter.remove(filePath)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
svgData = base64ToFile(svgData, targetFileName)
|
||||
const res = await this.saveFileToVault(
|
||||
svgData,
|
||||
true,
|
||||
embedImageIsSeparateFileFolder,
|
||||
true
|
||||
)
|
||||
return res
|
||||
}
|
||||
|
||||
async saveFileToVault(file, isImg = true, targetFolder = '', cover = false) {
|
||||
try {
|
||||
let folder = targetFolder || ''
|
||||
if (!folder) {
|
||||
folder = isImg
|
||||
? this._getFileSavePath('imagePathType', 'imagePath', 'imageSubPath')
|
||||
: this._getFileSavePath(
|
||||
'attachmentPathType',
|
||||
'attachmentPath',
|
||||
'attachmentSubPath'
|
||||
)
|
||||
}
|
||||
await this.plugin._ensureDirectoryExists(folder)
|
||||
let fileName = file.name
|
||||
let fileExist = false
|
||||
if (!cover) {
|
||||
let counter = 1
|
||||
while (
|
||||
this.app.vault.getFileByPath(
|
||||
folder ? `${folder}/${fileName}` : fileName
|
||||
)
|
||||
) {
|
||||
const parts = file.name.split('.')
|
||||
const ext = parts.pop()
|
||||
fileName = `${parts.join('.')}_${counter}.${ext}`
|
||||
counter++
|
||||
}
|
||||
} else {
|
||||
fileExist = await this.app.vault.adapter.exists(
|
||||
folder ? `${folder}/${fileName}` : fileName
|
||||
)
|
||||
}
|
||||
// 读取文件内容
|
||||
const arrayBuffer = await file.arrayBuffer()
|
||||
// 在vault中创建路径
|
||||
const vaultPath = folder ? `${folder}/${fileName}` : fileName
|
||||
// 写入文件
|
||||
if (fileExist) {
|
||||
await app.vault.adapter.writeBinary(vaultPath, arrayBuffer)
|
||||
} else {
|
||||
await this.app.vault.createBinary(vaultPath, arrayBuffer)
|
||||
}
|
||||
return vaultPath
|
||||
} catch (error) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
jumpToNodeByUid(uid) {
|
||||
if (!this.mindMapAPP) {
|
||||
return
|
||||
}
|
||||
this.mindMapAPP.$bus.$emit('jumpToNodeByUid', uid)
|
||||
}
|
||||
|
||||
async save(ignoreActiveCheck = false) {
|
||||
if (!ignoreActiveCheck && !this.isActive) {
|
||||
return
|
||||
}
|
||||
if (this.app.noSaveOnClose) return
|
||||
const t = Date.now()
|
||||
if (this.mindMapAPP) {
|
||||
this.mindMapAPP.$bus.$emit('getMindMapCurrentData')
|
||||
this.mindMapAPP.$bus.$emit('clearAutoSave')
|
||||
}
|
||||
if (!this.mindMapData) {
|
||||
return
|
||||
}
|
||||
await super.save()
|
||||
this._setIsUnSave(false)
|
||||
this._hideSavingTip()
|
||||
}
|
||||
|
||||
forceSave(ignoreActiveCheck = false) {
|
||||
this._showSavingTip()
|
||||
this.save(ignoreActiveCheck)
|
||||
}
|
||||
|
||||
forceSaveAndUpdateImage() {
|
||||
this._showSavingTip()
|
||||
this.mindMapAPP.$bus.$emit('saveToLocal', true, true)
|
||||
}
|
||||
|
||||
_listenMindMapEvent() {
|
||||
this._onDataChange = this._onDataChange.bind(this)
|
||||
this.mindMapAPP.$bus.$on('data_change', this._onDataChange)
|
||||
}
|
||||
|
||||
_onDataChange() {
|
||||
if (this.isNotTriggerDataChange) {
|
||||
this.isNotTriggerDataChange = false
|
||||
return
|
||||
}
|
||||
this._setIsUnSave(true)
|
||||
}
|
||||
|
||||
_handleResize() {
|
||||
if (!this.mindMapAPP || this.needResize) {
|
||||
return
|
||||
}
|
||||
if (this.isHidden) {
|
||||
this.needResize = true
|
||||
return
|
||||
}
|
||||
try {
|
||||
if (this.mindMapAPP.$updateMindMapSize) {
|
||||
const { width, height } = this.warpEl.getBoundingClientRect()
|
||||
if (width > 0 && height > 0) {
|
||||
this.mindMapAPP.$updateMindMapSize()
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
async _handleActiveChange(leaf) {
|
||||
const nowActive = leaf?.view === this
|
||||
if (nowActive && !this.isActive) {
|
||||
this._registerHotkeyOverrides()
|
||||
this.isActive = true
|
||||
if (this.mindMapAPP) {
|
||||
if (this.isHidden) {
|
||||
this.isHidden = false
|
||||
this._checkForExternalChanges()
|
||||
}
|
||||
// 更新尺寸
|
||||
if (this.needResize) {
|
||||
this.needResize = false
|
||||
this._handleResize()
|
||||
}
|
||||
if (this.isOuterChange) {
|
||||
this.isOuterChange = false
|
||||
}
|
||||
}
|
||||
} else if (!nowActive && this.isActive) {
|
||||
this._clearPopScope()
|
||||
const rect = this.warpEl.getBoundingClientRect()
|
||||
this.isHidden = rect.width === 0 || rect.height === 0
|
||||
if (this.mindMapAPP) {
|
||||
this.mindMapAPP.$bus.$emit('obTabDeactivate')
|
||||
this.save()
|
||||
this.mindMapAPP.$clearUpdateMindMapSize()
|
||||
}
|
||||
this.isActive = false
|
||||
}
|
||||
}
|
||||
|
||||
async _handleExternalChange(file) {
|
||||
if (this.isActive) return
|
||||
if (file.path === this.file?.path) {
|
||||
this.isOuterChange = true
|
||||
}
|
||||
}
|
||||
|
||||
async _checkForExternalChanges() {
|
||||
if (!this.file) return
|
||||
try {
|
||||
const data = await this.app.vault.read(this.file)
|
||||
await this.setViewData(data, false)
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
clear() {
|
||||
this._clearObserver()
|
||||
if (this.mindMapAPP) {
|
||||
try {
|
||||
this.mindMapAPP.$destroy()
|
||||
} catch (e) {}
|
||||
this.mindMapAPP = null
|
||||
}
|
||||
this.warpEl.empty()
|
||||
this.mindMapData = ''
|
||||
this.parsedMindMapData = null
|
||||
this.isUnSave = false
|
||||
this.isOuterChange = false
|
||||
this.isNotTriggerDataChange = false
|
||||
this.isHidden = false
|
||||
this.needResize = false
|
||||
this._resetOnOutlineEditMode()
|
||||
}
|
||||
|
||||
async onClose() {
|
||||
this._clearPopScope()
|
||||
this.modifyFileName.unload()
|
||||
await this.save()
|
||||
this.clear()
|
||||
this.saveButton = null
|
||||
this.exportButton = null
|
||||
this.importButton = null
|
||||
this.printOutlineButton = null
|
||||
this.changeToOutlineButton = null
|
||||
this.changeToMindmapButton = null
|
||||
this.toggleReadonlyButton = null
|
||||
}
|
||||
|
||||
_addActionBtns() {
|
||||
const viewActions = this.headerEl.querySelector('.view-actions')
|
||||
|
||||
this.toggleReadonlyButton = this._createActionBtn(
|
||||
this.plugin._t('action.changeToReadonly'),
|
||||
'book-open',
|
||||
viewActions,
|
||||
async () => {
|
||||
await this.save()
|
||||
if (this.isReadonlyMode) {
|
||||
this.isReadonlyMode = false
|
||||
this.mindMapAPP.$bus.$emit('toggleReadonly', false)
|
||||
setIcon(this.toggleReadonlyButton, 'book-open')
|
||||
this.toggleReadonlyButton.setAttribute(
|
||||
'aria-label',
|
||||
this.plugin._t('action.changeToReadonly')
|
||||
)
|
||||
this._showButtons([
|
||||
this.saveButton,
|
||||
this.importButton,
|
||||
this.exportButton
|
||||
])
|
||||
} else {
|
||||
this.isReadonlyMode = true
|
||||
this.mindMapAPP.$bus.$emit('toggleReadonly', true)
|
||||
setIcon(this.toggleReadonlyButton, 'edit-3')
|
||||
this.toggleReadonlyButton.setAttribute(
|
||||
'aria-label',
|
||||
this.plugin._t('action.changeToEdit')
|
||||
)
|
||||
this._hideButtons([
|
||||
this.saveButton,
|
||||
this.importButton,
|
||||
this.exportButton
|
||||
])
|
||||
}
|
||||
},
|
||||
true
|
||||
)
|
||||
|
||||
this.changeToOutlineButton = this._createActionBtn(
|
||||
this.plugin._t('action.changeToOutline'),
|
||||
OUTLINE_ICON,
|
||||
viewActions,
|
||||
async () => {
|
||||
await this.save()
|
||||
this._hideButtons([this.exportButton, this.changeToOutlineButton])
|
||||
this._showButtons([this.printOutlineButton, this.changeToMindmapButton])
|
||||
// 保存按钮文案修改
|
||||
this.saveButton.setAttribute('aria-label', '保存')
|
||||
this.mindMapAPP.$bus.$emit('showOutlineEdit')
|
||||
this.isOutlineEditMode = true
|
||||
}
|
||||
)
|
||||
|
||||
this.changeToMindmapButton = this._createActionBtn(
|
||||
this.plugin._t('action.changeToMindMap'),
|
||||
MINDMAP_ICON,
|
||||
viewActions,
|
||||
async () => {
|
||||
await this.save()
|
||||
this.mindMapAPP.$bus.$emit('hideOutlineEdit')
|
||||
this._resetOnOutlineEditMode()
|
||||
}
|
||||
)
|
||||
this._hideButtons([this.changeToMindmapButton])
|
||||
|
||||
this.printOutlineButton = this._createActionBtn(
|
||||
this.plugin._t('action.printOutline'),
|
||||
PRINT_ICON,
|
||||
viewActions,
|
||||
async () => {
|
||||
this.mindMapAPP.$bus.$emit('printOutline')
|
||||
}
|
||||
)
|
||||
this._hideButtons([this.printOutlineButton])
|
||||
|
||||
this.importButton = this._createActionBtn(
|
||||
this.plugin._t('action.import'),
|
||||
IMPORT_ICON,
|
||||
viewActions,
|
||||
() => {
|
||||
this.mindMapAPP.$bus.$emit('showImport')
|
||||
}
|
||||
)
|
||||
|
||||
if (!Platform.isMobile) {
|
||||
this.exportButton = this._createActionBtn(
|
||||
this.plugin._t('action.export'),
|
||||
EXPORT_ICON,
|
||||
viewActions,
|
||||
() => {
|
||||
this.mindMapAPP.$bus.$emit('showExport')
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// 保存并更新图像数据
|
||||
this.saveButton = this._createActionBtn(
|
||||
this.plugin._t('action.saveAndUpdateImage'),
|
||||
SAVE_ICON,
|
||||
viewActions,
|
||||
() => {
|
||||
this.forceSaveAndUpdateImage()
|
||||
}
|
||||
)
|
||||
this.saveButton.classList.add('smm-save-button-default')
|
||||
|
||||
this.savingTipEl = this.headerEl.createEl('div', {
|
||||
cls: 'smm-save-tip'
|
||||
})
|
||||
viewActions.insertBefore(this.savingTipEl, viewActions.firstChild)
|
||||
}
|
||||
|
||||
_showSavingTip() {
|
||||
if (!this.savingTipEl) return
|
||||
this.savingTipEl.innerText = this.plugin._t('tip.saving')
|
||||
}
|
||||
|
||||
_hideSavingTip() {
|
||||
if (!this.savingTipEl) return
|
||||
this.savingTipEl.innerText = ''
|
||||
}
|
||||
|
||||
_createActionBtn(label, icon, parentEl, onClick, isObIcon = false) {
|
||||
const el = this.headerEl.createEl('button', {
|
||||
cls: 'clickable-icon'
|
||||
})
|
||||
el.setAttribute('aria-label', label)
|
||||
if (isObIcon) {
|
||||
setIcon(el, icon, 24)
|
||||
} else {
|
||||
el.innerHTML = icon
|
||||
}
|
||||
parentEl.insertBefore(el, parentEl.firstChild)
|
||||
el.addEventListener('click', onClick)
|
||||
return el
|
||||
}
|
||||
|
||||
_resetOnOutlineEditMode() {
|
||||
if (this.isOutlineEditMode) {
|
||||
this.saveButton.setAttribute(
|
||||
'aria-label',
|
||||
this.plugin._t('action.saveAndUpdateImage')
|
||||
)
|
||||
this._showButtons([this.exportButton, this.changeToOutlineButton])
|
||||
this._hideButtons([this.changeToMindmapButton, this.printOutlineButton])
|
||||
this.isOutlineEditMode = false
|
||||
}
|
||||
}
|
||||
|
||||
_showButtons(list) {
|
||||
list.forEach(el => {
|
||||
if (!el) return
|
||||
el.classList.remove('smm-common-hide')
|
||||
el.classList.add('smm-common-flex')
|
||||
})
|
||||
}
|
||||
|
||||
_hideButtons(list) {
|
||||
list.forEach(el => {
|
||||
if (!el) return
|
||||
el.classList.remove('smm-common-flex')
|
||||
el.classList.add('smm-common-hide')
|
||||
})
|
||||
}
|
||||
|
||||
_setIsUnSave(isUnSave) {
|
||||
this.isUnSave = isUnSave
|
||||
if (isUnSave) {
|
||||
this.saveButton.classList.remove('smm-save-button-default')
|
||||
this.saveButton.classList.add('smm-save-button-un-save')
|
||||
} else {
|
||||
this.saveButton.classList.remove('smm-save-button-un-save')
|
||||
this.saveButton.classList.add('smm-save-button-default')
|
||||
}
|
||||
}
|
||||
|
||||
_initThemeMode() {
|
||||
this._updateThemeMode()
|
||||
|
||||
this.registerEvent(
|
||||
this.app.workspace.on('css-change', () => {
|
||||
this._updateThemeMode()
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
_updateThemeMode() {
|
||||
if (this.plugin.settings.themeMode === 'follow') {
|
||||
const isDarkMode = this.plugin._getObIsDark()
|
||||
if (this.mindMapAPP) {
|
||||
this.mindMapAPP.$bus.$emit('setIsDark', isDarkMode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_getFileSavePath(typeKey, pathKey, subPathKey) {
|
||||
const type = this.plugin.settings[typeKey]
|
||||
const folder = this.plugin.settings[pathKey] || ''
|
||||
const subFolder = this.plugin.settings[subPathKey] || ''
|
||||
switch (type) {
|
||||
case 'root':
|
||||
return ''
|
||||
case 'custom':
|
||||
return folder
|
||||
case 'currentFileFolder':
|
||||
return this.plugin._getActiveFileDirectory()
|
||||
case 'currentFileFolderSubFolder':
|
||||
const activeFileDirectory = this.plugin._getActiveFileDirectory()
|
||||
return [activeFileDirectory, subFolder].filter(Boolean).join('/')
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
_clearPopScope() {
|
||||
if (this.popScope) {
|
||||
this.popScope()
|
||||
this.popScope = null
|
||||
}
|
||||
}
|
||||
|
||||
_registerHotkeyOverrides() {
|
||||
this._clearPopScope()
|
||||
const scope = this.app.keymap.getRootScope()
|
||||
const ctrlFHandler = scope.register(['Mod'], 'f', evt => {
|
||||
evt.preventDefault()
|
||||
return true
|
||||
})
|
||||
const ctrlSHandler = scope.register(['Mod'], 's', evt => {
|
||||
evt.preventDefault()
|
||||
const view = this.plugin._getActiveSmmView()
|
||||
if (view) {
|
||||
view.forceSave()
|
||||
}
|
||||
return true
|
||||
})
|
||||
scope.keys.unshift(scope.keys.pop())
|
||||
scope.keys.unshift(scope.keys.pop())
|
||||
this.popScope = () => {
|
||||
scope.unregister(ctrlFHandler)
|
||||
scope.unregister(ctrlSHandler)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default SmmEditView
|
||||
186
src/locales/en.json
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
{
|
||||
"common": {
|
||||
"mindMap": "Mind map",
|
||||
"rootNodeDefaultText": "Root node",
|
||||
"secondNodeDefaultText": "Secondary node",
|
||||
"branchNodeDefaultText": "Branch topic"
|
||||
},
|
||||
"action": {
|
||||
"createMindMap": "Create new mind map",
|
||||
"createMindMapInsertToMd": "Create new mind map and insert into current document",
|
||||
"openAsMd": "Open as markdown document",
|
||||
"openAsMindMap": "Open as mind map document",
|
||||
"changeToOutline": "Switch to outline mode",
|
||||
"changeToMindMap": "Switch to mind map mode",
|
||||
"printOutline": "Print outline",
|
||||
"import": "Import",
|
||||
"export": "Export",
|
||||
"insertCodeBlockToMd": "Insert mind map code block into current document",
|
||||
"previewAsMindMap": "Preview as mind map",
|
||||
"changeToReadonly": "Change to readonly mode",
|
||||
"changeToEdit": "Change to edit mode",
|
||||
"changeToMdFile": "Convert to markdown document",
|
||||
"changeToMindMapFile": "Convert to mind map document"
|
||||
},
|
||||
"tip": {
|
||||
"tip": "Tip",
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
"close": "Close",
|
||||
"fileExist": "File already exists",
|
||||
"createMindMapFail": "Failed to create mind map",
|
||||
"fileIsNotMd": "Current file is not a markdown document",
|
||||
"fileIsEmpty": "File content is empty",
|
||||
"fileFormatError": "File format error",
|
||||
"onlyEnableSelectCurrentVaultFile": "Only files from the current vault can be added",
|
||||
"saving": "Saving...",
|
||||
"integerInputError": "Please enter a number greater than 0",
|
||||
"noPreviewImage": "No preview image available",
|
||||
"insertFail": "Insertion failed",
|
||||
"noMatchResult": "No matching results",
|
||||
"fileDeleted": "File has been deleted",
|
||||
"noPreviewImageInFile": "No preview image in file",
|
||||
"pluginNewVersion": "A new version of the plugin is available:",
|
||||
"pluginNoNewVersion": "The current version is already the latest version",
|
||||
"pluginVersionCheckError": "Check failed",
|
||||
"changeSuccess": "Change completed",
|
||||
"mdToMindMapFail": "Conversion failed, unable to parse data that can be converted into a mind map",
|
||||
"imgCreateFail": "Image file creation failed",
|
||||
"mdModifyTip": "Do not modify any information except YAML",
|
||||
"fileNameEmpty": "The file name cannot be empty",
|
||||
"fileNameIllegal": "The file name contains illegal characters",
|
||||
"fileRenameFail": "File renaming failed",
|
||||
"mindMapToMdTip": "After converting to a Markdown document, only some content will be retained, such as node text, summary text, notes, etc. Other content will be discarded and cannot be recovered. Please make a backup first.",
|
||||
"mdToMindMapTip": "Only supports converting syntax such as titles and lists into mind maps. Other content will be discarded and cannot be recovered. Please make a backup first."
|
||||
},
|
||||
"setting": {
|
||||
"title": {
|
||||
"title1": "Basic",
|
||||
"title2": "File",
|
||||
"title3": "Image compression",
|
||||
"title4": "Embed",
|
||||
"title5": "Other",
|
||||
"title6": "Image hosting"
|
||||
},
|
||||
"themeMode": {
|
||||
"title": "Theme mode",
|
||||
"desc": "Dark and light color modes",
|
||||
"option1": "Follow Obsidian",
|
||||
"option2": "Light mode",
|
||||
"option3": "Dark mode"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Default theme (light color)",
|
||||
"desc": "Default theme for creating a mind map file in light color mode",
|
||||
"title2": "Default theme (dark color)",
|
||||
"desc2": "Default theme for creating a mind map file in dark mode"
|
||||
},
|
||||
"layout": {
|
||||
"title": "Default layout",
|
||||
"desc": "The default structure when creating a new mind map file"
|
||||
},
|
||||
"folder": {
|
||||
"title4": "Mind map file storage location",
|
||||
"desc4": "Storage location for newly created SimpleMindMap files",
|
||||
"title1": "Custom file storage directory",
|
||||
"desc1": "Custom file storage directory, relative to vault root directory",
|
||||
"title5": "Image storage location",
|
||||
"desc5": "Storage location for uploaded image files (node images, background images)",
|
||||
"title2": "Custom image storage directory",
|
||||
"desc2": "Custom image storage directory, relative to vault root directory",
|
||||
"title6": "Custom subfolder",
|
||||
"desc6": "Custom subfolder, relative to current file's folder",
|
||||
"title7": "File storage location",
|
||||
"desc7": "Storage directory for local files selected in node hyperlinks",
|
||||
"title3": "Custom file storage directory",
|
||||
"desc3": "Custom file storage directory, relative to vault root directory",
|
||||
"option1": "Vault root directory",
|
||||
"option2": "Specified folder",
|
||||
"option3": "Current file's folder",
|
||||
"option4": "Specified subfolder under current file's folder",
|
||||
"title8": "Support ob search",
|
||||
"desc8": "Mind map data is stored after encoding and compression, so it cannot be searched in OB. If you want to search for the node text content of the mind map in OB, you can turn on this option. After turning it on, the text content of all nodes will be saved in the file for search. The side effect is that it will cause the file size to increase, which may affect the speed of file opening and saving",
|
||||
"title9": "Store canvas position and scaling data",
|
||||
"desc9": "After opening, the canvas position and zoom data will be saved in the file, so that the next time it is opened, it can be restored to the position and zoom state when it was closed last time. The disadvantage is that moving and scaling the canvas will cause file changes",
|
||||
"title10": "The maximum level for converting node text to Markdown titles",
|
||||
"desc10": "Nodes with text less than or equal to this level will be converted to Markdown titles, while the rest will be converted to unordered lists"
|
||||
},
|
||||
"compress": {
|
||||
"title1": "Compress images",
|
||||
"desc1": "Whether to compress uploaded node images (locally selected images)",
|
||||
"title2": "Maximum compression width",
|
||||
"desc2": "Set the maximum width after image compression",
|
||||
"title3": "Maximum compression height",
|
||||
"desc3": "Set the maximum height after image compression",
|
||||
"title4": "Image quality",
|
||||
"desc4": "The quality of compressed images is only valid for certain image formats, such as jpg",
|
||||
"curValue": "Current value",
|
||||
"reset": "Reset to default"
|
||||
},
|
||||
"autoSave": {
|
||||
"title": "Auto-save interval",
|
||||
"desc": "Inactivity time before auto-save (seconds)"
|
||||
},
|
||||
"codeBlock": {
|
||||
"title": "Code block initial height",
|
||||
"desc": "Initial height when embedding via smm code block (pixels)",
|
||||
"title2": "Code block background transparent",
|
||||
"desc2": "Whether the background of the embedded smm code block is transparent, otherwise it will follow the selected mind map theme background color"
|
||||
},
|
||||
"linkInfo": {
|
||||
"issues": "Bugs and feature requests",
|
||||
"desktop": "Download independent client",
|
||||
"community": "Community"
|
||||
},
|
||||
"embed": {
|
||||
"title1": "Embed preview double click to open a new tab",
|
||||
"desc1": "When embedding an MD document in format ![[]], double-click to preview the image and open the file in a new tab",
|
||||
"title2": "Embed preview background transparent",
|
||||
"desc2": "Is the background of the preview image embedded in the format of ![[]] transparent",
|
||||
"title3": "Is the embedded image stored as a separate file",
|
||||
"desc3": "By default, images used for embedding preview in ![[]] format will be stored separately in the repository as SVG files. This way, only the file path is stored in the mind map file, which can significantly reduce the file size and speed up file reading and saving. If closed, the image data will be stored in the mind map file, and the volume will significantly increase",
|
||||
"title4": "Embedded image file storage directory",
|
||||
"desc4": "The folder where the embedded preview image files are stored should not be empty relative to the repository root directory, and the directory should start with . as the hidden folder",
|
||||
"title5": "New tab opens node link",
|
||||
"desc5": "Does clicking on the inserted node link (excluding network links) open in a new tab. After closing, you can also open a new tab by pressing Ctrl+left mouse button"
|
||||
},
|
||||
"file": {
|
||||
"title1": "File name format for creating a new mind map",
|
||||
"desc1": "Naming format for creating a new mind map file name. Support variables other than notename",
|
||||
"title3": "Naming format for pasting images",
|
||||
"desc3": "Naming format for images pasted on nodes",
|
||||
"filenameFormatDesc": "File name format description"
|
||||
},
|
||||
"font": {
|
||||
"title": "Font",
|
||||
"desc": "Extended font list for mind maps",
|
||||
"btn": "Manage",
|
||||
"placeholder": "Search font. You can also press Enter to add input fonts directly",
|
||||
"empty": "No font",
|
||||
"noMatch": "No matching font",
|
||||
"noFont": "No available font"
|
||||
},
|
||||
"button": {
|
||||
"select": "Select"
|
||||
},
|
||||
"other": {
|
||||
"title1": "Check for new versions",
|
||||
"desc1": "After activation, it will check if a new version is available when the plugin starts. If your network cannot access Github, it is recommended to disable this option"
|
||||
},
|
||||
"imageHosting": {
|
||||
"title1": "Open the picture bed",
|
||||
"desc1": "After activation, all images will be uploaded to the image bed",
|
||||
"tip1": "Please first improve the configuration information of the drawing bed",
|
||||
"title2": "Picture bed URL",
|
||||
"desc2": "Fill in the corresponding upload interface address based on the graphic tool you are using",
|
||||
"title3": "Form field",
|
||||
"desc3": "Name of the form field when uploading images",
|
||||
"title4": "Response structure",
|
||||
"desc4": "Response structure when uploading images. Please refer to the detailed description for more information:",
|
||||
"desc5": "Image bed function description"
|
||||
}
|
||||
},
|
||||
"html": {
|
||||
"filenameFormatDesc": "<p>In addition to fixed names, variables can also be used, enclosed in {}. Available variables are as follows:</p><p>1.{notename}: The current file name without extension;</p><p>2.{date}: Current date in YYYY-MM-DD format;</p><p>3.{time}: Current time in HH:mm:ss format;</p><p>4.{datatime}: Current date and time in YYYY-MM-DD HH:mm:ss format;</p><p>5.{date:Format}: Specify date/time format, e.g.: MM-DD HH:mm, reference: <a href='https://day.js.org/docs/en/parse/string-format'>Format specification</a>;</p><p>6.{random}: Random string with 6-character length;</p>"
|
||||
}
|
||||
}
|
||||
186
src/locales/vi.json
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
{
|
||||
"common": {
|
||||
"mindMap": "Sơ đồ tư duy",
|
||||
"rootNodeDefaultText": "Nút gốc",
|
||||
"secondNodeDefaultText": "Nút cấp hai",
|
||||
"branchNodeDefaultText": "Chủ đề nhánh"
|
||||
},
|
||||
"action": {
|
||||
"createMindMap": "Tạo sơ đồ tư duy mới",
|
||||
"createMindMapInsertToMd": "Tạo sơ đồ tư duy mới và chèn vào tài liệu hiện tại",
|
||||
"openAsMd": "Mở dưới dạng tài liệu Markdown",
|
||||
"openAsMindMap": "Mở dưới dạng tài liệu sơ đồ tư duy",
|
||||
"changeToOutline": "Chuyển sang chế độ dàn bài",
|
||||
"changeToMindMap": "Chuyển sang chế độ sơ đồ tư duy",
|
||||
"printOutline": "In dàn bài",
|
||||
"import": "Nhập vào",
|
||||
"export": "Xuất ra",
|
||||
"insertCodeBlockToMd": "Chèn khối mã sơ đồ tư duy vào tài liệu hiện tại",
|
||||
"previewAsMindMap": "Xem trước dưới dạng sơ đồ tư duy",
|
||||
"changeToReadonly": "Chuyển sang chế độ xem",
|
||||
"changeToEdit": "Chuyển sang chế độ chỉnh sửa",
|
||||
"changeToMdFile": "Chuyển đổi sang tài liệu Markdown",
|
||||
"changeToMindMapFile": "Chuyển đổi sang tài liệu bản đồ tư duy"
|
||||
},
|
||||
"tip": {
|
||||
"tip": "Mẹo",
|
||||
"confirm": "Xác nhận",
|
||||
"cancel": "Hủy bỏ",
|
||||
"close": "Đóng cửa",
|
||||
"fileExist": "Tệp đã tồn tại",
|
||||
"createMindMapFail": "Tạo sơ đồ tư duy thất bại",
|
||||
"fileIsNotMd": "Tệp hiện tại không phải tệp markdown",
|
||||
"fileIsEmpty": "Nội dung tệp trống",
|
||||
"fileFormatError": "Lỗi định dạng tệp",
|
||||
"onlyEnableSelectCurrentVaultFile": "Chỉ cho phép thêm tệp từ kho hiện tại",
|
||||
"saving": "Đang lưu...",
|
||||
"integerInputError": "Vui lòng nhập số lớn hơn 0",
|
||||
"noPreviewImage": "Không có hình ảnh xem trước",
|
||||
"insertFail": "Chèn thất bại",
|
||||
"noMatchResult": "Không có kết quả phù hợp",
|
||||
"fileDeleted": "Tệp đã bị xóa",
|
||||
"noPreviewImageInFile": "Không có hình ảnh xem trước trong tệp",
|
||||
"pluginNewVersion": "Plugin có phiên bản mới:",
|
||||
"pluginNoNewVersion": "Hiện tại là phiên bản mới nhất",
|
||||
"pluginVersionCheckError": "Kiểm tra thất bại",
|
||||
"changeSuccess": "Hoàn thành chuyển đổi",
|
||||
"mdToMindMapFail": "Chuyển đổi thất bại, không có dữ liệu được phân tích để có thể được chuyển đổi thành Bản đồ tư duy",
|
||||
"imgCreateFail": "Lỗi tạo tập tin ảnh",
|
||||
"mdModifyTip": "Không thay đổi bất kỳ thông tin nào khác ngoài YAML",
|
||||
"fileNameEmpty": "Tên tập tin không được để trống",
|
||||
"fileNameIllegal": "Tên tập tin chứa ký tự không hợp lệ",
|
||||
"fileRenameFail": "Lỗi đổi tên tập tin",
|
||||
"mindMapToMdTip": "Sau khi chuyển đổi sang tài liệu Markdown, chỉ một số nội dung sẽ được giữ lại, chẳng hạn như văn bản nút, văn bản tóm tắt, ghi chú, v.v., những nội dung khác sẽ bị loại bỏ và không thể khôi phục, hãy sao lưu trước.",
|
||||
"mdToMindMapTip": "Chỉ hỗ trợ chuyển đổi tiêu đề, danh sách và cú pháp khác thành bản đồ tư duy, các nội dung khác sẽ bị loại bỏ và không thể phục hồi, hãy sao lưu trước."
|
||||
},
|
||||
"setting": {
|
||||
"title": {
|
||||
"title1": "Cơ bản",
|
||||
"title2": "Tệp",
|
||||
"title3": "Nén hình ảnh",
|
||||
"title4": "Hình ảnh",
|
||||
"title5": "Khác",
|
||||
"title6": "Hình ảnh hosting"
|
||||
},
|
||||
"themeMode": {
|
||||
"title": "Chế độ chủ đề",
|
||||
"desc": "Chế độ tối, ánh sáng",
|
||||
"option1": "Theo Obsidian",
|
||||
"option2": "Chế độ sáng",
|
||||
"option3": "Chế độ tối"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Sắc thái mặc định (màu sáng)",
|
||||
"desc": "sắc thái mặc định khi tạo tập tin bản đồ tư duy mới trong chế độ sáng",
|
||||
"title2": "sắc thái mặc định (đối)",
|
||||
"desc2": "sắc thái mặc định khi tạo tập tin bản đồ tư duy mới trong chế độ tối"
|
||||
},
|
||||
"layout": {
|
||||
"title": "Cấu trúc mặc định",
|
||||
"desc": "Cấu trúc mặc định khi tạo tệp sơ đồ tư duy mới"
|
||||
},
|
||||
"folder": {
|
||||
"title4": "Vị trí lưu trữ tệp sơ đồ tư duy",
|
||||
"desc4": "Vị trí lưu trữ tệp SimpleMindMap mới tạo",
|
||||
"title1": "Thư mục lưu trữ tệp tùy chỉnh",
|
||||
"desc1": "Thư mục lưu trữ tệp tùy chỉnh, tương đối với thư mục gốc kho lưu trữ",
|
||||
"title5": "Vị trí lưu trữ hình ảnh",
|
||||
"desc5": "Vị trí lưu trữ tệp hình ảnh đã tải lên (hình ảnh nút, hình nền)",
|
||||
"title2": "Thư mục lưu trữ hình ảnh tùy chỉnh",
|
||||
"desc2": "Thư mục lưu trữ hình ảnh tùy chỉnh, tương đối với thư mục gốc kho lưu trữ",
|
||||
"title6": "Thư mục con tùy chỉnh",
|
||||
"desc6": "Thư mục con tùy chỉnh, tương đối với thư mục chứa tệp hiện tại",
|
||||
"title7": "Vị trí lưu trữ tệp",
|
||||
"desc7": "Thư mục lưu trữ tệp cục bộ được chọn trong siêu liên kết nút",
|
||||
"title3": "Thư mục lưu trữ tệp tùy chỉnh",
|
||||
"desc3": "Thư mục lưu trữ tệp tùy chỉnh, tương đối với thư mục gốc kho lưu trữ",
|
||||
"option1": "Thư mục gốc của kho lưu trữ",
|
||||
"option2": "Thư mục chỉ định",
|
||||
"option3": "Thư mục chứa tệp hiện tại",
|
||||
"option4": "Thư mục con được chỉ định trong thư mục chứa tệp hiện tại",
|
||||
"title8": "Hỗ trợ tìm kiếm OB",
|
||||
"desc8": "Tư duy bản đồ dữ liệu là mã hóa nén sau khi lưu trữ, vì vậy không thể tìm kiếm trong ob, nếu bạn muốn trong ob có thể tìm kiếm nội dung văn bản nút của bản đồ tư duy, bạn có thể mở tùy chọn này, sau khi mở sẽ lưu thêm tất cả các nút trong các tập tin nội dung văn bản để tìm kiếm, mang lại tác dụng phụ sẽ dẫn đến khối lượng tập tin lớn hơn, có thể ảnh hưởng đến tốc độ mở và lưu tập tin",
|
||||
"title9": "Lưu trữ vị trí canvas và dữ liệu thu phóng",
|
||||
"desc9": "Vị trí khung và dữ liệu thu phóng được lưu trong tệp sau khi mở để bạn có thể khôi phục lại vị trí và trạng thái thu phóng của lần đóng cuối cùng khi mở tiếp theo. Nhược điểm là chỉ cần di chuyển và phóng to canvas sẽ làm thay đổi tập tin.",
|
||||
"title10": "Mức tối đa của văn bản nút đến tiêu đề Markdown",
|
||||
"desc10": "Văn bản nút nhỏ hơn hoặc bằng cấp này được chuyển thành tiêu đề Markdown và phần còn lại được chuyển thành danh sách không có thứ tự."
|
||||
},
|
||||
"compress": {
|
||||
"title1": "Có nén ảnh không",
|
||||
"desc1": "Nén ảnh nút đã tải lên (ảnh được chọn cục bộ)",
|
||||
"title2": "Chiều rộng tối đa khi nén",
|
||||
"desc2": "Thiết lập chiều rộng tối đa sau khi nén ảnh",
|
||||
"title3": "Chiều cao tối đa khi nén",
|
||||
"desc3": "Thiết lập chiều cao tối đa sau khi nén ảnh",
|
||||
"title4": "Chất lượng ảnh",
|
||||
"desc4": "Chất lượng sau khi nén hình ảnh, chỉ có hiệu quả đối với một số định dạng hình ảnh, ví dụ như: jpg",
|
||||
"curValue": "Giá trị hiện tại",
|
||||
"reset": "Đặt lại về mặc định"
|
||||
},
|
||||
"autoSave": {
|
||||
"title": "Thời gian tự động lưu",
|
||||
"desc": "Thời gian tự động lưu khi không có thao tác, đơn vị: giây"
|
||||
},
|
||||
"codeBlock": {
|
||||
"title": "Chiều cao ban đầu của khối mã nhúng",
|
||||
"desc": "Chiều cao ban đầu khi nhúng bằng khối mã smm, đơn vị: px",
|
||||
"title2": "Nền nhúng khối mã có trong suốt hay không",
|
||||
"desc2": "Nền có trong suốt khi nhúng khối mã smm hay không, nếu không nó sẽ theo màu nền của chủ đề bản đồ tư duy đã chọn"
|
||||
},
|
||||
"linkInfo": {
|
||||
"issues": "Gửi bug hoặc gợi ý",
|
||||
"desktop": "Nhận khách hàng độc lập",
|
||||
"community": "Hội đồng"
|
||||
},
|
||||
"embed": {
|
||||
"title1": "Nhúng xem thử Nhấp đúp vào cửa sổ mới để mở",
|
||||
"desc1": "![[]] Định dạng Nhấp đúp vào ô xem thử ảnh khi nhúng tài liệu md có cửa sổ mới Mở tập tin không",
|
||||
"title2": "Hình nền nhúng xem thử có trong suốt không",
|
||||
"desc2": "![[]] Định dạng Nền ảnh được nhúng trong ô xem thử có trong suốt không",
|
||||
"title3": "Cho dù hình ảnh nhúng được lưu trữ dưới dạng tệp riêng biệt",
|
||||
"desc3": "Hình ảnh được sử dụng mặc định để nhúng xem trước ở định dạng ![[]] được lưu trữ riêng biệt trong kho dưới dạng tệp svg để chỉ đường dẫn tệp được lưu trữ trong tệp Bản đồ Tư duy có thể làm giảm đáng kể khối lượng tệp và tăng tốc độ đọc và lưu tệp. Nếu tắt, dữ liệu hình ảnh sẽ được lưu trữ trong tệp Bản đồ Tư duy và khối lượng sẽ tăng lên đáng kể.",
|
||||
"title4": "Nhúng thư mục lưu trữ tập tin ảnh",
|
||||
"desc4": "Nhúng xem trước hình ảnh tập tin lưu trữ thư mục, liên quan đến thư mục gốc kho, không nên để trống và thư mục bắt đầu bằng . như một thư mục ẩn",
|
||||
"title5": "Trang nhãn mới Mở liên kết nút",
|
||||
"desc5": "Nhấp vào liên kết nút được chèn (không chứa liên kết mạng) để mở trên trang tab mới. Bạn cũng có thể mở tab mới bằng Ctrl+chuột trái sau khi đóng"
|
||||
},
|
||||
"file": {
|
||||
"title1": "Định dạng tên tập tin cho bản đồ tư duy mới",
|
||||
"desc1": "Dạng thức đặt tên cho tên tệp bản đồ tư duy mới. Hỗ trợ các biến khác ngoài notename",
|
||||
"title3": "Định dạng có tên cho ảnh dán",
|
||||
"desc3": "Định dạng có tên của ảnh được dán trên nút",
|
||||
"filenameFormatDesc": "Mô tả định dạng tên tập tin"
|
||||
},
|
||||
"font": {
|
||||
"title": "Phông chữ",
|
||||
"desc": "Phông chữ mặc định khi tạo bản đồ tư duy mới",
|
||||
"btn": "Quản lý",
|
||||
"placeholder": "Tìm kiếm phông chữ. Bạn cũng có thể nhấn Enter để thêm các phông chữ nhập trực tiếp",
|
||||
"empty": "Không có phông chữ",
|
||||
"noMatch": "Không tìm thấy phông chữ",
|
||||
"noFont": "Không có phông chữ"
|
||||
},
|
||||
"button": {
|
||||
"select": "Chọn"
|
||||
},
|
||||
"other": {
|
||||
"title1": "Kiểm tra phiên bản mới",
|
||||
"desc1": "Khi plugin khởi động, bạn sẽ kiểm tra xem có phiên bản mới không và nếu mạng của bạn không truy cập được Github, bạn nên tắt tùy chọn này."
|
||||
},
|
||||
"imageHosting": {
|
||||
"title1": "Mở giường",
|
||||
"desc1": "Sau khi mở, tất cả hình ảnh sẽ được tải lên giường.",
|
||||
"tip1": "Vui lòng hoàn thiện thông tin cấu hình giường",
|
||||
"title2": "Giường Url",
|
||||
"desc2": "Điền địa chỉ giao diện tải lên tương ứng với công cụ giường chiếu mà bạn sử dụng",
|
||||
"title3": "Trường mẫu",
|
||||
"desc3": "Tên trường trong biểu mẫu khi tải lên hình ảnh",
|
||||
"title4": "Cấu trúc phản hồi",
|
||||
"desc4": "Cấu trúc phản hồi khi tải lên hình ảnh. Hãy tham khảo thêm tại:",
|
||||
"desc5": "Hướng dẫn sử dụng giường"
|
||||
}
|
||||
},
|
||||
"html": {
|
||||
"filenameFormatDesc": "<p>Ngoài các tên cố định, bạn cũng có thể sử dụng các biến, được đặt trong dấu ngoặc nhọn {}, các biến khả dụng như sau:</p><p>1.{notename}: Tên tệp hiện tại, không bao gồm phần mở rộng;</p><p>2.{date}: Ngày hiện tại, định dạng YYYY-MM-DD;</p><p>3.{time}: Thời gian hiện tại, định dạng HH:mm:ss;</p><p>4.{datatime}: Ngày giờ hiện tại, định dạng: YYYY-MM-DD HH:mm:ss;</p><p>5.{date:Format}: Chỉ định định dạng ngày giờ, ví dụ: MM-DD HH:mm, tham khảo thêm tại: <a href='https://day.js.org/docs/en/parse/string-format'>hướng dẫn định dạng</a>;</p><p>6.{random}: Chuỗi ngẫu nhiên, độ dài 6 ký tự;</p>"
|
||||
}
|
||||
}
|
||||
186
src/locales/zh.json
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
{
|
||||
"common": {
|
||||
"mindMap": "思维导图",
|
||||
"rootNodeDefaultText": "根节点",
|
||||
"secondNodeDefaultText": "二级节点",
|
||||
"branchNodeDefaultText": "分支主题"
|
||||
},
|
||||
"action": {
|
||||
"createMindMap": "新建思维导图",
|
||||
"createMindMapInsertToMd": "新建思维导图并插入当前文档",
|
||||
"openAsMd": "打开为Markdown文档",
|
||||
"openAsMindMap": "打开为思维导图文档",
|
||||
"changeToOutline": "切换为大纲模式",
|
||||
"changeToMindMap": "切换为思维导图模式",
|
||||
"printOutline": "打印大纲",
|
||||
"import": "导入",
|
||||
"export": "导出",
|
||||
"insertCodeBlockToMd": "插入思维导图代码块到当前文档",
|
||||
"previewAsMindMap": "预览为思维导图",
|
||||
"changeToReadonly": "切换为只读模式",
|
||||
"changeToEdit": "切换为编辑模式",
|
||||
"changeToMdFile": "转换为Markdown文档",
|
||||
"changeToMindMapFile": "转换为思维导图文档"
|
||||
},
|
||||
"tip": {
|
||||
"tip": "提示",
|
||||
"confirm": "确认",
|
||||
"cancel": "取消",
|
||||
"close": "关闭",
|
||||
"fileExist": "文件已经存在",
|
||||
"createMindMapFail": "新建思维导图失败",
|
||||
"fileIsNotMd": "当前文件不是markdown文件",
|
||||
"fileIsEmpty": "文件内容为空",
|
||||
"fileFormatError": "文件格式错误",
|
||||
"onlyEnableSelectCurrentVaultFile": "只允许添加当前仓库的文件",
|
||||
"saving": "保存中...",
|
||||
"integerInputError": "请输入大于0的数字",
|
||||
"noPreviewImage": "没有可预览图片",
|
||||
"insertFail": "插入失败",
|
||||
"noMatchResult": "暂无匹配结果",
|
||||
"fileDeleted": "该文件已被删除",
|
||||
"noPreviewImageInFile": "该文件中没有可预览图片",
|
||||
"pluginNewVersion": "插件有新版本可用:",
|
||||
"pluginNoNewVersion": "当前已是最新版本",
|
||||
"pluginVersionCheckError": "检查失败",
|
||||
"changeSuccess": "转换完成",
|
||||
"mdToMindMapFail": "转换失败,没有解析到可以转换为思维导图的数据",
|
||||
"imgCreateFail": "图片文件创建失败",
|
||||
"mdModifyTip": "请勿修改除YAML外的任何信息",
|
||||
"fileNameEmpty": "文件名不能为空",
|
||||
"fileNameIllegal": "文件名包含非法字符",
|
||||
"fileRenameFail": "文件重命名失败",
|
||||
"mindMapToMdTip": "转换为Markdown文档后,仅会保留部分内容,比如节点文本、概要文本、备注等,其他内容将丢弃且不可恢复,请先做好备份。",
|
||||
"mdToMindMapTip": "仅支持将标题、列表等语法转换为思维导图,其他内容将丢弃且不可恢复,请先做好备份。"
|
||||
},
|
||||
"setting": {
|
||||
"title": {
|
||||
"title1": "基础",
|
||||
"title2": "文件",
|
||||
"title3": "图片压缩",
|
||||
"title4": "嵌入",
|
||||
"title5": "其他",
|
||||
"title6": "图床"
|
||||
},
|
||||
"themeMode": {
|
||||
"title": "主题模式",
|
||||
"desc": "深色、浅色模式",
|
||||
"option1": "跟随obsidian",
|
||||
"option2": "浅色模式",
|
||||
"option3": "深色模式"
|
||||
},
|
||||
"theme": {
|
||||
"title": "默认主题(浅色)",
|
||||
"desc": "浅色模式下新建思维导图文件时的默认主题",
|
||||
"title2": "默认主题(深色)",
|
||||
"desc2": "深色模式下新建思维导图文件时的默认主题"
|
||||
},
|
||||
"layout": {
|
||||
"title": "默认结构",
|
||||
"desc": "新建思维导图文件时的默认结构"
|
||||
},
|
||||
"folder": {
|
||||
"title4": "思维导图文件存储位置",
|
||||
"desc4": "新建的SimpleMindMap文件存储位置",
|
||||
"title1": "自定义文件存储目录",
|
||||
"desc1": "自定义文件存储目录,相对于仓库根目录",
|
||||
"title5": "图片存储位置",
|
||||
"desc5": "上传的图片文件(节点图片、背景图片)存储位置",
|
||||
"title2": "自定义图片存储目录",
|
||||
"desc2": "自定义图片存储目录,相对于仓库根目录",
|
||||
"title6": "自定义子文件夹",
|
||||
"desc6": "自定义子文件夹,相对于当前文件所在文件夹",
|
||||
"title7": "文件存储位置",
|
||||
"desc7": "节点超链接中选择的本地文件存储目录",
|
||||
"title3": "自定义文件存储目录",
|
||||
"desc3": "自定义文件存储目录,相对于仓库根目录",
|
||||
"option1": "仓库的根目录",
|
||||
"option2": "指定文件夹",
|
||||
"option3": "当前文件所在的文件夹",
|
||||
"option4": "当前文件所在文件夹下指定的子文件夹",
|
||||
"title8": "支持ob搜索",
|
||||
"desc8": "思维导图数据是编码压缩后存储的,所以无法在ob中搜索,如果你想在ob中能搜索到思维导图的节点文本内容,可以开启该选项,开启后会在文件中额外保存所有节点的文本内容用于搜索,带来的副作用是会导致文件体积变大,可能会影响文件打开和保存的速度",
|
||||
"title9": "存储画布位置和缩放数据",
|
||||
"desc9": "开启后会在文件中保存画布位置和缩放数据,这样下次打开时能恢复到上次关闭时的位置和缩放状态。缺点是只要移动和缩放过画布就会造成文件改动",
|
||||
"title10": "节点文字转Markdown标题的最大层级",
|
||||
"desc10": "小于等于该层级的节点文字会转为Markdown标题,其余的转为无序列表"
|
||||
},
|
||||
"compress": {
|
||||
"title1": "压缩图片",
|
||||
"desc1": "是否压缩上传的节点图片(从本地选择的图片)",
|
||||
"title2": "最大压缩宽度",
|
||||
"desc2": "图片压缩后的最大宽度",
|
||||
"title3": "最大压缩高度",
|
||||
"desc3": "图片压缩后的最大高度",
|
||||
"title4": "图片质量",
|
||||
"desc4": "图片压缩后的质量,仅对部分图片格式有效,比如:jpg",
|
||||
"curValue": "当前值",
|
||||
"reset": "重置为默认值"
|
||||
},
|
||||
"autoSave": {
|
||||
"title": "自动保存时间",
|
||||
"desc": "无操作自动保存时间,单位:秒"
|
||||
},
|
||||
"codeBlock": {
|
||||
"title": "代码块嵌入初始高度",
|
||||
"desc": "smm代码块方式嵌入时初始高度,单位:px",
|
||||
"title2": "代码块嵌入背景是否透明",
|
||||
"desc2": "smm代码块嵌入时背景是否透明,否则会跟随所选的思维导图主题背景颜色"
|
||||
},
|
||||
"linkInfo": {
|
||||
"issues": "提交bug或建议",
|
||||
"desktop": "下载独立客户端",
|
||||
"community": "社区"
|
||||
},
|
||||
"embed": {
|
||||
"title1": "嵌入预览双击是否新标签页打开",
|
||||
"desc1": "![[]]格式嵌入md文档时双击预览图像是否新标签页打开文件",
|
||||
"title2": "嵌入预览的图像背景是否透明",
|
||||
"desc2": "![[]]格式嵌入预览的图像背景是否透明",
|
||||
"title3": "嵌入的图片是否以单独文件的形式存储",
|
||||
"desc3": "默认用于![[]]格式嵌入预览的图片会以svg格式的文件单独存储到仓库里,这样思维导图文件中只存储文件路径,可以显著减小文件体积,加快文件的读取和保存速度。如果关闭,则会把图片数据存储到思维导图文件中,体积会显著增大",
|
||||
"title4": "嵌入图片文件存储目录",
|
||||
"desc4": "嵌入预览的图片文件存储的文件夹,相对于仓库根目录,建议不要为空,且目录以.开头作为隐藏文件夹",
|
||||
"title5": "新标签页打开节点链接",
|
||||
"desc5": "点击插入的节点链接(不包含网络链接)是否在新标签页打开。关闭后也可以通过Ctrl+鼠标左键在新标签页打开"
|
||||
},
|
||||
"file": {
|
||||
"title1": "新建思维导图的文件名格式",
|
||||
"desc1": "新建思维导图文件名的命名格式。支持除notename外的其他变量",
|
||||
"title3": "粘贴图片的命名格式",
|
||||
"desc3": "在节点上粘贴的图片的命名格式",
|
||||
"filenameFormatDesc": "文件名格式说明"
|
||||
},
|
||||
"font": {
|
||||
"title": "字体",
|
||||
"desc": "扩展思维导图的字体列表",
|
||||
"btn": "管理",
|
||||
"placeholder": "搜索字体。也可按回车键直接添加输入的字体",
|
||||
"empty": "暂无已添加字体",
|
||||
"noMatch": "无匹配字体",
|
||||
"noFont": "没有可用字体"
|
||||
},
|
||||
"button": {
|
||||
"select": "选择"
|
||||
},
|
||||
"other": {
|
||||
"title1": "检查新版本",
|
||||
"desc1": "开启后会在插件启动时检查是否有新版本可用,如果你的网络访问不到Github,则建议关闭该选项"
|
||||
},
|
||||
"imageHosting": {
|
||||
"title1": "开启图床",
|
||||
"desc1": "开启后,所有图片都将上传到图床",
|
||||
"tip1": "请先完善图床配置信息",
|
||||
"title2": "图床url",
|
||||
"desc2": "根据你使用的图床工具填写对应的上传接口地址",
|
||||
"title3": "表单字段",
|
||||
"desc3": "上传图片时的表单字段名称",
|
||||
"title4": "接口响应结构",
|
||||
"desc4": "上传图片时的接口响应结构。详细说明请参考:",
|
||||
"desc5": "图床功能说明"
|
||||
}
|
||||
},
|
||||
"html": {
|
||||
"filenameFormatDesc": "<p>除了固定名称外,也可以使用变量,用 {} 括起来,可用变量如下:</p><p>1.{notename}:当前文件的文件名,不包含扩展名;</p><p>2.{date}:当前日期,格式为 YYYY-MM-DD;</p><p>3.{time}:当前时间,格式为 HH:mm:ss;</p><p>4.{datatime}:当前日期时间,格式为:YYYY-MM-DD HH:mm:ss;</p><p>5.{date:Format}:指定日期时间格式,比如:MM-DD HH:mm,可参考:<a href='https://day.js.org/docs/en/parse/string-format'>格式说明</a>;</p><p>6.{random}:随机字符串,长度为 6 位;</p>"
|
||||
}
|
||||
}
|
||||
186
src/locales/zhtw.json
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
{
|
||||
"common": {
|
||||
"mindMap": "思維導圖",
|
||||
"rootNodeDefaultText": "根節點",
|
||||
"secondNodeDefaultText": "二級節點",
|
||||
"branchNodeDefaultText": "分支主題"
|
||||
},
|
||||
"action": {
|
||||
"createMindMap": "新建思維導圖",
|
||||
"createMindMapInsertToMd": "新建思維導圖並插入當前文件",
|
||||
"openAsMd": "開啟為 Markdown 文件",
|
||||
"openAsMindMap": "開啟為思維導圖文件",
|
||||
"changeToOutline": "切換為大綱模式",
|
||||
"changeToMindMap": "切換為思維導圖模式",
|
||||
"printOutline": "列印大綱",
|
||||
"import": "匯入",
|
||||
"export": "匯出",
|
||||
"insertCodeBlockToMd": "插入思維導圖程式碼區塊到當前文件",
|
||||
"previewAsMindMap": "預覽為心智圖",
|
||||
"changeToReadonly": "切換為只讀模式",
|
||||
"changeToEdit": "切換為編輯模式",
|
||||
"changeToMdFile": "轉換為Markdown檔案",
|
||||
"changeToMindMapFile": "轉換為心智圖檔案"
|
||||
},
|
||||
"tip": {
|
||||
"tip": "提示",
|
||||
"confirm": "確認",
|
||||
"cancel": "取消",
|
||||
"close": "關閉",
|
||||
"fileExist": "檔案已經存在",
|
||||
"createMindMapFail": "新建思維導圖失敗",
|
||||
"fileIsNotMd": "當前檔案不是 markdown 檔案",
|
||||
"fileIsEmpty": "檔案內容為空",
|
||||
"fileFormatError": "檔案格式錯誤",
|
||||
"onlyEnableSelectCurrentVaultFile": "只允許新增當前倉庫的檔案",
|
||||
"saving": "儲存中...",
|
||||
"integerInputError": "請輸入大於 0 的數字",
|
||||
"noPreviewImage": "沒有可預覽圖片",
|
||||
"insertFail": "插入失敗",
|
||||
"noMatchResult": "暫無匹配結果",
|
||||
"fileDeleted": "該檔案已被删除",
|
||||
"noPreviewImageInFile": "該檔案中沒有可預覽圖片",
|
||||
"pluginNewVersion": "挿件有新版本可用:",
|
||||
"pluginNoNewVersion": "當前已是最新版本",
|
||||
"pluginVersionCheckError": "檢查失敗",
|
||||
"changeSuccess": "轉換完成",
|
||||
"mdToMindMapFail": "轉換失敗,沒有解析到可以轉換為心智圖的數據",
|
||||
"imgCreateFail": "圖片檔案創建失敗",
|
||||
"mdModifyTip": "請勿修改除YAML外的任何資訊",
|
||||
"fileNameEmpty": "檔名不能為空",
|
||||
"fileNameIllegal": "檔名包含非法字元",
|
||||
"fileRenameFail": "檔案重命名失敗",
|
||||
"mindMapToMdTip": "轉換為Markdown檔案後,僅會保留部分內容,比如節點文字、概要文字、備註等,其他內容將丟棄且不可恢復,請先做好備份。",
|
||||
"mdToMindMapTip": "僅支持將標題、清單等語法轉換為心智圖,其他內容將丟棄且不可恢復,請先做好備份。"
|
||||
},
|
||||
"setting": {
|
||||
"title": {
|
||||
"title1": "基礎",
|
||||
"title2": "文件",
|
||||
"title3": "圖片壓縮",
|
||||
"title4": "嵌入",
|
||||
"title5": "其他",
|
||||
"title6": "圖床主機"
|
||||
},
|
||||
"themeMode": {
|
||||
"title": "主題模式",
|
||||
"desc": "深色、淺色模式",
|
||||
"option1": "跟隨 Obsidian",
|
||||
"option2": "淺色模式",
|
||||
"option3": "深色模式"
|
||||
},
|
||||
"theme": {
|
||||
"title": "默認主題(淺色)",
|
||||
"desc": "淺色模式下新建心智圖檔案時的默認主題",
|
||||
"title2": "默認主題(深色)",
|
||||
"desc2": "深色模式下新建心智圖檔案時的默認主題"
|
||||
},
|
||||
"layout": {
|
||||
"title": "預設結構",
|
||||
"desc": "新建心智圖檔案時的默認結構"
|
||||
},
|
||||
"folder": {
|
||||
"title4": "思維導圖文件存儲位置",
|
||||
"desc4": "新建的SimpleMindMap文件存儲位置",
|
||||
"title1": "自定義文件存儲目錄",
|
||||
"desc1": "自定義文件存儲目錄,相對於倉庫根目錄",
|
||||
"title5": "圖片存儲位置",
|
||||
"desc5": "上傳的圖片文件(節點圖片、背景圖片)存儲位置",
|
||||
"title2": "自定義圖片存儲目錄",
|
||||
"desc2": "自定義圖片存儲目錄,相對於倉庫根目錄",
|
||||
"title6": "自定義子文件夾",
|
||||
"desc6": "自定義子文件夾,相對於當前文件所在文件夾",
|
||||
"title7": "文件存儲位置",
|
||||
"desc7": "節點超連結中選擇的本地文件存儲目錄",
|
||||
"title3": "自定義文件存儲目錄",
|
||||
"desc3": "自定義文件存儲目錄,相對於倉庫根目錄",
|
||||
"option1": "倉庫的根目錄",
|
||||
"option2": "指定文件夾",
|
||||
"option3": "當前文件所在的文件夾",
|
||||
"option4": "當前文件所在文件夾下指定的子文件夾",
|
||||
"title8": "支持ob蒐索",
|
||||
"desc8": "心智圖數據是編碼壓縮後存儲的,所以無法在ob中蒐索,如果你想在ob中能蒐索到心智圖的節點文字內容,可以開啟該選項,開啟後會在檔案中額外保存所有節點的文字內容用於蒐索,帶來的副作用是會導致檔案體積變大,可能會影響檔案打開和保存的速度",
|
||||
"title9": "存儲畫布位置和縮放數據",
|
||||
"desc9": "開啟後會在檔案中保存畫布位置和縮放數據,這樣下次打開時能恢復到上次關閉時的位置和縮放狀態。缺點是只要移動和縮放過畫布就會造成檔案改動",
|
||||
"title10": "節點文字轉Markdown標題的最大層級",
|
||||
"desc10": "小於等於該層級的節點文字會轉為Markdown標題,其餘的轉為無序清單"
|
||||
},
|
||||
"compress": {
|
||||
"title1": "壓縮圖片",
|
||||
"desc1": "是否壓縮上傳的節點圖片(從本地選擇的圖片)",
|
||||
"title2": "最大壓縮寬度",
|
||||
"desc2": "設定圖片壓縮後的最大寬度",
|
||||
"title3": "最大壓縮高度",
|
||||
"desc3": "設定圖片壓縮後的最大高度",
|
||||
"title4": "圖片質量",
|
||||
"desc4": "圖片壓縮後的質量,僅對部分圖片格式有效,比如:jpg",
|
||||
"curValue": "當前值",
|
||||
"reset": "重置為預設值"
|
||||
},
|
||||
"autoSave": {
|
||||
"title": "自動儲存時間",
|
||||
"desc": "無操作自動儲存時間,單位:秒"
|
||||
},
|
||||
"codeBlock": {
|
||||
"title": "程式碼區塊嵌入初始高度",
|
||||
"desc": "smm 程式碼區塊方式嵌入時初始高度,單位:px",
|
||||
"title2": "程式碼塊嵌入背景是否透明",
|
||||
"desc2": "smm程式碼塊嵌入時背景是否透明,否則會跟隨所選的心智圖主題背景顏色"
|
||||
},
|
||||
"linkInfo": {
|
||||
"issues": "提交bug或建議",
|
||||
"desktop": "獲取獨立用戶端",
|
||||
"community": "社區"
|
||||
},
|
||||
"embed": {
|
||||
"title1": "嵌入預覽按兩下是否新標籤頁打開",
|
||||
"desc1": "![[]]格式嵌入md檔案時按兩下預覽影像是否新標籤頁打開文件",
|
||||
"title2": "嵌入預覽的圖像背景是否透明",
|
||||
"desc2": "設定![[]]格式嵌入預覽的圖像背景是否透明",
|
||||
"title3": "嵌入的圖片是否以單獨檔案的形式存儲",
|
||||
"desc3": "默認用於![[]]格式嵌入預覽的圖片會以svg格式的檔案單獨存儲到倉庫裏,這樣心智圖檔案中只存儲檔案路徑,可以顯著减小檔案體積,加快檔案的讀取和保存速度。 如果關閉,則會把圖片資料存儲到心智圖檔案中,體積會顯著增大",
|
||||
"title4": "嵌入圖片檔存儲目錄",
|
||||
"desc4": "嵌入預覽的圖片檔存儲的資料夾,相對於倉庫根目錄,建議不要為空,且目錄以.開頭作為隱藏資料夾",
|
||||
"title5": "新標籤頁打開節點連結",
|
||||
"desc5": "點擊插入的節點連結(不包含網絡連結)是否在新標籤頁打開。 關閉後也可以通過Ctrl+滑鼠左鍵在新標籤頁打開"
|
||||
},
|
||||
"file": {
|
||||
"title1": "新建心智圖的檔名格式",
|
||||
"desc1": "新建心智圖檔名的命名格式。支持除notename外的其他變數",
|
||||
"title3": "粘貼圖片的命名格式",
|
||||
"desc3": "在節點上粘貼的圖片的命名格式",
|
||||
"filenameFormatDesc": "檔名格式說明"
|
||||
},
|
||||
"font": {
|
||||
"title": "字體",
|
||||
"desc": "擴展心智圖的字體清單",
|
||||
"btn": "管理",
|
||||
"placeholder": "蒐索字體。 也可按回車鍵直接添加輸入的字體",
|
||||
"empty": "暫無已添加字體",
|
||||
"noMatch": "無匹配字體",
|
||||
"noFont": "沒有可用字體"
|
||||
},
|
||||
"button": {
|
||||
"select": "選擇"
|
||||
},
|
||||
"other": {
|
||||
"title1": "檢查新版本",
|
||||
"desc1": "開啟後會在挿件啟動時檢查是否有新版本可用,如果你的網絡訪問不到Github,則建議關閉該選項"
|
||||
},
|
||||
"imageHosting": {
|
||||
"title1": "開啟圖床",
|
||||
"desc1": "開啟後,所有圖片都將上傳到圖床",
|
||||
"tip1": "請先完善圖床配寘資訊",
|
||||
"title2": "圖床url",
|
||||
"desc2": "根據你使用的圖床工具填寫對應的上傳介面地址",
|
||||
"title3": "表單欄位",
|
||||
"desc3": "上傳圖片時的表單欄位名稱",
|
||||
"title4": "接口響應結構",
|
||||
"desc4": "上傳圖片時的接口響應結構。詳細說明請參考:",
|
||||
"desc5": "圖床功能說明"
|
||||
}
|
||||
},
|
||||
"html": {
|
||||
"filenameFormatDesc": "<p>除了固定名稱外,也可以使用變數,用 {} 括起來,可用變數如下:</p><p>1.{notename}:目前檔案的檔名,不包含副檔名;</p><p>2.{date}:目前日期,格式為 YYYY-MM-DD;</p><p>3.{time}:目前時間,格式為 HH:mm:ss;</p><p>4.{datatime}:目前日期時間,格式為:YYYY-MM-DD HH:mm:ss;</p><p>5.{date:Format}:指定日期時間格式,例如:MM-DD HH:mm,可參考:<a href='https://day.js.org/docs/en/parse/string-format'>格式說明</a>;</p><p>6.{random}:隨機字串,長度為 6 位;</p>"
|
||||
}
|
||||
}
|
||||
440
src/main.js
Normal file
|
|
@ -0,0 +1,440 @@
|
|||
import {
|
||||
addIcon,
|
||||
Plugin,
|
||||
TFolder,
|
||||
Notice,
|
||||
MarkdownView,
|
||||
WorkspaceLeaf,
|
||||
Workspace,
|
||||
getLanguage
|
||||
} from 'obsidian'
|
||||
import './style.css'
|
||||
import SmmEditView from './SmmEditView.js'
|
||||
import {
|
||||
SMM_VIEW_TYPE,
|
||||
SIDE_BAR_ICON,
|
||||
SMM_TAG,
|
||||
DEFAULT_SETTINGS,
|
||||
IGNORE_CHECK_SMM
|
||||
} from './ob/constant.js'
|
||||
import {
|
||||
createDefaultText,
|
||||
createDefaultMindMapData
|
||||
} from './ob/metadataAndMarkdown.js'
|
||||
import { around, dedupe } from 'monkey-around'
|
||||
import { getUidFromSource, formatFileName } from './ob/utils.js'
|
||||
import MarkdownPostProcessor from './ob/MarkdownPostProcessor.js'
|
||||
import SmmSettingTab from './ob/SmmSettingTab.js'
|
||||
import { langList } from './src/config/zh'
|
||||
import i18n from 'i18next'
|
||||
import enTranslations from './locales/en.json'
|
||||
import zhTranslations from './locales/zh.json'
|
||||
import viTranslations from './locales/vi.json'
|
||||
import zhtwTranslations from './locales/zhtw.json'
|
||||
import Commands from './ob/Commands.js'
|
||||
import markdown from 'simple-mind-map/src/parse/markdown.js'
|
||||
import Menus from './ob/Menus.js'
|
||||
|
||||
export default class SimpleMindMapPlugin extends Plugin {
|
||||
async onload() {
|
||||
await this._addSetting()
|
||||
|
||||
i18n.init({
|
||||
lng: getLanguage() || 'en',
|
||||
fallbackLng: 'en',
|
||||
resources: {
|
||||
en: { translation: enTranslations },
|
||||
zh: { translation: zhTranslations },
|
||||
vi: { translation: viTranslations },
|
||||
['zh-TW']: { translation: zhtwTranslations }
|
||||
}
|
||||
})
|
||||
|
||||
addIcon('smm-icon', SIDE_BAR_ICON)
|
||||
|
||||
this.registerView(SMM_VIEW_TYPE, leaf => new SmmEditView(leaf, this))
|
||||
|
||||
this._createSmmFile = this._createSmmFile.bind(this)
|
||||
this.addRibbonIcon(
|
||||
'smm-icon',
|
||||
this._t('action.createMindMap'),
|
||||
this._createSmmFile
|
||||
)
|
||||
|
||||
this.commands = new Commands(this)
|
||||
|
||||
this.menus = new Menus(this)
|
||||
|
||||
this._registerMonkeyPatches()
|
||||
|
||||
this._switchToSmmAfterLoad()
|
||||
|
||||
this._initStatusBar()
|
||||
|
||||
this.markdownPostProcessor = new MarkdownPostProcessor(this)
|
||||
this.markdownPostProcessor.register()
|
||||
|
||||
this.fileToSubpathMap = {}
|
||||
this.noSaveOnClose = false
|
||||
}
|
||||
|
||||
async _createSmmFile(folderPath = '', callback) {
|
||||
try {
|
||||
if (typeof folderPath !== 'string' || folderPath === '/') {
|
||||
folderPath = ''
|
||||
}
|
||||
const { fileNameFormat } = this.settings
|
||||
folderPath = this._getCreateFolderPath(folderPath)
|
||||
await this._ensureDirectoryExists(folderPath)
|
||||
const { vault } = this.app
|
||||
const filePath = `${
|
||||
folderPath ? folderPath + '/' : ''
|
||||
}${formatFileName(fileNameFormat, { ignores: ['notename'] })}.smm.md`
|
||||
const fileContent = createDefaultText(
|
||||
filePath,
|
||||
this._getCreateDefaultMindMapOptions()
|
||||
)
|
||||
try {
|
||||
const existingFile = vault.getFileByPath(filePath)
|
||||
if (existingFile) {
|
||||
new Notice(this._t('tip.fileExist'))
|
||||
} else {
|
||||
await vault.create(filePath, fileContent)
|
||||
if (callback && typeof callback === 'function') {
|
||||
callback(filePath)
|
||||
} else {
|
||||
await this.app.workspace.openLinkText(filePath, '', true)
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
new Notice(this._t('tip.createMindMapFail'))
|
||||
}
|
||||
} catch (error) {
|
||||
new Notice(this._t('tip.createMindMapFail'))
|
||||
}
|
||||
}
|
||||
|
||||
_getCreateFolderPath(folderPath) {
|
||||
if (folderPath) return folderPath
|
||||
const { filePathType, filePath } = this.settings
|
||||
switch (filePathType) {
|
||||
case 'root':
|
||||
return ''
|
||||
case 'custom':
|
||||
return filePath
|
||||
case 'currentFileFolder':
|
||||
return this._getActiveFileDirectory()
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
async _getAvailableFilaName(filePath, extCount = 1) {
|
||||
let counter = 1
|
||||
while (await this.app.vault.adapter.exists(filePath)) {
|
||||
const parts = filePath.split('.')
|
||||
const extList = []
|
||||
for (let i = 0; i < extCount; i++) {
|
||||
extList.push(parts.pop())
|
||||
}
|
||||
const ext = extList.reverse().join('.')
|
||||
filePath = `${parts.join('.')}_${counter}.${ext}`
|
||||
counter++
|
||||
}
|
||||
return filePath
|
||||
}
|
||||
|
||||
async _addSetting() {
|
||||
await this._loadSettings()
|
||||
this.addSettingTab(new SmmSettingTab(this.app, this))
|
||||
}
|
||||
|
||||
async _loadSettings() {
|
||||
const data = await this.loadData()
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, data || {})
|
||||
const obLang = getLanguage()
|
||||
const target = langList.find(
|
||||
item => item.value === obLang || item.alias === obLang
|
||||
)
|
||||
this.settings.lang = target ? target.value : 'en'
|
||||
}
|
||||
|
||||
async _saveSettings() {
|
||||
await this.saveData(this.settings)
|
||||
}
|
||||
|
||||
_registerMonkeyPatches() {
|
||||
const key = 'https://github.com/wanglin2/mind-map'
|
||||
this.register(
|
||||
around(Workspace.prototype, {
|
||||
getActiveViewOfType(old) {
|
||||
return dedupe(key, old, function(...args) {
|
||||
const result = old && old.apply(this, args)
|
||||
if (args[1] === IGNORE_CHECK_SMM) {
|
||||
return result
|
||||
}
|
||||
const currentView = this.app?.workspace?.activeLeaf?.view
|
||||
if (!currentView || !(currentView instanceof SmmEditView))
|
||||
return result
|
||||
})
|
||||
}
|
||||
})
|
||||
)
|
||||
if (!this.app.plugins?.plugins?.['obsidian-hover-editor']) {
|
||||
this.register(
|
||||
around(WorkspaceLeaf.prototype, {
|
||||
getRoot(old) {
|
||||
return function() {
|
||||
const top = old.call(this)
|
||||
return top.getRoot === this.getRoot ? top : top.getRoot()
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
const self = this
|
||||
this.register(
|
||||
around(WorkspaceLeaf.prototype, {
|
||||
detach(next) {
|
||||
return function() {
|
||||
return next.apply(this)
|
||||
}
|
||||
},
|
||||
setViewState(next) {
|
||||
return function(state, ...rest) {
|
||||
if (
|
||||
(state.state?.isSwitchToMarkdownViewFromSmmView ||
|
||||
['preview', 'source'].includes(state.state?.mode)) &&
|
||||
!state.state?.isPreviewToMindMapViewFromMdView
|
||||
) {
|
||||
return next.apply(this, [state, ...rest])
|
||||
}
|
||||
if (
|
||||
self._loaded &&
|
||||
state.type === 'markdown' &&
|
||||
state.state?.file
|
||||
) {
|
||||
const curFilePath = state.state.file
|
||||
if (self._isSmmFile(curFilePath)) {
|
||||
let isStop = false
|
||||
if (rest && rest[0]) {
|
||||
if (rest[0].subpath) {
|
||||
self.fileToSubpathMap[curFilePath] = rest[0].subpath
|
||||
} else if (
|
||||
rest[0].match &&
|
||||
rest[0].match.matches.length > 0
|
||||
) {
|
||||
const uid = getUidFromSource(rest[0])
|
||||
if (uid) {
|
||||
const existLeaf = this.app.workspace
|
||||
.getLeavesOfType(SMM_VIEW_TYPE)
|
||||
.find(leaf => {
|
||||
const file = leaf.view.file
|
||||
? leaf.view.file.path
|
||||
: leaf.view.state.file
|
||||
return file && file === curFilePath
|
||||
})
|
||||
if (existLeaf) {
|
||||
if (
|
||||
existLeaf.view instanceof SmmEditView &&
|
||||
existLeaf.view.jumpToNodeByUid
|
||||
) {
|
||||
existLeaf.view.jumpToNodeByUid(uid)
|
||||
} else {
|
||||
self.fileToSubpathMap[curFilePath] = uid
|
||||
}
|
||||
this.app.workspace.setActiveLeaf(existLeaf)
|
||||
isStop = true
|
||||
} else {
|
||||
self.fileToSubpathMap[curFilePath] = uid
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isStop) return
|
||||
const newState = {
|
||||
...state,
|
||||
type: SMM_VIEW_TYPE
|
||||
}
|
||||
return next.apply(this, [newState, ...rest])
|
||||
}
|
||||
}
|
||||
return next.apply(this, [state, ...rest])
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
this.menus.addMarkdownFileMenus()
|
||||
}
|
||||
|
||||
_switchToSmmAfterLoad() {
|
||||
this.app.workspace.onLayoutReady(async () => {
|
||||
let leaf
|
||||
const markdownLeaf = this.app.workspace.getLeavesOfType('markdown')
|
||||
for (leaf of markdownLeaf) {
|
||||
if (
|
||||
leaf.view instanceof MarkdownView &&
|
||||
leaf.view.file &&
|
||||
this._isSmmFile(leaf.view.file)
|
||||
) {
|
||||
this._setSmmView(leaf)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
async _setSmmView(leaf) {
|
||||
await leaf.setViewState({
|
||||
type: SMM_VIEW_TYPE,
|
||||
state: leaf.view.getState(),
|
||||
popstate: true
|
||||
})
|
||||
}
|
||||
|
||||
_getActiveSmmView() {
|
||||
return this.app.workspace.getActiveViewOfType(SmmEditView, IGNORE_CHECK_SMM)
|
||||
}
|
||||
|
||||
_isSmmFile(file) {
|
||||
if (!file) {
|
||||
return false
|
||||
}
|
||||
const isString = typeof file === 'string'
|
||||
const filePath = isString ? file : file.path
|
||||
if (filePath.endsWith('.smm.md')) {
|
||||
return true
|
||||
}
|
||||
let cache = null
|
||||
if (isString) {
|
||||
cache = this.app.metadataCache.getCache(file)
|
||||
} else {
|
||||
if (file.extension === SMM_VIEW_TYPE) {
|
||||
return true
|
||||
}
|
||||
cache = this.app.metadataCache.getFileCache(file)
|
||||
}
|
||||
if (cache?.frontmatter?.tags?.contains(SMM_TAG)) {
|
||||
return true
|
||||
}
|
||||
if (/\.smm.*\.md$/.test(filePath)) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
_initStatusBar() {
|
||||
this.statusBarItem = this.addStatusBarItem()
|
||||
this.statusBarItem.empty()
|
||||
this.statusBarItem.style.display = 'none'
|
||||
|
||||
this.smmFileStatus = this.statusBarItem.createEl('div', {
|
||||
cls: 'smm-file-status'
|
||||
})
|
||||
|
||||
this.registerEvent(
|
||||
this.app.workspace.on('file-open', this._updateStatusBar.bind(this))
|
||||
)
|
||||
|
||||
this.registerEvent(
|
||||
this.app.workspace.on(
|
||||
'active-leaf-change',
|
||||
this._updateStatusBar.bind(this)
|
||||
)
|
||||
)
|
||||
|
||||
this._updateStatusBar()
|
||||
}
|
||||
|
||||
_updateStatusBar() {
|
||||
const activeFile = this.app.workspace.getActiveFile()
|
||||
|
||||
const isSmmFile = activeFile && this._isSmmFile(activeFile)
|
||||
|
||||
const statusBar = this.app.statusBar.containerEl
|
||||
|
||||
if (isSmmFile) {
|
||||
this.statusBarItem.style.display = 'block'
|
||||
statusBar.classList.add('smm-file-status-active')
|
||||
} else {
|
||||
this.statusBarItem.style.display = 'none'
|
||||
statusBar.classList.remove('smm-file-status-active')
|
||||
}
|
||||
}
|
||||
|
||||
async _ensureDirectoryExists(dirPath) {
|
||||
if (!dirPath) return
|
||||
const { vault } = this.app
|
||||
const exist = await vault.exists(dirPath)
|
||||
if (!exist) {
|
||||
await vault.createFolder(dirPath)
|
||||
}
|
||||
}
|
||||
|
||||
_t(val) {
|
||||
return i18n.t(val)
|
||||
}
|
||||
|
||||
_getCreateDefaultMindMapOptions() {
|
||||
const { defaultTheme, defaultThemeDark, defaultLayout } = this.settings
|
||||
return {
|
||||
theme: this._getObIsDark() ? defaultThemeDark : defaultTheme,
|
||||
layout: defaultLayout,
|
||||
rootNodeDefaultText: this._t('common.rootNodeDefaultText'),
|
||||
secondNodeDefaultText: this._t('common.secondNodeDefaultText'),
|
||||
branchNodeDefaultText: this._t('common.branchNodeDefaultText')
|
||||
}
|
||||
}
|
||||
|
||||
_createDefaultMindMapData() {
|
||||
return createDefaultMindMapData(
|
||||
this._getCreateDefaultMindMapOptions(),
|
||||
false
|
||||
)
|
||||
}
|
||||
|
||||
_getActiveFileDirectory() {
|
||||
const activeFile = this.app.workspace.getActiveFile()
|
||||
if (!activeFile) {
|
||||
return null
|
||||
}
|
||||
if (activeFile instanceof TFolder) {
|
||||
return null
|
||||
}
|
||||
const parent = activeFile.parent
|
||||
if (!parent) {
|
||||
return null
|
||||
}
|
||||
return parent.path.replace(/\/$/, '')
|
||||
}
|
||||
|
||||
_getObIsDark() {
|
||||
return document.body.classList.contains('theme-dark')
|
||||
}
|
||||
|
||||
async _mdToMindmapData(md) {
|
||||
const frontMatterRegex = /^---\n[\s\S]*?\n---\n/
|
||||
const cleanedMd = md.replace(frontMatterRegex, '')
|
||||
if (!cleanedMd.trim()) {
|
||||
return null
|
||||
}
|
||||
const data = await markdown.transformMarkdownTo(cleanedMd, false)
|
||||
if (!data) {
|
||||
return null
|
||||
}
|
||||
const { defaultTheme, defaultThemeDark, defaultLayout } = this.settings
|
||||
return {
|
||||
root: data,
|
||||
layout: defaultLayout,
|
||||
theme: {
|
||||
template: this._getObIsDark() ? defaultThemeDark : defaultTheme,
|
||||
config: {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onunload() {
|
||||
this.markdownPostProcessor.destroy()
|
||||
this.statusBarItem?.remove()
|
||||
this.commands.clear()
|
||||
}
|
||||
}
|
||||
98
src/ob/Commands.js
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
import { Notice, MarkdownView } from 'obsidian'
|
||||
|
||||
export default class Commands {
|
||||
constructor(plugin) {
|
||||
this.plugin = plugin
|
||||
this.app = plugin.app
|
||||
|
||||
this._addCreatesCommand()
|
||||
this._addActionsCommand()
|
||||
}
|
||||
|
||||
clear() {}
|
||||
|
||||
addCommand(command) {
|
||||
this.plugin.addCommand(command)
|
||||
}
|
||||
|
||||
_t(key) {
|
||||
return this.plugin._t(key)
|
||||
}
|
||||
|
||||
_addCreatesCommand() {
|
||||
this.addCommand({
|
||||
id: 'create-smm-mindmap',
|
||||
name: this._t('action.createMindMap'),
|
||||
callback: async () => {
|
||||
this.plugin._createSmmFile()
|
||||
}
|
||||
})
|
||||
this.addCommand({
|
||||
id: 'create-smm-mindmap-insert-markdown',
|
||||
name: this._t('action.createMindMapInsertToMd'),
|
||||
checkCallback: checking => {
|
||||
const markdownView = this.app.workspace.getActiveViewOfType(
|
||||
MarkdownView
|
||||
)
|
||||
if (markdownView) {
|
||||
if (!checking) {
|
||||
this.plugin._createSmmFile('', fileName => {
|
||||
try {
|
||||
const file = this.app.vault.getFileByPath(fileName)
|
||||
const currentFile = this.app.workspace.getActiveFile()
|
||||
const linkText = this.app.fileManager.generateMarkdownLink(
|
||||
file,
|
||||
currentFile?.path || ''
|
||||
)
|
||||
const activeEditor = this.app.workspace.activeEditor
|
||||
activeEditor.editor.replaceSelection('!' + linkText)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
new Notice(this._t('tip.createMindMapFail'))
|
||||
}
|
||||
})
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
_addActionsCommand() {
|
||||
this.addCommand({
|
||||
id: 'enter-smm-mindmap-demonstrate',
|
||||
name: this._t('action.enterDemonstrate'),
|
||||
checkCallback: checking => {
|
||||
const view = this.plugin._getActiveSmmView()
|
||||
if (view) {
|
||||
if (!checking) {
|
||||
view.mindMapAPP.$bus.$emit('enter_demonstrate')
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
this.addCommand({
|
||||
id: 'save-smm-mindmap-and-update-image',
|
||||
name: this._t('action.saveAndUpdateImage'),
|
||||
hotkeys: [
|
||||
{
|
||||
modifiers: ['Mod', 'Shift'],
|
||||
key: 's'
|
||||
}
|
||||
],
|
||||
checkCallback: checking => {
|
||||
const view = this.plugin._getActiveSmmView()
|
||||
if (view) {
|
||||
if (!checking) {
|
||||
view.forceSaveAndUpdateImage()
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
64
src/ob/ConfirmDialog.js
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
import { Modal } from 'obsidian'
|
||||
import i18n from 'i18next'
|
||||
|
||||
export class ConfirmDialog extends Modal {
|
||||
constructor(app, params) {
|
||||
super(app)
|
||||
this.params = {
|
||||
title: i18n.t('tip.tip'),
|
||||
confirmText: i18n.t('tip.confirm'),
|
||||
cancelText: i18n.t('tip.cancel'),
|
||||
content: '',
|
||||
danger: false,
|
||||
...params
|
||||
}
|
||||
this.resolvePromise = null
|
||||
this.promise = new Promise(resolve => {
|
||||
this.resolvePromise = resolve
|
||||
})
|
||||
this.setTitle(this.params.title)
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
const { contentEl } = this
|
||||
contentEl.empty()
|
||||
const contentContainer = contentEl.createDiv('smm-confirm-dialog-content')
|
||||
if (typeof this.params.content === 'string') {
|
||||
contentContainer.createEl('p', { text: this.params.content })
|
||||
} else {
|
||||
contentContainer.appendChild(this.params.content)
|
||||
}
|
||||
const buttonContainer = contentEl.createDiv('smm-confirm-dialog-buttons')
|
||||
const cancelBtn = buttonContainer.createEl('button', {
|
||||
text: this.params.cancelText
|
||||
})
|
||||
cancelBtn.addEventListener('click', () => {
|
||||
this.params.onCancel?.()
|
||||
this.resolvePromise(false)
|
||||
this.close()
|
||||
})
|
||||
const confirmBtn = buttonContainer.createEl('button', {
|
||||
text: this.params.confirmText,
|
||||
cls: this.params.danger ? 'mod-warning' : 'mod-cta'
|
||||
})
|
||||
confirmBtn.addEventListener('click', () => {
|
||||
this.params.onConfirm?.()
|
||||
this.resolvePromise(true)
|
||||
this.close()
|
||||
})
|
||||
}
|
||||
|
||||
onClose() {
|
||||
const { contentEl } = this
|
||||
contentEl.empty()
|
||||
if (this.resolvePromise) {
|
||||
this.resolvePromise(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function showConfirmationDialog(app, params) {
|
||||
const dialog = new ConfirmDialog(app, params)
|
||||
dialog.open()
|
||||
return dialog.promise
|
||||
}
|
||||
389
src/ob/MarkdownPostProcessor.js
Normal file
|
|
@ -0,0 +1,389 @@
|
|||
import { TFile } from 'obsidian'
|
||||
import { parseMarkdownText } from './metadataAndMarkdown.js'
|
||||
import { dataURItoBlob, smmFilePathToFileName } from './utils.js'
|
||||
import LZString from 'lz-string'
|
||||
import { SMM_VIEW_TYPE } from './constant.js'
|
||||
import SmmEditView from '../SmmEditView.js'
|
||||
|
||||
export default class MarkdownPostProcessor {
|
||||
constructor(plugin) {
|
||||
this.plugin = plugin
|
||||
|
||||
this.urlCache = new Map()
|
||||
this.imageElements = new Map()
|
||||
this.emptyMap = new Map()
|
||||
|
||||
this.handleFileModify = this.handleFileModify.bind(this)
|
||||
this.handleFileDelete = this.handleFileDelete.bind(this)
|
||||
this.handleModifySvgName = this.handleModifySvgName.bind(this)
|
||||
|
||||
plugin.registerEvent(plugin.app.vault.on('modify', this.handleFileModify))
|
||||
plugin.registerEvent(plugin.app.vault.on('delete', this.handleFileDelete))
|
||||
plugin.registerEvent(
|
||||
plugin.app.vault.on('rename', this.handleModifySvgName)
|
||||
)
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.plugin.app.vault.off('modify', this.handleFileModify)
|
||||
this.plugin.app.vault.off('delete', this.handleFileDelete)
|
||||
this.plugin.app.vault.off('rename', this.handleModifySvgName)
|
||||
|
||||
this.urlCache.forEach(url => URL.revokeObjectURL(url))
|
||||
this.urlCache.clear()
|
||||
this.imageElements.clear()
|
||||
this.emptyMap.clear()
|
||||
}
|
||||
|
||||
async handleFileModify(file) {
|
||||
if (!(file instanceof TFile) || !this.plugin._isSmmFile(file)) return
|
||||
|
||||
try {
|
||||
const noUrlCache = !this.urlCache.has(file.path)
|
||||
const hasEmpty = this.emptyMap.has(file.path)
|
||||
if (noUrlCache && !hasEmpty) {
|
||||
return
|
||||
}
|
||||
const curIsNoImage = noUrlCache && hasEmpty
|
||||
const data = await this.plugin.app.vault.read(file)
|
||||
const parsedata = parseMarkdownText(data)
|
||||
const newUrl = this._getImgUrl(parsedata.svgdata)
|
||||
if (!newUrl) {
|
||||
return
|
||||
}
|
||||
|
||||
const oldUrl = this.urlCache.get(file.path)
|
||||
if (oldUrl) URL.revokeObjectURL(oldUrl)
|
||||
this.urlCache.set(file.path, newUrl)
|
||||
|
||||
const emptyDiv = this.emptyMap.get(file.path)
|
||||
if (emptyDiv) {
|
||||
this.emptyMap.delete(file.path)
|
||||
}
|
||||
|
||||
const elements = this.imageElements.get(file.path) || new Set()
|
||||
elements.forEach(img => {
|
||||
img.src = newUrl
|
||||
})
|
||||
if (curIsNoImage && emptyDiv) {
|
||||
const img = this._createSvgImageElement(newUrl, file.path)
|
||||
emptyDiv.replaceWith(img)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('更新图片失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
async handleFileDelete(file) {
|
||||
if (!(file instanceof TFile)) return
|
||||
|
||||
const url = this.urlCache.get(file.path)
|
||||
if (url) {
|
||||
URL.revokeObjectURL(url)
|
||||
this.urlCache.delete(file.path)
|
||||
const imgs = this.imageElements.get(file.path)
|
||||
imgs.forEach(img => {
|
||||
const parentElement = img.parentElement
|
||||
parentElement.empty()
|
||||
this._createEmptyDiv(
|
||||
parentElement,
|
||||
file,
|
||||
this.plugin._t('tip.fileDeleted'),
|
||||
false
|
||||
)
|
||||
})
|
||||
this.imageElements.delete(file.path)
|
||||
}
|
||||
const emptyDiv = this.emptyMap.get(file.path)
|
||||
if (emptyDiv) {
|
||||
emptyDiv.textContent = this.plugin._t('tip.fileDeleted')
|
||||
emptyDiv.removeEventListener('dblclick', emptyDiv.dblclickHandler)
|
||||
this.emptyMap.delete(file.path)
|
||||
}
|
||||
|
||||
this.deletePreviewSvgFile(file)
|
||||
}
|
||||
|
||||
async deletePreviewSvgFile(file) {
|
||||
try {
|
||||
const targetFileName = smmFilePathToFileName(file.path, '.svg')
|
||||
const { embedImageIsSeparateFileFolder } = this.plugin.settings
|
||||
const previewFilePath = embedImageIsSeparateFileFolder
|
||||
? `${embedImageIsSeparateFileFolder}/${targetFileName}`
|
||||
: targetFileName
|
||||
const exist = await this.plugin.app.vault.exists(previewFilePath)
|
||||
console.log('删除预览图像文件:', previewFilePath, exist)
|
||||
if (exist) {
|
||||
await this.plugin.app.vault.adapter.remove(previewFilePath)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('删除预览图像文件失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
async handleModifySvgName(file, oldName) {
|
||||
try {
|
||||
oldName = smmFilePathToFileName(oldName, '.svg')
|
||||
const { embedImageIsSeparateFileFolder } = this.plugin.settings
|
||||
const oldPath = embedImageIsSeparateFileFolder + '/' + oldName
|
||||
const exist = await this.plugin.app.vault.exists(oldPath)
|
||||
if (exist) {
|
||||
const newName = smmFilePathToFileName(file.name, '.svg')
|
||||
const newPath = embedImageIsSeparateFileFolder + '/' + newName
|
||||
await this.plugin.app.vault.adapter.rename(oldPath, newPath)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('修改svg文件名失败:', error)
|
||||
}
|
||||
try {
|
||||
const markdownLeafs = this.plugin.app.workspace.getLeavesOfType(
|
||||
SMM_VIEW_TYPE
|
||||
)
|
||||
for (const leaf of markdownLeafs) {
|
||||
if (
|
||||
leaf.view instanceof SmmEditView &&
|
||||
leaf.view.file.path === file.path
|
||||
) {
|
||||
leaf.view.forceSave(true)
|
||||
break
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('保存失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
register() {
|
||||
this.plugin.registerMarkdownPostProcessor(
|
||||
this._markdownPostProcessor.bind(this)
|
||||
)
|
||||
}
|
||||
|
||||
async _markdownPostProcessor(el, ctx) {
|
||||
try {
|
||||
if (this._isSpecialCard(el)) {
|
||||
console.log('特殊卡片处理')
|
||||
return this._processSpecialCard(el)
|
||||
}
|
||||
|
||||
const embeddedItems = el.querySelectorAll('.internal-embed')
|
||||
if (embeddedItems.length === 0) {
|
||||
await this._processEditMode(el, ctx)
|
||||
} else {
|
||||
await this._processReadingMode(embeddedItems, ctx)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Markdown处理失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
_isSpecialCard(el) {
|
||||
return (
|
||||
el.hasClass('components--DynamicDataView-PageCardCoverPreviewContent') &&
|
||||
el.children[0]?.getAttribute('data-heading') === 'metadata' &&
|
||||
el.children[2]?.getAttribute('data-heading') === 'svgdata' &&
|
||||
el.children[4]?.getAttribute('data-heading') === 'linkdata'
|
||||
)
|
||||
}
|
||||
|
||||
_processSpecialCard(el) {
|
||||
el.classList.add('smmMindCard')
|
||||
const svgdata = el.children[3].children[0].innerHTML
|
||||
const url = this._getImgUrl(svgdata)
|
||||
|
||||
const img = this._createSvgImageElement(url)
|
||||
el.replaceChildren(img)
|
||||
}
|
||||
|
||||
_createEmptyDiv(containerEl, file, text, listenerDblclick = true) {
|
||||
const emptyDiv = containerEl.createEl('div', { text })
|
||||
emptyDiv.style.color = 'var(--text-muted)'
|
||||
emptyDiv.style.border = '1px dashed var(--text-muted)'
|
||||
emptyDiv.style.padding = '10px'
|
||||
emptyDiv.style.borderRadius = '4px'
|
||||
emptyDiv.style.textAlign = 'center'
|
||||
if (listenerDblclick) {
|
||||
emptyDiv.dblclickHandler = () => {
|
||||
const newWindow = this.plugin.settings.embedDblClickNewWindow
|
||||
this.plugin.app.workspace.openLinkText(file?.path, '', newWindow)
|
||||
}
|
||||
emptyDiv.addEventListener('dblclick', emptyDiv.dblclickHandler)
|
||||
}
|
||||
return emptyDiv
|
||||
}
|
||||
|
||||
async _processEditMode(el, ctx) {
|
||||
const file = this.plugin.app.vault.getFileByPath(ctx.sourcePath)
|
||||
if (!this.plugin._isSmmFile(file)) return
|
||||
if (ctx.remainingNestLevel !== undefined && ctx.remainingNestLevel < 4)
|
||||
return
|
||||
|
||||
let containerEl = this._findValidContainer(ctx.containerEl)
|
||||
if (!containerEl || this._shouldSkipContainer(containerEl)) return
|
||||
|
||||
try {
|
||||
const data = await this.plugin.app.vault.read(file)
|
||||
const img = await this._createImageFromFile(file, data)
|
||||
containerEl.empty()
|
||||
if (img) {
|
||||
containerEl.appendChild(img)
|
||||
this._updateImgSize(containerEl, img)
|
||||
} else {
|
||||
const emptyDiv = this._createEmptyDiv(
|
||||
containerEl,
|
||||
file,
|
||||
this.plugin._t('tip.noPreviewImageInFile')
|
||||
)
|
||||
this.emptyMap.set(file.path, emptyDiv)
|
||||
}
|
||||
if (containerEl.hasClass('markdown-embed')) {
|
||||
containerEl.classList.remove('markdown-embed', 'inline-embed')
|
||||
}
|
||||
if (containerEl.hasClass('canvas-node-content')) {
|
||||
containerEl.classList.add('smm-canvas-node-content')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`处理编辑模式失败: ${file?.path}`, error)
|
||||
}
|
||||
}
|
||||
|
||||
async _processReadingMode(embeddedItems, ctx) {
|
||||
for (const item of embeddedItems) {
|
||||
try {
|
||||
const fname = item.getAttribute('src')?.split('#')[0]
|
||||
if (!fname) continue
|
||||
|
||||
const file = this.plugin.app.metadataCache.getFirstLinkpathDest(
|
||||
fname,
|
||||
ctx.sourcePath
|
||||
)
|
||||
if (!(file instanceof TFile) || !this.plugin._isSmmFile(file)) continue
|
||||
const data = await this.plugin.app.vault.read(file)
|
||||
const img = await this._createImageFromFile(file, data)
|
||||
this._updateImgSize(item, img)
|
||||
if (img) {
|
||||
item.parentElement?.replaceChild(img, item)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('处理嵌入项失败', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_updateImgSize(containerEl, img) {
|
||||
if (
|
||||
containerEl.parentNode &&
|
||||
containerEl.parentNode.classList.contains('popover')
|
||||
) {
|
||||
containerEl.classList.add('smm-popover-img-preview-content')
|
||||
} else {
|
||||
const width = containerEl.getAttribute('width')
|
||||
const height = containerEl.getAttribute('height')
|
||||
if (width) {
|
||||
img.width = width
|
||||
}
|
||||
if (height) {
|
||||
img.height = height
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _createImageFromFile(file, data) {
|
||||
if (this.urlCache.has(file.path)) {
|
||||
const url = this.urlCache.get(file.path)
|
||||
return this._createSvgImageElement(url, file.path)
|
||||
}
|
||||
|
||||
const parsedata = parseMarkdownText(data)
|
||||
const svgdata = parsedata.svgdata
|
||||
if (!svgdata) {
|
||||
return null
|
||||
}
|
||||
const url = this._getImgUrl(svgdata)
|
||||
this.urlCache.set(file.path, url)
|
||||
const img = this._createSvgImageElement(url, file.path)
|
||||
return img
|
||||
}
|
||||
|
||||
_getImgUrl(svgdata) {
|
||||
if (!svgdata) return ''
|
||||
let url = ''
|
||||
if (/^!\[\[/.test(svgdata)) {
|
||||
const match = svgdata.match(/!\[\[([^\]]+)\]\]/)
|
||||
if (match && match[1]) {
|
||||
url = this.plugin.app.vault.adapter.getResourcePath(match[1])
|
||||
}
|
||||
} else {
|
||||
const svgBlob = dataURItoBlob(LZString.decompressFromBase64(svgdata))
|
||||
url = URL.createObjectURL(svgBlob)
|
||||
}
|
||||
return url
|
||||
}
|
||||
|
||||
_createSvgImageElement(url, filePath = '') {
|
||||
const img = document.createElement('img')
|
||||
img.src = url
|
||||
img.draggable = false
|
||||
|
||||
if (filePath) {
|
||||
img.setAttribute('data-smm-file', filePath)
|
||||
|
||||
img.addEventListener('dblclick', () => {
|
||||
const newWindow = this.plugin.settings.embedDblClickNewWindow
|
||||
this.plugin.app.workspace.openLinkText(filePath, '', newWindow)
|
||||
})
|
||||
|
||||
if (!this.imageElements.has(filePath)) {
|
||||
this.imageElements.set(filePath, new Set())
|
||||
}
|
||||
this.imageElements.get(filePath).add(img)
|
||||
|
||||
const observer = new MutationObserver(() => {
|
||||
if (!document.contains(img)) {
|
||||
this.imageElements.get(filePath)?.delete(img)
|
||||
observer.disconnect()
|
||||
}
|
||||
})
|
||||
observer.observe(document.body, { subtree: true, childList: true })
|
||||
}
|
||||
|
||||
return img
|
||||
}
|
||||
|
||||
_findValidContainer(containerEl) {
|
||||
const invalidClasses = [
|
||||
'dataview',
|
||||
'cm-preview-code-block',
|
||||
'cm-embed-block'
|
||||
]
|
||||
|
||||
while (containerEl) {
|
||||
if (invalidClasses.some(cls => containerEl.classList.contains(cls))) {
|
||||
return null
|
||||
}
|
||||
|
||||
const isExcalidraw = containerEl.classList.contains('excalidraw-md-host')
|
||||
if (
|
||||
containerEl.classList.contains('internal-embed') ||
|
||||
containerEl.classList.contains('markdown-embed') ||
|
||||
containerEl.classList.contains('markdown-reading-view') ||
|
||||
isExcalidraw
|
||||
) {
|
||||
return containerEl
|
||||
}
|
||||
|
||||
containerEl = containerEl.parentElement
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
_shouldSkipContainer(containerEl) {
|
||||
return (
|
||||
containerEl.hasAttribute('ready') ||
|
||||
['dataview', 'cm-preview-code-block', 'cm-embed-block'].some(cls =>
|
||||
containerEl.classList.contains(cls)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
281
src/ob/Menus.js
Normal file
|
|
@ -0,0 +1,281 @@
|
|||
import { TFile, TFolder, Notice, MarkdownView } from 'obsidian'
|
||||
import {
|
||||
parseMarkdownText,
|
||||
assembleMarkdownText
|
||||
} from './metadataAndMarkdown.js'
|
||||
import { hideTargetMenu } from './utils.js'
|
||||
import { PreviewMindMap } from './PreviewMindMap.js'
|
||||
import LZString from 'lz-string'
|
||||
import { SMM_VIEW_TYPE, SMM_TAG } from './constant.js'
|
||||
import { around } from 'monkey-around'
|
||||
import markdown from 'simple-mind-map/src/parse/markdown.js'
|
||||
import { showConfirmationDialog } from './ConfirmDialog.js'
|
||||
import SmmEditView from '../SmmEditView.js'
|
||||
|
||||
export default class Menus {
|
||||
constructor(plugin) {
|
||||
this.plugin = plugin
|
||||
this.app = plugin.app
|
||||
|
||||
this._addFileMenus()
|
||||
}
|
||||
|
||||
_t(key) {
|
||||
return this.plugin._t(key)
|
||||
}
|
||||
|
||||
_addFileMenus() {
|
||||
this.plugin.registerEvent(
|
||||
this.app.workspace.on('file-menu', (menu, file) => {
|
||||
if (file instanceof TFolder) {
|
||||
menu.addItem(item => {
|
||||
item
|
||||
.setTitle(this._t('action.createMindMap'))
|
||||
.setIcon('smm-icon')
|
||||
.onClick(() => {
|
||||
this.plugin._createSmmFile(file.path)
|
||||
})
|
||||
})
|
||||
} else if (file instanceof TFile) {
|
||||
if (this.plugin._isSmmFile(file)) {
|
||||
hideTargetMenu(menu, '在新窗口中打开')
|
||||
hideTargetMenu(menu, '移动至新窗口')
|
||||
menu.addItem(item =>
|
||||
item
|
||||
.setTitle(this._t('action.openAsMd'))
|
||||
.setIcon('document')
|
||||
.setSection('open')
|
||||
.onClick(async () => {
|
||||
await this.app.workspace.openLinkText(file.path, '')
|
||||
const leaf = this.app.workspace.getLeaf(false)
|
||||
const mdViewType = this.app.viewRegistry.getTypeByExtension(
|
||||
'md'
|
||||
)
|
||||
await leaf.setViewState({
|
||||
type: mdViewType,
|
||||
state: {
|
||||
...leaf.getViewState().state,
|
||||
isSwitchToMarkdownViewFromSmmView: true
|
||||
},
|
||||
active: true
|
||||
})
|
||||
this.app.workspace.revealLeaf(leaf)
|
||||
})
|
||||
)
|
||||
menu.addItem(item =>
|
||||
item
|
||||
.setTitle(this._t('action.changeToMdFile'))
|
||||
.setIcon('refresh-cw')
|
||||
.setSection('open')
|
||||
.onClick(async () => {
|
||||
const confirmed = await showConfirmationDialog(this.app, {
|
||||
content: this._t('tip.mindMapToMdTip')
|
||||
})
|
||||
if (!confirmed) {
|
||||
return
|
||||
}
|
||||
const content = await this.app.vault.read(file)
|
||||
const result = parseMarkdownText(content)
|
||||
const mindMapData = LZString.decompressFromBase64(
|
||||
result.metadata.content
|
||||
)
|
||||
let mdStr = ''
|
||||
const tags = result.metadata.tags.filter(tag => {
|
||||
return tag !== SMM_TAG
|
||||
})
|
||||
if (tags.length) {
|
||||
mdStr += 'tags:\n'
|
||||
for (const tag of tags) {
|
||||
mdStr += ` - ${tag}\n`
|
||||
}
|
||||
}
|
||||
if (result.metadata.yaml) {
|
||||
mdStr += result.metadata.yaml
|
||||
}
|
||||
if (mdStr) {
|
||||
mdStr = '---\n' + mdStr + '---\n'
|
||||
}
|
||||
const {
|
||||
nodeTextToMarkdownTitleMaxLevel
|
||||
} = this.plugin.settings
|
||||
const mdMindMap = markdown.transformToMarkdown(
|
||||
JSON.parse(mindMapData).root,
|
||||
nodeTextToMarkdownTitleMaxLevel
|
||||
)
|
||||
mdStr += mdMindMap
|
||||
let newPath = file.path.replace(/\.smm.*\.md$/g, '.md')
|
||||
newPath = await this.plugin._getAvailableFilaName(newPath)
|
||||
await this.app.vault.rename(file, newPath)
|
||||
const renamedFile = this.app.vault.getFileByPath(newPath)
|
||||
if (renamedFile) {
|
||||
this.plugin.markdownPostProcessor.deletePreviewSvgFile(file)
|
||||
this.app.noSaveOnClose = true
|
||||
const markdownLeafs = this.app.workspace.getLeavesOfType(
|
||||
SMM_VIEW_TYPE
|
||||
)
|
||||
for (const leaf of markdownLeafs) {
|
||||
if (
|
||||
leaf.view instanceof SmmEditView &&
|
||||
leaf.view.file.path === renamedFile.path
|
||||
) {
|
||||
leaf.detach()
|
||||
break
|
||||
}
|
||||
}
|
||||
await this.app.vault.modify(renamedFile, mdStr)
|
||||
this.app.noSaveOnClose = false
|
||||
const ref = this.app.metadataCache.on(
|
||||
'changed',
|
||||
changedFile => {
|
||||
if (changedFile.path === renamedFile.path) {
|
||||
this.app.metadataCache.offref(ref)
|
||||
this.app.workspace.openLinkText(
|
||||
renamedFile.path,
|
||||
'',
|
||||
true
|
||||
)
|
||||
new Notice(this._t('tip.changeSuccess'))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
addMarkdownFileMenus() {
|
||||
const self = this
|
||||
this.plugin.register(
|
||||
around(MarkdownView.prototype, {
|
||||
onPaneMenu(next) {
|
||||
return function(menu, source) {
|
||||
const res = next.apply(this, [menu, source])
|
||||
if (self.plugin._isSmmFile(this.file)) {
|
||||
if (source === 'more-options') {
|
||||
menu.addItem(item =>
|
||||
item
|
||||
.setTitle(self._t('action.openAsMindMap'))
|
||||
.setIcon('document')
|
||||
.setSection('pane')
|
||||
.onClick(() => {
|
||||
self.plugin._setSmmView(this.leaf)
|
||||
})
|
||||
)
|
||||
}
|
||||
} else {
|
||||
if (source === 'more-options') {
|
||||
menu.addItem(item =>
|
||||
item
|
||||
.setTitle(self._t('action.previewAsMindMap'))
|
||||
.setIcon('smm-icon')
|
||||
.setSection('pane')
|
||||
.onClick(() => {
|
||||
let previewMindMap = new PreviewMindMap({
|
||||
plugin: self.plugin,
|
||||
file: this.file,
|
||||
onClose: () => {
|
||||
previewMindMap = null
|
||||
}
|
||||
})
|
||||
})
|
||||
)
|
||||
menu.addItem(item =>
|
||||
item
|
||||
.setTitle(self._t('action.changeToMindMapFile'))
|
||||
.setIcon('refresh-cw')
|
||||
.setSection('pane')
|
||||
.onClick(async () => {
|
||||
const confirmed = await showConfirmationDialog(this.app, {
|
||||
content: self._t('tip.mdToMindMapTip')
|
||||
})
|
||||
if (!confirmed) {
|
||||
return
|
||||
}
|
||||
let yaml = ''
|
||||
const tagList = []
|
||||
await this.app.fileManager.processFrontMatter(
|
||||
this.file,
|
||||
frontmatter => {
|
||||
if (frontmatter.tags) {
|
||||
tagList.push(...frontmatter.tags)
|
||||
delete frontmatter.tags
|
||||
}
|
||||
}
|
||||
)
|
||||
if (!tagList.includes(SMM_TAG)) {
|
||||
tagList.push(SMM_TAG)
|
||||
}
|
||||
const content = await this.app.vault.read(this.file)
|
||||
if (content.startsWith('---\n')) {
|
||||
yaml = content.split('---\n')[1]
|
||||
}
|
||||
const mindMapData = await self.plugin._mdToMindmapData(
|
||||
content
|
||||
)
|
||||
if (!mindMapData) {
|
||||
new Notice(self._t('tip.mdToMindMapFail'))
|
||||
return
|
||||
}
|
||||
let newPath = this.file.path.replace('.md', '.smm.md')
|
||||
newPath = await self.plugin._getAvailableFilaName(
|
||||
newPath,
|
||||
2
|
||||
)
|
||||
await this.app.vault.rename(this.file, newPath)
|
||||
const renamedFile = this.app.vault.getFileByPath(newPath)
|
||||
const str = assembleMarkdownText({
|
||||
metadata: {
|
||||
path: `${newPath || ''}`,
|
||||
tags: tagList,
|
||||
yaml: yaml,
|
||||
content: LZString.compressToBase64(
|
||||
JSON.stringify(mindMapData)
|
||||
)
|
||||
},
|
||||
svgdata: '',
|
||||
linkdata: []
|
||||
})
|
||||
if (renamedFile) {
|
||||
const markdownLeafs = this.app.workspace.getLeavesOfType(
|
||||
'markdown'
|
||||
)
|
||||
for (const leaf of markdownLeafs) {
|
||||
if (
|
||||
leaf.view instanceof MarkdownView &&
|
||||
leaf.view.file.path === renamedFile.path
|
||||
) {
|
||||
leaf.detach()
|
||||
break
|
||||
}
|
||||
}
|
||||
await this.app.vault.modify(renamedFile, str)
|
||||
const ref = this.app.metadataCache.on(
|
||||
'changed',
|
||||
changedFile => {
|
||||
if (changedFile.path === renamedFile.path) {
|
||||
this.app.metadataCache.offref(ref)
|
||||
this.app.workspace.openLinkText(
|
||||
renamedFile.path,
|
||||
'',
|
||||
true
|
||||
)
|
||||
new Notice(self._t('tip.changeSuccess'))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
104
src/ob/ModifyFileName.js
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
export default class ModifyFileName {
|
||||
constructor(view) {
|
||||
this.view = view
|
||||
this.plugin = view.plugin
|
||||
this.app = view.app
|
||||
this.titleEl = null
|
||||
}
|
||||
|
||||
setupTitleEditing() {
|
||||
this.titleEl = this.getTitleElement()
|
||||
if (!this.titleEl) return
|
||||
this.titleEl.setAttribute('contenteditable', 'true')
|
||||
this.onBlur = this.onBlur.bind(this)
|
||||
this.titleEl.addEventListener('blur', this.onBlur)
|
||||
this.onKeydown = this.onKeydown.bind(this)
|
||||
this.titleEl.addEventListener('keydown', this.onKeydown)
|
||||
}
|
||||
|
||||
getTitleElement() {
|
||||
return this.view.containerEl.querySelector('.view-header-title')
|
||||
}
|
||||
|
||||
async finishEditing(accept) {
|
||||
if (!this.titleEl.isConnected) return
|
||||
const file = this.view.file
|
||||
if (!file) return
|
||||
const originalName = file.basename
|
||||
if (accept) {
|
||||
const newName = this.titleEl.textContent.trim()
|
||||
if (!newName) {
|
||||
new Notice(this.plugin._t('tip.fileNameEmpty'))
|
||||
return
|
||||
}
|
||||
this.titleEl.innerHTML = newName
|
||||
if (newName === originalName) return
|
||||
try {
|
||||
const parentPath = file.parent.path
|
||||
const extension = file.extension
|
||||
const newPath = `${parentPath}${
|
||||
parentPath !== '/' ? '/' : ''
|
||||
}${newName}${extension ? '.' + extension : ''}`
|
||||
if (!/^[^<>:"/\\|?*]+$/.test(newName)) {
|
||||
new Notice(this.plugin._t('tip.fileNameIllegal'))
|
||||
return
|
||||
}
|
||||
const existingFile =
|
||||
this.app.vault.getFileByPath(newPath) ||
|
||||
this.app.vault.getFileByPath(newPath.replace(/^\//, ''))
|
||||
if (existingFile) {
|
||||
new Notice(this.plugin._t('tip.fileExist'))
|
||||
return
|
||||
}
|
||||
await this.app.fileManager.renameFile(file, newPath)
|
||||
} catch (error) {
|
||||
console.error('重命名文件失败:', error)
|
||||
new Notice(this.plugin._t('tip.fileRenameFail'))
|
||||
}
|
||||
} else {
|
||||
this.titleEl.innerHTML = originalName
|
||||
const selection = window.getSelection()
|
||||
const range = document.createRange()
|
||||
let lastTextNode = null
|
||||
const walker = document.createTreeWalker(
|
||||
this.titleEl,
|
||||
NodeFilter.SHOW_TEXT,
|
||||
null,
|
||||
false
|
||||
)
|
||||
let node
|
||||
while ((node = walker.nextNode())) {
|
||||
lastTextNode = node
|
||||
}
|
||||
range.setStart(
|
||||
lastTextNode,
|
||||
/\.smm$/.test(lastTextNode.textContent)
|
||||
? lastTextNode.length - 4
|
||||
: lastTextNode.length
|
||||
)
|
||||
range.collapse(true)
|
||||
selection.removeAllRanges()
|
||||
selection.addRange(range)
|
||||
}
|
||||
}
|
||||
|
||||
onBlur() {
|
||||
this.finishEditing(true)
|
||||
}
|
||||
|
||||
onKeydown(e) {
|
||||
if (e.key === 'Enter') {
|
||||
this.finishEditing(true)
|
||||
} else if (e.key === 'Escape') {
|
||||
this.finishEditing(false)
|
||||
}
|
||||
}
|
||||
|
||||
unload() {
|
||||
if (this.titleEl) {
|
||||
this.titleEl.removeAttribute('contenteditable')
|
||||
this.titleEl.removeEventListener('blur', this.onBlur)
|
||||
this.titleEl.removeEventListener('keydown', this.onKeydown)
|
||||
}
|
||||
}
|
||||
}
|
||||
59
src/ob/PreviewMindMap.js
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import { initPreviewModeApp } from '../src/main'
|
||||
|
||||
export class PreviewMindMap {
|
||||
constructor({ plugin, file, onClose }) {
|
||||
this.app = plugin.app
|
||||
this.plugin = plugin
|
||||
this.file = file
|
||||
this.onClose = onClose
|
||||
|
||||
this.previewModeApp = null
|
||||
this.container = document.createElement('div')
|
||||
this.wrap = document.createElement('div')
|
||||
this.container.appendChild(this.wrap)
|
||||
this.container.classList.add('smm-preview-md-to-mindmap-container')
|
||||
document.body.appendChild(this.container)
|
||||
this._renderView()
|
||||
}
|
||||
|
||||
async _renderView() {
|
||||
const content = await this.app.vault.read(this.file)
|
||||
const mindMapData = await this.plugin._mdToMindmapData(content)
|
||||
this.previewModeApp = initPreviewModeApp(this.wrap, {
|
||||
getInitMindMapData: () => {
|
||||
return mindMapData
|
||||
},
|
||||
getMindMapOptions: () => {
|
||||
return {
|
||||
readonly: true,
|
||||
fit: true
|
||||
}
|
||||
},
|
||||
getFile: () => {
|
||||
return this.file
|
||||
},
|
||||
getSettings: () => {
|
||||
return this.plugin.settings || {}
|
||||
},
|
||||
getMindMapLocalConfig: () => {
|
||||
const { mindMapLocalConfig, themeMode } = this.plugin.settings
|
||||
const config = mindMapLocalConfig || {}
|
||||
config.isDark =
|
||||
themeMode === 'follow'
|
||||
? this.plugin._getObIsDark()
|
||||
: themeMode === 'dark'
|
||||
return config
|
||||
}
|
||||
})
|
||||
this.previewModeApp.$bus.$on('closePreviewMode', this._close.bind(this))
|
||||
}
|
||||
|
||||
_close() {
|
||||
this.previewModeApp.$destroy()
|
||||
document.body.removeChild(this.container)
|
||||
this.previewModeApp = null
|
||||
this.container = null
|
||||
this.wrap = null
|
||||
this.onClose()
|
||||
}
|
||||
}
|
||||
781
src/ob/SmmSettingTab.js
Normal file
|
|
@ -0,0 +1,781 @@
|
|||
import { PluginSettingTab, Setting, Notice, normalizePath } from 'obsidian'
|
||||
import themeList from 'simple-mind-map-plugin-themes/themeList'
|
||||
import { layoutGroupList } from '../src/config'
|
||||
import { GITHUB_ICON, COMMUNITY_ICON } from './constant'
|
||||
import { DEFAULT_SETTINGS } from './constant'
|
||||
import { SuggestionModal } from './SuggestionModal'
|
||||
import { TextInfoDialog } from './TextInfoDialog'
|
||||
import { fragWithHTML } from './utils'
|
||||
|
||||
const validateInteger = (value, defaultValue = 0, errorTip) => {
|
||||
value = Number(value)
|
||||
if (!Number.isNaN(value) && value > 0) {
|
||||
return value
|
||||
} else {
|
||||
new Notice(errorTip)
|
||||
return defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
export default class SmmSettingTab extends PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin)
|
||||
this.plugin = plugin
|
||||
this.filePathSettings = null
|
||||
this.imagePathSettings = null
|
||||
this.imageSubPathSettings = null
|
||||
this.attachmentPathSettings = null
|
||||
this.attachmentSubPathSettings = null
|
||||
this.compressImageOptionsMaxWidthSettings = null
|
||||
this.compressImageOptionsMaxHeightSettings = null
|
||||
this.compressImageOptionsQualitySettings = null
|
||||
this.embedImageIsSeparateFileFolderSettings = null
|
||||
}
|
||||
|
||||
display() {
|
||||
const { containerEl } = this
|
||||
containerEl.empty()
|
||||
|
||||
this._addBaseSetting()
|
||||
|
||||
this._addFileSaveSetting()
|
||||
|
||||
this._addCompressSetting()
|
||||
|
||||
this._addImageHostingSetting()
|
||||
|
||||
this._addEmbedSetting()
|
||||
|
||||
this._addHelpInfo()
|
||||
}
|
||||
|
||||
_addBaseSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.autoSave.title'))
|
||||
.setDesc(this.plugin._t('setting.autoSave.desc'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.autoSaveTime))
|
||||
.onChange(async value => {
|
||||
value = validateInteger(
|
||||
value,
|
||||
DEFAULT_SETTINGS.autoSaveTime,
|
||||
this.plugin._t('tip.integerInputError')
|
||||
)
|
||||
this.plugin.settings.autoSaveTime = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.themeMode.title'))
|
||||
.setDesc(this.plugin._t('setting.themeMode.desc'))
|
||||
.addDropdown(dropdown => {
|
||||
;[
|
||||
{
|
||||
name: this.plugin._t('setting.themeMode.option1'),
|
||||
value: 'follow'
|
||||
},
|
||||
{
|
||||
name: this.plugin._t('setting.themeMode.option2'),
|
||||
value: 'light'
|
||||
},
|
||||
{
|
||||
name: this.plugin._t('setting.themeMode.option3'),
|
||||
value: 'dark'
|
||||
}
|
||||
].forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.themeMode)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.themeMode = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
const allThemeList = [
|
||||
{
|
||||
name: this.plugin._t('setting.theme.title'),
|
||||
value: 'default',
|
||||
dark: false
|
||||
},
|
||||
...themeList
|
||||
].reverse()
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.theme.title'))
|
||||
.setDesc(this.plugin._t('setting.theme.desc'))
|
||||
.addDropdown(dropdown => {
|
||||
allThemeList.forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.defaultTheme)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.defaultTheme = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.theme.title2'))
|
||||
.setDesc(this.plugin._t('setting.theme.desc2'))
|
||||
.addDropdown(dropdown => {
|
||||
allThemeList.forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.defaultThemeDark)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.defaultThemeDark = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
const allLayoutList = []
|
||||
;(layoutGroupList[this.plugin.settings.lang] || layoutGroupList.en).forEach(
|
||||
item => {
|
||||
allLayoutList.push(
|
||||
...item.list.map((item2, index) => {
|
||||
return {
|
||||
name: item.name + (item.list.length > 1 ? index + 1 : ''),
|
||||
value: item2
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
)
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.layout.title'))
|
||||
.setDesc(this.plugin._t('setting.layout.desc'))
|
||||
.addDropdown(dropdown => {
|
||||
allLayoutList.forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.defaultLayout)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.defaultLayout = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
_addFileSaveSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
this._setHeader(containerEl, this.plugin._t('setting.title.title2'))
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.file.title1'))
|
||||
.setDesc(this.plugin._t('setting.file.desc1'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.fileNameFormat)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.fileNameFormat = value.trim()
|
||||
? value.trim()
|
||||
: DEFAULT_SETTINGS.fileNameFormat
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
.addExtraButton(button =>
|
||||
button
|
||||
.setIcon('help')
|
||||
.setTooltip(this.plugin._t('setting.file.filenameFormatDesc'))
|
||||
.onClick(async () => {
|
||||
new TextInfoDialog(this.app, {
|
||||
title: this.plugin._t('setting.file.filenameFormatDesc'),
|
||||
html: this.plugin._t('html.filenameFormatDesc')
|
||||
}).open()
|
||||
})
|
||||
)
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.file.title3'))
|
||||
.setDesc(this.plugin._t('setting.file.desc3'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.nodePasteImageNameFormat)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.nodePasteImageNameFormat = value.trim()
|
||||
? value.trim()
|
||||
: DEFAULT_SETTINGS.nodePasteImageNameFormat
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
.addExtraButton(button =>
|
||||
button
|
||||
.setIcon('help')
|
||||
.setTooltip(this.plugin._t('setting.file.filenameFormatDesc'))
|
||||
.onClick(async () => {
|
||||
new TextInfoDialog(this.app, {
|
||||
title: this.plugin._t('setting.file.filenameFormatDesc'),
|
||||
html: this.plugin._t('html.filenameFormatDesc')
|
||||
}).open()
|
||||
})
|
||||
)
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title4'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc4'))
|
||||
.addDropdown(dropdown => {
|
||||
this._getFilePathOptions().forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.filePathType)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.filePathType = value
|
||||
await this.plugin._saveSettings()
|
||||
this._updateFilePathSettingsVisibility()
|
||||
})
|
||||
})
|
||||
this.filePathSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title1'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc1'))
|
||||
.addText(text => {
|
||||
text.setValue(this.plugin.settings.filePath).onChange(async value => {
|
||||
this.plugin.settings.filePath = normalizePath(value)
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.filePath = normalizePath(selected)
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.filePathSettings.settingEl.className += ' smm-setting-sub-item'
|
||||
this._updateFilePathSettingsVisibility()
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title5'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc5'))
|
||||
.addDropdown(dropdown => {
|
||||
this._getFilePathOptions(true).forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.imagePathType)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.imagePathType = value
|
||||
await this.plugin._saveSettings()
|
||||
this._updateImagePathSettingsVisibility()
|
||||
})
|
||||
})
|
||||
this.imagePathSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title2'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc2'))
|
||||
.addText(text => {
|
||||
text.setValue(this.plugin.settings.imagePath).onChange(async value => {
|
||||
this.plugin.settings.imagePath = normalizePath(value)
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.imagePath = normalizePath(selected)
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.imagePathSettings.settingEl.className += ' smm-setting-sub-item'
|
||||
this.imageSubPathSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title6'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc6'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.imageSubPath)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.imageSubPath = normalizePath(value)
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.imageSubPath = normalizePath(selected)
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.imageSubPathSettings.settingEl.className += ' smm-setting-sub-item'
|
||||
this._updateImagePathSettingsVisibility()
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title7'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc7'))
|
||||
.addDropdown(dropdown => {
|
||||
this._getFilePathOptions(true).forEach(item => {
|
||||
dropdown.addOption(item.value, item.name)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.attachmentPathType)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.attachmentPathType = value
|
||||
await this.plugin._saveSettings()
|
||||
this._updateAttachmentPathSettingsVisibility()
|
||||
})
|
||||
})
|
||||
this.attachmentPathSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title3'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc3'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.attachmentPath)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.attachmentPath = normalizePath(value)
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.attachmentPath = normalizePath(selected)
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.attachmentPathSettings.settingEl.className += ' smm-setting-sub-item'
|
||||
this.attachmentSubPathSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title6'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc6'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.attachmentSubPath)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.attachmentSubPath = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.attachmentSubPath = selected
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.attachmentSubPathSettings.settingEl.className +=
|
||||
' smm-setting-sub-item'
|
||||
this._updateAttachmentPathSettingsVisibility()
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title8'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc8'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.supportObSearch)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.supportObSearch = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title9'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc9'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.saveCanvasViewData)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.saveCanvasViewData = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.folder.title10'))
|
||||
.setDesc(this.plugin._t('setting.folder.desc10'))
|
||||
.addDropdown(dropdown => {
|
||||
new Array(6).fill(0).forEach((_, index) => {
|
||||
dropdown.addOption(index + 1, index + 1)
|
||||
})
|
||||
dropdown
|
||||
.setValue(this.plugin.settings.nodeTextToMarkdownTitleMaxLevel)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.nodeTextToMarkdownTitleMaxLevel = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
_addCompressSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
this._setHeader(containerEl, this.plugin._t('setting.title.title3'))
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.compress.title1'))
|
||||
.setDesc(this.plugin._t('setting.compress.desc1'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.compressImage)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.compressImage = value
|
||||
await this.plugin._saveSettings()
|
||||
this._updateCompressImageSettingsVisibility()
|
||||
})
|
||||
})
|
||||
|
||||
this.compressImageOptionsMaxWidthSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.compress.title2'))
|
||||
.setDesc(this.plugin._t('setting.compress.desc2'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.compressImageOptionsMaxWidth))
|
||||
.onChange(async value => {
|
||||
value = validateInteger(
|
||||
value,
|
||||
DEFAULT_SETTINGS.compressImageOptionsMaxWidth,
|
||||
this.plugin._t('tip.integerInputError')
|
||||
)
|
||||
this.plugin.settings.compressImageOptionsMaxWidth = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.compressImageOptionsMaxWidthSettings.settingEl.className +=
|
||||
' smm-setting-sub-item'
|
||||
this.compressImageOptionsMaxHeightSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.compress.title3'))
|
||||
.setDesc(this.plugin._t('setting.compress.desc3'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.compressImageOptionsMaxHeight))
|
||||
.onChange(async value => {
|
||||
value = validateInteger(
|
||||
value,
|
||||
DEFAULT_SETTINGS.compressImageOptionsMaxHeight,
|
||||
this.plugin._t('tip.integerInputError')
|
||||
)
|
||||
this.plugin.settings.compressImageOptionsMaxHeight = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.compressImageOptionsMaxHeightSettings.settingEl.className +=
|
||||
' smm-setting-sub-item'
|
||||
this.compressImageOptionsQualitySettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.compress.title4'))
|
||||
.setDesc(
|
||||
`${this.plugin._t('setting.compress.desc4')},${this.plugin._t(
|
||||
'setting.compress.curValue'
|
||||
)}: ${this.plugin.settings.compressImageOptionsQuality}`
|
||||
)
|
||||
.addSlider(slider =>
|
||||
slider
|
||||
.setLimits(0, 1, 0.1)
|
||||
.setValue(this.plugin.settings.compressImageOptionsQuality)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.compressImageOptionsQuality = value
|
||||
this.compressImageOptionsQualitySettings?.setDesc(
|
||||
`${this.plugin._t('setting.compress.desc4')},${this.plugin._t(
|
||||
'setting.compress.curValue'
|
||||
)}: ${value}`
|
||||
)
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
)
|
||||
.addExtraButton(button =>
|
||||
button
|
||||
.setIcon('reset')
|
||||
.setTooltip(this.plugin._t('setting.compress.reset'))
|
||||
.onClick(async () => {
|
||||
const defaultValue = DEFAULT_SETTINGS.compressImageOptionsQuality
|
||||
this.plugin.settings.compressImageOptionsQuality = defaultValue
|
||||
const sliderEl = this.compressImageOptionsQualitySettings
|
||||
?.components[0]
|
||||
if (sliderEl) {
|
||||
sliderEl.setValue(defaultValue)
|
||||
this.plugin.settings.compressImageOptionsQuality = defaultValue
|
||||
this.compressImageOptionsQualitySettings?.setDesc(
|
||||
`${this.plugin._t(
|
||||
'setting.compress.curValue'
|
||||
)}: ${defaultValue}`
|
||||
)
|
||||
}
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
)
|
||||
this.compressImageOptionsQualitySettings.settingEl.className +=
|
||||
' smm-setting-sub-item'
|
||||
this._updateCompressImageSettingsVisibility()
|
||||
}
|
||||
|
||||
_addEmbedSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
this._setHeader(containerEl, this.plugin._t('setting.title.title4'))
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.embed.title3'))
|
||||
.setDesc(this.plugin._t('setting.embed.desc3'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.embedImageIsSeparateFile)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.embedImageIsSeparateFile = value
|
||||
this._updateEmbedImageFileFolderSettingsVisibility()
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
this.embedImageIsSeparateFileFolderSettings = new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.embed.title4'))
|
||||
.setDesc(this.plugin._t('setting.embed.desc4'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(this.plugin.settings.embedImageIsSeparateFileFolder)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.embedImageIsSeparateFileFolder = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
this._addFolderSelectBtn(text, selected => {
|
||||
this.plugin.settings.embedImageIsSeparateFileFolder = selected
|
||||
this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
this.embedImageIsSeparateFileFolderSettings.settingEl.className +=
|
||||
' smm-setting-sub-item'
|
||||
this._updateEmbedImageFileFolderSettingsVisibility()
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.embed.title2'))
|
||||
.setDesc(this.plugin._t('setting.embed.desc2'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.compressImageIsTransparent)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.compressImageIsTransparent = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.embed.title1'))
|
||||
.setDesc(this.plugin._t('setting.embed.desc1'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.embedDblClickNewWindow)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.embedDblClickNewWindow = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.embed.title5'))
|
||||
.setDesc(this.plugin._t('setting.embed.desc5'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.embedLinkNewWindowOpen)
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.embedLinkNewWindowOpen = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
_addFolderSelectBtn(text, callback = () => {}) {
|
||||
const inputEl = text.inputEl
|
||||
const suggestionButton = inputEl.parentElement?.createEl('button', {
|
||||
text: this.plugin._t('setting.button.select'),
|
||||
cls: 'suggestion-button'
|
||||
})
|
||||
suggestionButton?.addEventListener('click', () => {
|
||||
new SuggestionModal({
|
||||
plugin: this.plugin,
|
||||
type: 'folder',
|
||||
app: this.app,
|
||||
onSelect: selected => {
|
||||
text.setValue(selected)
|
||||
inputEl.focus()
|
||||
callback(selected)
|
||||
}
|
||||
}).open()
|
||||
})
|
||||
}
|
||||
|
||||
_getFilePathOptions(full = false) {
|
||||
const res = [
|
||||
{
|
||||
name: this.plugin._t('setting.folder.option1'),
|
||||
value: 'root'
|
||||
},
|
||||
{
|
||||
name: this.plugin._t('setting.folder.option2'),
|
||||
value: 'custom'
|
||||
},
|
||||
{
|
||||
name: this.plugin._t('setting.folder.option3'),
|
||||
value: 'currentFileFolder'
|
||||
}
|
||||
]
|
||||
if (full) {
|
||||
res.push({
|
||||
name: this.plugin._t('setting.folder.option4'),
|
||||
value: 'currentFileFolderSubFolder'
|
||||
})
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
_updateEmbedImageFileFolderSettingsVisibility() {
|
||||
const isVisible = this.plugin.settings.embedImageIsSeparateFile
|
||||
if (this.embedImageIsSeparateFileFolderSettings) {
|
||||
this.embedImageIsSeparateFileFolderSettings.settingEl.classList[
|
||||
isVisible ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
}
|
||||
|
||||
_updateFilePathSettingsVisibility() {
|
||||
const isVisible = this.plugin.settings.filePathType === 'custom'
|
||||
if (this.filePathSettings) {
|
||||
this.filePathSettings.settingEl.classList[isVisible ? 'remove' : 'add'](
|
||||
'smm-setting-item-hide'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
_updateImagePathSettingsVisibility() {
|
||||
const isVisible = this.plugin.settings.imagePathType === 'custom'
|
||||
if (this.imagePathSettings) {
|
||||
this.imagePathSettings.settingEl.classList[isVisible ? 'remove' : 'add'](
|
||||
'smm-setting-item-hide'
|
||||
)
|
||||
}
|
||||
const isVisibleSub =
|
||||
this.plugin.settings.imagePathType === 'currentFileFolderSubFolder'
|
||||
if (this.imageSubPathSettings) {
|
||||
this.imageSubPathSettings.settingEl.classList[
|
||||
isVisibleSub ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
}
|
||||
|
||||
_updateAttachmentPathSettingsVisibility() {
|
||||
const isVisible = this.plugin.settings.attachmentPathType === 'custom'
|
||||
if (this.attachmentPathSettings) {
|
||||
this.attachmentPathSettings.settingEl.classList[
|
||||
isVisible ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
const isVisibleSub =
|
||||
this.plugin.settings.attachmentPathType === 'currentFileFolderSubFolder'
|
||||
if (this.attachmentSubPathSettings) {
|
||||
this.attachmentSubPathSettings.settingEl.classList[
|
||||
isVisibleSub ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
}
|
||||
|
||||
_updateCompressImageSettingsVisibility() {
|
||||
const isVisible = this.plugin.settings.compressImage
|
||||
if (this.compressImageOptionsMaxWidthSettings) {
|
||||
this.compressImageOptionsMaxWidthSettings.settingEl.classList[
|
||||
isVisible ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
if (this.compressImageOptionsMaxHeightSettings) {
|
||||
this.compressImageOptionsMaxHeightSettings.settingEl.classList[
|
||||
isVisible ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
if (this.compressImageOptionsQualitySettings) {
|
||||
this.compressImageOptionsQualitySettings.settingEl.classList[
|
||||
isVisible ? 'remove' : 'add'
|
||||
]('smm-setting-item-hide')
|
||||
}
|
||||
}
|
||||
|
||||
_addImageHostingSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
this._setHeader(containerEl, this.plugin._t('setting.title.title6'))
|
||||
|
||||
// 是否开启图床
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.imageHosting.title1'))
|
||||
.setDesc(this.plugin._t('setting.imageHosting.desc1'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.useImgHosting)
|
||||
.onChange(async value => {
|
||||
if (
|
||||
value &&
|
||||
(!this.plugin.settings.imgHostingUrl ||
|
||||
!this.plugin.settings.imgHostingFormField ||
|
||||
!this.plugin.settings.imgHostingResponseField)
|
||||
) {
|
||||
toggle.setValue(false)
|
||||
new Notice(this.plugin._t('setting.imageHosting.tip1'))
|
||||
return
|
||||
}
|
||||
this.plugin.settings.useImgHosting = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
// 图床url
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.imageHosting.title2'))
|
||||
.setDesc(this.plugin._t('setting.imageHosting.desc2'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.imgHostingUrl))
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.imgHostingUrl = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
// 表单字段
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.imageHosting.title3'))
|
||||
.setDesc(this.plugin._t('setting.imageHosting.desc3'))
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.imgHostingFormField))
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.imgHostingFormField = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
|
||||
// 接口响应结构
|
||||
new Setting(containerEl)
|
||||
.setName(this.plugin._t('setting.imageHosting.title4'))
|
||||
.setDesc(
|
||||
fragWithHTML(
|
||||
this.plugin._t('setting.imageHosting.desc4') +
|
||||
'<a href="https://github.com/wanglin2/obsidian-simplemindmap/blob/main/docs/imageHosting.md" target="_blank">' +
|
||||
this.plugin._t('setting.imageHosting.desc5') +
|
||||
'</a>。'
|
||||
)
|
||||
)
|
||||
.addText(text => {
|
||||
text
|
||||
.setValue(String(this.plugin.settings.imgHostingResponseField))
|
||||
.onChange(async value => {
|
||||
this.plugin.settings.imgHostingResponseField = value
|
||||
await this.plugin._saveSettings()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
_addOtherSetting() {
|
||||
const { containerEl } = this
|
||||
|
||||
this._setHeader(containerEl, this.plugin._t('setting.title.title5'))
|
||||
}
|
||||
|
||||
// 设置标题
|
||||
_setHeader(containerEl, title) {
|
||||
new Setting(containerEl).setName(title).setHeading()
|
||||
}
|
||||
|
||||
_addHelpInfo() {
|
||||
const { containerEl } = this
|
||||
const linkEl = containerEl.createDiv('setting-item smm-setting-link-list')
|
||||
linkEl.innerHTML = `
|
||||
<div class="smm-setting-link-item">
|
||||
<a href="https://github.com/wanglin2/obsidian-simplemindmap/issues" target="_blank">
|
||||
${GITHUB_ICON}
|
||||
<span>${this.plugin._t('setting.linkInfo.issues')}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="smm-setting-link-item">
|
||||
<a href="https://forum.pkmer.net/" target="_blank">
|
||||
${COMMUNITY_ICON}
|
||||
<span>${this.plugin._t('setting.linkInfo.community')}</span>
|
||||
</a>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
39
src/ob/SuggestionModal.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import { SuggestModal } from 'obsidian'
|
||||
|
||||
export class SuggestionModal extends SuggestModal {
|
||||
constructor({ plugin, app, getSuggestions, onSelect, type }) {
|
||||
super(app)
|
||||
this.plugin = plugin
|
||||
this.emptyStateText = this.plugin._t('tip.noMatchResult')
|
||||
this.type = type
|
||||
if (this.type === 'folder') {
|
||||
this.getSuggestions = this._queryFolders.bind(this)
|
||||
} else {
|
||||
this.getSuggestions = getSuggestions
|
||||
}
|
||||
this.onSelect = onSelect
|
||||
}
|
||||
|
||||
_queryFolders(query) {
|
||||
const list = this.app.vault.getAllFolders()
|
||||
return list
|
||||
.filter(item => {
|
||||
return item.path.toLowerCase().includes(query)
|
||||
})
|
||||
.map(item => {
|
||||
return item.path
|
||||
})
|
||||
}
|
||||
|
||||
getSuggestions(query) {
|
||||
return this.getSuggestions(query)
|
||||
}
|
||||
|
||||
renderSuggestion(suggestion, el) {
|
||||
el.createEl('div', { text: suggestion })
|
||||
}
|
||||
|
||||
onChooseSuggestion(suggestion) {
|
||||
this.onSelect(suggestion)
|
||||
}
|
||||
}
|
||||
34
src/ob/TextInfoDialog.js
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import { Modal } from 'obsidian'
|
||||
import i18n from 'i18next'
|
||||
|
||||
export class TextInfoDialog extends Modal {
|
||||
constructor(app, params = {}) {
|
||||
super(app)
|
||||
this.params = {
|
||||
title: '',
|
||||
html: '',
|
||||
closeText: i18n.t('tip.close'),
|
||||
...params
|
||||
}
|
||||
this.setTitle(this.params.title)
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
const { contentEl } = this
|
||||
contentEl.empty()
|
||||
const contentContainer = contentEl.createDiv('smm-text-info-dialog-content')
|
||||
contentContainer.innerHTML = this.params.html
|
||||
const buttonContainer = contentEl.createDiv('smm-text-info-dialog-buttons')
|
||||
const closeBtn = buttonContainer.createEl('button', {
|
||||
text: this.params.closeText
|
||||
})
|
||||
closeBtn.addEventListener('click', () => {
|
||||
this.close()
|
||||
})
|
||||
}
|
||||
|
||||
onClose() {
|
||||
const { contentEl } = this
|
||||
contentEl.empty()
|
||||
}
|
||||
}
|
||||
90
src/ob/constant.js
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
export const SMM_VIEW_TYPE = 'smm'
|
||||
|
||||
export const SMM_TAG = 'simplemindmap'
|
||||
|
||||
export const getDefaultSmmData = (options = {}) => {
|
||||
const theme = options.theme || 'classic13'
|
||||
const layout = options.layout || 'logicalStructure'
|
||||
const rootNodeDefaultText = options.rootNodeDefaultText || 'Root node' // 根节点
|
||||
const secondNodeDefaultText = options.secondNodeDefaultText || 'Second node' // 二级节点
|
||||
const branchNodeDefaultText = options.branchNodeDefaultText || 'Branch node' // 分支主题
|
||||
return {
|
||||
root: {
|
||||
data: { text: rootNodeDefaultText },
|
||||
children: [
|
||||
{
|
||||
data: { text: secondNodeDefaultText },
|
||||
children: [
|
||||
{ data: { text: branchNodeDefaultText }, children: [] },
|
||||
{ data: { text: branchNodeDefaultText }, children: [] }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
theme: { template: theme, config: {} },
|
||||
layout
|
||||
}
|
||||
}
|
||||
|
||||
export const DEFAULT_SETTINGS = {
|
||||
isFirstUse: true,
|
||||
fileNameFormat: 'MindMap {date:YYYY-MM-DD HH.mm.ss}',
|
||||
lang: 'zh',
|
||||
themeMode: 'follow',
|
||||
defaultLayout: 'logicalStructure',
|
||||
defaultTheme: 'classic13',
|
||||
defaultThemeDark: 'classic',
|
||||
filePathType: 'root',
|
||||
filePath: '',
|
||||
imagePathType: 'currentFileFolder',
|
||||
imagePath: '',
|
||||
imageSubPath: '',
|
||||
attachmentPathType: 'currentFileFolder',
|
||||
attachmentPath: '',
|
||||
attachmentSubPath: '',
|
||||
compressImage: true,
|
||||
compressImageOptionsMaxWidth: 1200,
|
||||
compressImageOptionsMaxHeight: 1200,
|
||||
compressImageOptionsQuality: 0.8,
|
||||
compressImageIsTransparent: false,
|
||||
embedDblClickNewWindow: true,
|
||||
autoSaveTime: 5,
|
||||
mindMapConfig: null,
|
||||
mindMapLocalConfig: null,
|
||||
supportObSearch: true,
|
||||
saveCanvasViewData: true,
|
||||
nodeTextToMarkdownTitleMaxLevel: 3,
|
||||
embedImageIsSeparateFile: true,
|
||||
embedImageIsSeparateFileFolder: '.smm-embed-image-files',
|
||||
nodePasteImageNameFormat: '{notename}_pasteImage',
|
||||
embedLinkNewWindowOpen: true,
|
||||
useImgHosting: false,
|
||||
imgHostingUrl: 'http://127.0.0.1:36677/upload',
|
||||
imgHostingFormField: 'files',
|
||||
imgHostingResponseField: 'data.result[0]'
|
||||
}
|
||||
|
||||
let smmEditViewCount = 0
|
||||
export const getSmmEditViewCount = () => {
|
||||
return smmEditViewCount++
|
||||
}
|
||||
|
||||
export const IGNORE_CHECK_SMM = 'ignoreCheckSmm'
|
||||
|
||||
export const SIDE_BAR_ICON = `<svg viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M981.333333 473.173333H564.053333a42.666667 42.666667 0 0 0 0 85.333334h417.28a42.666667 42.666667 0 0 0 0-85.333334zM981.333333 838.186667H564.053333a42.666667 42.666667 0 0 0 0 85.333333h417.28a42.666667 42.666667 0 0 0 0-85.333333zM564.053333 193.493333h417.28a42.666667 42.666667 0 0 0 0-85.333333H564.053333a42.666667 42.666667 0 0 0 0 85.333333zM398.293333 515.84a42.666667 42.666667 0 0 0-42.666666-42.666667h-89.173334a526.933333 526.933333 0 0 0 27.52-117.12c13.653333-88.96 26.24-149.333333 75.093334-164.906666a42.666667 42.666667 0 1 0-27.093334-80.853334c-101.76 33.92-118.826667 144.213333-132.48 232.746667-15.146667 99.2-25.813333 130.133333-62.506666 130.133333H42.666667a42.666667 42.666667 0 0 0 0 85.333334h104.32c36.693333 0 47.36 30.933333 62.506666 130.133333 13.653333 88.533333 30.72 198.613333 132.48 232.746667a42.666667 42.666667 0 0 0 13.653334 2.133333 42.666667 42.666667 0 0 0 13.44-83.2c-48.853333-16.213333-61.44-75.733333-75.093334-164.693333a526.933333 526.933333 0 0 0-27.52-117.12h89.173334a42.666667 42.666667 0 0 0 42.666666-42.666667z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const SAVE_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon"><path d="M486.577954 156.09136h101.688183v203.376366a101.688183 101.688183 0 0 1-101.688183 101.688183h-152.532274a101.688183 101.688183 0 0 1-101.688182-101.688183v-203.376366h101.688182v203.376366h152.532274z m-279.642502-101.688182H610.129096a152.532274 152.532274 0 0 1 108.806356 47.285005l208.460774 217.612711a152.532274 152.532274 0 0 1 42.200596 105.247269v392.516385a152.532274 152.532274 0 0 1-152.532274 152.532274h-610.129096a152.532274 152.532274 0 0 1-152.532274-152.532274v-610.129096a152.532274 152.532274 0 0 1 152.532274-152.532274z m0 101.688182a50.844091 50.844091 0 0 0-50.844092 50.844092v610.129096a50.844091 50.844091 0 0 0 50.844092 50.844092h610.129096a50.844091 50.844091 0 0 0 50.844092-50.844092V424.548163a50.844091 50.844091 0 0 0-14.236346-35.082423L645.71996 171.853029a50.844091 50.844091 0 0 0-35.590864-15.761669z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const IMPORT_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon"><path d="M112.64 896a48.704 48.704 0 0 1-48.576-48.768V175.936a48.064 48.064 0 0 1 47.936-48H512a48.064 48.064 0 0 1 0 96H160v576h704V537.92a48.064 48.064 0 0 1 96 0v309.952a48.064 48.064 0 0 1-48.128 47.936z m409.6-192h-1.792a47.616 47.616 0 0 1-34.048-16.064 40.064 40.064 0 0 1-2.624-3.136l-89.6-119.872a48 48 0 0 1 76.8-57.6l22.016 29.312a698.624 698.624 0 0 1 107.136-216.384c90.56-123.84 201.6-192 312.512-192a48.064 48.064 0 1 1 0 96 318.144 318.144 0 0 0-234.88 152.704 618.624 618.624 0 0 0-86.976 168.256l23.104-17.344a48 48 0 1 1 57.6 76.8l-117.696 88.192a47.552 47.552 0 0 1-22.656 10.688h-8.512z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const EXPORT_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon" stroke="currentColor"><path d="M849.2 599v217H178.5V599c-0.7-23.7-20.1-42.7-44-42.7s-43.3 19-44 42.7v252.5c0 28.9 23.6 52.5 52.5 52.5h741.7c28.9 0 52.5-23.6 52.5-52.5V599c-0.7-23.7-20.1-42.7-44-42.7s-43.3 19-44 42.7z" fill="currentColor"></path><path d="M482.7 135.4l-164 164c-17.1 17.1-17.1 45.1 0 62.2s45.1 17.1 62.2 0l85.7-85.7v314.8c0 26 21.3 47.2 47.2 47.2 26 0 47.2-21.3 47.2-47.2V276l85.7 85.7c17.1 17.1 45.1 17.1 62.2 0s17.1-45.1 0-62.2l-164-164c-17.1-17.2-45.1-17.2-62.2-0.1z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const OUTLINE_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon" stroke="currentColor"><path d="M128 96h512a64 64 0 0 1 64 64v64a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64V160a64 64 0 0 1 64-64z m32 64a32 32 0 1 0 0 64h448a32 32 0 0 0 0-64H160z m224 576h512a64 64 0 0 1 64 64v64a64 64 0 0 1-64 64H384a64 64 0 0 1-64-64v-64a64 64 0 0 1 64-64z m32 64a32 32 0 0 0 0 64h448a32 32 0 0 0 0-64H416z m-32-384h512a64 64 0 0 1 64 64v64a64 64 0 0 1-64 64H384a64 64 0 0 1-64-64v-64a64 64 0 0 1 64-64z m32 64a32 32 0 0 0 0 64h448a32 32 0 0 0 0-64H416z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const MINDMAP_ICON = `<svg viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon" stroke="currentColor"><path d="M981.333333 473.173333H564.053333a42.666667 42.666667 0 0 0 0 85.333334h417.28a42.666667 42.666667 0 0 0 0-85.333334zM981.333333 838.186667H564.053333a42.666667 42.666667 0 0 0 0 85.333333h417.28a42.666667 42.666667 0 0 0 0-85.333333zM564.053333 193.493333h417.28a42.666667 42.666667 0 0 0 0-85.333333H564.053333a42.666667 42.666667 0 0 0 0 85.333333zM398.293333 515.84a42.666667 42.666667 0 0 0-42.666666-42.666667h-89.173334a526.933333 526.933333 0 0 0 27.52-117.12c13.653333-88.96 26.24-149.333333 75.093334-164.906666a42.666667 42.666667 0 1 0-27.093334-80.853334c-101.76 33.92-118.826667 144.213333-132.48 232.746667-15.146667 99.2-25.813333 130.133333-62.506666 130.133333H42.666667a42.666667 42.666667 0 0 0 0 85.333334h104.32c36.693333 0 47.36 30.933333 62.506666 130.133333 13.653333 88.533333 30.72 198.613333 132.48 232.746667a42.666667 42.666667 0 0 0 13.653334 2.133333 42.666667 42.666667 0 0 0 13.44-83.2c-48.853333-16.213333-61.44-75.733333-75.093334-164.693333a526.933333 526.933333 0 0 0-27.52-117.12h89.173334a42.666667 42.666667 0 0 0 42.666666-42.666667z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const PRINT_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="256" height="256" class="svg-icon" stroke="currentColor"><path d="M864 352V154.7c0-17.1-6.8-33.4-18.9-45.4l-91.4-90.7C741.7 6.7 725.5 0 708.6 0H160v352H96c-53 0-96 43-96 96v384h160v128c0 35.3 28.7 64 64 64h576c35.3 0 64-28.7 64-64V832h160V352H864zM224 64h478c4.2 0 8.3 1.7 11.3 4.6l82 81.3c3 3 4.7 7.1 4.7 11.4V528H224V64z m544 896H256c-17.7 0-32-14.3-32-32V720h576v208c0 17.7-14.3 32-32 32z m192-192h-96V656H160v112H64V448c0-17.7 14.3-32 32-32h64v176h704V416h96v352z" fill="currentColor"></path><path d="M912 432c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const GITHUB_ICON = `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="48" height="48" stroke="currentColor"><path d="M511.957333 21.333333C241.024 21.333333 21.333333 240.981333 21.333333 512c0 216.832 140.544 400.725333 335.573334 465.664 24.490667 4.394667 32.256-10.069333 32.256-23.082667 0-11.690667 0.256-44.245333 0-85.205333-136.448 29.610667-164.736-64.64-164.736-64.64-22.314667-56.704-54.4-71.765333-54.4-71.765333-44.586667-30.464 3.285333-29.824 3.285333-29.824 49.194667 3.413333 75.178667 50.517333 75.178667 50.517333 43.776 75.008 114.816 53.333333 142.762666 40.789333 4.522667-31.658667 17.152-53.376 31.189334-65.536-108.970667-12.458667-223.488-54.485333-223.488-242.602666 0-53.546667 19.114667-97.322667 50.517333-131.669334-5.034667-12.330667-21.930667-62.293333 4.778667-129.834666 0 0 41.258667-13.184 134.912 50.346666a469.802667 469.802667 0 0 1 122.88-16.554666c41.642667 0.213333 83.626667 5.632 122.88 16.554666 93.653333-63.488 134.784-50.346667 134.784-50.346666 26.752 67.541333 9.898667 117.504 4.864 129.834666 31.402667 34.346667 50.474667 78.122667 50.474666 131.669334 0 188.586667-114.730667 230.016-224.042666 242.090666 17.578667 15.232 33.578667 44.672 33.578666 90.453334v135.850666c0 13.141333 7.936 27.605333 32.853334 22.869334C862.250667 912.597333 1002.666667 728.746667 1002.666667 512 1002.666667 240.981333 783.018667 21.333333 511.957333 21.333333z" fill="currentColor"></path></svg>`
|
||||
|
||||
export const COMMUNITY_ICON = `<svg viewBox="0 0 1031 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="48" height="48" stroke="currentColor"><path d="M88.58011 231.028071a80.407056 80.407056 0 0 0-80.407057 79.106798v475.337354a80.453494 80.453494 0 0 0 81.660877 83.588046h99.539432l153.128656 153.778786 153.128656-153.778786h319.00449c21.77933 0 42.606685-8.799964 57.768627-24.426284a80.476713 80.476713 0 0 0 22.61521-58.511632v-69.540611h54.239355a80.407056 80.407056 0 0 0 79.756927-80.383837V160.837332a80.383837 80.383837 0 0 0-80.383838-80.383838H222.553172a80.407056 80.407056 0 0 0-80.407056 80.383838V231.028071H88.58011z m806.46211 421.724911V310.134869a80.360619 80.360619 0 0 0-80.383837-79.106798H205.974876V160.837332c0-9.171466 7.430049-16.578296 16.578296-16.578296h726.078273c9.148247 0 16.578296 7.40683 16.578296 16.578296v475.337354c0 9.171466-7.430049 16.601515-16.578296 16.601515h-53.589225zM72.001814 311.411909c0-9.171466 7.430049-16.601515 16.601515-16.601515h726.078273a16.578296 16.578296 0 0 1 16.578296 15.324475v475.337354c0 9.171466-7.430049 16.578296-16.578296 16.578296H471.390141l-127.611083 127.611084-127.611084-127.611084H88.58011a16.601515 16.601515 0 0 1-16.601515-16.578296V311.411909z m0 474.060314" fill="currentColor"></path><path d="M712.541653 548.105392a50.385017 50.385017 0 1 0-100.770033-0.046438 50.385017 50.385017 0 0 0 100.770033 0.046438z m0 0M502.015872 548.105392a50.408235 50.408235 0 1 0-100.816471 0 50.408235 50.408235 0 0 0 100.816471 0z m0 0M291.466872 548.105392a50.408235 50.408235 0 1 0-100.816471 0 50.408235 50.408235 0 0 0 100.816471 0z m0 0" fill="currentColor"></path></svg>`
|
||||
147
src/ob/metadataAndMarkdown.js
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
import { getDefaultSmmData, SMM_TAG } from './constant'
|
||||
import LZString from 'lz-string'
|
||||
import i18n from 'i18next'
|
||||
|
||||
export const parseMarkdownText = text => {
|
||||
const result = {
|
||||
metadata: { path: '', tags: [], yaml: '', content: '' },
|
||||
svgdata: '',
|
||||
svgdataUpdateAt: '',
|
||||
linkdata: [],
|
||||
textdata: []
|
||||
}
|
||||
|
||||
const lines = text.split('\n')
|
||||
let currentSection = ''
|
||||
let inCodeBlock = false
|
||||
let inYamlHeader = false
|
||||
let inTags = false
|
||||
let codeBlockContent = []
|
||||
|
||||
for (const line of lines) {
|
||||
if (line.trim() === '---') {
|
||||
inYamlHeader = !inYamlHeader
|
||||
continue
|
||||
}
|
||||
|
||||
if (line.startsWith('# metadata')) {
|
||||
currentSection = 'metadata'
|
||||
continue
|
||||
} else if (line.startsWith('# svgdata')) {
|
||||
currentSection = 'svgdata'
|
||||
continue
|
||||
} else if (line.startsWith('# linkdata')) {
|
||||
currentSection = 'linkdata'
|
||||
continue
|
||||
} else if (line.startsWith('# textdata')) {
|
||||
break
|
||||
}
|
||||
|
||||
if (line.trim() === '```metadata' || line.trim() === '```svgData') {
|
||||
inCodeBlock = true
|
||||
continue
|
||||
} else if (line.trim() === '```' && inCodeBlock) {
|
||||
inCodeBlock = false
|
||||
if (currentSection === 'metadata') {
|
||||
result.metadata.content = codeBlockContent.join('\n')
|
||||
codeBlockContent = []
|
||||
} else if (currentSection === 'svgdata') {
|
||||
result.svgdata = codeBlockContent.join('\n')
|
||||
if (result.svgdata == undefined) {
|
||||
result.svgdata = ''
|
||||
}
|
||||
codeBlockContent = []
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if (inCodeBlock) {
|
||||
codeBlockContent.push(line)
|
||||
} else if (currentSection === 'linkdata' && line.startsWith('- ')) {
|
||||
result.linkdata.push(line.replace('- ', '').trim())
|
||||
} else if (currentSection === 'svgdata') {
|
||||
if (line.startsWith('![[')) {
|
||||
result.svgdata = line.trim()
|
||||
} else if (line.startsWith('> updateAt:')) {
|
||||
result.svgdataUpdateAt = line.match(/> updateAt:\s*(.*)/)[1]
|
||||
}
|
||||
} else if (inYamlHeader) {
|
||||
if (line.startsWith('tags:')) {
|
||||
inTags = true
|
||||
} else if (inTags && line.startsWith(' -')) {
|
||||
result.metadata.tags.push(line.replace(' -', '').trim())
|
||||
} else {
|
||||
inTags = false
|
||||
if (line.startsWith('path:')) {
|
||||
result.metadata.path = line.split(':')[1].trim()
|
||||
} else if (line) {
|
||||
result.metadata.yaml += line + '\n'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
export const assembleMarkdownText = obj => {
|
||||
let result = '---\n'
|
||||
|
||||
result += `path: ${obj.metadata.path}\n`
|
||||
result += 'tags:\n'
|
||||
for (const tag of obj.metadata.tags) {
|
||||
result += ` - ${tag}\n`
|
||||
}
|
||||
if (obj.metadata.yaml) {
|
||||
result += obj.metadata.yaml
|
||||
}
|
||||
result += '---\n'
|
||||
|
||||
result += '> ' + i18n.t('tip.mdModifyTip') + '\n'
|
||||
|
||||
result += '# metadata\n'
|
||||
result += '```metadata\n'
|
||||
result += obj.metadata.content
|
||||
result += '\n```\n'
|
||||
|
||||
result += '# svgdata\n'
|
||||
if (obj.svgdata && /^!\[\[/.test(obj.svgdata)) {
|
||||
result += obj.svgdata + '\n'
|
||||
result += '> updateAt: ' + (obj.svgdataUpdateAt || '') + '\n'
|
||||
} else {
|
||||
result += '```svgData\n'
|
||||
result += obj.svgdata
|
||||
result += '\n```\n'
|
||||
}
|
||||
|
||||
result += '# linkdata\n'
|
||||
for (const item of obj.linkdata) {
|
||||
result += `- ${item}\n`
|
||||
}
|
||||
|
||||
result += '# textdata\n'
|
||||
if (obj.textdata && Array.isArray(obj.textdata)) {
|
||||
result += obj.textdata.join('\n\n')
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export const createDefaultMindMapData = (options, isCompress = true) => {
|
||||
const content = JSON.stringify(getDefaultSmmData(options))
|
||||
return isCompress ? LZString.compressToBase64(content) : content
|
||||
}
|
||||
|
||||
export const createDefaultText = (filePath, options) => {
|
||||
return assembleMarkdownText({
|
||||
metadata: {
|
||||
path: `${filePath || ''}`,
|
||||
tags: [SMM_TAG],
|
||||
yaml: '',
|
||||
content: createDefaultMindMapData(options)
|
||||
},
|
||||
svgdata: '',
|
||||
svgdataUpdateAt: '',
|
||||
linkdata: [],
|
||||
textdata: []
|
||||
})
|
||||
}
|
||||
127
src/ob/utils.js
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
import { createUid } from 'simple-mind-map/src/utils/index.js'
|
||||
|
||||
export const simpleDeepClone = data => {
|
||||
try {
|
||||
return JSON.parse(JSON.stringify(data))
|
||||
} catch (error) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export const generateRandomString = (
|
||||
length = 12,
|
||||
charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
||||
) => {
|
||||
if (typeof length !== 'number' || length <= 0) {
|
||||
throw new Error('长度必须是正整数')
|
||||
}
|
||||
if (typeof charSet !== 'string' || charSet.length === 0) {
|
||||
throw new Error('字符集不能为空')
|
||||
}
|
||||
|
||||
let randomValues
|
||||
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
||||
randomValues = new Uint32Array(length)
|
||||
crypto.getRandomValues(randomValues)
|
||||
} else {
|
||||
randomValues = new Array(length)
|
||||
.fill(0)
|
||||
.map(() => Math.random() * 0x100000000)
|
||||
}
|
||||
|
||||
let result = ''
|
||||
for (let i = 0; i < length; i++) {
|
||||
const randomIndex = randomValues[i] % charSet.length
|
||||
result += charSet.charAt(randomIndex)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
export const hideTargetMenu = (menu, text = '在新窗口中打开') => {
|
||||
menu.items.forEach(item => {
|
||||
if (item.title === text || item.dom?.innerText?.includes(text)) {
|
||||
item.dom.hide()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const dataURItoBlob = dataURI => {
|
||||
const byteString = atob(dataURI.split(',')[1])
|
||||
const mimeString = dataURI
|
||||
.split(',')[0]
|
||||
.split(':')[1]
|
||||
.split(';')[0]
|
||||
const ab = new ArrayBuffer(byteString.length)
|
||||
const ia = new Uint8Array(ab)
|
||||
for (let i = 0; i < byteString.length; i++) {
|
||||
ia[i] = byteString.charCodeAt(i)
|
||||
}
|
||||
return new Blob([ab], { type: mimeString })
|
||||
}
|
||||
|
||||
export const getUidFromSource = data => {
|
||||
const { matches, content } = data.match
|
||||
const total = content.length
|
||||
const last = matches[matches.length - 1]
|
||||
let index = last[1]
|
||||
let str = content[index]
|
||||
let uid = ''
|
||||
let isJoin = false
|
||||
while (true || index >= total) {
|
||||
if (isJoin && (str === '\n' || str === undefined)) {
|
||||
break
|
||||
}
|
||||
if (isJoin) {
|
||||
uid += str
|
||||
}
|
||||
if (str === '^') {
|
||||
isJoin = true
|
||||
}
|
||||
index++
|
||||
str = content[index]
|
||||
}
|
||||
return uid
|
||||
}
|
||||
|
||||
export const smmFilePathToFileName = (filePath, ext) => {
|
||||
if (!filePath) return createUid() + ext
|
||||
filePath =
|
||||
filePath
|
||||
.replace(/\//g, '_')
|
||||
.replace(/.smm.md$/, '')
|
||||
.replace(/.md$/, '') + ext
|
||||
return filePath
|
||||
}
|
||||
|
||||
export const formatFileName = (str, { notename, ignores } = {}) => {
|
||||
str = str.trim()
|
||||
if (!str) return ''
|
||||
str = str.replace(/{([^{}]+)}/g, (...args) => {
|
||||
const match = args[1].trim()
|
||||
if (ignores && ignores.includes(match)) {
|
||||
return args[0]
|
||||
}
|
||||
if (match === 'notename' && notename) {
|
||||
return notename
|
||||
} else if (match === 'date') {
|
||||
return moment().format('YYYY-MM-DD')
|
||||
} else if (match === 'time') {
|
||||
return moment().format('HH:mm:ss')
|
||||
} else if (match === 'datetime') {
|
||||
return moment().format('YYYY-MM-DD HH:mm:ss')
|
||||
} else if (match === 'random') {
|
||||
return Math.random()
|
||||
.toString(36)
|
||||
.substring(2, 8)
|
||||
} else if (match.startsWith('date:') && match.slice(5).trim()) {
|
||||
return moment().format(match.slice(5).trim())
|
||||
}
|
||||
return args[0]
|
||||
})
|
||||
return str
|
||||
}
|
||||
|
||||
export const fragWithHTML = html => {
|
||||
return createFragment(frag => (frag.createDiv().innerHTML = html))
|
||||
}
|
||||
12260
src/package-lock.json
generated
Normal file
75
src/package.json
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
{
|
||||
"name": "simple-mind-map",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "cross-env NODE_ENV=production webpack --mode production",
|
||||
"dev": "cross-env NODE_ENV=development webpack --watch --mode development",
|
||||
"lint": "vue-cli-service lint",
|
||||
"format": "prettier --write src/* src/*/* src/*/*/* src/*/*/*/*",
|
||||
"createNodeImageList": "node ./scripts/createNodeImageList.js",
|
||||
"ai:serve": "node ./scripts/ai.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.28.0",
|
||||
"@babel/preset-env": "^7.28.0",
|
||||
"@types/node": "^16.11.6",
|
||||
"babel-loader": "^10.0.0",
|
||||
"babel-plugin-component": "^1.1.1",
|
||||
"buffer": "^6.0.3",
|
||||
"builtin-modules": "3.3.0",
|
||||
"css-loader": "^7.1.2",
|
||||
"css-minimizer-webpack-plugin": "^7.0.2",
|
||||
"file-loader": "^6.2.0",
|
||||
"less": "^3.12.2",
|
||||
"less-loader": "^7.1.0",
|
||||
"markdown-it": "^13.0.1",
|
||||
"markdown-it-checkbox": "^1.1.0",
|
||||
"mini-css-extract-plugin": "^2.9.2",
|
||||
"obsidian": "latest",
|
||||
"sass": "^1.89.2",
|
||||
"sass-loader": "^16.0.5",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"string_decoder": "^1.3.0",
|
||||
"terser-webpack-plugin": "^5.3.14",
|
||||
"url-loader": "^4.1.1",
|
||||
"util": "^0.12.5",
|
||||
"vue-loader": "^15.9.8",
|
||||
"webpack": "^5.98.0",
|
||||
"webpack-cli": "^6.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@toast-ui/editor": "^3.1.5",
|
||||
"element-ui": "^2.15.1",
|
||||
"i18next": "^25.2.1",
|
||||
"katex": "^0.16.9",
|
||||
"lz-string": "^1.5.0",
|
||||
"monkey-around": "^3.0.0",
|
||||
"simple-mind-map-plugin-themes": "^1.0.0",
|
||||
"v-viewer": "^1.6.4",
|
||||
"vue": "^2.6.14",
|
||||
"vue-i18n": "^8.27.2",
|
||||
"vue-template-compiler": "^2.6.14",
|
||||
"vuex": "^3.6.2",
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:vue/essential",
|
||||
"eslint:recommended"
|
||||
],
|
||||
"parserOptions": {
|
||||
"parser": "babel-eslint"
|
||||
},
|
||||
"rules": {}
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not dead"
|
||||
]
|
||||
}
|
||||
5
src/shims-vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
declare module '*.vue' {
|
||||
import Vue from 'vue';
|
||||
export default Vue;
|
||||
}
|
||||
|
||||
651
src/src/assets/icon-font/iconfont.css
Normal file
|
|
@ -0,0 +1,651 @@
|
|||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 2479351 */
|
||||
src: url('iconfont.woff2?t=1764835435069') format('woff2'),
|
||||
url('iconfont.woff?t=1764835435069') format('woff'),
|
||||
url('iconfont.ttf?t=1764835435069') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.iconfour-squares:before {
|
||||
content: "\ea3e";
|
||||
}
|
||||
|
||||
.iconyousuojin:before {
|
||||
content: "\e6f0";
|
||||
}
|
||||
|
||||
.icondaimakuai:before {
|
||||
content: "\e65d";
|
||||
}
|
||||
|
||||
.iconcharulianjie:before {
|
||||
content: "\ec7f";
|
||||
}
|
||||
|
||||
.iconcharutupian:before {
|
||||
content: "\ec81";
|
||||
}
|
||||
|
||||
.iconwuxupailie:before {
|
||||
content: "\ec82";
|
||||
}
|
||||
|
||||
.iconyinyong:before {
|
||||
content: "\ec88";
|
||||
}
|
||||
|
||||
.iconyouxupailie:before {
|
||||
content: "\ec89";
|
||||
}
|
||||
|
||||
.iconzitidaima:before {
|
||||
content: "\ec8a";
|
||||
}
|
||||
|
||||
.iconzitishangbiao:before {
|
||||
content: "\ec8b";
|
||||
}
|
||||
|
||||
.iconzitibiaoti:before {
|
||||
content: "\ec8c";
|
||||
}
|
||||
|
||||
.iconzitixiabiao:before {
|
||||
content: "\ec8d";
|
||||
}
|
||||
|
||||
.iconbeijingyanse1:before {
|
||||
content: "\e645";
|
||||
}
|
||||
|
||||
.icondocdocx:before {
|
||||
content: "\e635";
|
||||
}
|
||||
|
||||
.iconsousuo1:before {
|
||||
content: "\e661";
|
||||
}
|
||||
|
||||
.icondodechild:before {
|
||||
content: "\e70e";
|
||||
}
|
||||
|
||||
.iconbofang:before {
|
||||
content: "\e8a3";
|
||||
}
|
||||
|
||||
.iconkuangxuan:before {
|
||||
content: "\e624";
|
||||
}
|
||||
|
||||
.iconcaidan:before {
|
||||
content: "\e630";
|
||||
}
|
||||
|
||||
.iconshangxiayidong:before {
|
||||
content: "\e6c9";
|
||||
}
|
||||
|
||||
.iconzuoyouyidong:before {
|
||||
content: "\e6ca";
|
||||
}
|
||||
|
||||
.iconbaocun:before {
|
||||
content: "\e6e3";
|
||||
}
|
||||
|
||||
.iconxinbiaoqianyedakai:before {
|
||||
content: "\e623";
|
||||
}
|
||||
|
||||
.icondaochu2:before {
|
||||
content: "\e65f";
|
||||
}
|
||||
|
||||
.icondaoru1:before {
|
||||
content: "\e65a";
|
||||
}
|
||||
|
||||
.iconarrow-left:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.iconarrow-up:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.icona-rongqi21:before {
|
||||
content: "\e62b";
|
||||
}
|
||||
|
||||
.icongeshishua:before {
|
||||
content: "\e67b";
|
||||
}
|
||||
|
||||
.iconcaozuo_geshishua:before {
|
||||
content: "\e724";
|
||||
}
|
||||
|
||||
.icontupian:before {
|
||||
content: "\e8ba";
|
||||
}
|
||||
|
||||
.iconwaikuang1:before {
|
||||
content: "\e6db";
|
||||
}
|
||||
|
||||
.iconwaikuang2:before {
|
||||
content: "\e61f";
|
||||
}
|
||||
|
||||
.iconqingchuyangshi:before {
|
||||
content: "\e64a";
|
||||
}
|
||||
|
||||
.iconchaolianjie1:before {
|
||||
content: "\e6e2";
|
||||
}
|
||||
|
||||
.icontag:before {
|
||||
content: "\e62a";
|
||||
}
|
||||
|
||||
.iconbeizhu:before {
|
||||
content: "\e64b";
|
||||
}
|
||||
|
||||
.icontaiyang:before {
|
||||
content: "\e62e";
|
||||
}
|
||||
|
||||
.iconjichuyangshi:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icongaiyao:before {
|
||||
content: "\e653";
|
||||
}
|
||||
|
||||
.iconMermaid:before {
|
||||
content: "\e69a";
|
||||
}
|
||||
|
||||
.iconzuoyouduiqi:before {
|
||||
content: "\ec87";
|
||||
}
|
||||
|
||||
.iconxise:before {
|
||||
content: "\e680";
|
||||
}
|
||||
|
||||
.iconshubiaoyidong:before {
|
||||
content: "\e659";
|
||||
}
|
||||
|
||||
.iconvip:before {
|
||||
content: "\e65e";
|
||||
}
|
||||
|
||||
.iconlianjie:before {
|
||||
content: "\e619";
|
||||
}
|
||||
|
||||
.iconjibiji:before {
|
||||
content: "\e618";
|
||||
}
|
||||
|
||||
.iconhuiyuan-:before {
|
||||
content: "\e615";
|
||||
}
|
||||
|
||||
.iconAIshengcheng:before {
|
||||
content: "\e6b5";
|
||||
}
|
||||
|
||||
.iconprinting:before {
|
||||
content: "\ea28";
|
||||
}
|
||||
|
||||
.iconwenjianjia:before {
|
||||
content: "\e614";
|
||||
}
|
||||
|
||||
.iconcontentleft:before {
|
||||
content: "\e8c9";
|
||||
}
|
||||
|
||||
.iconjuzhongduiqi:before {
|
||||
content: "\ec80";
|
||||
}
|
||||
|
||||
.iconfile-excel:before {
|
||||
content: "\e7b7";
|
||||
}
|
||||
|
||||
.iconfreemind:before {
|
||||
content: "\e97d";
|
||||
}
|
||||
|
||||
.iconwaikuang:before {
|
||||
content: "\e640";
|
||||
}
|
||||
|
||||
.iconhighlight:before {
|
||||
content: "\e6b8";
|
||||
}
|
||||
|
||||
.iconyanshibofang:before {
|
||||
content: "\e648";
|
||||
}
|
||||
|
||||
.iconfujian:before {
|
||||
content: "\e88a";
|
||||
}
|
||||
|
||||
.icongeshihua:before {
|
||||
content: "\e7a3";
|
||||
}
|
||||
|
||||
.iconyuanma:before {
|
||||
content: "\e658";
|
||||
}
|
||||
|
||||
.icongundongtiao:before {
|
||||
content: "\e670";
|
||||
}
|
||||
|
||||
.iconxietongwendang:before {
|
||||
content: "\e60d";
|
||||
}
|
||||
|
||||
.iconTXT:before {
|
||||
content: "\e6e1";
|
||||
}
|
||||
|
||||
.iconwenjian1:before {
|
||||
content: "\e69f";
|
||||
}
|
||||
|
||||
.icondodeparent:before {
|
||||
content: "\e70f";
|
||||
}
|
||||
|
||||
.icongongshi:before {
|
||||
content: "\e617";
|
||||
}
|
||||
|
||||
.icontouming:before {
|
||||
content: "\e60c";
|
||||
}
|
||||
|
||||
.iconlieri:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.iconmoon_line:before {
|
||||
content: "\e745";
|
||||
}
|
||||
|
||||
.iconsousuo:before {
|
||||
content: "\e693";
|
||||
}
|
||||
|
||||
.iconjiantouyou:before {
|
||||
content: "\e62d";
|
||||
}
|
||||
|
||||
.iconbianji1:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icondaohang1:before {
|
||||
content: "\e632";
|
||||
}
|
||||
|
||||
.iconyanjing:before {
|
||||
content: "\e8bf";
|
||||
}
|
||||
|
||||
.iconwangzhan:before {
|
||||
content: "\e628";
|
||||
}
|
||||
|
||||
.iconcsdn:before {
|
||||
content: "\e608";
|
||||
}
|
||||
|
||||
.iconshejiaotubiao-10:before {
|
||||
content: "\e644";
|
||||
}
|
||||
|
||||
.iconstar:before {
|
||||
content: "\e7df";
|
||||
}
|
||||
|
||||
.iconfork:before {
|
||||
content: "\e641";
|
||||
}
|
||||
|
||||
.iconxiazai:before {
|
||||
content: "\e613";
|
||||
}
|
||||
|
||||
.iconteamwork:before {
|
||||
content: "\e870";
|
||||
}
|
||||
|
||||
.iconshuiyin:before {
|
||||
content: "\e67a";
|
||||
}
|
||||
|
||||
.iconxmind:before {
|
||||
content: "\ea57";
|
||||
}
|
||||
|
||||
.iconmouseR:before {
|
||||
content: "\e6bd";
|
||||
}
|
||||
|
||||
.iconmouseL:before {
|
||||
content: "\e6c0";
|
||||
}
|
||||
|
||||
.iconwenjian:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.iconpdf:before {
|
||||
content: "\e740";
|
||||
}
|
||||
|
||||
.iconPNG:before {
|
||||
content: "\ec18";
|
||||
}
|
||||
|
||||
.iconSVG:before {
|
||||
content: "\e621";
|
||||
}
|
||||
|
||||
.iconmarkdown:before {
|
||||
content: "\ec04";
|
||||
}
|
||||
|
||||
.iconjson:before {
|
||||
content: "\ea42";
|
||||
}
|
||||
|
||||
.iconlianjiexian:before {
|
||||
content: "\e75b";
|
||||
}
|
||||
|
||||
.iconbangzhu:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.iconshezhi:before {
|
||||
content: "\e8b7";
|
||||
}
|
||||
|
||||
.iconwushuju:before {
|
||||
content: "\e643";
|
||||
}
|
||||
|
||||
.iconzuijinliulan:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon3zuidahua-3:before {
|
||||
content: "\e692";
|
||||
}
|
||||
|
||||
.iconzuixiaohua:before {
|
||||
content: "\e650";
|
||||
}
|
||||
|
||||
.iconzuidahua:before {
|
||||
content: "\e651";
|
||||
}
|
||||
|
||||
.iconguanbi:before {
|
||||
content: "\e652";
|
||||
}
|
||||
|
||||
.icondiannao:before {
|
||||
content: "\eac0";
|
||||
}
|
||||
|
||||
.iconzhuye:before {
|
||||
content: "\e65c";
|
||||
}
|
||||
|
||||
.iconbendi1x:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.iconbeijingyanse:before {
|
||||
content: "\e6f8";
|
||||
}
|
||||
|
||||
.iconqingchu:before {
|
||||
content: "\e605";
|
||||
}
|
||||
|
||||
.iconcase:before {
|
||||
content: "\e6c6";
|
||||
}
|
||||
|
||||
.iconxingzhuang-wenzi:before {
|
||||
content: "\eb99";
|
||||
}
|
||||
|
||||
.iconzitijiacu:before {
|
||||
content: "\ec83";
|
||||
}
|
||||
|
||||
.iconzitixiahuaxian:before {
|
||||
content: "\ec85";
|
||||
}
|
||||
|
||||
.iconzitixieti:before {
|
||||
content: "\ec86";
|
||||
}
|
||||
|
||||
.iconshanchuxian:before {
|
||||
content: "\e612";
|
||||
}
|
||||
|
||||
.iconzitiyanse:before {
|
||||
content: "\e854";
|
||||
}
|
||||
|
||||
.icongithub:before {
|
||||
content: "\e64f";
|
||||
}
|
||||
|
||||
.iconchoose1:before {
|
||||
content: "\e6c5";
|
||||
}
|
||||
|
||||
.iconzhuti:before {
|
||||
content: "\e7aa";
|
||||
}
|
||||
|
||||
.icondaochu1:before {
|
||||
content: "\e63e";
|
||||
}
|
||||
|
||||
.iconlingcunwei:before {
|
||||
content: "\e657";
|
||||
}
|
||||
|
||||
.iconexport:before {
|
||||
content: "\e642";
|
||||
}
|
||||
|
||||
.icondakai:before {
|
||||
content: "\ebdf";
|
||||
}
|
||||
|
||||
.iconxinjian:before {
|
||||
content: "\e64e";
|
||||
}
|
||||
|
||||
.iconjianqie:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.iconzhengli:before {
|
||||
content: "\e83b";
|
||||
}
|
||||
|
||||
.iconfuzhi:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.iconniantie:before {
|
||||
content: "\e63f";
|
||||
}
|
||||
|
||||
.iconshangyi:before {
|
||||
content: "\e6be";
|
||||
}
|
||||
|
||||
.iconxiayi:before {
|
||||
content: "\e6bf";
|
||||
}
|
||||
|
||||
.icongaikuozonglan:before {
|
||||
content: "\e609";
|
||||
}
|
||||
|
||||
.iconquanxuan:before {
|
||||
content: "\f199";
|
||||
}
|
||||
|
||||
.icondaoru:before {
|
||||
content: "\e6a3";
|
||||
}
|
||||
|
||||
.iconhoutui-shi:before {
|
||||
content: "\e656";
|
||||
}
|
||||
|
||||
.iconqianjin1:before {
|
||||
content: "\e654";
|
||||
}
|
||||
|
||||
.iconwithdraw:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.iconqianjin:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
||||
.iconhuifumoren:before {
|
||||
content: "\e60e";
|
||||
}
|
||||
|
||||
.iconhuanhang:before {
|
||||
content: "\e61e";
|
||||
}
|
||||
|
||||
.iconsuoxiao:before {
|
||||
content: "\ec13";
|
||||
}
|
||||
|
||||
.iconbianji:before {
|
||||
content: "\e626";
|
||||
}
|
||||
|
||||
.iconfangda:before {
|
||||
content: "\e663";
|
||||
}
|
||||
|
||||
.iconquanping1:before {
|
||||
content: "\e664";
|
||||
}
|
||||
|
||||
.icondingwei:before {
|
||||
content: "\e616";
|
||||
}
|
||||
|
||||
.icondaohang:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.iconjianpan:before {
|
||||
content: "\e64d";
|
||||
}
|
||||
|
||||
.iconquanping:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icondaochu:before {
|
||||
content: "\e63d";
|
||||
}
|
||||
|
||||
.iconbiaoqian:before {
|
||||
content: "\e63c";
|
||||
}
|
||||
|
||||
.iconflow-Mark:before {
|
||||
content: "\e65b";
|
||||
}
|
||||
|
||||
.iconchaolianjie:before {
|
||||
content: "\e6f4";
|
||||
}
|
||||
|
||||
.iconjingzi:before {
|
||||
content: "\e610";
|
||||
}
|
||||
|
||||
.iconxiaolian:before {
|
||||
content: "\e60f";
|
||||
}
|
||||
|
||||
.iconimage:before {
|
||||
content: "\e629";
|
||||
}
|
||||
|
||||
.iconjiegou:before {
|
||||
content: "\e61d";
|
||||
}
|
||||
|
||||
.iconyangshi:before {
|
||||
content: "\e631";
|
||||
}
|
||||
|
||||
.iconfuhao-dagangshu:before {
|
||||
content: "\e71f";
|
||||
}
|
||||
|
||||
.icontianjiazijiedian:before {
|
||||
content: "\e622";
|
||||
}
|
||||
|
||||
.iconjiedian:before {
|
||||
content: "\e655";
|
||||
}
|
||||
|
||||
.iconshanchu:before {
|
||||
content: "\e696";
|
||||
}
|
||||
|
||||
.iconzhankai:before {
|
||||
content: "\e64c";
|
||||
}
|
||||
|
||||
.iconzhankai1:before {
|
||||
content: "\e673";
|
||||
}
|
||||
|
||||
BIN
src/src/assets/icon-font/iconfont.ttf
Normal file
BIN
src/src/assets/icon-font/iconfont.woff
Normal file
BIN
src/src/assets/icon-font/iconfont.woff2
Normal file
BIN
src/src/assets/img/foramt/1.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/src/assets/img/foramt/10.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/src/assets/img/foramt/2.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/src/assets/img/foramt/3.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/src/assets/img/foramt/4.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/src/assets/img/foramt/5.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
src/src/assets/img/foramt/6.png
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
src/src/assets/img/foramt/7.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
src/src/assets/img/structures/catalogOrganization.jpg
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
src/src/assets/img/structures/fishbone.jpg
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
src/src/assets/img/structures/logicalStructure.jpg
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
src/src/assets/img/structures/logicalStructureLeft.jpg
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
src/src/assets/img/structures/mindMap.jpg
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
src/src/assets/img/structures/organizationStructure.jpg
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
src/src/assets/img/structures/timeline.jpg
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
src/src/assets/img/structures/timeline2.jpg
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
src/src/assets/img/structures/verticalTimeline.jpg
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
src/src/assets/img/structures/verticalTimeline2.jpg
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
src/src/assets/img/structures/verticalTimeline3.jpg
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
1
src/src/assets/img/图片加载失败.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702344017086" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1621" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M776 328m-72 0a72 72 0 1 0 144 0 72 72 0 1 0-144 0Z" p-id="1622" fill="#bfbfbf"></path><path d="M999.904 116.608a32 32 0 0 0-21.952-10.912l-456.192-31.904a31.552 31.552 0 0 0-27.2 11.904l-92.192 114.848a32 32 0 0 0 0.672 40.896l146.144 169.952-147.456 194.656 36.48-173.376a32 32 0 0 0-11.136-31.424L235.616 245.504l79.616-125.696a32 32 0 0 0-29.28-49.024l-240.192 16.768a32 32 0 0 0-29.696 34.176l55.808 798.016a32.064 32.064 0 0 0 34.304 29.696l176.512-13.184c17.632-1.312 30.848-16.672 29.504-34.272s-16.576-31.04-34.304-29.536l-144.448 10.784-6.432-92.512 125.312-12.576a32 32 0 0 0 28.672-35.04 32.16 32.16 0 0 0-35.04-28.672l-123.392 12.416L82.144 149.184l145.152-10.144-60.96 96.224a32 32 0 0 0 6.848 41.952l198.4 161.344-58.752 279.296a30.912 30.912 0 0 0 0.736 14.752 31.68 31.68 0 0 0 1.408 11.04l51.52 154.56a31.968 31.968 0 0 0 27.456 21.76l523.104 47.552a32.064 32.064 0 0 0 34.848-29.632L1007.68 139.84a32.064 32.064 0 0 0-7.776-23.232z m-98.912 630.848l-412.576-39.648a31.52 31.52 0 0 0-34.912 28.768 32 32 0 0 0 28.8 34.912l414.24 39.808-6.272 89.536-469.728-42.72-39.584-118.72 234.816-310.016a31.936 31.936 0 0 0-1.248-40.192L468.896 219.84l65.088-81.056 407.584 28.48-40.576 580.192z" p-id="1623" fill="#bfbfbf"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
1
src/src/assets/svg/business/-.svg
Normal file
|
After Width: | Height: | Size: 6 KiB |
1
src/src/assets/svg/business/-_1.svg
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
1
src/src/assets/svg/business/-_10.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M401.9 584.7h16v16h-16zM385.9 600.7h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16zM146.1 584.7h16v16h-16zM162.1 569h-16v-15.7h16V569z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V506z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V443z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V380z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V317z m0-31.4h-16v-15.7h16v15.7zM146.1 238.1h16v16h-16zM385.9 254.1h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16zM401.9 238.1h16v16h-16zM417.9 569h-16v-15.7h16V569z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V506z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V443z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V380z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16V317z m0-31.4h-16v-15.7h16v15.7zM860.1 682.9h16v16h-16zM844.2 698.9h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16zM604.3 682.9h16v16h-16zM620.3 667.1h-16v-15.7h16v15.7z m0-31.4h-16V620h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V557h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V494h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V431h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V368h16v15.7zM604.3 336.2h16v16h-16zM844.2 352.2h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16zM860.1 336.2h16v16h-16zM876.1 667.1h-16v-15.7h16v15.7z m0-31.4h-16V620h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V557h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V494h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V431h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.5h-16V368h16v15.7z" fill="#0A0408" /><path d="M246.9 107.8h531.6v531.6H246.9z" fill="#FFFFFF" /><path d="M786.5 647.4H238.9V99.8h547.6v547.6z m-531.6-16h515.6V115.8H254.9v515.6z" fill="#0A0408" /><path d="M305.1 166h415.1v415.1H305.1z" fill="#55B7A8" /><path d="M389.9 238.2h195.3v16H389.9zM384.6 338.8h256.2v16H384.6zM384.6 441.2h256.2v16H384.6z" fill="#0A0408" /><path d="M868.8 918H156.5l-50-415.4h812.3z" fill="#FFFFFF" /><path d="M875.9 926H149.4L97.5 494.6h830.4l-52 431.4z m-712.3-16h698.1l48.1-399.4H115.5L163.6 910z" fill="#0A0408" /><path d="M809.6 866.5H215.8L174.1 554h677.2z" fill="#F4BE6F" /><path d="M154.1 639.7h154.3v16H154.1zM154.1 717.9h258.3v16H154.1z" fill="#FFFFFF" /><path d="M842.7 318.8h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M901.6 377.7h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /><path d="M128.6 220.8h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M187.5 279.7h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
1
src/src/assets/svg/business/-_11.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M153.9 105.9h715.4v812.8H153.9z" fill="#55B7A8" /><path d="M877.3 926.8H145.9V97.9h731.4v828.9z m-715.4-16h699.4V113.9H161.9v796.9z" fill="#0A0408" /><path d="M221.3 182.9h580.5v658.8H221.3z" fill="#FFFFFF" /><path d="M793.8 833.8h16v16h-16zM777.7 849.8h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0H568v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0H439v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0H310v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16zM213.3 833.8h16v16h-16zM229.3 818.1h-16v-15.7h16v15.7z m0-31.4h-16V771h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V724z m0-31.3h-16V677h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16V332h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V285z m0-31.4h-16V238h16v15.6z m0-31.3h-16v-15.7h16v15.7zM213.3 174.9h16v16h-16zM777.7 190.9h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0H568v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0H439v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16z m-32.3 0H310v-16h16.1v16z m-32.3 0h-16.1v-16h16.1v16z m-32.2 0h-16.1v-16h16.1v16zM793.8 174.9h16v16h-16zM809.8 818.1h-16v-15.7h16v15.7z m0-31.4h-16V771h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V724z m0-31.3h-16V677h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16V332h16v15.7z m0-31.3h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V285z m0-31.4h-16V238h16v15.6z m0-31.3h-16v-15.7h16v15.7z" fill="#0A0408" /><path d="M364.5 306.6m-44.8 0a44.8 44.8 0 1 0 89.6 0 44.8 44.8 0 1 0-89.6 0Z" fill="#DC444A" /><path d="M364.5 359.4c-29.1 0-52.8-23.7-52.8-52.8s23.7-52.8 52.8-52.8 52.8 23.7 52.8 52.8-23.7 52.8-52.8 52.8z m0-89.6c-20.3 0-36.8 16.5-36.8 36.8s16.5 36.8 36.8 36.8 36.8-16.5 36.8-36.8-16.5-36.8-36.8-36.8zM459.3 262.6h144.1v16H459.3zM459.3 332.2h244.1v16H459.3z" fill="#0A0408" /><path d="M364.5 516.3m-44.8 0a44.8 44.8 0 1 0 89.6 0 44.8 44.8 0 1 0-89.6 0Z" fill="#DC444A" /><path d="M364.5 569.1c-29.1 0-52.8-23.7-52.8-52.8s23.7-52.8 52.8-52.8 52.8 23.7 52.8 52.8-23.7 52.8-52.8 52.8z m0-89.6c-20.3 0-36.8 16.5-36.8 36.8 0 20.3 16.5 36.8 36.8 36.8s36.8-16.5 36.8-36.8c0-20.3-16.5-36.8-36.8-36.8zM459.3 472.3h144.1v16H459.3zM459.3 541.9h244.1v16H459.3z" fill="#0A0408" /><path d="M364.5 726m-44.8 0a44.8 44.8 0 1 0 89.6 0 44.8 44.8 0 1 0-89.6 0Z" fill="#DC444A" /><path d="M364.5 778.8c-29.1 0-52.8-23.7-52.8-52.8s23.7-52.8 52.8-52.8 52.8 23.7 52.8 52.8-23.7 52.8-52.8 52.8z m0-89.6c-20.3 0-36.8 16.5-36.8 36.8 0 20.3 16.5 36.8 36.8 36.8s36.8-16.5 36.8-36.8c0-20.3-16.5-36.8-36.8-36.8zM459.3 682h144.1v16H459.3zM459.3 751.6h244.1v16H459.3z" fill="#0A0408" /><path d="M359 72.4h305.2v75.9H359z" fill="#EBB866" /><path d="M672.2 156.2H351V64.4h321.2v91.8z m-305.2-16h289.2V80.4H367v59.8z" fill="#0A0408" /><path d="M808.3 807.9m-141.7 0a141.7 141.7 0 1 0 283.4 0 141.7 141.7 0 1 0-283.4 0Z" fill="#EBB866" /><path d="M808.3 957.6c-82.5 0-149.7-67.1-149.7-149.7s67.1-149.7 149.7-149.7S958 725.4 958 807.9s-67.2 149.7-149.7 149.7z m0-283.4c-73.7 0-133.7 60-133.7 133.7s60 133.7 133.7 133.7S942 881.6 942 807.9s-60-133.7-133.7-133.7z" fill="#0A0408" /><path d="M810.3 727.1l26 52.5 58 8.5-42 40.9 9.9 57.8-51.9-27.3-51.9 27.3 9.9-57.8-41.9-40.9 58-8.5z" fill="#FFFFFF" /><path d="M872.8 901.4l-62.5-32.9-62.5 32.9 11.9-69.6-50.6-49.3 69.9-10.2 31.3-63.3 31.3 63.3 69.9 10.2-50.6 49.3 11.9 69.6z m-62.5-51l41.3 21.7-7.9-45.9 33.4-32.5L831 787l-20.6-41.8-20.7 41.8-46.1 6.7 33.4 32.5-7.9 45.9 41.2-21.7z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
1
src/src/assets/svg/business/-_12.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M74 183.7h216V918H74z" fill="#55B7A8" /><path d="M298 926H66V175.7h232V926zM82 910h200V191.7H82V910z" fill="#0A0408" /><path d="M125.6 246.6h116.8v229.2H125.6z" fill="#FFFFFF" /><path d="M250.4 483.8H117.6V238.6h132.8v245.2z m-116.8-16h100.8V254.6H133.6v213.2z" fill="#0A0408" /><path d="M178.8 783.9m-55.2 0a55.2 55.2 0 1 0 110.4 0 55.2 55.2 0 1 0-110.4 0Z" fill="#FFFFFF" /><path d="M178.8 847.1c-34.8 0-63.2-28.3-63.2-63.2s28.3-63.2 63.2-63.2c34.8 0 63.2 28.3 63.2 63.2s-28.4 63.2-63.2 63.2z m0-110.4c-26 0-47.2 21.2-47.2 47.2s21.2 47.2 47.2 47.2 47.2-21.2 47.2-47.2-21.2-47.2-47.2-47.2z" fill="#0A0408" /><path d="M519.4 224.2L728 168.3l190.1 709.3-208.6 55.9" fill="#FFFFFF" /><path d="M517.346 216.397l7.727-2.07 4.14 15.454-7.727 2.07zM544.1 225.8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-7.9l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4zM663 194l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4zM722.4 178.1l-4.2-15.5 15.5-4.1 4.1 15.4zM904.2 856.5l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4L866 652l4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1L837 544l-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.2-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.9l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1z m-8.3-30.8l-4.1-15.4 15.5-4.1 4.1 15.4-15.5 4.1zM908.303 871.94l15.454-4.142 4.143 15.455-15.455 4.142zM734.2 935.1l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-7.9l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-7.9l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4z m29.7-8l-4.1-15.5 14.9-4 4.1 15.5-14.9 4zM707.443 925.66l7.727-2.07 4.141 15.454-7.727 2.07z" fill="#0A0408" /><path d="M583.619 272.12l112.817-30.229 59.317 221.385-112.817 30.228z" fill="#FFFFFF" /><path d="M637.3 503.3l-63.5-236.8L702.1 232l63.5 236.8-128.3 34.5z m-43.9-225.6l55.2 205.9 97.4-26.1-55.2-205.9-97.4 26.1z" fill="#0A0408" /><path d="M722.664239 791.097256a55.2 55.2 0 1 0 106.63871-28.571762 55.2 55.2 0 1 0-106.63871 28.571762Z" fill="#FFFFFF" /><path d="M776 840c-27.9 0-53.5-18.6-61-46.8-9-33.7 11-68.4 44.7-77.4s68.4 11 77.4 44.7c9 33.6-11 68.4-44.7 77.4-5.5 1.4-11 2.1-16.4 2.1z m0-110.4c-4 0-8.1 0.5-12.2 1.6-25.1 6.7-40.1 32.7-33.4 57.8 6.7 25.1 32.7 40.1 57.8 33.4 25.1-6.7 40.1-32.7 33.4-57.8-5.7-21-24.8-35-45.6-35z" fill="#0A0408" /><path d="M888.182 860.34l47.04-12.603 12.603 47.04-47.04 12.603z" fill="#DC444A" /><path d="M895.2 917.2l-16.8-62.5 62.5-16.8 16.8 62.5-62.5 16.8zM898 866l8.5 31.6 31.6-8.5-8.5-31.6L898 866z" fill="#0A0408" /><path d="M698.202 151.04l47.04-12.604 12.603 47.04-47.04 12.603z" fill="#DC444A" /><path d="M705.1 207.9l-16.8-62.5 62.5-16.8 16.8 62.5-62.5 16.8z m2.9-51.2l8.5 31.6 31.6-8.5-8.5-31.6-31.6 8.5z" fill="#0A0408" /><path d="M291.4 183.7h216V918h-216z" fill="#EBB866" /><path d="M515.4 926h-232V175.7h232V926z m-216-16h200V191.7h-200V910z" fill="#0A0408" /><path d="M343 246.6h116.8v229.2H343z" fill="#FFFFFF" /><path d="M467.8 483.8H335V238.6h132.8v245.2z m-116.8-16h100.8V254.6H351v213.2z" fill="#0A0408" /><path d="M396.2 783.9m-55.2 0a55.2 55.2 0 1 0 110.4 0 55.2 55.2 0 1 0-110.4 0Z" fill="#FFFFFF" /><path d="M396.2 847.1c-34.8 0-63.2-28.3-63.2-63.2s28.3-63.2 63.2-63.2c34.8 0 63.2 28.3 63.2 63.2s-28.4 63.2-63.2 63.2z m0-110.4c-26 0-47.2 21.2-47.2 47.2s21.2 47.2 47.2 47.2 47.2-21.2 47.2-47.2-21.2-47.2-47.2-47.2z" fill="#0A0408" /><path d="M712.5 941.5L518.4 217.2" fill="#FFFFFF" /><path d="M510.727 219.228l15.454-4.141 194.074 724.328-15.454 4.141z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
1
src/src/assets/svg/business/-_13.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M96.4 364.2h830.3v529.5H96.4z" fill="#FFFFFF" /><path d="M926.7 901.7h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-22.3-9.7h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 860h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 828h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 796h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 764h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 732h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 700h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 668h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 636h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 604h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 572h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 540h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 508h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 476h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 444h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 412h-16v-16h16v16z m830.3-13.9h-16v-16h16v16zM104.4 380h-16v-23.8h8.2v8h7.8V380z m822.3-7.8h-14.1v-16h22.1v9.9h-8v6.1z m-30.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z" fill="#0A0408" /><path d="M172.6 438.3h677.8v381.4H172.6z" fill="#F4BE6F" /><path d="M96.4 258.8h830.3v105.9H96.4z" fill="#55B7A8" /><path d="M934.7 372.7H88.4V250.8h846.3v121.9z m-830.3-16h814.3v-89.9H104.4v89.9z" fill="#0A0408" /><path d="M457.3 107.2h108.5v203.7H457.3z" fill="#EBB866" /><path d="M573.8 318.9H449.3V99.2h124.5v219.7z m-108.5-16h92.5V115.2h-92.5v187.7z" fill="#0A0408" /><path d="M308.7 560.2m-65.9 0a65.9 65.9 0 1 0 131.8 0 65.9 65.9 0 1 0-131.8 0Z" fill="#FFFFFF" /><path d="M308.7 634.1c-40.8 0-73.9-33.2-73.9-73.9s33.2-73.9 73.9-73.9 73.9 33.2 73.9 73.9-33.1 73.9-73.9 73.9z m0-131.9c-32 0-57.9 26-57.9 57.9s26 57.9 57.9 57.9 57.9-26 57.9-57.9-25.9-57.9-57.9-57.9z" fill="#0A0408" /><path d="M418.7 767.9c0-60.7-49.2-109.9-109.9-109.9s-109.9 49.2-109.9 109.9h219.8z" fill="#FFFFFF" /><path d="M426.7 775.9H190.8v-8c0-65 52.9-117.9 117.9-117.9s117.9 52.9 117.9 117.9v8z m-219.6-16h203.3c-4.1-52.5-48.1-93.9-101.6-93.9s-97.6 41.4-101.7 93.9zM457.3 662.8h313.9v16H457.3zM457.3 751.2h261.8v16H457.3z" fill="#0A0408" /><path d="M457.3 512.7h313.9v65.9H457.3z" fill="#FFFFFF" /><path d="M779.2 586.7H449.3v-81.9h329.9v81.9z m-313.9-16h297.9v-49.9H465.3v49.9z" fill="#0A0408" /><path d="M512 258.6m-20.3 0a20.3 20.3 0 1 0 40.6 0 20.3 20.3 0 1 0-40.6 0Z" fill="#FFFFFF" /><path d="M512 287c-15.6 0-28.3-12.7-28.3-28.3s12.7-28.3 28.3-28.3 28.3 12.7 28.3 28.3S527.6 287 512 287z m0-40.7c-6.8 0-12.3 5.5-12.3 12.3S505.2 271 512 271s12.3-5.5 12.3-12.3-5.5-12.4-12.3-12.4z" fill="#0A0408" /><path d="M71.5 868.8h49.8v49.8H71.5z" fill="#DC504F" /><path d="M129.2 926.6H63.5v-65.8h65.8v65.8z m-49.7-16h33.8v-33.8H79.5v33.8z" fill="#0A0408" /><path d="M899.4 868.8h49.8v49.8h-49.8z" fill="#DC504F" /><path d="M957.1 926.6h-65.8v-65.8h65.8v65.8z m-49.7-16h33.8v-33.8h-33.8v33.8z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
1
src/src/assets/svg/business/-_14.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M886.6 657.2h-16.8v-7.6l-0.7-7.6 0.7-0.1v-0.7h7.7l7.6-0.7zM853.8 657.2h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16zM436.8 657.2h-18.2l4.3-17.7 6.9 1.7h7v1.8l1.7 0.4-1.7 6.8zM442.3 627.7l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.8-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.7-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.7-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.8-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.7-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.7-31.4l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7z m7.7-31.5l-15.5-3.8 3.9-15.7 15.5 3.8-3.9 15.7zM504.2 376.4l-15.6-3.8 3.4-13.8h14.3v16h-1.7zM923.3 374.8h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32.1 0h-16v-16h16v16zM950.2 377.7l-5-2.9h-5.8v-3.4l-3-1.8 3-5v-5.8h21.9zM867.8 626.8l-1.4-15.2 15.9-1.4 1.4 15.2-15.9 1.4z m-2.8-30.3l-1.4-15.2 15.9-1.4 1.4 15.2-15.9 1.4z m-2.8-30.3l-1.4-15.2 15.9-1.4 1.4 15.2-15.9 1.4z m-2.7-30.4l-1.4-15.2 15.9-1.4 1.4 15.2-15.9 1.4z m14-26.6l-13.8-8.1 7.7-13.2 13.8 8.1-7.7 13.2z m15.4-26.3l-13.8-8.1 7.7-13.2 13.8 8.1-7.7 13.2z m15.3-26.3l-13.8-8.1 7.7-13.2 13.8 8.1-7.7 13.2z m15.3-26.3l-13.8-8.1 7.7-13.2 13.8 8.1-7.7 13.2z m15.4-26.3l-13.8-8.1 7.7-13.2 13.8 8.1-7.7 13.2z" fill="#0A0408" /><path d="M795.3 649.2h-413l69.5-282.4h413.1L778.5 508z" fill="#EBB866" /><path d="M804.3 657.2H372.1l73.5-298.5h433.6l-92.4 151 17.5 147.5z m-411.8-16h393.8l-16.1-135 80.4-131.4H458.1l-65.6 266.4z" fill="#0A0408" /><path d="M238.4 855.7h-66.1l202.5-750.5H441z" fill="#55B7A8" /><path d="M244.5 863.7h-82.7L368.7 97.2h82.7L244.5 863.7z m-61.8-16h49.6l198.2-734.5H381L182.7 847.7z" fill="#0A0408" /><path d="M693.7 508h-453l69.5-282.5h453z" fill="#EBB866" /><path d="M700 516H230.5L304 217.5h469.5L700 516z m-449.1-16h436.6L753 233.5H316.5L250.9 500z" fill="#0A0408" /><path d="M115.6 850.1h189.8v68.8H115.6z" fill="#68A4D9" /><path d="M313.4 926.9H107.6v-84.8h205.8v84.8z m-189.8-16h173.8v-52.8H123.6v52.8z" fill="#0A0408" /><path d="M65.6 910.9h289.8v16H65.6zM278.6 358.8h232.7v16H278.6z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
src/src/assets/svg/business/-_15.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M548.1 455.7h-72l-36 39.8 36 39.9h72l36-39.9z" fill="#DC444A" /><path d="M551.7 543.4h-79.1l-43.2-47.9 43.2-47.9h79.1l43.2 47.9-43.2 47.9z m-72-16h64.9l28.8-31.9-28.8-31.9h-64.9l-28.8 31.9 28.8 31.9z" fill="#0A0408" /><path d="M512.1 899.4l102.5-110.5-64.4-253.6h-76.1l-64.5 253.6z" fill="#FFFFFF" /><path d="M512.1 911.2l-111.3-120 67.1-263.8h88.5l67.1 263.8-111.4 120z m-93.7-124.6l93.7 101 93.7-101-61.9-243.4h-63.6l-61.9 243.4z" fill="#0A0408" /><path d="M512.1 843.5l72.4-78L539 586.6h-53.7l-45.5 178.9z" fill="#DC444A" /><path d="M512.1 240.3m-167.3 0a167.3 167.3 0 1 0 334.6 0 167.3 167.3 0 1 0-334.6 0Z" fill="#EBB866" /><path d="M512.1 415.5c-96.6 0-175.3-78.6-175.3-175.3S415.5 65 512.1 65c96.6 0 175.3 78.6 175.3 175.3s-78.6 175.2-175.3 175.2z m0-334.5c-87.8 0-159.3 71.4-159.3 159.3s71.4 159.3 159.3 159.3c87.8 0 159.3-71.4 159.3-159.3S599.9 81 512.1 81z" fill="#0A0408" /><path d="M880.3 950H143.9V645.6c0-61.2 116.2-144.2 177.4-144.2L512 774.7l190.7-273.3c61.2 0 177.4 82.9 177.4 144.2V950z" fill="#FFFFFF" /><path d="M888.3 958H135.9V645.6c0-43.4 48.2-85.4 68.9-101.4 39.9-30.9 85.7-50.8 116.6-50.8h4.2l186.6 267.3 186.6-267.3h4.2c30.9 0 76.7 19.9 116.6 50.8 20.7 16 68.9 57.9 68.9 101.4V958z m-736.4-16h720.4V645.6c0-25.2-23.4-58.4-62.6-88.7-35.5-27.4-75.2-45.6-102.7-47.3L512.1 788.8 317.3 509.6c-27.5 1.7-67.2 19.9-102.7 47.3-39.2 30.3-62.6 63.5-62.6 88.7V942z" fill="#0A0408" /><path d="M441.2 896.3H209.6V704.8c0-38.5 31.2-90.7 69.8-90.7h45.3l116.6 172v110.2zM574.6 896.3h231.7V704.8c0-38.5-31.2-90.7-69.8-90.7h-45.3L574.6 786v110.3z" fill="#55B7A8" /><path d="M520.1 930.4h-16v-15.2h16v15.2z m0-31.2h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32h-16v-16h16v16z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
1
src/src/assets/svg/business/-_16.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M841.7 915.2L518.5 797.3 183.1 915.2V107.1h658.6z" fill="#FFFFFF" /><path d="M849.7 926.7L518.4 805.8 175.1 926.5V99.1h674.5v827.6zM191.1 115.1v788.8l327.4-115.1 315.1 115V115.1H191.1z" fill="#0A0408" /><path d="M801.6 868.3l-18.2-6.6 2.2-6.2v-6.6h2.5l0.8-2.3 6.2 2.3h6.5zM256.2 856.6l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m512.4-0.3l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-482.8-10.2l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m453.3-0.6l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-423.6-9.8l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m394.1-1l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-364.5-9.4l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m334.9-1.4l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-305.2-9.1l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m275.7-1.6l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-246.1-8.8l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m216.6-2l-14.8-5.4 5.5-15 14.8 5.4-5.5 15zM434.1 794l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m157.4-2.4l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-127.8-8l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m98.2-2.8l-14.8-5.4 5.5-15 14.8 5.4-5.5 15z m-68.5-7.7l-5.3-15.1 14.8-5.2 5.3 15.1-14.8 5.2z m39-3l-14.8-5.4 5.5-15 14.8 5.4-5.5 15zM223.2 868.2v-19.3h6.6l6.2-2.2 0.8 2.2h2.4v6.6l2.2 6.3zM239.2 833.2h-16v-15.7h16v15.7z m0-31.4h-16V786h16v15.8z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16V629h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V519z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V362z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16V252h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7zM223.2 157.5h16v16h-16zM770 173.5h-15.6v-16H770v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0H692v-16h15.6v16z m-31.3 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0H567v-16h15.6v16z m-31.3 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16H489v16z m-31.3 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.3 0h-15.6v-16h15.6v16z m-31.2 0H286v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16zM785.6 157.5h16v16h-16zM801.6 833.2h-16v-15.7h16v15.7z m0-31.4h-16V786h16v15.8z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16V629h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V519z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16V362z m0-31.5h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16V252h16v15.7z m0-31.4h-16v-15.7h16v15.7z m0-31.4h-16v-15.7h16v15.7z" fill="#0A0408" /><path d="M752.2 791.2l-235.4-85.9-244.2 85.9V196.6h479.6z" fill="#55B7A8" /><path d="M512.4 305.7l42.9 86.8 95.8 13.9-69.4 67.6 16.4 95.5-85.7-45.1-85.7 45.1 16.4-95.5-69.4-67.6 95.8-13.9z" fill="#EBB866" /><path d="M608.7 584.1l-96.3-50.6-96.3 50.6 18.4-107.3-77.9-76 107.7-15.7 48.2-97.6 48.2 97.6 107.7 15.7-77.9 76 18.2 107.3z m-96.3-68.7l75.1 39.5-14.3-83.6 60.7-59.2-83.9-12.2-37.5-76.1-37.5 76.1-84.1 12.1 60.7 59.2-14.3 83.6 75.1-39.4z" fill="#0A0408" /><path d="M205.7 140h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M264.6 198.9h-66.9V132h66.9v66.9z m-50.9-16h34.9V148h-34.9v34.9z" fill="#0A0408" /><path d="M768.2 140h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M827.1 198.9h-66.9V132h66.9v66.9z m-50.9-16h34.9V148h-34.9v34.9z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
1
src/src/assets/svg/business/-_17.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M858.5 933.3h-24v-16h16v3.9h8v12.1z m-40 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0H165v-18.5h16v10.5h-2.5v8z m680-28.1h-16v-16h16v16zM181 898.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 866.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 834.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 802.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 770.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 738.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 706.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 674.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 642.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 610.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 578.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 546.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 514.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 482.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 450.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 418.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 386.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 354.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 322.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 290.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 258.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 226.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 194.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 162.8h-16v-16h16v16z m677.5-25.6h-16v-16h16v16zM181 130.8h-16v-16h16v16z m677.5-25.6h-16v-8.4h0.4v-8h15.6v16.4z m-31.6-0.5h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-32 0H173v-5.9h-8V88.7h21.9v16z" fill="#0A0408" /><path d="M261.7 193.2h500.2v228.9H261.7z" fill="#EBB866" /><path d="M769.8 430.2H253.7v-245h516.2v245z m-500.1-16h484.2v-213H269.7v213z" fill="#0A0408" /><path d="M261.7 496.3h112.4v129.4H261.7z" fill="#55B7A8" /><path d="M382.1 633.7H253.7V488.3h128.4v145.4z m-112.4-16h96.4V504.3h-96.4v113.4z" fill="#0A0408" /><path d="M455.5 496.3h112.4v129.4H455.5z" fill="#55B7A8" /><path d="M576 633.7H447.5V488.3H576v145.4z m-112.5-16H560V504.3h-96.4v113.4z" fill="#0A0408" /><path d="M261.7 709.9h112.4v129.4H261.7z" fill="#55B7A8" /><path d="M382.1 847.3H253.7V701.9h128.4v145.4z m-112.4-16h96.4V717.9h-96.4v113.4z" fill="#0A0408" /><path d="M455.5 709.9h112.4v129.4H455.5z" fill="#55B7A8" /><path d="M576 847.3H447.5V701.9H576v145.4z m-112.5-16H560V717.9h-96.4v113.4z" fill="#0A0408" /><path d="M649.4 496.3h112.4v342.9H649.4z" fill="#55B7A8" /><path d="M769.8 847.3H641.4v-359h128.4v359z m-112.4-16h96.4v-327h-96.4v327zM261.7 256.3h78.5v16h-78.5zM261.7 333h139.7v16H261.7z" fill="#0A0408" /><path d="M147.3 71h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M206.7 130.5h-67.4V63h67.4v67.5z m-51.4-16h35.4V79h-35.4v35.5z" fill="#0A0408" /><path d="M824.8 71h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M884.2 130.5h-67.4V63h67.4v67.5z m-51.4-16h35.4V79h-35.4v35.5z" fill="#0A0408" /><path d="M147.3 899.6h51.4V951h-51.4z" fill="#DC444A" /><path d="M206.7 959h-67.4v-67.4h67.4V959z m-51.4-16h35.4v-35.4h-35.4V943z" fill="#0A0408" /><path d="M824.8 899.6h51.4V951h-51.4z" fill="#DC444A" /><path d="M884.2 959h-67.4v-67.4h67.4V959z m-51.4-16h35.4v-35.4h-35.4V943z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
1
src/src/assets/svg/business/-_18.svg
Normal file
|
After Width: | Height: | Size: 10 KiB |
1
src/src/assets/svg/business/-_2.svg
Normal file
|
After Width: | Height: | Size: 10 KiB |
1
src/src/assets/svg/business/-_3.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M71.2 737.7h180.9v180.9H71.2z" fill="#FFFFFF" /><path d="M260.1 926.6H63.2V729.7h196.9v196.9z m-180.9-16h164.9V745.7H79.2v164.9z" fill="#0A0408" /><path d="M422.1 737.7H603v180.9H422.1z" fill="#FFFFFF" /><path d="M611 926.6H414.1V729.7H611v196.9z m-180.9-16H595V745.7H430.1v164.9z" fill="#0A0408" /><path d="M771.9 737.7h180.9v180.9H771.9z" fill="#FFFFFF" /><path d="M960.8 926.6H763.9V729.7h196.9v196.9z m-180.9-16h164.9V745.7H779.9v164.9z" fill="#0A0408" /><path d="M504.5 397.1h16v333.5h-16zM153.6 732.6h16v8h-16zM169.6 716.2h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.6h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3zM153.6 504.1h16v16h-16z" fill="#0A0408" /><path d="M840 520.1h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-32 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16z m-31.9 0h-16v-16h16v16zM855.9 504.1h16v16h-16zM871.9 716.2h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3z m0-32.6h-16v-16.3h16v16.3z m0-32.7h-16v-16.3h16v16.3zM855.9 732.6h16v8h-16z" fill="#0A0408" /><path d="M655.6 216.7c0 79-143 184.8-143 184.8s-143-105.8-143-184.8 64-143 143-143 143 64 143 143z" fill="#EBB866" /><path d="M512.5 411.5l-4.8-3.5c-6-4.4-146.3-109.2-146.3-191.3 0-83.3 67.8-151 151-151 83.3 0 151 67.8 151 151 0 82.1-140.3 186.8-146.3 191.3l-4.6 3.5z m0-329.8c-74.5 0-135 60.6-135 135 0 30.2 23.9 70.4 69.2 116.4 27.4 27.8 55 50 65.8 58.3 10.8-8.4 38.6-30.6 66-58.5 45.2-45.9 69.1-86.2 69.1-116.3 0-74.3-60.6-134.9-135.1-134.9z" fill="#0A0408" /><path d="M116.7 783.2h89.9v89.9h-89.9z" fill="#55B7A8" /><path d="M467.6 783.2h89.9v89.9h-89.9zM819 783.2h89.9v89.9H819z" fill="#4EB3A6" /><path d="M836.7 486.6h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M895.6 545.5h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /><path d="M130 486.6h50.9v50.9H130z" fill="#DC444A" /><path d="M188.9 545.5H122v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9H138v34.9z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
1
src/src/assets/svg/business/-_4.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M135.3 198.6h752.6V744H135.3z" fill="#FFFFFF" /><path d="M879.9 736h16v16h-16zM864.2 752h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H347v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H300v16z m-31.3 0H253v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H206v16z m-31.3 0H159v-16h15.7v16zM127.3 736h16v16h-16zM143.3 719.9h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16zM127.3 190.6h16v16h-16zM864.2 206.6h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H347v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H300v16z m-31.3 0H253v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H206v16z m-31.3 0H159v-16h15.7v16zM879.9 190.6h16v16h-16zM895.9 719.9h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32.1h-16v-16h16v16z m0-32h-16v-16h16v16z m0-32.1h-16v-16h16v16z" fill="#0A0408" /><path d="M263 274.5h495.8V634H263z" fill="#F4BE6F" /><path d="M758.8 642H255V274.5h16V626h487.8zM503.6 764.6h16v137.2h-16z" fill="#0A0408" /><path d="M511.1 913.7m-35.8 0a35.8 35.8 0 1 0 71.6 0 35.8 35.8 0 1 0-71.6 0Z" fill="#55B7A8" /><path d="M511.1 957.5c-24.2 0-43.8-19.7-43.8-43.8s19.7-43.8 43.8-43.8c24.2 0 43.8 19.7 43.8 43.8s-19.6 43.8-43.8 43.8z m0-71.7c-15.4 0-27.8 12.5-27.8 27.8 0 15.4 12.5 27.8 27.8 27.8 15.4 0 27.8-12.5 27.8-27.8 0.1-15.3-12.4-27.8-27.8-27.8z" fill="#0A0408" /><path d="M268.7 639.7l-11.3-11.3 191.1-191.2L543 530l135.1-133.7 11.2 11.4-146.2 144.8-94.5-92.7z" fill="#0A0408" /><path d="M694.9 467.3h-16v-62h-62v-16h78z" fill="#0A0408" /><path d="M71.9 106.8h879.4v92.8H71.9z" fill="#55B7A8" /><path d="M959.3 207.6H63.9V98.8h895.4v108.8z m-879.4-16h863.4v-76.8H79.9v76.8z" fill="#0A0408" /><path d="M109.9 718.5h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M168.8 777.4h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /><path d="M862.5 718.5h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M921.3 777.4h-66.9v-66.9h66.9v66.9z m-50.8-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
1
src/src/assets/svg/business/-_5.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M503.8 817.7h16v128.9h-16zM503.7 62.7h16v127.7h-16z" fill="#0A0408" /><path d="M511.7 214h379.2v600.7H132.6V214h379.1" fill="#FFFFFF" /><path d="M511.7 206h8v16h-8zM867.1 222h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0H725v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16H646v16z m-31.5 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16zM882.9 206h16v16h-16zM898.9 790.9h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.7h-16V459h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16V380z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16V301h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8zM882.9 806.7h16v16h-16zM867.1 822.7h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16H646v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0H567v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0h-15.8v-16H267v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0H188v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16zM124.6 806.7h16v16h-16zM140.6 790.9h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.7h-16V459h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16V380z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16V301h16v15.8z m0-31.6h-16v-15.8h16v15.8z m0-31.6h-16v-15.8h16v15.8zM124.6 206h16v16h-16zM488 222h-15.8v-16H488v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0H409v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16z m-31.5 0H188v-16h15.8v16z m-31.6 0h-15.8v-16h15.8v16zM503.7 206h8v16h-8zM333.7 957.6l-7.6-14.1 185.7-100.9 182 101-7.8 14-174.3-96.8z" fill="#0A0408" /><path d="M754.6 537.7c0 74.9-60.7 135.6-135.6 135.6s-135.6-60.7-135.6-135.6S544.1 402.1 619 402.1v135.6h135.6z" fill="#55B7A8" /><path d="M619 681.4c-79.2 0-143.6-64.4-143.6-143.6S539.8 394.1 619 394.1h8v135.6h135.6v8c0 79.2-64.4 143.7-143.6 143.7z m-8-271c-66.7 4.1-119.6 59.7-119.6 127.4 0 70.4 57.3 127.6 127.6 127.6 67.7 0 123.2-53 127.4-119.6H611V410.4z" fill="#0A0408" /><path d="M794.5 513.8H642.9V362.2h8c79.2 0 143.6 64.4 143.6 143.6v8z m-135.6-16h119.4c-4-64-55.4-115.4-119.4-119.4v119.4z" fill="#0A0408" /><path d="M750.4 477.8c0-39.5-32-71.5-71.5-71.5v71.5h71.5z" fill="#DC444A" /><path d="M229.1 583.2h16v90.2h-16zM288.7 411.5h16v261.9h-16zM348.3 512.5h16v160.9h-16zM407.9 613.5h16v59.9h-16z" fill="#0A0408" /><path d="M106.9 188.3h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M166.3 247.7H98.9v-67.4h67.4v67.4z m-51.4-16h35.4v-35.4h-35.4v35.4z" fill="#0A0408" /><path d="M106.9 791h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M166.3 850.4H98.9V783h67.4v67.4z m-51.4-16h35.4V799h-35.4v35.4z" fill="#0A0408" /><path d="M865.2 188.3h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M924.6 247.7h-67.4v-67.4h67.4v67.4z m-51.4-16h35.4v-35.4h-35.4v35.4z" fill="#0A0408" /><path d="M865.2 791h51.4v51.4h-51.4z" fill="#DC444A" /><path d="M924.6 850.4h-67.4V783h67.4v67.4z m-51.4-16h35.4V799h-35.4v35.4z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
1
src/src/assets/svg/business/-_6.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M135.3 373h753.1v493H135.3z" fill="#FFFFFF" /><path d="M880.5 365h16v16h-16zM864.8 381h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H755v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16H708v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0H504v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H457v16z m-31.4 0H410v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H159v-16h15.7v16zM127.3 365h16v16h-16zM143.3 841.5h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.8h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16V710z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16V562h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4zM127.3 858h16v16h-16zM864.8 874h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H755v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16H708v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0H504v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16H457v16z m-31.4 0H410v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.4 0h-15.7v-16h15.7v16z m-31.3 0h-15.7v-16h15.7v16z m-31.4 0H159v-16h15.7v16zM880.5 858h16v16h-16zM896.5 841.5h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.8h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16V710z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16V562h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z m0-32.9h-16v-16.4h16v16.4z" fill="#0A0408" /><path d="M192.7 440.7h645.2v454.9H192.7z" fill="#EBB866" /><path d="M71.9 864.5H952v83.9H71.9z" fill="#FFFFFF" /><path d="M959.9 956.4h-896v-99.9H960v99.9z m-880-16H944v-67.9H79.9v67.9z" fill="#0A0408" /><path d="M314.5 334.1h84.4v319.7h-84.4z" fill="#55B7A8" /><path d="M406.9 661.8H306.5V326.1h100.4v335.7z m-84.4-16h68.4V342.1h-68.4v303.7z" fill="#0A0408" /><path d="M475.3 145.7h84.4v508.1h-84.4z" fill="#DC444A" /><path d="M567.6 661.8H467.3V137.7h100.4v524.1z m-84.3-16h68.4V153.7h-68.4v492.1z" fill="#0A0408" /><path d="M636 241.8h84.4v412H636z" fill="#68A4D9" /><path d="M728.4 661.8H628v-428h100.4v428z m-84.4-16h68.4v-396H644v396z" fill="#0A0408" /><path d="M314.5 308.7h84.4v110.8h-84.4z" fill="#FFFFFF" /><path d="M406.9 427.5H306.5V300.7h100.4v126.8z m-84.4-16h68.4v-94.8h-68.4v94.8z" fill="#0A0408" /><path d="M475.3 104h84.4v110.8h-84.4z" fill="#FFFFFF" /><path d="M567.6 222.8H467.3V96h100.4v126.8z m-84.3-16h68.4V112h-68.4v94.8z" fill="#0A0408" /><path d="M636 223.3h84.4v110.8H636z" fill="#FFFFFF" /><path d="M728.4 342.1H628V215.3h100.4v126.8z m-84.4-16h68.4v-94.8H644v94.8z" fill="#0A0408" /><path d="M314.5 742.2h8v16h-8zM696.8 758.2h-15.6v-16h15.6v16z m-31.2 0H650v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16H572v16z m-31.2 0h-15.6v-16h15.6v16z m-31.1 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16z m-31.2 0h-15.6v-16h15.6v16zM712.4 742.2h8v16h-8z" fill="#0A0408" /><path d="M109.9 347.6h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M168.8 406.5h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /><path d="M863.7 346.9h50.9v50.9h-50.9z" fill="#DC444A" /><path d="M922.6 405.7h-66.9v-66.9h66.9v66.9z m-50.9-16h34.9v-34.9h-34.9v34.9z" fill="#0A0408" /></svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
1
src/src/assets/svg/business/-_7.svg
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
1
src/src/assets/svg/business/-_8.svg
Normal file
|
After Width: | Height: | Size: 5 KiB |
1
src/src/assets/svg/business/-_9.svg
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
1
src/src/assets/svg/business/OAxitong.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="170.10px" viewBox="0 0 1204 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 0m84.453608 0l1035.23233 0q84.453608 0 84.453608 84.453608l0 669.801567q0 84.453608-84.453608 84.453609l-1035.23233 0q-84.453608 0-84.453608-84.453609l0-669.801567q0-84.453608 84.453608-84.453608Z" fill="#D6E0E8" /><path d="M47.716289 33.190268m84.453608 0l939.799752 0q84.453608 0 84.453609 84.453608l0 603.421031q0 84.453608-84.453609 84.453608l-939.799752 0q-84.453608 0-84.453608-84.453608l0-603.421031q0-84.453608 84.453608-84.453608Z" fill="#8DDFFF" /><path d="M712.112825 955.001402H492.026722l19.67769-116.292618h180.730722l19.677691 116.292618z" fill="#244F60" /><path d="M693.533031 838.708784h-33.274722l17.650804 116.292618h33.190268l-17.56635-116.292618z" fill="#19355E" opacity=".47" /><path d="M413.82268 955.001402h376.663093a68.998598 68.998598 0 0 1 68.998598 68.998598h-515.16701a68.998598 68.998598 0 0 1 69.505319-68.998598z" fill="#2E5A70" /><path d="M790.485773 955.001402h-41.466721a68.914144 68.914144 0 0 1 68.914144 68.914144h41.551175a68.914144 68.914144 0 0 0-68.998598-68.914144z" fill="#19355E" opacity=".47" /><path d="M602.069773 780.604701m-24.913814 0a24.913814 24.913814 0 1 0 49.827629 0 24.913814 24.913814 0 1 0-49.827629 0Z" fill="#FFFFFF" /><path d="M1133.53633 755.690887v-41.551176H0v41.551176a83.017897 83.017897 0 0 0 83.017897 83.017897h967.500536a83.017897 83.017897 0 0 0 83.017897-83.017897z" fill="#2E5A70" /><path d="M1167.48668 824.520577a78.457402 78.457402 0 0 1-14.103752 7.685279 78.457402 78.457402 0 0 0 14.103752-7.685279zM1203.717278 764.136247a77.866227 77.866227 0 0 1-3.378144 16.215093 77.866227 77.866227 0 0 0 3.378144-16.215093zM1121.037196 0h-70.518763a83.017897 83.017897 0 0 1 83.017897 83.017897v631.121814h70.603216V83.017897A83.102351 83.102351 0 0 0 1121.037196 0zM1173.905155 819.791175a84.453608 84.453608 0 0 0 20.184412-24.491546 84.453608 84.453608 0 0 1-20.184412 24.491546z" fill="#F0F5FF" opacity=".33" /><path d="M1133.53633 755.690887a83.017897 83.017897 0 0 1-83.017897 83.017897h70.518763a82.257814 82.257814 0 0 0 32.345732-6.502928 78.457402 78.457402 0 0 0 14.103752-7.685279 69.75868 69.75868 0 0 0 6.418475-4.729402 84.453608 84.453608 0 0 0 20.184412-24.491546 83.355711 83.355711 0 0 0 6.249567-14.948289 77.866227 77.866227 0 0 0 3.378144-16.215093c0-2.786969 0.422268-5.573938 0.422268-8.44536v-41.551176h-70.603216z" fill="#0459A5" /><path d="M1133.53633 755.690887a83.017897 83.017897 0 0 1-83.017897 83.017897h70.518763a82.257814 82.257814 0 0 0 32.345732-6.502928 78.457402 78.457402 0 0 0 14.103752-7.685279 69.75868 69.75868 0 0 0 6.418475-4.729402 84.453608 84.453608 0 0 0 20.184412-24.491546 83.355711 83.355711 0 0 0 6.249567-14.948289 77.866227 77.866227 0 0 0 3.378144-16.215093c0-2.786969 0.422268-5.573938 0.422268-8.44536v-41.551176h-70.603216z" fill="#153D4C" /><path d="M583.321072 383.166021c0 114.688-68.914144 213.498722-202.68866 213.498721-129.382928 0-197.114722-93.996866-197.114721-212.147464 0-119.924124 74.825897-212.06301 202.68866-212.06301 120.515299 0 197.114722 84.538062 197.114721 210.711753z m-307.833402 0c0 80.484289 35.386062 141.37534 108.438433 141.37534 79.301938 0 107.340536-66.380536 107.340536-139.855175 0-78.372948-31.923464-139.770722-108.776247-139.770722-74.488082 0-107.002722 57.597361-107.002722 137.828289zM731.368247 495.48932l-32.176824 95.179216H611.528577L751.637113 178.450474h111.901031l146.104743 412.218062h-93.743506l-33.781443-95.179216zM862.778062 422.268041c-29.305402-87.07167-47.969649-142.642144-57.935175-179.717278h-0.591176C793.863918 283.426309 773.510598 348.03332 750.032495 422.268041z" fill="#FF9831" /></svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
1
src/src/assets/svg/business/changyongziyuan.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
1
src/src/assets/svg/business/chuchashenpi.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M287.403798 183.554432a124.492312 124.492312 0 0 0-95.870977 45.136335L530.02035 951.711884h14.905487l270.818014-739.676075a124.00246 124.00246 0 0 0-79.146039-28.481377z" fill="#FFAF3B" /><path d="M191.532821 228.690767A127.081528 127.081528 0 0 0 162.07174 310.216087v514.904121A125.961867 125.961867 0 0 0 287.403798 951.711884H316.025133V495.310053zM379.355961 629.949293v321.83257h150.664389L379.355961 629.949293z" fill="#FF761A" /><path d="M379.355961 183.554432h-63.050912v311.755621l63.050912 134.63924V183.554432z" fill="#FF9E1D" /><path d="M316.305049 495.310053v456.47181h63.050912V629.949293l-63.050912-134.63924z" fill="#FF5A08" /><path d="M815.743851 212.035809L662.910119 629.809335v321.902549H736.597812a125.961867 125.961867 0 0 0 125.262078-126.591676V310.216087a126.801613 126.801613 0 0 0-46.116039-98.180278zM544.925837 951.781863h54.93337v-150.034579l-54.93337 150.034579z" fill="#FFC73B" /><path d="M662.910119 183.554432h-63.050912v618.192852l63.050912-172.147885V183.554432z" fill="#FF9E1D" /><path d="M599.859207 801.747284v150.034579h63.050912V629.599399l-63.050912 172.147885z" fill="#FFB206" /><path d="M347.795515 5.668284h72.07818v177.886148h-72.07818z" fill="#2B3747" /><path d="M396.150877 5.668284h23.722818v177.886148h-23.722818z" fill="#1D2B3A" /><path d="M600.908889 5.668284h72.07818v177.886148h-72.07818z" fill="#2B3747" /><path d="M649.26425 5.668284h23.722819v177.886148h-23.722819z" fill="#1D2B3A" /><path d="M730.649612 183.554432H648.354526c72.498052 0 131.210278 53.813709 131.210278 120.153625v527.920181c0 66.339917-58.712226 120.153625-131.210278 120.153625h82.295086c72.498052 0 131.280257-53.813709 131.280257-120.153625V303.708057c-0.069979-66.339917-58.782205-120.153625-131.280257-120.153625z" fill="#EF8B06" /><path d="M389.782804 41.147543v4.618602a13.995763 13.995763 0 0 0 13.995763 13.995763h189.852525a13.995763 13.995763 0 0 0 13.995763-13.995763v-4.618602z" fill="#FF761A" /><path d="M607.486898 13.995763a13.995763 13.995763 0 0 0-13.995763-13.995763H403.63861a13.995763 13.995763 0 0 0-13.995763 13.995763v27.15178h217.844051z" fill="#FF5A08" /><path d="M292.792167 969.69644a54.30356 53.74373 90 1 0 107.48746 0 54.30356 53.74373 90 1 0-107.48746 0Z" fill="#2B3747" /><path d="M346.535897 915.392879a55.213285 55.213285 0 0 0-9.727056 0.909725 54.373539 54.373539 0 0 1 0 106.787671 55.213285 55.213285 0 0 0 9.727056 0.909725 54.30356 54.30356 0 0 0 0-108.607121z" fill="#1D2B3A" /><path d="M587.332999 969.69644a54.30356 53.74373 90 1 0 107.48746 0 54.30356 53.74373 90 1 0-107.48746 0Z" fill="#2B3747" /><path d="M641.076729 915.392879a55.073327 55.073327 0 0 0-9.657076 0.909725 54.373539 54.373539 0 0 1 0 106.787671 55.073327 55.073327 0 0 0 9.657076 0.909725 54.30356 54.30356 0 0 0 0-108.607121z" fill="#1D2B3A" /></svg>
|
||||
|
After Width: | Height: | Size: 3 KiB |
1
src/src/assets/svg/business/fanwendengji.svg
Normal file
|
After Width: | Height: | Size: 6 KiB |
1
src/src/assets/svg/business/feizhengshiwendengji.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M88.917218 106.064551m82.970966 0l597.529237 0q82.970966 0 82.970965 82.970966l0 751.924375q0 82.970966-82.970965 82.970966l-597.529237 0q-82.970966 0-82.970966-82.970966l0-751.924375q0-82.970966 82.970966-82.970966Z" fill="#005691" /><path d="M169.675625 187.44524m48.12316 0l505.708035 0q48.12316 0 48.12316 48.12316l0 658.927751q0 48.12316-48.12316 48.12316l-505.708035 0q-48.12316 0-48.12316-48.12316l0-658.927751q0-48.12316 48.12316-48.12316Z" fill="#E2E5E7" /><path d="M638.392438 73.360162H547.608373a73.360162 73.360162 0 0 0-146.720324 0H302.774882a29.454693 29.454693 0 0 0-29.316408 29.316408V235.084402a29.454693 29.454693 0 0 0 29.316408 29.316408h335.617556A29.38555 29.38555 0 0 0 667.639703 235.084402V102.67657a29.38555 29.38555 0 0 0-29.247265-29.316408z" fill="#FFB236" /><path d="M466.919109 1.175422A78.684132 78.684132 0 0 1 479.779608 0a73.360162 73.360162 0 0 1 73.360162 73.360162h-25.790141A73.360162 73.360162 0 0 0 466.919109 1.175422zM647.450101 235.084402V102.67657c0-16.110196 1.451992-29.316408-14.658204-29.316408h11.131938a29.454693 29.454693 0 0 1 29.316408 29.316408V235.084402a29.454693 29.454693 0 0 1-29.316408 29.316408h-11.131938c16.179338 0 14.658204-13.206212 14.658204-29.316408z" fill="#E28805" /><path d="M474.248211 73.360162m-25.790142 0a25.790142 25.790142 0 1 0 51.580283 0 25.790142 25.790142 0 1 0-51.580283 0Z" fill="#005691" /><path d="M492.570966 81.449831a25.651857 25.651857 0 0 1-31.252397 13.828494c0.82971 0.483997 1.590277 0.967995 2.489129 1.38285a25.790142 25.790142 0 1 0 20.742741-47.155166 20.742741 20.742741 0 0 0-2.696556-0.898852 25.651857 25.651857 0 0 1 10.717083 32.842674z" fill="#004870" /><path d="M348.408913 163.314517m20.258744 0l200.167454 0q20.258744 0 20.258745 20.258744l0 2.419987q0 20.258744-20.258745 20.258744l-200.167454 0q-20.258744 0-20.258744-20.258744l0-2.419987q0-20.258744 20.258744-20.258744Z" fill="#E2E5E7" /><path d="M259.699122 387.474409m21.019311 0l252.715733 0q21.019311 0 21.019311 21.019311l0 2.489129q0 21.019311-21.019311 21.019312l-252.715733 0q-21.019311 0-21.019311-21.019312l0-2.489129q0-21.019311 21.019311-21.019311Z" fill="#586A73" /><path d="M259.699122 485.864146m21.019311 0l252.715733 0q21.019311 0 21.019311 21.019311l0 2.489129q0 21.019311-21.019311 21.019311l-252.715733 0q-21.019311 0-21.019311-21.019311l0-2.489129q0-21.019311 21.019311-21.019311Z" fill="#586A73" /><path d="M259.699122 584.323025m21.019311 0l125.770156 0q21.019311 0 21.019311 21.019311l0 2.489129q0 21.019311-21.019311 21.019312l-125.770156 0q-21.019311 0-21.019311-21.019312l0-2.489129q0-21.019311 21.019311-21.019311Z" fill="#586A73" /><path d="M461.318569 895.533288l310.311411-124.456448v110.143957z" fill="#C6CBCB" opacity=".7" /><path d="M841.947873 509.303444l-308.098852 298.833761 27.034706 31.183254 320.61364-288.669818z" fill="#EB8923" /><path d="M533.849021 808.137205l-29.316408-21.503309 316.465091-324.001621 20.742742 46.671169z" fill="#ED9E43" /><path d="M560.883727 839.320459l12.653072 33.050101 361.545983-304.226873-53.585415-17.285618z" fill="#D27228" /><path d="M820.997704 462.632275l20.742742 46.671169 39.549493 41.485482 53.585415 17.285618-16.24848-46.394598-43.490615-44.596894z m-316.465091 324.001621s62.228224 25.375287 69.142471 85.736664c0 0-103.713707 36.023228-112.218231 23.162728s43.07576-108.899392 43.07576-108.899392z" fill="#F2B643" /><path d="M461.318569 895.533288c3.802836 5.669683 25.997569 1.866847 49.644294-4.21769l-37.267792-41.485483c-9.126806 20.950169-15.833626 40.448346-12.376502 45.703173z" fill="#EB8923" /><path d="M851.282107 509.303444l-7.398245-33.948954 14.934774-2.903984-37.820932-9.818231 20.742742 46.671169 39.549493 41.485482z" fill="#D89932" /><path d="M462.286563 896.639568l1.037137 0.55314-0.967994-0.55314z m44.320324-4.217691c31.183255-7.674814 66.791627-20.051317 66.791628-20.051317a91.890344 91.890344 0 0 0-10.647941-33.603241l-65.270493 37.613505 13.206212 14.934774z" fill="#D89932" opacity=".4" /><path d="M472.588791 898.298987H479.019041l2.903984-0.414855h0.622282l3.664551-0.553139 3.249696-0.622283H489.943552l3.526266-0.691424h0.622282l7.951384-1.797705h0.622282l3.871979-0.898852 4.217691-1.106279-13.344497-14.934774-35.124376 19.359892 0.967995 0.55314 1.451992 0.414854h7.052532z" fill="#D27228" /></svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
1
src/src/assets/svg/business/gongwenjiaohuan.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M799.521962 974.880603H210.446693a70.282921 70.282921 0 0 1-70.139925-70.139924V182.320905a68.781455 68.781455 0 0 1 2.573943-18.446586A70.35442 70.35442 0 0 0 91.187372 231.440302v722.13378a70.35442 70.35442 0 0 0 70.139924 70.139924h589.146767a70.35442 70.35442 0 0 0 67.565983-51.693338 68.924452 68.924452 0 0 1-18.518084 2.859935z" fill="#FCB670" /><path d="M745.183182 310.946516c-59.701159 0-108.248569-51.049853-108.248568-113.753945V0H254.489704a74.286831 74.286831 0 0 0-72.14188 75.859796v781.119955a74.215333 74.215333 0 0 0 72.14188 75.788298h606.163385a74.215333 74.215333 0 0 0 72.141879-75.788298V310.946516z" fill="#F9B04E" /><path d="M673.041303 197.192571a74.215333 74.215333 0 0 0 72.141879 75.788298h187.611786L673.041303 0z" fill="#EDA43A" /><path d="M636.934614 0h-8.579808l8.579808 9.008798V0z" fill="#D86100" opacity=".25" /><path d="M700.496686 310.946516h44.686496a107.676581 107.676581 0 0 1-95.235861-59.844156 77.575758 77.575758 0 0 1-21.449518-53.909789V0h-35.749197v197.192571c-0.500489 62.704092 48.046921 113.753945 107.74808 113.753945zM888.108472 856.979751a74.215333 74.215333 0 0 1-72.14188 75.788298h44.686497a74.215333 74.215333 0 0 0 72.141879-75.788298V310.946516h-44.686496z" fill="#D86100" opacity=".25" /><path d="M622.205944 675.159335H488.646944a145.14174 145.14174 0 0 1-128.697109-212.35023L405.780306 493.338919a90.731462 90.731462 0 0 0 82.866638 127.33864h133.559V573.417121L731.097999 646.059489l-108.892055 72.57087v-43.471024z m-120.403295-235.9447v43.685519L392.910595 410.400782l108.892054-72.57087v46.974445h131.986035a145.14174 145.14174 0 0 1 128.69711 211.992738l-45.758973-30.458315A90.731462 90.731462 0 0 0 670.324364 446.864963a89.444491 89.444491 0 0 0-36.321185-7.57883z" fill="#FF6845" /></svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
1
src/src/assets/svg/business/gongzuohuibao.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="191.76px" viewBox="0 0 1068 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0.62344 217.658447v708.227702c0 53.927549 38.964992 98.113851 85.722983 98.113851h896.194825c47.225571 0 85.722983-44.186301 85.722983-98.113851V214.151598c-7.169559 2.18204-1067.640791 3.506849-1067.640791 3.506849z" fill="#BDEBFF" /><path d="M981.917808 0H85.722983C38.964992 0 0 44.186301 0 98.113851v122.817656h1067.640791V98.113851C1067.640791 44.186301 1028.675799 0 981.917808 0z" fill="#005691" /><path d="M61.486758 112.608828a20.807306 20.028006 0 1 0 41.614612 0 20.807306 20.028006 0 1 0-41.614612 0Z" fill="#FF441F" /><path d="M158.977169 112.608828a20.807306 20.028006 0 1 0 41.614612 0 20.807306 20.028006 0 1 0-41.614612 0Z" fill="#6FE513" /><path d="M256.46758 112.608828a20.807306 20.028006 0 1 0 41.614612 0 20.807306 20.028006 0 1 0-41.614612 0Z" fill="#FFF41F" /><path d="M0 220.931507h1067.640791v43.640791H0z" fill="#9FE6FF" /><path d="M271.741857 473.658447H126.324505V311.719939h145.417352z m-122.038356-23.378995h98.65936V335.098935H149.703501zM335.098935 377.103196h595.774733v31.171994H335.098935zM271.741857 711.344901H126.324505V549.328463h145.417352z m-122.038356-23.378995h98.65936V572.707458H149.703501zM335.098935 614.71172h595.774733v31.171994H335.098935zM271.741857 949.031355H126.324505V787.092846h145.417352z m-122.038356-23.378996h98.65936V810.471842H149.703501zM335.098935 852.398174h595.774733v31.171993H335.098935z" fill="#0D455E" /><path d="M181.888584 493.608524l-69.903196-113.621918 33.198174-20.417656 43.562861 70.838356L321.071537 293.016743l28.054795 27.041704-167.237748 173.550077zM181.888584 712.981431l-69.903196-113.621918 33.198174-20.417656 43.562861 70.838356L321.071537 512.38965l28.054795 27.041705-167.237748 173.550076z" fill="#FF441F" /></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
1
src/src/assets/svg/business/gudingzichan.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M278.521074 32.22621h31.878195V485.133225h-31.878195z" fill="#C99071" /><path d="M310.329666 0h31.878195v485.133225h-31.878195z" fill="#F9CAA7" /><path d="M278.521074 32.22621L251.863108 0h113.870582l-23.525829 32.22621h-63.686787z" fill="#F9CAA7" /><path d="M134.860389 71.969549h31.878195v452.907014h-31.878195z" fill="#C99071" /><path d="M166.738584 39.812942h31.878195v485.133224h-31.878195z" fill="#F9CAA7" /><path d="M134.860389 72.039152l-26.657966-32.22621h113.940185l-23.525829 32.22621h-63.75639z" fill="#F9CAA7" /><path d="M521.85332 323.306145L150.312265 544.365416v479.634584h375.508429V325.95106l-3.967374-2.644915z" fill="#FF7352" /><path d="M873.766316 554.249048l-347.945622-228.297988v698.04894h347.945622V554.249048z" fill="#FF5736" /><path d="M734.281814 749.48559H317.289971l-34.801523-53.803154h486.594889l-34.801523 53.803154z" fill="#FFFFFF" opacity=".53" /><path d="M572.315528 546.244698H479.32586V456.665579h92.989668z m-86.029364-6.960304h79.069059V463.625884H486.286164z" fill="#FCFCFC" /><path d="M522.340542 460.145731h6.960304v82.688418h-6.960304z" fill="#FCFCFC" /><path d="M482.806012 497.940185h86.029364v6.960304H482.806012z" fill="#FCFCFC" /><path d="M317.289971 746.840674h86.516585v277.159326H317.289971z" fill="#52C1FF" /><path d="M403.806556 746.840674h330.475258v277.159326H403.806556z" fill="#45ABFF" /><path d="M29.898997 639.512779a27.841218 27.841218 0 0 1-14.964654-51.367048l492.232735-314.118542a27.841218 27.841218 0 0 1 30.41653 0.348015l472.047853 314.04894a27.841218 27.841218 0 0 1-30.834149 46.355628L521.85332 330.75367 44.863652 635.127787a27.841218 27.841218 0 0 1-14.964655 4.384992z" fill="#823500" /><path d="M317.289971 799.042958h86.516585v47.051659H317.289971z" fill="#A2DCFC" /><path d="M403.806556 799.042958h330.475258v47.051659H403.806556zM403.806556 895.234367h330.475258v47.051658H403.806556z" fill="#C2E6FF" /><path d="M317.289971 895.234367h86.516585v47.051658H317.289971zM317.289971 976.739532h86.516585v47.051659H317.289971z" fill="#A2DCFC" /><path d="M403.806556 976.739532h330.475258v47.051659H403.806556z" fill="#C2E6FF" /></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/src/assets/svg/business/huiyiguanli.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="180.12px" viewBox="0 0 1137 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1120.237833 68.659474h0.900183a16.366978 16.366978 0 0 0 16.366979-16.366978V17.512667a16.366978 16.366978 0 0 0-16.366979-16.366979H17.594502a16.366978 16.366978 0 0 0-16.366979 16.366979v34.452489a16.366978 16.366978 0 0 0 16.366979 16.366979h2.045872a16.366978 16.366978 0 0 1 16.366978 16.366978v628.819308a16.366978 16.366978 0 0 1-16.366978 16.366978H16.366978a16.366978 16.366978 0 0 0-16.366978 16.366979v34.534324a16.366978 16.366978 0 0 0 16.366978 16.366978h501.647887a18.249181 18.249181 0 0 1 2.209542 0h96.647007a18.249181 18.249181 0 0 1 2.209542 0h501.156877a16.366978 16.366978 0 0 0 16.366978-16.366978v-34.043315a16.366978 16.366978 0 0 0-16.366978-16.366978 16.366978 16.366978 0 0 1-16.366979-16.366979V85.271957a16.366978 16.366978 0 0 1 16.366979-16.612483z" fill="#2CDB8F" /><path d="M534.709182 814.502677v115.223528a16.366978 16.366978 0 0 1-16.366978 16.366978h-46.482218a16.366978 16.366978 0 0 0-16.366979 16.366978v44.436347a16.366978 16.366978 0 0 0 16.366979 16.366978h193.375849a16.366978 16.366978 0 0 0 16.366978-16.366978v-44.436347a16.366978 16.366978 0 0 0-16.366978-16.366978h-46.154879a16.366978 16.366978 0 0 1-16.366979-16.366978V814.502677a16.366978 16.366978 0 0 1 14.402941-16.366978H520.224407a16.366978 16.366978 0 0 1 14.484775 16.366978z" fill="#1CD384" /><path d="M665.31767 945.438504h-46.236714a16.366978 16.366978 0 0 1-16.366979-16.366978v-115.387198a16.366978 16.366978 0 0 1 16.366979-16.366978h-25.123312a16.366978 16.366978 0 0 0-16.366978 16.366978v115.141693a16.366978 16.366978 0 0 0 16.366978 16.366978h46.154879a16.366978 16.366978 0 0 1 16.366978 16.366979v45.00919a16.366978 16.366978 0 0 1-16.366978 16.366978h25.205147a16.366978 16.366978 0 0 0 16.366978-16.366978v-44.436346a16.366978 16.366978 0 0 0-16.366978-16.694318z" fill="#059959" opacity=".31" /><path d="M1120.237833 67.75929h0.900183a16.366978 16.366978 0 0 0 16.366979-16.366978V16.366978a16.366978 16.366978 0 0 0-16.366979-16.366978h-58.757452a16.366978 16.366978 0 0 1 16.366979 16.366978v34.779829a16.366978 16.366978 0 0 1-16.366979 16.366979h-0.982018a16.366978 16.366978 0 0 0-16.366979 16.366978v628.737473a16.366978 16.366978 0 0 0 16.366979 16.366978 16.366978 16.366978 0 0 1 16.366978 16.366979v34.534324a16.366978 16.366978 0 0 1-16.366978 16.366978h58.757452a16.366978 16.366978 0 0 0 16.366978-16.366978v-33.96148a16.366978 16.366978 0 0 0-16.366978-16.366978 16.366978 16.366978 0 0 1-16.366979-16.366979V84.371773a16.366978 16.366978 0 0 1 16.448814-16.612483z" fill="#009E5A" opacity=".16" /><path d="M901.902342 526.771198l-176.763367-162.851435a25.205147 25.205147 0 0 0-35.680012 1.554863L552.631024 515.559818a25.205147 25.205147 0 0 1-33.797811 3.191561l-137.646287-103.930313a25.123312 25.123312 0 0 0-32.733957 2.291377l-75.45177 75.45177a25.205147 25.205147 0 0 1-35.598178 0l-23.732119-23.732118a25.123312 25.123312 0 0 1 0-35.680013l126.844082-127.089587a25.286982 25.286982 0 0 1 32.733957-2.291377l135.109406 101.966275a25.123312 25.123312 0 0 0 33.797811-3.109726l142.147207-156.059138a25.205147 25.205147 0 0 1 35.843682-1.554863l238.794214 220.054024a25.123312 25.123312 0 0 1 1.391193 35.598177l-22.7501 24.550468a25.123312 25.123312 0 0 1-35.680012 1.554863z" fill="#FFFFFF" /><path d="M216.944298 472.350995l123.570686-123.488852a25.123312 25.123312 0 0 1 32.733957-2.291377l135.109406 101.966275a25.205147 25.205147 0 0 0 33.797811-3.109725l142.147207-156.059139a25.123312 25.123312 0 0 1 35.843682-1.554863l235.929993 217.435307 4.255414-4.582754a25.123312 25.123312 0 0 0-1.391193-35.598177L720.147047 245.013666a25.205147 25.205147 0 0 0-35.680013 1.554863L542.156158 402.627667a25.123312 25.123312 0 0 1-33.797811 3.109726L373.494446 303.771118a25.286982 25.286982 0 0 0-32.733957 2.291377L213.425398 433.152082a25.123312 25.123312 0 0 0 0 35.680013z" fill="#EAEAEA" opacity=".8" /><path d="M119.397107 154.995285a8.183489 8.183489 0 0 1-8.183489-8.183489v-81.834892a8.183489 8.183489 0 0 1 8.183489-8.183489H188.220251A8.183489 8.183489 0 0 1 188.220251 73.651403h-60.55782v73.651402a8.183489 8.183489 0 0 1-8.265324 7.69248zM119.397107 188.220251a8.183489 8.183489 0 0 1-8.183489-8.183489v-8.183489a8.183489 8.183489 0 1 1 16.366978 0v7.446975a8.183489 8.183489 0 0 1-8.183489 8.920003z" fill="#DEFFF0" /></svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
1
src/src/assets/svg/business/huiyiyuding.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="182.86px" viewBox="0 0 1120 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M907.736266 602.111768l-7.87692-3.071998a211.731611 211.731611 0 0 1-234.574679 0l-7.87692 3.071998a344.615252 344.615252 0 0 0-212.676841 321.142031v70.183357a29.853527 29.853527 0 0 0 30.011065 30.56245h616.290225a29.853527 29.853527 0 0 0 29.459681-30.168604v-70.183357a344.615252 344.615252 0 0 0-212.755611-321.535877z" fill="#289FF7" /><path d="M738.146178 634.48591a209.289766 209.289766 0 0 0 22.370453-1.339077 210.628842 210.628842 0 0 1-94.523041-34.107063l-7.87692 3.071998c-6.143998 2.520614-12.130457 5.198767-18.038147 7.87692a210.943919 210.943919 0 0 0 98.067655 24.497222zM907.736266 602.111768l-7.87692-3.071998a219.372223 219.372223 0 0 1-19.062146 11.185226 344.77279 344.77279 0 0 1 194.638694 313.028803v70.183357a29.853527 29.853527 0 0 1-29.459681 30.168604h44.740906a29.853527 29.853527 0 0 0 29.459681-30.168604v-70.183357a344.615252 344.615252 0 0 0-212.440534-321.142031z" fill="#0784D1" opacity=".67" /><path d="M778.239701 641.968984L724.676644 896.157194l51.042442 84.440583 49.467058-82.78643L778.239701 641.968984z" fill="#FCFCFC" /><path d="M897.023655 341.85833l-122.092261-60.494746S662.764053 385.26016 574.306241 387.465697a206.217767 206.217767 0 0 0 77.036278 161.55563l6.616613 5.277537a211.495303 211.495303 0 0 0 190.857772 22.212914c20.952607-33.791987 41.117523-84.283045 51.436288-159.428861a211.337765 211.337765 0 0 0-3.229537-75.224587z" fill="#FFDDCC" /><path d="M897.023655 341.85833c-15.75384-69.474435-64.275668-122.801184-111.773495-159.743939h-10.318766c-110.276881 0-200.625154 92.159965-200.625153 205.587614 88.457812-2.205538 200.625154-106.102113 200.625153-106.102113zM783.674776 639.842215l-5.435075 2.126769s1.96923-0.630154 5.435075-2.126769z" fill="#2B3747" /><path d="M892.061195 554.377633l6.537844-5.356306a206.375305 206.375305 0 0 0 77.036278-161.55563v-6.695382l-78.7692-38.911985a211.337765 211.337765 0 0 1 2.993229 75.382125c-10.318765 75.145817-30.483681 126.030721-51.436288 159.428862a210.707611 210.707611 0 0 0 43.638137-22.212915z" fill="#FFCBBB" /><path d="M897.023655 341.85833l78.7692 38.911985c-3.387076-106.811036-86.646121-193.220849-190.227619-198.655924 47.182751 36.942755 96.019655 90.269504 111.458419 159.743939z" fill="#1D2B3A" /><path d="M572.494549 569.895165a270.572204 270.572204 0 0 1 162.185784-450.874903 435.514909 435.514909 0 1 0-353.043557 748.78002 409.599842 409.599842 0 0 1 190.857773-297.905117z" fill="#FF9C39" /><path d="M411.017688 197.631924h-54.035671v209.526073L233.629449 533.740102l39.935984 30.168604 137.452255-141.075638V197.631924z" fill="#FFFFFF" /></svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
1
src/src/assets/svg/business/kaoqinguanli.svg
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
1
src/src/assets/svg/business/qingxiujiashenqing.svg
Normal file
|
After Width: | Height: | Size: 11 KiB |
1
src/src/assets/svg/business/sannianjihua.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="177.47px" viewBox="0 0 1154 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 0l746.638036 945.827741 66.369622-225.139338z" fill="#C6CBCB" /><path d="M521.902897 462.566354l-51.252546 133.547643L746.638036 945.827741l66.369622-225.139338z" fill="#D672AD" /><path d="M746.638036 945.827741l-68.713981-168.227994L0 0l602.096155 827.235494z" fill="#D1D5D5" /><path d="M677.924055 777.518907l-388.759454 246.481093L0 0z m135.083603-56.587984L0 0l1154.394884 571.296124z" fill="#E2E5E7" /><path d="M411.798847 472.267151l-132.739243 515.759059 10.104997 35.97379 389.163654-246.804453z m695.22381 75.504539L521.902897 462.566354l291.023921 258.687929 341.468066-149.958159z" fill="#EA8EBC" /><path d="M411.798847 472.267151l-132.739243 515.759059 152.221678-493.123865z m110.10405-9.700797l25.949633 23.120233 559.008447 62.085103z" fill="#D672AD" /><path d="M678.328255 777.195547l-77.121339 48.503987 59.013183 48.503987z" fill="#C6CBCB" /><path d="M28.698192 101.535012l23.201074-42.036788L0 0zM62.893503 55.779585l52.384305 1.293439L0 0z" fill="#EA8EBC" /></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/src/assets/svg/business/tongzhifabu.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M398.302947 908.730277a112.4029 112.4029 0 1 0 224.732669 0H398.302947z" fill="#FF761A" /><path d="M510.705848 1001.095185a112.256637 112.256637 0 0 1-110.501485-92.438039h-1.901416a112.4029 112.4029 0 1 0 224.732669 0h-1.828284a112.329769 112.329769 0 0 1-110.501484 92.438039z" fill="#EF670A" /><path d="M904.006301 740.089362H117.405394a56.164884 56.164884 0 0 0 0 112.329768h786.600907a56.164884 56.164884 0 1 0 0-112.329768z" fill="#005691" /><path d="M769.51773 163.082932C610.968942 33.128506 452.639548 62.966101 378.191824 88.854602A393.446716 393.446716 0 0 0 117.405394 459.191808v280.897554h786.600907V459.191808A392.349746 392.349746 0 0 0 769.51773 163.082932z" fill="#138EE2" /><path d="M769.51773 163.082932C668.230797 80.444496 567.30952 62.307919 488.035126 66.988326c70.571762 4.168488 152.990805 28.448099 235.482979 96.094606A392.349746 392.349746 0 0 1 858.372332 459.191808v280.897554h45.999626V459.191808A392.349746 392.349746 0 0 0 769.51773 163.082932z" fill="#006AA5" opacity=".51" /><path d="M564.749923 80.444496c0-44.463867-29.691332-80.444496-66.330144-80.444496s-66.330143 35.980629-66.330143 80.444496z" fill="#0984C9" /><path d="M290.726717 278.411087h-2.340203a11.774149 11.774149 0 0 1-9.14142-13.894958c6.216166-30.568908 34.225476-88.342683 95.509556-88.342683a11.774149 11.774149 0 1 1 0 23.475166C317.200269 199.429218 302.573997 268.318959 302.573997 269.050273a11.774149 11.774149 0 0 1-11.84728 9.360814zM271.346907 330.334352h-2.340204a11.627886 11.627886 0 0 1-9.14142-13.821827c0.585051-3.071517 1.023839-5.192327 1.316365-6.654953a9.580208 9.580208 0 0 1 0.365657-3.510306 11.84728 11.84728 0 0 1 14.626272-9.433945c11.335361 2.632729 9.360814 12.139806 6.947479 24.279611a11.774149 11.774149 0 0 1-11.774149 9.14142z" fill="#FFFFFF" /></svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
1
src/src/assets/svg/business/xiangmuguanli.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="199.42px" viewBox="0 0 1027 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M852.995973 895.203456h-4.423164c-2.249067 0-4.498133-2.249067-8.921297-2.249067l-408.730361-86.589062a55.77685 55.77685 0 0 1-33.286185-22.490666 45.356175 45.356175 0 0 1-6.672231-37.484442l122.199283-562.266637a54.577348 54.577348 0 0 1 51.05381-39.958416h4.423165c2.249067 0 4.498133 2.249067 8.921297 2.249066l408.730361 86.589063a50.229153 50.229153 0 0 1 39.958416 59.975108l-117.70115 559.792664c-11.095395 26.838861-31.411963 42.432389-55.551944 42.432389z m-415.402591-133.294678l422.074822 91.087195 119.950216-573.137125-422.074822-91.012227z" fill="#007FC6" /><path d="M544.199136 444.265612l13.344462-59.975108 333.236693 68.896406-13.644337 62.149205z m31.112087-113.277985l4.423165-31.112087 2.249066-6.672231 333.236694 73.31957-6.672231 37.484442z" fill="#007FC6" /><path d="M173.253093 788.597701a52.478219 52.478219 0 0 1-51.05381-40.033384L4.423164 188.846621a38.98382 38.98382 0 0 1 6.672231-37.484442 50.154184 50.154184 0 0 1 33.361154-22.490666L453.18691 44.456549a12.06999 12.06999 0 0 1 11.095395-4.498133 52.478219 52.478219 0 0 1 51.05381 37.484442l117.776119 562.266638c6.597262 26.688923-13.344462 55.551944-40.033385 62.224174l-408.730361 86.664031zM46.630646 173.253093l119.950216 573.137126 422.074823-91.087195-119.950216-570.88806z" fill="#007FC6" /><path d="M135.468775 424.24892l335.48576-71.070503L479.800864 397.33509h-2.249067l-333.161725 71.370379z m-22.490665-117.701149l335.410791-71.070503L457.310198 279.858848l-335.110915 71.145471z" fill="#007FC6" /><path d="M235.477268 797.44403a27.963394 27.963394 0 0 1-28.863021-28.863021V53.302877a27.963394 27.963394 0 0 1 28.863021-28.86302h553.120433A27.963394 27.963394 0 0 1 817.160846 53.302877v717.527198a27.963394 27.963394 0 0 1-28.86302 28.863021H235.477268z" fill="#66CCFF" /><path d="M235.477268 817.160846a51.653562 51.653562 0 0 1-51.12878-51.128779V51.053811A51.728531 51.728531 0 0 1 235.477268 0h553.120433a53.602753 53.602753 0 0 1 37.484443 15.518559A50.45406 50.45406 0 0 1 839.651512 51.053811v715.278131a51.653562 51.653562 0 0 1-51.053811 51.12878z m-4.423164-42.207482h566.389926V46.630646H231.054104z" fill="#1CA5F9" /><path d="M206.614247 148.813237h615.269639v33.361154H206.614247z m402.05813-48.879713A28.038363 28.038363 0 0 0 637.235522 128.871513a26.838861 26.838861 0 0 0 28.863021-28.937989 28.863021 28.863021 0 1 0-57.726041 0z" fill="#2EB9FF" /><path d="M635.286331 122.199283a20.991288 20.991288 0 0 1-22.490665-22.490666 22.490665 22.490665 0 0 1 44.38158 0 20.991288 20.991288 0 0 1-21.890915 22.490666z m55.551944-22.490666a28.863021 28.863021 0 1 0 57.726042 0 28.863021 28.863021 0 1 0-57.726042 0z" fill="#FFFFFF" /><path d="M719.701296 122.199283a20.991288 20.991288 0 0 1-22.490666-22.490666 22.490665 22.490665 0 1 1 44.38158 0 20.991288 20.991288 0 0 1-21.890914 22.490666z" fill="#FFFFFF" /><path d="M986.290651 635.286331H659.726188v75.568636H581.983454v51.053811h-122.199282v-51.053811h-68.821437V635.286331H39.958416v351.00432h946.332235z" fill="#FFB236" /><path d="M86.664031 1024A88.163409 88.163409 0 0 1 0 937.111062V682.216853a88.163409 88.163409 0 0 1 86.664031-86.888937h304.298704a133.369646 133.369646 0 0 0 266.514386 0H937.111062A88.163409 88.163409 0 0 1 1024 682.216853v254.894209A88.163409 88.163409 0 0 1 937.111062 1024z m0-382.341313a46.855553 46.855553 0 0 0-28.93799 11.39527A38.384069 38.384069 0 0 0 46.630646 682.216853v254.894209a46.630646 46.630646 0 0 0 11.095395 28.863021 38.459038 38.459038 0 0 0 28.93799 11.095395H937.111062a46.630646 46.630646 0 0 0 28.863021-11.095395 38.3091 38.3091 0 0 0 11.095395-28.863021V682.216853a46.780584 46.780584 0 0 0-11.095395-28.86302 38.3091 38.3091 0 0 0-28.863021-11.395271H693.087342l-2.249067 4.423164a180.899919 180.899919 0 0 1-168.829929 124.448349 178.800791 178.800791 0 0 1-168.829929-124.448349l-2.174098-4.423164z" fill="#FFA41F" /><path d="M330.462845 284.581887h360.37543v199.342266H330.462845z" fill="#FFFFFF" /><path d="M389.163482 333.536569h248.371916v33.960905H389.163482zM389.163482 403.782415h248.371916v33.960904H389.163482z" fill="#DCE0E2" /></svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
1
src/src/assets/svg/business/xinxitougao.svg
Normal file
|
After Width: | Height: | Size: 6 KiB |
1
src/src/assets/svg/business/zhishichanquan.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M508.213034 0.023163v732.038057h142.943577v-2.504121a120.406488 120.406488 0 0 1 53.908162-99.399695A344.594881 344.594881 0 0 0 508.213034 0.023163z" fill="#FF9C39" /><path d="M508.213034 0.023163h-9.877367a344.66444 344.66444 0 0 0-179.114214 630.2038 120.8934 120.8934 0 0 1 53.699485 100.164843v1.87809H508.213034z" fill="#FFCB39" /><path d="M652.965143 732.06122H508.213034v84.374968h137.726658a22.050177 22.050177 0 0 0 22.050177-22.050177v-47.64786a14.676932 14.676932 0 0 0-15.024726-14.676931z" fill="#2EB9FF" /><path d="M372.920938 732.06122h-2.643239a22.050177 22.050177 0 0 0-22.050178 22.050177v40.274614a22.050177 22.050177 0 0 0 22.050178 22.050177H508.213034v-84.374968z" fill="#5FD9FF" /><path d="M508.213034 1024h46.604475a82.635995 82.635995 0 0 0 82.635995-82.635995v-42.222263a82.635995 82.635995 0 0 0-82.635995-82.705554H508.213034z" fill="#2EB9FF" /><path d="M469.329598 816.436188a82.635995 82.635995 0 0 0-82.635995 82.705554v42.222263a82.635995 82.635995 0 0 0 82.635995 82.635995H508.213034v-207.563812z" fill="#48CBFF" /><path d="M370.277699 816.436188a22.119736 22.119736 0 0 0-22.050178 22.119736v40.274613a22.050177 22.050177 0 0 0 22.050178 22.050178H508.213034v-84.444527z" fill="#2793FF" /><path d="M645.661456 816.436188H508.213034v84.444527h137.726658a22.050177 22.050177 0 0 0 22.050177-22.050178v-40.274613a22.119736 22.119736 0 0 0-22.328413-22.119736z" fill="#0068FF" /><path d="M507.656562 502.308112l-153.446974-182.939955 22.53709-18.920026L508.213034 457.164374l137.865776-156.994478 22.119736 19.476497-160.541984 182.661719z" fill="#FFF48D" /><path d="M493.257866 479.701464h29.423423v252.359756h-29.423423z" fill="#FFF48D" /></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
1
src/src/assets/svg/business/zhongxindongtaifabu.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="180.12px" viewBox="0 0 1137 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 506.510163l91.916773 51.056024V222.555835L0 279.744954v226.765209z" fill="#0C4A6D" /><path d="M73.039584 234.344122v312.708188l18.877189 10.513877V222.555835l-18.877189 11.788287z" fill="#146082" /><path d="M629.239605 61.98026v634.974447c0 60.773395 232.898304 77.659318 232.898304 46.993844V15.066067C862.376861-15.838359 629.239605 1.286516 629.239605 61.98026z" fill="#5ABCFF" /><path d="M838.402035 2.401624V756.772295c14.735358-2.389517 23.895175-6.610998 23.895175-12.664443V15.066067c0.079651-6.133095-9.159817-10.274925-23.895175-12.664443z" fill="#2E95CE" /><path d="M917.900906 523.379896m13.560728-10.844775l19.159193-15.321977q13.560728-10.844776 24.405503 2.715952l100.786767 126.02768q10.844776 13.560728-2.715952 24.405503l-19.159193 15.321977q-13.560728 10.844776-24.405504-2.715952l-100.786767-126.02768q-10.844776-13.560728 2.715953-24.405503Z" fill="#FF9545" /><path d="M917.962394 188.82484m10.844775-13.560727l100.786767-126.02768q10.844776-13.560728 24.405503-2.715952l19.159194 15.321976q13.560728 10.844776 2.715952 24.405503l-100.786767 126.02768q-10.844776 13.560728-24.405504 2.715952l-19.159193-15.321976q-13.560728-10.844776-2.715952-24.405503Z" fill="#FF9545" /><path d="M941.065002 389.835298m0.027275-17.363806l0.038536-24.532349q0.027275-17.363806 17.39108-17.336531l161.371882 0.253483q17.363806 0.027275 17.336531 17.39108l-0.038536 24.53235q-0.027275 17.363806-17.39108 17.33653l-161.371882-0.253482q-17.363806-0.027275-17.336531-17.391081Z" fill="#FF9545" /><path d="M113.183478 554.858067l93.430134 14.894659 104.820167 389.013447a89.447605 89.447605 0 0 0 67.862297 62.366406L332.14293 589.506071z" fill="#FF761A" /><path d="M599.370636 632.278434L345.603879 591.895588 493.833614 978.439867a86.420882 86.420882 0 0 0 14.098153-72.561681L426.847473 604.958284l172.523163 27.559101z" fill="#FFC73B" /><path d="M332.14293 589.506071l47.153146 431.387556a111.032912 111.032912 0 0 0 54.003095-1.035457 108.245142 108.245142 0 0 0 60.534443-41.657255L345.603879 591.895588z" fill="#FFAF3B" /><path d="M374.357739 392.052276c-116.369502-52.011831-197.453795-63.720466-260.935309-55.038553v217.844344l485.868555 77.420367v-191.161399C542.420469 446.135021 467.947174 434.107783 374.357739 392.052276z" fill="#0090FF" /><path d="M113.183478 219.847716V337.013723c63.720466-8.602263 144.565808 3.026722 260.93531 55.038553C467.947174 434.107783 542.420469 446.135021 599.370636 441.117035V144.259312z" fill="#1DA2FC" /></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
src/src/assets/svg/business/zongheshenpi.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M897.619834 344.338783a344.333757 344.333757 0 1 0-479.009307 316.965786 81.894464 81.894464 0 0 1 50.267701 75.26192v74.563758h168.745882V736.566489a81.754832 81.754832 0 0 1 50.337518-75.26192 344.403573 344.403573 0 0 0 209.658206-316.965786z" fill="#FFCB39" /><path d="M815.097024 344.338783A344.333757 344.333757 0 1 0 335.878268 661.304569a81.894464 81.894464 0 0 1 50.267701 75.26192v74.563758h168.955331V736.566489a81.894464 81.894464 0 0 1 50.337518-75.26192 344.403573 344.403573 0 0 0 209.658206-316.965786z" fill="#FFCB39" /><path d="M528.152227 0.912638c-5.5853 0-11.1706 0.907611-16.686085 1.605774a344.333757 344.333757 0 0 1 93.972676 658.786157 81.894464 81.894464 0 0 0-50.337518 75.26192v74.563758h82.52281V736.566489a81.754832 81.754832 0 0 1 50.337518-75.26192A344.403573 344.403573 0 0 0 528.152227 0.912638z" fill="#FFA310" /><path d="M190.660463 751.716616m74.843022 0l492.972558 0q74.843023 0 74.843023 74.843022l0 13.61417q0 74.843023-74.843023 74.843022l-492.972558 0q-74.843023 0-74.843022-74.843022l0-13.61417q0-74.843023 74.843022-74.843022Z" fill="#FFCB39" /><path d="M758.476043 751.716616H265.503485a74.633574 74.633574 0 0 0-60.879772 31.417313h489.621378a74.843023 74.843023 0 0 1 74.843022 74.843023v13.96325a74.70339 74.70339 0 0 1-13.96325 43.355893h3.35118a74.843023 74.843023 0 0 0 74.843023-74.843022v-13.963251a74.843023 74.843023 0 0 0-74.843023-74.773206z" fill="#EF680C" /><path d="M773.835619 1024h-523.621893a27.926501 27.926501 0 1 1 0-55.853002h523.621893a27.926501 27.926501 0 0 1 0 55.853002z" fill="#FFCB39" /><path d="M282.329202 192.418618a11.030968 11.030968 0 0 1-3.630445-0.628346 10.472438 10.472438 0 0 1-6.14383-13.474537c39.166918-104.724379 151.08237-92.297086 152.269246-92.157453a10.472438 10.472438 0 0 1-2.583201 20.944876c-3.979526-0.488714-96.765326-10.681887-130.067678 78.6131a10.472438 10.472438 0 0 1-9.844092 6.70236zM271.647315 236.263225a10.472438 10.472438 0 0 1-10.472437-9.774276 35.95537 35.95537 0 0 1 6.004197-21.992119A10.472438 10.472438 0 0 1 284.214241 216.435409a15.499208 15.499208 0 0 0-2.164304 8.517583 10.402622 10.402622 0 0 1-9.774275 11.100784z" fill="#FFFBF0" /></svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
0
src/src/assets/svg/business/商务
Normal file
1
src/src/assets/svg/education/DNA.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
1
src/src/assets/svg/education/a-1-shilibiao.svg
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
1
src/src/assets/svg/education/a-10-yiliaoxiang.svg
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
1
src/src/assets/svg/education/a-11-yiyongweishengzhi.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M617.799864 133.119344l-0.704848 754.187293c-14.096959 43.991322-38.916417 74.449563-74.449563 91.365914-122.934291 58.616917-245.665938 60.379036-368.194942 5.286359-57.092683-25.72695-85.550918-71.189642-85.462812-134.53785 0.237886-226.670286 0.29075-453.243656 0.176212-679.73773-0.088106-95.947426 82.555315-141.233905 164.758205-159.471846 117.18097-26.079374 315.507558-8.017645 363.877748 122.90786z m-80.616983 18.326046c0-48.22041-82.123595-87.313038-183.436676-87.313038s-183.436676 39.092629-183.436675 87.313038 82.123595 87.313038 183.436675 87.313038 183.436676-39.092629 183.436676-87.313038z m-132.599518 390.485757c-0.352424-19.973628-1.259916-32.185119-2.731286-36.652092-17.885516-54.713821-113.832942-44.40542-104.758025 26.079373 3.171816 24.229148-22.819452 13.832641-33.215959 15.594761-57.180789 9.867871-57.709425 96.299849-4.052875 105.639085 12.775369 2.20265 39.471485-9.515447 37.445046 15.15423-7.400903 89.603794 125.286721 77.268955 104.405601-7.929539a6.3172 6.3172 0 0 1 1.356832-5.709268 6.114556 6.114556 0 0 1 5.42733-2.044059c99.912195 12.687263 89.868112-120.000361 0.528636-106.520145a3.788558 3.788558 0 0 1-4.4053-3.612346z m118.854983 305.022945a13.709292 13.709292 0 0 0-11.400915-0.088106c-3.621156 1.62115-6.343631 4.740102-7.453767 8.546282-14.978019 51.189581-105.198555 61.233665-148.899127 60.616922a15.092556 15.092556 0 0 0-8.281963 2.114544c-13.920747 8.986811-15.180662 18.475827-3.788558 28.458236 2.06168 1.76212 4.819398 2.819392 7.841434 2.995603 52.951701 2.731286 171.806685-13.127793 184.053417-80.176453 1.876658-10.281969-2.140976-17.770979-12.070521-22.467028z" fill="#E2F0FA" /><path d="M617.799864 133.119344c85.991448 5.400897 171.921223 11.541885 257.798133 18.414152 37.268835 2.995604 59.295333 18.590364 59.295333 56.916471 0.114538 207.75393 0.14978 415.446185 0.088106 623.085577 0 45.374586-14.449383 74.009033-63.876844 69.603734a3553.490877 3553.490877 0 0 0-254.009576-13.832641l0.704848-754.187293z m229.07558 154.714122c5.022042-0.026432 9.815008-3.436134 13.339247-9.462584 3.52424-6.03526 5.471382-14.202686 5.427329-22.704914-0.044053-8.511039-2.079301-16.652033-5.665215-22.65205-3.585914-5.991207-8.422933-9.348046-13.444975-9.321614-5.022042 0.026432-9.823818 3.436134-13.348057 9.462583-3.52424 6.03526-5.471382 14.202686-5.42733 22.704914 0.044053 8.511039 2.079301 16.652033 5.665216 22.64324 3.585914 6.000018 8.422933 9.356856 13.444974 9.330425z m17.533092 41.057392a17.268774 17.268774 0 0 0-17.268774-17.268774h-0.528636a17.268774 17.268774 0 0 0-17.268775 17.268774v453.569648a17.268774 17.268774 0 0 0 17.268775 17.268775h0.528636a17.268774 17.268774 0 0 0 17.268774-17.268775v-453.569648z" fill="#C8DAE5" /><path d="M170.30953 151.44539a183.436676 87.313038 0 1 0 366.873351 0 183.436676 87.313038 0 1 0-366.873351 0Z" fill="#C8DAE5" /><path d="M846.531311 223.692743a32.070581 18.942788 89.7 1 0 0.335841 64.140283 32.070581 18.942788 89.7 1 0-0.335841-64.140283Z" fill="#9EBED1" /><path d="M829.342351 311.622084m17.268775 0l0.528636 0q17.268774 0 17.268774 17.268774l0 453.569648q0 17.268774-17.268774 17.268775l-0.528636 0q-17.268774 0-17.268775-17.268775l0-453.569648q0-17.268774 17.268775-17.268774Z" fill="#9EBED1" /><path d="M408.988663 545.543493c89.339476-13.480217 99.383559 119.207407-0.528636 106.520145a6.114556 6.114556 0 0 0-5.42733 2.044059 6.3172 6.3172 0 0 0-1.356832 5.709268c20.88112 85.198494-111.806504 97.533333-104.405601 7.929539 2.026438-24.669678-24.669678-12.951581-37.445046-15.15423-53.656549-9.339235-53.127913-95.771214 4.052875-105.639085 10.396507-1.76212 36.387775 8.634387 33.215959-15.594761-9.074917-70.484794 86.872508-80.793195 104.758025-26.079373 1.47137 4.466974 2.378862 16.678464 2.731286 36.652092a3.788558 3.788558 0 0 0 4.4053 3.612346z" fill="#DC1C4B" /><path d="M523.438346 846.954092c9.929545 4.696049 13.947179 12.185059 12.070521 22.467028-12.246733 67.04866-131.101716 82.907739-184.053417 80.176453a13.110172 13.110172 0 0 1-7.841434-2.995603c-11.392105-9.982409-10.132189-19.471424 3.788558-28.458236 2.290756-1.436128 5.180632-2.167407 8.281963-2.114544 43.700572 0.616742 133.921108-9.427341 148.899127-60.616922 1.110136-3.797368 3.832611-6.925131 7.453767-8.546282 3.621156-1.629961 7.78857-1.594718 11.400915 0.088106z" fill="#C8DAE5" /></svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
1
src/src/assets/svg/education/a-12-huxi.svg
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
1
src/src/assets/svg/education/a-13-xiguan.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M794.26099 187.345109l-98.005181-100.932034c26.607742-27.938129 64.302042-73.792137 96.674794-83.903078 44.523621-13.836026 94.989638 31.92929 86.918623 78.670223-6.385858 37.162146-57.561414 78.58153-85.588236 106.164889z" fill="#82ABC4" /><path d="M696.255809 86.413075l98.005181 100.932034c38.847303 31.042365 26.696434 63.592502-3.813776 95.610484-32.9936 34.678757-58.803109 65.721122-106.785736 42.838464a1398.13039 1398.13039 0 0 0-123.282536-123.637306c-36.629991-51.175556 10.288327-82.040537 42.483694-114.147211 30.332825-30.244133 62.262115-35.743066 93.393173-1.596465z m33.942609 155.743981a16.85157 16.85157 0 0 0 0-23.831667l-72.373057-72.373057a16.85157 16.85157 0 0 0-23.831668 0l-1.126394 1.126394a16.85157 16.85157 0 0 0 0 23.831668l72.373057 72.373057a16.85157 16.85157 0 0 0 23.831667 0l1.126395-1.126395z" fill="#9EBED1" /><path d="M560.378942 202.156751c43.698781 38.669918 84.790003 79.88531 123.282536 123.637306l-121.065225 120.976532-45.58793-12.505638c-14.838251-4.079854-22.793965-13.632033-23.858275-28.647669-3.104237-41.508077-35.831759-52.860713-66.164584-70.067053l133.393478-133.393478z" fill="#E2F0FA" /><path d="M426.985464 335.550229c30.332825 17.20634 63.060348 28.558976 66.164584 70.067053 1.06431 15.015636 9.020024 24.567815 23.858275 28.647669l45.58793 12.505638c-87.512862 92.887626-152.551052 158.608748-195.123438 197.163366-12.887016 11.707406-30.74968 15.281713-53.570253 10.731789a8.913593 8.913593 0 0 0-7.627553 1.951234c-72.018287 60.754343-132.950016-8.337092-76.275526-78.049375a8.869247 8.869247 0 0 0 1.685157-7.716245c-5.383633-21.286193-2.988936-37.605608 7.184091-48.958245 24.301737-27.255197 87.007315-89.375404 188.116733-186.342884zM236.562726 721.362483c2.11975 0.860317 3.849253 2.430174 4.878086 4.434623 26.607742 52.328558 89.490704 188.648888 65.809815 244.436453-32.816215 77.162451-144.923499 69.002743-161.952454-9.933557-13.126486-60.754343 41.419384-179.690948 69.712283-234.502896 1.41021-2.820421 3.636391-4.83374 6.11978-5.498933 4.904694-1.303779 10.048857-0.949009 15.43249 1.06431zM347.871779 738.391437c46.208778 22.793965 132.861323 70.244438 102.705882 132.240476-30.51021 62.528193-107.583969 37.162146-117.34014-25.809509a508.092564 508.092564 0 0 1-5.587626-92.417556c0.532155-15.725175 7.272783-20.399269 20.221884-14.013411z" fill="#4895EF" /><path d="M645.910711 134.035155m11.915859 11.915859l72.373166 72.373166q11.915859 11.915859 0 23.831718l-1.128871 1.128871q-11.915859 11.915859-23.831718 0l-72.373166-72.373166q-11.915859-11.915859 0-23.831718l1.128871-1.128871q11.915859-11.915859 23.831718 0Z" fill="#82ABC4" /></svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
1
src/src/assets/svg/education/a-14-zhutingqi.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M250.360628 100.189363c4.40461-9.628477 4.642458-21.194981 0.704737-34.708323 0.352369-49.243535 55.586173-90.294496 94.699106-47.657875 34.091678 37.262997 23.696799 171.867865-58.669399 138.833293-22.489936-8.985404-34.734751-27.801896-36.734444-56.467095zM599.910443 63.366827c-4.052241 13.213829-2.995135 25.846249 3.171319 37.879643-3.083227-0.880922-4.756978 4.668886-4.845071 7.311652-3.347503 72.147505-109.850963 73.821256-108.265303-14.270935 0.616645-31.184636-5.6379-60.343151 22.287325-82.013831 40.786685-31.713189 85.008965 3.876056 87.65173 51.093471z" fill="#4F697D" /><path d="M599.910443 63.366827c52.150577 3.876056 68.271448 34.355955 68.183356 84.832781-0.052855 40.821921 0.088092 81.661461 0.440461 122.536238l-35.589245-2.554674v-142.797442c0-15.328041-9.954418-23.370858-29.863253-24.13726-6.166453-12.033393-7.22356-24.665814-3.171319-37.879643zM251.065365 65.48104c3.937721 13.513342 3.699872 25.079847-0.704737 34.708323-22.199232 2.528246-33.413368 13.301921-33.651217 32.329835a5595.968365 5595.968365 0 0 0 0.352368 140.418953l-35.589245 1.849936c-0.757593-43.394213-0.405224-86.770808 1.057106-130.112167 1.673752-48.538797 17.794623-77.256852 68.535725-79.19488z" fill="#9EBED1" /><path d="M632.945015 268.181172l35.589245 2.554674c26.427657 15.213521 38.029399 40.143612 34.796416 74.79027-13.478105 146.937775-116.105508 250.534192-261.986177 264.717035-13.442868-4.933163-25.106275-3.083227-34.9726 5.549809 0.79283-4.668886-0.880922-6.783099-5.549808-7.399745-145.704485-16.649424-256.260185-132.754932-254.938802-280.749813 0.264277-26.51575 14.094751-41.139053 35.589245-52.855315l35.589245-1.849936c5.585045 6.695007 12.86146 10.985096 21.846864 12.86146 14.623304 3.171319 22.023048 14.270935 22.199232 33.298848 1.497567 224.72318 315.722414 232.475293 328.143413 8.721127 1.647324-29.246608 16.208963-49.120206 43.693727-59.638414z" fill="#4F697D" /><path d="M807.279462 845.537395l-35.941615 2.202304c0.528553-47.745968 12.06863-167.727532-12.332906-205.783359-28.013317-43.605635-104.12497-39.289117-126.059926 10.04251-10.747247 24.13726-5.725992 59.638414-11.011524 81.221001-24.577721 100.425098-164.732398 111.172346-205.166714 15.768502-15.239949-35.941614-7.311652-90.823049-10.394878-133.195393 9.866325-8.633035 21.529732-10.482971 34.9726-5.549809 2.02612 39.993855-5.461716 105.182076 13.037644 137.07145 25.72292 44.574649 102.89168 43.958003 126.676571-5.197439 14.447119-29.687068 2.907042-67.742895 17.970807-98.751347 56.29091-115.400771 208.161848-74.614086 207.897572 54.176698-0.176184 49.393292-0.052855 98.724919 0.352369 147.994882z" fill="#9EBED1" /><path d="M807.279462 845.537395c31.889373 20.789757 65.188222 33.210756 70.033292 74.79027 13.830474 117.426891-151.254293 143.149811-171.779773 35.324969-9.628477-50.679438 12.306479-86.647479 65.804866-107.912935l35.941615-2.202304z" fill="#4F697D" /></svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
1
src/src/assets/svg/education/a-15-bingdu.svg
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
1
src/src/assets/svg/education/a-16-yiyuan.svg
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
1
src/src/assets/svg/education/a-17-zhusheqi.svg
Normal file
|
After Width: | Height: | Size: 5.3 KiB |