nuxt-ignis 0.3.3 → 0.4.0-rc.2

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 (143) hide show
  1. package/.data/content/contents.sqlite +0 -0
  2. package/.env +8 -2
  3. package/.nuxt/app.config.mjs +2 -2
  4. package/.nuxt/cache/fonts/EP1810cmAtyahQPDHB6nvBzRkIG5RcNv4u5vTy1aYHU-Ih_Po7WkbhDymI0Y_ntmpz__bZJprHiu7_c5N_X6AAA.woff2 +0 -0
  5. package/.nuxt/cache/fonts/JNWOTRocaYj0gq52vW_s7sHAdSMUetrRmhhggCVxyZ0-TnR4PP30hI5UWldZ0knUBrHkvIoiDWYXwn2v1NtCh80.woff2 +0 -0
  6. package/.nuxt/cache/fonts/XbAtjIvy1UErjg9eu_v7X3zPLS_AwsmqVsR9fG-JB6o-H99o9_8BZXq7ey5UyS99Wn9zX0V0anvpXEqAqavcJlQ.woff2 +0 -0
  7. package/.nuxt/cache/fonts/ZLm6CLvwhQbamZ73M80jbqz7DuOkHlT_HRyXHG7YfVs-eYLoSJPWhqR5CE0c8XPABls8kE_7Fc7F2x7Gtfsg_8M.woff2 +0 -0
  8. package/.nuxt/cache/fonts/aPa9az0DeE4U5rqM-Ov0Vl_obQis_d6sScLNygGkvxw-s32Y9TxBLZRr_ebRHQ3l3q1g2j_0tPT879PPSBGrj8A.woff2 +0 -0
  9. package/.nuxt/cache/fonts/kgyHMsxRmhh06xcV0yKMKdTKQBsQpXGi7erqwaqgjXg-55rzD39AWoqYSkQOLHuoKZUDVcDSlXRKdaymIN2dXes.woff +0 -0
  10. package/.nuxt/components.d.ts +606 -394
  11. package/.nuxt/content/components.ts +107 -98
  12. package/.nuxt/content/database.compressed.mjs +1 -1
  13. package/.nuxt/content/manifest.ts +6 -6
  14. package/.nuxt/content/sql_dump.txt +5 -0
  15. package/.nuxt/content/types.d.ts +8 -0
  16. package/.nuxt/dev/index.mjs +1584 -559
  17. package/.nuxt/dev/index.mjs.map +1 -1
  18. package/.nuxt/dist/server/client.manifest.json +2 -2
  19. package/.nuxt/dist/server/client.manifest.mjs +2 -2
  20. package/.nuxt/eslint-typegen.d.ts +256 -225
  21. package/.nuxt/eslint.config.d.mts +3 -3
  22. package/.nuxt/eslint.config.mjs +11 -11
  23. package/.nuxt/imports.d.ts +70 -54
  24. package/.nuxt/manifest/latest.json +1 -1
  25. package/.nuxt/manifest/meta/dev.json +1 -1
  26. package/.nuxt/mdc-image-component.mjs +1 -1
  27. package/.nuxt/module/@nuxtjs-sitemap.d.ts +9 -8
  28. package/.nuxt/module/nuxt-robots.d.ts +37 -7
  29. package/.nuxt/{modules/@nuxt-scripts.d.ts → module/nuxt-scripts.d.ts} +1 -2
  30. package/.nuxt/module/nuxt-seo-utils.assets.d.ts +3 -3
  31. package/.nuxt/module/nuxt-seo-utils.d.ts +20 -6
  32. package/.nuxt/module/nuxt-site-config.d.ts +8 -8
  33. package/.nuxt/nitro.json +5 -5
  34. package/.nuxt/nuxt.d.ts +12 -9
  35. package/.nuxt/nuxt.json +2 -2
  36. package/.nuxt/tsconfig.json +235 -153
  37. package/.nuxt/tsconfig.server.json +126 -92
  38. package/.nuxt/types/app.config.d.ts +2 -2
  39. package/.nuxt/types/build.d.ts +2 -1
  40. package/.nuxt/types/i18n-plugin.d.ts +2 -2
  41. package/.nuxt/types/imports.d.ts +407 -314
  42. package/.nuxt/types/nitro-config.d.ts +2 -2
  43. package/.nuxt/types/nitro-imports.d.ts +143 -134
  44. package/.nuxt/types/nitro-nuxt.d.ts +2 -0
  45. package/.nuxt/types/nitro-routes.d.ts +17 -17
  46. package/.nuxt/types/plugins.d.ts +34 -34
  47. package/.nuxt/types/schema.d.ts +322 -12
  48. package/.nuxt/ui/avatar.ts +1 -1
  49. package/.nuxt/ui/card.ts +1 -1
  50. package/.nuxt/ui/carousel.ts +1 -1
  51. package/.nuxt/ui/command-palette.ts +1 -0
  52. package/.nuxt/ui/drawer.ts +1 -1
  53. package/.nuxt/ui/index.ts +2 -0
  54. package/.nuxt/ui/input-menu.ts +24 -10
  55. package/.nuxt/ui/input-tags.ts +310 -0
  56. package/.nuxt/ui/modal.ts +1 -1
  57. package/.nuxt/ui/navigation-menu.ts +1 -1
  58. package/.nuxt/ui/select-menu.ts +11 -6
  59. package/.nuxt/ui/select.ts +11 -6
  60. package/.nuxt/ui/table.ts +3 -2
  61. package/.nuxt/ui/timeline.ts +321 -0
  62. package/.nuxt/ui/toaster.ts +1 -1
  63. package/.nuxt/ui-image-component.ts +1 -1
  64. package/app.vue +2 -6
  65. package/assets/css/ignis-nuxt-ui.css +24 -0
  66. package/assets/css/{open-props.css → ignis-open-props.css} +1 -1
  67. package/assets/css/ignis-tailwind.css +23 -0
  68. package/assets/css/ignis.css +31 -0
  69. package/bin/make-eslint.js +55 -0
  70. package/components/CurrentTime.vue +4 -2
  71. package/components/ignis/IgnisConfig.vue +44 -0
  72. package/components/{AppFeature.vue → ignis/IgnisFeature.vue} +2 -1
  73. package/components/ignis/IgnisFeatureList.vue +111 -0
  74. package/components/ignis/IgnisFooter.vue +2 -2
  75. package/components/ignis/IgnisHeader.vue +4 -3
  76. package/components/ignis/IgnisInfo.vue +14 -13
  77. package/components/ignis/IgnisWelcome.vue +89 -0
  78. package/composables/useTranslation.ts +18 -9
  79. package/features.ts +68 -10
  80. package/formkit.config.ts +8 -8
  81. package/i18n/locales/en.json +10 -4
  82. package/nuxt.config.ts +30 -2
  83. package/package.json +29 -21
  84. package/pages/_ignis-config.vue +3 -0
  85. package/pages/_ignis-info.vue +3 -0
  86. package/pages/index.vue +4 -6
  87. package/public/_ignis-config.json +98 -0
  88. package/test/config/css-multiple.txt +30 -0
  89. package/test/config/css-nuxt-ui.txt +34 -0
  90. package/test/config/css-open-props.txt +2307 -0
  91. package/test/config/css-single.txt +28 -0
  92. package/test/config/css-tailwind.txt +58 -0
  93. package/test/config/custom-lang.txt +27 -0
  94. package/test/config/db-neon.txt +28 -0
  95. package/test/config/db-supabase.txt +31 -0
  96. package/test/config/default.txt +26 -15
  97. package/test/config/equipment-1-composable.txt +32 -21
  98. package/test/config/equipment-2-plugins.txt +33 -22
  99. package/test/config/equipment-all.txt +38 -27
  100. package/test/config/forms-formkit.txt +32 -0
  101. package/test/config/forms-vueform.txt +28 -0
  102. package/test/config/i18n.txt +38 -0
  103. package/test/config/no-default-css.txt +24 -0
  104. package/test/config/open-props.txt +2306 -0
  105. package/test/config/seo-ssr-false.txt +35 -0
  106. package/test/config/ui-nuxt-ui.txt +33 -0
  107. package/test/config/ui-tailwind.txt +57 -0
  108. package/test/config.test.ts +115 -0
  109. package/test/features/charts.txt +4 -0
  110. package/test/features/custom-css.txt +4 -0
  111. package/test/features/custom-title.txt +4 -0
  112. package/test/features/db-neon.txt +4 -3
  113. package/test/features/db-off.txt +4 -3
  114. package/test/features/db-supabase.txt +4 -3
  115. package/test/features/default.txt +4 -3
  116. package/test/features/disable-core.txt +2 -1
  117. package/test/features/enable-all.txt +5 -4
  118. package/test/features/equipment.txt +4 -3
  119. package/test/features/forms-formkit.txt +4 -3
  120. package/test/features/forms-off.txt +4 -3
  121. package/test/features/forms-vueform.txt +4 -3
  122. package/test/features/no-default-css.txt +4 -0
  123. package/test/features/regexp.txt +4 -0
  124. package/test/features/ui-nuxt-ui.txt +4 -3
  125. package/test/features/ui-off.txt +4 -3
  126. package/test/features/ui-tailwind.txt +5 -4
  127. package/test/features/validation-off.txt +4 -3
  128. package/test/features/validation-valibot.txt +5 -4
  129. package/test/features/validation-zod.txt +5 -4
  130. package/test/features.test.ts +37 -1
  131. package/utils/config/formkit.ts +23 -0
  132. package/utils/formkit.ts +16 -0
  133. package/utils/pslo-utils.ts +2 -1
  134. package/.nuxt/content/sql_dump +0 -6
  135. package/app.config.ts +0 -3
  136. package/assets/css/nuxt-ui.css +0 -16
  137. package/assets/css/tailwind.css +0 -15
  138. package/components/AppFeatureList.vue +0 -124
  139. package/content/second.md +0 -11
  140. package/pages/ignis.vue +0 -3
  141. package/pages/second.vue +0 -59
  142. package/server/plugins/pslo-content.ts +0 -17
  143. package/tailwind.config.ts +0 -29
