diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6c2d262..deb7b28 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -53,3 +53,4 @@ jobs: docker compose --file docker-compose-${{ github.ref_name }}.yml pull docker login -u ${{ secrets.DOCKER_LOGIN }} -p ${{ secrets.DOCKER_PASSWD }} ${DOCKER_REGISTRY} docker compose --project-name ${{ github.ref_name }}-welcome --file docker-compose-${{ github.ref_name }}.yml up -d --build' + diff --git a/.gitignore b/.gitignore index 496ee2c..902feba 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,39 @@ -.DS_Store \ No newline at end of file +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# VSCode +.vscode/* diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/Dockerfile b/Dockerfile index aa84c01..8c151c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,32 @@ -FROM caddy:2.7.6-alpine +FROM node:24-alpine AS build -COPY *.html /usr/share/caddy/ -COPY assets /usr/share/caddy/assets +WORKDIR /app -WORKDIR /usr/share/caddy \ No newline at end of file +# Install deps +COPY package*.json ./ + +RUN npm ci + +# Build app +COPY . . +RUN npm run build + +# Runtime +FROM nginx:1.27-alpine + +# SPA fallback for Vue Router history mode +RUN printf '%s\n' \ +'server {' \ +' listen 80;' \ +' server_name _;' \ +' root /usr/share/nginx/html;' \ +' index index.html;' \ +' location / {' \ +' try_files $uri $uri/ /index.html;' \ +' }' \ +'}' > /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..691f85a --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,11 @@ +FROM node:24-alpine + +WORKDIR /app + +# Install dependencies once for development container startup. +COPY package*.json ./ +RUN npm ci + +EXPOSE 5173 + +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] diff --git a/LICENSE.txt b/LICENSE.txt index d447b56..b403d12 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,63 +1,63 @@ -Creative Commons Attribution 3.0 Unported -http://creativecommons.org/licenses/by/3.0/ - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - - 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. - 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. - 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. - 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. - 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. - 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. - 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. - 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. - 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: - - 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; - 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; - 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, - 4. to Distribute and Publicly Perform Adaptations. - 5. - - For the avoidance of doubt: - 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; - 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, - 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: - - 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. - 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. - 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. - 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. - -8. Miscellaneous - - 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. - 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. - 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. - 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. - 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. +Creative Commons Attribution 3.0 Unported +http://creativecommons.org/licenses/by/3.0/ + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + 4. to Distribute and Publicly Perform Adaptations. + 5. + + For the avoidance of doubt: + 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..32c7c56 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +COMPOSE_DEV=docker compose -f docker-compose-dev.yml + +.PHONY: dev-build dev-run dev-kill dev-logs + +dev-build: + $(COMPOSE_DEV) build + +dev-run: + npm run sitemap && $(COMPOSE_DEV) up + +dev-kill: + $(COMPOSE_DEV) down + +dev-logs: + $(COMPOSE_DEV) logs -f diff --git a/README.md b/README.md index c32f774..a575e5c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,37 @@ -# welcome-community -community website to group our products + presentation + membership "rules" + ... +# Realtoken Website + +This project is the foundation of the website to present the Realtoken DAO. + +A technology like WordPress was complicated to maintain on the community server, so a static technology like VueJS is perfect for creating a reliable, consistent, and scalable website foundation. + +# Technologies + +- VueJS 3 (https://vuejs.org/) +- Vite (https://vite.dev/) + +## Run website with make + +```sh +make dev-build # Build +make dev-run # Run on port 5173 +make dev-kill # Stop container +make dev-logs # Show container logs +``` + +### Sitemap (SEO) + +The sitemap is generated automatically: + +- **On each build** : `npm run build` runs `scripts/generate-sitemap.js` then `scripts/check-app-links.js`, then Vite. `public/sitemap.xml` and `public/app-links-status.json` match the last build/deploy (Application Hub status page uses this file). +- **On demand** : `npm run sitemap` regenerates only the sitemap; `npm run check:app-links` regenerates only the link status JSON. + +To set the site base URL for production (e.g. `https://realtoken.community`), use either `SITEMAP_BASE_URL` or `VITE_SITE_URL` when building: + +```sh +SITEMAP_BASE_URL=https://realtoken.community npm run build +``` + +### Application-hub check list URL + +Each url is check on build + diff --git a/articles/en/how-to-use-solotext.md b/articles/en/how-to-use-solotext.md new file mode 100644 index 0000000..b21725f --- /dev/null +++ b/articles/en/how-to-use-solotext.md @@ -0,0 +1,69 @@ +--- +title: "The Scope of RealToken DAO" +date: "2024-03-01" +description: "Discover the scope of action, responsibilities and areas of intervention of the RealToken DAO" +tags: ["dao", "governance", "ecosystem"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-scope.jpg" +--- + +# The Scope of RealToken DAO + +The RealToken DAO is a decentralized autonomous organization that manages and develops the real-world asset (RWA) tokenization ecosystem. Understanding its scope of action is essential to participate effectively in governance. + +## What is the DAO's Scope? + +The DAO's scope defines the areas in which it can act, make decisions, and allocate resources. It delineates the responsibilities and competencies of the decentralized organization. + +## Areas of Intervention + +### 1. Ecosystem Management + +The DAO is responsible for the overall management of the RealToken ecosystem, including: + +- **New Partner Integration**: Validation and integration of new real-world asset tokens +- **Tool Development**: Maintenance and improvement of RMM (RealToken Money Market) and YAM (You And Me) +- **Standards and Protocols**: Definition of technical standards for real-world asset tokenization + +### 2. Decentralized Governance + +The DAO manages community governance through: + +- **Governance Proposals**: REG token holders can submit proposals +- **Voting Process**: On-chain voting system via Tally for important decisions +- **Resource Allocation**: Treasury management and fund allocation for development + +### 3. Compliance and Regulation + +The DAO ensures regulatory compliance: + +- **Legal Framework**: Maintaining SEC-ready compliance +- **Insurance**: Management of insurance partnerships (Lloyd's) +- **Reporting**: Integration with Chainlink oracles for automated reporting + +### 4. Community Development + +The DAO fosters community development: + +- **Documentation**: Maintenance of the Wiki and technical documentation +- **Education**: Educational resources on real-world asset tokenization +- **Communication**: Management of communication channels and community forum + +## Scope Limitations + +The DAO does **not directly** manage: + +- Underlying real estate assets (managed by partners) +- Individual token transactions (managed by users) +- Personal investment decisions of members + +## How to Participate? + +1. **Get REG Tokens**: Participate in governance by holding REG tokens +2. **Join the Forum**: Participate in discussions and proposals +3. **Vote on Tally**: Express your voice on important decisions +4. **Submit Proposals**: Propose new initiatives for the ecosystem + +--- + +*The RealToken DAO is an ever-evolving ecosystem. Your participation shapes its future!* diff --git a/articles/en/realtoken-dao-scope.md b/articles/en/realtoken-dao-scope.md new file mode 100644 index 0000000..b21725f --- /dev/null +++ b/articles/en/realtoken-dao-scope.md @@ -0,0 +1,69 @@ +--- +title: "The Scope of RealToken DAO" +date: "2024-03-01" +description: "Discover the scope of action, responsibilities and areas of intervention of the RealToken DAO" +tags: ["dao", "governance", "ecosystem"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-scope.jpg" +--- + +# The Scope of RealToken DAO + +The RealToken DAO is a decentralized autonomous organization that manages and develops the real-world asset (RWA) tokenization ecosystem. Understanding its scope of action is essential to participate effectively in governance. + +## What is the DAO's Scope? + +The DAO's scope defines the areas in which it can act, make decisions, and allocate resources. It delineates the responsibilities and competencies of the decentralized organization. + +## Areas of Intervention + +### 1. Ecosystem Management + +The DAO is responsible for the overall management of the RealToken ecosystem, including: + +- **New Partner Integration**: Validation and integration of new real-world asset tokens +- **Tool Development**: Maintenance and improvement of RMM (RealToken Money Market) and YAM (You And Me) +- **Standards and Protocols**: Definition of technical standards for real-world asset tokenization + +### 2. Decentralized Governance + +The DAO manages community governance through: + +- **Governance Proposals**: REG token holders can submit proposals +- **Voting Process**: On-chain voting system via Tally for important decisions +- **Resource Allocation**: Treasury management and fund allocation for development + +### 3. Compliance and Regulation + +The DAO ensures regulatory compliance: + +- **Legal Framework**: Maintaining SEC-ready compliance +- **Insurance**: Management of insurance partnerships (Lloyd's) +- **Reporting**: Integration with Chainlink oracles for automated reporting + +### 4. Community Development + +The DAO fosters community development: + +- **Documentation**: Maintenance of the Wiki and technical documentation +- **Education**: Educational resources on real-world asset tokenization +- **Communication**: Management of communication channels and community forum + +## Scope Limitations + +The DAO does **not directly** manage: + +- Underlying real estate assets (managed by partners) +- Individual token transactions (managed by users) +- Personal investment decisions of members + +## How to Participate? + +1. **Get REG Tokens**: Participate in governance by holding REG tokens +2. **Join the Forum**: Participate in discussions and proposals +3. **Vote on Tally**: Express your voice on important decisions +4. **Submit Proposals**: Propose new initiatives for the ecosystem + +--- + +*The RealToken DAO is an ever-evolving ecosystem. Your participation shapes its future!* diff --git a/articles/fr/perimetre-dao-realtoken.md b/articles/fr/perimetre-dao-realtoken.md new file mode 100644 index 0000000..9243bc9 --- /dev/null +++ b/articles/fr/perimetre-dao-realtoken.md @@ -0,0 +1,69 @@ +--- +title: "Le périmètre de la DAO RealToken" +date: "2024-03-01" +description: "Découvrez le périmètre d'action, les responsabilités et les domaines d'intervention de la RealToken DAO" +tags: ["dao", "gouvernance", "écosystème"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-perimetre.jpg" +--- + +# Le périmètre de la DAO RealToken + +La RealToken DAO est une organisation autonome décentralisée qui gère et développe l'écosystème de tokenisation d'actifs réels (RWA). Comprendre son périmètre d'action est essentiel pour participer efficacement à la gouvernance. + +## Qu'est-ce que le périmètre de la DAO ? + +Le périmètre de la DAO définit les domaines dans lesquels elle peut agir, prendre des décisions et allouer des ressources. Il délimite les responsabilités et les compétences de l'organisation décentralisée. + +## Domaines d'intervention + +### 1. Gestion de l'écosystème + +La DAO est responsable de la gestion globale de l'écosystème RealToken, incluant : + +- **Intégration de nouveaux partenaires** : Validation et intégration de nouveaux tokens d'actifs réels +- **Développement des outils** : Maintenance et amélioration de RMM (RealToken Money Market) et YAM (You And Me) +- **Standards et protocoles** : Définition des standards techniques pour la tokenisation d'actifs réels + +### 2. Gouvernance décentralisée + +La DAO gère la gouvernance communautaire à travers : + +- **Propositions de gouvernance** : Les détenteurs de tokens REG peuvent soumettre des propositions +- **Processus de vote** : Système de vote on-chain via Tally pour les décisions importantes +- **Allocation des ressources** : Gestion du trésor et allocation des fonds pour le développement + +### 3. Conformité et réglementation + +La DAO s'assure de la conformité réglementaire : + +- **Cadre juridique** : Maintien de la conformité SEC-ready +- **Assurances** : Gestion des partenariats d'assurance (Lloyd's) +- **Reporting** : Intégration avec les oracles Chainlink pour le reporting automatisé + +### 4. Développement communautaire + +La DAO favorise le développement de la communauté : + +- **Documentation** : Maintien du Wiki et de la documentation technique +- **Formation** : Ressources éducatives sur la tokenisation d'actifs réels +- **Communication** : Gestion des canaux de communication et du forum communautaire + +## Limites du périmètre + +La DAO ne gère **pas directement** : + +- Les actifs immobiliers sous-jacents (gérés par les partenaires) +- Les transactions individuelles de tokens (gérées par les utilisateurs) +- Les décisions d'investissement personnelles des membres + +## Comment participer ? + +1. **Obtenez des tokens REG** : Participez à la gouvernance en détenant des tokens REG +2. **Rejoignez le forum** : Participez aux discussions et propositions +3. **Votez sur Tally** : Exprimez votre voix sur les décisions importantes +4. **Soumettez des propositions** : Proposez de nouvelles initiatives pour l'écosystème + +--- + +*La RealToken DAO est un écosystème en constante évolution. Votre participation façonne son avenir !* diff --git a/assets/css/custom.css b/assets/css/custom.css deleted file mode 100644 index 61ccd67..0000000 --- a/assets/css/custom.css +++ /dev/null @@ -1,185 +0,0 @@ -.blue,article#rules h3 { - color: #02aafe -} - -.no-style,.trombi ul { - list-style-type: none -} - -.no-decoration { - text-decoration: none -} - -.center { - text-align: center -} - -.left { - text-align: left -} - -.flex-center,.trombi .profile-info,.trombi li { - display: flex; - align-items: center -} - -#header img.logo { - width: 100%; - height: auto -} - -#header .logo .icon:before { - font-size: 1.75rem -} - -.trombi ul { - padding: 0; - margin: 0 -} - -.trombi li { - margin-top: .2rem; - margin-bottom: .2rem; - background-color: #384c7530; - border-radius: .7rem; - padding: .5rem; - box-shadow: 0 .125rem .25rem rgba(0,0,0,.2) -} - -.trombi .profile-info { - gap: 1rem -} - -.trombi .profile-pic { - margin-right: .1rem -} - -.trombi img { - border-radius: 50%; - height: 2.5rem -} - -.trombi .name { - font-weight: 700; - color: #fff; - font-size: 1.1rem -} - -.trombi .networks { - display: flex; - align-items: center; - gap: 1rem -} - -.trombi .icon { - font-size: 1.5rem; - text-decoration: none -} - -.product,.trombi .description { - display: flex; - align-items: center -} - -.trombi .description { - flex-grow: 1; - justify-content: flex-end; - margin-left: .1rem; - font-size: 1rem; - color: #02b2fe; - font-weight: 700; - font-style: italic -} - -.trombi .description p { - margin: 0; - padding: .5rem -} - -.product { - justify-content: center; - flex-direction: row -} - -.product-link { - margin-right: 10px -} - -.product .major { - margin: 0; - padding-right: 10px -} - -#footer .social-links a { - text-decoration: none!important; - border: 0!important -} - -#footer .social-links { - margin-bottom: 10px -} - -#footer .social-links a i { - font-size: 24px; - margin: 5px -} - -li .dashboard-link { - font-size: 1.2rem -} - -h2.major,h7.major { - color: #02b2fe; - width: -moz-max-content; - width: -webkit-max-content; - width: -ms-max-content; - width: max-content; - margin: 0 auto 1rem -} - -#header nav ul li a.link-development,#header nav ul li a.link-donate,#header nav ul li a.link-presentation,#header nav ul li a.link-product { - color: #02aafe; - font-weight: 600 -} - -#header nav ul li a.link-contact,#tokenDropdown option { - color: #fff -} - -article#rules ol li { - margin: 15px -} - -article#rules ol li strong { - text-decoration: underline; - color: #02aafe -} - -#donate a,#tokenDropdown { - color: #02aafe; - font-weight: 700 -} - -#donate a { - font-size: 1.25em; - text-decoration: underline -} - -#tokenDropdown { - background-color: transparent; - border: 1px solid #02aafe; - padding: .5rem; - margin: .5rem; - text-align: center; - display: inline-block; - width: 60% -} - -.dashboard-link { - margin-right: 10px; /* Ajustez cette valeur selon vos besoins */ - color: #00aaff; -} - -.dashboard-description { - margin-left: 10px; /* Ajustez cette valeur selon vos besoins */ - } \ No newline at end of file diff --git a/assets/css/fontawesome-all.min.css b/assets/css/fontawesome-all.min.css deleted file mode 100644 index d53d97d..0000000 --- a/assets/css/fontawesome-all.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ - -.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css deleted file mode 100644 index 5c27afe..0000000 --- a/assets/css/main.css +++ /dev/null @@ -1,1440 +0,0 @@ -@import url(fontawesome-all.min.css); - -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300italic,600italic,300,600); - -a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline -} - -article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section { - display: block -} - -body { - -webkit-text-size-adjust: none -} - -blockquote,q { - quotes: none -} - -blockquote:after,blockquote:before,q:after,q:before { - content: none -} - -table { - border-collapse: collapse; - border-spacing: 0; - margin: 0 0 2rem; - width: 100% -} - -mark { - background-color: transparent; - color: inherit -} - -input::-moz-focus-inner { - border: 0; - padding: 0 -} - -input { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none -} - -@-ms-viewport { - width:device-width -} - -@media screen and (max-width:480px) { - body,html { - min-width: 320px - } -} - -html { - box-sizing: border-box; - font-size: 12pt -} - -*,:after,:before { - box-sizing: inherit -} - -body { - background: #1b1f22 -} - -body.is-preload *,body.is-preload :after,body.is-preload :before { - -moz-animation: none!important; - -webkit-animation: none!important; - -ms-animation: none!important; - animation: none!important; - -moz-transition: none!important; - -webkit-transition: none!important; - -ms-transition: none!important; - transition: none!important -} - -@media screen and (max-width:1680px) { - html { - font-size: 10pt - } -} - -@media screen and (max-width:736px) { - html { - font-size: 10pt - } -} - -@media screen and (max-width:360px) { - html { - font-size: 10pt - } -} - -body,input { - color: #fff -} - -body,input,select,textarea { - font-family: "Source Sans Pro",sans-serif; - font-weight: 300; - font-size: 1rem; - line-height: 1.65 -} - -a { - text-decoration: underline; - text-decoration-color: #02bbfe; - text-underline-offset: 3px; - color: inherit -} - -.z,pre code { - display: block -} - -.z,a { - -moz-transition: color .2s ease-in-out,background-color .2s ease-in-out,border-bottom-color .2s ease-in-out; - -webkit-transition: color .2s ease-in-out,background-color .2s ease-in-out,border-bottom-color .2s ease-in-out; - -ms-transition: color .2s ease-in-out,background-color .2s ease-in-out,border-bottom-color .2s ease-in-out; - transition: color .2s ease-in-out,background-color .2s ease-in-out,border-bottom-color .2s ease-in-out -} - -.z { - text-align: center -} - -.z a { - border-bottom: none; - text-decoration: none -} - -a:hover { - border-bottom-color: transparent -} - -b,h1,h2,h3,h4,h5,h6,strong { - color: #fff; - font-weight: 600 -} - -blockquote,em,i { - font-style: italic -} - -p { - margin: 0 0 1rem -} - -h1,h2,h3,h4,h5,h6 { - text-transform: uppercase -} - -h1 { - margin-bottom: 2.5rem; - font-size: 2.25rem; - line-height: 1.3 -} - -h2,h3,h4,h5,h6 { - margin-top: 1.5rem; - margin-bottom: .5rem -} - -h1,h2 { - letter-spacing: .5rem -} - -h2 { - font-size: 1.5rem; - line-height: 1.4 -} - -h3,h4,h5,h6 { - line-height: 1.5; - letter-spacing: .2rem -} - -.z,h1 a,h2 a,h3 a,h4 a,h5 a,h6 a { - color: inherit; - text-decoration: none -} - -h1.major,h3.major,h4.major,h5.major,h6.major { - border-bottom: solid 1px #fff; - width: -moz-max-content; - width: -webkit-max-content; - width: -ms-max-content; - width: max-content; - padding-bottom: .5rem; - margin: 0 0 1rem -} - -h3 { - font-size: 1rem -} - -h4,sub,sup { - font-size: .8rem -} - -h5 { - font-size: .7rem -} - -h6 { - font-size: .6rem -} - -@media screen and (max-width:736px) { - h1 { - font-size: 1.75rem; - line-height: 1.4 - } - - h2 { - font-size: 1.25em; - line-height: 1.5 - } -} - -sub,sup { - position: relative; - top: .5rem -} - -sup { - top: -.5rem -} - -blockquote { - border-left: solid 4px #fff; - padding: .5rem 0 .5rem 2rem -} - -code,pre { - font-family: "Courier New",monospace; - font-size: .9rem -} - -code { - background: rgba(255,255,255,.075); - border-radius: 4px; - margin: 0 .25rem; - padding: .25rem .65rem -} - -pre { - -webkit-overflow-scrolling: touch -} - -pre code { - line-height: 1.75; - padding: 1rem 1.5rem; - overflow-x: auto -} - -hr { - border: 0; - border-bottom: solid 1px #fff; - margin: 2.75rem 0 -} - -.align-left { - text-align: left -} - -.align-center { - text-align: center -} - -.align-right { - text-align: right -} - -blockquote,dl,form,pre { - margin: 0 0 2rem -} - -#header .content .inner>:last-child,.box>:last-child,.box>:last-child>:last-child,.box>:last-child>:last-child>:last-child,form>:last-child { - margin-bottom: 0 -} - -form>.fields { - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - -moz-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - width: calc(100% + 3rem); - margin: -1.5rem 0 2rem -1.5rem -} - -form>.fields>.field { - -moz-flex-grow: 0; - -webkit-flex-grow: 0; - -ms-flex-grow: 0; - flex-grow: 0; - -moz-flex-shrink: 0; - -webkit-flex-shrink: 0; - -ms-flex-shrink: 0; - flex-shrink: 0; - padding: 1.5rem 0 0 1.5rem; - width: calc(100% - 1.5rem) -} - -form>.fields>.field.half { - width: calc(50% - .75rem) -} - -form>.fields>.field.third { - width: calc(100%/3 - .5rem) -} - -form>.fields>.field.quarter { - width: calc(25% - .375rem) -} - -@media screen and (max-width:480px) { - form>.fields { - width: calc(100% + 3rem); - margin: -1.5rem 0 2rem -1.5rem - } - - form>.fields>.field { - padding: 1.5rem 0 0 1.5rem - } - - form>.fields>.field,form>.fields>.field.half,form>.fields>.field.quarter,form>.fields>.field.third { - width: calc(100% - 1.5rem) - } -} - -label { - color: #fff; - display: block; - font-size: .8rem; - font-weight: 300; - letter-spacing: .2rem; - line-height: 1.5; - margin: 0 0 1rem; - text-transform: uppercase -} - -input[type=email],input[type=password],input[type=tel],input[type=text],select { - padding: 0 1rem -} - -input[type=email],input[type=password],input[type=tel],input[type=text],select,textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - -moz-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - -webkit-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - -ms-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - background-color: transparent; - border-radius: 4px; - border: solid 1px #fff; - color: inherit; - display: block; - outline: 0; - text-decoration: none; - width: 100% -} - -input[type=email]:invalid,input[type=password]:invalid,input[type=tel]:invalid,input[type=text]:invalid,select:invalid,textarea:invalid { - box-shadow: none -} - -input[type=email]:focus,input[type=password]:focus,input[type=tel]:focus,input[type=text]:focus,select:focus,textarea:focus { - background: rgba(255,255,255,.075); - border-color: #fff; - box-shadow: 0 0 0 1px #fff -} - -select { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' preserveAspectRatio='none' viewBox='0 0 40 40'%3E%3Cpath d='M9.4,12.3l10.4,10.4l10.4-10.4c0.2-0.2,0.5-0.4,0.9-0.4c0.3,0,0.6,0.1,0.9,0.4l3.3,3.3c0.2,0.2,0.4,0.5,0.4,0.9 c0,0.4-0.1,0.6-0.4,0.9L20.7,31.9c-0.2,0.2-0.5,0.4-0.9,0.4c-0.3,0-0.6-0.1-0.9-0.4L4.3,17.3c-0.2-0.2-0.4-0.5-0.4-0.9 c0-0.4,0.1-0.6,0.4-0.9l3.3-3.3c0.2-0.2,0.5-0.4,0.9-0.4S9.1,12.1,9.4,12.3z' fill='%23ffffff' /%3E%3C/svg%3E"); - background-size: 1.25rem; - background-repeat: no-repeat; - background-position: calc(100% - 1rem) center; - padding-right: 2.75rem; - text-overflow: ellipsis -} - -select option { - color: #fff; - background: #1b1f22 -} - -select:focus::-ms-value { - background-color: transparent -} - -select::-ms-expand { - display: none -} - -input[type=email],input[type=password],input[type=text],select { - height: 2.75rem -} - -textarea { - padding: .75rem 1rem -} - -input[type=checkbox],input[type=radio] { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - display: block; - float: left; - margin-right: -2rem; - opacity: 0; - width: 1rem; - z-index: -1 -} - -input[type=checkbox]+label,input[type=radio]+label { - text-decoration: none; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - color: #fff; - cursor: pointer; - display: inline-block; - font-size: .8rem; - font-weight: 300; - margin: 0 0 .5rem; - padding-left: 2.65rem; - padding-right: .75rem; - position: relative -} - -input[type=checkbox]+label:before,input[type=radio]+label:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - text-transform: none!important; - font-family: "Font Awesome 5 Free"; - font-weight: 900; - -moz-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - -webkit-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - -ms-transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - transition: border-color .2s ease-in-out,box-shadow .2s ease-in-out,background-color .2s ease-in-out; - border: solid 1px #fff; - content: ""; - display: inline-block; - height: 1.65rem; - left: 0; - line-height: 1.65rem; - position: absolute; - text-align: center; - top: -.15rem; - width: 1.65rem -} - -input[type=checkbox]:checked+label:before,input[type=radio]:checked+label:before { - background: #fff!important; - border-color: #fff!important; - color: #1b1f22; - content: "" -} - -input[type=checkbox]:focus+label:before,input[type=radio]:focus+label:before { - background: rgba(255,255,255,.075); - border-color: #fff; - box-shadow: 0 0 0 1px #fff -} - -input[type=checkbox]+label:before { - border-radius: 4px -} - -input[type=radio]+label:before { - border-radius: 100% -} - -::-webkit-input-placeholder { - color: rgba(255,255,255,.5)!important; - opacity: 1 -} - -:-moz-placeholder { - color: rgba(255,255,255,.5)!important; - opacity: 1 -} - -::-moz-placeholder { - color: rgba(255,255,255,.5)!important; - opacity: 1 -} - -:-ms-input-placeholder { - color: rgba(255,255,255,.5)!important; - opacity: 1 -} - -.formerize-placeholder { - color: rgba(255,255,255,.5)!important; - opacity: 1 -} - -.box { - border-radius: 4px; - border: solid 1px #fff; - margin-bottom: 2rem; - padding: 1.5em -} - -.box.alt { - border: 0; - border-radius: 0; - padding: 0 -} - -.icon,.image { - position: relative -} - -.icon { - text-decoration: none; - border-bottom: none -} - -.icon:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - text-transform: none!important; - font-family: "Font Awesome 5 Free"; - font-weight: 400; - line-height: inherit -} - -.icon>.label { - display: none -} - -.icon.solid:before { - font-weight: 900 -} - -.icon.brands:before { - font-family: "Font Awesome 5 Brands" -} - -.image { - border-radius: 4px; - border: 0; - display: inline-block -} - -.image:before { - pointer-events: none; - background-image: url(../images/overlay/overlay.png); - background-color: rgba(19,21,25,.5); - content: ""; - height: 100%; - left: 0; - opacity: .5; - position: absolute; - top: 0; - width: 100% -} - -.image img,.image:before { - border-radius: 4px; - display: block -} - -.image.left,.image.right { - max-width: 40% -} - -.image.fit img,.image.left img,.image.main img,.image.right img,ul.actions.fit li>*,ul.actions.fit.stacked { - width: 100% -} - -.image.left { - float: left; - padding: 0 1.5em 1em 0; - top: .25em -} - -.image.right { - float: right; - padding: 0 0 1em 1.5em; - top: .25em -} - -.image.fit,ol { - margin: 0 0 2rem -} - -.image.fit,.image.main { - display: block; - width: 100% -} - -.image.main { - margin: 2.5rem 0 -} - -@media screen and (max-width:736px) { - .image.main { - margin: 2rem 0 - } -} - -@media screen and (max-width:480px) { - .image.main { - margin: 1.5rem 0 - } -} - -ol { - list-style: decimal; - padding-left: 1.25em -} - -ol li { - padding-left: .25em -} - -ul { - list-style: disc; - padding-left: 1em -} - -ul li { - padding-left: .5em -} - -ul.alt { - list-style: none; - padding-left: 0 -} - -ul.alt li { - border-top: solid 1px #fff; - padding: .5em 0 -} - -ul.alt li:first-child { - border-top: 0; - padding-top: 0 -} - -dl dt { - display: block; - font-weight: 600; - margin: 0 0 1rem -} - -dl dd { - margin-left: 2rem -} - -ul.actions { - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - cursor: default; - list-style: none; - margin-left: -1rem; - padding-left: 0 -} - -ul.actions li { - padding: 0 0 0 1rem; - vertical-align: middle -} - -ul.actions.special { - -moz-justify-content: center; - -webkit-justify-content: center; - -ms-justify-content: center; - justify-content: center; - width: 100%; - margin-left: 0 -} - -ul.actions.special li:first-child { - padding-left: 0 -} - -ul.actions.stacked { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - margin-left: 0 -} - -ul.actions.stacked li { - padding: 1.3rem 0 0 -} - -ul.actions.stacked li:first-child { - padding-top: 0 -} - -ul.actions.fit { - width: calc(100% + 1rem) -} - -ul.actions.fit li { - -moz-flex-grow: 1; - -webkit-flex-grow: 1; - -ms-flex-grow: 1; - flex-grow: 1; - -moz-flex-shrink: 1; - -webkit-flex-shrink: 1; - -ms-flex-shrink: 1; - flex-shrink: 1; - width: 100% -} - -@media screen and (max-width:480px) { - ul.actions:not(.fixed) { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - margin-left: 0; - width: 100%!important - } - - ul.actions:not(.fixed) li { - -moz-flex-grow: 1; - -webkit-flex-grow: 1; - -ms-flex-grow: 1; - flex-grow: 1; - -moz-flex-shrink: 1; - -webkit-flex-shrink: 1; - -ms-flex-shrink: 1; - flex-shrink: 1; - padding: 1rem 0 0; - text-align: center; - width: 100% - } - - ul.actions:not(.fixed) li .button,ul.actions:not(.fixed) li button,ul.actions:not(.fixed) li input[type=button],ul.actions:not(.fixed) li input[type=reset],ul.actions:not(.fixed) li input[type=submit],ul.actions:not(.fixed) li>* { - width: 100% - } - - ul.actions:not(.fixed) li:first-child { - padding-top: 0 - } - - ul.actions:not(.fixed) li .button.icon:before,ul.actions:not(.fixed) li button.icon:before,ul.actions:not(.fixed) li input[type=button].icon:before,ul.actions:not(.fixed) li input[type=reset].icon:before,ul.actions:not(.fixed) li input[type=submit].icon:before { - margin-left: -.5em - } -} - -ul.icons { - cursor: default; - list-style: none; - padding-left: 0 -} - -ul.icons li { - display: inline-block; - padding: 0 .75em 0 0 -} - -ul.icons li:last-child { - padding-right: 0 -} - -ul.icons li a { - border-radius: 100%; - box-shadow: inset 0 0 0 1px #fff; - display: inline-block; - height: 2.25rem; - line-height: 2.25rem; - text-align: center; - width: 2.25rem -} - -#main article .close:hover:before,.button:hover,button:hover,input[type=button]:hover,input[type=reset]:hover,input[type=submit]:hover,ul.icons li a:hover { - background-color: rgba(255,255,255,.075) -} - -#main article .close:active:before,.button:active,button:active,input[type=button]:active,input[type=reset]:active,input[type=submit]:active,ul.icons li a:active { - background-color: rgba(255,255,255,.175) -} - -.table-wrapper { - -webkit-overflow-scrolling: touch; - overflow-x: auto -} - -table tbody tr { - border: solid 1px #fff; - border-left: 0; - border-right: 0 -} - -table tbody tr:nth-child(2n+1) { - background-color: rgba(255,255,255,.075) -} - -table td { - padding: .75em -} - -table th { - color: #fff; - font-size: .9em; - font-weight: 600; - padding: 0 .75em .75em; - text-align: left -} - -table thead { - border-bottom: solid 2px #fff -} - -table tfoot { - border-top: solid 2px #fff -} - -table.alt { - border-collapse: separate -} - -table.alt tbody tr td { - border: solid 1px #fff; - border-left-width: 0; - border-top-width: 0 -} - -table.alt tbody tr td:first-child { - border-left-width: 1px -} - -table.alt tbody tr:first-child td { - border-top-width: 1px -} - -table.alt thead { - border-bottom: 0 -} - -table.alt tfoot { - border-top: 0 -} - -.button,button,input[type=button],input[type=reset],input[type=submit] { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - -moz-transition: background-color .2s ease-in-out,color .2s ease-in-out; - -webkit-transition: background-color .2s ease-in-out,color .2s ease-in-out; - -ms-transition: background-color .2s ease-in-out,color .2s ease-in-out; - transition: background-color .2s ease-in-out,color .2s ease-in-out; - background-color: transparent; - border-radius: 4px; - border: 0; - box-shadow: inset 0 0 0 1px #fff; - color: #fff!important; - cursor: pointer; - display: inline-block; - font-size: .8rem; - font-weight: 300; - height: 2.75rem; - letter-spacing: .2rem; - line-height: 2.75rem; - outline: 0; - padding: 0 1.25rem 0 1.35rem; - text-align: center; - text-decoration: none; - text-transform: uppercase; - white-space: nowrap -} - -.button.icon:before,button.icon:before,input[type=button].icon:before,input[type=reset].icon:before,input[type=submit].icon:before { - margin-right: .5em -} - -.button.fit,button.fit,input[type=button].fit,input[type=reset].fit,input[type=submit].fit { - width: 100% -} - -.button.small,button.small,input[type=button].small,input[type=reset].small,input[type=submit].small { - font-size: .6rem; - height: 2.0625rem; - line-height: 2.0625rem -} - -.button.primary,button.primary,input[type=button].primary,input[type=reset].primary,input[type=submit].primary { - background-color: #fff; - color: #1b1f22!important; - font-weight: 600 -} - -.button.disabled,.button:disabled,button.disabled,button:disabled,input[type=button].disabled,input[type=button]:disabled,input[type=reset].disabled,input[type=reset]:disabled,input[type=submit].disabled,input[type=submit]:disabled { - pointer-events: none; - cursor: default; - opacity: .25 -} - -button,input[type=button],input[type=reset],input[type=submit] { - line-height: calc(2.75rem - 2px) -} - -#bg { - -moz-transform: scale(1); - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100vh; - z-index: 1 -} - -#bg:after,#bg:before { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100% -} - -#bg:before { - -moz-transition: background-color 2.5s ease-in-out; - -webkit-transition: background-color 2.5s ease-in-out; - -ms-transition: background-color 2.5s ease-in-out; - transition: background-color 2.5s ease-in-out; - -moz-transition-delay: .75s; - -webkit-transition-delay: .75s; - -ms-transition-delay: .75s; - transition-delay: .75s; - background-image: linear-gradient(to top,rgba(19,21,25,.5),rgba(19,21,25,.5)),url(../images/overlay/overlay.png); - background-size: auto,256px 256px; - background-position: center,center; - background-repeat: no-repeat,repeat; - z-index: 2 -} - -#bg:after { - -moz-transform: scale(1.125); - -webkit-transform: scale(1.125); - -ms-transform: scale(1.125); - transform: scale(1.125); - -moz-transition: -moz-transform .325s ease-in-out,-moz-filter .325s ease-in-out; - -webkit-transition: -webkit-transform .325s ease-in-out,-webkit-filter .325s ease-in-out; - -ms-transition: -ms-transform .325s ease-in-out,-ms-filter .325s ease-in-out; - transition: transform .325s ease-in-out,filter .325s ease-in-out; - background-image: url(../../assets/images/background/bg.svg); - background-position: center; - background-size: cover; - background-repeat: no-repeat; - z-index: 1 -} - -body.is-article-visible #bg:after { - -moz-transform: scale(1.0825); - -webkit-transform: scale(1.0825); - -ms-transform: scale(1.0825); - transform: scale(1.0825); - -moz-filter: blur(.2rem); - -webkit-filter: blur(.2rem); - -ms-filter: blur(.2rem); - filter: blur(.2rem) -} - -body.is-preload #bg:before { - background-color: #000 -} - -#wrapper { - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -moz-align-items: center; - -webkit-align-items: center; - -ms-align-items: center; - align-items: center; - -moz-justify-content: space-between; - -webkit-justify-content: space-between; - -ms-justify-content: space-between; - justify-content: center; - position: relative; - min-height: 100vh; - width: auto; - padding: 1rem; - z-index: 3; - margin: auto -} - -#header>:before,#wrapper:before { - content: ""; - display: block -} - -@media screen and (max-width:1680px) { - #wrapper { - padding: 1rem - } -} - -@media screen and (max-width:736px) { - #wrapper { - padding: 1rem - } -} - -@media screen and (max-width:480px) { - #wrapper { - padding: 1rem - } -} - -#header { - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -moz-align-items: center; - -webkit-align-items: center; - -ms-align-items: center; - align-items: center; - -moz-transition: -moz-transform .325s ease-in-out,-moz-filter .325s ease-in-out,opacity .325s ease-in-out; - -webkit-transition: -webkit-transform .325s ease-in-out,-webkit-filter .325s ease-in-out,opacity .325s ease-in-out; - -ms-transition: -ms-transform .325s ease-in-out,-ms-filter .325s ease-in-out,opacity .325s ease-in-out; - transition: transform .325s ease-in-out,filter .325s ease-in-out,opacity .325s ease-in-out; - background-image: -moz-radial-gradient(rgba(0,0,0,.25) 25%,transparent 55%); - background-image: -webkit-radial-gradient(rgba(0,0,0,.25) 25%,transparent 55%); - background-image: -ms-radial-gradient(rgba(0,0,0,.25) 25%,transparent 55%); - background-image: radial-gradient(rgba(0,0,0,.25) 25%,transparent 55%); - min-height: auto; - width: auto; - text-align: center -} - -#header>* { - -moz-transition: opacity .325s ease-in-out; - -webkit-transition: opacity .325s ease-in-out; - -ms-transition: opacity .325s ease-in-out; - transition: opacity .325s ease-in-out; - position: relative; - margin-top: 1rem -} - -#header>:before { - position: absolute; - top: calc(-1.5rem - 1px); - left: calc(50% - 1px); - width: 1px; - height: calc(1rem + 1px) -} - -#header>:first-child { - margin-top: 0 -} - -#header>:first-child:before { - display: none -} - -#header .logo { - width: 8rem; - height: 8rem; - display: flex; - justify-content: auto; - align-items: auto; - overflow: auto -} - -#header .content { - border-style: solid; - border-color: #fff; - border-top-width: 1px; - border-bottom-width: 1px; - margin-bottom: 1rem; - max-width: 90% -} - -#header .content .inner { - -moz-transition: max-height .75s ease,padding .75s ease,opacity .325s ease-in-out; - -webkit-transition: max-height .75s ease,padding .75s ease,opacity .325s ease-in-out; - -ms-transition: max-height .75s ease,padding .75s ease,opacity .325s ease-in-out; - transition: max-height .75s ease,padding .75s ease,opacity .325s ease-in-out; - -moz-transition-delay: .25s; - -webkit-transition-delay: .25s; - -ms-transition-delay: .25s; - transition-delay: .25s; - padding: 1rem; - max-height: 40rem; - overflow: hidden -} - -#header .content p { - text-transform: uppercase; - letter-spacing: .2rem; - font-size: .8rem; - line-height: 2 -} - -#header nav ul { - display: flex; - flex-direction: column; - align-items: center; - list-style: none; - padding: 0 -} - -#header nav ul li,#header nav ul li a { - display: flex; - align-items: center; - justify-content: center; - padding: 0 -} - -#header nav ul li { - border: 1px solid #fff; - border-radius: 7px; - margin-bottom: 20px; - width: 280px; - height: 50px -} - -#header nav ul li:hover { - background-color: #42424232 -} - -#header nav ul li a { - width: 100%; - height: 100%; - text-align: center; - text-transform: uppercase; - letter-spacing: .2rem; - font-size: 1rem; - box-sizing: border-box -} - -#header nav ul li a,#header nav ul li a:visited { - text-decoration: none; - border-bottom: none -} - -#header nav ul li a:active,#header nav ul li a:focus,#header nav ul li a:hover { - text-decoration: none -} - -#header nav.use-middle:after { - content: ""; - display: block; - position: absolute; - top: calc(-3.5rem - 1px); - width: 1px; - height: calc(1rem + 1px) -} - -body.is-article-visible #header { - -moz-transform: scale(.95); - -webkit-transform: scale(.95); - -ms-transform: scale(.95); - transform: scale(.95); - -moz-filter: blur(.1rem); - -webkit-filter: blur(.1rem); - -ms-filter: blur(.1rem); - filter: blur(.1rem); - opacity: 0 -} - -body.is-preload #header { - -moz-filter: blur(.125rem); - -webkit-filter: blur(.125rem); - -ms-filter: blur(.125rem); - filter: blur(.125rem) -} - -body.is-preload #header>* { - opacity: 0 -} - -body.is-preload #header .content .inner { - max-height: 0; - padding-top: 0; - padding-bottom: 0; - opacity: 0 -} - -@media screen and (max-width:980px) { - #header .content p br { - display: none - } -} - -@media screen and (max-width:736px) { - #header>* { - margin-top: 2rem - } - - #header>:before { - top: calc(-2rem - 1px); - height: calc(2rem + 1px) - } - - #header .logo .icon:before { - font-size: 1.75rem - } - - #header .content .inner { - padding: 2.5rem 1rem - } - - #header .content p { - line-height: 1.875 - } -} - -@media screen and (max-width:480px) { - #header { - padding: 1.5rem 0 - } - - #header .content .inner { - padding: 2.5rem 0 - } - - #header nav ul { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - min-width: 10rem; - max-width: 100% - } - - #header nav ul li { - border-left: 1px solid #fff; - border-top: 1px solid #fff - } - - #header nav ul li:first-child { - border-top: 1 - } - - #header nav ul li a { - height: 3rem; - line-height: 3rem; - min-width: 0; - width: 100% - } - - #header nav.use-middle:after { - display: none - } -} - -#main,#main article { - position: relative; - max-width: 100% -} - -#main { - -moz-flex-grow: 1; - -webkit-flex-grow: 1; - -ms-flex-grow: 1; - flex-grow: 1; - -moz-flex-shrink: 1; - -webkit-flex-shrink: 1; - -ms-flex-shrink: 1; - flex-shrink: 1; - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - -moz-align-items: center; - -webkit-align-items: center; - -ms-align-items: center; - align-items: center; - -moz-justify-content: center; - -webkit-justify-content: center; - -ms-justify-content: center; - justify-content: center; - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - z-index: 3 -} - -#main article { - -moz-transform: translateY(.25rem); - -webkit-transform: translateY(.25rem); - -ms-transform: translateY(.25rem); - transform: translateY(.25rem); - -moz-transition: opacity .325s ease-in-out,-moz-transform .325s ease-in-out; - -webkit-transition: opacity .325s ease-in-out,-webkit-transform .325s ease-in-out; - -ms-transition: opacity .325s ease-in-out,-ms-transform .325s ease-in-out; - transition: opacity .325s ease-in-out,transform .325s ease-in-out; - padding: 1.5rem; - width: 50rem; - background-color: rgba(27,31,34,.85); - border-radius: 4px; - opacity: 0 -} - -#main article.active { - -moz-transform: translateY(0); - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - opacity: 1 -} - -#main article .close { - display: block; - position: absolute; - top: 0; - right: 0; - width: 4rem; - height: 4rem; - cursor: pointer; - text-indent: 4rem; - overflow: hidden; - white-space: nowrap -} - -#main article .close:before { - -moz-transition: background-color .2s ease-in-out; - -webkit-transition: background-color .2s ease-in-out; - -ms-transition: background-color .2s ease-in-out; - transition: background-color .2s ease-in-out; - content: ""; - display: block; - position: absolute; - top: .75rem; - left: .75rem; - width: 2.5rem; - height: 2.5rem; - border-radius: 100%; - background-position: center; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='20px' height='20px' viewBox='0 0 20 20' zoomAndPan='disable'%3E%3Cstyle%3Eline %7B stroke: %23ffffff%3B stroke-width: 1%3B %7D%3C/style%3E%3Cline x1='2' y1='2' x2='18' y2='18' /%3E%3Cline x1='18' y1='2' x2='2' y2='18' /%3E%3C/svg%3E"); - background-size: 12px 12px; - background-repeat: no-repeat -} - -@media screen and (max-width:736px) { - #main article { - padding: 3.5rem 2rem .5rem - } - - #main article .close:before { - top: .875rem; - left: .875rem; - width: 2.25rem; - height: 2.25rem; - background-size: 14px 14px - } -} - -@media screen and (max-width:480px) { - #main article { - padding: 3rem 1.5rem .5rem - } -} - -#footer { - -moz-transition: -moz-transform .325s ease-in-out,-moz-filter .325s ease-in-out,opacity .325s ease-in-out; - -webkit-transition: -webkit-transform .325s ease-in-out,-webkit-filter .325s ease-in-out,opacity .325s ease-in-out; - -ms-transition: -ms-transform .325s ease-in-out,-ms-filter .325s ease-in-out,opacity .325s ease-in-out; - transition: transform .325s ease-in-out,filter .325s ease-in-out,opacity .325s ease-in-out; - width: 100%; - max-width: 100%; - margin-top: 1rem; - text-align: center -} - -#footer .copyright { - letter-spacing: .2rem; - font-size: .6rem; - opacity: .75; - margin-bottom: 0; - text-transform: uppercase -} - -body.is-article-visible #footer { - -moz-transform: scale(.95); - -webkit-transform: scale(.95); - -ms-transform: scale(.95); - transform: scale(.95); - -moz-filter: blur(.1rem); - -webkit-filter: blur(.1rem); - -ms-filter: blur(.1rem); - filter: blur(.1rem); - opacity: 0 -} - -body.is-preload #footer { - opacity: 0 -} \ No newline at end of file diff --git a/assets/css/noscript.css b/assets/css/noscript.css deleted file mode 100644 index cc89b0f..0000000 --- a/assets/css/noscript.css +++ /dev/null @@ -1,37 +0,0 @@ -/* - Dimension by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - -/* BG */ - - body.is-preload #bg:before { - background-color: transparent; - } - -/* Header */ - - body.is-preload #header { - -moz-filter: none; - -webkit-filter: none; - -ms-filter: none; - filter: none; - } - - body.is-preload #header > * { - opacity: 1; - } - - body.is-preload #header .content .inner { - max-height: none; - padding: 3rem 2rem; - opacity: 1; - } - -/* Main */ - - #main article { - opacity: 1; - margin: 4rem 0 0 0; - } \ No newline at end of file diff --git a/assets/images/background/bg.svg b/assets/images/background/bg.svg deleted file mode 100644 index b1f730c..0000000 --- a/assets/images/background/bg.svg +++ /dev/null @@ -1,31 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/logo/logo.svg b/assets/images/logo/logo.svg deleted file mode 100644 index d7848a1..0000000 --- a/assets/images/logo/logo.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - diff --git a/assets/images/logo/person.png b/assets/images/logo/person.png deleted file mode 100644 index 19303a0..0000000 Binary files a/assets/images/logo/person.png and /dev/null differ diff --git a/assets/images/members/Alex_RLT.jpg b/assets/images/members/Alex_RLT.jpg deleted file mode 100644 index b1e3408..0000000 Binary files a/assets/images/members/Alex_RLT.jpg and /dev/null differ diff --git a/assets/images/members/Jifouille.jpg b/assets/images/members/Jifouille.jpg deleted file mode 100644 index 0d22fff..0000000 Binary files a/assets/images/members/Jifouille.jpg and /dev/null differ diff --git a/assets/images/members/Jycssu.png b/assets/images/members/Jycssu.png deleted file mode 100644 index 87ea48a..0000000 Binary files a/assets/images/members/Jycssu.png and /dev/null differ diff --git a/assets/images/members/Kurtisone.jpg b/assets/images/members/Kurtisone.jpg deleted file mode 100644 index df6d920..0000000 Binary files a/assets/images/members/Kurtisone.jpg and /dev/null differ diff --git a/assets/images/members/Nandy.jpg b/assets/images/members/Nandy.jpg deleted file mode 100644 index 60e6bfb..0000000 Binary files a/assets/images/members/Nandy.jpg and /dev/null differ diff --git a/assets/images/members/Phil.png b/assets/images/members/Phil.png deleted file mode 100644 index c24160c..0000000 Binary files a/assets/images/members/Phil.png and /dev/null differ diff --git a/assets/images/overlay/overlay.png b/assets/images/overlay/overlay.png deleted file mode 100644 index 3cd22cc..0000000 Binary files a/assets/images/overlay/overlay.png and /dev/null differ diff --git a/assets/images/products/api.jpg b/assets/images/products/api.jpg deleted file mode 100644 index 3087204..0000000 Binary files a/assets/images/products/api.jpg and /dev/null differ diff --git a/assets/images/products/bridge.jpg b/assets/images/products/bridge.jpg deleted file mode 100644 index 1b7e823..0000000 Binary files a/assets/images/products/bridge.jpg and /dev/null differ diff --git a/assets/images/products/dashboard.jpg b/assets/images/products/dashboard.jpg deleted file mode 100644 index a3b85e6..0000000 Binary files a/assets/images/products/dashboard.jpg and /dev/null differ diff --git a/assets/images/products/levinswap.jpg b/assets/images/products/levinswap.jpg deleted file mode 100644 index 48b485e..0000000 Binary files a/assets/images/products/levinswap.jpg and /dev/null differ diff --git a/assets/images/products/map.jpg b/assets/images/products/map.jpg deleted file mode 100644 index ae9983d..0000000 Binary files a/assets/images/products/map.jpg and /dev/null differ diff --git a/assets/images/products/mobile_app.jpg b/assets/images/products/mobile_app.jpg deleted file mode 100644 index 7a34f55..0000000 Binary files a/assets/images/products/mobile_app.jpg and /dev/null differ diff --git a/assets/images/products/rmm.jpg b/assets/images/products/rmm.jpg deleted file mode 100644 index 4ff272f..0000000 Binary files a/assets/images/products/rmm.jpg and /dev/null differ diff --git a/assets/images/products/soon.jpg b/assets/images/products/soon.jpg deleted file mode 100644 index 2c03e16..0000000 Binary files a/assets/images/products/soon.jpg and /dev/null differ diff --git a/assets/images/products/tuto.jpg b/assets/images/products/tuto.jpg deleted file mode 100644 index 722c99d..0000000 Binary files a/assets/images/products/tuto.jpg and /dev/null differ diff --git a/assets/images/products/vote.jpg b/assets/images/products/vote.jpg deleted file mode 100644 index c04ec6b..0000000 Binary files a/assets/images/products/vote.jpg and /dev/null differ diff --git a/assets/images/products/yam.jpg b/assets/images/products/yam.jpg deleted file mode 100644 index ef7fc21..0000000 Binary files a/assets/images/products/yam.jpg and /dev/null differ diff --git a/assets/js/breakpoints.min.js b/assets/js/breakpoints.min.js deleted file mode 100644 index 32419cc..0000000 --- a/assets/js/breakpoints.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* breakpoints.js v1.0 | @ajlkn | MIT licensed */ -var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e { - console.log('Message envoyé'); - alert('Your message is being sent.'); - }) - .catch((error) => { - console.error('Error:', error); - alert('Error sending message.'); - }); -}); - -document.addEventListener('DOMContentLoaded', function() { - console.log('Fetching wallet balance...'); - fetch('https://safe-transaction-gnosis-chain.safe.global/api/v1/safes/0xeC247b0Ca0c1c84e3a5e5f55589AE3844e7c259a/balances/?trusted=false&exclude_spam=true') - .then(response => { - console.log('Response received:', response); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - return response.json(); - }) - .then(data => { - console.log('Data received:', data); - let dropdown = document.getElementById("tokenDropdown"); - dropdown.innerHTML = ''; - data.forEach(item => { - const tokenName = item.token ? item.token.name : 'xDai'; - const balance = Number(item.balance) / Math.pow(10, item.token ? item.token.decimals : 18); - let option = document.createElement('option'); - option.textContent = `${tokenName}: ${balance.toFixed(2)}`; - option.disabled = true; - dropdown.appendChild(option); - }); - dropdown.addEventListener('change', function() {this.selectedIndex = 0}); - }) - .catch(error => { - console.error('Error fetching the wallet balance:', error); - document.getElementById("tokenDropdown").textContent = 'Failed to fetch token balances.'; - }); -}); \ No newline at end of file diff --git a/assets/js/jquery.min.js b/assets/js/jquery.min.js deleted file mode 100644 index c4c6022..0000000 --- a/assets/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 $window.height()) - $wrapper.css('height', 'auto'); - else - $wrapper.css('height', '100vh'); - - }, 250); - - }).triggerHandler('resize.flexbox-fix'); - - } - - // Nav. - var $nav = $header.children('nav'), - $nav_li = $nav.find('li'); - - // Add "middle" alignment classes if we're dealing with an even number of items. - if ($nav_li.length % 2 == 0) { - - $nav.addClass('use-middle'); - $nav_li.eq( ($nav_li.length / 2) ).addClass('is-middle'); - - } - - // Main. - var delay = 325, - locked = false; - - // Methods. - $main._show = function(id, initial) { - - var $article = $main_articles.filter('#' + id); - - // No such article? Bail. - if ($article.length == 0) - return; - - // Handle lock. - - // Already locked? Speed through "show" steps w/o delays. - if (locked || (typeof initial != 'undefined' && initial === true)) { - - // Mark as switching. - $body.addClass('is-switching'); - - // Mark as visible. - $body.addClass('is-article-visible'); - - // Deactivate all articles (just in case one's already active). - $main_articles.removeClass('active'); - - // Hide header, footer. - $header.hide(); - $footer.hide(); - - // Show main, article. - $main.show(); - $article.show(); - - // Activate article. - $article.addClass('active'); - - // Unlock. - locked = false; - - // Unmark as switching. - setTimeout(function() { - $body.removeClass('is-switching'); - }, (initial ? 1000 : 0)); - - return; - - } - - // Lock. - locked = true; - - // Article already visible? Just swap articles. - if ($body.hasClass('is-article-visible')) { - - // Deactivate current article. - var $currentArticle = $main_articles.filter('.active'); - - $currentArticle.removeClass('active'); - - // Show article. - setTimeout(function() { - - // Hide current article. - $currentArticle.hide(); - - // Show article. - $article.show(); - - // Activate article. - setTimeout(function() { - - $article.addClass('active'); - - // Window stuff. - $window - .scrollTop(0) - .triggerHandler('resize.flexbox-fix'); - - // Unlock. - setTimeout(function() { - locked = false; - }, delay); - - }, 25); - - }, delay); - - } - - // Otherwise, handle as normal. - else { - - // Mark as visible. - $body - .addClass('is-article-visible'); - - // Show article. - setTimeout(function() { - - // Hide header, footer. - $header.hide(); - $footer.hide(); - - // Show main, article. - $main.show(); - $article.show(); - - // Activate article. - setTimeout(function() { - - $article.addClass('active'); - - // Window stuff. - $window - .scrollTop(0) - .triggerHandler('resize.flexbox-fix'); - - // Unlock. - setTimeout(function() { - locked = false; - }, delay); - - }, 25); - - }, delay); - - } - - }; - - $main._hide = function(addState) { - - var $article = $main_articles.filter('.active'); - - // Article not visible? Bail. - if (!$body.hasClass('is-article-visible')) - return; - - // Add state? - if (typeof addState != 'undefined' - && addState === true) - history.pushState(null, null, '#'); - - // Handle lock. - - // Already locked? Speed through "hide" steps w/o delays. - if (locked) { - - // Mark as switching. - $body.addClass('is-switching'); - - // Deactivate article. - $article.removeClass('active'); - - // Hide article, main. - $article.hide(); - $main.hide(); - - // Show footer, header. - $footer.show(); - $header.show(); - - // Unmark as visible. - $body.removeClass('is-article-visible'); - - // Unlock. - locked = false; - - // Unmark as switching. - $body.removeClass('is-switching'); - - // Window stuff. - $window - .scrollTop(0) - .triggerHandler('resize.flexbox-fix'); - - return; - - } - - // Lock. - locked = true; - - // Deactivate article. - $article.removeClass('active'); - - // Hide article. - setTimeout(function() { - - // Hide article, main. - $article.hide(); - $main.hide(); - - // Show footer, header. - $footer.show(); - $header.show(); - - // Unmark as visible. - setTimeout(function() { - - $body.removeClass('is-article-visible'); - - // Window stuff. - $window - .scrollTop(0) - .triggerHandler('resize.flexbox-fix'); - - // Unlock. - setTimeout(function() { - locked = false; - }, delay); - - }, 25); - - }, delay); - - - }; - - // Articles. - $main_articles.each(function() { - - var $this = $(this); - - // Close. - $('
Close
') - .appendTo($this) - .on('click', function() { - location.hash = ''; - }); - - // Prevent clicks from inside article from bubbling. - $this.on('click', function(event) { - event.stopPropagation(); - }); - - }); - - // Events. - $body.on('click', function(event) { - - // Article visible? Hide. - if ($body.hasClass('is-article-visible')) - $main._hide(true); - - }); - - $window.on('keyup', function(event) { - - switch (event.keyCode) { - - case 27: - - // Article visible? Hide. - if ($body.hasClass('is-article-visible')) - $main._hide(true); - - break; - - default: - break; - - } - - }); - - $window.on('hashchange', function(event) { - - // Empty hash? - if (location.hash == '' - || location.hash == '#') { - - // Prevent default. - event.preventDefault(); - event.stopPropagation(); - - // Hide. - $main._hide(); - - } - - // Otherwise, check for a matching article. - else if ($main_articles.filter(location.hash).length > 0) { - - // Prevent default. - event.preventDefault(); - event.stopPropagation(); - - // Show article. - $main._show(location.hash.substr(1)); - - } - - }); - - // Scroll restoration. - // This prevents the page from scrolling back to the top on a hashchange. - if ('scrollRestoration' in history) - history.scrollRestoration = 'manual'; - else { - - var oldScrollPos = 0, - scrollPos = 0, - $htmlbody = $('html,body'); - - $window - .on('scroll', function() { - - oldScrollPos = scrollPos; - scrollPos = $htmlbody.scrollTop(); - - }) - .on('hashchange', function() { - $window.scrollTop(oldScrollPos); - }); - - } - - // Initialize. - - // Hide main, articles. - $main.hide(); - $main_articles.hide(); - - // Initial article. - if (location.hash != '' - && location.hash != '#') - $window.on('load', function() { - $main._show(location.hash.substr(1), true); - }); - -})(jQuery); \ No newline at end of file diff --git a/assets/js/util.js b/assets/js/util.js deleted file mode 100644 index bdb8e9f..0000000 --- a/assets/js/util.js +++ /dev/null @@ -1,587 +0,0 @@ -(function($) { - - /** - * Generate an indented list of links from a nav. Meant for use with panel(). - * @return {jQuery} jQuery object. - */ - $.fn.navList = function() { - - var $this = $(this); - $a = $this.find('a'), - b = []; - - $a.each(function() { - - var $this = $(this), - indent = Math.max(0, $this.parents('li').length - 1), - href = $this.attr('href'), - target = $this.attr('target'); - - b.push( - '' + - '' + - $this.text() + - '' - ); - - }); - - return b.join(''); - - }; - - /** - * Panel-ify an element. - * @param {object} userConfig User config. - * @return {jQuery} jQuery object. - */ - $.fn.panel = function(userConfig) { - - // No elements? - if (this.length == 0) - return $this; - - // Multiple elements? - if (this.length > 1) { - - for (var i=0; i < this.length; i++) - $(this[i]).panel(userConfig); - - return $this; - - } - - // Vars. - var $this = $(this), - $body = $('body'), - $window = $(window), - id = $this.attr('id'), - config; - - // Config. - config = $.extend({ - - // Delay. - delay: 0, - - // Hide panel on link click. - hideOnClick: false, - - // Hide panel on escape keypress. - hideOnEscape: false, - - // Hide panel on swipe. - hideOnSwipe: false, - - // Reset scroll position on hide. - resetScroll: false, - - // Reset forms on hide. - resetForms: false, - - // Side of viewport the panel will appear. - side: null, - - // Target element for "class". - target: $this, - - // Class to toggle. - visibleClass: 'visible' - - }, userConfig); - - // Expand "target" if it's not a jQuery object already. - if (typeof config.target != 'jQuery') - config.target = $(config.target); - - // Panel. - - // Methods. - $this._hide = function(event) { - - // Already hidden? Bail. - if (!config.target.hasClass(config.visibleClass)) - return; - - // If an event was provided, cancel it. - if (event) { - - event.preventDefault(); - event.stopPropagation(); - - } - - // Hide. - config.target.removeClass(config.visibleClass); - - // Post-hide stuff. - window.setTimeout(function() { - - // Reset scroll position. - if (config.resetScroll) - $this.scrollTop(0); - - // Reset forms. - if (config.resetForms) - $this.find('form').each(function() { - this.reset(); - }); - - }, config.delay); - - }; - - // Vendor fixes. - $this - .css('-ms-overflow-style', '-ms-autohiding-scrollbar') - .css('-webkit-overflow-scrolling', 'touch'); - - // Hide on click. - if (config.hideOnClick) { - - $this.find('a') - .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); - - $this - .on('click', 'a', function(event) { - - var $a = $(this), - href = $a.attr('href'), - target = $a.attr('target'); - - if (!href || href == '#' || href == '' || href == '#' + id) - return; - - // Cancel original event. - event.preventDefault(); - event.stopPropagation(); - - // Hide panel. - $this._hide(); - - // Redirect to href. - window.setTimeout(function() { - - if (target == '_blank') - window.open(href); - else - window.location.href = href; - - }, config.delay + 10); - - }); - - } - - // Event: Touch stuff. - $this.on('touchstart', function(event) { - - $this.touchPosX = event.originalEvent.touches[0].pageX; - $this.touchPosY = event.originalEvent.touches[0].pageY; - - }) - - $this.on('touchmove', function(event) { - - if ($this.touchPosX === null - || $this.touchPosY === null) - return; - - var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, - diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, - th = $this.outerHeight(), - ts = ($this.get(0).scrollHeight - $this.scrollTop()); - - // Hide on swipe? - if (config.hideOnSwipe) { - - var result = false, - boundary = 20, - delta = 50; - - switch (config.side) { - - case 'left': - result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); - break; - - case 'right': - result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); - break; - - case 'top': - result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); - break; - - case 'bottom': - result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); - break; - - default: - break; - - } - - if (result) { - - $this.touchPosX = null; - $this.touchPosY = null; - $this._hide(); - - return false; - - } - - } - - // Prevent vertical scrolling past the top or bottom. - if (($this.scrollTop() < 0 && diffY < 0) - || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { - - event.preventDefault(); - event.stopPropagation(); - - } - - }); - - // Event: Prevent certain events inside the panel from bubbling. - $this.on('click touchend touchstart touchmove', function(event) { - event.stopPropagation(); - }); - - // Event: Hide panel if a child anchor tag pointing to its ID is clicked. - $this.on('click', 'a[href="#' + id + '"]', function(event) { - - event.preventDefault(); - event.stopPropagation(); - - config.target.removeClass(config.visibleClass); - - }); - - // Body. - - // Event: Hide panel on body click/tap. - $body.on('click touchend', function(event) { - $this._hide(event); - }); - - // Event: Toggle. - $body.on('click', 'a[href="#' + id + '"]', function(event) { - - event.preventDefault(); - event.stopPropagation(); - - config.target.toggleClass(config.visibleClass); - - }); - - // Window. - - // Event: Hide on ESC. - if (config.hideOnEscape) - $window.on('keydown', function(event) { - - if (event.keyCode == 27) - $this._hide(event); - - }); - - return $this; - - }; - - /** - * Apply "placeholder" attribute polyfill to one or more forms. - * @return {jQuery} jQuery object. - */ - $.fn.placeholder = function() { - - // Browser natively supports placeholders? Bail. - if (typeof (document.createElement('input')).placeholder != 'undefined') - return $(this); - - // No elements? - if (this.length == 0) - return $this; - - // Multiple elements? - if (this.length > 1) { - - for (var i=0; i < this.length; i++) - $(this[i]).placeholder(); - - return $this; - - } - - // Vars. - var $this = $(this); - - // Text, TextArea. - $this.find('input[type=text],textarea') - .each(function() { - - var i = $(this); - - if (i.val() == '' - || i.val() == i.attr('placeholder')) - i - .addClass('polyfill-placeholder') - .val(i.attr('placeholder')); - - }) - .on('blur', function() { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - return; - - if (i.val() == '') - i - .addClass('polyfill-placeholder') - .val(i.attr('placeholder')); - - }) - .on('focus', function() { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - return; - - if (i.val() == i.attr('placeholder')) - i - .removeClass('polyfill-placeholder') - .val(''); - - }); - - // Password. - $this.find('input[type=password]') - .each(function() { - - var i = $(this); - var x = $( - $('
') - .append(i.clone()) - .remove() - .html() - .replace(/type="password"/i, 'type="text"') - .replace(/type=password/i, 'type=text') - ); - - if (i.attr('id') != '') - x.attr('id', i.attr('id') + '-polyfill-field'); - - if (i.attr('name') != '') - x.attr('name', i.attr('name') + '-polyfill-field'); - - x.addClass('polyfill-placeholder') - .val(x.attr('placeholder')).insertAfter(i); - - if (i.val() == '') - i.hide(); - else - x.hide(); - - i - .on('blur', function(event) { - - event.preventDefault(); - - var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); - - if (i.val() == '') { - - i.hide(); - x.show(); - - } - - }); - - x - .on('focus', function(event) { - - event.preventDefault(); - - var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); - - x.hide(); - - i - .show() - .focus(); - - }) - .on('keypress', function(event) { - - event.preventDefault(); - x.val(''); - - }); - - }); - - // Events. - $this - .on('submit', function() { - - $this.find('input[type=text],input[type=password],textarea') - .each(function(event) { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - i.attr('name', ''); - - if (i.val() == i.attr('placeholder')) { - - i.removeClass('polyfill-placeholder'); - i.val(''); - - } - - }); - - }) - .on('reset', function(event) { - - event.preventDefault(); - - $this.find('select') - .val($('option:first').val()); - - $this.find('input,textarea') - .each(function() { - - var i = $(this), - x; - - i.removeClass('polyfill-placeholder'); - - switch (this.type) { - - case 'submit': - case 'reset': - break; - - case 'password': - i.val(i.attr('defaultValue')); - - x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); - - if (i.val() == '') { - i.hide(); - x.show(); - } - else { - i.show(); - x.hide(); - } - - break; - - case 'checkbox': - case 'radio': - i.attr('checked', i.attr('defaultValue')); - break; - - case 'text': - case 'textarea': - i.val(i.attr('defaultValue')); - - if (i.val() == '') { - i.addClass('polyfill-placeholder'); - i.val(i.attr('placeholder')); - } - - break; - - default: - i.val(i.attr('defaultValue')); - break; - - } - }); - - }); - - return $this; - - }; - - /** - * Moves elements to/from the first positions of their respective parents. - * @param {jQuery} $elements Elements (or selector) to move. - * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. - */ - $.prioritize = function($elements, condition) { - - var key = '__prioritize'; - - // Expand $elements if it's not already a jQuery object. - if (typeof $elements != 'jQuery') - $elements = $($elements); - - // Step through elements. - $elements.each(function() { - - var $e = $(this), $p, - $parent = $e.parent(); - - // No parent? Bail. - if ($parent.length == 0) - return; - - // Not moved? Move it. - if (!$e.data(key)) { - - // Condition is false? Bail. - if (!condition) - return; - - // Get placeholder (which will serve as our point of reference for when this element needs to move back). - $p = $e.prev(); - - // Couldn't find anything? Means this element's already at the top, so bail. - if ($p.length == 0) - return; - - // Move element to top of parent. - $e.prependTo($parent); - - // Mark element as moved. - $e.data(key, $p); - - } - - // Moved already? - else { - - // Condition is true? Bail. - if (condition) - return; - - $p = $e.data(key); - - // Move element back to its original location (using our placeholder). - $e.insertAfter($p); - - // Unmark element as moved. - $e.removeData(key); - - } - - }); - - }; - -})(jQuery); \ No newline at end of file diff --git a/assets/sass/base/_page.scss b/assets/sass/base/_page.scss deleted file mode 100644 index 2c33426..0000000 --- a/assets/sass/base/_page.scss +++ /dev/null @@ -1,42 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Basic */ - - // MSIE: Required for IEMobile. - @-ms-viewport { - width: device-width; - } - - // Ensures page width is always >=320px. - @include breakpoint('<=xsmall') { - html, body { - min-width: 320px; - } - } - - // Set box model to border-box. - // Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice - html { - box-sizing: border-box; - } - - *, *:before, *:after { - box-sizing: inherit; - } - - body { - background: _palette(bg); - - // Stops initial animations until page loads. - &.is-preload { - *, *:before, *:after { - @include vendor('animation', 'none !important'); - @include vendor('transition', 'none !important'); - } - } - - } \ No newline at end of file diff --git a/assets/sass/base/_reset.scss b/assets/sass/base/_reset.scss deleted file mode 100644 index ddcf73e..0000000 --- a/assets/sass/base/_reset.scss +++ /dev/null @@ -1,76 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -// Reset. -// Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) - - html, body, div, span, applet, object, - iframe, h1, h2, h3, h4, h5, h6, p, blockquote, - pre, a, abbr, acronym, address, big, cite, - code, del, dfn, em, img, ins, kbd, q, s, samp, - small, strike, strong, sub, sup, tt, var, b, - u, i, center, dl, dt, dd, ol, ul, li, fieldset, - form, label, legend, table, caption, tbody, - tfoot, thead, tr, th, td, article, aside, - canvas, details, embed, figure, figcaption, - footer, header, hgroup, menu, nav, output, ruby, - section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - } - - article, aside, details, figcaption, figure, - footer, header, hgroup, menu, nav, section { - display: block; - } - - body { - line-height: 1; - } - - ol, ul { - list-style:none; - } - - blockquote, q { - quotes: none; - - &:before, - &:after { - content: ''; - content: none; - } - } - - table { - border-collapse: collapse; - border-spacing: 0; - } - - body { - -webkit-text-size-adjust: none; - } - - mark { - background-color: transparent; - color: inherit; - } - - input::-moz-focus-inner { - border: 0; - padding: 0; - } - - input, select, textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - } \ No newline at end of file diff --git a/assets/sass/base/_typography.scss b/assets/sass/base/_typography.scss deleted file mode 100644 index bc9b7cc..0000000 --- a/assets/sass/base/_typography.scss +++ /dev/null @@ -1,183 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Type */ - - html { - font-size: 16pt; - - @include breakpoint('<=xlarge') { - font-size: 12pt; - } - - @include breakpoint('<=small') { - font-size: 11pt; - } - - @include breakpoint('<=xxsmall') { - font-size: 10pt; - } - } - - body, input, select, textarea { - color: _palette(fg); - font-family: _font(family); - font-weight: _font(weight); - font-size: 1rem; - line-height: 1.65; - } - - a { - @include vendor('transition', ( - 'color #{_duration(transition)} ease-in-out', - 'background-color #{_duration(transition)} ease-in-out', - 'border-bottom-color #{_duration(transition)} ease-in-out' - )); - border-bottom: dotted 1px _palette(fg-light); - text-decoration: none; - color: inherit; - - &:hover { - border-bottom-color: transparent; - } - } - - strong, b { - color: _palette(fg-bold); - font-weight: _font(weight-bold); - } - - em, i { - font-style: italic; - } - - p { - margin: 0 0 _size(element-margin) 0; - } - - h1, h2, h3, h4, h5, h6 { - color: _palette(fg-bold); - font-weight: _font(weight-bold); - line-height: 1.5; - margin: 0 0 (_size(element-margin) * 0.5) 0; - text-transform: uppercase; - letter-spacing: _font(letter-spacing); - - a { - color: inherit; - text-decoration: none; - } - - &.major { - border-bottom: solid _size(border-width) _palette(border); - width: -moz-max-content; - width: -webkit-max-content; - width: -ms-max-content; - width: max-content; - padding-bottom: 0.5rem; - margin: 0 0 (_size(element-margin) * 1) 0; - } - } - - h1 { - font-size: 2.25rem; - line-height: 1.3; - letter-spacing: _font(letter-spacing-heading); - } - - h2 { - font-size: 1.5rem; - line-height: 1.4; - letter-spacing: _font(letter-spacing-heading); - } - - h3 { - font-size: 1rem; - } - - h4 { - font-size: 0.8rem; - } - - h5 { - font-size: 0.7rem; - } - - h6 { - font-size: 0.6rem; - } - - @include breakpoint('<=small') { - h1 { - font-size: 1.75rem; - line-height: 1.4; - } - - h2 { - font-size: 1.25em; - line-height: 1.5; - } - } - - sub { - font-size: 0.8rem; - position: relative; - top: 0.5rem; - } - - sup { - font-size: 0.8rem; - position: relative; - top: -0.5rem; - } - - blockquote { - border-left: solid (_size(border-width) * 4) _palette(border); - font-style: italic; - margin: 0 0 _size(element-margin) 0; - padding: (_size(element-margin) / 4) 0 (_size(element-margin) / 4) _size(element-margin); - } - - code { - background: _palette(border-bg); - border-radius: _size(border-radius); - font-family: _font(family-fixed); - font-size: 0.9rem; - margin: 0 0.25rem; - padding: 0.25rem 0.65rem; - } - - pre { - -webkit-overflow-scrolling: touch; - font-family: _font(family-fixed); - font-size: 0.9rem; - margin: 0 0 _size(element-margin) 0; - - code { - display: block; - line-height: 1.75; - padding: 1rem 1.5rem; - overflow-x: auto; - } - } - - hr { - border: 0; - border-bottom: solid _size(border-width) _palette(border); - margin: (_size(element-margin) * 1.375) 0; - } - - .align-left { - text-align: left; - } - - .align-center { - text-align: center; - } - - .align-right { - text-align: right; - } \ No newline at end of file diff --git a/assets/sass/components/_actions.scss b/assets/sass/components/_actions.scss deleted file mode 100644 index c3605a0..0000000 --- a/assets/sass/components/_actions.scss +++ /dev/null @@ -1,101 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Actions */ - - ul.actions { - @include vendor('display', 'flex'); - cursor: default; - list-style: none; - margin-left: (_size(element-margin) * -0.5); - padding-left: 0; - - li { - padding: 0 0 0 (_size(element-margin) * 0.5); - vertical-align: middle; - } - - &.special { - @include vendor('justify-content', 'center'); - width: 100%; - margin-left: 0; - - li { - &:first-child { - padding-left: 0; - } - } - } - - &.stacked { - @include vendor('flex-direction', 'column'); - margin-left: 0; - - li { - padding: (_size(element-margin) * 0.65) 0 0 0; - - &:first-child { - padding-top: 0; - } - } - } - - &.fit { - width: calc(100% + #{_size(element-margin) * 0.5}); - - li { - @include vendor('flex-grow', '1'); - @include vendor('flex-shrink', '1'); - width: 100%; - - > * { - width: 100%; - } - } - - &.stacked { - width: 100%; - } - } - - @include breakpoint('<=xsmall') { - &:not(.fixed) { - @include vendor('flex-direction', 'column'); - margin-left: 0; - width: 100% !important; - - li { - @include vendor('flex-grow', '1'); - @include vendor('flex-shrink', '1'); - padding: (_size(element-margin) * 0.5) 0 0 0; - text-align: center; - width: 100%; - - > * { - width: 100%; - } - - &:first-child { - padding-top: 0; - } - - input[type="submit"], - input[type="reset"], - input[type="button"], - button, - .button { - width: 100%; - - &.icon { - &:before { - margin-left: -0.5em; - } - } - } - } - } - } - } \ No newline at end of file diff --git a/assets/sass/components/_box.scss b/assets/sass/components/_box.scss deleted file mode 100644 index ec5ab0d..0000000 --- a/assets/sass/components/_box.scss +++ /dev/null @@ -1,26 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Box */ - - .box { - border-radius: _size(border-radius); - border: solid _size(border-width) _palette(border); - margin-bottom: _size(element-margin); - padding: 1.5em; - - > :last-child, - > :last-child > :last-child, - > :last-child > :last-child > :last-child { - margin-bottom: 0; - } - - &.alt { - border: 0; - border-radius: 0; - padding: 0; - } - } \ No newline at end of file diff --git a/assets/sass/components/_button.scss b/assets/sass/components/_button.scss deleted file mode 100644 index 61fe069..0000000 --- a/assets/sass/components/_button.scss +++ /dev/null @@ -1,84 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Button */ - - input[type="submit"], - input[type="reset"], - input[type="button"], - button, - .button { - @include vendor('appearance', 'none'); - @include vendor('transition', 'background-color #{_duration(transition)} ease-in-out, color #{_duration(transition)} ease-in-out'); - background-color: transparent; - border-radius: _size(border-radius); - border: 0; - box-shadow: inset 0 0 0 _size(border-width) _palette(border); - color: _palette(fg-bold) !important; - cursor: pointer; - display: inline-block; - font-size: 0.8rem; - font-weight: _font(weight); - height: _size(element-height); - letter-spacing: _font(letter-spacing); - line-height: _size(element-height); - outline: 0; - padding: 0 1.25rem 0 (1.25rem + (_font(letter-spacing) * 0.5)); - text-align: center; - text-decoration: none; - text-transform: uppercase; - white-space: nowrap; - - &:hover { - background-color: _palette(border-bg); - } - - &:active { - background-color: _palette(border-bg-alt); - } - - &.icon { - &:before { - margin-right: 0.5em; - } - } - - &.fit { - width: 100%; - } - - &.small { - font-size: 0.6rem; - height: (_size(element-height) * 0.75); - line-height: (_size(element-height) * 0.75); - } - - &.primary { - background-color: _palette(fg-bold); - color: _palette(bg) !important; - font-weight: _font(weight-bold); - - &:hover { - } - - &:active { - } - } - - &.disabled, - &:disabled { - @include vendor('pointer-events', 'none'); - cursor: default; - opacity: 0.25; - } - } - - input[type="submit"], - input[type="reset"], - input[type="button"], - button { - line-height: calc(#{_size(element-height)} - 2px); - } \ No newline at end of file diff --git a/assets/sass/components/_form.scss b/assets/sass/components/_form.scss deleted file mode 100644 index fdae12e..0000000 --- a/assets/sass/components/_form.scss +++ /dev/null @@ -1,252 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Form */ - - form { - margin: 0 0 _size(element-margin) 0; - - > :last-child { - margin-bottom: 0; - } - - > .fields { - $gutter: (_size(element-margin) * 0.75); - - @include vendor('display', 'flex'); - @include vendor('flex-wrap', 'wrap'); - width: calc(100% + #{$gutter * 2}); - margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); - - > .field { - @include vendor('flex-grow', '0'); - @include vendor('flex-shrink', '0'); - padding: $gutter 0 0 $gutter; - width: calc(100% - #{$gutter * 1}); - - &.half { - width: calc(50% - #{$gutter * 0.5}); - } - - &.third { - width: calc(#{100% / 3} - #{$gutter * (1 / 3)}); - } - - &.quarter { - width: calc(25% - #{$gutter * 0.25}); - } - } - } - - @include breakpoint('<=xsmall') { - > .fields { - $gutter: (_size(element-margin) * 0.75); - - width: calc(100% + #{$gutter * 2}); - margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); - - > .field { - padding: $gutter 0 0 $gutter; - width: calc(100% - #{$gutter * 1}); - - &.half { - width: calc(100% - #{$gutter * 1}); - } - - &.third { - width: calc(100% - #{$gutter * 1}); - } - - &.quarter { - width: calc(100% - #{$gutter * 1}); - } - } - } - } - } - - label { - color: _palette(fg-bold); - display: block; - font-size: 0.8rem; - font-weight: _font(weight); - letter-spacing: _font(letter-spacing); - line-height: 1.5; - margin: 0 0 (_size(element-margin) * 0.5) 0; - text-transform: uppercase; - } - - input[type="text"], - input[type="password"], - input[type="email"], - input[type="tel"], - select, - textarea { - @include vendor('appearance', 'none'); - @include vendor('transition', ( - 'border-color #{_duration(transition)} ease-in-out', - 'box-shadow #{_duration(transition)} ease-in-out', - 'background-color #{_duration(transition)} ease-in-out' - )); - background-color: transparent; - border-radius: _size(border-radius); - border: solid _size(border-width) _palette(border); - color: inherit; - display: block; - outline: 0; - padding: 0 1rem; - text-decoration: none; - width: 100%; - - &:invalid { - box-shadow: none; - } - - &:focus { - background: _palette(border-bg); - border-color: _palette(fg-bold); - box-shadow: 0 0 0 _size(border-width) _palette(fg-bold); - } - } - - select { - background-image: svg-url(""); - background-size: 1.25rem; - background-repeat: no-repeat; - background-position: calc(100% - 1rem) center; - height: _size(element-height); - padding-right: _size(element-height); - text-overflow: ellipsis; - - option { - color: _palette(fg); - background: _palette(bg); - } - - &:focus { - &::-ms-value { - background-color: transparent; - } - } - - &::-ms-expand { - display: none; - } - } - - input[type="text"], - input[type="password"], - input[type="email"], - select { - height: _size(element-height); - } - - textarea { - padding: 0.75rem 1rem; - } - - input[type="checkbox"], - input[type="radio"], { - @include vendor('appearance', 'none'); - display: block; - float: left; - margin-right: -2rem; - opacity: 0; - width: 1rem; - z-index: -1; - - & + label { - @include icon(false, solid); - @include vendor('user-select', 'none'); - color: _palette(fg); - cursor: pointer; - display: inline-block; - font-size: 0.8rem; - font-weight: _font(weight); - margin: 0 0 (_size(element-margin) * 0.25) 0; - padding-left: (_size(element-height) * 0.6) + 1rem; - padding-right: 0.75rem; - position: relative; - - &:before { - @include vendor('transition', ( - 'border-color #{_duration(transition)} ease-in-out', - 'box-shadow #{_duration(transition)} ease-in-out', - 'background-color #{_duration(transition)} ease-in-out' - )); - border-radius: _size(border-radius); - border: solid _size(border-width) _palette(border); - content: ''; - display: inline-block; - height: (_size(element-height) * 0.6); - left: 0; - line-height: (_size(element-height) * 0.6); - //line-height: calc(#{_size(element-height) * 0.6} + 0em); - position: absolute; - text-align: center; - top: -0.15rem; - width: (_size(element-height) * 0.6); - } - } - - &:checked + label { - &:before { - background: _palette(fg-bold) !important; - border-color: _palette(fg-bold) !important; - color: _palette(bg); - content: '\f00c'; - } - } - - &:focus + label { - &:before { - background: _palette(border-bg); - border-color: _palette(fg-bold); - box-shadow: 0 0 0 _size(border-width) _palette(fg-bold); - } - } - } - - input[type="checkbox"] { - & + label { - &:before { - border-radius: _size(border-radius); - } - } - } - - input[type="radio"] { - & + label { - &:before { - border-radius: 100%; - } - } - } - - ::-webkit-input-placeholder { - color: _palette(fg-light) !important; - opacity: 1.0; - } - - :-moz-placeholder { - color: _palette(fg-light) !important; - opacity: 1.0; - } - - ::-moz-placeholder { - color: _palette(fg-light) !important; - opacity: 1.0; - } - - :-ms-input-placeholder { - color: _palette(fg-light) !important; - opacity: 1.0; - } - - .formerize-placeholder { - color: _palette(fg-light) !important; - opacity: 1.0; - } \ No newline at end of file diff --git a/assets/sass/components/_icon.scss b/assets/sass/components/_icon.scss deleted file mode 100644 index 4726114..0000000 --- a/assets/sass/components/_icon.scss +++ /dev/null @@ -1,33 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Icon */ - - .icon { - @include icon; - border-bottom: none; - position: relative; - - > .label { - display: none; - } - - &:before { - line-height: inherit; - } - - &.solid { - &:before { - font-weight: 900; - } - } - - &.brands { - &:before { - font-family: 'Font Awesome 5 Brands'; - } - } - } \ No newline at end of file diff --git a/assets/sass/components/_icons.scss b/assets/sass/components/_icons.scss deleted file mode 100644 index f096a32..0000000 --- a/assets/sass/components/_icons.scss +++ /dev/null @@ -1,40 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Icons */ - - ul.icons { - cursor: default; - list-style: none; - padding-left: 0; - - li { - display: inline-block; - padding: 0 0.75em 0 0; - - &:last-child { - padding-right: 0; - } - - a { - border-radius: 100%; - box-shadow: inset 0 0 0 _size(border-width) _palette(border); - display: inline-block; - height: 2.25rem; - line-height: 2.25rem; - text-align: center; - width: 2.25rem; - - &:hover { - background-color: _palette(border-bg); - } - - &:active { - background-color: _palette(border-bg-alt); - } - } - } - } \ No newline at end of file diff --git a/assets/sass/components/_image.scss b/assets/sass/components/_image.scss deleted file mode 100644 index ed94ed7..0000000 --- a/assets/sass/components/_image.scss +++ /dev/null @@ -1,87 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Image */ - - .image { - border-radius: _size(border-radius); - border: 0; - display: inline-block; - position: relative; - - &:before { - @include vendor('pointer-events', 'none'); - background-image: url('../../images/overlay.png'); - background-color: _palette(bg-overlay); - border-radius: _size(border-radius); - content: ''; - display: block; - height: 100%; - left: 0; - opacity: 0.5; - position: absolute; - top: 0; - width: 100%; - } - - img { - border-radius: _size(border-radius); - display: block; - } - - &.left, - &.right { - max-width: 40%; - - img { - width: 100%; - } - } - - &.left { - float: left; - padding: 0 1.5em 1em 0; - top: 0.25em; - } - - &.right { - float: right; - padding: 0 0 1em 1.5em; - top: 0.25em; - } - - &.fit { - display: block; - margin: 0 0 _size(element-margin) 0; - width: 100%; - - img { - width: 100%; - } - } - - &.main { - display: block; - margin: (_size(element-margin) * 1.25) 0; - width: 100%; - - img { - width: 100%; - } - } - - @include breakpoint('<=small') { - &.main { - margin: (_size(element-margin) * 1) 0; - } - } - - @include breakpoint('<=xsmall') { - &.main { - margin: (_size(element-margin) * 0.75) 0; - } - } - } \ No newline at end of file diff --git a/assets/sass/components/_list.scss b/assets/sass/components/_list.scss deleted file mode 100644 index 1b384c2..0000000 --- a/assets/sass/components/_list.scss +++ /dev/null @@ -1,56 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* List */ - - ol { - list-style: decimal; - margin: 0 0 _size(element-margin) 0; - padding-left: 1.25em; - - li { - padding-left: 0.25em; - } - } - - ul { - list-style: disc; - margin: 0 0 _size(element-margin) 0; - padding-left: 1em; - - li { - padding-left: 0.5em; - } - - &.alt { - list-style: none; - padding-left: 0; - - li { - border-top: solid _size(border-width) _palette(border); - padding: 0.5em 0; - - &:first-child { - border-top: 0; - padding-top: 0; - } - } - } - } - - dl { - margin: 0 0 _size(element-margin) 0; - - dt { - display: block; - font-weight: _font(weight-bold); - margin: 0 0 (_size(element-margin) * 0.5) 0; - } - - dd { - margin-left: _size(element-margin); - } - } \ No newline at end of file diff --git a/assets/sass/components/_table.scss b/assets/sass/components/_table.scss deleted file mode 100644 index 0c51148..0000000 --- a/assets/sass/components/_table.scss +++ /dev/null @@ -1,81 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Table */ - - .table-wrapper { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - } - - table { - margin: 0 0 _size(element-margin) 0; - width: 100%; - - tbody { - tr { - border: solid _size(border-width) _palette(border); - border-left: 0; - border-right: 0; - - &:nth-child(2n + 1) { - background-color: _palette(border-bg); - } - } - } - - td { - padding: 0.75em 0.75em; - } - - th { - color: _palette(fg-bold); - font-size: 0.9em; - font-weight: _font(weight-bold); - padding: 0 0.75em 0.75em 0.75em; - text-align: left; - } - - thead { - border-bottom: solid (_size(border-width) * 2) _palette(border); - } - - tfoot { - border-top: solid (_size(border-width) * 2) _palette(border); - } - - &.alt { - border-collapse: separate; - - tbody { - tr { - td { - border: solid _size(border-width) _palette(border); - border-left-width: 0; - border-top-width: 0; - - &:first-child { - border-left-width: _size(border-width); - } - } - - &:first-child { - td { - border-top-width: _size(border-width); - } - } - } - } - - thead { - border-bottom: 0; - } - - tfoot { - border-top: 0; - } - } - } \ No newline at end of file diff --git a/assets/sass/layout/_bg.scss b/assets/sass/layout/_bg.scss deleted file mode 100644 index ab1b8b6..0000000 --- a/assets/sass/layout/_bg.scss +++ /dev/null @@ -1,68 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* BG */ - - #bg { - @include vendor('transform', 'scale(1.0)'); - -webkit-backface-visibility: hidden; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100vh; - z-index: 1; - - &:before, &:after { - content: ''; - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } - - &:before { - @include vendor('transition', 'background-color #{_duration(bg)} ease-in-out'); - @include vendor('transition-delay', '#{_duration(intro)}'); - background-image: linear-gradient(to top, #{_palette(bg-overlay)}, #{_palette(bg-overlay)}), - url('../../images/overlay.png'); - background-size: auto, - 256px 256px; - background-position: center, - center; - background-repeat: no-repeat, - repeat; - z-index: 2; - } - - &:after { - @include vendor('transform', 'scale(1.125)'); - @include vendor('transition', ( - 'transform #{_duration(article)} ease-in-out', - 'filter #{_duration(article)} ease-in-out' - )); - background-image: url('../../images/bg.jpg'); - background-position: center; - background-size: cover; - background-repeat: no-repeat; - z-index: 1; - } - - body.is-article-visible & { - &:after { - @include vendor('transform', 'scale(1.0825)'); - @include vendor('filter', 'blur(0.2rem)'); - } - } - - body.is-preload & { - &:before { - background-color: _palette(bg-alt); - } - } - } \ No newline at end of file diff --git a/assets/sass/layout/_footer.scss b/assets/sass/layout/_footer.scss deleted file mode 100644 index b87cc7a..0000000 --- a/assets/sass/layout/_footer.scss +++ /dev/null @@ -1,37 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Footer */ - - #footer { - @include vendor('transition', ( - 'transform #{_duration(article)} ease-in-out', - 'filter #{_duration(article)} ease-in-out', - 'opacity #{_duration(article)} ease-in-out', - )); - width: 100%; - max-width: 100%; - margin-top: 2rem; - text-align: center; - - .copyright { - letter-spacing: _font(letter-spacing); - font-size: 0.6rem; - opacity: 0.75; - margin-bottom: 0; - text-transform: uppercase; - } - - body.is-article-visible & { - @include vendor('transform', 'scale(0.95)'); - @include vendor('filter', 'blur(0.1rem)'); - opacity: 0; - } - - body.is-preload & { - opacity: 0; - } - } \ No newline at end of file diff --git a/assets/sass/layout/_header.scss b/assets/sass/layout/_header.scss deleted file mode 100644 index 52b3ce5..0000000 --- a/assets/sass/layout/_header.scss +++ /dev/null @@ -1,261 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Header */ - - #header { - @include vendor('display', 'flex'); - @include vendor('flex-direction', 'column'); - @include vendor('align-items', 'center'); - @include vendor('transition', ( - 'transform #{_duration(article)} ease-in-out', - 'filter #{_duration(article)} ease-in-out', - 'opacity #{_duration(article)} ease-in-out', - )); - background-image: -moz-radial-gradient(rgba(0,0,0,0.25) 25%, rgba(0,0,0,0) 55%); - background-image: -webkit-radial-gradient(rgba(0,0,0,0.25) 25%, rgba(0,0,0,0) 55%); - background-image: -ms-radial-gradient(rgba(0,0,0,0.25) 25%, rgba(0,0,0,0) 55%); - background-image: radial-gradient(rgba(0,0,0,0.25) 25%, rgba(0,0,0,0) 55%); - max-width: 100%; - text-align: center; - - > * { - @include vendor('transition', 'opacity #{_duration(article)} ease-in-out'); - position: relative; - margin-top: 3.5rem; - - &:before { - content: ''; - display: block; - position: absolute; - top: calc(-3.5rem - 1px); - left: calc(50% - #{_size(border-width) * 1}); - width: _size(border-width); - height: calc(3.5rem + 1px); - background: _palette(border); - } - } - - > :first-child { - margin-top: 0; - - &:before { - display: none; - } - } - - .logo { - width: 5.5rem; - height: 5.5rem; - line-height: 5.5rem; - border: solid _size(border-width) _palette(border); - border-radius: 100%; - - .icon { - &:before { - font-size: 2rem; - } - } - } - - .content { - border-style: solid; - border-color: _palette(border); - border-top-width: _size(border-width); - border-bottom-width: _size(border-width); - max-width: 100%; - - .inner { - @include vendor('transition', ( - 'max-height #{_duration(intro)} ease', - 'padding #{_duration(intro)} ease', - 'opacity #{_duration(article)} ease-in-out' - )); - @include vendor('transition-delay', '0.25s'); - padding: 3rem 2rem; - max-height: 40rem; - overflow: hidden; - - > :last-child { - margin-bottom: 0; - } - } - - p { - text-transform: uppercase; - letter-spacing: _font(letter-spacing); - font-size: 0.8rem; - line-height: 2; - } - } - - nav { - ul { - @include vendor('display', 'flex'); - margin-bottom: 0; - list-style: none; - padding-left: 0; - border: solid _size(border-width) _palette(border); - border-radius: _size(border-radius); - - li { - padding-left: 0; - border-left: solid _size(border-width) _palette(border); - - &:first-child { - border-left: 0; - } - - a { - display: block; - min-width: 7.5rem; - height: 2.75rem; - line-height: 2.75rem; - padding: 0 1.25rem 0 (1.25rem + _font(letter-spacing)); - text-transform: uppercase; - letter-spacing: _font(letter-spacing); - font-size: 0.8rem; - border-bottom: 0; - - &:hover { - background-color: _palette(border-bg); - } - - &:active { - background-color: _palette(border-bg-alt); - } - } - } - } - - &.use-middle { - &:after { - content: ''; - display: block; - position: absolute; - top: 0; - left: calc(50% - #{_size(border-width) * 1}); - width: _size(border-width); - height: 100%; - background: _palette(border); - } - - ul { - li { - &.is-middle { - border-left: 0; - } - } - } - } - } - - body.is-article-visible & { - @include vendor('transform', 'scale(0.95)'); - @include vendor('filter', 'blur(0.1rem)'); - opacity: 0; - } - - body.is-preload & { - > * { - opacity: 0; - } - - @include vendor('filter', 'blur(0.125rem)'); - - .content { - .inner { - max-height: 0; - padding-top: 0; - padding-bottom: 0; - opacity: 0; - } - } - } - - @include breakpoint('<=medium') { - .content { - p { - br { - display: none; - } - } - } - } - - @include breakpoint('<=small') { - > * { - margin-top: 2rem; - - &:before { - top: calc(-2rem - 1px); - height: calc(2rem + 1px); - } - } - - .logo { - width: 4.75rem; - height: 4.75rem; - line-height: 4.75rem; - - .icon { - &:before { - font-size: 1.75rem; - } - } - } - - .content { - .inner { - padding: 2.5rem 1rem; - } - - p { - line-height: 1.875; - } - } - } - - @include breakpoint('<=xsmall') { - padding: 1.5rem 0; - - .content { - .inner { - padding: 2.5rem 0; - } - } - - nav { - ul { - @include vendor('flex-direction', 'column'); - min-width: 10rem; - max-width: 100%; - - li { - border-left: 0; - border-top: solid _size(border-width) _palette(border); - - &:first-child { - border-top: 0; - } - - a { - height: 3rem; - line-height: 3rem; - min-width: 0; - width: 100%; - } - } - } - - &.use-middle { - &:after { - display: none; - } - } - } - } - } \ No newline at end of file diff --git a/assets/sass/layout/_main.scss b/assets/sass/layout/_main.scss deleted file mode 100644 index 0588446..0000000 --- a/assets/sass/layout/_main.scss +++ /dev/null @@ -1,102 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Main */ - - #main { - @include vendor('flex-grow', '1'); - @include vendor('flex-shrink', '1'); - @include vendor('display', 'flex'); - @include vendor('align-items', 'center'); - @include vendor('justify-content', 'center'); - @include vendor('flex-direction', 'column'); - position: relative; - max-width: 100%; - z-index: 3; - - article { - @include vendor('transform', 'translateY(0.25rem)'); - @include vendor('transition', ( - 'opacity #{_duration(article)} ease-in-out', - 'transform #{_duration(article)} ease-in-out' - )); - @include padding(2.5rem, 2.5rem, (2rem, 0, 1rem, 0)); - position: relative; - width: 40rem; - max-width: 100%; - background-color: transparentize(_palette(bg), 0.15); - border-radius: _size(border-radius); - opacity: 0; - - &.active { - @include vendor('transform', 'translateY(0)'); - opacity: 1; - } - - .close { - display: block; - position: absolute; - top: 0; - right: 0; - width: 4rem; - height: 4rem; - cursor: pointer; - text-indent: 4rem; - overflow: hidden; - white-space: nowrap; - - &:before { - @include vendor('transition', 'background-color #{_duration(transition)} ease-in-out'); - content: ''; - display: block; - position: absolute; - top: 0.75rem; - left: 0.75rem; - width: 2.5rem; - height: 2.5rem; - border-radius: 100%; - background-position: center; - background-image: svg-url(''); - background-size: 20px 20px; - background-repeat: no-repeat; - } - - &:hover { - &:before { - background-color: _palette(border-bg); - } - } - - &:active { - &:before { - background-color: _palette(border-bg-alt); - } - } - } - } - - @include breakpoint('<=small') { - article { - @include padding(2rem, 2rem, (1.5rem, 0, 0.5rem, 0)); - - .close { - &:before { - top: 0.875rem; - left: 0.875rem; - width: 2.25rem; - height: 2.25rem; - background-size: 14px 14px; - } - } - } - } - - @include breakpoint('<=xsmall') { - article { - @include padding(2rem, 1.5rem, (1rem, 0, 0.5rem, 0)); - } - } - } \ No newline at end of file diff --git a/assets/sass/layout/_wrapper.scss b/assets/sass/layout/_wrapper.scss deleted file mode 100644 index 9a8c9ca..0000000 --- a/assets/sass/layout/_wrapper.scss +++ /dev/null @@ -1,36 +0,0 @@ -/// -/// Dimension by HTML5 UP -/// html5up.net | @ajlkn -/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -/// - -/* Wrapper */ - - #wrapper { - @include vendor('display', 'flex'); - @include vendor('flex-direction', 'column'); - @include vendor('align-items', 'center'); - @include vendor('justify-content', 'space-between'); - position: relative; - min-height: 100vh; - width: 100%; - padding: 4rem 2rem; - z-index: 3; - - &:before { - content: ''; - display: block; - } - - @include breakpoint('<=xlarge') { - padding: 3rem 2rem; - } - - @include breakpoint('<=small') { - padding: 2rem 1rem; - } - - @include breakpoint('<=xsmall') { - padding: 1rem; - } - } \ No newline at end of file diff --git a/assets/sass/libs/_breakpoints.scss b/assets/sass/libs/_breakpoints.scss deleted file mode 100644 index c5301d8..0000000 --- a/assets/sass/libs/_breakpoints.scss +++ /dev/null @@ -1,223 +0,0 @@ -// breakpoints.scss v1.0 | @ajlkn | MIT licensed */ - -// Vars. - - /// Breakpoints. - /// @var {list} - $breakpoints: () !global; - -// Mixins. - - /// Sets breakpoints. - /// @param {map} $x Breakpoints. - @mixin breakpoints($x: ()) { - $breakpoints: $x !global; - } - - /// Wraps @content in a @media block targeting a specific orientation. - /// @param {string} $orientation Orientation. - @mixin orientation($orientation) { - @media screen and (orientation: #{$orientation}) { - @content; - } - } - - /// Wraps @content in a @media block using a given query. - /// @param {string} $query Query. - @mixin breakpoint($query: null) { - - $breakpoint: null; - $op: null; - $media: null; - - // Determine operator, breakpoint. - - // Greater than or equal. - @if (str-slice($query, 0, 2) == '>=') { - - $op: 'gte'; - $breakpoint: str-slice($query, 3); - - } - - // Less than or equal. - @elseif (str-slice($query, 0, 2) == '<=') { - - $op: 'lte'; - $breakpoint: str-slice($query, 3); - - } - - // Greater than. - @elseif (str-slice($query, 0, 1) == '>') { - - $op: 'gt'; - $breakpoint: str-slice($query, 2); - - } - - // Less than. - @elseif (str-slice($query, 0, 1) == '<') { - - $op: 'lt'; - $breakpoint: str-slice($query, 2); - - } - - // Not. - @elseif (str-slice($query, 0, 1) == '!') { - - $op: 'not'; - $breakpoint: str-slice($query, 2); - - } - - // Equal. - @else { - - $op: 'eq'; - $breakpoint: $query; - - } - - // Build media. - @if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { - - $a: map-get($breakpoints, $breakpoint); - - // Range. - @if (type-of($a) == 'list') { - - $x: nth($a, 1); - $y: nth($a, 2); - - // Max only. - @if ($x == null) { - - // Greater than or equal (>= 0 / anything) - @if ($op == 'gte') { - $media: 'screen'; - } - - // Less than or equal (<= y) - @elseif ($op == 'lte') { - $media: 'screen and (max-width: ' + $y + ')'; - } - - // Greater than (> y) - @elseif ($op == 'gt') { - $media: 'screen and (min-width: ' + ($y + 1) + ')'; - } - - // Less than (< 0 / invalid) - @elseif ($op == 'lt') { - $media: 'screen and (max-width: -1px)'; - } - - // Not (> y) - @elseif ($op == 'not') { - $media: 'screen and (min-width: ' + ($y + 1) + ')'; - } - - // Equal (<= y) - @else { - $media: 'screen and (max-width: ' + $y + ')'; - } - - } - - // Min only. - @else if ($y == null) { - - // Greater than or equal (>= x) - @if ($op == 'gte') { - $media: 'screen and (min-width: ' + $x + ')'; - } - - // Less than or equal (<= inf / anything) - @elseif ($op == 'lte') { - $media: 'screen'; - } - - // Greater than (> inf / invalid) - @elseif ($op == 'gt') { - $media: 'screen and (max-width: -1px)'; - } - - // Less than (< x) - @elseif ($op == 'lt') { - $media: 'screen and (max-width: ' + ($x - 1) + ')'; - } - - // Not (< x) - @elseif ($op == 'not') { - $media: 'screen and (max-width: ' + ($x - 1) + ')'; - } - - // Equal (>= x) - @else { - $media: 'screen and (min-width: ' + $x + ')'; - } - - } - - // Min and max. - @else { - - // Greater than or equal (>= x) - @if ($op == 'gte') { - $media: 'screen and (min-width: ' + $x + ')'; - } - - // Less than or equal (<= y) - @elseif ($op == 'lte') { - $media: 'screen and (max-width: ' + $y + ')'; - } - - // Greater than (> y) - @elseif ($op == 'gt') { - $media: 'screen and (min-width: ' + ($y + 1) + ')'; - } - - // Less than (< x) - @elseif ($op == 'lt') { - $media: 'screen and (max-width: ' + ($x - 1) + ')'; - } - - // Not (< x and > y) - @elseif ($op == 'not') { - $media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')'; - } - - // Equal (>= x and <= y) - @else { - $media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')'; - } - - } - - } - - // String. - @else { - - // Missing a media type? Prefix with "screen". - @if (str-slice($a, 0, 1) == '(') { - $media: 'screen and ' + $a; - } - - // Otherwise, use as-is. - @else { - $media: $a; - } - - } - - } - - // Output. - @media #{$media} { - @content; - } - - } \ No newline at end of file diff --git a/assets/sass/libs/_functions.scss b/assets/sass/libs/_functions.scss deleted file mode 100644 index f563aab..0000000 --- a/assets/sass/libs/_functions.scss +++ /dev/null @@ -1,90 +0,0 @@ -/// Removes a specific item from a list. -/// @author Hugo Giraudel -/// @param {list} $list List. -/// @param {integer} $index Index. -/// @return {list} Updated list. -@function remove-nth($list, $index) { - - $result: null; - - @if type-of($index) != number { - @warn "$index: #{quote($index)} is not a number for `remove-nth`."; - } - @else if $index == 0 { - @warn "List index 0 must be a non-zero integer for `remove-nth`."; - } - @else if abs($index) > length($list) { - @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; - } - @else { - - $result: (); - $index: if($index < 0, length($list) + $index + 1, $index); - - @for $i from 1 through length($list) { - - @if $i != $index { - $result: append($result, nth($list, $i)); - } - - } - - } - - @return $result; - -} - -/// Gets a value from a map. -/// @author Hugo Giraudel -/// @param {map} $map Map. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function val($map, $keys...) { - - @if nth($keys, 1) == null { - $keys: remove-nth($keys, 1); - } - - @each $key in $keys { - $map: map-get($map, $key); - } - - @return $map; - -} - -/// Gets a duration value. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function _duration($keys...) { - @return val($duration, $keys...); -} - -/// Gets a font value. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function _font($keys...) { - @return val($font, $keys...); -} - -/// Gets a misc value. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function _misc($keys...) { - @return val($misc, $keys...); -} - -/// Gets a palette value. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function _palette($keys...) { - @return val($palette, $keys...); -} - -/// Gets a size value. -/// @param {string} $keys Key(s). -/// @return {string} Value. -@function _size($keys...) { - @return val($size, $keys...); -} \ No newline at end of file diff --git a/assets/sass/libs/_mixins.scss b/assets/sass/libs/_mixins.scss deleted file mode 100644 index a331483..0000000 --- a/assets/sass/libs/_mixins.scss +++ /dev/null @@ -1,78 +0,0 @@ -/// Makes an element's :before pseudoelement a FontAwesome icon. -/// @param {string} $content Optional content value to use. -/// @param {string} $category Optional category to use. -/// @param {string} $where Optional pseudoelement to target (before or after). -@mixin icon($content: false, $category: regular, $where: before) { - - text-decoration: none; - - &:#{$where} { - - @if $content { - content: $content; - } - - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - text-transform: none !important; - - @if ($category == brands) { - font-family: 'Font Awesome 5 Brands'; - } - @elseif ($category == solid) { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; - } - @else { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; - } - - } - -} - -/// Applies padding to an element, taking the current element-margin value into account. -/// @param {mixed} $tb Top/bottom padding. -/// @param {mixed} $lr Left/right padding. -/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) -/// @param {bool} $important If true, adds !important. -@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { - - @if $important { - $important: '!important'; - } - - $x: 0.1em; - - @if unit(_size(element-margin)) == 'rem' { - $x: 0.1rem; - } - - padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; - -} - -/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). -/// @param {string} $svg SVG data URL. -/// @return {string} Encoded SVG data URL. -@function svg-url($svg) { - - $svg: str-replace($svg, '"', '\''); - $svg: str-replace($svg, '%', '%25'); - $svg: str-replace($svg, '<', '%3C'); - $svg: str-replace($svg, '>', '%3E'); - $svg: str-replace($svg, '&', '%26'); - $svg: str-replace($svg, '#', '%23'); - $svg: str-replace($svg, '{', '%7B'); - $svg: str-replace($svg, '}', '%7D'); - $svg: str-replace($svg, ';', '%3B'); - - @return url("data:image/svg+xml;charset=utf8,#{$svg}"); - -} \ No newline at end of file diff --git a/assets/sass/libs/_vars.scss b/assets/sass/libs/_vars.scss deleted file mode 100644 index 3be728c..0000000 --- a/assets/sass/libs/_vars.scss +++ /dev/null @@ -1,43 +0,0 @@ -// Misc. - $misc: ( - z-index-base: 10000 - ); - -// Duration. - $duration: ( - transition: 0.2s, - bg: 2.5s, - intro: 0.75s, - article: 0.325s - ); - -// Size. - $size: ( - border-radius: 4px, - border-width: 1px, - element-height: 2.75rem, - element-margin: 2rem - ); - -// Font. - $font: ( - family: ('Source Sans Pro', sans-serif), - family-fixed: ('Courier New', monospace), - weight: 300, - weight-bold: 600, - letter-spacing: 0.2rem, - letter-spacing-heading: 0.5rem - ); - -// Palette. - $palette: ( - bg: #1b1f22, - bg-alt: #000000, - bg-overlay: rgba(19,21,25,0.5), - fg: #ffffff, - fg-bold: #ffffff, - fg-light: rgba(255,255,255,0.5), - border: #ffffff, - border-bg: rgba(255,255,255,0.075), - border-bg-alt: rgba(255,255,255,0.175) - ); \ No newline at end of file diff --git a/assets/sass/libs/_vendor.scss b/assets/sass/libs/_vendor.scss deleted file mode 100644 index 6599a3f..0000000 --- a/assets/sass/libs/_vendor.scss +++ /dev/null @@ -1,376 +0,0 @@ -// vendor.scss v1.0 | @ajlkn | MIT licensed */ - -// Vars. - - /// Vendor prefixes. - /// @var {list} - $vendor-prefixes: ( - '-moz-', - '-webkit-', - '-ms-', - '' - ); - - /// Properties that should be vendorized. - /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org - /// @var {list} - $vendor-properties: ( - - // Animation. - 'animation', - 'animation-delay', - 'animation-direction', - 'animation-duration', - 'animation-fill-mode', - 'animation-iteration-count', - 'animation-name', - 'animation-play-state', - 'animation-timing-function', - - // Appearance. - 'appearance', - - // Backdrop filter. - 'backdrop-filter', - - // Background image options. - 'background-clip', - 'background-origin', - 'background-size', - - // Box sizing. - 'box-sizing', - - // Clip path. - 'clip-path', - - // Filter effects. - 'filter', - - // Flexbox. - 'align-content', - 'align-items', - 'align-self', - 'flex', - 'flex-basis', - 'flex-direction', - 'flex-flow', - 'flex-grow', - 'flex-shrink', - 'flex-wrap', - 'justify-content', - 'order', - - // Font feature. - 'font-feature-settings', - 'font-language-override', - 'font-variant-ligatures', - - // Font kerning. - 'font-kerning', - - // Fragmented borders and backgrounds. - 'box-decoration-break', - - // Grid layout. - 'grid-column', - 'grid-column-align', - 'grid-column-end', - 'grid-column-start', - 'grid-row', - 'grid-row-align', - 'grid-row-end', - 'grid-row-start', - 'grid-template-columns', - 'grid-template-rows', - - // Hyphens. - 'hyphens', - 'word-break', - - // Masks. - 'mask', - 'mask-border', - 'mask-border-outset', - 'mask-border-repeat', - 'mask-border-slice', - 'mask-border-source', - 'mask-border-width', - 'mask-clip', - 'mask-composite', - 'mask-image', - 'mask-origin', - 'mask-position', - 'mask-repeat', - 'mask-size', - - // Multicolumn. - 'break-after', - 'break-before', - 'break-inside', - 'column-count', - 'column-fill', - 'column-gap', - 'column-rule', - 'column-rule-color', - 'column-rule-style', - 'column-rule-width', - 'column-span', - 'column-width', - 'columns', - - // Object fit. - 'object-fit', - 'object-position', - - // Regions. - 'flow-from', - 'flow-into', - 'region-fragment', - - // Scroll snap points. - 'scroll-snap-coordinate', - 'scroll-snap-destination', - 'scroll-snap-points-x', - 'scroll-snap-points-y', - 'scroll-snap-type', - - // Shapes. - 'shape-image-threshold', - 'shape-margin', - 'shape-outside', - - // Tab size. - 'tab-size', - - // Text align last. - 'text-align-last', - - // Text decoration. - 'text-decoration-color', - 'text-decoration-line', - 'text-decoration-skip', - 'text-decoration-style', - - // Text emphasis. - 'text-emphasis', - 'text-emphasis-color', - 'text-emphasis-position', - 'text-emphasis-style', - - // Text size adjust. - 'text-size-adjust', - - // Text spacing. - 'text-spacing', - - // Transform. - 'transform', - 'transform-origin', - - // Transform 3D. - 'backface-visibility', - 'perspective', - 'perspective-origin', - 'transform-style', - - // Transition. - 'transition', - 'transition-delay', - 'transition-duration', - 'transition-property', - 'transition-timing-function', - - // Unicode bidi. - 'unicode-bidi', - - // User select. - 'user-select', - - // Writing mode. - 'writing-mode', - - ); - - /// Values that should be vendorized. - /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org - /// @var {list} - $vendor-values: ( - - // Cross fade. - 'cross-fade', - - // Element function. - 'element', - - // Filter function. - 'filter', - - // Flexbox. - 'flex', - 'inline-flex', - - // Grab cursors. - 'grab', - 'grabbing', - - // Gradients. - 'linear-gradient', - 'repeating-linear-gradient', - 'radial-gradient', - 'repeating-radial-gradient', - - // Grid layout. - 'grid', - 'inline-grid', - - // Image set. - 'image-set', - - // Intrinsic width. - 'max-content', - 'min-content', - 'fit-content', - 'fill', - 'fill-available', - 'stretch', - - // Sticky position. - 'sticky', - - // Transform. - 'transform', - - // Zoom cursors. - 'zoom-in', - 'zoom-out', - - ); - -// Functions. - - /// Removes a specific item from a list. - /// @author Hugo Giraudel - /// @param {list} $list List. - /// @param {integer} $index Index. - /// @return {list} Updated list. - @function remove-nth($list, $index) { - - $result: null; - - @if type-of($index) != number { - @warn "$index: #{quote($index)} is not a number for `remove-nth`."; - } - @else if $index == 0 { - @warn "List index 0 must be a non-zero integer for `remove-nth`."; - } - @else if abs($index) > length($list) { - @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; - } - @else { - - $result: (); - $index: if($index < 0, length($list) + $index + 1, $index); - - @for $i from 1 through length($list) { - - @if $i != $index { - $result: append($result, nth($list, $i)); - } - - } - - } - - @return $result; - - } - - /// Replaces a substring within another string. - /// @author Hugo Giraudel - /// @param {string} $string String. - /// @param {string} $search Substring. - /// @param {string} $replace Replacement. - /// @return {string} Updated string. - @function str-replace($string, $search, $replace: '') { - - $index: str-index($string, $search); - - @if $index { - @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); - } - - @return $string; - - } - - /// Replaces a substring within each string in a list. - /// @param {list} $strings List of strings. - /// @param {string} $search Substring. - /// @param {string} $replace Replacement. - /// @return {list} Updated list of strings. - @function str-replace-all($strings, $search, $replace: '') { - - @each $string in $strings { - $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); - } - - @return $strings; - - } - -// Mixins. - - /// Wraps @content in vendorized keyframe blocks. - /// @param {string} $name Name. - @mixin keyframes($name) { - - @-moz-keyframes #{$name} { @content; } - @-webkit-keyframes #{$name} { @content; } - @-ms-keyframes #{$name} { @content; } - @keyframes #{$name} { @content; } - - } - - /// Vendorizes a declaration's property and/or value(s). - /// @param {string} $property Property. - /// @param {mixed} $value String/list of value(s). - @mixin vendor($property, $value) { - - // Determine if property should expand. - $expandProperty: index($vendor-properties, $property); - - // Determine if value should expand (and if so, add '-prefix-' placeholder). - $expandValue: false; - - @each $x in $value { - @each $y in $vendor-values { - @if $y == str-slice($x, 1, str-length($y)) { - - $value: set-nth($value, index($value, $x), '-prefix-' + $x); - $expandValue: true; - - } - } - } - - // Expand property? - @if $expandProperty { - @each $vendor in $vendor-prefixes { - #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; - } - } - - // Expand just the value? - @elseif $expandValue { - @each $vendor in $vendor-prefixes { - #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; - } - } - - // Neither? Treat them as a normal declaration. - @else { - #{$property}: #{$value}; - } - - } \ No newline at end of file diff --git a/assets/sass/main.scss b/assets/sass/main.scss deleted file mode 100644 index 2ab4be5..0000000 --- a/assets/sass/main.scss +++ /dev/null @@ -1,50 +0,0 @@ -@import 'libs/vars'; -@import 'libs/functions'; -@import 'libs/mixins'; -@import 'libs/vendor'; -@import 'libs/breakpoints'; -@import 'fontawesome-all.min.css'; -@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300italic,600italic,300,600'); - -/* - Dimension by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - -// Breakpoints. - - @include breakpoints(( - xlarge: ( 1281px, 1680px ), - large: ( 981px, 1280px ), - medium: ( 737px, 980px ), - small: ( 481px, 736px ), - xsmall: ( 361px, 480px ), - xxsmall: ( null, 360px ) - )); - -// Base. - - @import 'base/reset'; - @import 'base/page'; - @import 'base/typography'; - -// Component. - - @import 'components/form'; - @import 'components/box'; - @import 'components/icon'; - @import 'components/image'; - @import 'components/list'; - @import 'components/actions'; - @import 'components/icons'; - @import 'components/table'; - @import 'components/button'; - -// Layout. - - @import 'layout/bg'; - @import 'layout/wrapper'; - @import 'layout/header'; - @import 'layout/main'; - @import 'layout/footer'; \ No newline at end of file diff --git a/assets/sass/noscript.scss b/assets/sass/noscript.scss deleted file mode 100644 index b101db7..0000000 --- a/assets/sass/noscript.scss +++ /dev/null @@ -1,50 +0,0 @@ -@import 'libs/vars'; -@import 'libs/functions'; -@import 'libs/mixins'; -@import 'libs/vendor'; -@import 'libs/breakpoints'; - -/* - Dimension by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - -/* BG */ - - #bg { - body.is-preload & { - &:before { - background-color: transparent; - } - } - } - -/* Header */ - - #header { - body.is-preload & { - > * { - opacity: 1; - } - - @include vendor('filter', 'none'); - - .content { - .inner { - max-height: none; - padding: 3rem 2rem; - opacity: 1; - } - } - } - } - -/* Main */ - - #main { - article { - opacity: 1; - margin: (_size(element-margin) * 2) 0 0 0; - } - } \ No newline at end of file diff --git a/assets/webfonts/fa-brands-400.eot b/assets/webfonts/fa-brands-400.eot deleted file mode 100644 index cba6c6c..0000000 Binary files a/assets/webfonts/fa-brands-400.eot and /dev/null differ diff --git a/assets/webfonts/fa-brands-400.svg b/assets/webfonts/fa-brands-400.svg deleted file mode 100644 index b9881a4..0000000 --- a/assets/webfonts/fa-brands-400.svg +++ /dev/null @@ -1,3717 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/webfonts/fa-brands-400.ttf b/assets/webfonts/fa-brands-400.ttf deleted file mode 100644 index 8d75ded..0000000 Binary files a/assets/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/assets/webfonts/fa-brands-400.woff b/assets/webfonts/fa-brands-400.woff deleted file mode 100644 index 3375bef..0000000 Binary files a/assets/webfonts/fa-brands-400.woff and /dev/null differ diff --git a/assets/webfonts/fa-brands-400.woff2 b/assets/webfonts/fa-brands-400.woff2 deleted file mode 100644 index 402f81c..0000000 Binary files a/assets/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/assets/webfonts/fa-regular-400.eot b/assets/webfonts/fa-regular-400.eot deleted file mode 100644 index a4e5989..0000000 Binary files a/assets/webfonts/fa-regular-400.eot and /dev/null differ diff --git a/assets/webfonts/fa-regular-400.svg b/assets/webfonts/fa-regular-400.svg deleted file mode 100644 index 463af27..0000000 --- a/assets/webfonts/fa-regular-400.svg +++ /dev/null @@ -1,801 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/webfonts/fa-regular-400.ttf b/assets/webfonts/fa-regular-400.ttf deleted file mode 100644 index 7157aaf..0000000 Binary files a/assets/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/assets/webfonts/fa-regular-400.woff b/assets/webfonts/fa-regular-400.woff deleted file mode 100644 index ad077c6..0000000 Binary files a/assets/webfonts/fa-regular-400.woff and /dev/null differ diff --git a/assets/webfonts/fa-regular-400.woff2 b/assets/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 5632894..0000000 Binary files a/assets/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/assets/webfonts/fa-solid-900.eot b/assets/webfonts/fa-solid-900.eot deleted file mode 100644 index e994171..0000000 Binary files a/assets/webfonts/fa-solid-900.eot and /dev/null differ diff --git a/assets/webfonts/fa-solid-900.svg b/assets/webfonts/fa-solid-900.svg deleted file mode 100644 index 00296e9..0000000 --- a/assets/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,5034 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/webfonts/fa-solid-900.ttf b/assets/webfonts/fa-solid-900.ttf deleted file mode 100644 index 25abf38..0000000 Binary files a/assets/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/assets/webfonts/fa-solid-900.woff b/assets/webfonts/fa-solid-900.woff deleted file mode 100644 index 23ee663..0000000 Binary files a/assets/webfonts/fa-solid-900.woff and /dev/null differ diff --git a/assets/webfonts/fa-solid-900.woff2 b/assets/webfonts/fa-solid-900.woff2 deleted file mode 100644 index 2217164..0000000 Binary files a/assets/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..d40ceb6 --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,18 @@ +services: + web: + build: + context: . + dockerfile: Dockerfile.dev + # available in 5174 external port + ports: + - "5174:5173" + volumes: + - .:/app + - node_modules:/app/node_modules + environment: + - VITE_HOST=0.0.0.0 + command: npm run dev -- --host 0.0.0.0 + +volumes: + node_modules: + diff --git a/docker-compose-main.yml b/docker-compose-main.yml index 18e3d4c..c7ccf60 100644 --- a/docker-compose-main.yml +++ b/docker-compose-main.yml @@ -13,3 +13,4 @@ services: networks: traefik-realt: external: true + diff --git a/docker-compose-preprod.yml b/docker-compose-preprod.yml index 9f2259f..479cef3 100644 --- a/docker-compose-preprod.yml +++ b/docker-compose-preprod.yml @@ -12,4 +12,4 @@ services: networks: traefik-realt: - external: true + external: true \ No newline at end of file diff --git a/docs/00-design.md b/docs/00-design.md new file mode 100644 index 0000000..6fda669 --- /dev/null +++ b/docs/00-design.md @@ -0,0 +1,30 @@ +# Design + +## Color: + +| Color | Hex code | +|-------|----------| +| Navy blue | #091A3A | +| Charcoal | #242424 | +| White | #FFFFFF | +| Orange | #FF8C42 | + + +## Prompt image blog (Gemini): + +J’aimerais que tu me génères des images de blog avec les couleurs ci‑dessous, en fonction des thématiques et des articles que je vais te donner. + +- Si tu ajoutes du texte dans l’image, il doit être en anglais. +- Le fond de l’image devrait être uni avec cette couleurs: #0D2853 +- Peu de texte (ou pas de texte si pas nécessaire). +- L’image doit être simple et facilement compréhensible. +- L'image doit être visuelle et ne pas forcement montrer d'étapes, de textes ou d'éléments descriptifs. + +Les couleurs que tu dois utiliser sont : + +- Navy blue : #091A3A +- Charcoal : #242424 +- White : #FFFFFF +- Orange : #FF8C42 + +Voici l’article : [article] diff --git a/docs/01-blog.md b/docs/01-blog.md new file mode 100644 index 0000000..155d1c9 --- /dev/null +++ b/docs/01-blog.md @@ -0,0 +1,39 @@ +# Blog + +# Constraints + +image size: 1600×720px +location: +- articles/fr/object-article.md +- articles/en/object-article.md + +# Format example (Markdown + metadata) + +``` +--- +title: "The Scope of RealToken DAO" +date: "2024-03-01" +description: "Discover the scope of action, responsibilities and areas of intervention of the RealToken DAO" +tags: ["dao", "governance", "ecosystem"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-scope.jpg" +--- + +# Title 1 + +Text 1 + +## Title 2 + +Text 2 + +``` + +# Contribute + +To contribute, there are two options. If you're comfortable with GitHub, you can create a fork and submit your own article on a dedicated branch. Otherwise, send the article to the DAO's marketing committee. + + + + + diff --git a/docs/02-SEO.md b/docs/02-SEO.md new file mode 100644 index 0000000..339b668 --- /dev/null +++ b/docs/02-SEO.md @@ -0,0 +1,4 @@ +# SEO + +- Each URL is in English. +- The sitemap is available and automatically generated here /sitemap.xml diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..33700fc --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,15 @@ +# Roadmap + +**Functionality:** + +- Host the project on Netlify (present in community) to gather feedback from the marketing committee and the community. + +**blog** (in feature/blog-page-seo-with-article) +- Update blog with SEO (ariane, title, image/description) +- Generate SLUG auto / URL with slug / sitemap.xml auto / robots.txt +- Test with article picture + +**Design** + +- Make the design a little more modern (with white) + diff --git a/index.html b/index.html index 010decb..b74ed32 100644 --- a/index.html +++ b/index.html @@ -1,504 +1,15 @@ - - - - RealToken Ecosystem - - - - - - - - - -
- - - - - -
- - -
-

