@nuxtify/pages 0.2.0 → 0.3.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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -203
  3. package/dist/module.d.mts +0 -83
  4. package/dist/module.json +2 -2
  5. package/dist/module.mjs +9 -66
  6. package/dist/runtime/components/EmailSubscribeForm.vue +75 -75
  7. package/dist/runtime/components/FooterCallToAction.vue +29 -29
  8. package/dist/runtime/components/app/AppBar.vue +109 -109
  9. package/dist/runtime/components/app/AppFooter.vue +132 -132
  10. package/dist/runtime/components/app/AppNavigationDrawer.vue +86 -86
  11. package/dist/runtime/layouts/DefaultLayout.vue +25 -23
  12. package/dist/runtime/pages/DynamicSlug.vue +15 -15
  13. package/dist/runtime/pages/IndexPage.vue +16 -12
  14. package/dist/runtime/server/tsconfig.json +3 -3
  15. package/dist/runtime/utils/icons.d.ts +1 -1
  16. package/dist/runtime/utils/icons.js +1 -1
  17. package/package.json +64 -65
  18. package/dist/runtime/components/app/AppAnnouncementBar.vue +0 -36
  19. package/dist/runtime/components/app/AppAnnouncementBar.vue.d.ts +0 -2
  20. package/dist/runtime/components/app/AppDialog.vue +0 -38
  21. package/dist/runtime/components/app/AppDialog.vue.d.ts +0 -2
  22. package/dist/runtime/components/app/AppLoading.vue +0 -16
  23. package/dist/runtime/components/app/AppLoading.vue.d.ts +0 -2
  24. package/dist/runtime/components/app/AppLogo.vue +0 -41
  25. package/dist/runtime/components/app/AppLogo.vue.d.ts +0 -23
  26. package/dist/runtime/components/app/AppToast.vue +0 -16
  27. package/dist/runtime/components/app/AppToast.vue.d.ts +0 -2
  28. package/dist/runtime/composables/dialog.d.ts +0 -13
  29. package/dist/runtime/composables/dialog.js +0 -15
  30. package/dist/runtime/composables/nuxtify.d.ts +0 -2
  31. package/dist/runtime/composables/nuxtify.js +0 -2
  32. package/dist/runtime/composables/state.d.ts +0 -15
  33. package/dist/runtime/composables/state.js +0 -10
  34. package/dist/runtime/server/composables/client.d.ts +0 -1
  35. package/dist/runtime/server/composables/client.js +0 -1
  36. package/dist/runtime/server/utils/client.d.ts +0 -1
  37. package/dist/runtime/server/utils/client.js +0 -1
  38. package/dist/runtime/utils/formRules.d.ts +0 -19
  39. package/dist/runtime/utils/formRules.js +0 -23
  40. package/dist/runtime/utils/io.d.ts +0 -2
  41. package/dist/runtime/utils/io.js +0 -19
  42. package/dist/runtime/utils/math.d.ts +0 -2
  43. package/dist/runtime/utils/math.js +0 -13
  44. package/dist/runtime/utils/text.d.ts +0 -23
  45. package/dist/runtime/utils/text.js +0 -159
  46. package/dist/runtime/utils/time.d.ts +0 -2
  47. package/dist/runtime/utils/time.js +0 -7
  48. package/dist/runtime/utils/url.d.ts +0 -9
  49. package/dist/runtime/utils/url.js +0 -27
  50. package/dist/runtime/utils/util.d.ts +0 -7
  51. package/dist/runtime/utils/util.js +0 -5
  52. package/dist/runtime/utils/youtube.d.ts +0 -1
  53. package/dist/runtime/utils/youtube.js +0 -13
package/dist/module.mjs CHANGED
@@ -1,9 +1,13 @@
1
- import { defineNuxtModule, createResolver, installModule, addLayout, addComponentsDir, addImportsDir, addServerImportsDir, extendPages } from '@nuxt/kit';
1
+ import { defineNuxtModule, createResolver, installModule, addLayout, addComponentsDir, addImportsDir, extendPages } from '@nuxt/kit';
2
2
  import { defu } from 'defu';