@@ -0,0 +1,111 @@
1
+ <!--
2
+ https://nuxt.com/docs/guide/directory-structure/pages
3
+
4
+ An example of Nuxt component.
5
+
6
+ IgnisFeature
7
+ - an example usage of auto-imported Nuxt component declared in `/components` directory
8
+ - the text is (usually) being loaded localized via nuxtjs/i18n module
9
+ - features are being displayed conditionally according to current setting
10
+ -->
11
+
12
+ <template>
13
+ <div style="text-align: center; max-width: 1200px;">
14
+ <h1 class="ignis-feature-header">
15
+ Features Overview
16
+ </h1>
17
+ <div class="feature-list">
18
+ <IgnisFeature :text="useIgnisT('features.nuxt')" />
19
+ <IgnisFeature :text="useIgnisT('features.consola')" />
20
+ <IgnisFeature :active="eslint" :text="useIgnisT('features.eslint')" />
21
+ <IgnisFeature :active="security" :text="useIgnisT('features.security')" />
22
+ <IgnisFeature :active="image" :text="useIgnisT('features.image')" />
23
+ <IgnisFeature :active="scripts" :text="useIgnisT('features.scripts')" />
24
+ <IgnisFeature :active="fonts" :text="useIgnisT('features.fonts')" class="fonts" />
25
+ <IgnisFeature :active="pinia" :text="useIgnisT('features.pinia')" />
26
+ <IgnisFeature :active="vueuse" :text="useIgnisT('features.vueuse')" />
27
+ <IgnisFeature :active="true" :text="useIgnisT('features.time')" />
28
+ <IgnisFeature :active="nuxtui" :text="useIgnisT('features.ui')" />
29
+ <IgnisFeature :active="tailwind" :text="useIgnisT('features.tailwind')" />
30
+ <IgnisFeature :active="nuxtui" :text="useIgnisT('features.icon')" />
31
+ <IgnisFeature :active="neon" :text="useIgnisT('features.neon')" />
32
+ <IgnisFeature :active="supabase" :text="useIgnisT('features.supabase')" />
33
+ <IgnisFeature :active="i18n" :text="useIgnisT('features.i18n')" />
34
+ <IgnisFeature :active="vueform" :text="useIgnisT('features.vueform')" />
35
+ <IgnisFeature :active="formkit" :text="useIgnisT('features.formkit')" />
36
+ <IgnisFeature :active="valibot" :text="useIgnisT('features.valibot')" />
37
+ <IgnisFeature :active="zod" :text="useIgnisT('features.zod')" />
38
+ <IgnisFeature :active="content" :text="useIgnisT('features.content')" />
39
+ <IgnisFeature :active="seo" :text="useIgnisT('features.seo')" />
40
+ <IgnisFeature :active="auth" :text="useIgnisT('features.auth')" />
41
+ <IgnisFeature :active="equipment" :text="useIgnisT('features.equipment')" />
42
+ <IgnisFeature :active="regexp" :text="useIgnisT('features.regexp')" />
43
+ <IgnisFeature :active="charts" :text="useIgnisT('features.charts')" />
44
+ <IgnisFeature :active="openprops" class="openprops-feature" :text="useIgnisT('features.openprops')" />
45
+ </div>
46
+ </div>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { useIgnisT } from '#imports' // requires explicit import for some reason
51
+
52
+ const setup = useRuntimeConfig().public.ignis
53
+ const eslint = setup.core.eslint
54
+ const fonts = setup.core.fonts
55
+ const image = setup.core.image
56
+ const pinia = setup.core.pinia
57
+ const scripts = setup.core.scripts
58
+ const security = setup.core.security
59
+ const vueuse = setup.core.vueuse
60
+ const ui = setup.preset.ui
61
+ const nuxtui = ui === 'nuxt-ui' || setup.ui
62
+ const tailwind = ui !== 'off' || setup.ui || setup.tailwind
63
+ const db = setup.preset.db
64
+ const neon = db === 'neon' || (db === 'off' && setup.neon)
65
+ const supabase = db === 'supabase' || (db === 'off' && setup.supabase)
66
+ const i18n = setup.i18n.enabled
67
+ const forms = setup.preset.forms
68
+ const vueform = forms === 'vueform' || (forms === 'off' && setup.vueform)
69
+ const formkit = forms === 'formkit' || (forms === 'off' && setup.formkit.enabled)
70
+ const validation = setup.preset.validation
71
+ const valibot = validation === 'valibot' || (validation === 'off' && setup.valibot)
72
+ const zod = validation === 'zod' || (validation === 'off' && setup.zod)
73
+ const content = setup.content
74
+ const seo = setup.seo
75
+ const auth = setup.auth
76
+ const openprops = setup.openprops
77
+ const equipment = setup.equipment.enabled
78
+ const regexp = setup.regexp
79
+ const charts = setup.charts
80
+ </script>
81
+
82
+ <style scoped>
83
+ /* demo for @nuxt/fonts */
84
+ .fonts {
85
+ font-family: "Kurale";
86
+ }
87
+
88
+ /* avoid Tailwind CSS styles here, because Tailwind may not be enabled */
89
+
90
+ .ignis-feature-header {
91
+ text-align: center;
92
+ font-family: monospace;
93
+ font-size: 1.75rem;
94
+ margin-top: 2rem;
95
+ margin-bottom: 0.5rem;
96
+ color: #fbbf24;
97
+ }
98
+
99
+ /* margin-auto my-4 flex flex-col */
100
+ .feature-list {
101
+ margin: 0px auto;
102
+ margin-bottom: 8px;
103
+ display: flex;
104
+ flex-direction: column;
105
+ }
106
+
107
+ /* mb-2 */
108
+ .pages {
109
+ margin-bottom: 2em;
110
+ }
111
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <footer class="link text-xs">
2
+ <footer class="link text-xs hover:text-amber-300">
3
3
  <NuxtLink to="https://github.com/AloisSeckar/nuxt-ignis">