Presentation

-
-

-

Designed by the community, for the community...

-

-

- The RealToken ecosystem is a community initiative aimed at innovating and developing around tokenized real estate, with RealT as the main player. -

-

- Our mission is to create a collaborative space where ideas, projects, and skills come together to shape the future of tokenized real estate. -

-
-
- - -
-

Development

- -

How to contribute?

-

- Whether you're a developer, content creator, real estate specialist, or simply enthusiastic about contributing to the REALTOKEN ecosystem, your participation is welcome! -

-
    -
  • Propose a Project: Do you have an idea that could benefit the ecosystem? Create a new repo and share your vision!
  • -
  • Join a Project: Browse existing projects and share your expertise.
  • -
  • Suggest Improvements: Your feedback and suggestions are valuable to help us grow
  • -
- -

How to begin?

-

- start by going to our Github and check out our current projects and discussions! -

- - If you need an API key, please complete this form. -
- - - - - -
-

- - - -

- -

How to Integrate Your Project into the Realtoken Community?

- -

Follow these rules to have your project considered and hosted on the "realt.community" domain:

- -
    -
  1. - Project Submission: To have your project considered, please push it to our GitHub repository. Ensure your code is well documented and clearly structured. (public or private repository) -
  2. -
  3. - Review and Control: Each submitted project will undergo a review by our team to ensure it meets the community's quality and security standards. This includes checking for hidden links or malicious code. -
  4. -
  5. - Maintaining Access: By submitting your project, you agree that the community DEV can maintain control over the code to make necessary updates or modifications without being dependent solely on the original author. -
  6. -
  7. - Transparency: Any code that includes referral links or promotional elements must be clearly indicated and approved. We aim to maintain transparency and prevent exploitation of the community for personal gain. -
  8. -
  9. - Hosting: Approved projects will be hosted on the "realt.community" domain, providing a common platform and visibility for all contributing members.
  10. -
  11. - Contribution and Collaboration: We encourage collaboration and continuous improvement of projects. If you wish to contribute to an existing project, please adhere to the community's or the author's specified contribution guidelines. -
  12. -
  13. - Respect and Inclusion: We value respect and inclusion. Any form of discrimination or harassment is not tolerated. Let's collaborate in a spirit of mutual respect and collective growth. -
  14. -