3
3
 
4
+ const name = "@nuxtify/pages";
5
+ const version = "0.3.1";
6
+
4
7
  const module = defineNuxtModule({
5
8
  meta: {
6
- name: "nuxtify-pages",
9
+ name,
10
+ version,
7
11
  configKey: "nuxtifyPages",
8
12
  compatibility: {
9
13
  nuxt: ">=3.16.0",
@@ -11,32 +15,6 @@ const module = defineNuxtModule({
11
15
  }
12
16
  },
13
17
  defaults: {
14
- // Brand
15
- brand: {
16
- name: "nuxtify-pages",
17
- domain: "",
18
- tagline: "",
19
- logo: {
20
- lightUrl: "",
21
- darkUrl: "",
22
- width: 200,
23
- mobileWidth: 150
24
- }
25
- },
26
- // Pages
27
- pages: {
28
- policies: {
29
- privacyUrl: "/privacy",
30
- termsUrl: "/terms"
31
- }
32
- },
33
- // Announcement
34
- announcement: {
35
- show: false,
36
- message: "",
37
- buttonText: "",
38
- buttonUrl: ""
39
- },
40
18
  // Navigation
41
19
  navigation: {
42
20
  primary: [],
@@ -47,15 +25,6 @@ const module = defineNuxtModule({
47
25
  // Footer
48
26
  footer: {
49
27
  copyright: "",
50
- credits: {
51
- creator: {
52
- name: "",
53
- domain: ""
54
- },
55
- prependText: "",
56
- appendText: "",
57
- showPoweredBy: true
58
- },
59
28
  cta: {
60
29
  show: false,
61
30
  title: "",
@@ -65,8 +34,6 @@ const module = defineNuxtModule({
65
34
  },
66
35
  // Email
67
36
  email: {
68
- general: "",
69
- support: "",
70
37
  provider: {
71
38
  defaultSubmitUrl: ""
72
39
  }
@@ -80,31 +47,9 @@ const module = defineNuxtModule({
80
47
  },
81
48
  async setup(_options, _nuxt) {
82
49
  const resolver = createResolver(import.meta.url);
83
- await installModule("vuetify-nuxt-module", {
84
- vuetifyOptions: {
85
- icons: {
86
- defaultSet: "mdi-svg"
87
- },
88
- theme: {
89
- themes: {
90
- light: {
91
- colors: {
92
- primary: "#020420",
93
- secondary: "#00DC82",
94
- background: "#fff"
95
- }
96
- }
97
- }
98
- },
99
- defaults: {
100
- VBtn: { color: "secondary", variant: "flat", class: "text-none" },
101
- VAlert: {
102
- VBtn: { color: "inherit" }
103
- },
104
- VFooter: {
105
- VBtn: { color: "inherit" }
106
- }
107
- }
50
+ await installModule("@nuxtify/core", {
51
+ brand: {
52
+ name: "@nuxtify/pages"
108
53
  }
109
54
  });
110
55
  _nuxt.options.appConfig.nuxtify = defu(_nuxt.options.appConfig.nuxtify, {
@@ -117,9 +62,7 @@ const module = defineNuxtModule({
117
62
  path: resolver.resolve("./runtime/components")
118
63
  });
119
64
  addImportsDir(resolver.resolve("./runtime/composables"));
120
- addServerImportsDir(resolver.resolve("./runtime/server/composables"));
121
65
  addImportsDir(resolver.resolve("./runtime/utils"));
122
- addServerImportsDir(resolver.resolve("./runtime/server/utils"));
123
66
  extendPages((pages) => {
124
67
  pages.unshift({
125
68
  name: "index",
@@ -1,15 +1,15 @@
1
1
  <script setup>
2
2
  import {
3
- useId,
3
+ formRules,
4
+ getBaseUrl,
5
+ getUtmParams,
6
+ isExternalUrl,
4
7
  navigateTo,
5
- useDisplay,
6
8
  ref,
7
- useNuxtifyConfig,
8
- getUtmParams,
9
- getBaseUrl,
10
9
  submitFormData,
11
- formRules,
12
- isExternalUrl
10
+ useDisplay,
11
+ useId,
12
+ useNuxtifyConfig
13
13
  } from "#imports";
14
14
  const props = defineProps({
15
15
  submitUrl: {
@@ -117,74 +117,74 @@ async function handleSubmit() {
117
117
  </script>
118
118
 
119
119
  <template>
120
- <!-- Form -->
121
- <v-form
122
- v-if="!isSubmitted"
123
- ref="form"
124
- validate-on="submit"
125
- @submit.prevent="handleSubmit"
126
- >
127
- <div class="d-sm-flex justify-center">
128
- <!-- Using useId prevents hydration mismatch warnings issue with Vuetify -->
129
- <!-- See: https://github.com/vuetifyjs/vuetify/issues/19696 -->
130
- <!-- Once the issue is resolved (and it's used internally in Vuetify), remove use of useId -->
131
- <v-text-field
132
- :id
133
- v-model="formInput.email"
134
- type="email"
135
- color="secondary"
136
- :placeholder="emailPlaceholder"
137
- :rules="[formRules.required, formRules.validEmail]"
138
- :rounded="xs ? 't-lg' : '0 ts-lg'"
139
- hide-details="auto"
140
- class="text-start"
141
- >
142
- <template #message="{ message }">
143
- <span :class="dark ? 'text-red-lighten-3' : ''">{{ message }}</span>
144
- </template>
145
- </v-text-field>
146
- <v-btn
147
- type="submit"
148
- variant="flat"
149
- color="secondary"
150
- size="x-large"
151
- class="d-flex align-center py-7 mt-2 mt-sm-0"
152
- :loading
153
- :rounded="rounded()"
154
- :append-icon="appendButtonIcon"
155
- :prepend-icon="prependButtonIcon"
156
- :block="xs"
157
- >
158
- {{ buttonText }}
159
- </v-btn>
160
- </div>
161
-
162
- <!-- Supporting Text -->
163
- <div
164
- v-if="showPrivacy || marketingConsentText"
165
- :class="`text-body-2 ${dark ? 'text-grey-lighten-2' : 'text-medium-emphasis'} mt-2`"
166
- >
167
- <span v-if="marketingConsentText">
168
- {{ marketingConsentText }}
169
- </span>
170
- <span v-if="showPrivacy">
171
- By signing up you agree to the
172
- <NuxtLink
173
- :to="nuxtifyConfig.pages?.policies?.privacyUrl"
174
- :class="`text-decoration-none ${dark ? 'text-grey-lighten-2' : 'text-medium-emphasis'}`"
175
- >
176
- Privacy Policy</NuxtLink>.
177
- </span>
178
- </div>
179
- </v-form>
180
-
181
- <!-- Thank You -->
182
- <div
183
- v-else
184
- class="text-body-1"
185
- >
186
- {{ thankYouMessage }}
187
- </div>
120
+ <!-- Form -->
121
+ <v-form
122
+ v-if="!isSubmitted"
123
+ ref="form"
124
+ validate-on="submit"
125
+ @submit.prevent="handleSubmit"
126
+ >
127
+ <div class="d-sm-flex justify-center">
128
+ <!-- Using useId prevents hydration mismatch warnings issue with Vuetify -->
129
+ <!-- See: https://github.com/vuetifyjs/vuetify/issues/19696 -->
130
+ <!-- Once the issue is resolved (and it's used internally in Vuetify), remove use of useId -->
131
+ <v-text-field
132
+ :id
133
+ v-model="formInput.email"
134
+ type="email"
135
+ color="secondary"
136
+ :placeholder="emailPlaceholder"
137
+ :rules="[formRules.required, formRules.validEmail]"
138
+ :rounded="xs ? 't-lg' : '0 ts-lg'"
139
+ hide-details="auto"
140
+ class="text-start"
141
+ >
142
+ <template #message="{ message }">
143
+ <span :class="dark ? 'text-red-lighten-3' : ''">{{ message }}</span>
144
+ </template>
145
+ </v-text-field>
146
+ <v-btn
147
+ type="submit"
148
+ variant="flat"
149
+ color="secondary"
150
+ size="x-large"
151
+ class="d-flex align-center py-7 mt-2 mt-sm-0"
152
+ :loading
153
+ :rounded="rounded()"
154
+ :append-icon="appendButtonIcon"
155
+ :prepend-icon="prependButtonIcon"
156
+ :block="xs"
157
+ >
158
+ {{ buttonText }}
159
+ </v-btn>
160
+ </div>
161
+
162
+ <!-- Supporting Text -->
163
+ <div
164
+ v-if="showPrivacy || marketingConsentText"
165
+ :class="`text-body-2 ${dark ? 'text-grey-lighten-2' : 'text-medium-emphasis'} mt-2`"
166
+ >
167
+ <span v-if="marketingConsentText">
168
+ {{ marketingConsentText }}
169
+ </span>
170
+ <span v-if="showPrivacy">
171
+ By signing up you agree to the
172
+ <NuxtLink
173
+ :to="nuxtifyConfig.pages?.policies?.privacyUrl"
174
+ :class="`text-decoration-none ${dark ? 'text-grey-lighten-2' : 'text-medium-emphasis'}`"
175
+ >
176
+ Privacy Policy</NuxtLink>.
177
+ </span>
178
+ </div>
179
+ </v-form>
180
+
181
+ <!-- Thank You -->
182
+ <div
183
+ v-else
184
+ class="text-body-1"
185
+ >
186
+ {{ thankYouMessage }}
187
+ </div>
188
188
  </template>
189
189
 
190
190
  <style scoped>
@@ -4,33 +4,33 @@ const nuxtifyConfig = useNuxtifyConfig();
4
4
  </script>
5
5
 
6
6
  <template>
7
- <v-row
8
- justify="center"
9
- class="text-center my-4"
10
- >
11
- <v-col
12
- cols="12"
13
- md="7"
14
- lg="6"
15
- xl="4"
16
- >
17
- <div
18
- v-if="nuxtifyConfig.footer?.cta?.title"
19
- :class="`text-h5 text-${nuxtifyConfig.footer.cta.color}-lighten-4`"
20
- >
21
- {{ nuxtifyConfig.footer.cta.title }}
22
- </div>
23
- <div
24
- v-if="nuxtifyConfig.footer?.cta?.subtitle"
25
- :class="`text-subtitle-1 text-${nuxtifyConfig.footer.cta.color}-lighten-3 mb-4`"
26
- >
27
- {{ nuxtifyConfig.footer.cta.subtitle }}
28
- </div>
29
- <EmailSubscribeForm
30
- v-if="nuxtifyConfig.email?.provider?.defaultSubmitUrl"
31
- :submit-url="nuxtifyConfig.email.provider.defaultSubmitUrl"
32
- dark
33
- />
34
- </v-col>
35
- </v-row>
7
+ <v-row
8
+ justify="center"
9
+ class="text-center my-4"
10
+ >
11
+ <v-col
12
+ cols="12"
13
+ md="7"
14
+ lg="6"
15
+ xl="4"
16
+ >
17
+ <div
18
+ v-if="nuxtifyConfig.footer?.cta?.title"
19
+ :class="`text-h5 text-${nuxtifyConfig.footer.cta.color}-lighten-4`"
20
+ >
21
+ {{ nuxtifyConfig.footer.cta.title }}
22
+ </div>
23
+ <div
24
+ v-if="nuxtifyConfig.footer?.cta?.subtitle"
25
+ :class="`text-subtitle-1 text-${nuxtifyConfig.footer.cta.color}-lighten-3 mb-4`"
26
+ >
27
+ {{ nuxtifyConfig.footer.cta.subtitle }}
28
+ </div>
29
+ <EmailSubscribeForm
30
+ v-if="nuxtifyConfig.email?.provider?.defaultSubmitUrl"
31
+ :submit-url="nuxtifyConfig.email.provider.defaultSubmitUrl"
32
+ dark
33
+ />
34
+ </v-col>
35
+ </v-row>
36
36
  </template>
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { useDisplay, useDrawer, useNuxtifyConfig, mdiArrowTopRight, mdiClose, mdiMenu } from "#imports";
2
+ import { mdiArrowTopRight, mdiClose, mdiMenu, useDisplay, useDrawer, useNuxtifyConfig } from "#imports";
3
3
  const { smAndDown } = useDisplay();
4
4
  const nuxtifyConfig = useNuxtifyConfig();
5
5
  const drawer = useDrawer();
@@ -9,114 +9,114 @@ const featuredSecondaryLink = secondaryNavLinks?.slice(0, 1)[0];
9
9
  </script>
10
10
 
11
11
  <template>
12
- <v-app-bar
13
- :density="smAndDown ? 'compact' : 'default'"
14
- flat
15
- class="px-sm-2 bottom-border"
16
- >
17
- <template #prepend>
18
- <!-- Logo -->
19
- <NuxtLink
20
- to="/"
21
- class="ml-2"
22
- >
23
- <AppLogo />
24
- </NuxtLink>
25
- </template>
26
-
27
- <!-- Desktop navigation -->
28
- <div v-if="!smAndDown">
29
- <!-- Primary links -->
30
- <v-btn
31
- v-for="link in primaryNavLinks"
32
- :key="link.text"
33
- :to="link.to"
34
- :href="link.href"
35
- :active="false"
36
- :prepend-icon="link.icon"
37
- slim
38
- exact
39
- :ripple="false"
40
- size="large"
41
- color="unset"
42
- :target="link.openInNew ? '_blank' : void 0"
43
- :rel="link.openInNew ? 'noopener nofollow' : void 0"
44
- class="nav-items mx-2"
45
- >
46
- {{ link.text }}
47
- <v-icon
48
- v-if="link.openInNew"
49
- :icon="mdiArrowTopRight"
50
- size="x-small"
51
- color="grey"
52
- class="ml-1"
53
- />
54
- </v-btn>
55
- </div>
56
-
57
- <template #append>
58
- <!-- Mobile navigation -->
59
- <v-app-bar-nav-icon
60
- v-if="smAndDown"
61
- :icon="drawer ? mdiClose : mdiMenu"
62
- color="primary"
63
- aria-label="Navigation Menu"
64
- @click="drawer = !drawer"
65
- />
66
-
67
- <!-- Desktop navigation -->
68
- <nav
69
- v-else
70
- class="d-flex align-center"
71
- >
72
- <!-- Secondary links -->
73
- <v-btn
74
- v-for="link in secondaryNavLinks?.slice(1).reverse()"
75
- :key="link.text"
76
- :to="link.to"
77
- :href="link.href"
78
- :prepend-icon="link.icon"
79
- :active="false"
80
- size="large"
81
- color="unset"
82
- :target="link.openInNew ? '_blank' : void 0"
83
- :rel="link.openInNew ? 'noopener nofollow' : void 0"
84
- class="nav-items mx-2"
85
- >
86
- {{ link.text }}
87
- <v-icon
88
- v-if="link.openInNew"
89
- :icon="mdiArrowTopRight"
90
- size="x-small"
91
- color="grey"
92
- class="ml-1"
93
- />
94
- </v-btn>
95
-
96
- <!-- Featured secondary link -->
97
- <v-btn
98
- v-if="featuredSecondaryLink?.text"
99
- :to="featuredSecondaryLink.to"
100
- :href="featuredSecondaryLink.href"
101
- :prepend-icon="featuredSecondaryLink.icon"
102
- :active="false"
103
- variant="flat"
104
- size="large"
105
- :target="featuredSecondaryLink.openInNew ? '_blank' : void 0"
106
- :rel="featuredSecondaryLink.openInNew ? 'noopener nofollow' : void 0"
107
- class="mx-2"
108
- >
109
- {{ featuredSecondaryLink.text }}
110
- <v-icon
111
- v-if="featuredSecondaryLink.openInNew"
112
- :icon="mdiArrowTopRight"
113
- size="small"
114
- class="ml-1"
115
- />
116
- </v-btn>
117
- </nav>
118
- </template>
119
- </v-app-bar>
12
+ <v-app-bar
13
+ :density="smAndDown ? 'compact' : 'default'"
14
+ flat
15
+ class="px-sm-2 bottom-border"
16
+ >
17
+ <template #prepend>
18
+ <!-- Logo -->
19
+ <NuxtLink
20
+ to="/"
21
+ class="ml-2"
22
+ >
23
+ <AppLogo />
24
+ </NuxtLink>
25
+ </template>
26
+
27
+ <!-- Desktop navigation -->
28
+ <div v-if="!smAndDown">
29
+ <!-- Primary links -->
30
+ <v-btn
31
+ v-for="link in primaryNavLinks"
32
+ :key="link.text"
33
+ :to="link.to"
34
+ :href="link.href"
35
+ :active="false"
36
+ :prepend-icon="link.icon"
37
+ slim
38
+ exact
39
+ :ripple="false"
40
+ size="large"
41
+ color="unset"
42
+ :target="link.openInNew ? '_blank' : void 0"
43
+ :rel="link.openInNew ? 'noopener nofollow' : void 0"
44
+ class="nav-items mx-2"
45
+ >
46
+ {{ link.text }}
47
+ <v-icon
48
+ v-if="link.openInNew"
49
+ :icon="mdiArrowTopRight"
50
+ size="x-small"
51
+ color="grey"
52
+ class="ml-1"
53
+ />
54
+ </v-btn>
55
+ </div>
56
+
57
+ <template #append>
58
+ <!-- Mobile navigation -->
59
+ <v-app-bar-nav-icon
60
+ v-if="smAndDown"
61
+ :icon="drawer ? mdiClose : mdiMenu"
62
+ color="primary"
63
+ aria-label="Navigation Menu"
64
+ @click="drawer = !drawer"
65
+ />
66
+
67
+ <!-- Desktop navigation -->
68
+ <nav
69
+ v-else
70
+ class="d-flex align-center"
71
+ >
72
+ <!-- Secondary links -->
73
+ <v-btn
74
+ v-for="link in secondaryNavLinks?.slice(1).reverse()"
75
+ :key="link.text"
76
+ :to="link.to"
77
+ :href="link.href"
78
+ :prepend-icon="link.icon"
79
+ :active="false"
80
+ size="large"
81
+ color="unset"
82
+ :target="link.openInNew ? '_blank' : void 0"
83
+ :rel="link.openInNew ? 'noopener nofollow' : void 0"
84
+ class="nav-items mx-2"
85
+ >
86
+ {{ link.text }}
87
+ <v-icon
88
+ v-if="link.openInNew"
89
+ :icon="mdiArrowTopRight"
90
+ size="x-small"
91
+ color="grey"
92
+ class="ml-1"
93
+ />
94
+ </v-btn>
95
+
96
+ <!-- Featured secondary link -->
97
+ <v-btn
98
+ v-if="featuredSecondaryLink?.text"
99
+ :to="featuredSecondaryLink.to"
100
+ :href="featuredSecondaryLink.href"
101
+ :prepend-icon="featuredSecondaryLink.icon"
102
+ :active="false"
103
+ variant="flat"
104
+ size="large"
105
+ :target="featuredSecondaryLink.openInNew ? '_blank' : void 0"
106
+ :rel="featuredSecondaryLink.openInNew ? 'noopener nofollow' : void 0"
107
+ class="mx-2"
108
+ >
109
+ {{ featuredSecondaryLink.text }}
110
+ <v-icon
111
+ v-if="featuredSecondaryLink.openInNew"
112
+ :icon="mdiArrowTopRight"
113
+ size="small"
114
+ class="ml-1"
115
+ />
116
+ </v-btn>
117
+ </nav>
118
+ </template>
119
+ </v-app-bar>
120
120
  </template>
121
121
 
122
122
  <style scoped>