├── .babelrc ├── .dockerignore ├── .editorconfig ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── codeql-analysis.yml │ └── container.yml ├── .gitignore ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── api ├── gateway.js ├── releases.js └── tool │ ├── binwalk.js │ ├── port-scan.js │ ├── pyc.js │ └── zip-pe.js ├── assets └── css │ └── main.css ├── components ├── Footer.vue ├── TinyButtonLink.vue ├── TopBar.vue ├── form │ ├── GridWithDoubleColumns.vue │ ├── PrimaryButton.vue │ ├── PrimaryCheckbox.vue │ ├── PrimaryFileUploader.vue │ ├── PrimaryInput.vue │ ├── PrimaryPreBlock.vue │ ├── PrimarySelector.vue │ └── PrimaryTextArea.vue ├── settings │ ├── Area.vue │ ├── Divider.vue │ └── Item.vue ├── tool │ ├── BadgeDot.vue │ ├── InteractiveBlock.vue │ ├── InteractiveDoubleColumns.vue │ ├── ObjectViewer.vue │ ├── PrimaryContainer.vue │ ├── PrimaryIntroduction.vue │ └── Tool.vue ├── uni │ ├── Button.vue │ ├── Input.vue │ ├── Link.vue │ ├── Select.vue │ └── Textarea.vue └── widgets │ └── CodeBlock.vue ├── content └── intro │ ├── brain-fuck.md │ ├── ceasar-cipher.md │ ├── crc.md │ ├── data-unit-conversion.md │ ├── jsfuck.md │ ├── jsonpath.md │ ├── morse-code.md │ ├── pyc-decompiler.md │ ├── rail-fence.md │ └── rot13.md ├── jest.config.js ├── jsconfig.json ├── lang ├── en-US.js └── zh-CN.js ├── layouts └── default.vue ├── libs ├── brainfuck.js ├── ceasarCipher.js ├── common.js ├── coreValuesCipher.js ├── crc.js ├── dataUnitConversion.js ├── radixc.js ├── railFence.js ├── serial.js ├── tempc.js ├── utf8-util.js ├── vigenereCipher.js └── zero-width-steganography.js ├── middleware └── title-guard.js ├── nuxt.config.js ├── package.json ├── pages ├── _.vue ├── index.vue ├── premium-active.vue ├── settings.vue ├── static │ └── pigpen │ │ ├── pigpen-regular.woff │ │ └── pigpen-regular.woff2 ├── tag │ └── _tag.vue └── tools │ ├── ascii.vue │ ├── base-series.vue │ ├── base64-to-image.vue │ ├── bin-extractor.vue │ ├── brain-fuck.vue │ ├── caesar-cipher.vue │ ├── cloud-shadow.vue │ ├── core-values-cipher.vue │ ├── crc-checksum.vue │ ├── data-units-conversion.vue │ ├── ip-geo.vue │ ├── jsfuck.vue │ ├── json-serializer.vue │ ├── message-digest.vue │ ├── morse-code.vue │ ├── pigpen.vue │ ├── port-scan.vue │ ├── pseudo-encrypted-zip-check.vue │ ├── pyc-decompiler.vue │ ├── radix-conversion.vue │ ├── rail-fence-cipher.vue │ ├── rot-series.vue │ ├── serial.vue │ ├── temperature-conversion.vue │ ├── timestamp.vue │ ├── url-encoding.vue │ ├── utf8-conversion.vue │ ├── uuid-generator.vue │ ├── vigenereCipher.vue │ └── zero-width-steganography.vue ├── plugins ├── antd-ui.js ├── api.js ├── g-tag.js └── vue-js-modal.js ├── pnpm-lock.yaml ├── static ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon-precomposed.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── icon.png ├── icon.svg ├── mstile-150x150.png ├── readme │ ├── afdian.jpg │ └── icon_1024.png ├── safari-pinned-tab.svg ├── screenshots │ ├── footer.png │ ├── header.png │ ├── tool_bin_extractor.png │ ├── tool_pseudo_zip.png │ └── tool_pyc_decompiler.png ├── site.webmanifest.bak └── third_party │ └── workbox │ ├── workbox-background-sync.dev.js │ ├── workbox-background-sync.prod.js │ ├── workbox-broadcast-update.dev.js │ ├── workbox-broadcast-update.prod.js │ ├── workbox-cacheable-response.dev.js │ ├── workbox-cacheable-response.prod.js │ ├── workbox-core.dev.js │ ├── workbox-core.prod.js │ ├── workbox-expiration.dev.js │ ├── workbox-expiration.prod.js │ ├── workbox-navigation-preload.dev.js │ ├── workbox-navigation-preload.prod.js │ ├── workbox-offline-ga.dev.js │ ├── workbox-offline-ga.prod.js │ ├── workbox-precaching.dev.js │ ├── workbox-precaching.prod.js │ ├── workbox-range-requests.dev.js │ ├── workbox-range-requests.prod.js │ ├── workbox-routing.dev.js │ ├── workbox-routing.prod.js │ ├── workbox-strategies.dev.js │ ├── workbox-strategies.prod.js │ ├── workbox-streams.dev.js │ ├── workbox-streams.prod.js │ ├── workbox-sw.js │ ├── workbox-window.dev.es5.mjs │ ├── workbox-window.dev.mjs │ ├── workbox-window.dev.umd.js │ ├── workbox-window.prod.es5.mjs │ ├── workbox-window.prod.mjs │ └── workbox-window.prod.umd.js ├── store ├── index.js ├── runtime.js └── settings.js └── tailwind.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "presets": [ 5 | [ 6 | "@babel/preset-env", 7 | { 8 | "targets": { 9 | "node": "current" 10 | } 11 | } 12 | ] 13 | ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /.github 2 | /.nuxt 3 | /dist 4 | /node_modules 5 | /coverage 6 | 7 | yarn.lock 8 | yarn-error.log 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: 5ANK41 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | - 'https://afdian.net/@hoshino_suzumi' 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: 反馈在使用过程中遇到的问题 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: HoshinoSuzumi 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | 40 | **描述问题** 41 | 简单的描述你所遇到的问题 42 | 43 | **复现问题** 44 | 详细写出复现问题的步骤 45 | 1. Go to '...' 46 | 2. Click on '....' 47 | 3. Scroll down to '....' 48 | 4. See error 49 | 50 | **预期表现** 51 | 简单描述你认为正确的表现 52 | 53 | **截图** 54 | 如果有,请上传问题相关的截图 55 | 56 | **环境** 57 | - 操作系统: [e.g. Windows11] 58 | - 浏览器: [e.g. chrome, safari] 59 | - 版本号: [e.g. 100] 60 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: 为这个项目出谋划策 4 | title: "[FEAT] " 5 | labels: feature 6 | assignees: HoshinoSuzumi 7 | 8 | --- 9 | 10 | **描述你的诉求** 11 | 请写出你对这个项目的期望、新功能的需求和提议、现有功能的完善和补充之处 12 | 13 | **描述你想要的解决方案** 14 | 你对这个诉求有什么想法,你希望我们如何实现 15 | 16 | **额外信息(可选)** 17 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '40 2 * * 2' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v2 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v2 71 | -------------------------------------------------------------------------------- /.github/workflows/container.yml: -------------------------------------------------------------------------------- 1 | name: "Make Docker Image" 2 | 3 | on: 4 | push: 5 | tags: 6 | - "**" 7 | 8 | jobs: 9 | build: 10 | name: "Build Image" 11 | runs-on: ${{ matrix.os }} 12 | 13 | strategy: 14 | matrix: 15 | os: [ ubuntu-latest ] 16 | node: [ 16 ] 17 | 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v3 21 | 22 | - name: Get Tag Name 23 | id: get_version 24 | run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} 25 | 26 | - name: Set up QEMU 27 | uses: docker/setup-qemu-action@v2 28 | 29 | - name: Set up Docker Buildx 30 | uses: docker/setup-buildx-action@v2 31 | 32 | - name: Login to Docker Hub 33 | uses: docker/login-action@v2 34 | with: 35 | username: ${{ secrets.DOCKERHUB_USERNAME }} 36 | password: ${{ secrets.DOCKERHUB_TOKEN }} 37 | 38 | - name: Login to GitHub Container Registry 39 | uses: docker/login-action@v2 40 | with: 41 | registry: ghcr.io 42 | username: ${{ github.repository_owner }} 43 | password: ${{ secrets.GHCR_TOKEN }} 44 | 45 | - name: Create Dotenv File 46 | uses: actually-colab/github-action-create-env-file@v2.3 47 | with: 48 | envkey_CEVER_VERSION: ${{ steps.get_version.outputs.VERSION }} 49 | directory: . 50 | file_name: .env 51 | 52 | - name: Build and push 53 | uses: docker/build-push-action@v4 54 | with: 55 | context: . 56 | platforms: linux/amd64 57 | push: true 58 | outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=The official CTFever frontend image 59 | tags: | 60 | hoshinosuzumi/ctfever:${{ steps.get_version.outputs.VERSION }} 61 | hoshinosuzumi/ctfever:latest 62 | ghcr.io/uniiemstudio/ctfever:${{ steps.get_version.outputs.VERSION }} 63 | ghcr.io/uniiemstudio/ctfever:latest 64 | 65 | deploy: 66 | name: "Trigger automatic pull" 67 | runs-on: ${{ matrix.os }} 68 | needs: 69 | - build 70 | 71 | strategy: 72 | matrix: 73 | os: [ ubuntu-latest ] 74 | node: [ 16 ] 75 | 76 | steps: 77 | - name: Webhook POST Action 78 | # You may pin to the exact commit or the version. 79 | # uses: muinmomin/webhook-action@7c067ef19e5de3aca7aebda32628f1d08d06bf89 80 | uses: muinmomin/webhook-action@v1.0.0 81 | with: 82 | # URL of webhook to send post request to 83 | url: ${{ secrets.DEPLOY_WEBHOOK }} 84 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE / Editor 81 | .idea 82 | 83 | # Service worker 84 | sw.* 85 | 86 | # macOS 87 | .DS_Store 88 | 89 | # Vim swap files 90 | *.swp 91 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 贡献指南 2 | 3 | ## 新增工具 4 | 5 | 要向 CTFever 添加新工具时,请完善以下信息: 6 | 7 | ### Javascript 库 8 | 9 | `/libs` 10 | 11 | 自定义的 javascript 库存放在 `/libs` 目录下。命名清晰有辨识度,且不与内置的库名称冲突。 12 | 13 | ### 元信息 14 | 15 | `/store/index.js` 16 | 17 | 工具的元信息包含了名称、介绍、标签等信息,使得 CTFever 可以对工具进行分类、筛选和更好地展示 18 | 19 | `toolkits` 数组包含了工具分类的元信息,元素是一个对象,包含了分类名称、分类简介和工具列表。 20 | 21 | `toolkits.tools` 数组包含了工具的元信息,元素是一个对象,包含了工具名称、工具介绍、工具标签和路由。路由必须定义为 `/tools/工具名称(横杠命名)` 22 | 23 | 它们看起来是这个样子 24 | 25 | ```javascript 26 | toolkits: [ 27 | { 28 | title: 'toolkit.EaD.title', 29 | description: 'toolkit.EaD.desc', 30 | icon: 'code-outline', 31 | tools: [ 32 | { 33 | title: 'tool.ascii.title', 34 | description: 'tool.ascii.desc', 35 | route: '/tools/ascii', 36 | tags: ['字符编码'], 37 | }, 38 | // ... 39 | ] 40 | }, 41 | // ... 42 | ] 43 | ``` 44 | 45 | _元信息的任何部分(path 除外)都应使用 i18n 字符串,而不是直接定义内容_ 46 | 47 | ### 国际化 i18n 48 | 49 | `/lang/*.js` 50 | 51 | `en-US` 是必选项,其他语言可选 52 | 53 | ### 工具模板 54 | 55 | `/pages/tools/工具名称(横杠命名).vue` 56 | 57 | 每个工具都应使用这个模板开始 58 | 59 | ```vue 60 | 61 | 66 | 76 | ``` 77 | 78 | 工具页面中的组件尽量使用 `/components/tool` 下的组件确保统一性 79 | 80 | ### 提交新工具 81 | 82 | 推送更改然后 Pull Request 到 UniiemStudio:dev 分支,然后等待我们 review 83 | 84 | **感谢每一位可爱的贡献者** 85 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-alpine as build-stage 2 | 3 | WORKDIR /build 4 | COPY . . 5 | 6 | ENV CEVER_RUN_MODE=server 7 | ENV CEVER_BACKEND_BASE=https://ctfever-service.uniiem.com 8 | 9 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories 10 | RUN apk add --update --no-cache gcc g++ make cmake curl jq py3-configobj py3-pip py3-setuptools python3 python3-dev 11 | 12 | RUN npm config set registry https://registry.npm.taobao.org && \ 13 | yarn && yarn build 14 | 15 | FROM node:16-alpine as production-stage 16 | 17 | LABEL maintainer="hoshinosuzumi" 18 | LABEL org.opencontainers.image.source="https://github.com/UniiemStudio/CTFever" 19 | LABEL org.opencontainers.image.description="The official CTFever frontend image." 20 | 21 | ENV CEVER_RUN_MODE=server 22 | ENV CEVER_BACKEND_BASE=https://ctfever-service.uniiem.com 23 | 24 | WORKDIR /app 25 | COPY --from=build-stage /build . 26 | 27 | EXPOSE 3000 28 | 29 | CMD yarn start 30 | -------------------------------------------------------------------------------- /api/gateway.js: -------------------------------------------------------------------------------- 1 | export default axios => ({ 2 | call: (mod, method, params = null, file = null, progress = true) => { 3 | let formData = new FormData(); 4 | if (params) formData.append('args', JSON.stringify(params)); 5 | if (file) formData.append('file', file); 6 | return axios.post(`/gateway/call/${mod}?method=${method}`, formData, {progress: progress}) 7 | }, 8 | }) 9 | -------------------------------------------------------------------------------- /api/releases.js: -------------------------------------------------------------------------------- 1 | import gateway from "~/api/gateway"; 2 | 3 | export default axios => ({ 4 | releases_behind: (timestamp) => { 5 | return gateway(axios).call('releasenote', 'releases_behind', {timestamp: timestamp}, null, false); 6 | } 7 | }) 8 | -------------------------------------------------------------------------------- /api/tool/binwalk.js: -------------------------------------------------------------------------------- 1 | import gateway from "~/api/gateway"; 2 | 3 | export default axios => ({ 4 | scan: (file) => { 5 | return gateway(axios).call('binwalker', 'scan', null, file); 6 | }, 7 | artifact: (artifact_id, filename) => { 8 | return gateway(axios).call('binwalker', 'artifact', {artifact_id: artifact_id, filename: filename}); 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /api/tool/port-scan.js: -------------------------------------------------------------------------------- 1 | import gateway from "~/api/gateway"; 2 | 3 | export default axios => ({ 4 | scan: (host, ports) => { 5 | return gateway(axios).call('portscan', 'scan', {host: host, ports: ports}); 6 | } 7 | }) 8 | -------------------------------------------------------------------------------- /api/tool/pyc.js: -------------------------------------------------------------------------------- 1 | import gateway from "~/api/gateway"; 2 | 3 | export default axios => ({ 4 | decompile: (pyc_file) => { 5 | return gateway(axios).call('pycdecompile', 'decompile', null, pyc_file); 6 | } 7 | }) 8 | -------------------------------------------------------------------------------- /api/tool/zip-pe.js: -------------------------------------------------------------------------------- 1 | import gateway from "~/api/gateway"; 2 | 3 | export default axios => ({ 4 | pseudo_check: (zip_file) => { 5 | return gateway(axios).call('ziputil', 'pseudo_check', null, zip_file); 6 | } 7 | }) 8 | -------------------------------------------------------------------------------- /assets/css/main.css: -------------------------------------------------------------------------------- 1 | /*noinspection CssUnknownTarget*/ 2 | @import url('https://fonts.font.im/css?family=PT+Mono|PT+Sans|Poppins|Nunito&display=swap'); 3 | 4 | @tailwind base; 5 | @tailwind components; 6 | @tailwind utilities; 7 | -------------------------------------------------------------------------------- /components/Footer.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 37 | 38 | 41 | -------------------------------------------------------------------------------- /components/TinyButtonLink.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 38 | 39 | 42 | -------------------------------------------------------------------------------- /components/form/GridWithDoubleColumns.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /components/form/PrimaryButton.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | 32 | 35 | -------------------------------------------------------------------------------- /components/form/PrimaryCheckbox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /components/form/PrimaryFileUploader.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 123 | 124 | 127 | -------------------------------------------------------------------------------- /components/form/PrimaryInput.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 114 | 115 | 138 | -------------------------------------------------------------------------------- /components/form/PrimaryPreBlock.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 24 | 25 | 28 | -------------------------------------------------------------------------------- /components/form/PrimarySelector.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 62 | 63 | 66 | -------------------------------------------------------------------------------- /components/form/PrimaryTextArea.vue: -------------------------------------------------------------------------------- 1 |