- - By following these rules, you contribute to the success and sustainability of our community. Thank you for your commitment! -
- - -
-

- - - -

-
-

YAM

- -
- - yam_presentation - -

- A secure secondary marketplace for exchanging, selling, and buying RealTokens. -

-
- - -
-

- - - -

-
-

RMM

- -
- - rmm_presentation - -

- This protocol is powered by AAVE and designed for collateralizing your RealTokens and borrowing stablecoins. This innovative platform provides a secure and efficient way to leverage your RealToken assets for liquidity. -

-
- - -
-

- - - -

-
-

Bridge realtoken

- -
- - bridge_presentation - -

- A solution for transferring RealTokens and REG between blockchains. This bridge allows for easy and efficient movement of assets across different blockchain networks, enhancing interoperability and flexibility. -

-
- - -
-

- - - -

-
-

Shareholder vote

- -
- - bridge_presentation - -

- A dedicated platform for making decisions related to RealT properties. RealT can issue votes on property-related matters, and token holders have the power to participate in the decision-making process by casting their votes. -

-
- - -
-

- - - -

-
-

Dashboard

- -
- - dashboard_presentation - -

- Keep track of your REALT investments with this dashboard. Several filters are applicable to show you what you want! -

-
- - -
-

- - - -

-
-

API

