@visualizevalue/mint-app-base 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +26 -0
- package/README.md +24 -0
- package/app/app.vue +7 -0
- package/app/assets/styles/animation.css +50 -0
- package/app/assets/styles/base.css +34 -0
- package/app/assets/styles/cards.css +20 -0
- package/app/assets/styles/custom-media.css +4 -0
- package/app/assets/styles/custom-selectors.css +1 -0
- package/app/assets/styles/forms.css +183 -0
- package/app/assets/styles/index.css +11 -0
- package/app/assets/styles/normalize.css +541 -0
- package/app/assets/styles/prose.css +166 -0
- package/app/assets/styles/scroll.css +13 -0
- package/app/assets/styles/text.css +14 -0
- package/app/assets/styles/utils.css +24 -0
- package/app/assets/styles/variables.css +195 -0
- package/app/assets/styles/web3-modals.css +26 -0
- package/app/components/Account.client.vue +20 -0
- package/app/components/Actions.vue +25 -0
- package/app/components/AppHeader.vue +99 -0
- package/app/components/Authenticated.client.vue +17 -0
- package/app/components/Avatar.vue +61 -0
- package/app/components/BlocksTimeAgo.client.vue +20 -0
- package/app/components/Breadcrumbs.vue +51 -0
- package/app/components/Button.vue +98 -0
- package/app/components/CardLink.vue +38 -0
- package/app/components/CheckSpinner.vue +39 -0
- package/app/components/Collection/Intro.vue +111 -0
- package/app/components/Collection/OverviewCard.vue +73 -0
- package/app/components/Collection/Withdraw.client.vue +61 -0
- package/app/components/CollectionsOverview.client.vue +58 -0
- package/app/components/Connect.client.vue +88 -0
- package/app/components/CountDown.vue +153 -0
- package/app/components/DialogFrame.vue +96 -0
- package/app/components/ExpandableText.vue +50 -0
- package/app/components/Form/Errors.vue +18 -0
- package/app/components/Form/Group.vue +57 -0
- package/app/components/Form/Input.vue +48 -0
- package/app/components/Form/SelectFile.vue +60 -0
- package/app/components/GasPrice.client.vue +9 -0
- package/app/components/HeaderSection.vue +18 -0
- package/app/components/Icon.vue +37 -0
- package/app/components/IconLink.vue +29 -0
- package/app/components/Image.client.vue +120 -0
- package/app/components/Loading.vue +79 -0
- package/app/components/MintGasPrice.client.vue +20 -0
- package/app/components/MintGasPricePopover.client.vue +69 -0
- package/app/components/MintToken.vue +89 -0
- package/app/components/MintTokenBar.vue +79 -0
- package/app/components/Modal.vue +36 -0
- package/app/components/Navbar.client.vue +86 -0
- package/app/components/Page/Frame.vue +77 -0
- package/app/components/Page/FrameSM.vue +33 -0
- package/app/components/Popover.client.vue +119 -0
- package/app/components/Profile/Header.client.vue +96 -0
- package/app/components/QueryDialog.vue +38 -0
- package/app/components/ToggleDarkMode.client.vue +58 -0
- package/app/components/Token/Detail.client.vue +194 -0
- package/app/components/Token/MintTimeline.client.vue +110 -0
- package/app/components/Token/MintTimelineItem.vue +33 -0
- package/app/components/Token/OverviewCard.vue +140 -0
- package/app/components/TransactionFlow.vue +225 -0
- package/app/components/Visual/ImagePreview.vue +8 -0
- package/app/composables/account.ts +21 -0
- package/app/composables/app.ts +15 -0
- package/app/composables/artistData.ts +22 -0
- package/app/composables/chainId.ts +25 -0
- package/app/composables/collections.ts +435 -0
- package/app/composables/darkMode.ts +1 -0
- package/app/composables/gasPrice.ts +46 -0
- package/app/composables/head.ts +29 -0
- package/app/composables/priceFeed.ts +80 -0
- package/app/composables/subdomain.ts +27 -0
- package/app/error.vue +31 -0
- package/app/layouts/default.vue +42 -0
- package/app/middleware/lowercaseId.ts +1 -0
- package/app/middleware/lowercaseProfileAddress.ts +1 -0
- package/app/middleware/redirectUserScope.ts +13 -0
- package/app/pages/[id]/[collection]/[tokenId]/index.vue +66 -0
- package/app/pages/[id]/[collection]/[tokenId].vue +25 -0
- package/app/pages/[id]/[collection]/index.vue +51 -0
- package/app/pages/[id]/[collection]/mint.vue +260 -0
- package/app/pages/[id]/[collection].vue +24 -0
- package/app/pages/[id]/add.vue +40 -0
- package/app/pages/[id]/create.vue +177 -0
- package/app/pages/[id]/index.vue +43 -0
- package/app/pages/[id].vue +9 -0
- package/app/pages/index.vue +47 -0
- package/app/pages/profile/[address]/index.vue +51 -0
- package/app/pages/profile/[address].vue +9 -0
- package/app/pages/profile/index.vue +28 -0
- package/app/plugins/1.polyfill.client.ts +12 -0
- package/app/plugins/2.wagmi.ts +57 -0
- package/app/router.options.ts +25 -0
- package/app/utils/abis.ts +77 -0
- package/app/utils/arrays.ts +1 -0
- package/app/utils/artifact.ts +21 -0
- package/app/utils/breakpoints.ts +11 -0
- package/app/utils/dates.ts +23 -0
- package/app/utils/format.ts +60 -0
- package/app/utils/images.ts +27 -0
- package/app/utils/ipfs.ts +13 -0
- package/app/utils/lowercaseRouteParam.ts +10 -0
- package/app/utils/serializer.ts +18 -0
- package/app/utils/strings.ts +30 -0
- package/app/utils/time.ts +23 -0
- package/app/utils/types.ts +62 -0
- package/app/utils/urls.ts +43 -0
- package/nuxt.config.ts +130 -0
- package/package.json +44 -0
- package/public/apple-touch-icon-512x512.png +0 -0
- package/public/example-contract-icon-original.svg +5 -0
- package/public/example-contract-icon.svg +5 -0
- package/public/favicon.ico +0 -0
- package/public/icon.svg +8 -0
- package/public/icons/check.svg +3 -0
- package/public/icons/opepen.svg +264 -0
- package/public/icons/wallets/coinbase.svg +4 -0
- package/public/icons/wallets/metamask.svg +1 -0
- package/public/icons/wallets/rainbow.svg +59 -0
- package/public/icons/wallets/walletconnect.svg +1 -0
- package/public/maskable-icon-512x512.png +0 -0
- package/public/pwa-192x192.png +0 -0
- package/public/pwa-512x512.png +0 -0
- package/public/pwa-64x64.png +0 -0
- package/server/middleware/log.ts +3 -0
- package/server/middleware/subdomain.ts +12 -0
- package/server/tsconfig.json +3 -0
- package/tsconfig.json +4 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.centered {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
gap: var(--spacer);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.muted {
|
|
10
|
+
color: var(--muted) !important;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.muted-light {
|
|
14
|
+
color: var(--muted-light) !important;
|
|
15
|
+
|
|
16
|
+
&a, &.button,
|
|
17
|
+
> a, > .button {
|
|
18
|
+
transition: color var(--speed);
|
|
19
|
+
|
|
20
|
+
:--highlight {
|
|
21
|
+
color: var(--color) !important;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* GRAYS */
|
|
3
|
+
--white: rgb(255,255,255);
|
|
4
|
+
--gray-50: rgb(250,250,250);
|
|
5
|
+
--gray-100: rgb(245,245,245);
|
|
6
|
+
--gray-200: rgb(229,229,229);
|
|
7
|
+
--gray-300: rgb(212,212,212);
|
|
8
|
+
--gray-400: rgb(163,163,163);
|
|
9
|
+
--gray-500: rgb(115,115,115);
|
|
10
|
+
--gray-600: rgb(82,82,82);
|
|
11
|
+
--gray-700: rgb(64,64,64);
|
|
12
|
+
--gray-800: rgb(38,38,38);
|
|
13
|
+
--gray-900: rgb(19,19,19);
|
|
14
|
+
--gray-950: rgb(10,10,10);
|
|
15
|
+
--black: rgb(0, 0, 0);
|
|
16
|
+
|
|
17
|
+
/* SEMI */
|
|
18
|
+
--white-semi: rgba(255,255,255, 0.7);
|
|
19
|
+
--gray-50-semi: rgba(250,250,250, 0.7);
|
|
20
|
+
--gray-100-semi: rgba(245,245,245, 0.7);
|
|
21
|
+
--gray-200-semi: rgba(229,229,229, 0.7);
|
|
22
|
+
--gray-300-semi: rgba(212,212,212, 0.7);
|
|
23
|
+
--gray-400-semi: rgba(163,163,163, 0.7);
|
|
24
|
+
--gray-500-semi: rgba(115,115,115, 0.7);
|
|
25
|
+
--gray-600-semi: rgba(82,82,82, 0.7);
|
|
26
|
+
--gray-700-semi: rgba(64,64,64, 0.7);
|
|
27
|
+
--gray-800-semi: rgba(38,38,38, 0.7);
|
|
28
|
+
--gray-900-semi: rgba(23,23,23, 0.7);
|
|
29
|
+
--gray-950-semi: rgba(10,10,10, 0.7);
|
|
30
|
+
--black-semi: rgba(0, 0, 0, 0.7);
|
|
31
|
+
|
|
32
|
+
/* COLORS */
|
|
33
|
+
--red: #EF4444;
|
|
34
|
+
--green: #94E337;
|
|
35
|
+
|
|
36
|
+
/* PRESET COLORS */
|
|
37
|
+
--error: var(--red);
|
|
38
|
+
--success: var(--green);
|
|
39
|
+
|
|
40
|
+
/* SIZES */
|
|
41
|
+
--100vh: 100dvh;
|
|
42
|
+
--size-0: 0.125rem;
|
|
43
|
+
--size-1: 0.25rem;
|
|
44
|
+
--size-2: 0.5rem;
|
|
45
|
+
--size-3: 0.75rem;
|
|
46
|
+
--size-4: 1rem;
|
|
47
|
+
--size-5: 1.25rem;
|
|
48
|
+
--size-6: 1.5rem;
|
|
49
|
+
--size-7: 2rem;
|
|
50
|
+
--size-8: 3rem;
|
|
51
|
+
--size-9: 4.5rem;
|
|
52
|
+
--size-10: 6rem;
|
|
53
|
+
|
|
54
|
+
--spacer-xs: var(--size-0);
|
|
55
|
+
--spacer-sm: var(--size-2);
|
|
56
|
+
--spacer: var(--size-4);
|
|
57
|
+
--spacer-lg: var(--size-7);
|
|
58
|
+
--spacer-xl: var(--size-9);
|
|
59
|
+
|
|
60
|
+
--border-radius: var(--size-1);
|
|
61
|
+
|
|
62
|
+
/* FONTS */
|
|
63
|
+
--font-family-main: serif;
|
|
64
|
+
--font-family-prose: var(--font-family-main);
|
|
65
|
+
--font-family-ui: var(--font-family-main);
|
|
66
|
+
|
|
67
|
+
--font-base: 13px;
|
|
68
|
+
--font-base: 15px;
|
|
69
|
+
--font-xs: calc(var(--font-base) * 0.8);
|
|
70
|
+
--font-sm: calc(var(--font-base) * 0.8);
|
|
71
|
+
--font-lg: min(calc(var(--font-base) + 1vw * 2), calc(var(--font-base) * 1.25));
|
|
72
|
+
--font-xl: min(calc(var(--font-lg) + 1vw * 2), calc(var(--font-lg) * 1.25));
|
|
73
|
+
--font-title: min(calc(var(--size-4) + 1vw * 2), var(--size-7));
|
|
74
|
+
--font-display: min(calc(var(--size-6) + 1vw * 2), var(--size-8));
|
|
75
|
+
--font-weight-light: 300;
|
|
76
|
+
--font-weight: normal;
|
|
77
|
+
--font-weight-bold: bold;
|
|
78
|
+
--rem: 16px;
|
|
79
|
+
|
|
80
|
+
--letter-spacing-sm: -0.025em;
|
|
81
|
+
--letter-spacing: 0.025em;
|
|
82
|
+
--letter-spacing-md: 0.05em;
|
|
83
|
+
--letter-spacing-lg: 0.1em;
|
|
84
|
+
|
|
85
|
+
--line-height-sm: 105%;
|
|
86
|
+
--line-height: 100%;
|
|
87
|
+
--line-height-md: 120%;
|
|
88
|
+
--line-height-lg: 160%;
|
|
89
|
+
|
|
90
|
+
--text-transform: none;
|
|
91
|
+
|
|
92
|
+
/* ANIMATION */
|
|
93
|
+
--speed-fast: 0.15s;
|
|
94
|
+
--speed: 0.3s;
|
|
95
|
+
--speed-slow: 0.75s;
|
|
96
|
+
|
|
97
|
+
/* COMPONENTS */
|
|
98
|
+
--dialog-width: 27rem;
|
|
99
|
+
--content-width: 40rem;
|
|
100
|
+
--content-width-lg: 72rem;
|
|
101
|
+
--navbar-height: calc(var(--size-8) + var(--size-4));
|
|
102
|
+
--navbar-width: calc(var(--size-8) + var(--size-4));
|
|
103
|
+
|
|
104
|
+
/* BORDERS */
|
|
105
|
+
--border-color: var(--gray-z-2);
|
|
106
|
+
--border-color-light: var(--gray-z-4);
|
|
107
|
+
--border-color-dark: var(--gray-z-1);
|
|
108
|
+
--border: 1px solid var(--border-color);
|
|
109
|
+
--border-dark: 1px solid var(--border-color-dark);
|
|
110
|
+
|
|
111
|
+
/* SHADOWS */
|
|
112
|
+
--shadow:
|
|
113
|
+
0 var(--size-0) var(--size-2) var(--gray-z-1-semi),
|
|
114
|
+
0 var(--size-2) var(--size-7) calc(-1 * var(--size-5)) var(--gray-z-3-semi);
|
|
115
|
+
|
|
116
|
+
--shadow-xl:
|
|
117
|
+
0 var(--size-3) var(--size-8) var(--gray-z-3-semi),
|
|
118
|
+
0 var(--size-8) var(--size-6) calc(-1 * var(--size-8)) var(--gray-z-6-semi);
|
|
119
|
+
|
|
120
|
+
/* BACKGROUNDS */
|
|
121
|
+
--blur: blur(var(--size-1));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* DARK */
|
|
125
|
+
:root {
|
|
126
|
+
--background: var(--black);
|
|
127
|
+
--gray-z-0: var(--gray-950);
|
|
128
|
+
--gray-z-1: var(--gray-900);
|
|
129
|
+
--gray-z-2: var(--gray-800);
|
|
130
|
+
--gray-z-3: var(--gray-700);
|
|
131
|
+
--gray-z-4: var(--gray-600);
|
|
132
|
+
--gray-z-5: var(--gray-500);
|
|
133
|
+
--gray-z-6: var(--gray-400);
|
|
134
|
+
--gray-z-7: var(--gray-300);
|
|
135
|
+
--gray-z-8: var(--gray-200);
|
|
136
|
+
--gray-z-9: var(--gray-100);
|
|
137
|
+
--gray-z-10: var(--gray-50);
|
|
138
|
+
--color: var(--white);
|
|
139
|
+
--muted: var(--gray-z-6);
|
|
140
|
+
--muted-light: var(--gray-z-4);
|
|
141
|
+
|
|
142
|
+
--background-0: rgba(0, 0, 0, 0);
|
|
143
|
+
--background-semi: var(--black-semi);
|
|
144
|
+
--gray-z-0-semi: var(--gray-950-semi);
|
|
145
|
+
--gray-z-1-semi: var(--gray-900-semi);
|
|
146
|
+
--gray-z-2-semi: var(--gray-800-semi);
|
|
147
|
+
--gray-z-3-semi: var(--gray-700-semi);
|
|
148
|
+
--gray-z-4-semi: var(--gray-600-semi);
|
|
149
|
+
--gray-z-5-semi: var(--gray-500-semi);
|
|
150
|
+
--gray-z-6-semi: var(--gray-400-semi);
|
|
151
|
+
--gray-z-7-semi: var(--gray-300-semi);
|
|
152
|
+
--gray-z-8-semi: var(--gray-200-semi);
|
|
153
|
+
--gray-z-9-semi: var(--gray-100-semi);
|
|
154
|
+
--gray-z-10-semi: var(--gray-50-semi);
|
|
155
|
+
--color-semi: var(--white-semi);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* LIGHT */
|
|
159
|
+
.lightmode {
|
|
160
|
+
--background: var(--white);
|
|
161
|
+
--gray-z-0: var(--gray-50);
|
|
162
|
+
--gray-z-1: var(--gray-100);
|
|
163
|
+
--gray-z-2: var(--gray-200);
|
|
164
|
+
--gray-z-3: var(--gray-300);
|
|
165
|
+
--gray-z-4: var(--gray-400);
|
|
166
|
+
--gray-z-5: var(--gray-500);
|
|
167
|
+
--gray-z-6: var(--gray-600);
|
|
168
|
+
--gray-z-7: var(--gray-700);
|
|
169
|
+
--gray-z-8: var(--gray-800);
|
|
170
|
+
--gray-z-9: var(--gray-900);
|
|
171
|
+
--gray-z-10: var(--gray-950);
|
|
172
|
+
--color: var(--black);
|
|
173
|
+
|
|
174
|
+
--background-0: rgba(255, 255, 255, 0);
|
|
175
|
+
--background-semi: var(--white-semi);
|
|
176
|
+
--gray-z-0-semi: var(--gray-50-semi);
|
|
177
|
+
--gray-z-1-semi: var(--gray-100-semi);
|
|
178
|
+
--gray-z-2-semi: var(--gray-200-semi);
|
|
179
|
+
--gray-z-3-semi: var(--gray-300-semi);
|
|
180
|
+
--gray-z-4-semi: var(--gray-400-semi);
|
|
181
|
+
--gray-z-5-semi: var(--gray-500-semi);
|
|
182
|
+
--gray-z-6-semi: var(--gray-600-semi);
|
|
183
|
+
--gray-z-7-semi: var(--gray-700-semi);
|
|
184
|
+
--gray-z-8-semi: var(--gray-800-semi);
|
|
185
|
+
--gray-z-9-semi: var(--gray-900-semi);
|
|
186
|
+
--gray-z-10-semi: var(--gray-950-semi);
|
|
187
|
+
--color-semi: var(--black-semi);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* SCALING */
|
|
191
|
+
@media (--md) {
|
|
192
|
+
:root {
|
|
193
|
+
--font-sm: calc(var(--size-3) + var(--size-0));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
wcm-modal {
|
|
2
|
+
--wcm-z-index: 9999;
|
|
3
|
+
--wcm-overlay-background-color: var(--gray-z-1-semi);
|
|
4
|
+
--wcm-overlay-backdrop-filter: var(--blur);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
#walletconnect-wrapper {
|
|
8
|
+
.walletconnect-modal__base,
|
|
9
|
+
.walletconnect-modal__base * {
|
|
10
|
+
color: black;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Metamask */
|
|
15
|
+
.select-modal {
|
|
16
|
+
> div:first-child {
|
|
17
|
+
opacity: 1 !important;
|
|
18
|
+
background: linear-gradient(
|
|
19
|
+
45deg,
|
|
20
|
+
var(--gray-z-0-semi),
|
|
21
|
+
var(--gray-z-1-semi),
|
|
22
|
+
var(--gray-z-2-semi)
|
|
23
|
+
) !important;
|
|
24
|
+
backdrop-filter: var(--blur) !important;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<span>
|
|
3
|
+
{{ display }}
|
|
4
|
+
</span>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup>
|
|
8
|
+
import { useEnsName } from '@wagmi/vue'
|
|
9
|
+
|
|
10
|
+
const props = defineProps(['address'])
|
|
11
|
+
|
|
12
|
+
const address = computed(() => props.address?.value || props.address)
|
|
13
|
+
|
|
14
|
+
const { data: ens } = await useEnsName({
|
|
15
|
+
address,
|
|
16
|
+
chainId: 1,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const display = computed(() => ens.value || shortAddress(address.value))
|
|
20
|
+
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<menu>
|
|
3
|
+
<slot />
|
|
4
|
+
</menu>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<style scoped>
|
|
8
|
+
menu {
|
|
9
|
+
width: 100%;
|
|
10
|
+
margin: 0;
|
|
11
|
+
padding: 0;
|
|
12
|
+
border: 0;
|
|
13
|
+
display: flex;
|
|
14
|
+
gap: var(--spacer);
|
|
15
|
+
justify-content: flex-end;
|
|
16
|
+
|
|
17
|
+
&:empty {
|
|
18
|
+
display: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
&.centered {
|
|
22
|
+
justify-content: center;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
</style>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<header :style="{ borderColor: y > 10 ? 'var(--border-color)' : 'transparent' }">
|
|
3
|
+
<ClientOnly>
|
|
4
|
+
<Breadcrumbs :items="breadcrumbs" />
|
|
5
|
+
|
|
6
|
+
<MintGasPricePopover />
|
|
7
|
+
|
|
8
|
+
<Connect v-if="! isConnected" />
|
|
9
|
+
<NuxtLink v-else :to="{ name: 'profile-address', params: { address: address?.toLowerCase() } }">
|
|
10
|
+
<Account :address="address" />
|
|
11
|
+
</NuxtLink>
|
|
12
|
+
</ClientOnly>
|
|
13
|
+
</header>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script setup>
|
|
17
|
+
import { useAccount } from '@wagmi/vue'
|
|
18
|
+
import { useWindowScroll } from '@vueuse/core'
|
|
19
|
+
|
|
20
|
+
const { isConnected, address } = useAccount()
|
|
21
|
+
const appBreadcumbs = useAppBreadcrumb()
|
|
22
|
+
const title = useAppTitle()
|
|
23
|
+
const id = useArtistId()
|
|
24
|
+
const breadcrumbs = computed(() => {
|
|
25
|
+
const all = [
|
|
26
|
+
{
|
|
27
|
+
to: id.value === address.value?.toLowerCase()
|
|
28
|
+
? { name: 'id', params: { id: id.value } }
|
|
29
|
+
: `/`,
|
|
30
|
+
text: title.value
|
|
31
|
+
},
|
|
32
|
+
...appBreadcumbs.value,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
return all
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
const { y } = useWindowScroll()
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<style scoped>
|
|
42
|
+
header {
|
|
43
|
+
height: var(--navbar-height);
|
|
44
|
+
position: fixed;
|
|
45
|
+
z-index: 999;
|
|
46
|
+
top: 0;
|
|
47
|
+
left: 0;
|
|
48
|
+
right: 0;
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: space-between;
|
|
52
|
+
gap: var(--spacer);
|
|
53
|
+
padding: var(--size-3) var(--size-6);
|
|
54
|
+
|
|
55
|
+
@media (--md) {
|
|
56
|
+
gap: var(--spacer-lg);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:deep(> .breadcrumb) {
|
|
60
|
+
overflow: hidden;
|
|
61
|
+
text-overflow: ellipsis;
|
|
62
|
+
justify-content: flex-start;
|
|
63
|
+
white-space: nowrap;
|
|
64
|
+
|
|
65
|
+
> *:first-child:last-child {
|
|
66
|
+
a {
|
|
67
|
+
color: var(--color);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
:deep(> .gas) {
|
|
73
|
+
display: none;
|
|
74
|
+
margin-left: auto;
|
|
75
|
+
white-space: nowrap;
|
|
76
|
+
width: min-content;
|
|
77
|
+
|
|
78
|
+
@media (--md) {
|
|
79
|
+
display: block;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
:deep(> .button:last-child) {
|
|
84
|
+
margin-right: calc(-1 * var(--size-3));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&:has(+ main > .frame.full) {
|
|
88
|
+
border-color: var(--border-color) !important;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* COLORS */
|
|
93
|
+
header {
|
|
94
|
+
background: var(--background-semi);
|
|
95
|
+
backdrop-filter: blur(var(--size-1));
|
|
96
|
+
border-bottom: var(--border);
|
|
97
|
+
border-color: transparent;
|
|
98
|
+
}
|
|
99
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<slot v-if="isConnected" />
|
|
3
|
+
<Loading v-else />
|
|
4
|
+
</template>
|
|
5
|
+
|
|
6
|
+
<script setup>
|
|
7
|
+
import { useAccount } from '@wagmi/vue'
|
|
8
|
+
|
|
9
|
+
const { isConnected } = useAccount()
|
|
10
|
+
|
|
11
|
+
const check = () => {
|
|
12
|
+
if (! isConnected.value) return navigateTo('/', { replace: true })
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
onMounted(() => check())
|
|
16
|
+
watch(isConnected, () => check())
|
|
17
|
+
</script>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="avatar">
|
|
3
|
+
<Image v-if="user.pfp" :image="user.pfp" class="bordered round" />
|
|
4
|
+
<span v-else>{{ user.domain.slice(0, 2) }}</span>
|
|
5
|
+
</div>
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<script setup>
|
|
9
|
+
const { user } = defineProps({
|
|
10
|
+
user: Object,
|
|
11
|
+
})
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<style scoped>
|
|
15
|
+
.avatar {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
height: 0;
|
|
20
|
+
padding-bottom: 100%;
|
|
21
|
+
position: relative;
|
|
22
|
+
container-type: inline-size;
|
|
23
|
+
container-name: avatar;
|
|
24
|
+
|
|
25
|
+
> * {
|
|
26
|
+
position: absolute;
|
|
27
|
+
width: 100%;
|
|
28
|
+
height: 100%;
|
|
29
|
+
top: 0;
|
|
30
|
+
left: 0;
|
|
31
|
+
overflow: hidden;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
> span {
|
|
35
|
+
font-family: var(--font-family-ui);
|
|
36
|
+
text-transform: var(--text-transform-ui);
|
|
37
|
+
font-size: var(--font-sm);
|
|
38
|
+
color: var(--white);
|
|
39
|
+
text-align: center;
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
font-size: var(--font-sm);
|
|
44
|
+
background: var(--gray-z-2);
|
|
45
|
+
border-radius: 50%;
|
|
46
|
+
border: var(--border);
|
|
47
|
+
|
|
48
|
+
@container avatar (min-width: 2rem) {
|
|
49
|
+
font-size: var(--font-base);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@container avatar (min-width: 2.75rem) {
|
|
53
|
+
font-size: var(--font-lg);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@container avatar (min-width: 3.5rem) {
|
|
57
|
+
font-size: var(--font-xl);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<span>
|
|
3
|
+
<template v-if="days">{{ days }}d</template>
|
|
4
|
+
<template v-else-if="hours">{{ hours }}h</template>
|
|
5
|
+
<template v-else-if="minutes">{{ minutes }}m</template>
|
|
6
|
+
<template v-else><1m</template>
|
|
7
|
+
<slot> ago</slot>
|
|
8
|
+
</span>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup>
|
|
12
|
+
const props = defineProps({
|
|
13
|
+
blocks: BigInt,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const seconds = computed(() => blocksToSeconds(props.blocks))
|
|
17
|
+
const minutes = computed(() => Math.floor(seconds.value / 60))
|
|
18
|
+
const hours = computed(() => Math.floor(minutes.value / 60))
|
|
19
|
+
const days = computed(() => Math.floor(hours.value / 24))
|
|
20
|
+
</script>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="breadcrumb">
|
|
3
|
+
<span v-for="item in items">
|
|
4
|
+
<NuxtLink v-if="item.to" :to="item.to">{{ item.text }}</NuxtLink>
|
|
5
|
+
<template v-else>{{ item.text }}</template>
|
|
6
|
+
</span>
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script setup>
|
|
11
|
+
defineProps({
|
|
12
|
+
items: Array,
|
|
13
|
+
})
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<style scoped>
|
|
17
|
+
.breadcrumb {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
gap: var(--spacer-sm);
|
|
22
|
+
|
|
23
|
+
> span {
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
|
|
26
|
+
&:has(+ span > a) {
|
|
27
|
+
display: none;
|
|
28
|
+
|
|
29
|
+
@media (--md) {
|
|
30
|
+
display: inherit;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
> span > a {
|
|
36
|
+
color: var(--gray-z-5);
|
|
37
|
+
transition: all var(--speed);
|
|
38
|
+
|
|
39
|
+
&.router-link-active-exact,
|
|
40
|
+
&:--highlight {
|
|
41
|
+
color: var(--color);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
> span:not(:last-child):after {
|
|
46
|
+
content: '/';
|
|
47
|
+
color: var(--gray-z-3);
|
|
48
|
+
margin-left: var(--spacer-sm);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
</style>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<NuxtLink v-if="to" :to="to" class="button" :exact="exact" :target="target"><slot /></NuxtLink>
|
|
3
|
+
<button v-else class="button"><slot /></button>
|
|
4
|
+
</template>
|
|
5
|
+
|
|
6
|
+
<script setup>
|
|
7
|
+
defineProps({
|
|
8
|
+
to: [String,Object],
|
|
9
|
+
target: {
|
|
10
|
+
type: String,
|
|
11
|
+
default: '_self',
|
|
12
|
+
},
|
|
13
|
+
exact: Boolean,
|
|
14
|
+
})
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
.button {
|
|
19
|
+
min-width: fit-content;
|
|
20
|
+
width: fit-content;
|
|
21
|
+
padding: var(--size-2) var(--size-4);
|
|
22
|
+
background: var(--background);
|
|
23
|
+
border: var(--border);
|
|
24
|
+
position: relative;
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
gap: var(--size-2);
|
|
27
|
+
justify-content: center;
|
|
28
|
+
align-items: center;
|
|
29
|
+
letter-spacing: var(--letter-spacing);
|
|
30
|
+
|
|
31
|
+
&.non-interactive,
|
|
32
|
+
&[disabled]:not([disabled="false"]) {
|
|
33
|
+
pointer-events: none;
|
|
34
|
+
}
|
|
35
|
+
&[disabled]:not([disabled="false"]) {
|
|
36
|
+
color: var(--muted);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&:--highlight {
|
|
40
|
+
background: var(--border-color);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
> span {
|
|
44
|
+
display: flex;
|
|
45
|
+
gap: var(--size-2);
|
|
46
|
+
justify-content: center;
|
|
47
|
+
text-align: center;
|
|
48
|
+
align-items: center;
|
|
49
|
+
width: 100%;
|
|
50
|
+
height: 100%;
|
|
51
|
+
|
|
52
|
+
.icon {
|
|
53
|
+
width: var(--size-4);
|
|
54
|
+
height: var(--size-4);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&.left {
|
|
59
|
+
justify-content: flex-start;
|
|
60
|
+
text-align: left;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
&.block {
|
|
64
|
+
width: 100%;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&.small {
|
|
68
|
+
padding: calc(var(--size-1) + var(--size-0)) var(--size-3);
|
|
69
|
+
font-size: var(--font-sm);
|
|
70
|
+
min-height: 0;
|
|
71
|
+
|
|
72
|
+
> span {
|
|
73
|
+
.icon {
|
|
74
|
+
width: var(--size-3);
|
|
75
|
+
height: var(--size-3);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
&.link {
|
|
81
|
+
display: inline-flex;
|
|
82
|
+
align-self: baseline;
|
|
83
|
+
align-items: baseline;
|
|
84
|
+
gap: var(--size-0);
|
|
85
|
+
height: inherit;
|
|
86
|
+
min-height: 0;
|
|
87
|
+
/* margin: 0 var(--spacer-sm) !important; */
|
|
88
|
+
margin: 0 !important;
|
|
89
|
+
padding: 0 var(--size-0) !important;
|
|
90
|
+
line-height: inherit;
|
|
91
|
+
border: 0;
|
|
92
|
+
|
|
93
|
+
.icon {
|
|
94
|
+
align-self: center;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<NuxtLink :to="to" class="card-link">
|
|
3
|
+
<span>{{ title }}</span>
|
|
4
|
+
</NuxtLink>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import type { RouteLocationRaw } from 'vue-router'
|
|
9
|
+
|
|
10
|
+
withDefaults(defineProps<{
|
|
11
|
+
to: RouteLocationRaw
|
|
12
|
+
title?: string
|
|
13
|
+
}>(), {
|
|
14
|
+
title: 'View',
|
|
15
|
+
})
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<style scoped>
|
|
19
|
+
a {
|
|
20
|
+
position: absolute;
|
|
21
|
+
left: 0;
|
|
22
|
+
right: 0;
|
|
23
|
+
bottom: 0;
|
|
24
|
+
top: 0;
|
|
25
|
+
border: 0;
|
|
26
|
+
|
|
27
|
+
span {
|
|
28
|
+
opacity: 0;
|
|
29
|
+
pointer-events: none;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
</style>
|
|
33
|
+
|
|
34
|
+
<style>
|
|
35
|
+
*:has(> .card-link) {
|
|
36
|
+
position: relative;
|
|
37
|
+
}
|
|
38
|
+
</style>
|