4
4
  https://github.com/AloisSeckar/nuxt-ignis
5
5
  </NuxtLink>
@@ -9,7 +9,7 @@
9
9
  <style scoped lang="css">
10
10
  footer {
11
11
  text-align: center;
12
- margin-top: 4px;
12
+ margin: 0.25rem 0; /* 4px */
13
13
  font-size: 0.75rem; /* 12px */
14
14
  line-height: 1rem; /* 16px */
15
15
  }
@@ -2,9 +2,9 @@
2
2
  <header>
3
3
  <div class="ignis-header">
4
4
  <img src="/nuxt-ignis.png" class="ignis-logo" :title :alt>
5
- <h1 class="ignis-title">
5
+ <div class="ignis-title">
6
6
  {{ useIgnisT("title") }}
7
- </h1>
7
+ </div>
8
8
  <img src="/nuxt-ignis.png" class="ignis-logo" :title :alt>
9
9
  </div>
10
10
  <div class="ignis-subtitle ">
@@ -25,7 +25,8 @@ const alt = title
25
25
  display: flex;
26
26
  flex-direction: row;
27
27
  justify-content: center;
28
- margin-bottom: 10px;
28
+ margin-top: 0.5em;
29
+ margin-bottom: 0.5em;
29
30
  }
30
31
  .ignis-logo {
31
32
  display: inline;
@@ -1,13 +1,8 @@
1
1
  <template>
2
2
  <div>
3
3
  <IgnisHeader />
4
- <AppFeatureList />
5
4
 
6
- <div v-if="pages" class="link">
7
- <NuxtLink to="/second">
8
- {{ useIgnisT("goto2") }}
9
- </NuxtLink>
10
- </div>
5
+ <component :is="ignisContent" />
11
6
 
12
7
  <CurrentTime />
13
8
  <IgnisFooter />
@@ -15,12 +10,18 @@
15
10
  </template>
16
11
 
17
12
  <script setup lang="ts">
18
- const pages = useRuntimeConfig().public.ignis.pages
19
- </script>
13
+ export type IgnisComponentType = 'Welcome' | 'Features' | 'Config'
14
+
15
+ const props = defineProps<{
16
+ content: IgnisComponentType
17
+ }>()
20
18
 
21
- <style scoped lang="css">
22
- .link {
23
- text-align: center;
24
- margin-bottom: 4px;
19
+ let ignisContent
20
+ if (props.content === 'Welcome') {
21
+ ignisContent = resolveComponent('IgnisWelcome')
22
+ } else if (props.content === 'Config') {
23
+ ignisContent = resolveComponent('IgnisConfig')
24
+ } else {
25
+ ignisContent = resolveComponent('IgnisFeatureList')
25
26
  }
26
- </style>
27
+ </script>
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <div class="ignis-welcome">
3
+ <h1 class="ignis-welcome-header">
4
+ Welcome to Ignis
5
+ </h1>
6
+ <p>Thank you for choosing Nuxt Ignis! Your awesome website is just a few steps away.</p>
7
+ <p v-if="pages">
8
+ Replace <span class="file">/pages/index.vue</span> with your own content to get started. You may also replace <span class="file">/app.vue</span> to adjust site defaults.
9
+ </p>
10
+ <p v-else>
11
+ Replace <span class="file">/app.vue</span> with your own content to get started.
12
+ </p>
13
+ <h2 class="ignis-welcome-subheader">
14
+ Resources
15
+ </h2>
16
+ <div class="ignis-welcome-resources">
17
+ <NuxtLink to="/_ignis-info" class="feature">Features Overview</NuxtLink>
18
+ <NuxtLink to="/_ignis-config" class="feature">Configuration Overview</NuxtLink>
19
+ <NuxtLink to="https://nuxt-ignis.netlify.app/" class="feature">Documentation &#x1F517;</NuxtLink>
20
+ </div>
21
+ <a href="https://github.com/AloisSeckar/nuxt-ignis" title="Nuxt Ignis on GitHub">
22
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Material Design Icons by Pictogrammers - https://github.com/Templarian/MaterialDesign/blob/master/LICENSE --><path fill="#888888" d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2" /></svg>
23
+ </a>
24
+ </div>
25
+ </template>
26
+
27
+ <script setup lang="ts">
28
+ const pages = useRuntimeConfig().public.ignis.pages
29
+ </script>
30
+
31
+ <style scoped lang="css">
32
+ .ignis-welcome {
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: center;
36
+ gap: 0.75rem;
37
+ padding: 2rem;
38
+ }
39
+
40
+ .ignis-welcome-header {
41
+ text-align: center;
42
+ font-family: monospace;
43
+ font-size: 1.75rem;
44
+ margin-bottom: 0.5rem;
45
+ color: #fbbf24;
46
+ }
47
+
48
+ .ignis-welcome-subheader {
49
+ text-align: center;
50
+ font-family: monospace;
51
+ font-size: 1.5rem;
52
+ color: #fbbf24;
53
+ }
54
+
55
+ .ignis-welcome-resources {
56
+ display: flex;
57
+ gap: 0.5rem;
58
+ flex-wrap: wrap;
59
+ }
60
+
61
+ p {
62
+ width: 100%;
63
+ }
64
+
65
+ .file {
66
+ display: inline;
67
+ color: #fbbf24;
68
+ font-family: monospace;
69
+ }
70
+
71
+ /* TODO unify with IgnisFeature.vue */
72
+ .feature {
73
+ margin: 4px;
74
+ padding: 4px 12px;
75
+ border: 2px solid #fcd34d;
76
+ font-size: 1em !important;
77
+ font-weight: bold;
78
+ background-color: #047857;
79
+ color: #f1f5f9;
80
+ font-size: 1.125rem;
81
+ line-height: 1.75rem;
82
+ border-radius: 0.5rem;
83
+ }
84
+ .feature:hover {
85
+ background-color: #334155;
86
+ color: #3CB371;
87
+ text-decoration: none;
88
+ }
89
+ </style>
@@ -20,8 +20,8 @@ export function useT(key: string): string {
20
20
  } else {
21
21
  // backdoor for Nuxt Ignis to display values on demo index page
22
22
  const backdoorValue = useIgnisT(key)
23
- if (backdoorValue) {
24
- return backdoorValue as string
23
+ if (backdoorValue !== '???') {
24
+ return backdoorValue
25
25
  }
26
26
  // for other custom values a warning will be produced and a placeholder will be returned
27
27
  log.warn('@nuxtjs/i18n turned off, translations are not available (set NUXT_PUBLIC_IGNIS_I18N=true)')
@@ -37,18 +37,27 @@ export function useT(key: string): string {
37
37
  * @param key identifier of text that should be displayed
38
38
  * @returns hardcoded text from '@/i18n/locales/en.json' of nuxt-ignis package (providing the key exists)
39
39
  */
40
- export function useIgnisT(key: string): unknown {
40
+ export function useIgnisT(key: string): string {
41
41
  const keys = key.split('.')
42
42
 
43
- let current = lang
44
- for (const key of keys) {
45
- if (current && key in current) {
43
+ let currentLang = lang
44
+ for (const currentKey of keys) {
45
+ if (currentLang && currentKey in currentLang) {
46
46
  // @ts-expect-error TODO this should be fixed
47
- current = current[key]
47
+ currentLang = currentLang[currentKey]
48
48
  } else {
49
- return undefined
49
+ log.debug(`useIgnisT: string value not found for "${key}"`)
50
+ return '???'
50
51
  }
51
52
  }
52
53
 
53
- return current
54
+ if (typeof currentLang === 'string') {
55
+ return currentLang
56
+ }
57
+
58
+ log.debug(`useIgnisT: string value not found for "${key}"`)
59
+ log.debug(`useIgnisT: was resolved as:`)
60
+ log.debug(JSON.stringify(currentLang))
61
+
62
+ return '???'
54
63
  }
package/features.ts CHANGED
@@ -4,6 +4,7 @@ import { defu } from 'defu'
4
4
  import OpenProps from 'open-props'
5
5
  import tailwindcss from '@tailwindcss/vite'
6
6
  import { log } from './utils/consola'
7
+ import { pslo } from './utils/pslo-utils'
7
8
  import { ignisTailwindcssFix } from './utils/tailwind'
8
9
 
9
10
  const currentDir = dirname(fileURLToPath(import.meta.url))
@@ -74,7 +75,7 @@ export function setFeatures() {
74
75
  nuxtConfig.modules.push('@nuxt/ui')
75
76
  // import tailwind css file
76
77
  nuxtConfig = defu({
77
- css: [join(currentDir, './assets/css/nuxt-ui.css')],
78
+ css: [join(currentDir, './assets/css/ignis-nuxt-ui.css')],
78
79
  }, nuxtConfig)
79
80
  } else {
80
81
  // remove @nuxt/ui-specific components from resolution if module is not used
@@ -93,7 +94,7 @@ export function setFeatures() {
93
94
  extras.push('Tailwind CSS')
94
95
  // import tailwind css file
95
96
  nuxtConfig = defu({
96
- css: [join(currentDir, './assets/css/tailwind.css')],
97
+ css: [join(currentDir, './assets/css/ignis-tailwind.css')],
97
98
  vite: {
98
99
  plugins: [tailwindcss()], // temporary integration using Vite plugin directly
99
100
  },
@@ -242,7 +243,7 @@ export function setFeatures() {
242
243
  extras.push('Open Props CSS')
243
244
  nuxtConfig = defu({
244
245
  // import Open Prpops stylesheet
245
- css: [join(currentDir, './assets/css/open-props.css')],
246
+ css: [join(currentDir, './assets/css/ignis-open-props.css')],
246
247
  // CSS processor for Open Props
247
248
  postcss: {
248
249
  plugins: {
@@ -255,6 +256,31 @@ export function setFeatures() {
255
256
  // elrh-pslo
256
257
  if (process.env.NUXT_PUBLIC_IGNIS_PSLO_ENABLED === 'true') {
257
258
  extras.push('elrh-pslo')
259
+
260
+ // integration with Nuxt Content
261
+ // if enabled, all Nuxt Content page data will be treated with "preventSingleLetterOrphans" function
262
+ if (process.env.NUXT_PUBLIC_IGNIS_CONTENT === 'true' && process.env.NUXT_PUBLIC_IGNIS_PSLO_CONTENT === 'true') {
263
+ nuxtConfig = defu({
264
+ hooks: {
265
+ // TODO can we get type of ctx from Nuxt Content?
266
+ 'content:file:beforeParse'(ctx: { file: { id: string, body: string } }) {
267
+ const { file } = ctx
268
+ file.body = pslo(file.body)
269
+ log.debug(`Nuxt Content file ${file.id} processed with elrh-pslo`)
270
+ },
271
+ },
272
+ }, nuxtConfig)
273
+ }
274
+ }
275
+
276
+ // magic-regexp
277
+ if (process.env.NUXT_PUBLIC_IGNIS_REGEXP === 'true') {
278
+ nuxtConfig.modules.push('magic-regexp/nuxt')
279
+ }
280
+
281
+ // magic-regexp
282
+ if (process.env.NUXT_PUBLIC_IGNIS_CHARTS === 'true') {
283
+ nuxtConfig.modules.push('nuxt-charts')
258
284
  }
259
285
 
260
286
  // 3. Nuxt-related settings
@@ -275,7 +301,38 @@ export function setFeatures() {
275
301
  nuxt.push('pages=false')
276
302
  }
277
303
 
278
- // 4. warn if duplicate modules find
304
+ // default CSS file
305
+ if (process.env.NUXT_PUBLIC_IGNIS_CORE_CSS !== 'false') {
306
+ nuxtConfig = defu({
307
+ css: [join(currentDir, './assets/css/ignis.css')],
308
+ }, nuxtConfig)
309
+ nuxt.push('ignis CSS')
310
+ }
311
+
312
+ // custom CSS files
313
+ if (process.env.NUXT_PUBLIC_IGNIS_CSS) {
314
+ // values MUST be delimited by "," (spaces will be trimmed)
315
+ nuxtConfig = defu({
316
+ css: process.env.NUXT_PUBLIC_IGNIS_CSS.split(',').map(p => p?.trim()),
317
+ }, nuxtConfig)
318
+ nuxt.push('custom CSS')
319
+ }
320
+
321
+ // 4. HTML config
322
+ const htmlLang = process.env.NUXT_PUBLIC_IGNIS_HTML_LANG || 'en'
323
+ const appTitle = process.env.NUXT_PUBLIC_IGNIS_HTML_TITLE || 'Nuxt Ignis App'
324
+ nuxtConfig = defu({
325
+ app: {
326
+ head: {
327
+ htmlAttrs: {
328
+ lang: htmlLang,
329
+ },
330
+ title: appTitle,
331
+ },
332
+ },
333
+ }, nuxtConfig)
334
+
335
+ // 5. warn if duplicate modules find
279
336
  // this means e.g. 2 database modules or 2 form solutions
280
337
  if (process.env.NUXT_PUBLIC_IGNIS_WARN_DUPLICATES !== 'false') {
281
338
  const used = nuxtConfig.modules
@@ -291,16 +348,17 @@ export function setFeatures() {
291
348
  }
292
349
  }
293
350
 
294
- // 5. verify results
295
- // TODO why this run twice?
351
+ // 6. verify results
352
+ // TODO why this run twice? (SSR?)
296
353
 
297
- let overview = 'Nuxt Ignis will start using following settings:\n'
298
- overview += 'Modules: ' + nuxtConfig.modules.join(', ') + '\n'
354
+ let overview = `Nuxt Ignis will start using following settings:\n`
355
+ overview += `App title: ${appTitle}\n`
356
+ overview += `Modules: ${nuxtConfig.modules.join(', ')}\n`
299
357
  if (extras.length > 0) {
300
- overview += 'Extras: ' + extras.join(', ') + '\n'
358
+ overview += `Extras: ${extras.join(', ')}\n`
301
359
  }
302
360
  if (nuxt.length > 0) {
303
- overview += 'Nuxt: ' + nuxt.join(', ') + '\n'
361
+ overview += `Nuxt: ${nuxt.join(', ')}\n`
304
362
  }
305
363
  log.info(overview)
306
364
 
package/formkit.config.ts CHANGED
@@ -1,12 +1,12 @@
1
- // https://formkit.com/guides/optimizing-for-production#using-the-nuxt-module
2
- import { en, de, cs } from '@formkit/i18n'
3
- import type { DefaultConfigOptions } from '@formkit/vue'
1
+ // minimal config for Formkit
2
+ // currently required to be loaded like this...
4
3
 
5
- const ignisLocale = process.env.NUXT_PUBLIC_IGNIS_FORMKIT_DEFAULT || 'en'
4
+ import { loadFormkitConfig } from './utils/formkit'
6
5
 
7
- const config: DefaultConfigOptions = {
8
- locales: { en, de, cs }, // TODO allow multiple locales
9
- locale: ignisLocale,
10
- }
6
+ const config = loadFormkitConfig({
7
+ // custom config here
8
+ })
11
9
 
10
+ // Formkit expects default export of a `config` constant
11
+ // `export default loadFormkitConfig({})` does not work
12
12
  export default config
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "title" : "Nuxt Ignis",
3
3
  "subtitle" : "A ready-to-use setup for your next application in Nuxt",
4
- "page2" : "This is a second page of the application",
4
+ "page2" : "This is a test page of Nuxt Ignis app",
5
5
  "image" : "Image by Unsplash displayed with Nuxt Image",
6
- "goto1" : "Go back to index",
6
+ "goto1" : "Go back to info",
7
7
  "goto2" : "Go to 2nd page",
8
8
  "features" : {
9
9
  "nuxt" : "Nuxt application framework atop Vue.js",
@@ -29,6 +29,12 @@
29
29
  "content" : "Nuxt Content for creating and editing content",
30
30
  "seo" : "Nuxt SEO collection of SEO-related modules",
31
31
  "auth" : "Nuxt Auth Utils for easy and secure authentication",
32
- "openprops" : "Additional CSS by Open Props"
32
+ "openprops" : "Additional CSS by Open Props",
33
+ "equipment" : "Vue Equipment utils available",
34
+ "regexp" : "Magic Regexp for easier regexp handling",
35
+ "charts" : "Nuxt Charts for drawing charts with ease"
36
+ },
37
+ "config" : {
38
+ "header" : "Current Nuxt Ignis iteration was started with following config applied:"
33
39
  }
34
- }
40
+ }
package/nuxt.config.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { writeFileSync, existsSync, mkdirSync } from 'fs'
2
+ import { dirname } from 'path'
1
3
  import { defu } from 'defu'
2
4
  import { setFeatures } from './features'
3
5
 
@@ -11,8 +13,8 @@ const nuxtConfig = defu(ignisFeatures, {
11
13
  'nuxt-spec',
12
14
  ],
13
15
 
14
- // https://nuxt.com/docs/api/nuxt-config#compatibilitydate
15
- compatibilityDate: '2025-06-07',
16
+ // https://nuxt.com/docs/3.x/api/nuxt-config#compatibilitydate
17
+ compatibilityDate: '2025-07-19',
16
18
 
17
19
  // simple eslint config - see eslint.config.mjs
18
20
  eslint: {
@@ -42,6 +44,13 @@ const nuxtConfig = defu(ignisFeatures, {
42
44
  // actual values MUST BE provided via .env file (or production equivalent)
43
45
  ignis: {
44
46
 
47
+ html: {
48
+ // HTML lang attribute,
49
+ lang: 'en',
50
+ // HTML page title,
51
+ title: 'Nuxt Ignis App',
52
+ },
53
+
45
54
  // logging
46
55
  log: {
47
56
  level: 'info',
@@ -54,6 +63,9 @@ const nuxtConfig = defu(ignisFeatures, {
54
63
  ssr: true, // true/false
55
64
  pages: true, // true/false
56
65
 
66
+ // custom css files
67
+ css: '',
68
+
57
69
  // presets
58
70
  preset: {
59
71
  ui: 'off', // nuxt-ui/tailwind/off
@@ -65,6 +77,7 @@ const nuxtConfig = defu(ignisFeatures, {
65
77
  // core modules
66
78
  // (may be disabled by explicitly setting "false")
67
79
  core: {
80
+ css: true, // not a module, but a default css file
68
81
  eslint: true,
69
82
  fonts: true,
70
83
  image: true,
@@ -105,6 +118,8 @@ const nuxtConfig = defu(ignisFeatures, {
105
118
  composables: '', // list of Vue Equipment composables
106
119
  plugins: '', // list of Vue Equipment plugins
107
120
  },
121
+ regexp: false, // true/false
122
+ charts: false, // true/false
108
123
 
109
124
  // extra behavior
110
125
  warn: {
@@ -113,6 +128,19 @@ const nuxtConfig = defu(ignisFeatures, {
113
128
  },
114
129
  },
115
130
  },
131
+ hooks: {
132
+ 'schema:resolved'() {
133
+ const ignisConfig = JSON.stringify(ignisFeatures, null, 2)
134
+ const outPath = './public/_ignis-config.json'
135
+
136
+ const outDir = dirname(outPath)
137
+ if (!existsSync(outDir)) {
138
+ mkdirSync(outDir, { recursive: true })
139
+ }
140
+
141
+ writeFileSync(outPath, ignisConfig)
142
+ },
143
+ },
116
144
  })
117
145
 
118
146
  // https://nuxt.com/docs/getting-started/configuration#nuxt-configuration
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "nuxt-ignis",
3
- "version": "0.3.3",
4
- "description": "Enhanced and customizable Nuxt application starter pack",
3
+ "version": "0.4.0-rc.2",
4
+ "description": "A ready-to-use setup for your next application in Nuxt",
5
5
  "keywords": [
6
6
  "nuxt",
7
7
  "nuxtjs",
8
8
  "nuxt3",
9
- "starter"
9
+ "starter",
10
+ "layer",
11
+ "nuxt-layer"
10
12
  ],
11
13
  "author": "Alois Seckar <alois.seckar@gmail.com>",
12
14
  "homepage": "https://github.com/AloisSeckar/nuxt-ignis",
@@ -22,44 +24,50 @@
22
24
  "type": "module",
23
25
  "main": "./nuxt.config.ts",
24
26
  "engines": {
25
- "node": ">=18.0.0"
27
+ "node": "^20.19.0 || >=22.12.0"
28
+ },
29
+ "bin": {
30
+ "make-eslint": "./bin/make-eslint.js"
26
31
  },
27
32
  "dependencies": {
28
33
  "@formkit/nuxt": "1.6.9",
29
- "@maas/vue-equipment": "1.0.0-beta.30",
30
- "@nuxt/content": "3.6.1",
31
- "@nuxt/eslint": "1.4.1",
34
+ "@maas/vue-equipment": "1.0.0-beta.32",
35
+ "@nuxt/content": "3.6.3",
36
+ "@nuxt/eslint": "1.6.0",
32
37
  "@nuxt/fonts": "0.11.4",
33
38
  "@nuxt/image": "1.10.0",
34
- "@nuxt/scripts": "0.11.8",
35
- "@nuxt/ui": "3.1.3",
36
- "@nuxtjs/i18n": "9.5.5",
37
- "@nuxtjs/seo": "3.0.3",
38
- "@nuxtjs/supabase": "1.5.2",
39
+ "@nuxt/scripts": "0.11.10",
40
+ "@nuxt/ui": "3.2.0",
41
+ "@nuxtjs/i18n": "9.5.6",
42
+ "@nuxtjs/seo": "3.1.0",
43
+ "@nuxtjs/supabase": "1.5.3",
39
44
  "@nuxtjs/tailwindcss": "6.14.0",
40
- "@pinia/nuxt": "0.11.1",
41
- "@tailwindcss/vite": "4.1.10",
42
- "@vueform/nuxt": "1.16.0",
43
- "@vueuse/core": "13.4.0",
44
- "@vueuse/nuxt": "13.4.0",
45
+ "@pinia/nuxt": "0.11.2",
46
+ "@tailwindcss/vite": "4.1.11",
47
+ "@vueform/nuxt": "1.17.0",
48
+ "@vueuse/core": "13.5.0",
49
+ "@vueuse/nuxt": "13.5.0",
50
+ "better-sqlite3": "12.2.0",
45
51
  "consola": "3.4.2",
46
52
  "date-fns": "4.1.0",
47
53
  "defu": "6.1.4",
48
54
  "elrh-pslo": "1.1.6",
55
+ "magic-regexp": "0.10.0",
49
56
  "nuxt-auth-utils": "0.5.20",
57
+ "nuxt-charts": "0.1.11",
50
58
  "nuxt-neon": "0.6.2",
51
59
  "nuxt-security": "2.2.0",
52
60
  "nuxt-spec": "0.0.4",
53
- "open-props": "1.7.15",
61
+ "open-props": "1.7.16",
54
62
  "pinia": "3.0.3",
55
63
  "postcss-jit-props": "1.0.16",
56
64
  "typescript": "5.8.3",
57
65
  "valibot": "1.1.0",
58
- "zod": "3.25.67"
66
+ "zod": "4.0.5"
59
67
  },
60
68
  "devDependencies": {
61
- "nuxt": "3.17.5",
62
- "vue": "3.5.16",
69
+ "nuxt": "3.17.7",
70
+ "vue": "3.5.17",
63
71
  "vue-router": "4.5.1"
64
72
  },
65
73
  "scripts": {