- -
- - api_presentation - -

- A community API for retrieving essential information on the RealT ecosystem. -

-
- - - - - -
-

- - - -

-
-

LevinSwap

- -
- - levinswap_presentation - -

- based on the uniswap V2 protocol, swap your tokens or participate in liquidity pools here, find tokenlist here ! -

-
- - -
-

- - - -

-
-

Batch-sender

- -
- - batch_presentation - -

- If you want to switch wallet and have lots of tokens to move, you've found the right place! -

-
- - - - - - - - -
-

Contact

-
-
-
- - -
-
- - -
-
- - -
-
-
    -
  • -
  • -
-
-
- - - -
- - - -
- - - -
- - - - - - - - - - + + + + + + + + + Realtoken DAO + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0b61c29 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3566 @@ +{ + "name": "realtoken_website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "realtoken_website", + "version": "0.0.0", + "dependencies": { + "markdown-it": "^14.1.0", + "vue": "^3.5.22", + "vue-i18n": "^9.14.5", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "sass": "^1.94.2", + "sass-embedded": "^1.93.3", + "vite": "^7.1.11", + "vite-plugin-static-copy": "^3.1.4", + "vite-plugin-vue-devtools": "^8.0.3" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.1.tgz", + "integrity": "sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz", + "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", + "dependencies": { + "@intlify/message-compiler": "9.14.5", + "@intlify/shared": "9.14.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", + "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", + "dependencies": { + "@intlify/shared": "9.14.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz", + "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz", + "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.2.tgz", + "integrity": "sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==", + "dev": true, + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.50" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, + "node_modules/@vue/devtools-core": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.0.5.tgz", + "integrity": "sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^8.0.5", + "@vue/devtools-shared": "^8.0.5", + "mitt": "^3.0.1", + "nanoid": "^5.1.5", + "pathe": "^2.0.3", + "vite-hot-client": "^2.1.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", + "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^8.0.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", + "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==" + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", + "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.8.0.tgz", + "integrity": "sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.259", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.259.tgz", + "integrity": "sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sass": { + "version": "1.94.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", + "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.93.3.tgz", + "integrity": "sha512-+VUy01yfDqNmIVMd/LLKl2TTtY0ovZN0rTonh+FhKr65mFwIYgU9WzgIZKS7U9/SPCQvWTsTGx9jyt+qRm/XFw==", + "dev": true, + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.93.3", + "sass-embedded-android-arm": "1.93.3", + "sass-embedded-android-arm64": "1.93.3", + "sass-embedded-android-riscv64": "1.93.3", + "sass-embedded-android-x64": "1.93.3", + "sass-embedded-darwin-arm64": "1.93.3", + "sass-embedded-darwin-x64": "1.93.3", + "sass-embedded-linux-arm": "1.93.3", + "sass-embedded-linux-arm64": "1.93.3", + "sass-embedded-linux-musl-arm": "1.93.3", + "sass-embedded-linux-musl-arm64": "1.93.3", + "sass-embedded-linux-musl-riscv64": "1.93.3", + "sass-embedded-linux-musl-x64": "1.93.3", + "sass-embedded-linux-riscv64": "1.93.3", + "sass-embedded-linux-x64": "1.93.3", + "sass-embedded-unknown-all": "1.93.3", + "sass-embedded-win32-arm64": "1.93.3", + "sass-embedded-win32-x64": "1.93.3" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.93.3.tgz", + "integrity": "sha512-3okGgnE41eg+CPLtAPletu6nQ4N0ij7AeW+Sl5Km4j29XcmqZQeFwYjHe1AlKTEgLi/UAONk1O8i8/lupeKMbw==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "optional": true, + "dependencies": { + "sass": "1.93.3" + } + }, + "node_modules/sass-embedded-all-unknown/node_modules/sass": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.3.tgz", + "integrity": "sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.93.3.tgz", + "integrity": "sha512-8xOw9bywfOD6Wv24BgCmgjkk6tMrsOTTHcb28KDxeJtFtoxiUyMbxo0vChpPAfp2Hyg2tFFKS60s0s4JYk+Raw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.93.3.tgz", + "integrity": "sha512-uqUl3Kt1IqdGVAcAdbmC+NwuUJy8tM+2ZnB7/zrt6WxWVShVCRdFnWR9LT8HJr7eJN7AU8kSXxaVX/gedanPsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.93.3.tgz", + "integrity": "sha512-2jNJDmo+3qLocjWqYbXiBDnfgwrUeZgZFHJIwAefU7Fn66Ot7rsXl+XPwlokaCbTpj7eMFIqsRAZ/uDueXNCJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.93.3.tgz", + "integrity": "sha512-y0RoAU6ZenQFcjM9PjQd3cRqRTjqwSbtWLL/p68y2oFyh0QGN0+LQ826fc0ZvU/AbqCsAizkqjzOn6cRZJxTTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.93.3.tgz", + "integrity": "sha512-7zb/hpdMOdKteK17BOyyypemglVURd1Hdz6QGsggy60aUFfptTLQftLRg8r/xh1RbQAUKWFbYTNaM47J9yPxYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.93.3.tgz", + "integrity": "sha512-Ek1Vp8ZDQEe327Lz0b7h3hjvWH3u9XjJiQzveq74RPpJQ2q6d9LfWpjiRRohM4qK6o4XOHw1X10OMWPXJtdtWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.93.3.tgz", + "integrity": "sha512-yeiv2y+dp8B4wNpd3+JsHYD0mvpXSfov7IGyQ1tMIR40qv+ROkRqYiqQvAOXf76Qwh4Y9OaYZtLpnsPjfeq6mA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.93.3.tgz", + "integrity": "sha512-RBrHWgfd8Dd8w4fbmdRVXRrhh8oBAPyeWDTKAWw8ZEmuXfVl4ytjDuyxaVilh6rR1xTRTNpbaA/YWApBlLrrNw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.93.3.tgz", + "integrity": "sha512-fU0fwAwbp7sBE3h5DVU5UPzvaLg7a4yONfFWkkcCp6ZrOiPuGRHXXYriWQ0TUnWy4wE+svsVuWhwWgvlb/tkKg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.93.3.tgz", + "integrity": "sha512-PS829l+eUng+9W4PFclXGb4uA2+965NHV3/Sa5U7qTywjeeUUYTZg70dJHSqvhrBEfCc2XJABeW3adLJbyQYkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.93.3.tgz", + "integrity": "sha512-cK1oBY+FWQquaIGEeQ5H74KTO8cWsSWwXb/WaildOO9U6wmUypTgUYKQ0o5o/29nZbWWlM1PHuwVYTSnT23Jjg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.93.3.tgz", + "integrity": "sha512-A7wkrsHu2/I4Zpa0NMuPGkWDVV7QGGytxGyUq3opSXgAexHo/vBPlGoDXoRlSdex0cV+aTMRPjoGIfdmNlHwyg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.93.3.tgz", + "integrity": "sha512-vWkW1+HTF5qcaHa6hO80gx/QfB6GGjJUP0xLbnAoY4pwEnw5ulGv6RM8qYr8IDhWfVt/KH+lhJ2ZFxnJareisQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.93.3.tgz", + "integrity": "sha512-k6uFxs+e5jSuk1Y0niCwuq42F9ZC5UEP7P+RIOurIm8w/5QFa0+YqeW+BPWEW5M1FqVOsNZH3qGn4ahqvAEjPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.93.3.tgz", + "integrity": "sha512-o5wj2rLpXH0C+GJKt/VpWp6AnMsCCbfFmnMAttcrsa+U3yrs/guhZ3x55KAqqUsE8F47e3frbsDL+1OuQM5DAA==", + "dev": true, + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.93.3" + } + }, + "node_modules/sass-embedded-unknown-all/node_modules/sass": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.3.tgz", + "integrity": "sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.93.3.tgz", + "integrity": "sha512-0dOfT9moy9YmBolodwYYXtLwNr4jL4HQC9rBfv6mVrD7ud8ue2kDbn+GVzj1hEJxvEexVSmDCf7MHUTLcGs9xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.93.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.93.3.tgz", + "integrity": "sha512-wHFVfxiS9hU/sNk7KReD+lJWRp3R0SLQEX4zfOnRP2zlvI2X4IQR5aZr9GNcuMP6TmNpX0nQPZTegS8+h9RrEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.5.tgz", + "integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==", + "dev": true, + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true + }, + "node_modules/vite": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", + "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dev": true, + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dev": true, + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz", + "integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "p-map": "^7.0.3", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.15" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.0.5.tgz", + "integrity": "sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==", + "dev": true, + "dependencies": { + "@vue/devtools-core": "^8.0.5", + "@vue/devtools-kit": "^8.0.5", + "@vue/devtools-shared": "^8.0.5", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^5.3.2" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz", + "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vue": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz", + "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", + "dependencies": { + "@intlify/core-base": "9.14.5", + "@intlify/shared": "9.14.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..280efb0 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "realtoken_website", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": ">=24.0.0" + }, + "scripts": { + "dev": "vite", + "build": "node scripts/generate-sitemap.js && node scripts/check-app-links.js && vite build", + "preview": "vite preview", + "sitemap": "node scripts/generate-sitemap.js", + "check:app-links": "node scripts/check-app-links.js" + }, + "dependencies": { + "markdown-it": "^14.1.0", + "vue": "^3.5.22", + "vue-i18n": "^9.14.5", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "sass": "^1.94.2", + "sass-embedded": "^1.93.3", + "vite": "^7.1.11", + "vite-plugin-static-copy": "^3.1.4", + "vite-plugin-vue-devtools": "^8.0.3" + } +} diff --git a/public/ArticleImg/.gitkeep b/public/ArticleImg/.gitkeep new file mode 100644 index 0000000..d614e6c --- /dev/null +++ b/public/ArticleImg/.gitkeep @@ -0,0 +1,2 @@ +# Images des articles du blog (imageHeader du frontmatter) +# Ex. : realtoken-perimetre.jpg, realtoken-scope.jpg diff --git a/public/ArticleImg/README.md b/public/ArticleImg/README.md new file mode 100644 index 0000000..c763cbb --- /dev/null +++ b/public/ArticleImg/README.md @@ -0,0 +1,23 @@ +# Article image + +Size: 1376x768 (Gemini out) + +## Prompt image blog (Gemini): + +J’aimerais que tu me génères des images de blog avec les couleurs ci‑dessous, en fonction des thématiques et des articles que je vais te donner. + +- Si tu ajoutes du texte dans l’image, il doit être en anglais. +- Le fond de l’image devrait être uni avec cette couleurs: #0D2853 +- Peu de texte (ou pas de texte si pas nécessaire). +- L’image doit être simple et facilement compréhensible. +- L'image doit être visuelle et ne pas forcement montrer d'étapes, de textes ou d'éléments descriptifs. + +Les couleurs que tu dois utiliser sont : + +- Navy blue : #091A3A +- Charcoal : #242424 +- White : #FFFFFF +- Orange : #FF8C42 + +Voici l’article : [article] + diff --git a/public/ArticleImg/future-rwa-roadmap-diversification.png b/public/ArticleImg/future-rwa-roadmap-diversification.png new file mode 100644 index 0000000..64fff12 Binary files /dev/null and b/public/ArticleImg/future-rwa-roadmap-diversification.png differ diff --git a/public/ArticleImg/realtoken-dao-birth.png b/public/ArticleImg/realtoken-dao-birth.png new file mode 100644 index 0000000..c26caa4 Binary files /dev/null and b/public/ArticleImg/realtoken-dao-birth.png differ diff --git a/public/ArticleImg/realtoken-dao-objectif.png b/public/ArticleImg/realtoken-dao-objectif.png new file mode 100644 index 0000000..3b03311 Binary files /dev/null and b/public/ArticleImg/realtoken-dao-objectif.png differ diff --git a/public/ArticleImg/realtoken-gouv.png b/public/ArticleImg/realtoken-gouv.png new file mode 100644 index 0000000..a031321 Binary files /dev/null and b/public/ArticleImg/realtoken-gouv.png differ diff --git a/public/ArticleImg/realtoken-link-realt.png b/public/ArticleImg/realtoken-link-realt.png new file mode 100644 index 0000000..08c5e5e Binary files /dev/null and b/public/ArticleImg/realtoken-link-realt.png differ diff --git a/public/ArticleImg/realtoken-scope.png b/public/ArticleImg/realtoken-scope.png new file mode 100644 index 0000000..4708ff6 Binary files /dev/null and b/public/ArticleImg/realtoken-scope.png differ diff --git a/public/app-links-status.json b/public/app-links-status.json new file mode 100644 index 0000000..4d191d5 --- /dev/null +++ b/public/app-links-status.json @@ -0,0 +1,240 @@ +{ + "checkedAt": "2026-04-02T11:44:25.960Z", + "total": 26, + "links": [ + { + "url": "https://rmm.realtoken.network/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://github.com/RealToken-Community/DEVCONTEST-rent2repay", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://analytics.rmm.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://t.me/rmm_available_liquidity", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://dune.com/sigri44/realtoken-rmm", + "ok": false, + "visible": true, + "softAllowed": true, + "status": 403, + "method": "GET", + "error": null + }, + { + "url": "https://scappa.battistu.com/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://yam.realtoken.network", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://yam-report.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://offer-view.yam.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://t.me/yam_sale_notify_bot", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://bridge.realtoken.network/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://dashboard.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://mobile.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://vote.realtoken.network/assets", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://api.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "GET", + "error": null + }, + { + "url": "https://transfer.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://t.me/RealToken_Alerts_Bot", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://realt.pitsbi.io", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://www.cryptalloc.com/realtlab/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://ehpst.duckdns.org/realt_rent_tracker/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://community-realt.gitbook.io/tuto-community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://claim.realtoken.network/reg", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://wiki.realtoken.community/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://wallet.realtoken.network/", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + }, + { + "url": "https://dune.com/teugos/realtoken-dao-dashboard", + "ok": false, + "visible": true, + "softAllowed": true, + "status": 403, + "method": "GET", + "error": null + }, + { + "url": "https://vote.realtoken.network/dao/incentive", + "ok": true, + "visible": true, + "softAllowed": false, + "status": 200, + "method": "HEAD", + "error": null + } + ] +} diff --git a/public/articles/en/birth-of-realtoken-dao.md b/public/articles/en/birth-of-realtoken-dao.md new file mode 100644 index 0000000..dd04c22 --- /dev/null +++ b/public/articles/en/birth-of-realtoken-dao.md @@ -0,0 +1,34 @@ +--- +title: "The Birth of the RealToken DAO" +date: "2024-02-01" +description: "The story behind the origins and creation of the RealToken DAO, a decentralized organization dedicated to real-world asset tokenization" +tags: ["dao", "history", "governance", "ecosystem"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-dao-birth.png" +--- + +# The Birth of the RealToken DAO + +The RealToken DAO did not emerge by chance: it is the result of a shared vision — to make real-world assets accessible, liquid, and governed in a decentralized way. This article looks back at the DAO’s genesis and the milestones that marked its creation. + +## An Ecosystem Coming of Age + +Before the DAO, the RealToken ecosystem already relied on essential building blocks: real estate tokenization, market tools, and an engaged community. The need for a clear, decentralized governance structure gradually became obvious — to align interests, make collective decisions, and evolve the project in a transparent manner. + +## The DAO’s Foundations + +The creation of the RealToken DAO was built on several pillars: + +- **An active community**: token holders and contributors already involved in the RealToken ecosystem +- **Shared goals**: development of tools (RMM, YAM), integration of new assets, and strengthening of RWA standards +- **A governance framework**: proposal, voting, and execution processes owned by the community + +The DAO thus became the entity that embodies and structures this governance, while remaining open to anyone who wants to help shape the future of tokenized real-world assets. + +## A Decentralized Autonomous Organization + +As a decentralized autonomous organization, the RealToken DAO operates without relying on a single central authority. Proposals are submitted, discussed, and adopted by holders of voting rights, according to rules defined and accepted by the community. The birth of the DAO therefore marks the moment when the RealToken ecosystem entered a phase where governance is truly in the hands of its participants. + +## What Comes Next? + +Since its creation, the DAO has continued to refine its scope, processes, and priorities. Understanding its origins helps to better grasp its current role and the stakes of future decisions. To go further, you can read the article on [the scope of the RealToken DAO](/blog/realtoken-dao-scope). diff --git a/public/articles/en/future-rwa-community-roadmap-diversification.md b/public/articles/en/future-rwa-community-roadmap-diversification.md new file mode 100644 index 0000000..7b7b1b8 --- /dev/null +++ b/public/articles/en/future-rwa-community-roadmap-diversification.md @@ -0,0 +1,46 @@ +--- +title: "The Future of RWA: A Community-Driven Roadmap for Diversification" +date: "2026-03-12" +description: "How the RealToken DAO community is exploring RWA diversification—research-first criteria, asset types on the radar, and technical foundations for RMM growth." +tags: ["rwa", "dao", "governance", "diversification", "rmm"] +author: "Realtoken DAO Team" +imageHeader: "future-rwa-roadmap-diversification.png" +--- + +# The Future of RWA: A Community-Driven Roadmap for Diversification + +## Introduction + +The RealToken DAO was built on a foundational vision: to create a robust, decentralized ecosystem for Real-World Assets. While our journey began with a strong reliance on a single asset issuer (RealT) and a specific asset class (US residential real estate), the long-term goal has always been to evolve into a neutral, multi-asset infrastructure layer. Recently, a vibrant and highly structured discussion has emerged on our governance forum. Spearheaded by proactive community members, the DAO has officially entered an exploration phase for RWA diversification. Here is a look at how the community is laying the groundwork for the future of our ecosystem. + +## Why diversify? The strategic need for autonomy + +The motivation behind this community initiative is clear and pragmatic. Relying on a single issuer creates a single point of dependency, impacting the DAO’s revenues when market dynamics shift. By exploring new types of collateral for the RMM (RealT Market Maker) or potential new dedicated markets, the community aims to achieve three critical objectives: + +- **Revenue resilience:** Expanding the TVL base across multiple asset types to stabilize protocol revenues. +- **Ecosystem attractiveness:** Positioning the DAO as a versatile infrastructure capable of attracting liquidity from outside our historical community. +- **Strategic independence:** Strengthening the DAO’s long-term autonomy by diversifying its partnerships and asset sources. + +## A methodical, research-first approach + +What stands out in this initiative is the rigorous methodology applied by DAO members. This is not about rushing into new partnerships; it is a strictly exploratory phase focused on research and evaluation. The community has defined strict eligibility criteria for potential candidate projects, focusing on: + +- **Transparency & auditability:** Verifiable Proof of Reserves and audited smart contracts. +- **Legal alignment:** Clear regulatory frameworks and KYC/AML compliance. +- **Technical compatibility:** ERC-20 standard compliance, reliable price oracles, and on-chain liquidity. + +## Moving beyond residential: what’s on the radar? + +Thanks to the hard work of contributors mapping the RWA landscape, several exciting avenues are being evaluated. The focus extends far beyond traditional real estate: + +- **Tokenized US Treasuries (short-term):** Projects offering yield-bearing, ERC-20 native tokens backed by government bonds are being analyzed for their potential to provide stable, uncorrelated yields. +- **Tokenized equities & ETFs:** Assets like tracker certificates operating under solid European regulatory frameworks (like the Swiss DLT Act) are being considered, especially those already deployed on Gnosis Chain. +- **Private credit & infrastructure:** Explorations into multi-asset platforms that handle tokenized loans, invoices, or energy infrastructure. + +## Addressing the technical and timing challenges + +The community is fully aware of the hurdles ahead. Integrating new RWAs is not just a matter of voting; it requires solving complex technical challenges. Discussions are actively tackling issues such as **oracle design** (building reliable price feeds for illiquid assets), calibrating **risk parameters** (LTV, liquidation thresholds), and debating the architectural choice between integrating new assets into the existing RMM versus creating a **dedicated, isolated market**. Furthermore, the community consensus is clear: **timing is everything.** This current phase is about building the technical, legal, and governance foundations now, so the DAO is ready to act decisively when the strategic context is right—without rushing into premature integrations. + +## Conclusion + +The exploration of RWA diversification proves that the RealToken DAO is maturing. It demonstrates the power of collective intelligence in navigating complex DeFi landscapes and planning for sustainable growth. The research is ongoing, and every DAO member is encouraged to participate. Head over to the [RealToken Community Forum](https://forum.realtoken.community/) to read the detailed evaluation sheets, share your insights, and help shape the future of our decentralized ecosystem. diff --git a/public/articles/en/realtoken-dao-governance-participation.md b/public/articles/en/realtoken-dao-governance-participation.md new file mode 100644 index 0000000..cabc337 --- /dev/null +++ b/public/articles/en/realtoken-dao-governance-participation.md @@ -0,0 +1,62 @@ +--- +title: "How to participate in RealToken DAO governance?" +date: "2026-02-20" +description: "Practical guide to becoming an active member of the RealToken DAO: getting REG tokens, joining the forum, voting on Tally, and submitting your first proposals" +tags: ["dao", "governance", "reg", "participation", "guide"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-gouv.png" +--- + +# How to participate in RealToken DAO governance? + +The RealToken DAO belongs to those who participate in it. But how do you go from being a mere observer to an active governance member? This practical guide walks you through the concrete steps to contribute to the decisions that shape the ecosystem. + +## Step 1: Get REG tokens + +REG (RealToken Ecosystem Governance) is the DAO’s governance token. Holding REG means holding voting power on the direction of the ecosystem. + +- **Via YAM**: The YAM (You And Me) platform lets you buy and trade REG directly with other community members. +- **Via contribution**: Active contributions to the ecosystem — development, communication, community building — can be rewarded in REG by DAO decision. + +The more REG you hold, the greater your weight in collective decisions. + +## Step 2: Join the community forum + +Before voting or proposing, the essential step is to **join the forum** (forum.realtoken.community). This is where the day-to-day life of the DAO happens: + +- **Discussions**: Every major decision goes through an open debate phase first. +- **Informal proposals**: Before being put to an on-chain vote, an idea is shared on the forum to be refined and gather support. +- **Tracking decisions**: Vote outcomes and their implementation are documented and discussed there in a transparent way. + +Taking part in discussions is one of the most accessible forms of contribution, even without holding REG. + +## Step 3: Vote on Tally + +Official DAO votes take place **on-chain via Tally** (tally.xyz/gov/realtoken-ecosystem-governance). This is where decisions are recorded in a transparent and immutable way on the blockchain. + +- **View active proposals**: Tally lists all current proposals with their full description and arguments for and against. +- **Delegate your vote**: If you prefer not to follow every proposal yourself, you can delegate your voting power to a trusted community member. +- **Vote directly**: Connect your wallet to Tally and cast your vote. Every vote, even with a small amount of REG, contributes to the democratic legitimacy of decisions. + +## Step 4: Submit a proposal + +Have an idea to improve the ecosystem? The DAO is open to initiatives from all its members. Here is the typical process: + +1. **Preliminary discussion on the forum**: Present your idea, gather community feedback, and refine your proposal before moving forward. +2. **Draft a formal proposal**: Once the idea is mature, write a structured proposal: context, objective, budget if needed, success metrics. +3. **On-chain submission via Tally**: The proposal can then be submitted for an on-chain vote. A minimum amount of REG is required to submit directly. +4. **Vote and execution**: If the proposal is adopted by the community, it enters the DAO’s execution cycle. + +## Committees: getting involved over the long term + +The DAO is also organized into **thematic committees** (Security, Marketing, Liquidity, Proposer, Voting Power, etc.) that work in depth on specific topics. Joining a committee means getting involved on a regular basis and building expertise recognized by the community. + +Visit the [Committees](/committee) page to discover active groups and how to participate. + +## In summary + +Participating in RealToken DAO governance comes down to four steps: get REG, join the forum, vote on Tally, and put forward your own initiatives. Every action, however small, strengthens the legitimacy and vitality of the DAO. + +Decentralized governance only works when the community gets involved. Your participation is what gives the RealToken DAO its value and legitimacy. + +To go further, read the articles on [the DAO’s objectives](/blog/realtoken-dao-objectives) and [the DAO’s scope](/blog/realtoken-dao-scope). diff --git a/public/articles/en/realtoken-dao-objectives.md b/public/articles/en/realtoken-dao-objectives.md new file mode 100644 index 0000000..f670ea3 --- /dev/null +++ b/public/articles/en/realtoken-dao-objectives.md @@ -0,0 +1,46 @@ +--- +title: "What is our objective?" +date: "2024-04-01" +description: "Discover the objectives and vision of the RealToken DAO: democratizing real-world assets, strengthening governance, and developing the RWA ecosystem" +tags: ["dao", "objective", "vision", "ecosystem", "governance"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-dao-objectif.png" +--- + +# What is our objective? + +The RealToken DAO does not simply manage an ecosystem — it pursues a clear vision: to make real-world assets accessible, liquid, and governed by the community. This article outlines the objectives that guide our decisions and actions every day. + +## A vision: democratizing real-world assets + +Our primary objective is to **democratize access to real-world assets** (RWA). In practice, this means: + +- **Accessibility**: enabling more people to participate in the tokenization of real estate and other tangible assets, without excessive barriers +- **Liquidity**: facilitating the purchase, sale, and exchange of tokens representing real assets, through tools such as RMM (RealToken Money Market) and YAM (You And Me) +- **Transparency**: ensuring that rules, data, and decisions are understandable and verifiable by all + +In short, we aim for an ecosystem where ownership of real-world assets can be shared, traded, and governed in a decentralized way. + +## Strengthening community governance + +A second major objective is to **strengthen community governance**. The DAO must not depend on a small number of actors: holders of voting rights should be able to: + +- **Propose** changes (integrations, tools, standards) +- **Discuss** and vote on strategic and operational directions +- **Monitor** the execution of decisions and their impact on the ecosystem + +Our objective is therefore for governance to be legitimate, effective, and open to the entire RealToken community. + +## Developing and securing the ecosystem + +Finally, we set ourselves the objective of **developing and securing the ecosystem**: + +- **Integration of new assets and partners**: expanding the range of real-world asset tokens while maintaining quality and compliance standards +- **Tools and standards**: maintaining and improving RMM, YAM, and the technical protocols that underpin tokenization +- **Long-term sustainability**: making decisions that ensure the project’s durability over time, in the interest of participants and users + +In the end, our objective is to make the RealToken DAO the cornerstone of a robust, open, and community-governed RWA ecosystem. + +## In summary + +Our objective can be summed up in three pillars: **democratize real-world assets**, **strengthen community governance**, and **develop a sustainable ecosystem**. Every proposal, every vote, and every action of the DAO aims to move in this direction. To learn more about our scope and our story, read the articles on [the scope of the DAO](/blog/realtoken-dao-scope) and [the birth of the DAO](/blog/birth-of-realtoken-dao). diff --git a/public/articles/en/realtoken-dao-realt-relationship.md b/public/articles/en/realtoken-dao-realt-relationship.md new file mode 100644 index 0000000..9614cde --- /dev/null +++ b/public/articles/en/realtoken-dao-realt-relationship.md @@ -0,0 +1,37 @@ +--- +title: "What is our relationship with RealT?" +date: "2024-05-01" +description: "Understanding the relationship between the RealToken DAO and RealT: a shared ecosystem, decentralized governance, and collaboration in service of real-world assets" +tags: ["dao", "realt", "ecosystem", "governance", "partnership"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-link-realt.png" +--- + +# What is our relationship with RealT? + +The RealToken DAO and RealT are often mentioned together — and for good reason: they belong to the same real-world asset tokenization ecosystem. But what exactly is the relationship between the DAO and RealT? This article clarifies that relationship and what it means for governance and the development of the project. + +## An ecosystem born with RealT + +**RealT** is at the origin of the RealToken ecosystem: real estate tokenization, the creation of tools (RMM — RealToken Money Market, YAM — You And Me), and the building of a community around tokenized real-world assets (RWA). The RealToken DAO, for its part, was created to give this community a **decentralized governance** framework: to propose, vote, and steer the evolution of the ecosystem without depending on a single entity. + +In short: RealT created and develops the technical and operational building blocks; the DAO embodies community governance over this ecosystem. + +## Collaboration and complementarity + +Our relationship with RealT is based on **collaboration and complementarity**: + +- **RealT**: operations, development of platforms, asset integration, maintenance of protocols and tools (RMM, YAM, etc.) +- **The RealToken DAO**: strategic direction, validation of integrations or partnerships, definition of standards and priorities, all through community proposals and votes + +The DAO does not replace RealT; it gives the community the means to **decide collectively** on the direction and rules that apply to the ecosystem. RealT remains a key actor for technical and operational implementation, in line with the decisions made by the DAO. + +## Independence and legitimacy of the DAO + +An important point: the RealToken DAO is **independent** in its decisions. Holders of voting rights (token holders, governance participants) decide according to the protocol’s rules, without RealT or any other actor being able to impose a direction unilaterally. Our relationship with RealT is therefore one of **partnership and ecosystem**, not subordination: the DAO steers, RealT (and other operators) execute within the framework defined by governance. + +This independence is what gives the DAO its **legitimacy**: it represents the collective will of the RealToken community. + +## In summary + +Our relationship with RealT can be summed up as follows: **same ecosystem, distinct roles**. RealT is at the origin of the project and ensures its operational and technical development; the RealToken DAO ensures its decentralized governance. Together, they aim for the same goal — to grow and secure the tokenized real-world asset ecosystem — while ensuring that major decisions are made by the community. To learn more about our objective and our scope, read the articles [What is our objective?](/blog/realtoken-dao-objectives) and [The scope of the RealToken DAO](/blog/realtoken-dao-scope). diff --git a/public/articles/en/realtoken-dao-scope.md b/public/articles/en/realtoken-dao-scope.md new file mode 100644 index 0000000..71c8968 --- /dev/null +++ b/public/articles/en/realtoken-dao-scope.md @@ -0,0 +1,69 @@ +--- +title: "The Scope of RealToken DAO" +date: "2024-03-01" +description: "Discover the scope of action, responsibilities and areas of intervention of the RealToken DAO" +tags: ["dao", "governance", "ecosystem"] +author: "Realtoken DAO Team" +imageHeader: "realtoken-scope.png" +--- + +# The Scope of RealToken DAO + +The RealToken DAO is a decentralized autonomous organization that manages and develops the real-world asset (RWA) tokenization ecosystem. Understanding its scope of action is essential to participate effectively in governance. + +## What is the DAO's Scope? + +The DAO's scope defines the areas in which it can act, make decisions, and allocate resources. It delineates the responsibilities and competencies of the decentralized organization. + +## Areas of Intervention + +### 1. Ecosystem Management + +The DAO is responsible for the overall management of the RealToken ecosystem, including: + +- **New Partner Integration**: Validation and integration of new real-world asset tokens +- **Tool Development**: Maintenance and improvement of RMM (RealToken Money Market) and YAM (You And Me) +- **Standards and Protocols**: Definition of technical standards for real-world asset tokenization + +### 2. Decentralized Governance + +The DAO manages community governance through: + +- **Governance Proposals**: REG token holders can submit proposals +- **Voting Process**: On-chain voting system via Tally for important decisions +- **Resource Allocation**: Treasury management and fund allocation for development + +### 3. Compliance and Regulation + +The DAO ensures regulatory compliance: + +- **Legal Framework**: Maintaining SEC-ready compliance +- **Insurance**: Management of insurance partnerships (Lloyd's) +- **Reporting**: Integration with Chainlink oracles for automated reporting + +### 4. Community Development + +The DAO fosters community development: + +- **Documentation**: Maintenance of the Wiki and technical documentation +- **Education**: Educational resources on real-world asset tokenization +- **Communication**: Management of communication channels and community forum + +## Scope Limitations + +The DAO does **not directly** manage: + +- Underlying real estate assets (managed by partners) +- Individual token transactions (managed by users) +- Personal investment decisions of members + +## How to Participate? + +1. **Get REG Tokens**: Participate in governance by holding REG tokens +2. **Join the Forum**: Participate in discussions and proposals +3. **Vote on Tally**: Express your voice on important decisions +4. **Submit Proposals**: Propose new initiatives for the ecosystem + +--- + +*The RealToken DAO is an ever-evolving ecosystem. Your participation shapes its future!* diff --git a/public/articles/fr/avenir-rwa-diversification-communautaire.md b/public/articles/fr/avenir-rwa-diversification-communautaire.md new file mode 100644 index 0000000..a92a77d --- /dev/null +++ b/public/articles/fr/avenir-rwa-diversification-communautaire.md @@ -0,0 +1,46 @@ +--- +title: "L'Avenir des RWA : Une Feuille de Route Communautaire pour la Diversification" +date: "2026-03-12" +description: "Comment la communauté RealToken DAO explore la diversification des RWA—critères axés sur la recherche, pistes à l'étude et fondations techniques pour le RMM." +tags: ["rwa", "dao", "gouvernance", "diversification", "rmm"] +author: "Equipe Realtoken DAO" +imageHeader: "future-rwa-roadmap-diversification.png" +--- + +# L'Avenir des RWA : Une Feuille de Route Communautaire pour la Diversification + +## Introduction + +La RealToken DAO s'est construite sur une vision claire : créer un écosystème décentralisé et robuste pour les actifs du monde réel (RWA). Si notre aventure a commencé avec une forte dépendance à un seul émetteur (RealT) et à une classe d'actifs spécifique (l'immobilier résidentiel américain), l'objectif à long terme a toujours été d'évoluer vers une couche d'infrastructure neutre et multi-actifs. Récemment, une discussion structurée et dynamique a émergé sur notre forum de gouvernance. Sous l'impulsion de membres proactifs, la DAO est officiellement entrée dans une phase d'exploration pour la diversification des RWA. Voici comment la communauté prépare aujourd'hui le terrain pour l'avenir de notre écosystème. + +## Pourquoi se diversifier ? Le besoin stratégique d'autonomie + +La motivation derrière cette initiative communautaire est claire et pragmatique. Le modèle économique actuel reposant sur un seul émetteur, cela crée un point de dépendance unique qui impacte les revenus du protocole lors des fluctuations du marché. En explorant de nouvelles sources de collatéral pour le RMM existant ou pour de potentiels nouveaux marchés dédiés, la communauté vise trois objectifs cruciaux : + +- **Résilience des revenus :** Élargir la base de TVL (Total Value Locked) sur plusieurs types d'actifs pour stabiliser les revenus finançant la DAO. +- **Attractivité de l'écosystème :** Positionner la DAO comme une infrastructure capable d'attirer de nouveaux utilisateurs et fournisseurs de liquidité au-delà de notre communauté historique. +- **Indépendance stratégique :** Renforcer l'autonomie à long terme de la DAO en diversifiant ses partenariats et ses sources d'actifs. + +## Une approche méthodique, axée sur la recherche + +Ce qui distingue cette initiative, c'est la rigueur méthodologique appliquée par les membres de la DAO. Il ne s'agit en aucun cas de précipiter de nouveaux partenariats, mais d'une phase strictement exploratoire d'évaluation. La communauté a défini des critères d'éligibilité stricts pour les projets candidats : + +- **Transparence et auditabilité :** Preuves de réserves (PoR) vérifiables on-chain et smart contracts audités. +- **Alignement légal :** Cadres réglementaires clairs et respect des normes KYC/AML selon la structuration. +- **Compatibilité technique :** Standard ERC-20, oracles de prix fiables et liquidité on-chain suffisante. + +## Au-delà de l'immobilier résidentiel : qu'y a-t-il sur le radar ? + +Grâce au travail de fond des contributeurs qui cartographient le paysage des RWA, plusieurs pistes prometteuses sont en cours d'évaluation. L'horizon s'étend bien au-delà de l'immobilier traditionnel : + +- **Bons du Trésor US tokenisés :** Analyse de projets offrant des rendements stables via des tokens ERC-20 adossés à de la dette gouvernementale à court terme. +- **Actions et ETFs tokenisés :** Évaluation d'actifs fonctionnant sous des cadres réglementaires européens solides (comme le DLT Act suisse), particulièrement ceux déjà déployés sur Gnosis Chain. +- **Crédit privé et infrastructures :** Exploration de plateformes multi-actifs gérant des prêts tokenisés, des factures ou des infrastructures énergétiques. + +## Relever les défis techniques et temporels + +La communauté est pleinement consciente des obstacles à franchir. Intégrer de nouveaux RWA exige de résoudre des défis techniques complexes. Les débats actuels portent sur la conception des **oracles** (indispensables pour le calcul des ratios), le calibrage des **paramètres de risque** (LTV, seuils de liquidation), et le choix architectural crucial : intégrer ces nouveaux actifs au RMM actuel ou créer un **marché dédié** pour isoler les risques. De plus, le consensus communautaire est formel : **le timing est essentiel.** Cette phase consiste à construire les fondations techniques, juridiques et de gouvernance dès aujourd'hui, afin que la DAO soit prête à agir lorsque le contexte stratégique sera optimal, sans aucune précipitation. + +## Conclusion + +L'exploration de la diversification des RWA prouve la maturité croissante de la RealToken DAO. Elle illustre la puissance de l'intelligence collective pour naviguer dans la DeFi et planifier une croissance durable. La recherche suit son cours et chaque membre est invité à y participer. Rendez-vous sur le [Forum de la Communauté RealToken](https://forum.realtoken.community/) pour lire les fiches d'évaluation détaillées, partager vos analyses et façonner l'avenir de notre écosystème décentralisé. diff --git a/public/articles/fr/lien-realt-dao-realtoken.md b/public/articles/fr/lien-realt-dao-realtoken.md new file mode 100644 index 0000000..3ed11f3 --- /dev/null +++ b/public/articles/fr/lien-realt-dao-realtoken.md @@ -0,0 +1,37 @@ +--- +title: "Quel est notre lien avec RealT ?" +date: "2024-05-01" +description: "Comprendre la relation entre la RealToken DAO et RealT : un écosystème partagé, une gouvernance décentralisée et une collaboration au service des actifs réels" +tags: ["dao", "realt", "écosystème", "gouvernance", "partenariat"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-link-realt.png" +--- + +# Quel est notre lien avec RealT ? + +La RealToken DAO et RealT sont souvent évoqués ensemble — et pour cause : ils appartiennent au même écosystème de tokenisation d'actifs réels. Mais quel est exactement le lien entre la DAO et RealT ? Cet article clarifie cette relation et ce qu'elle implique pour la gouvernance et le développement du projet. + +## Un écosystème né avec RealT + +**RealT** est à l'origine de l'écosystème RealToken : tokenisation d'actifs immobiliers, mise en place des outils (RMM — RealToken Money Market, YAM — You And Me) et construction d'une communauté autour des actifs réels tokenisés (RWA). La RealToken DAO, elle, est née pour donner à cette communauté un cadre de **gouvernance décentralisée** : proposer, voter et orienter l'évolution de l'écosystème sans dépendre d'une seule entité. + +En résumé : RealT a créé et développe les briques techniques et opérationnelles ; la DAO incarne la gouvernance communautaire sur cet écosystème. + +## Collaboration et complémentarité + +Notre lien avec RealT repose sur une **collaboration et une complémentarité** : + +- **RealT** : opération, développement des plateformes, intégration d'actifs, maintenance des protocoles et des outils (RMM, YAM, etc.) +- **La RealToken DAO** : orientations stratégiques, validation d'intégrations ou de partenariats, définition de standards et de priorités, le tout via des propositions et des votes communautaires + +La DAO ne remplace pas RealT ; elle donne à la communauté les moyens de **décider collectivement** des orientations et des règles qui s'appliquent à l'écosystème. RealT reste un acteur clé pour la mise en œuvre technique et opérationnelle, dans le respect des décisions prises par la DAO. + +## Indépendance et légitimité de la DAO + +Un point important : la RealToken DAO est **indépendante** dans ses décisions. Les détenteurs de droits de vote (token holders, participants à la gouvernance) décident selon les règles du protocole, sans que RealT ou tout autre acteur puisse imposer unilatéralement une orientation. Notre lien avec RealT est donc un lien de **partenariat et d'écosystème**, pas de subordination : la DAO oriente, RealT (et d'autres opérateurs) exécutent dans le cadre défini par la gouvernance. + +Cette indépendance est ce qui donne à la DAO sa **légitimité** : elle représente la volonté collective de la communauté RealToken. + +## En résumé + +Notre lien avec RealT peut se résumer ainsi : **même écosystème, rôles distincts**. RealT est à l'origine du projet et en assure le développement opérationnel et technique ; la RealToken DAO en assure la gouvernance décentralisée. Ensemble, ils visent un même objectif — faire grandir et sécuriser l'écosystème des actifs réels tokenisés — tout en garantissant que les décisions importantes soient prises par la communauté. Pour en savoir plus sur notre objectif et notre périmètre, consultez les articles [Quel est notre objectif ?](/blog/objectif-dao-realtoken) et [Le périmètre de la DAO RealToken](/blog/perimetre-dao-realtoken). diff --git a/public/articles/fr/naissance-dao-realtoken.md b/public/articles/fr/naissance-dao-realtoken.md new file mode 100644 index 0000000..56deec0 --- /dev/null +++ b/public/articles/fr/naissance-dao-realtoken.md @@ -0,0 +1,34 @@ +--- +title: "La naissance de la DAO RealToken" +date: "2024-02-01" +description: "Retour sur les origines et la création de la RealToken DAO, une organisation décentralisée dédiée à la tokenisation d'actifs réels" +tags: ["dao", "histoire", "gouvernance", "écosystème"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-dao-birth.png" +--- + +# La naissance de la DAO RealToken + +La RealToken DAO n’a pas émergé par hasard : elle est le fruit d’une vision partagée — rendre les actifs réels accessibles, liquides et gouvernés de manière décentralisée. Cet article revient sur la genèse de la DAO et les étapes qui ont marqué sa création. + +## Un écosystème en maturation + +Avant la DAO, l’écosystème RealToken reposait déjà sur des briques essentielles : tokenisation d’actifs immobiliers, outils de marché et une communauté engagée. La nécessité d’une structure de gouvernance claire et décentralisée s’est peu à peu imposée pour aligner les intérêts, prendre des décisions collectives et faire évoluer le projet de façon transparente. + +## Les fondations de la DAO + +La création de la RealToken DAO a reposé sur plusieurs piliers : + +- **Une communauté active** : des détenteurs de tokens et des contributeurs déjà impliqués dans l’écosystème RealToken +- **Des objectifs communs** : développement des outils (RMM, YAM), intégration de nouveaux actifs, et renforcement des standards RWA +- **Un cadre de gouvernance** : mise en place de processus de proposition, de vote et d’exécution des décisions par la communauté + +La DAO est ainsi devenue l’entité qui incarne et structure cette gouvernance, tout en restant ouverte à toute personne souhaitant participer à l’avenir des actifs réels tokenisés. + +## Une organisation autonome et décentralisée + +En tant qu’organisation autonome décentralisée, la RealToken DAO fonctionne sans dépendre d’une autorité centrale unique. Les propositions sont soumises, débattues et adoptées par les détenteurs de droits de vote, selon les règles définies et acceptées par la communauté. La naissance de la DAO marque donc l’entrée de l’écosystème RealToken dans une phase où la gouvernance est véritablement entre les mains de ses participants. + +## Et après ? + +Depuis sa création, la DAO n’a cessé d’affiner son périmètre, ses processus et ses priorités. Comprendre ses origines permet de mieux saisir son rôle actuel et les enjeux des décisions à venir. Pour aller plus loin, vous pouvez consulter l’article sur [le périmètre de la DAO RealToken](/blog/perimetre-dao-realtoken). diff --git a/public/articles/fr/objectif-dao-realtoken.md b/public/articles/fr/objectif-dao-realtoken.md new file mode 100644 index 0000000..9481fd7 --- /dev/null +++ b/public/articles/fr/objectif-dao-realtoken.md @@ -0,0 +1,46 @@ +--- +title: "Quel est notre objectif ?" +date: "2024-04-01" +description: "Découvrez les objectifs et la vision de la RealToken DAO : démocratiser les actifs réels, renforcer la gouvernance et développer l'écosystème RWA" +tags: ["dao", "objectif", "vision", "écosystème", "gouvernance"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-dao-objectif.png" +--- + +# Quel est notre objectif ? + +La RealToken DAO ne se contente pas de gérer un écosystème — elle poursuit une vision claire : rendre les actifs réels accessibles, liquides et gouvernés par la communauté. Cet article détaille les objectifs qui guident nos décisions et nos actions au quotidien. + +## Une vision : démocratiser les actifs réels + +Notre objectif premier est de **démocratiser l'accès aux actifs réels** (RWA — Real World Assets). Concrètement, cela signifie : + +- **Accessibilité** : permettre à un plus grand nombre de participer à la tokenisation d'actifs immobiliers et autres actifs tangibles, sans barrières excessives +- **Liquidité** : faciliter l'achat, la vente et l'échange de tokens représentant des actifs réels, via des outils comme RMM (RealToken Money Market) et YAM (You And Me) +- **Transparence** : garantir que les règles, les données et les décisions soient compréhensibles et vérifiables par tous + +En résumé, nous visons un écosystème où la propriété d'actifs réels peut être partagée, échangée et gouvernée de manière décentralisée. + +## Renforcer la gouvernance communautaire + +Un second objectif majeur est de **renforcer la gouvernance communautaire**. La DAO ne doit pas dépendre d'un petit nombre d'acteurs : les détenteurs de droits de vote doivent pouvoir : + +- **Proposer** des évolutions (intégrations, outils, standards) +- **Débattre** et voter sur les orientations stratégiques et opérationnelles +- **Suivre** l'exécution des décisions et l'impact sur l'écosystème + +Notre objectif est donc que la gouvernance soit à la fois légitime, efficace et ouverte à toute la communauté RealToken. + +## Développer et sécuriser l'écosystème + +Enfin, nous nous donnons pour objectif de **développer et sécuriser l'écosystème** : + +- **Intégration de nouveaux actifs et partenaires** : élargir l'offre de tokens d'actifs réels tout en maintenant des critères de qualité et de conformité +- **Outils et standards** : maintenir et améliorer RMM, YAM et les protocoles techniques qui sous-tendent la tokenisation +- **Pérennité** : prendre des décisions qui assurent la durabilité du projet à long terme, dans l'intérêt des participants et des utilisateurs + +En définitive, notre objectif est de faire de la RealToken DAO le pilier d'un écosystème RWA robuste, ouvert et gouverné par ceux qui y participent. + +## En résumé + +Notre objectif se résume en trois axes : **démocratiser les actifs réels**, **renforcer la gouvernance communautaire** et **développer un écosystème durable**. Chaque proposition, chaque vote et chaque action de la DAO vise à avancer dans cette direction. Pour en savoir plus sur notre périmètre et notre histoire, consultez les articles sur [le périmètre de la DAO](/blog/perimetre-dao-realtoken) et [la naissance de la DAO](/blog/naissance-dao-realtoken). diff --git a/public/articles/fr/participation-gouvernance-realtoken-dao.md b/public/articles/fr/participation-gouvernance-realtoken-dao.md new file mode 100644 index 0000000..92ef1e0 --- /dev/null +++ b/public/articles/fr/participation-gouvernance-realtoken-dao.md @@ -0,0 +1,62 @@ +--- +title: "Comment participer à la gouvernance de la RealToken DAO ?" +date: "2026-02-20" +description: "Guide pratique pour devenir un membre actif de la RealToken DAO : obtenir des REG, rejoindre le forum, voter sur Tally et soumettre vos premières propositions" +tags: ["dao", "gouvernance", "reg", "participation", "guide"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-gouv.png" +--- + +# Comment participer à la gouvernance de la RealToken DAO ? + +La RealToken DAO appartient à ceux qui y participent. Mais comment passer du statut de simple observateur à celui de membre actif de la gouvernance ? Ce guide pratique vous explique les étapes concrètes pour contribuer aux décisions qui façonnent l'écosystème. + +## Étape 1 : Obtenir des tokens REG + +Le REG (RealToken Ecosystem Governance) est le token de gouvernance de la DAO. Détenir des REG, c'est détenir un droit de vote sur les orientations de l'écosystème. + +- **Via YAM** : La plateforme YAM (You And Me) permet d'acheter et d'échanger des REG directement entre membres de la communauté. +- **Via la contribution** : Des contributions actives à l'écosystème — développement, communication, animation — peuvent être récompensées en REG par décision de la DAO. + +Plus vous détenez de REG, plus votre poids dans les décisions collectives est important. + +## Étape 2 : Rejoindre le forum communautaire + +Avant de voter ou de proposer, l'étape indispensable est de **rejoindre le forum** (forum.realtoken.community). C'est là que toute la vie de la DAO se passe au quotidien : + +- **Discussions** : Chaque grande décision passe d'abord par une phase de débat ouverte à tous. +- **Propositions informelles** : Avant d'être soumise au vote on-chain, une idée est présentée sur le forum pour être affinée et soutenue. +- **Suivi des décisions** : Les résultats des votes et leur mise en œuvre y sont documentés et commentés en transparence. + +Participer aux discussions est l'une des formes les plus accessibles de contribution, même sans détenir de REG. + +## Étape 3 : Voter sur Tally + +Les votes officiels de la DAO se tiennent **on-chain via Tally** (tally.xyz/gov/realtoken-ecosystem-governance). C'est là que les décisions sont enregistrées de façon transparente et immuable sur la blockchain. + +- **Consulter les propositions actives** : Tally liste toutes les propositions en cours, avec leur description complète et les arguments pour et contre. +- **Déléguer son vote** : Si vous ne souhaitez pas suivre chaque proposition individuellement, vous pouvez déléguer votre pouvoir de vote à un membre de confiance de la communauté. +- **Voter directement** : Connectez votre wallet à Tally et exprimez votre voix. Chaque vote, même modeste en REG, contribue à la légitimité démocratique des décisions. + +## Étape 4 : Soumettre une proposition + +Vous avez une idée pour améliorer l'écosystème ? La DAO est ouverte aux initiatives de tous ses membres. Voici le processus type : + +1. **Discussion préliminaire sur le forum** : Présentez votre idée, recueillez les retours de la communauté et affinez votre proposition avant d'aller plus loin. +2. **Rédaction de la proposition formelle** : Une fois l'idée mature, rédigez une proposition structurée : contexte, objectif, budget si nécessaire, métriques de succès. +3. **Soumission on-chain via Tally** : La proposition peut ensuite être soumise au vote on-chain. Un minimum de REG est requis pour la soumettre directement. +4. **Vote et exécution** : Si la proposition est adoptée par la communauté, elle entre dans le cycle d'exécution de la DAO. + +## Les comités : s'impliquer sur le long terme + +La DAO s'organise également en **comités thématiques** (Sécurité, Marketing, Liquidité, Proposant, Pouvoir de vote, etc.) qui travaillent en profondeur sur des sujets spécifiques. Rejoindre un comité, c'est s'impliquer de façon régulière et construire une expertise reconnue par la communauté. + +Consultez la page [Comités](/committee) pour découvrir les groupes actifs et les modalités de participation. + +## En résumé + +Participer à la gouvernance de la RealToken DAO se fait en quatre temps : obtenir des REG, rejoindre le forum, voter sur Tally, et proposer vos propres initiatives. Chaque action, même modeste, renforce la légitimité et la vitalité de la DAO. + +La gouvernance décentralisée ne fonctionne que si la communauté s'implique. Votre participation est ce qui donne sa valeur et sa légitimité à la RealToken DAO. + +Pour aller plus loin, consultez les articles sur [les objectifs de la DAO](/blog/objectif-dao-realtoken) et [le périmètre de la DAO](/blog/perimetre-dao-realtoken). diff --git a/public/articles/fr/perimetre-dao-realtoken.md b/public/articles/fr/perimetre-dao-realtoken.md new file mode 100644 index 0000000..274d341 --- /dev/null +++ b/public/articles/fr/perimetre-dao-realtoken.md @@ -0,0 +1,69 @@ +--- +title: "Le périmètre de la DAO RealToken" +date: "2024-03-01" +description: "Découvrez le périmètre d'action, les responsabilités et les domaines d'intervention de la RealToken DAO" +tags: ["dao", "gouvernance", "écosystème"] +author: "Equipe Realtoken DAO" +imageHeader: "realtoken-scope.png" +--- + +# Le périmètre de la DAO RealToken + +La RealToken DAO est une organisation autonome décentralisée qui gère et développe l'écosystème de tokenisation d'actifs réels (RWA). Comprendre son périmètre d'action est essentiel pour participer efficacement à la gouvernance. + +## Qu'est-ce que le périmètre de la DAO ? + +Le périmètre de la DAO définit les domaines dans lesquels elle peut agir, prendre des décisions et allouer des ressources. Il délimite les responsabilités et les compétences de l'organisation décentralisée. + +## Domaines d'intervention + +### 1. Gestion de l'écosystème + +La DAO est responsable de la gestion globale de l'écosystème RealToken, incluant : + +- **Intégration de nouveaux partenaires** : Validation et intégration de nouveaux tokens d'actifs réels +- **Développement des outils** : Maintenance et amélioration de RMM (RealToken Money Market) et YAM (You And Me) +- **Standards et protocoles** : Définition des standards techniques pour la tokenisation d'actifs réels + +### 2. Gouvernance décentralisée + +La DAO gère la gouvernance communautaire à travers : + +- **Propositions de gouvernance** : Les détenteurs de tokens REG peuvent soumettre des propositions +- **Processus de vote** : Système de vote on-chain via Tally pour les décisions importantes +- **Allocation des ressources** : Gestion du trésor et allocation des fonds pour le développement + +### 3. Conformité et réglementation + +La DAO s'assure de la conformité réglementaire : + +- **Cadre juridique** : Maintien de la conformité SEC-ready +- **Assurances** : Gestion des partenariats d'assurance (Lloyd's) +- **Reporting** : Intégration avec les oracles Chainlink pour le reporting automatisé + +### 4. Développement communautaire + +La DAO favorise le développement de la communauté : + +- **Documentation** : Maintien du Wiki et de la documentation technique +- **Formation** : Ressources éducatives sur la tokenisation d'actifs réels +- **Communication** : Gestion des canaux de communication et du forum communautaire + +## Limites du périmètre + +La DAO ne gère **pas directement** : + +- Les actifs immobiliers sous-jacents (gérés par les partenaires) +- Les transactions individuelles de tokens (gérées par les utilisateurs) +- Les décisions d'investissement personnelles des membres + +## Comment participer ? + +1. **Obtenez des tokens REG** : Participez à la gouvernance en détenant des tokens REG +2. **Rejoignez le forum** : Participez aux discussions et propositions +3. **Votez sur Tally** : Exprimez votre voix sur les décisions importantes +4. **Soumettez des propositions** : Proposez de nouvelles initiatives pour l'écosystème + +--- + +*La RealToken DAO est un écosystème en constante évolution. Votre participation façonne son avenir !* diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..8cb7230 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/logo-v3-orange.svg b/public/logo-v3-orange.svg new file mode 100644 index 0000000..1069d92 --- /dev/null +++ b/public/logo-v3-orange.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/reg-whitepaper-fr.pdf b/public/reg-whitepaper-fr.pdf new file mode 100644 index 0000000..308a7c7 Binary files /dev/null and b/public/reg-whitepaper-fr.pdf differ diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..ffa67a9 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,84 @@ + + + + https://realtoken.community/ + 1.0 + weekly + + + https://realtoken.community/ressource/blog + 0.9 + weekly + + + https://realtoken.community/ressource/faq + 0.8 + monthly + + + https://realtoken.community/governance/committee + 0.8 + monthly + + + https://realtoken.community/applications/application-hub + 0.8 + monthly + + + https://realtoken.community/governance/reg + 0.8 + monthly + + + https://realtoken.community/partners + 0.7 + monthly + + + https://realtoken.community/privacy + 0.5 + yearly + + + https://realtoken.community/legal-notice + 0.5 + yearly + + + https://realtoken.community/ressource/blog/realtoken-dao-realt-relationship + 2024-05-01 + 0.7 + monthly + + + https://realtoken.community/ressource/blog/realtoken-dao-objectives + 2024-04-01 + 0.7 + monthly + + + https://realtoken.community/ressource/blog/birth-of-realtoken-dao + 2024-02-01 + 0.7 + monthly + + + https://realtoken.community/ressource/blog/realtoken-dao-scope + 2024-03-01 + 0.7 + monthly + + + https://realtoken.community/ressource/blog/realtoken-dao-governance-participation + 2026-02-20 + 0.7 + monthly + + + https://realtoken.community/ressource/blog/future-rwa-community-roadmap-diversification + 2026-03-12 + 0.7 + monthly + + diff --git a/scripts/check-app-links.js b/scripts/check-app-links.js new file mode 100644 index 0000000..95e7036 --- /dev/null +++ b/scripts/check-app-links.js @@ -0,0 +1,139 @@ +/** + * Vérifie les URLs de l'Application Hub et génère un fichier de statut. + * Les liens non accessibles (hors 2xx/3xx) pourront être masqués côté front. + */ +import { readFileSync, writeFileSync, mkdirSync } from 'node:fs' +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const rootDir = join(__dirname, '..') +const frLocalePath = join(rootDir, 'src', 'locales', 'fr.json') +const outPath = join(rootDir, 'public', 'app-links-status.json') + +const timeoutMs = 20000 +const maxRetries = 2 +const GET_ONLY_DOMAINS = new Set([ + 'dune.com', + 'www.dune.com' +]) +const SOFT_ALLOW_RULES = [ + { domain: 'dune.com', status: 403 }, + { domain: 'www.dune.com', status: 403 } +] + +function readJson(path) { + return JSON.parse(readFileSync(path, 'utf-8')) +} + +function collectUrls(localeJson) { + const sections = localeJson?.liensUtiles?.sections || {} + const urls = new Set() + + for (const section of Object.values(sections)) { + if (section?.main?.href) urls.add(section.main.href) + for (const tool of section?.tools || []) { + if (tool?.href) urls.add(tool.href) + } + } + return [...urls] +} + +/** + * Returns true when a non-2xx/3xx status is accepted for display. + */ +function isSoftAllowed(hostname, status) { + return SOFT_ALLOW_RULES.some((rule) => rule.domain === hostname && rule.status === status) +} + +async function checkUrl(url) { + // Return detailed health for one URL (status code + error). + async function runAttempt() { + const controller = new AbortController() + const timer = setTimeout(() => controller.abort(), timeoutMs) + + try { + const hostname = new URL(url).hostname.toLowerCase() + const forceGet = GET_ONLY_DOMAINS.has(hostname) + // HEAD par defaut pour limiter la charge ; GET direct pour domaines connus. + let method = forceGet ? 'GET' : 'HEAD' + let response = await fetch(url, { + method, + redirect: 'follow', + signal: controller.signal + }) + + if (!forceGet && (response.status === 405 || response.status === 501)) { + method = 'GET' + response = await fetch(url, { + method: 'GET', + redirect: 'follow', + signal: controller.signal + }) + } + + const ok = response.status >= 200 && response.status < 400 + const softAllowed = isSoftAllowed(hostname, response.status) + return { + ok, + visible: ok || softAllowed, + softAllowed, + status: response.status, + method, + error: null + } + } catch (error) { + return { + ok: false, + visible: false, + softAllowed: false, + status: null, + method: null, + error: error?.name === 'AbortError' ? `timeout (${timeoutMs}ms)` : (error?.message || 'network error') + } + } finally { + clearTimeout(timer) + } + } + + let lastResult = await runAttempt() + if (lastResult.ok || lastResult.visible || (lastResult.status !== null && lastResult.status < 500)) { + return lastResult + } + + // Retry transient failures (timeout/network/5xx) before marking KO. + for (let i = 0; i < maxRetries; i += 1) { + // eslint-disable-next-line no-await-in-loop + const retryResult = await runAttempt() + if (retryResult.ok || retryResult.visible || (retryResult.status !== null && retryResult.status < 500)) { + return retryResult + } + lastResult = retryResult + } + + return lastResult +} + +async function main() { + // Generate a full Application Hub link-status report. + const frJson = readJson(frLocalePath) + const urls = collectUrls(frJson) + const links = [] + + for (const url of urls) { + // eslint-disable-next-line no-await-in-loop + const result = await checkUrl(url) + links.push({ url, ...result }) + } + + mkdirSync(dirname(outPath), { recursive: true }) + const output = { + checkedAt: new Date().toISOString(), + total: links.length, + links + } + writeFileSync(outPath, JSON.stringify(output, null, 2) + '\n', 'utf-8') + console.log(`app-links-status.json generated (${urls.length} links checked)`) +} + +main() diff --git a/scripts/generate-sitemap.js b/scripts/generate-sitemap.js new file mode 100644 index 0000000..bcd432e --- /dev/null +++ b/scripts/generate-sitemap.js @@ -0,0 +1,74 @@ +/** + * Génère sitemap.xml à partir des routes du site et des articles de blog. + * Exécuté automatiquement avant chaque build (npm run build). + * Pour régénérer à la main : node scripts/generate-sitemap.js + * + * Variables d'environnement optionnelles : + * SITEMAP_BASE_URL ou VITE_SITE_URL → URL de base du site (ex. https://realtoken.community) + */ + +import { readFileSync, writeFileSync, existsSync } from 'node:fs' +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' +import { englishSlugs } from '../src/data/blog-slugs.js' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const rootDir = join(__dirname, '..') +const publicDir = join(rootDir, 'public') +const articlesDir = join(publicDir, 'articles', 'en') + +const baseUrl = (process.env.SITEMAP_BASE_URL || process.env.VITE_SITE_URL || 'https://realtoken.community').replace(/\/$/, '') + +// Routes statiques (URLs en anglais) +const staticRoutes = [ + { path: '', priority: '1.0', changefreq: 'weekly' }, + { path: 'ressource/blog', priority: '0.9', changefreq: 'weekly' }, + { path: 'ressource/faq', priority: '0.8', changefreq: 'monthly' }, + { path: 'governance/committee', priority: '0.8', changefreq: 'monthly' }, + { path: 'applications/application-hub', priority: '0.8', changefreq: 'monthly' }, + { path: 'governance/reg', priority: '0.8', changefreq: 'monthly' }, + { path: 'partners', priority: '0.7', changefreq: 'monthly' }, + { path: 'privacy', priority: '0.5', changefreq: 'yearly' }, + { path: 'legal-notice', priority: '0.5', changefreq: 'yearly' } +] + +function extractDateFromFrontmatter(filePath) { + if (!existsSync(filePath)) return null + try { + const content = readFileSync(filePath, 'utf-8') + const match = content.match(/^---\s*\n([\s\S]*?)\n---/) + if (!match) return null + const dateLine = match[1].split('\n').find((l) => l.startsWith('date:')) + if (!dateLine) return null + const value = dateLine.replace(/^date:\s*/, '').trim().replace(/^["']|["']$/g, '') + const d = new Date(value) + return isNaN(d.getTime()) ? null : d.toISOString().slice(0, 10) + } catch { + return null + } +} + +function urlNode(path, lastmod = null, priority = '0.8', changefreq = 'monthly') { + const loc = path ? `${baseUrl}/${path}` : baseUrl + '/' + const lastmodLine = lastmod ? ` ${lastmod}\n` : '' + return ` \n ${loc}\n${lastmodLine} ${priority}\n ${changefreq}\n \n` +} + +let xml = '\n' +xml += '\n' + +for (const r of staticRoutes) { + xml += urlNode(r.path, null, r.priority, r.changefreq) +} + +for (const slug of englishSlugs) { + const mdPath = join(articlesDir, `${slug}.md`) + const lastmod = extractDateFromFrontmatter(mdPath) + xml += urlNode(`ressource/blog/${slug}`, lastmod, '0.7', 'monthly') +} + +xml += '\n' + +const outPath = join(publicDir, 'sitemap.xml') +writeFileSync(outPath, xml, 'utf-8') +console.log('sitemap.xml generated at', outPath) diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..3db48da --- /dev/null +++ b/src/App.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/assets/logo-v3-orange.png b/src/assets/logo-v3-orange.png new file mode 100644 index 0000000..867d7aa Binary files /dev/null and b/src/assets/logo-v3-orange.png differ diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..e3b880b --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1 @@ +@import './scss/main.scss'; diff --git a/src/assets/scss/_typography.scss b/src/assets/scss/_typography.scss new file mode 100644 index 0000000..a80c71d --- /dev/null +++ b/src/assets/scss/_typography.scss @@ -0,0 +1,129 @@ +// ============================================ +// TYPOGRAPHIE +// ============================================ + +@use 'variables' as *; + +@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;600;700&display=swap'); + +// Styles de base +body { + font-family: $font-family-primary; + font-size: $font-size-base; + line-height: $line-height-base; + color: $color-text; + font-weight: $font-weight-normal; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Titres +h1 { + font-size: $font-size-h1; + font-weight: $font-weight-bold; + line-height: $line-height-tight; + color: $color-white; + margin: 0; +} + +h2 { + font-size: $font-size-h2; + font-weight: $font-weight-semibold; + line-height: $line-height-tight; + color: $color-white; + margin: 0; +} + +h3 { + font-size: $font-size-h3; + font-weight: $font-weight-medium; + line-height: $line-height-base; + color: $color-white; + margin: 0; +} + +h4 { + font-size: $font-size-h4; + font-weight: $font-weight-medium; + line-height: $line-height-base; + color: $color-white; + margin: 0; +} + +// Textes +p { + font-size: $font-size-md; + line-height: $line-height-base; + color: $color-text; + margin: 0; +} + +// Classes utilitaires de taille +.text-xs { + font-size: $font-size-xs; +} + +.text-sm { + font-size: $font-size-sm; +} + +.text-base { + font-size: $font-size-base-rem; +} + +.text-md { + font-size: $font-size-md; +} + +.text-lg { + font-size: $font-size-lg; +} + +.text-xl { + font-size: $font-size-xl; +} + +// Classes utilitaires de poids +.font-normal { + font-weight: $font-weight-normal; +} + +.font-medium { + font-weight: $font-weight-medium; +} + +.font-semibold { + font-weight: $font-weight-semibold; +} + +.font-bold { + font-weight: $font-weight-bold; +} + +// Classes utilitaires de transformation +.uppercase { + text-transform: uppercase; +} + +.lowercase { + text-transform: lowercase; +} + +.capitalize { + text-transform: capitalize; +} + +// Classes utilitaires d'espacement des lettres +.tracking-tight { + letter-spacing: $letter-spacing-tight; +} + +.tracking-normal { + letter-spacing: $letter-spacing-normal; +} + +.tracking-wide { + letter-spacing: $letter-spacing-wide; +} + diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss new file mode 100644 index 0000000..7a2bf86 --- /dev/null +++ b/src/assets/scss/_variables.scss @@ -0,0 +1,84 @@ +// ============================================ +// CHARTE GRAPHIQUE REALTKEN WEBSITE +// ============================================ + +// --- COULEURS --- +$color-navy: #0a1f44; +$color-navy-dark: #050f24; +$color-orange: #ff8c42; +$color-orange-light: #ffb97a; +$color-cream: #f6f3ef; +$color-muted: rgba(255, 255, 255, 0.75); +$color-border: rgba(255, 255, 255, 0.12); +$color-text: #e8edf7; +$color-white: #ffffff; + +// Variables CSS pour compatibilité +:root { + --color-navy: #{$color-navy}; + --color-navy-dark: #{$color-navy-dark}; + --color-orange: #{$color-orange}; + --color-orange-light: #{$color-orange-light}; + --color-cream: #{$color-cream}; + --color-muted: #{$color-muted}; + --color-border: #{$color-border}; + --color-text: #{$color-text}; + --color-white: #{$color-white}; +} + +// --- POLICES --- +$font-family-primary: 'Raleway', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; +$font-family-fallback: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + +// Poids de police +$font-weight-normal: 400; +$font-weight-medium: 500; +$font-weight-semibold: 600; +$font-weight-bold: 700; + +// --- TAILLES DE POLICE --- +// Base +$font-size-base: 16px; + +// Tailles de texte +$font-size-xs: 0.75rem; // 12px +$font-size-sm: 0.85rem; // 13.6px +$font-size-base-rem: 0.95rem; // 15.2px +$font-size-md: 1rem; // 16px +$font-size-lg: 1.1rem; // 17.6px +$font-size-xl: 1.2rem; // 19.2px + +// Tailles de titres +$font-size-h1: clamp(2.8rem, 5vw, 4.5rem); // Responsive: 44.8px - 72px +$font-size-h2: clamp(2rem, 3vw, 3rem); // Responsive: 32px - 48px +$font-size-h3: 1.2rem; // 19.2px +$font-size-h4: 1rem; // 16px + +// Tailles spéciales +$font-size-display: 2.5rem; // 40px +$font-size-stat: 2rem; // 32px + +// --- ESPACEMENTS --- +$section-gap: 120px; +$spacing-xs: 8px; +$spacing-sm: 12px; +$spacing-md: 16px; +$spacing-lg: 24px; +$spacing-xl: 32px; +$spacing-xxl: 48px; +$spacing-xxxl: 64px; + +// --- AUTRES --- +$border-radius-sm: 8px; +$border-radius-md: 12px; +$border-radius-lg: 24px; +$border-radius-full: 999px; + +$letter-spacing-tight: 0.04em; +$letter-spacing-normal: 0.08em; +$letter-spacing-wide: 0.2em; + +$line-height-base: 1.6; +$line-height-tight: 1.4; +$line-height-loose: 1.8; + diff --git a/src/assets/scss/main.scss b/src/assets/scss/main.scss new file mode 100644 index 0000000..08ef6b1 --- /dev/null +++ b/src/assets/scss/main.scss @@ -0,0 +1,37 @@ +// ============================================ +// FICHIER PRINCIPAL SCSS +// ============================================ + +@use 'variables' as *; +@use 'typography'; + +// Reset et styles de base +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + background: $color-navy-dark; +} + +#app { + width: 100%; + min-height: 100vh; + margin: 0; + padding: 0; +} + +a { + color: inherit; + text-decoration: none; +} + +button { + font-family: inherit; +} + diff --git a/src/components/Footer.vue b/src/components/Footer.vue new file mode 100644 index 0000000..9b92244 --- /dev/null +++ b/src/components/Footer.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..eff59f1 --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/LanguageSelector.vue b/src/components/LanguageSelector.vue new file mode 100644 index 0000000..39147f4 --- /dev/null +++ b/src/components/LanguageSelector.vue @@ -0,0 +1,74 @@ + + + + + + diff --git a/src/components/Navigation.vue b/src/components/Navigation.vue new file mode 100644 index 0000000..974603e --- /dev/null +++ b/src/components/Navigation.vue @@ -0,0 +1,614 @@ + + + + + diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue new file mode 100644 index 0000000..68a970a --- /dev/null +++ b/src/components/TheWelcome.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue new file mode 100644 index 0000000..6d7086a --- /dev/null +++ b/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/blog/ArticleCard.vue b/src/components/blog/ArticleCard.vue new file mode 100644 index 0000000..b33375a --- /dev/null +++ b/src/components/blog/ArticleCard.vue @@ -0,0 +1,133 @@ + + + + + + diff --git a/src/components/blog/LatestArticles.vue b/src/components/blog/LatestArticles.vue new file mode 100644 index 0000000..4e13e7b --- /dev/null +++ b/src/components/blog/LatestArticles.vue @@ -0,0 +1,223 @@ + + + + + + diff --git a/src/components/icons/ComiteLiquidity.vue b/src/components/icons/ComiteLiquidity.vue new file mode 100644 index 0000000..6a6355c --- /dev/null +++ b/src/components/icons/ComiteLiquidity.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/ComiteMarketing.vue b/src/components/icons/ComiteMarketing.vue new file mode 100644 index 0000000..4e1a049 --- /dev/null +++ b/src/components/icons/ComiteMarketing.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/ComiteProposer.vue b/src/components/icons/ComiteProposer.vue new file mode 100644 index 0000000..3306de6 --- /dev/null +++ b/src/components/icons/ComiteProposer.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/ComiteSecurity.vue b/src/components/icons/ComiteSecurity.vue new file mode 100644 index 0000000..9782cce --- /dev/null +++ b/src/components/icons/ComiteSecurity.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/ComiteVoting.vue b/src/components/icons/ComiteVoting.vue new file mode 100644 index 0000000..4206543 --- /dev/null +++ b/src/components/icons/ComiteVoting.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/src/data/blog-slugs.js b/src/data/blog-slugs.js new file mode 100644 index 0000000..ee0ad00 --- /dev/null +++ b/src/data/blog-slugs.js @@ -0,0 +1,13 @@ +/** + * Slugs canoniques des articles de blog (URLs toujours en anglais). + * Utilisé par blog.js et par scripts/generate-sitemap.js (sans dépendance à markdown-it). + * Quand vous ajoutez un article : ajoutez son slug ici et dans slugEquivalents dans blog.js. + */ +export const englishSlugs = [ + 'realtoken-dao-realt-relationship', + 'realtoken-dao-objectives', + 'birth-of-realtoken-dao', + 'realtoken-dao-scope', + 'realtoken-dao-governance-participation', + 'future-rwa-community-roadmap-diversification' +] diff --git a/src/i18n.js b/src/i18n.js new file mode 100644 index 0000000..00635f0 --- /dev/null +++ b/src/i18n.js @@ -0,0 +1,16 @@ +import { createI18n } from 'vue-i18n' +import fr from './locales/fr.json' +import en from './locales/en.json' + +const i18n = createI18n({ + legacy: false, + locale: localStorage.getItem('locale') || 'en', + fallbackLocale: 'en', + messages: { + fr, + en + } +}) + +export default i18n + diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 0000000..fe2b39b --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,463 @@ +{ + "nav": { + "application": "Application", + "ressources": "Resources", + "governance": "Governance", + "blog": "Blog", + "contact": "Contact us", + "menu": { + "applications": "Applications", + "applicationsRmm": "RMM", + "applicationsYam": "YAM", + "applicationsBridge": "Bridge", + "applicationsDashboard": "Realtoken Dashboard", + "applicationsWallet": "RealToken Wallet", + "projetsRwa": "RWA Projects", + "projetsRwaRealt": "RealT", + "governance": "Governance", + "governanceTally": "Tally (vote)", + "governanceReg": "The REG", + "governanceComites": "Committees", + "governanceForum": "Forum", + "resources": "Resources", + "resourcesFaq": "FAQ", + "resourcesWiki": "Wiki", + "resourcesBlog": "Blog", + "resourcesLiensUtiles": "Application Hub" + } + }, + "hero": { + "tag": "On-chain real asset tokenization", + "title": "Build together a", + "titleSpan": "decentralized RWA ecosystem", + "lead": "RealToken DAO is a decentralized ecosystem that integrates all your real-world asset tokens such as real estate, factoring, or debt, by collaborating with different partners to decentralize the management of real-world assets.", + "ctaDashboard": "Discover the vision", + "ctaVision": "Token economy", + "trustSec": "Decentralized governance", + "trustSecDesc": "", + "trustLloyds": "Real assets (RWA)", + "trustLloydsDesc": "", + "trustChainlink": "24/7 liquidity", + "trustChainlinkDesc": "" + }, + "about": { + "tag": "About", + "title": "Real asset tokenization: liquidity, exchange, available, accessible.", + "description": "RealToken DAO transforms access to real-world assets by making them accessible, tradable and available 24/7. Each token represents a verifiable share of a portfolio of real assets, with instant liquidity and decentralized governance.", + "features": { + "liquidity": { + "title": "Liquidity", + "description": "Access tokenized real-world assets, tradable 24/7 on decentralized markets." + }, + "exchange": { + "title": "Exchange", + "description": "Trade your RealToken tokens transparently and securely on the ecosystem." + }, + "available": { + "title": "Available", + "description": "Real assets accessible to all, fractionalized into verifiable digital shares." + }, + "accessible": { + "title": "Accessible", + "description": "Access premium real-world assets without traditional barriers or intermediaries." + } + } + }, + "application": { + "tag": "Application", + "title": "RealToken ecosystem tools.", + "openApp": "Go to application", + "rmm": { + "title": "RMM", + "description": "RealToken Money Market - Lending and borrowing protocol to borrow stablecoins against RWA assets, based on the Aave platform and adapted to RWA market needs." + }, + "yam": { + "title": "YAM", + "description": "You and Me - Peer-to-peer secondary market with creation of buy and sell offers, adapted to RWA market needs." + }, + "dex": { + "title": "DEX (soon)", + "description": "A decentralised exchange platform to further improve liquidity for real-world assets." + }, + "nft": { + "title": "NFT (soon)", + "description": "These NFTs will be used to distribute the REG supply based on each participant's actions and contributions to the ecosystem." + } + }, + "daoRole": { + "tag": "Role and scope", + "title": "The DAO's role", + "role1": { + "title": "RealToken management in DeFi", + "description": "Manage RealTokens within our applications (RMM, YAM, Bridge, Dashboard) to provide liquidity, trading and decentralized services to the ecosystem." + }, + "role2": { + "title": "Ecosystem development", + "description": "Allocate treasury funds to develop the ecosystem: applications, liquidity, security, new features and infrastructure." + }, + "role3": { + "title": "Coordination and technology sharing", + "description": "Coordinate services and partners, and make our technology available for real-world asset tokenization at large." + } + }, + "governance": { + "tag": "Governance", + "title": "Decentralized governance for the community.", + "protocol": { + "title": "Decentralized protocol", + "description": "Transparent community governance where every REG holder can participate in important decisions.", + "link": "View REG on CoinGecko" + }, + "forum": { + "title": "Forum", + "description": "Discussion and proposal space for the RealToken DAO community.", + "link": "Go to forum" + }, + "tally": { + "title": "Tally (vote)", + "description": "On-chain voting platform for governance proposals and DAO decisions.", + "link": "Go to Tally" + } + }, + "process": { + "tag": "How it works", + "title": "Join the RealToken ecosystem in three steps.", + "step1": { + "title": "Buy tokens from a partner", + "text": "Acquire your RealToken tokens from our certified partners and join the ecosystem." + }, + "step2": { + "title": "Tokens available in the ecosystem (RMM, YAM)", + "text": "Your tokens are immediately available on RMM for trading and YAM for portfolio management." + }, + "step3": { + "title": "Get a REG token and participate in governance", + "text": "Receive your REG tokens to actively participate in decentralized governance. Coming soon: NFTs to improve decentralized governance." + } + }, + "stats": { + "tag": "Proof", + "title": "Verifiable indicators, in real time.", + "assets": "Total value of partner assets in the ecosystem", + "members": "Ecosystem members", + "regMarketcap": "REG marketcap", + "votes": "Number of votes on Tally", + "comingSoon": "Coming soon", + "inProgress": "In progress" + }, + "cta": { + "tag": "Partners", + "title": "Integrate your token and shape the future of the RealToken ecosystem.", + "description": "Join the RealToken ecosystem as a partner. Integrate your tokens and benefit from the liquidity, governance and DAO infrastructure to develop your project.", + "buttonPartner": "Become a partner", + "buttonLearn": "Learn more" + }, + "partenaires": { + "tag": "Partners", + "pageTitle": "Become a partner", + "pageDescription": "Integrate your token into the RealToken ecosystem and benefit from our market, lending and real asset tokenization infrastructure.", + "intro": "This page is for projects that want to join the RealToken ecosystem. Below are our acceptance criteria and what we offer.", + "criteriaTitle": "Acceptance criteria", + "criteriaDesc": "To join our ecosystem, your project must meet the following criterion:", + "criteriaBadge": "Required", + "criteriaText": "ERC-20 token: your asset or project must be represented by a token compliant with the ERC-20 standard on Ethereum or a compatible chain (e.g. Gnosis Chain). We have a partner who can represent your assets on the blockchain as tokens.", + "offerTitle": "What we offer", + "offerDesc": "As a partner, you can benefit from the following infrastructure:", + "offer1": "YAM: secondary market platform for peer-to-peer token trading, with creation of buy and sell offers.", + "offer2": "RMM: a lending and borrowing platform to use real assets as collateral and borrow stablecoins in exchange.", + "offer3": "A DEX (soon), which will improve overall liquidity for real-world assets.", + "offer4": "Thanks to our partner, we can support you through the real asset tokenization process to represent your assets on the blockchain.", + "seekTitle": "What we are looking for", + "seekIntro": "We are open to all types of real-world assets. We are notably looking for:", + "seekList": "Partners in bonds / fixed income\nPartners in patent tokenization\nPartners in music rights tokenization\nPartners in energy tokenization (nuclear, solar, etc.)\nPartners in tokenization of all types of real estate", + "ctaText": "Want to become a partner? Contact us to discuss your project.", + "ctaButton": "Contact us" + }, + "logo": { + "name": "RealToken DAO", + "subtitle": "DeFi for Real-World Assets" + }, + "comite": { + "tag": "Governance", + "pageTitle": "Committees", + "pageDescription": "The DAO is organized into committees to progressively delegate responsibilities to the community.", + "members": "Members", + "telegram": "Join Telegram", + "committees": { + "proposer": { + "title": "Proposer", + "description": "To help establish: proposals on the Forum and corresponding votes on Tally (onChain).", + "members": "Sigri, DRKTT and PhilP" + }, + "security": { + "title": "Security Committee", + "description": "To ensure the security of the DAO protocols (at minimum, intervene in emergencies to stop a protocol).", + "members": "Benoist-Not-for-sale, Cogatos, Sigri, EzSwim, JoeD" + }, + "votingPower": { + "title": "Voting Power Working Group", + "description": "To study and propose new versions of the Voting Power calculation algorithm based on REG holdings.", + "members": "Taodiem, Paul, PhilP, Yohann76, Eric, Battistu, DRKTT, Stouban, Teugos" + }, + "liquidity": { + "title": "Liquidity Management Committee", + "description": "To manage the liquidity strategy implemented via RIP00003, and to study and propose new liquidity management strategies.", + "members": "Teugos, PhilP" + }, + "marketing": { + "title": "Marketing and Communication Committee", + "description": "To study and propose marketing and communication actions to increase visibility and engagement within the Realtoken ecosystem.", + "members": "0xEzSwim, Yohann76, Paul, Virtual Madness, Teugos" + } + } + }, + "faq": { + "tag": "FAQ", + "pageTitle": "Frequently asked questions", + "pageDescription": "Find answers to the most common questions about the RealToken ecosystem.", + "items": { + "q1": { + "question": "What is the RealToken DAO?", + "answer": "The RealToken DAO is a decentralized autonomous organization (DAO) dedicated to the tokenization of real-world assets (RWA), such as real estate but also art or infrastructure. It allows its members to participate in governance, invest in fractional assets, and contribute to a transparent and decentralized ecosystem." + }, + "q2": { + "question": "What is the link between RealToken and RealT?", + "answer": "RealToken and RealT belong to the same real-world asset tokenization ecosystem, with distinct roles. RealT focuses on creating and managing the underlying assets (real estate tokens, issuance, compliance). The RealToken DAO focuses on the technological ecosystem and DeFi: tools (RMM, YAM, Bridge), community governance, and decisions on protocols, integrations, and allocations. In short: RealT manages the tokenized assets; the RealToken DAO manages the ecosystem's infrastructure and governance." + }, + "q3": { + "question": "How can I participate in the DAO?", + "answer": "• Forum: join the forum to debate, follow decisions, and propose ideas (no token required). To submit a proposal, discuss your idea on the forum first, then draft a formal proposal.\n• REG: REG (governance token) can be obtained on exchange platforms such as 1inch or via YAM. REG is also distributed based on participation in partner tokens. Active participation in the ecosystem (development, communication, etc.) can also be rewarded in REG. REG gives you voting power.\n• Tally: on Tally, connect your wallet to review proposals, vote, or delegate your vote." + }, + "q4": { + "question": "What is an RWA (Real World Asset)?", + "answer": "An RWA is a real-world asset (e.g. an apartment, a work of art) represented as a token on a blockchain. This allows:\n• Fractional ownership (e.g. buying 10% of a building).\n• Easier trading (24/7 liquidity).\n• Automated management (rent, dividends) via smart contracts." + }, + "q5": { + "question": "How are decisions made in the DAO?", + "answer": "Decisions are made through a decentralized voting process:\n• A member submits a proposal.\n• The community discusses on the forum and finalizes the proposal.\n• The vote is created on Tally.\n• REG token holders vote.\n• The proposal is implemented if the quorum is reached." + }, + "q6": { + "question": "What are the risks associated with RWA and the DAO?", + "answer": "• Volatility: token values can fluctuate.\n• Regulation: legal frameworks evolve (e.g. tax, compliance).\n• Technology: bugs in smart contracts (hence the importance of audits).\n• Governance: risk of concentration of power if a few members hold many tokens.\n• Advice: diversify your investments and follow DAO updates." + }, + "q7": { + "question": "How can I propose a project or idea to the DAO?", + "answer": "• Discuss the idea on Telegram first to assess relevance and feasibility.\n• Join the forum and write a proposal with: a clear title; a detailed description (objectives, budget, timeline). See the template.\n• Submit the proposal for a vote via Tally." + }, + "q8": { + "question": "Where can I find help or ask questions?", + "answer": "• Telegram: the community is welcoming; post in the language of your choice and we'll help you.\n• Forum: for more thought-out questions and discussions.\n• By email (marketing{'@'}realtoken.community): for partnership requests or any other inquiry." + }, + "q9": { + "question": "Is the DAO open to crypto beginners?", + "answer": "Yes! RealToken aims to democratize access to RWA. Resources are available: beginner's guide (blog articles), community (experienced members help newcomers on Telegram)." + } + } + }, + "reg": { + "tag": "Governance", + "pageTitle": "The REG", + "pageDescription": "RealToken Ecosystem Governance (REG) is the governance token of the RealToken ecosystem. Discover key information and download the whitepaper.", + "staticDescription": "The REG (RealToken Ecosystem Governance) is the governance token for the RealToken ecosystem, created by RealT.co.", + "loading": "Loading REG data…", + "error": "Unable to load data from CoinGecko.", + "price": "Price", + "marketCap": "Market cap", + "volume24h": "24h volume", + "circulatingSupply": "Circulating supply", + "whitepaperTitle": "Whitepaper", + "whitepaperDescription": "Download the REG whitepaper (French version) to learn more about the token's economy and governance.", + "downloadWhitepaper": "Download whitepaper (PDF)" + }, + "liensUtiles": { + "tag": "Applications", + "pageTitle": "Application Hub", + "pageDescription": "Applications, documentation and resources of the RealToken ecosystem.", + "openApp": "Open app", + "managedBy": { + "realt": "Managed by RealT", + "dao": "Managed by the DAO", + "daoRealt": "Managed by the DAO & RealT", + "community": "Community initiative" + }, + "whoManages": { + "tag": "Application Hub", + "title": "Who manages these applications?", + "dao": { + "title": "Managed by the DAO", + "description": "Applications and tools developed and maintained by the DAO. The community pilots the roadmap and resources through REG votes. One condition: the DAO must have possession of the code (repository: GitHub RealToken Community).", + "domainLabel": "Domain: realtoken.community" + }, + "realt": { + "title": "Managed by RealT", + "description": "Some applications are managed by RealT because the ecosystem is in the process of decentralization. From a legal standpoint, some applications still require a centralized entity to operate them.", + "domainLabel": "Domain: realtoken.network" + }, + "community": { + "title": "Community initiative", + "description": "Projects and tools created by community members or third parties, outside the DAO. They are maintained by third parties, with no formal link or guarantee of ongoing support, but can still be useful to the ecosystem.", + "domainLabel": "Domain: Free" + } + }, + "communitySection": { + "tag": "Resources", + "title": "Community initiatives", + "disclaimer": "The applications below are third-party projects, not managed or endorsed by the DAO. They are maintained by community members or third parties. Useful to the ecosystem but with no guarantee of ongoing support." + }, + "statusNote": { + "prefix": "Visible links are only valid and reachable links. See details on the", + "linkLabel": "status page" + }, + "dashboardRealtokensDesc": "Mobile app, API and RealToken tools.", + "sections": { + "rmm": { + "tag": "RMM", + "title": "RMM", + "main": { + "title": "RMM", + "description": "Use your RealTokens as collateral to borrow in return.", + "href": "https://rmm.realtoken.network/", + "linkText": "Open RMM", + "managedBy": "daoRealt" + }, + "tools": [ + { "title": "Rent to Repay", "description": "Automate debt repayment when receiving rent.", "href": "https://github.com/RealToken-Community/DEVCONTEST-rent2repay", "managedBy": "dao" }, + { "title": "RMM Analytics – Gain or Loss", "description": "Analyze interest earned or paid by a wallet on RMM.", "href": "https://analytics.rmm.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – RMM liquidity notifications", "description": "Get notified when liquidity is available on RMM.", "href": "https://t.me/rmm_available_liquidity", "managedBy": "community" }, + { "title": "Dune RMM Dashboard", "description": "RMM analytics and dashboards on Dune.", "href": "https://dune.com/sigri44/realtoken-rmm", "managedBy": "community" }, + { "title": "Scappa", "description": "Find the best offers to repay or exit RMM.", "href": "https://scappa.battistu.com/", "managedBy": "community" } + ] + }, + "yam": { + "tag": "YAM", + "title": "YAM", + "main": { + "title": "YAM", + "description": "Buy and sell RealTokens peer-to-peer.", + "href": "https://yam.realtoken.network", + "linkText": "Open YAM", + "managedBy": "daoRealt" + }, + "tools": [ + { "title": "YAM Transaction Report Generator", "description": "Generate a PDF of all your transactions over a given period.", "href": "https://yam-report.realtoken.community/", "managedBy": "dao" }, + { "title": "YAM Offer Viewer by ID", "description": "Alternative to main YAM to buy an offer directly by ID.", "href": "https://offer-view.yam.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – YAM Sale Notify Bot", "description": "Get notified when one of your offers published on YAM is sold.", "href": "https://t.me/yam_sale_notify_bot", "managedBy": "dao" } + ] + }, + "realtokens": { + "tag": "Realtokens", + "title": "Realtokens", + "tools": [ + { "title": "Bridge", "description": "Transfer RealTokens/REG between chains (L2, etc.).", "href": "https://bridge.realtoken.network/", "managedBy": "realt" }, + { "title": "Realtoken Dashboard", "description": "RealToken dashboard: overview of assets and the ecosystem.", "href": "https://dashboard.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Asset Tracker", "description": "Mobile app to track your RealToken assets.", "href": "https://mobile.realtoken.community/", "managedBy": "dao" }, + { "title": "Shareholder Vote – Assets", "description": "Vote on RealToken assets (shareholder votes).", "href": "https://vote.realtoken.network/assets", "managedBy": "realt" }, + { "title": "RealToken API", "description": "API documentation and endpoints for RealToken data.", "href": "https://api.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Transfer", "description": "Transfer tokens from one wallet to another.", "href": "https://transfer.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – RealToken Update Alerts", "description": "Notifications of changes on a RealToken (rent, token price, etc.).", "href": "https://t.me/RealToken_Alerts_Bot", "managedBy": "dao" }, + { "title": "Pitsbi", "description": "RealT dashboard and analytics.", "href": "https://realt.pitsbi.io", "managedBy": "community" }, + { "title": "Cryptalloc RealtLab", "description": "Portfolio and RealToken tools.", "href": "https://www.cryptalloc.com/realtlab/", "managedBy": "community" }, + { "title": "RealT Rent Tracker", "description": "Track rent payments for your RealTokens.", "href": "https://ehpst.duckdns.org/realt_rent_tracker/", "managedBy": "community" }, + { "title": "RealT community documentation", "description": "Community tutorials and guides (GitBook).", "href": "https://community-realt.gitbook.io/tuto-community/", "managedBy": "dao" } + ] + }, + "reg": { + "tag": "REG", + "title": "REG Ecosystem", + "main": { + "title": "REG", + "description": "Governance token of the RealToken ecosystem. Claim, vote, and participate in the DAO.", + "href": "https://claim.realtoken.network/reg", + "linkText": "Claim REG", + "managedBy": "dao" + }, + "tools": [ + { "title": "DAO Documentation", "description": "Wiki to better understand the DAO and its organization.", "href": "https://wiki.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Wallet", "description": "Wallet to hold and manage your REG and RealTokens.", "href": "https://wallet.realtoken.network/", "managedBy": "daoRealt" }, + { "title": "Dune DAO Dashboard", "description": "RealToken DAO analytics and metrics.", "href": "https://dune.com/teugos/realtoken-dao-dashboard", "managedBy": "community" }, + { "title": "Incentive Vault", "description": "DAO incentive program and vault.", "href": "https://vote.realtoken.network/dao/incentive", "managedBy": "dao" } + ] + } + } + }, + "blog": { + "tag": "Blog", + "title": "Latest articles", + "description": "Discover our latest news and guides about the RealToken ecosystem", + "pageTitle": "RealToken Blog", + "pageDescription": "Explore all our articles on real estate tokenization, decentralized governance and the RealToken ecosystem", + "viewAll": "View all articles", + "backToBlog": "Back to blog", + "loading": "Loading articles..." + }, + "confidentialite": { + "tag": "Legal", + "pageTitle": "Privacy policy", + "pageDescription": "How RealToken DAO collects, uses and protects your personal data.", + "s1Title": "Scope and purpose", + "s1Intro": "This privacy policy is required when the site or related services (governance platforms, sign-ups, newsletters) collect personal data. It applies to processing carried out by RealToken DAO and to data that may be collected when using the site, voting tools (e.g. wallet addresses for governance) or communications (e.g. email addresses for sign-ups or newsletters).", + "s2Title": "Data collected", + "s2List": "Identification data (name, pseudonym)\nEmail address\nConnection data (IP addresses, logs)\nPseudonymous blockchain data (wallet addresses, transaction or voting history when linked to use of the site or services)", + "s3Title": "Purposes and legal basis", + "s3List": "Managing votes and participation in DAO governance (legitimate interest or pre-contractual measures)\nSending newsletters and information (consent)\nImproving services and the site (legitimate interest)\nCompliance with legal obligations (legal obligation)", + "s4Title": "Recipients and retention", + "s4Content": "Data may be shared with technical providers (hosting, voting tools, analytics) strictly for their assigned tasks. Retention periods are set according to each purpose (e.g. consent duration for newsletters, legal duration for billing or evidence). Pseudonymous blockchain data may be kept as long as needed for governance.", + "s5Title": "Your rights", + "s5Content": "Under applicable data protection laws, you have the right to access, rectify, erase, restrict processing, data portability and to object. To exercise these rights or for any question about your data, you may contact us at the address given in the legal notice. You also have the right to lodge a complaint with your supervisory authority.", + "s6Title": "Security measures", + "s6Content": "Technical and organisational measures are in place to protect your data: encryption of exchanges (HTTPS), secure access, pseudonymisation where possible. For blockchain services, on-chain data is by nature public or pseudonymous; we do not store identifying personal data on-chain without necessity and we limit possible correlation.", + "s7Title": "DAO, blockchain and GDPR", + "s7Content": "In a DAO and blockchain context, responsibility for processing may be shared (nodes, participants, interfaces). We strive to ensure compliance with applicable regulations by identifying data controllers, limiting personal data exposed on-chain and favouring anonymisation or pseudonymisation where the purpose allows." + }, + "mentions": { + "tag": "Legal", + "pageTitle": "Legal notice", + "pageDescription": "Legal information about the site publisher and disclaimers regarding DAO and tokenised services.", + "s1Title": "Site publisher (LCEN)", + "s1Intro": "In accordance with French law no. 2004-575 of 21 June 2004 on confidence in the digital economy (LCEN), the following identifies the publisher and host of the site.", + "s1List": "Name or designation: RealToken DAO (decentralised organisation)\nEmail: marketing{'@'}realtoken.community\nDirector of publication: DAO marketing committee", + "s2Title": "Hosting", + "s2Content": "The site is hosted by [host name], [address]. For any question regarding hosting, please contact the host or the site publisher.", + "s3Title": "Disclaimers and risks", + "s3List": "Tokens and tokenised assets (including in the RealT or RealToken ecosystem) do not constitute a guaranteed investment; their value may fluctuate.\nThe contents of this site do not constitute investment, financial, legal or tax advice.\nDue to the decentralised nature of a DAO, liability may be limited and shared among participants; decisions are made collectively and on-chain.\nFor financial and tokenised aspects (sale, purchase, holding of tokens), tax obligations and, where applicable, rules of the AMF (Autorité des marchés financiers) or equivalent regulator may apply; each user is responsible for compliance with applicable law.", + "s3Disclaimer": "The information on this page is kept up to date where possible. For any questions regarding this legal notice, you may contact us at the address given in the publisher section." + }, + "notFound": { + "pageTitle": "Page not found", + "pageDescription": "The requested page does not exist or has been moved.", + "title": "This page does not exist", + "description": "The requested URL is not available. You can go back to the homepage or use the menu to continue browsing.", + "goHome": "Back to homepage" + }, + "appStatus": { + "tag": "Applications", + "pageTitle": "Applications status", + "pageDescription": "Availability report for Application Hub URLs with HTTP code and error details.", + "checkedAt": "Last check", + "loading": "Loading status report...", + "summary": "OK: {ok} | KO: {ko} | Total: {total}", + "columns": { + "title": "Application", + "url": "URL", + "status": "Status", + "http": "HTTP code", + "error": "Error" + } + }, + "footer": { + "tagline": "Decentralized ecosystem for tokenized real-world assets.", + "applications": "Applications", + "governance": "Governance", + "resources": "Resources", + "legal": "Legal", + "blog": "Blog", + "wiki": "Wiki", + "forum": "Forum", + "faq": "FAQ", + "privacy": "Privacy", + "terms": "Terms of use", + "copyright": "© 2026 RealToken DAO. All rights reserved.", + "followUs": "Follow us" + } +} + diff --git a/src/locales/fr.json b/src/locales/fr.json new file mode 100644 index 0000000..3cc1309 --- /dev/null +++ b/src/locales/fr.json @@ -0,0 +1,463 @@ +{ + "nav": { + "application": "Application", + "ressources": "Ressources", + "governance": "Gouvernance", + "blog": "Blog", + "contact": "Contacter nous", + "menu": { + "applications": "Applications", + "applicationsRmm": "RMM", + "applicationsYam": "YAM", + "applicationsBridge": "Bridge", + "applicationsDashboard": "Realtoken Dashboard", + "applicationsWallet": "RealToken Wallet", + "projetsRwa": "Projets RWA", + "projetsRwaRealt": "RealT", + "governance": "Gouvernance", + "governanceTally": "Tally (vote)", + "governanceReg": "Le REG", + "governanceComites": "Comités", + "governanceForum": "Forum", + "resources": "Ressources", + "resourcesFaq": "FAQ", + "resourcesWiki": "Wiki", + "resourcesBlog": "Blog", + "resourcesLiensUtiles": "Application Hub" + } + }, + "hero": { + "tag": "Tokenisation d'actifs réels on-chain", + "title": "Construire ensemble un écosystème", + "titleSpan": "RWA décentralisé", + "lead": "La RealToken DAO est un écosystème décentralisé qui intègre tous vos tokens d'actifs réels comme l'immobilier, le factoring, ou la dette, en collaborant avec différents partenaires pour décentraliser la gestion des actifs du monde réel.", + "ctaDashboard": "Découvrir la vision", + "ctaVision": "Token économie", + "trustSec": "Gouvernance décentralisée", + "trustSecDesc": "", + "trustLloyds": "Actifs réels (RWA)", + "trustLloydsDesc": "", + "trustChainlink": "Liquidité 24/7", + "trustChainlinkDesc": "" + }, + "about": { + "tag": "À propos", + "title": "Tokenisation d'actifs réels : liquidité, échange, disponible, accessible.", + "description": "RealToken DAO transforme l'accès aux actifs du monde réel en les rendant accessibles, échangeables et disponibles 24/7. Chaque token représente une part vérifiable d'un portefeuille d'actifs réels, avec une liquidité instantanée et une gouvernance décentralisée.", + "features": { + "liquidity": { + "title": "Liquidité", + "description": "Accédez à des actifs du monde réel tokenisés, négociables 24/7 sur les marchés décentralisés." + }, + "exchange": { + "title": "Échange", + "description": "Échangez vos tokens RealToken de manière transparente et sécurisée sur l'écosystème." + }, + "available": { + "title": "Disponible", + "description": "Des actifs réels accessibles à tous, fractionnés en parts numériques vérifiables." + }, + "accessible": { + "title": "Accessible", + "description": "Accédez aux actifs réels premium sans barrières traditionnelles ni intermédiaires." + } + } + }, + "application": { + "tag": "Application", + "title": "Les outils de l'écosystème RealToken.", + "openApp": "Accéder à l'application", + "rmm": { + "title": "RMM", + "description": "RealToken Money Market - Protocole de lending et borrowing pour emprunter des stablecoins en échange d'actifs RWA, basé sur la plateforme Aave et adapté aux besoins du marché RWA." + }, + "yam": { + "title": "YAM", + "description": "You and Me - Marché secondaire pair-à-pair avec création d'offres d'achat et de vente, adapté aux besoins du marché RWA." + }, + "dex": { + "title": "DEX (prochainement)", + "description": "Une plateforme d'échange décentralisée pour encore améliorer la liquidité des actifs du monde réel." + }, + "nft": { + "title": "NFT (prochainement)", + "description": "Ces NFT serviront à distribuer la supply des REG en fonction des agissements et contributions de chacun dans l'écosystème." + } + }, + "daoRole": { + "tag": "Rôle et périmètre", + "title": "Le rôle de la DAO", + "role1": { + "title": "Gestion des RealTokens en DeFi", + "description": "Gérer les RealTokens au sein de nos applications (RMM, YAM, Bridge, Dashboard) pour assurer liquidité, échanges et services décentralisés à l'écosystème." + }, + "role2": { + "title": "Développement de l'écosystème", + "description": "Allouer des fonds de la trésorerie pour développer l'écosystème : applications, liquidité, sécurité, nouvelles fonctionnalités et infrastructure." + }, + "role3": { + "title": "Coordination et mise à disposition", + "description": "Coordonner les services et les partenaires, et mettre notre technologie à disposition pour la tokenisation d'actifs réels au sens large." + } + }, + "governance": { + "tag": "Gouvernance", + "title": "Gouvernance décentralisée pour la communauté.", + "protocol": { + "title": "Protocole décentralisé", + "description": "Gouvernance communautaire transparente où chaque détenteur de REG peut participer aux décisions importantes.", + "link": "Voir le REG sur CoinGecko" + }, + "forum": { + "title": "Forum", + "description": "Espace de discussion et de proposition pour la communauté RealToken DAO.", + "link": "Accéder au forum" + }, + "tally": { + "title": "Tally (vote)", + "description": "Plateforme de vote on-chain pour les propositions de gouvernance et les décisions de la DAO.", + "link": "Accéder à Tally" + } + }, + "process": { + "tag": "Comment ça marche", + "title": "Rejoignez l'écosystème RealToken en trois étapes.", + "step1": { + "title": "Acheter des tokens depuis un partenaire", + "text": "Acquérez vos tokens RealToken auprès de nos partenaires certifiés et intégrez l'écosystème." + }, + "step2": { + "title": "Tokens disponibles dans l'écosystème (RMM, YAM)", + "text": "Vos tokens sont immédiatement accessibles sur RMM pour l'échange et YAM pour la gestion de portefeuille." + }, + "step3": { + "title": "Obtenir un token REG et participer à la gouvernance", + "text": "Recevez vos tokens REG pour participer activement à la gouvernance décentralisée. Bientôt : des NFT pour améliorer la gouvernance décentralisée." + } + }, + "stats": { + "tag": "Preuves", + "title": "Des indicateurs vérifiables, en temps réel.", + "assets": "Valeur totale des actifs partenaires dans l'écosystème", + "members": "Membres de l'écosystème", + "regMarketcap": "Marketcap REG", + "votes": "Nombre de votes sur Tally", + "comingSoon": "À venir", + "inProgress": "En cours" + }, + "cta": { + "tag": "Partenaires", + "title": "Intégrez votre token et façonnez l'avenir de l'écosystème RealToken.", + "description": "Rejoignez l'écosystème RealToken en tant que partenaire. Intégrez vos tokens et bénéficiez de la liquidité, de la gouvernance et de l'infrastructure de la DAO pour développer votre projet.", + "buttonPartner": "Devenir partenaire", + "buttonLearn": "En savoir plus" + }, + "partenaires": { + "tag": "Partenaires", + "pageTitle": "Devenir partenaire", + "pageDescription": "Intégrez votre token à l'écosystème RealToken et bénéficiez de notre infrastructure de marché, de lending et de tokenisation d'actifs réels.", + "intro": "Cette page est dédiée aux projets qui souhaitent rejoindre l'écosystème RealToken. Voici nos critères d'acceptation et ce que nous mettons à votre disposition.", + "criteriaTitle": "Critères d'acceptation", + "criteriaDesc": "Pour intégrer notre écosystème, votre projet doit répondre au critère suivant :", + "criteriaBadge": "Requis", + "criteriaText": "Token ERC-20 : votre actif ou projet doit être représenté par un token conforme à la norme ERC-20 sur Ethereum ou une chaîne compatible (ex. Gnosis Chain). Nous disposons d'un partenaire qui peut se charger de représenter vos actifs sur la blockchain sous forme de tokens.", + "offerTitle": "Ce que nous offrons", + "offerDesc": "En tant que partenaire, vous pouvez bénéficier des infrastructures suivantes :", + "offer1": "YAM : plateforme de marché secondaire pour des échanges de tokens de pair à pair, avec création d'offres d'achat et d'offres de vente.", + "offer2": "RMM : une plateforme de lending et borrowing pour mettre en collateral des actifs réels et emprunter des stablecoins en échange.", + "offer3": "Un DEX (prochainement), qui améliorera la liquidité générale des actifs du monde réel.", + "offer4": "Grâce à notre partenaire, nous pouvons vous accompagner dans le processus de tokenisation d'actifs réels afin de représenter vos actifs sur la blockchain.", + "seekTitle": "Ce que nous recherchons", + "seekIntro": "Nous sommes ouverts à toutes sortes d'actifs réels. Nous recherchons notamment :", + "seekList": "Des partenaires dans les obligations\nDes partenaires dans la tokenisation de brevets\nDes partenaires dans la tokenisation de droits musicaux\nDes partenaires dans la tokenisation d'exploitation énergétique (nucléaire, solaire, etc.)\nDes partenaires dans la tokenisation de tout type d'immobilier", + "ctaText": "Vous souhaitez devenir partenaire ? Contactez-nous pour échanger sur votre projet.", + "ctaButton": "Nous contacter" + }, + "logo": { + "name": "RealToken DAO", + "subtitle": "DeFi pour les actifs réels" + }, + "comite": { + "tag": "Gouvernance", + "pageTitle": "Comités", + "pageDescription": "La DAO est organisée en comités pour déléguer progressivement les responsabilités à la communauté.", + "members": "Membres", + "telegram": "Rejoindre le Telegram", + "committees": { + "proposer": { + "title": "Proposant", + "description": "Pour aider à l'établissement : des propositions sur le Forum et des votes correspondants sur Tally (onChain).", + "members": "Sigri, DRKTT et PhilP" + }, + "security": { + "title": "Comité de sécurité", + "description": "Pour assurer la sécurité des protocoles de la DAO (au minimum, intervenir en urgence pour stopper un protocole).", + "members": "Benoist-Not-for-sale, Cogatos, Sigri, EzSwim, JoeD" + }, + "votingPower": { + "title": "Groupe de travail Pouvoirs de vote", + "description": "Pour étudier et proposer de nouvelles versions de l'algorithme de calcul des Voting Power à partir des REG détenus.", + "members": "Taodiem, Paul, PhilP, Yohann76, Eric, Battistu, DRKTT, Stouban, Teugos" + }, + "liquidity": { + "title": "Comité de gestion de la liquidité", + "description": "Pour gérer la stratégie de liquidité mise en place via la RIP00003, étudier et proposer de nouvelles stratégies de gestion de la liquidité.", + "members": "Teugos, PhilP" + }, + "marketing": { + "title": "Comité Marketing et Communication", + "description": "Pour étudier et proposer des actions de marketing et communication pour accroître la visibilité et l'engagement au sein de l'écosystème Realtoken.", + "members": "0xEzSwim, Yohann76, Paul, Virtual Madness, Teugos" + } + } + }, + "faq": { + "tag": "FAQ", + "pageTitle": "Questions fréquentes", + "pageDescription": "Retrouvez les réponses aux questions les plus posées sur l'écosystème RealToken.", + "items": { + "q1": { + "question": "Qu'est-ce que la DAO RealToken ?", + "answer": "La DAO RealToken est une organisation décentralisée autonome (DAO) dédiée à la tokenisation d'actifs réels (RWA – Real World Assets), comme l'immobilier mais aussi l'art ou les infrastructures. Elle permet à ses membres de participer à la gouvernance, d'investir dans des actifs fractionnés, et de contribuer à un écosystème transparent et décentralisé." + }, + "q2": { + "question": "Quel est le lien entre RealToken et RealT ?", + "answer": "RealToken et RealT font partie du même écosystème de tokenisation d'actifs réels, avec des rôles distincts. RealT se concentre sur la création et la gestion des actifs sous-jacents (tokens immobiliers, émission, conformité). La DAO RealToken se concentre quant à elle sur l'écosystème technologique et le DeFi : outils (RMM, YAM, Bridge), gouvernance communautaire, et décisions sur les protocoles, les intégrations et les allocations. En résumé : RealT gère les actifs tokenisés ; la DAO RealToken gère l'infrastructure et la gouvernance de l'écosystème." + }, + "q3": { + "question": "Comment puis-je participer à la DAO ?", + "answer": "• Forum : rejoindre le forum pour débattre, suivre les décisions et proposer des idées (pas besoin de token). Pour soumettre une proposition, discutez d'abord de votre idée sur le forum, puis rédigez une proposition formelle.\n• REG : le REG (token de gouvernance) s'obtient sur des plateformes d'échange comme 1inch ou via YAM. Des REG sont aussi distribués en fonction de la participation dans les tokens partenaires. Participer activement à l'écosystème (développement, communication, etc.) peut également être rétribué en REG. Le REG donne un droit de vote.\n• Tally : sur Tally, connectez votre wallet pour consulter les propositions, voter ou déléguer votre vote." + }, + "q4": { + "question": "Qu'est-ce qu'un RWA (Real World Asset) ?", + "answer": "Un RWA est un actif du monde réel (ex : un appartement, une œuvre d'art) représenté sous forme de token sur une blockchain. Cela permet de :\n• Fractionner la propriété (ex : acheter 10 % d'un immeuble).\n• Faciliter les échanges (liquidité 24/7).\n• Automatiser la gestion (loyers, dividendes) via des smart contracts." + }, + "q5": { + "question": "Comment sont prises les décisions dans la DAO ?", + "answer": "Les décisions sont prises via un processus de vote décentralisé :\n• Un membre soumet une proposition.\n• La communauté discute sur le forum et finalise la proposition.\n• Le vote est créé sur Tally.\n• Les détenteurs de tokens REG votent.\n• La proposition est appliquée si le quorum est atteint." + }, + "q6": { + "question": "Quels sont les risques associés aux RWA et à la DAO ?", + "answer": "• Volatilité : la valeur des tokens peut fluctuer.\n• Régulation : les cadres légaux évoluent (ex : fiscalité, conformité).\n• Technologie : bugs dans les smart contracts (d'où l'importance des audits).\n• Gouvernance : risque de concentration de pouvoir si quelques membres détiennent beaucoup de tokens.\n• Conseils : diversifier ses investissements et suivre les mises à jour de la DAO." + }, + "q7": { + "question": "Comment puis-je proposer un projet ou une idée à la DAO ?", + "answer": "• Aborder l'idée sur Telegram pour étudier la pertinence et la faisabilité.\n• Rejoindre le forum et rédiger une proposition avec : un titre clair ; une description détaillée (objectifs, budget, calendrier). Voir le template.\n• Soumettre la proposition au vote via Tally." + }, + "q8": { + "question": "Où trouver de l'aide ou poser des questions ?", + "answer": "• Telegram : la communauté est bienveillante ; postez dans la langue de votre choix, nous vous aiderons.\n• Forum : pour des interrogations et questionnements un peu plus réfléchis.\n• Par mail (marketing{'@'}realtoken.community) : pour toute demande de partenariat ou autre question." + }, + "q9": { + "question": "La DAO est-elle ouverte aux débutants en crypto ?", + "answer": "Oui ! RealToken vise à démocratiser l'accès aux RWA. Des ressources sont disponibles : guide pour débutants (articles du blog), communauté (les membres expérimentés aident les nouveaux sur Telegram)." + } + } + }, + "reg": { + "tag": "Gouvernance", + "pageTitle": "Le REG", + "pageDescription": "RealToken Ecosystem Governance (REG) est le token de gouvernance de l'écosystème RealToken. Découvrez les informations principales et téléchargez le whitepaper.", + "staticDescription": "Le REG (RealToken Ecosystem Governance) est le token de gouvernance de l'écosystème RealToken, créé par RealT.co.", + "loading": "Chargement des données REG…", + "error": "Impossible de charger les données depuis CoinGecko.", + "price": "Prix", + "marketCap": "Capitalisation", + "volume24h": "Volume 24h", + "circulatingSupply": "Supply en circulation", + "whitepaperTitle": "Whitepaper", + "whitepaperDescription": "Téléchargez le whitepaper du REG (version française) pour en savoir plus sur l'économie et la gouvernance du token.", + "downloadWhitepaper": "Télécharger le whitepaper (PDF)" + }, + "liensUtiles": { + "tag": "Applications", + "pageTitle": "Application Hub", + "pageDescription": "Applications, documentations et ressources de l'écosystème RealToken.", + "openApp": "Ouvrir l'app", + "managedBy": { + "realt": "Géré par RealT", + "dao": "Géré par la DAO", + "daoRealt": "Géré par la DAO & RealT", + "community": "Initiative hors DAO" + }, + "whoManages": { + "tag": "Application Hub", + "title": "Qui gère ces applications ?", + "dao": { + "title": "Géré par la DAO", + "description": "Applications et outils développés, maintenus par la DAO. La communauté en pilote la feuille de route et les moyens via les votes REG. Une condition : la DAO doit avoir la possession du code (dépôt : GitHub RealToken Community).", + "domainLabel": "Domaine : realtoken.community" + }, + "realt": { + "title": "Géré par RealT", + "description": "Certaines applications sont gérées par RealT car l'écosystème est en cours de décentralisation. Juridiquement, certaines applications nécessitent encore un rattachement centralisé pour fonctionner.", + "domainLabel": "Domaine : realtoken.network" + }, + "community": { + "title": "Initiative hors DAO", + "description": "Projets et outils créés par des membres de la communauté ou des tiers, en dehors de la DAO. Ils sont maintenus par des personnes tierces, sans lien, ni garantie de suivi, mais peuvent tout de même être utiles à l'écosystème.", + "domainLabel": "Domaine : Libre" + } + }, + "communitySection": { + "tag": "Ressources", + "title": "Initiatives communautaires", + "disclaimer": "Les applications ci-dessous sont des projets tiers, non gérés ni validés par la DAO. Elles sont maintenues par des membres de la communauté ou des tiers. Utiles à l'écosystème mais sans garantie de suivi." + }, + "statusNote": { + "prefix": "Les liens affichés ici sont uniquement des liens valides et accessibles. Voir le détail sur la page", + "linkLabel": "status" + }, + "dashboardRealtokensDesc": "Application mobile, API et outils RealToken.", + "sections": { + "rmm": { + "tag": "RMM", + "title": "RMM", + "main": { + "title": "RMM", + "description": "Le RMM permet de mettre en collatéral ses RealTokens afin de pouvoir emprunter en contrepartie.", + "href": "https://rmm.realtoken.network/", + "linkText": "Ouvrir le RMM", + "managedBy": "daoRealt" + }, + "tools": [ + { "title": "Rent to Repay", "description": "Permet d'automatiser le remboursement de sa dette lors de la réception des loyers.", "href": "https://github.com/RealToken-Community/DEVCONTEST-rent2repay", "managedBy": "dao" }, + { "title": "RMM Analytics – Gain or Loss", "description": "Permet d'analyser les intérêts perçus ou payés par un wallet sur le RMM.", "href": "https://analytics.rmm.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – Notification de liquidité RMM", "description": "Permet de recevoir une notification lorsqu'il y a de la liquidité disponible sur le RMM.", "href": "https://t.me/rmm_available_liquidity", "managedBy": "community" }, + { "title": "Dashboard Dune RMM", "description": "Tableaux de bord et analytics RMM sur Dune.", "href": "https://dune.com/sigri44/realtoken-rmm", "managedBy": "community" }, + { "title": "Scappa", "description": "Trouver les meilleures offres pour rembourser ou sortir du RMM.", "href": "https://scappa.battistu.com/", "managedBy": "community" } + ] + }, + "yam": { + "tag": "YAM", + "title": "YAM", + "main": { + "title": "YAM", + "description": "Permet d'acheter et de vendre des RealTokens en pair à pair.", + "href": "https://yam.realtoken.network", + "linkText": "Ouvrir le YAM", + "managedBy": "daoRealt" + }, + "tools": [ + { "title": "YAM Transaction Report Generator", "description": "Permet de générer un PDF de toutes ses transactions sur une période donnée.", "href": "https://yam-report.realtoken.community/", "managedBy": "dao" }, + { "title": "YAM Offer Viewer by ID", "description": "Alternative au YAM principal permettant d'acheter une offre directement à partir de son ID.", "href": "https://offer-view.yam.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – YAM Sale Notify Bot", "description": "Permet de recevoir une notification chaque fois qu'une de vos offres publiées sur le YAM est achetée.", "href": "https://t.me/yam_sale_notify_bot", "managedBy": "dao" } + ] + }, + "realtokens": { + "tag": "Realtokens", + "title": "Realtokens", + "tools": [ + { "title": "Bridge", "description": "Permet de transférer des RealTokens/REG entre des chaînes (L2, etc.).", "href": "https://bridge.realtoken.network/", "managedBy": "realt" }, + { "title": "Realtoken Dashboard", "description": "Tableau de bord RealToken : vue d'ensemble des actifs et de l'écosystème.", "href": "https://dashboard.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Asset Tracker", "description": "Application mobile pour suivre vos actifs RealToken.", "href": "https://mobile.realtoken.community/", "managedBy": "dao" }, + { "title": "Shareholder Vote – Assets", "description": "Application de vote sur les assets RealToken (votes actionnaires).", "href": "https://vote.realtoken.network/assets", "managedBy": "realt" }, + { "title": "RealToken API", "description": "Documentation et endpoints de l'API RealToken.", "href": "https://api.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Transfer", "description": "Transfert de tokens de wallet à wallet.", "href": "https://transfer.realtoken.community/", "managedBy": "dao" }, + { "title": "Bot Telegram – RealToken Update Alerts", "description": "Notifications des changements sur un RealToken (loyer, prix du token, etc.).", "href": "https://t.me/RealToken_Alerts_Bot", "managedBy": "dao" }, + { "title": "Pitsbi", "description": "Dashboard et analytics RealT.", "href": "https://realt.pitsbi.io", "managedBy": "community" }, + { "title": "Cryptalloc RealtLab", "description": "Portfolio et outils RealToken.", "href": "https://www.cryptalloc.com/realtlab/", "managedBy": "community" }, + { "title": "RealT Rent Tracker", "description": "Suivi des loyers de vos RealTokens.", "href": "https://ehpst.duckdns.org/realt_rent_tracker/", "managedBy": "community" }, + { "title": "Documentation communautaire RealT", "description": "Tutoriels et guides communautaires (GitBook).", "href": "https://community-realt.gitbook.io/tuto-community/", "managedBy": "dao" } + ] + }, + "reg": { + "tag": "REG", + "title": "Écosystème REG", + "main": { + "title": "REG", + "description": "Token de gouvernance de l'écosystème RealToken. Réclamez, votez et participez à la DAO.", + "href": "https://claim.realtoken.network/reg", + "linkText": "Claim REG", + "managedBy": "dao" + }, + "tools": [ + { "title": "Documentation de la DAO", "description": "Wiki pour mieux connaître la DAO et son organisation.", "href": "https://wiki.realtoken.community/", "managedBy": "dao" }, + { "title": "RealToken Wallet", "description": "Wallet pour détenir et gérer vos REG et RealTokens.", "href": "https://wallet.realtoken.network/", "managedBy": "daoRealt" }, + { "title": "Dashboard Dune DAO", "description": "Analytics et métriques de la RealToken DAO.", "href": "https://dune.com/teugos/realtoken-dao-dashboard", "managedBy": "community" }, + { "title": "Incentive Vault", "description": "Programme d'incentive et vault de la DAO.", "href": "https://vote.realtoken.network/dao/incentive", "managedBy": "dao" } + ] + } + } + }, + "blog": { + "tag": "Blog", + "title": "Derniers articles", + "description": "Découvrez nos dernières actualités et guides sur l'écosystème RealToken", + "pageTitle": "Blog RealToken", + "pageDescription": "Explorez tous nos articles sur la tokenisation immobilière, la gouvernance décentralisée et l'écosystème RealToken", + "viewAll": "Voir tous les articles", + "backToBlog": "Retour au blog", + "loading": "Chargement des articles..." + }, + "confidentialite": { + "tag": "Legal", + "pageTitle": "Politique de confidentialité", + "pageDescription": "Comment RealToken DAO collecte, utilise et protège vos données personnelles.", + "s1Title": "Objet et champ d'application", + "s1Intro": "La présente politique de confidentialité est obligatoire dès lors que le site ou les services associés (plateformes de gouvernance, inscriptions, newsletters) collectent des données personnelles. Elle s'applique aux traitements effectués par RealToken DAO et aux données susceptibles d'être recueillies dans le cadre de l'utilisation du site, des outils de vote (ex. : adresses de wallet pour la gouvernance) ou des communications (ex. : adresses e-mail pour les inscriptions ou newsletters).", + "s2Title": "Données collectées", + "s2List": "Données d'identification (nom, prénom, pseudonyme)\nAdresse e-mail\nDonnées de connexion (adresses IP, logs)\nDonnées blockchain pseudonymes (adresses de wallet, historiques de transactions ou de votes lorsqu'elles sont liées à un usage du site ou des services)", + "s3Title": "Finalités et base légale", + "s3List": "Gestion des votes et de la participation à la gouvernance DAO (intérêt légitime ou exécution de mesures précontractuelles)\nEnvoi de newsletters et d'informations (consentement)\nAmélioration des services et du site (intérêt légitime)\nRespect des obligations légales (obligation légale)", + "s4Title": "Destinataires et durée de conservation", + "s4Content": "Les données peuvent être communiquées aux prestataires techniques (hébergement, outils de vote, analytics) dans le cadre strict de leurs missions. La durée de conservation est définie en fonction de chaque finalité (ex. : durée du consentement pour les newsletters, durée légale pour les données de facturation ou de preuve). Les données blockchain pseudonymes peuvent être conservées tant que nécessaire au fonctionnement de la gouvernance.", + "s5Title": "Droits des utilisateurs", + "s5Content": "Conformément aux réglementations applicables en matière de protection des données, vous disposez d'un droit d'accès, de rectification, d'effacement, de limitation du traitement, de portabilité et d'opposition. Pour exercer ces droits ou pour toute question relative à vos données, vous pouvez nous contacter à l'adresse indiquée dans les mentions légales. Vous pouvez également introduire une réclamation auprès de l'autorité de contrôle compétente de votre pays.", + "s6Title": "Mesures de sécurité", + "s6Content": "Des mesures techniques et organisationnelles sont mises en œuvre pour protéger vos données : chiffrement des échanges (HTTPS), sécurisation des accès, pseudonymisation lorsque cela est possible. Pour les services blockchain, les données on-chain sont par nature publiques ou pseudonymisées ; nous ne stockons pas de données personnelles identifiantes sur la chaîne sans nécessité et en veillant à limiter les corrélations possibles.", + "s7Title": "DAO, blockchain et RGPD", + "s7Content": "Dans un contexte de DAO et de blockchain, la responsabilité du traitement peut être partagée (nœuds, participants, interfaces). Nous nous efforçons d'assurer une compatibilité avec les réglementations en vigueur en identifiant les responsables de traitement, en limitant les données personnelles exposées on-chain et en privilégiant l'anonymisation ou la pseudonymisation lorsque la finalité du traitement le permet." + }, + "mentions": { + "tag": "Legal", + "pageTitle": "Mentions légales", + "pageDescription": "Informations légales relatives à l'éditeur du site et avertissements concernant les services DAO et tokenisés.", + "s1Title": "Éditeur du site (LCEN)", + "s1Intro": "Conformément à la loi n° 2004-575 du 21 juin 2004 pour la confiance dans l'économie numérique (LCEN), sont indiqués ci-dessous les éléments d'identification de l'éditeur et de l'hébergeur du site.", + "s1List": "Dénomination ou nom : RealToken DAO (organisation décentralisée)\nCourriel : marketing{'@'}realtoken.community\nDirecteur de la publication : comité marketing de la DAO", + "s2Title": "Hébergeur", + "s2Content": "Le site est hébergé par OVH. OVH SAS est une filiale de la société OVH Groupe SA, société immatriculée au RCS de Lille sous le numéro 537 407 926, sise 2, rue Kellermann, 59100 Roubaix. Pour toute question relative à l'hébergement, veuillez contacter l'hébergeur ou l'éditeur du site.", + "s3Title": "Avertissements et risques", + "s3List": "Les tokens et actifs tokenisés (notamment dans le cadre de RealT ou de l'écosystème RealToken) ne constituent pas un investissement garanti ; leur valeur peut fluctuer.\nLes contenus du site ne constituent pas un conseil en investissement ni un conseil financier, juridique ou fiscal.\nEn raison de la nature décentralisée d'une DAO, la responsabilité peut être limitée et répartie entre les participants ; les décisions sont prises de manière collective et on-chain.\nPour les aspects financiers et tokenisés (vente, achat, détention de tokens), des obligations fiscales et, le cas échéant, des règles de l'AMF (Autorité des marchés financiers) peuvent s'appliquer ; il appartient à chaque utilisateur de se renseigner et de se conformer à la réglementation en vigueur.", + "s3Disclaimer": "Les informations de cette page sont tenues à jour dans la mesure du possible. Pour toute question relative aux mentions légales, vous pouvez nous contacter à l'adresse indiquée dans la section éditeur." + }, + "notFound": { + "pageTitle": "Page introuvable", + "pageDescription": "La page demandée n'existe pas ou a été déplacée.", + "title": "Cette page n'existe pas", + "description": "L'URL demandée n'est pas disponible. Vous pouvez revenir a l'accueil ou utiliser le menu pour continuer votre navigation.", + "goHome": "Retour a l'accueil" + }, + "appStatus": { + "tag": "Applications", + "pageTitle": "Statut des applications", + "pageDescription": "Etat de disponibilite des URLs de l'Application Hub avec code HTTP et erreurs.", + "checkedAt": "Derniere verification", + "loading": "Chargement du rapport de statut...", + "summary": "OK: {ok} | KO: {ko} | Total: {total}", + "columns": { + "title": "Application", + "url": "URL", + "status": "Etat", + "http": "Code HTTP", + "error": "Erreur" + } + }, + "footer": { + "tagline": "Écosystème décentralisé d'actifs réels tokenisés.", + "applications": "Applications", + "governance": "Gouvernance", + "resources": "Ressources", + "legal": "Legal", + "blog": "Blog", + "wiki": "Wiki", + "forum": "Forum", + "faq": "FAQ", + "privacy": "Confidentialité", + "terms": "Mentions légales", + "copyright": "© 2026 RealToken DAO. Tous droits réservés.", + "followUs": "Suivez-nous" + } +} + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..ec90b1d --- /dev/null +++ b/src/main.js @@ -0,0 +1,8 @@ +import './assets/main.css' + +import { createApp } from 'vue' +import App from './App.vue' +import i18n from './i18n' +import router from './router' + +createApp(App).use(i18n).use(router).mount('#app') diff --git a/src/router.js b/src/router.js new file mode 100644 index 0000000..5d6b74a --- /dev/null +++ b/src/router.js @@ -0,0 +1,179 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { getEnglishSlug } from './utils/blog.js' +import i18n from './i18n' +import Home from './views/Home.vue' +import Blog from './views/Blog.vue' +import BlogPost from './views/BlogPost.vue' +import Faq from './views/Faq.vue' +import Comite from './views/Comite.vue' +import LiensUtiles from './views/LiensUtiles.vue' +import ApplicationHubStatus from './views/ApplicationHubStatus.vue' +import Reg from './views/Reg.vue' +import Partenaires from './views/Partenaires.vue' +import Confidentialite from './views/Confidentialite.vue' +import MentionsLegales from './views/MentionsLegales.vue' +import NotFound from './views/NotFound.vue' + +const routes = [ + { + path: '/', + name: 'Home', + component: Home, + meta: { + title: 'RealToken DAO', + description: 'Decentralized ecosystem for tokenized real-world assets.' + } + }, + { + path: '/ressource/blog', + name: 'Blog', + component: Blog, + meta: { titleKey: 'blog.pageTitle', descriptionKey: 'blog.pageDescription' } + }, + { + path: '/ressource/blog/:slug', + name: 'BlogPost', + component: BlogPost, + meta: { titleKey: 'blog.pageTitle', descriptionKey: 'blog.pageDescription' }, + beforeEnter(to, _from, next) { + const englishSlug = getEnglishSlug(to.params.slug) + if (englishSlug !== to.params.slug) { + next({ path: `/ressource/blog/${englishSlug}`, replace: true }) + } else { + next() + } + } + }, + { + path: '/ressource/faq', + name: 'Faq', + component: Faq, + meta: { titleKey: 'faq.pageTitle', descriptionKey: 'faq.pageDescription' } + }, + { + path: '/governance/committee', + name: 'Comite', + component: Comite, + meta: { titleKey: 'comite.pageTitle', descriptionKey: 'comite.pageDescription' } + }, + { + path: '/applications/application-hub', + name: 'LiensUtiles', + component: LiensUtiles, + meta: { titleKey: 'liensUtiles.pageTitle', descriptionKey: 'liensUtiles.pageDescription' } + }, + { + path: '/applications/application-hub/status', + name: 'ApplicationHubStatus', + component: ApplicationHubStatus, + meta: { titleKey: 'appStatus.pageTitle', descriptionKey: 'appStatus.pageDescription' } + }, + { + path: '/governance/reg', + name: 'Reg', + component: Reg, + meta: { titleKey: 'reg.pageTitle', descriptionKey: 'reg.pageDescription' } + }, + { + path: '/partners', + name: 'Partenaires', + component: Partenaires, + meta: { titleKey: 'partenaires.pageTitle', descriptionKey: 'partenaires.pageDescription' } + }, + { + path: '/privacy', + name: 'Confidentialite', + component: Confidentialite, + meta: { titleKey: 'confidentialite.pageTitle', descriptionKey: 'confidentialite.pageDescription' } + }, + { + path: '/legal-notice', + name: 'MentionsLegales', + component: MentionsLegales, + meta: { titleKey: 'mentions.pageTitle', descriptionKey: 'mentions.pageDescription' } + }, + // Redirects: anciennes URLs FR → URLs anglaises (SEO, bookmarks) + { path: '/comite', redirect: '/governance/committee' }, + { path: '/committee', redirect: '/governance/committee' }, + { path: '/liens-utiles', redirect: '/applications/application-hub' }, + { path: '/application-hub', redirect: '/applications/application-hub' }, + { path: '/reg', redirect: '/governance/reg' }, + { path: '/blog', redirect: '/ressource/blog' }, + { path: '/blog/:slug', redirect: (to) => `/ressource/blog/${to.params.slug}` }, + { path: '/faq', redirect: '/ressource/faq' }, + { path: '/devenir-partenaire', redirect: '/partners' }, + { path: '/confidentialite', redirect: '/privacy' }, + { path: '/mentions-legales', redirect: '/legal-notice' }, + { + path: '/not-found', + name: 'NotFoundPage', + component: NotFound, + meta: { titleKey: 'notFound.pageTitle', descriptionKey: 'notFound.pageDescription' } + }, + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: NotFound, + meta: { titleKey: 'notFound.pageTitle', descriptionKey: 'notFound.pageDescription' } + } +] + +const router = createRouter({ + history: createWebHistory(), + routes, + scrollBehavior(to, from, savedPosition) { + // Sur /ressource/faq, les ancres sont gérées par le composant Faq (openFromHash) après montage + if (to.hash && to.path === '/ressource/faq') { + return { top: 0 } + } + // Ancre explicite dans l’URL (ex: /page#section) → on scroll vers l’élément + if (to.hash) { + return { el: to.hash, behavior: 'smooth' } + } + // Retour arrière : restaurer la position sauvegardée par le navigateur + if (savedPosition) { + return savedPosition + } + // Par défaut : toujours en haut de la page + return { top: 0 } + } +}) + +const DEFAULT_TITLE = 'RealToken DAO' +const DEFAULT_DESCRIPTION = 'Decentralized ecosystem for tokenized real-world assets.' + +function resolveMetaValue(to, key, defaultValue) { + const routeWithMeta = [...to.matched].reverse().find((r) => r.meta && (r.meta[key] || r.meta[`${key}Key`])) + if (!routeWithMeta) return defaultValue + + const rawValue = routeWithMeta.meta[key] + if (typeof rawValue === 'string' && rawValue.trim()) return rawValue + + const i18nKey = routeWithMeta.meta[`${key}Key`] + if (typeof i18nKey === 'string' && i18nKey.trim()) { + const translated = i18n.global.t(i18nKey) + return translated && translated !== i18nKey ? translated : defaultValue + } + + return defaultValue +} + +function upsertMetaDescription(content) { + let descriptionTag = document.querySelector('meta[name="description"]') + if (!descriptionTag) { + descriptionTag = document.createElement('meta') + descriptionTag.setAttribute('name', 'description') + document.head.appendChild(descriptionTag) + } + descriptionTag.setAttribute('content', content) +} + +router.afterEach((to) => { + const pageTitle = resolveMetaValue(to, 'title', DEFAULT_TITLE) + const pageDescription = resolveMetaValue(to, 'description', DEFAULT_DESCRIPTION) + document.title = pageTitle === DEFAULT_TITLE ? DEFAULT_TITLE : `${pageTitle} | ${DEFAULT_TITLE}` + upsertMetaDescription(pageDescription) +}) + +export default router + diff --git a/src/utils/blog.js b/src/utils/blog.js new file mode 100644 index 0000000..2c65a65 --- /dev/null +++ b/src/utils/blog.js @@ -0,0 +1,175 @@ +import MarkdownIt from 'markdown-it' + +const md = new MarkdownIt({ + html: true, + linkify: true, + typographer: true +}) + +// Fonction pour parser le frontmatter manuellement +function parseFrontmatter(content) { + const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/ + const match = content.match(frontmatterRegex) + + if (!match) { + // Pas de frontmatter, retourner tout le contenu comme body + return { + data: {}, + content: content + } + } + + const frontmatter = match[1] + const body = match[2] + + // Parser le YAML frontmatter basique + const data = {} + const lines = frontmatter.split('\n') + + for (const line of lines) { + const colonIndex = line.indexOf(':') + if (colonIndex > 0) { + const key = line.substring(0, colonIndex).trim() + let value = line.substring(colonIndex + 1).trim() + + // Enlever les guillemets si présents + if ((value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1) + } + + // Parser les tableaux + if (value.startsWith('[') && value.endsWith(']')) { + value = value.slice(1, -1).split(',').map(v => { + v = v.trim() + if ((v.startsWith('"') && v.endsWith('"')) || + (v.startsWith("'") && v.endsWith("'"))) { + return v.slice(1, -1) + } + return v + }) + } + + data[key] = value + } + } + + return { + data, + content: body + } +} + +/** + * Remove the first markdown H1 to avoid duplicate title rendering + * when the page already displays the article title from frontmatter. + */ +function removeLeadingH1(markdown) { + if (!markdown) return markdown + const lines = markdown.split('\n') + const firstNonEmptyIndex = lines.findIndex((line) => line.trim().length > 0) + if (firstNonEmptyIndex === -1) return markdown + if (!/^#\s+/.test(lines[firstNonEmptyIndex].trim())) return markdown + + const updated = [...lines] + updated.splice(firstNonEmptyIndex, 1) + if (updated[firstNonEmptyIndex] && updated[firstNonEmptyIndex].trim() === '') { + updated.splice(firstNonEmptyIndex, 1) + } + return updated.join('\n') +} + +// Slugs canoniques : définis dans data/blog-slugs.js (sans dépendance) pour le script sitemap +import { englishSlugs } from '../data/blog-slugs.js' +export { englishSlugs } + +// Correspondance des slugs entre locales (même article, slugs différents selon la langue) +// Quand on est sur /blog/perimetre-dao-realtoken et qu'on passe en EN, on doit charger realtoken-dao-scope +const slugEquivalents = { + 'perimetre-dao-realtoken': { en: 'realtoken-dao-scope' }, + 'realtoken-dao-scope': { fr: 'perimetre-dao-realtoken' }, + 'naissance-dao-realtoken': { en: 'birth-of-realtoken-dao' }, + 'birth-of-realtoken-dao': { fr: 'naissance-dao-realtoken' }, + 'objectif-dao-realtoken': { en: 'realtoken-dao-objectives' }, + 'realtoken-dao-objectives': { fr: 'objectif-dao-realtoken' }, + 'lien-realt-dao-realtoken': { en: 'realtoken-dao-realt-relationship' }, + 'realtoken-dao-realt-relationship': { fr: 'lien-realt-dao-realtoken' }, + 'participation-gouvernance-realtoken-dao': { en: 'realtoken-dao-governance-participation' }, + 'realtoken-dao-governance-participation': { fr: 'participation-gouvernance-realtoken-dao' }, + 'avenir-rwa-diversification-communautaire': { en: 'future-rwa-community-roadmap-diversification' }, + 'future-rwa-community-roadmap-diversification': { fr: 'avenir-rwa-diversification-communautaire' } +} + +/** Retourne le slug à utiliser pour une locale (équivalent du même article dans l'autre langue si besoin) */ +export function getSlugForLocale(slug, locale) { + return slugEquivalents[slug]?.[locale] ?? slug +} + +/** Retourne le slug canonique anglais (pour les URL). Si le slug est déjà en anglais, le retourne ; sinon retourne l’équivalent EN. */ +export function getEnglishSlug(slug) { + const en = slugEquivalents[slug]?.en + return en ?? slug +} + +// Note: Les slugs correspondent aux noms de fichiers sans l'extension .md + +// Fonction pour charger le contenu d'un article +async function loadArticleContent(slug, locale) { + try { + const response = await fetch(`/articles/${locale}/${slug}.md`) + if (!response.ok) return null + // If the server returns HTML fallback (index.html), this is not a markdown article. + const contentType = response.headers.get('content-type') || '' + if (contentType.includes('text/html')) return null + const text = await response.text() + // A valid article always starts with frontmatter in this project. + if (!text.trimStart().startsWith('---')) return null + return text + } catch (error) { + console.error(`Error loading article ${slug}:`, error) + return null + } +} + +// Charge tous les articles ; les URL restent en anglais (slug = englishSlug) +export async function loadArticles(locale = 'fr') { + const articles = [] + for (const englishSlug of englishSlugs) { + const contentSlug = getSlugForLocale(englishSlug, locale) + const content = await loadArticleContent(contentSlug, locale) + if (content) { + const parsed = parseFrontmatter(content) + const cleanedContent = removeLeadingH1(parsed.content) + articles.push({ + ...parsed.data, + slug: englishSlug, + content: md.render(cleanedContent), + rawContent: cleanedContent + }) + } + } + articles.sort((a, b) => new Date(b.date) - new Date(a.date)) + return articles +} + +// Charge un article ; slug dans l'URL est toujours en anglais, contenu selon locale +export async function loadArticle(slug, locale = 'fr') { + const contentSlug = getSlugForLocale(slug, locale) + const content = await loadArticleContent(contentSlug, locale) + if (!content) return null + const parsed = parseFrontmatter(content) + const cleanedContent = removeLeadingH1(parsed.content) + return { + ...parsed.data, + slug, + content: md.render(cleanedContent), + rawContent: cleanedContent + } +} + +// Fonction pour obtenir les derniers articles +export async function getLatestArticles(count = 3, locale = 'fr') { + const articles = await loadArticles(locale) + return articles.slice(0, count) +} + diff --git a/src/views/ApplicationHubStatus.vue b/src/views/ApplicationHubStatus.vue new file mode 100644 index 0000000..b8a8647 --- /dev/null +++ b/src/views/ApplicationHubStatus.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/src/views/Blog.vue b/src/views/Blog.vue new file mode 100644 index 0000000..94b6142 --- /dev/null +++ b/src/views/Blog.vue @@ -0,0 +1,133 @@ + + + + + + diff --git a/src/views/BlogPost.vue b/src/views/BlogPost.vue new file mode 100644 index 0000000..f4d3d99 --- /dev/null +++ b/src/views/BlogPost.vue @@ -0,0 +1,272 @@ + + + + + + diff --git a/src/views/Comite.vue b/src/views/Comite.vue new file mode 100644 index 0000000..c22984c --- /dev/null +++ b/src/views/Comite.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/src/views/Confidentialite.vue b/src/views/Confidentialite.vue new file mode 100644 index 0000000..84a11fa --- /dev/null +++ b/src/views/Confidentialite.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/views/Faq.vue b/src/views/Faq.vue new file mode 100644 index 0000000..a80a3d0 --- /dev/null +++ b/src/views/Faq.vue @@ -0,0 +1,444 @@ + + + + + diff --git a/src/views/Home.vue b/src/views/Home.vue new file mode 100644 index 0000000..b1be6e7 --- /dev/null +++ b/src/views/Home.vue @@ -0,0 +1,878 @@ + + + + + diff --git a/src/views/LiensUtiles.vue b/src/views/LiensUtiles.vue new file mode 100644 index 0000000..a30f3f6 --- /dev/null +++ b/src/views/LiensUtiles.vue @@ -0,0 +1,592 @@ + + + + + diff --git a/src/views/MentionsLegales.vue b/src/views/MentionsLegales.vue new file mode 100644 index 0000000..6c7ed0f --- /dev/null +++ b/src/views/MentionsLegales.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue new file mode 100644 index 0000000..07bb6d7 --- /dev/null +++ b/src/views/NotFound.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/Partenaires.vue b/src/views/Partenaires.vue new file mode 100644 index 0000000..5b7b55d --- /dev/null +++ b/src/views/Partenaires.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/src/views/Reg.vue b/src/views/Reg.vue new file mode 100644 index 0000000..de4a645 --- /dev/null +++ b/src/views/Reg.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..077044d --- /dev/null +++ b/vite.config.js @@ -0,0 +1,26 @@ +import { fileURLToPath, URL } from 'node:url' +import { copyFileSync } from 'fs' +import { resolve } from 'path' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, + publicDir: 'public', + build: { + rollupOptions: { + input: { + main: resolve(__dirname, 'index.html') + } + } + } +})