├── .browserslistrc ├── .editorconfig ├── .env ├── .github ├── ISSUE_TEMPLATE │ ├── BUG_REPORT.yml │ └── FEATURE_REQUEST.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── test.yml ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── histoire.config.js ├── index.html ├── main.js ├── package.json ├── postcss.config.js ├── preload.js ├── public ├── favicon-temp.svg └── manifest.json ├── src ├── App.vue ├── assets │ ├── connectors │ │ ├── coinbase.png │ │ ├── gnosis.png │ │ ├── metamask.png │ │ ├── portis.png │ │ ├── starknet.png │ │ └── walletconnect.png │ ├── fonts │ │ ├── Calibre-Medium-Custom.woff2 │ │ ├── Calibre-Semibold-Custom.woff2 │ │ ├── SpaceMono-Bold.woff2 │ │ └── SpaceMono-Regular.woff2 │ ├── grid-dark.svg │ ├── grid-light.svg │ ├── icons │ │ ├── discord.svg │ │ ├── github.svg │ │ └── x.svg │ └── logo.svg ├── components │ ├── App.vue │ ├── Block │ │ ├── Actions.vue │ │ ├── ContactPicker.vue │ │ ├── CreationConfirmation.vue │ │ ├── Delegates.vue │ │ ├── Execution.vue │ │ ├── ExecutionEditable.vue │ │ ├── InfiniteScroller.vue │ │ ├── NftPicker.vue │ │ ├── SpaceFormController.vue │ │ ├── SpaceFormNetwork.vue │ │ ├── SpaceFormProfile.vue │ │ ├── SpaceFormStrategies.vue │ │ ├── SpaceFormValidation.vue │ │ ├── SpaceFormVoting.vue │ │ ├── StrategiesConfigurator.vue │ │ └── TokenPicker.vue │ ├── Container.vue │ ├── ExecutionButton.vue │ ├── Label.vue │ ├── Layout.vue │ ├── Link.vue │ ├── Markdown.vue │ ├── MarkdownEditor.vue │ ├── Modal │ │ ├── Account.vue │ │ ├── Delegate.vue │ │ ├── DelegationConfig.vue │ │ ├── Drafts.vue │ │ ├── EditContact.vue │ │ ├── EditSpace.vue │ │ ├── EditStrategy.vue │ │ ├── LinkWalletConnect.vue │ │ ├── PendingTransactions.vue │ │ ├── SendNft.vue │ │ ├── SendToken.vue │ │ ├── Timeline.vue │ │ ├── Transaction.vue │ │ ├── Votes.vue │ │ └── VotingPower.vue │ ├── Nav.vue │ ├── NftPreview.vue │ ├── Notifications.vue │ ├── PendingTransactionsIndicator.vue │ ├── Preview.vue │ ├── Proposal.vue │ ├── ProposalStatus.vue │ ├── ProposalStatusIcon.vue │ ├── ProposalsList.vue │ ├── Results.vue │ ├── S │ │ ├── Base.vue │ │ ├── IAddress.vue │ │ ├── IArray.vue │ │ ├── IBoolean.vue │ │ ├── IDuration.vue │ │ ├── INumber.vue │ │ ├── IObject.vue │ │ ├── ISelect.vue │ │ ├── IStamp.vue │ │ ├── IStampCover.vue │ │ ├── IString.vue │ │ └── IText.vue │ ├── Sidebar.vue │ ├── SpaceAvatar.vue │ ├── SpaceCover.vue │ ├── SpaceItem.vue │ ├── Stamp.vue │ ├── StrategyButton.vue │ ├── Topnav.vue │ ├── Transaction.vue │ ├── Ui │ │ ├── Alert.vue │ │ ├── Button.story.vue │ │ ├── Button.vue │ │ ├── Counter.vue │ │ ├── Dropdown.vue │ │ ├── DropdownItem.vue │ │ ├── Editable.vue │ │ ├── Loading.vue │ │ ├── Modal.vue │ │ ├── Select.vue │ │ └── Tooltip.vue │ ├── Upload.vue │ ├── Vote.vue │ └── VotingPowerIndicator.vue ├── composables │ ├── useAccount.ts │ ├── useActions.ts │ ├── useApp.ts │ ├── useApps.ts │ ├── useBalances.ts │ ├── useDelegates.ts │ ├── useEditor.ts │ ├── useFavicon.ts │ ├── useMarkdownEditor.ts │ ├── useMixpanel.ts │ ├── useModal.ts │ ├── useNfts.ts │ ├── useResolve.ts │ ├── useRouteParser.ts │ ├── useScrollMonitor.ts │ ├── useSpaces.ts │ ├── useTitle.ts │ ├── useTreasury.ts │ ├── useUserSkin.ts │ ├── useWalletConnect.ts │ ├── useWalletConnectTransaction.ts │ └── useWeb3.ts ├── helpers │ ├── __snapshots__ │ │ └── transactions.test.ts.snap │ ├── abis.ts │ ├── alchemy │ │ ├── index.ts │ │ └── types.ts │ ├── argentx.ts │ ├── auth.ts │ ├── call.ts │ ├── connectors.ts │ ├── constants.ts │ ├── ens.ts │ ├── etherscan.ts │ ├── execution.json │ ├── mana.ts │ ├── multicaller.ts │ ├── networks.json │ ├── pin.ts │ ├── provider.ts │ ├── resolver.ts │ ├── stamp.ts │ ├── tenderly.ts │ ├── transactions.test.ts │ ├── transactions.ts │ ├── utils.test.ts │ ├── utils.ts │ └── validation.ts ├── histoire-setup.ts ├── main.ts ├── networks │ ├── common │ │ ├── constants.ts │ │ ├── graphqlApi │ │ │ ├── highlight.ts │ │ │ ├── index.ts │ │ │ ├── queries.ts │ │ │ └── types.ts │ │ └── helpers.ts │ ├── evm │ │ ├── actions.ts │ │ ├── constants.ts │ │ ├── helpers.ts │ │ └── index.ts │ ├── index.ts │ ├── offchain │ │ ├── api │ │ │ ├── index.ts │ │ │ ├── queries.ts │ │ │ └── types.ts │ │ ├── constants.ts │ │ └── index.ts │ ├── starknet │ │ ├── actions.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ └── provider.ts │ └── types.ts ├── router.ts ├── stores │ ├── contacts.ts │ ├── meta.ts │ ├── proposals.ts │ ├── spaces.ts │ ├── ui.ts │ └── users.ts ├── style.scss ├── types.ts └── views │ ├── App.vue │ ├── Apps.vue │ ├── Create.vue │ ├── Editor.vue │ ├── Explore.vue │ ├── Home.vue │ ├── Proposal.vue │ ├── Proposal │ ├── Overview.vue │ └── Votes.vue │ ├── Settings.vue │ ├── Settings │ ├── Contacts.vue │ └── Spaces.vue │ ├── Space.vue │ ├── Space │ ├── Delegates.vue │ ├── EditSettings.vue │ ├── Overview.vue │ ├── Proposals.vue │ ├── Search.vue │ ├── Settings.vue │ └── Treasury.vue │ └── User.vue ├── tailwind.config.js ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = LF 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | VITE_ENABLED_NETWORKS= 2 | VITE_ETH_RPC_URL=https://rpc.snapshotx.xyz 3 | VITE_MANA_URL=https://mana.pizza 4 | VITE_HIGHLIGHT_URL= 5 | VITE_IPFS_GATEWAY=snapshot.4everland.link 6 | VITE_INFURA_API_KEY=46a5dd9727bf48d4a132672d3f376146 7 | VITE_ALCHEMY_API_KEY=ombBQyf580z-jx2EVQgJu4eTjePU-a2z 8 | VITE_GA_MEASUREMENT_ID=G-8MQS50MVZX 9 | VITE_TENDERLY_ACCESS_KEY=8-1V1FGLxFqhs75T7bUs4lK1BaPOnfcT 10 | VITE_MIXPANEL_TOKEN=47b43858cf6fe9376f8deddda52cbaaf 11 | VITE_WC_PROJECT_ID=b191e242d2f2163c99bcf9d44297e946 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/BUG_REPORT.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: File a bug report 3 | title: '[BUG] - ' 4 | labels: ['bug-report'] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: Thanks for making Snapshot awesome for everyone. 9 | - type: input 10 | id: title 11 | attributes: 12 | label: Briefly describe the bug. 13 | description: A clear and concise description of what the bug is. 14 | placeholder: ex. Unable to vote using metamask wallet on chrome. 15 | validations: 16 | required: true 17 | - type: textarea 18 | id: reproduce 19 | attributes: 20 | label: How can we reproduce the bug? 21 | placeholder: Steps to reproduce the behaviour. 22 | value: | 23 | 1. Go to '...' 24 | 2. Click on '....' 25 | 3. Scroll down to '....' 26 | 4. See error 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: expectation 31 | attributes: 32 | label: What is the expected behaviour? 33 | description: A clear and concise description of what you expected to happen. 34 | placeholder: ex. I should be able to vote using metamask wallet on chrome. 35 | validations: 36 | required: false 37 | - type: textarea 38 | id: screenshots 39 | attributes: 40 | label: Can you attach screenshots? 41 | description: Please attach all the screenshots that can help us visually see the problem. 42 | placeholder: You can drag-and-drop the image, copy paste the image in the field below. 43 | validations: 44 | required: false 45 | - type: textarea 46 | id: device 47 | attributes: 48 | label: Can you provide your device specific details below? 49 | value: | 50 | 1. Device Type - [ex. Desktop or Mobile] 51 | 2. Device OS - [ex. Android, MacOS, Windows, iOS] 52 | 3. OS Version - [ex. iOS 11, Windows 10] 53 | 4. Browser - [ex. chrome, safari] 54 | 5. Browser Version - [ex. 101] 55 | 6. Wallet - [metamask, portis, walletconnect] 56 | 7. Space - [ex. ENS, Gitcoin] 57 | 8. Any additional information we should know - 58 | validations: 59 | required: false 60 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest an idea for this project 3 | title: '[NEW FEATURE] - ' 4 | labels: ['feature-request'] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: Thanks for making Snapshot awesome for everyone. 9 | - type: input 10 | id: title 11 | attributes: 12 | label: Briefly describe the feature. 13 | description: A clear and concise description of the feature you are requesting. 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: problem 18 | attributes: 19 | label: Which problem is this feature trying to solve? 20 | description: A clear description of the problem or frustration that will be solved with this feature. 21 | placeholder: ex. I'm always frustrated when I am viewing the proposal metrics 22 | validations: 23 | required: true 24 | - type: textarea 25 | id: solution 26 | attributes: 27 | label: What is the expected solution? 28 | description: A clear and concise description of what you expected to happen. 29 | placeholder: ex. Having a chart to read the votes on the proposal will make it very easy to read the proposal metrics. 30 | validations: 31 | required: true 32 | - type: textarea 33 | id: alternatives 34 | attributes: 35 | label: How do you currently handle this problem? 36 | description: A clear and concise description of any alternative solutions or features you've considered. 37 | validations: 38 | required: false 39 | - type: textarea 40 | id: additional 41 | attributes: 42 | label: Anything else you'd like to mention? 43 | description: Please mention any technical details, screenshots, mock-ups that you might have for us to better understand the feature. 44 | validations: 45 | required: false 46 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Summary 2 | 3 | 4 | 5 | Closes: # 6 | 7 | ### How to test 8 | 9 | 1. 10 | 11 | ### To-Do 12 | 13 | - [ ] 14 | 15 | 21 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: [push] 3 | 4 | jobs: 5 | build-test: 6 | runs-on: ubuntu-20.04 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: actions/setup-node@v3 10 | with: 11 | node-version: '18' 12 | cache: 'yarn' 13 | - run: yarn --frozen-lockfile 14 | - run: yarn build 15 | - run: yarn typecheck 16 | - run: yarn lint:nofix 17 | - run: yarn test 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /coverage 5 | .yalc 6 | components.d.ts 7 | auto-imports.d.ts 8 | .eslintrc-auto-import.json 9 | 10 | # local env files 11 | .env.local 12 | .env.*.local 13 | 14 | # Log files 15 | npm-debug.log* 16 | yarn-debug.log* 17 | yarn-error.log* 18 | pnpm-debug.log* 19 | 20 | # Editor directories and files 21 | .idea 22 | .vscode 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Snapshot Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Test CI](https://github.com/snapshot-labs/sx-ui/actions/workflows/test.yml/badge.svg)](https://github.com/snapshot-labs/sx-ui/actions/workflows/test.yml) 2 | [![Discord](https://img.shields.io/discord/707079246388133940.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.snapshot.org/) 3 | 4 | # Snapshot X 5 | 6 | An open source interface for Snapshot X protocol. 7 | 8 | **[Website](https://snapshotx.xyz)** 9 | 10 | **[Documentation](https://obytejs.com)** 11 | 12 | ## Project setup 13 | 14 | ``` 15 | yarn 16 | ``` 17 | 18 | ### Compiles and hot-reloads for development 19 | 20 | ``` 21 | yarn dev 22 | ``` 23 | 24 | ### Compiles and minifies for production 25 | 26 | ``` 27 | yarn build 28 | ``` 29 | 30 | ### Lints and fixes files 31 | 32 | ``` 33 | yarn lint 34 | ``` 35 | 36 | ### Runs tests 37 | 38 | ``` 39 | yarn test 40 | ``` 41 | 42 | ### Verifies TypeScript code 43 | 44 | ``` 45 | yarn typecheck 46 | ``` 47 | 48 | ## Development guide 49 | 50 | This project uses `goerli` and `testnet-2` Starknet networks. Make sure that your Metamask/ArgentX is 51 | configured for those networks. 52 | 53 | If you need testnet funds you can use: 54 | 55 | - [PoW faucet](https://goerli-faucet.pk910.de) to acquire ETH on goerli. 56 | - [`0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6`](https://goerli.etherscan.io/address/0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6#writeContract) to wrap ETH to WETH. 57 | - [`0xAEA4513378Eb6023CF9cE730a26255D0e3F075b9`](https://goerli.etherscan.io/address/0xAEA4513378Eb6023CF9cE730a26255D0e3F075b9#writeProxyContract) to move ETH to Starknet testnet-2. 58 | 59 | If you want to test proposals that verify your WETH balance on Starknet proposals proofs have to be computed on L2. 60 | This is done manually currently. 61 | 62 | To do it: 63 | 64 | - Take some block on goerli at which you have your desired amount of WETH 65 | - Visit `https://mana.pizza/fossil/send/BLOCK_NUM_1` where BLOCK_NUM_1 is block you want to send to L2 66 | - Visit `https://mana.pizza/fossil/process/BLOCK_NUM_2` where BLOCK_NUM_2 is the block you used above **minus 1** 67 | 68 | If you need to modify services that are used by sx-ui you can specify them in `.env` file or applicable 69 | file in `./src/networks`. 70 | 71 | ## License 72 | 73 | Snapshot is open-sourced software licensed under the © [MIT license](LICENSE). 74 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'] 3 | }; 4 | -------------------------------------------------------------------------------- /histoire.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'histoire'; 2 | import { HstVue } from '@histoire/plugin-vue'; 3 | 4 | export default defineConfig({ 5 | plugins: [HstVue()], 6 | setupFile: './src/histoire-setup.ts', 7 | theme: { 8 | defaultColorScheme: 'light', 9 | favicon: './public/favicon-temp.svg', 10 | title: 'Tune UI', 11 | colors: { 12 | gray: { 13 | 50: '#FBFBFB', 14 | 100: '#FBFBFB', 15 | 200: '#FBFBFB', 16 | 300: '#EDEDED', 17 | 400: '#EDEDED', 18 | 500: '#A09FA4', 19 | 600: '#A09FA4', 20 | 700: '#1C1B20', 21 | 750: '#29282E', 22 | 800: '#29282E', 23 | 850: '#29282E', 24 | 900: '#29282E', 25 | 950: '#29282E' 26 | }, 27 | primary: { 28 | 50: '#EDEDED', 29 | 100: '#EDEDED', 30 | 200: '#EDEDED', 31 | 300: '#f3b04e', 32 | 400: '#f3b04e', 33 | 500: '#f3b04e', 34 | 600: '#f3b04e', 35 | 700: '#f3b04e', 36 | 800: '#f3b04e', 37 | 900: '#29282E' 38 | } 39 | } 40 | }, 41 | backgroundPresets: [] 42 | }); 43 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Snapshot X 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow } = require('electron'); 2 | const path = require('path'); 3 | 4 | function createWindow() { 5 | const win = new BrowserWindow({ 6 | width: 400, // 357 7 | height: 660, // 600 8 | webPreferences: { 9 | preload: path.join(__dirname, 'preload.js') 10 | } 11 | }); 12 | 13 | win.loadFile('dist/index.html'); 14 | } 15 | 16 | app.whenReady().then(() => { 17 | createWindow(); 18 | 19 | app.on('activate', () => { 20 | if (BrowserWindow.getAllWindows().length === 0) { 21 | createWindow(); 22 | } 23 | }); 24 | }); 25 | 26 | app.on('window-all-closed', () => { 27 | if (process.platform !== 'darwin') { 28 | app.quit(); 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sx-ui", 3 | "version": "0.1.0", 4 | "license": "MIT", 5 | "main": "main.js", 6 | "repository": "snapshot-labs/sx-ui", 7 | "scripts": { 8 | "dev": "vite --port=8080", 9 | "build": "vite build", 10 | "story:dev": "histoire dev", 11 | "story:build": "histoire build", 12 | "lint:nofix": "eslint \"./src/**/*.{ts,vue,json}\"", 13 | "lint": "yarn lint:nofix --fix", 14 | "typecheck": "vue-tsc --noEmit", 15 | "test": "vitest run", 16 | "test:watch": "vitest", 17 | "electron:start": "electron .", 18 | "electron:build": "ELECTRON=true yarn build" 19 | }, 20 | "eslintConfig": { 21 | "extends": [ 22 | "@snapshot-labs/vue", 23 | "./.eslintrc-auto-import.json" 24 | ] 25 | }, 26 | "prettier": "@snapshot-labs/prettier-config", 27 | "dependencies": { 28 | "@apollo/client": "^3.8.4", 29 | "@argent/get-starknet": "^6.4.7", 30 | "@braintree/sanitize-url": "^6.0.4", 31 | "@ensdomains/eth-ens-namehash": "^2.0.15", 32 | "@ethersproject/abi": "^5.7.0", 33 | "@ethersproject/address": "^5.7.0", 34 | "@ethersproject/bignumber": "^5.7.0", 35 | "@ethersproject/constants": "^5.7.0", 36 | "@ethersproject/contracts": "^5.7.0", 37 | "@ethersproject/hash": "^5.7.0", 38 | "@ethersproject/providers": "^5.7.2", 39 | "@ethersproject/units": "^5.7.0", 40 | "@floating-ui/vue": "^1.0.2", 41 | "@headlessui/vue": "^1.7.16", 42 | "@openzeppelin/merkle-tree": "^1.0.5", 43 | "@snapshot-labs/eslint-config-vue": "^0.1.0-beta.13", 44 | "@snapshot-labs/lock": "^0.2.0", 45 | "@snapshot-labs/pineapple": "^1.1.0", 46 | "@snapshot-labs/prettier-config": "^0.1.0-beta.7", 47 | "@snapshot-labs/sx": "^0.1.0-beta.58", 48 | "@vueuse/core": "^10.4.1", 49 | "@walletconnect/core": "^2.11.0", 50 | "@walletconnect/types": "^2.11.0", 51 | "@walletconnect/utils": "^2.11.0", 52 | "@walletconnect/web3wallet": "^1.10.0", 53 | "ajv": "^8.12.0", 54 | "ajv-formats": "^2.1.1", 55 | "buffer": "^6.0.3", 56 | "dayjs": "^1.11.10", 57 | "electron": "^26.2.3", 58 | "events": "^3.3.0", 59 | "graphql": "^16.8.1", 60 | "graphql-tag": "^2.12.6", 61 | "ipfs-http-client": "^60.0.1", 62 | "js-sha3": "^0.9.2", 63 | "lodash.set": "^4.3.2", 64 | "mixpanel-browser": "^2.47.0", 65 | "object-hash": "^3.0.0", 66 | "pinia": "^2.1.6", 67 | "remarkable": "^2.0.1", 68 | "scrollmonitor": "^1.2.11", 69 | "starknet": "5.25.0", 70 | "stream-browserify": "^3.0.0", 71 | "unplugin-auto-import": "^0.16.6", 72 | "util": "^0.12.5", 73 | "vue": "^3.4.15", 74 | "vue-router": "^4.2.5", 75 | "vuedraggable": "^4.1.0" 76 | }, 77 | "devDependencies": { 78 | "@histoire/plugin-vue": "^0.17.4", 79 | "@iconify-json/heroicons-outline": "^1.1.7", 80 | "@iconify-json/heroicons-solid": "^1.1.8", 81 | "@rollup/plugin-inject": "^5.0.3", 82 | "@types/mixpanel-browser": "^2.47.4", 83 | "@types/node": "^20.7.1", 84 | "@types/remarkable": "^2.0.4", 85 | "@vitejs/plugin-vue": "^5.0.3", 86 | "autoprefixer": "^10.4.16", 87 | "eslint": "^8.56.0", 88 | "histoire": "^0.17.9", 89 | "husky": "^8.0.3", 90 | "postcss": "^8.4.30", 91 | "prettier": "^3.0.3", 92 | "rollup-plugin-visualizer": "^5.9.2", 93 | "sass": "^1.68.0", 94 | "tailwindcss": "^3.3.3", 95 | "typescript": "^5.2.2", 96 | "unplugin-icons": "^0.17.0", 97 | "unplugin-vue-components": "^0.25.2", 98 | "vite": "^5.0.12", 99 | "vitest": "^1.2.2", 100 | "vue-tsc": "^1.8.27" 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /preload.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('DOMContentLoaded', () => { 2 | const replaceText = (selector, text) => { 3 | const element = document.getElementById(selector); 4 | if (element) element.innerText = text; 5 | }; 6 | 7 | for (const type of ['chrome', 'node', 'electron']) { 8 | replaceText(`${type}-version`, process.versions[type]); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /public/favicon-temp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Snapshot X", 3 | "name": "Snapshot X", 4 | "description": "Where decisions get made", 5 | "iconPath": "favicon-temp.svg", 6 | "start_url": ".", 7 | "display": "standalone", 8 | "theme_color": "#000000", 9 | "background_color": "#ffffff" 10 | } 11 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 65 | 66 | 106 | 107 | 118 | -------------------------------------------------------------------------------- /src/assets/connectors/coinbase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/coinbase.png -------------------------------------------------------------------------------- /src/assets/connectors/gnosis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/gnosis.png -------------------------------------------------------------------------------- /src/assets/connectors/metamask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/metamask.png -------------------------------------------------------------------------------- /src/assets/connectors/portis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/portis.png -------------------------------------------------------------------------------- /src/assets/connectors/starknet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/starknet.png -------------------------------------------------------------------------------- /src/assets/connectors/walletconnect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/connectors/walletconnect.png -------------------------------------------------------------------------------- /src/assets/fonts/Calibre-Medium-Custom.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/fonts/Calibre-Medium-Custom.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Calibre-Semibold-Custom.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/fonts/Calibre-Semibold-Custom.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/SpaceMono-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/fonts/SpaceMono-Bold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/SpaceMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snapshot-labs/sx-ui/5344667bcffb88c73f7c6a0260425283c7537e2c/src/assets/fonts/SpaceMono-Regular.woff2 -------------------------------------------------------------------------------- /src/assets/grid-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/grid-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/discord.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | -------------------------------------------------------------------------------- /src/components/Block/ContactPicker.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 69 | -------------------------------------------------------------------------------- /src/components/Block/Execution.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /src/components/Block/InfiniteScroller.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 74 | -------------------------------------------------------------------------------- /src/components/Block/NftPicker.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 39 | -------------------------------------------------------------------------------- /src/components/Block/SpaceFormController.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 48 | -------------------------------------------------------------------------------- /src/components/Block/SpaceFormNetwork.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 36 | -------------------------------------------------------------------------------- /src/components/Block/SpaceFormStrategies.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /src/components/Block/SpaceFormVoting.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 60 | -------------------------------------------------------------------------------- /src/components/Container.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /src/components/ExecutionButton.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | 27 | 35 | -------------------------------------------------------------------------------- /src/components/Label.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /src/components/Layout.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/components/Link.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | -------------------------------------------------------------------------------- /src/components/MarkdownEditor.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 |