@live-change/frontend-template 0.9.138 → 0.9.139
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/front/public/images/cameraAccess/en.png +0 -0
- package/front/src/App.vue +8 -3
- package/front/src/config.js +33 -2
- package/front/src/{Index.vue → pages/clock-test.vue} +4 -0
- package/front/src/pages/index.vue +395 -0
- package/front/src/router.js +3 -5
- package/package.json +47 -41
- package/.nx/workspace-data/file-map.json +0 -195
- package/.nx/workspace-data/nx_files.nxt +0 -0
- package/.nx/workspace-data/project-graph.json +0 -8
- package/.nx/workspace-data/project-graph.lock +0 -0
- package/.nx/workspace-data/source-maps.json +0 -1
|
Binary file
|
package/front/src/App.vue
CHANGED
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
import { ViewRoot, UpdateBanner } from "@live-change/frontend-base"
|
|
20
20
|
|
|
21
21
|
import { computed } from 'vue'
|
|
22
|
-
import { useHead } from '@vueuse/head'
|
|
23
|
-
|
|
22
|
+
import { useHead } from '@vueuse/head'
|
|
24
23
|
import { useI18n } from 'vue-i18n'
|
|
25
24
|
const i18n = useI18n()
|
|
26
25
|
const { locale: i18nLocale } = useI18n()
|
|
@@ -29,6 +28,9 @@
|
|
|
29
28
|
const api = useApi()
|
|
30
29
|
const client = useClient()
|
|
31
30
|
|
|
31
|
+
import { useRoute } from 'vue-router'
|
|
32
|
+
const route = useRoute()
|
|
33
|
+
|
|
32
34
|
useHead(computed(() => ({
|
|
33
35
|
title: api.metadata.config.value.brandName,
|
|
34
36
|
meta: [
|
|
@@ -39,7 +41,10 @@
|
|
|
39
41
|
],
|
|
40
42
|
htmlAttrs: {
|
|
41
43
|
lang: i18n.locale.value,
|
|
42
|
-
amp: true
|
|
44
|
+
amp: true,
|
|
45
|
+
class: {
|
|
46
|
+
'app-dark-mode': true && !route.meta.lightMode
|
|
47
|
+
}
|
|
43
48
|
},
|
|
44
49
|
})))
|
|
45
50
|
|
package/front/src/config.js
CHANGED
|
@@ -16,15 +16,46 @@ import { locales as wysiwygLocales } from "@live-change/wysiwyg-frontend"
|
|
|
16
16
|
import { locales as blogLocales } from "@live-change/blog-frontend"
|
|
17
17
|
|
|
18
18
|
import Aura from '@primeuix/themes/aura'
|
|
19
|
+
import { definePreset } from '@primeuix/themes'
|
|
20
|
+
|
|
21
|
+
const levels = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
|
|
19
22
|
|
|
20
23
|
export default {
|
|
21
24
|
|
|
22
25
|
primeVue: {
|
|
23
26
|
theme: {
|
|
24
|
-
preset:
|
|
27
|
+
preset: definePreset(Aura, {
|
|
28
|
+
semantic: {
|
|
29
|
+
primary: Object.fromEntries(
|
|
30
|
+
levels.map(level => [level, `{blue.${level}}`])
|
|
31
|
+
),
|
|
32
|
+
colorScheme: {
|
|
33
|
+
light: {
|
|
34
|
+
surface: {
|
|
35
|
+
0: '#ffffff',
|
|
36
|
+
...Object.fromEntries(
|
|
37
|
+
levels.map(level => [level, `{zinc.${level}}`])
|
|
38
|
+
)
|
|
39
|
+
},
|
|
40
|
+
primary: {
|
|
41
|
+
contrastColor: '#000000',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
dark: {
|
|
45
|
+
surface: {
|
|
46
|
+
0: '#ffffff',
|
|
47
|
+
...Object.fromEntries(
|
|
48
|
+
levels.map(level => [level, `{slate.${level}}`])
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
}),
|
|
25
56
|
options: {
|
|
26
57
|
prefix: 'p',
|
|
27
|
-
darkModeSelector: '.app-dark-mode
|
|
58
|
+
darkModeSelector: '.app-dark-mode',
|
|
28
59
|
cssLayer: {
|
|
29
60
|
name: "primevue",
|
|
30
61
|
order: "base, primevue",
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
<route>
|
|
2
|
+
{ name: 'index', meta: { pageType: 'wide' } }
|
|
3
|
+
</route>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="min-h-screen bg-surface-0 dark:bg-surface-900">
|
|
7
|
+
<!-- Hero Section -->
|
|
8
|
+
<section class="py-20 px-4 bg-surface-50 dark:bg-surface-800">
|
|
9
|
+
<div class="max-w-4xl mx-auto text-center">
|
|
10
|
+
<!-- Logo -->
|
|
11
|
+
<div class="mb-6 flex justify-center">
|
|
12
|
+
<img
|
|
13
|
+
src="/images/logo.svg"
|
|
14
|
+
alt="Live Change Logo"
|
|
15
|
+
class="w-32 h-32 md:w-40 md:h-40 text-primary-500 transition-transform duration-300 hover:scale-110"
|
|
16
|
+
/>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<!-- Title and Description -->
|
|
20
|
+
<div class="mb-12">
|
|
21
|
+
<h1 class="text-3xl md:text-5xl font-bold text-surface-900 dark:text-surface-100 mb-6 text-center">
|
|
22
|
+
Live Change
|
|
23
|
+
</h1>
|
|
24
|
+
<p class="text-lg md:text-xl text-surface-600 dark:text-surface-300 mb-8 max-w-3xl mx-auto leading-relaxed">
|
|
25
|
+
The real-time web framework that revolutionizes how you build modern applications with seamless synchronization and live data
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
<!-- Live Demo Indicator -->
|
|
29
|
+
<div class="inline-flex items-center gap-2 px-4 py-2 bg-green-100 dark:bg-green-900/30 rounded-full mb-8">
|
|
30
|
+
<div class="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
31
|
+
<span class="text-sm font-medium text-green-700 dark:text-green-300">Live & Real-time</span>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<!-- CTA Buttons -->
|
|
36
|
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
|
37
|
+
<Button
|
|
38
|
+
label="Get Started"
|
|
39
|
+
icon="pi pi-arrow-right"
|
|
40
|
+
class="p-button-lg transition-all duration-300 transform hover:scale-105"
|
|
41
|
+
iconPos="right"
|
|
42
|
+
/>
|
|
43
|
+
<Button
|
|
44
|
+
label="View Documentation"
|
|
45
|
+
icon="pi pi-book"
|
|
46
|
+
class="p-button-lg transition-all duration-300"
|
|
47
|
+
outlined
|
|
48
|
+
severity="secondary"
|
|
49
|
+
/>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<!-- Features Grid -->
|
|
55
|
+
<section class="py-20 px-4">
|
|
56
|
+
<div class="max-w-7xl mx-auto">
|
|
57
|
+
<div class="text-center mb-16 max-w-4xl mx-auto">
|
|
58
|
+
<h2 class="text-3xl md:text-4xl font-bold text-surface-900 dark:text-surface-100 mb-4 text-center">
|
|
59
|
+
Built for the Modern Web
|
|
60
|
+
</h2>
|
|
61
|
+
<p class="text-lg md:text-xl text-surface-600 dark:text-surface-300 max-w-2xl mx-auto">
|
|
62
|
+
Experience the next generation of web development with our comprehensive real-time framework
|
|
63
|
+
</p>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
67
|
+
<!-- Real-time Sync -->
|
|
68
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
69
|
+
<template #content>
|
|
70
|
+
<div class="text-center p-6">
|
|
71
|
+
<div class="w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
72
|
+
<i class="pi pi-sync text-2xl text-blue-600 dark:text-blue-400"></i>
|
|
73
|
+
</div>
|
|
74
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">Real-time Synchronization</h3>
|
|
75
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
76
|
+
Advanced protocol ensuring instant data synchronization across all connected clients with zero latency
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
79
|
+
</template>
|
|
80
|
+
</Card>
|
|
81
|
+
|
|
82
|
+
<!-- SSR Support -->
|
|
83
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
84
|
+
<template #content>
|
|
85
|
+
<div class="text-center p-6">
|
|
86
|
+
<div class="w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
87
|
+
<i class="pi pi-server text-2xl text-green-600 dark:text-green-400"></i>
|
|
88
|
+
</div>
|
|
89
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">Server-Side Rendering</h3>
|
|
90
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
91
|
+
Built-in SSR support for better SEO, faster initial loads, and improved user experience
|
|
92
|
+
</p>
|
|
93
|
+
</div>
|
|
94
|
+
</template>
|
|
95
|
+
</Card>
|
|
96
|
+
|
|
97
|
+
<!-- Live Database -->
|
|
98
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
99
|
+
<template #content>
|
|
100
|
+
<div class="text-center p-6">
|
|
101
|
+
<div class="w-16 h-16 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
102
|
+
<i class="pi pi-database text-2xl text-purple-600 dark:text-purple-400"></i>
|
|
103
|
+
</div>
|
|
104
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">Live Query Database</h3>
|
|
105
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
106
|
+
Object-oriented real-time database with live queries that update automatically as data changes
|
|
107
|
+
</p>
|
|
108
|
+
</div>
|
|
109
|
+
</template>
|
|
110
|
+
</Card>
|
|
111
|
+
|
|
112
|
+
<!-- CRUD Generator -->
|
|
113
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
114
|
+
<template #content>
|
|
115
|
+
<div class="text-center p-6">
|
|
116
|
+
<div class="w-16 h-16 bg-orange-100 dark:bg-orange-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
117
|
+
<i class="pi pi-cog text-2xl text-orange-600 dark:text-orange-400"></i>
|
|
118
|
+
</div>
|
|
119
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">CRUD Generator</h3>
|
|
120
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
121
|
+
Automatic generation of Create, Read, Update, Delete operations with validation and type safety
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
</template>
|
|
125
|
+
</Card>
|
|
126
|
+
|
|
127
|
+
<!-- Access Control -->
|
|
128
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
129
|
+
<template #content>
|
|
130
|
+
<div class="text-center p-6">
|
|
131
|
+
<div class="w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
132
|
+
<i class="pi pi-shield text-2xl text-red-600 dark:text-red-400"></i>
|
|
133
|
+
</div>
|
|
134
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">Access Control System</h3>
|
|
135
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
136
|
+
Comprehensive security with user roles, permissions, and object-level access control
|
|
137
|
+
</p>
|
|
138
|
+
</div>
|
|
139
|
+
</template>
|
|
140
|
+
</Card>
|
|
141
|
+
|
|
142
|
+
<!-- Relationship Modeling -->
|
|
143
|
+
<Card class="!border-0 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
144
|
+
<template #content>
|
|
145
|
+
<div class="text-center p-6">
|
|
146
|
+
<div class="w-16 h-16 bg-teal-100 dark:bg-teal-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
147
|
+
<i class="pi pi-sitemap text-2xl text-teal-600 dark:text-teal-400"></i>
|
|
148
|
+
</div>
|
|
149
|
+
<h3 class="text-xl font-semibold text-surface-900 dark:text-surface-100 mb-3">Relationship Modeling</h3>
|
|
150
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
151
|
+
Intuitive system for modeling complex relationships between objects with automatic resolution
|
|
152
|
+
</p>
|
|
153
|
+
</div>
|
|
154
|
+
</template>
|
|
155
|
+
</Card>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</section>
|
|
159
|
+
|
|
160
|
+
<!-- Technical Overview -->
|
|
161
|
+
<section class="py-20 px-4 bg-surface-50 dark:bg-surface-800">
|
|
162
|
+
<div class="max-w-7xl mx-auto">
|
|
163
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-16 items-center">
|
|
164
|
+
<div>
|
|
165
|
+
<h2 class="text-4xl font-bold text-surface-900 dark:text-surface-100 mb-6">
|
|
166
|
+
Architecture That Scales
|
|
167
|
+
</h2>
|
|
168
|
+
<p class="text-lg text-surface-600 dark:text-surface-300 mb-8">
|
|
169
|
+
Live Change is built on a foundation of cutting-edge technologies and patterns designed for
|
|
170
|
+
modern web applications that need to handle real-time data at scale.
|
|
171
|
+
</p>
|
|
172
|
+
|
|
173
|
+
<div class="space-y-6">
|
|
174
|
+
<div class="flex items-start gap-4">
|
|
175
|
+
<div class="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center flex-shrink-0">
|
|
176
|
+
<i class="pi pi-bolt text-blue-600 dark:text-blue-400"></i>
|
|
177
|
+
</div>
|
|
178
|
+
<div>
|
|
179
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">Event-Driven Architecture</h4>
|
|
180
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
181
|
+
Reactive system that responds instantly to data changes and user interactions
|
|
182
|
+
</p>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
<div class="flex items-start gap-4">
|
|
187
|
+
<div class="w-8 h-8 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center flex-shrink-0">
|
|
188
|
+
<i class="pi pi-globe text-green-600 dark:text-green-400"></i>
|
|
189
|
+
</div>
|
|
190
|
+
<div>
|
|
191
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">WebSocket Protocol</h4>
|
|
192
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
193
|
+
Persistent connections enabling true real-time communication between client and server
|
|
194
|
+
</p>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<div class="flex items-start gap-4">
|
|
199
|
+
<div class="w-8 h-8 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center flex-shrink-0">
|
|
200
|
+
<i class="pi pi-code text-purple-600 dark:text-purple-400"></i>
|
|
201
|
+
</div>
|
|
202
|
+
<div>
|
|
203
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">Type-Safe APIs</h4>
|
|
204
|
+
<p class="text-surface-600 dark:text-surface-300">
|
|
205
|
+
Full TypeScript support with automatic type generation for enhanced developer experience
|
|
206
|
+
</p>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
<div class="relative">
|
|
213
|
+
<div class="absolute inset-0 bg-gradient-to-r from-primary-400 to-primary-500 rounded-lg transform rotate-6"></div>
|
|
214
|
+
<div class="relative bg-surface-0 dark:bg-surface-900 rounded-lg p-8 shadow-xl">
|
|
215
|
+
<pre class="text-sm overflow-x-auto"><code class="text-surface-800 dark:text-surface-200">// Live queries update automatically
|
|
216
|
+
const [ users ] = await Promise.all([
|
|
217
|
+
live(path.user.users({ status: 'online' }))
|
|
218
|
+
])
|
|
219
|
+
|
|
220
|
+
// Real-time data binding
|
|
221
|
+
watch(users, (newUsers) => {
|
|
222
|
+
console.log('Users updated:', newUsers)
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
// Automatic CRUD operations
|
|
226
|
+
await api.create('user', {
|
|
227
|
+
name: 'John Doe',
|
|
228
|
+
email: 'john@example.com'
|
|
229
|
+
})</code></pre>
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</section>
|
|
235
|
+
|
|
236
|
+
<!-- Getting Started -->
|
|
237
|
+
<section class="py-20 px-4">
|
|
238
|
+
<div class="max-w-4xl mx-auto text-center">
|
|
239
|
+
<h2 class="text-4xl font-bold text-surface-900 dark:text-surface-100 mb-6">
|
|
240
|
+
Ready to Get Started?
|
|
241
|
+
</h2>
|
|
242
|
+
<p class="text-xl text-surface-600 dark:text-surface-300 mb-12">
|
|
243
|
+
Join thousands of developers building the next generation of real-time applications
|
|
244
|
+
</p>
|
|
245
|
+
|
|
246
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-12">
|
|
247
|
+
<div class="text-center">
|
|
248
|
+
<div class="w-12 h-12 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
249
|
+
<span class="text-blue-600 dark:text-blue-400 font-bold text-lg">1</span>
|
|
250
|
+
</div>
|
|
251
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">Install Framework</h4>
|
|
252
|
+
<p class="text-surface-600 dark:text-surface-300 text-sm">
|
|
253
|
+
npm install @live-change/framework
|
|
254
|
+
</p>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div class="text-center">
|
|
258
|
+
<div class="w-12 h-12 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
259
|
+
<span class="text-green-600 dark:text-green-400 font-bold text-lg">2</span>
|
|
260
|
+
</div>
|
|
261
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">Create Project</h4>
|
|
262
|
+
<p class="text-surface-600 dark:text-surface-300 text-sm">
|
|
263
|
+
lc create my-awesome-app
|
|
264
|
+
</p>
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
<div class="text-center">
|
|
268
|
+
<div class="w-12 h-12 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
269
|
+
<span class="text-purple-600 dark:text-purple-400 font-bold text-lg">3</span>
|
|
270
|
+
</div>
|
|
271
|
+
<h4 class="font-semibold text-surface-900 dark:text-surface-100 mb-2">Start Building</h4>
|
|
272
|
+
<p class="text-surface-600 dark:text-surface-300 text-sm">
|
|
273
|
+
Real-time apps in minutes
|
|
274
|
+
</p>
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
|
|
278
|
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
|
279
|
+
<Button
|
|
280
|
+
label="Start Your Project"
|
|
281
|
+
icon="pi pi-play"
|
|
282
|
+
class="p-button-lg transition-all duration-300"
|
|
283
|
+
/>
|
|
284
|
+
<Button
|
|
285
|
+
label="Join Community"
|
|
286
|
+
icon="pi pi-users"
|
|
287
|
+
class="p-button-lg transition-all duration-300"
|
|
288
|
+
outlined
|
|
289
|
+
severity="secondary"
|
|
290
|
+
/>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
</section>
|
|
294
|
+
|
|
295
|
+
<!-- Footer -->
|
|
296
|
+
<footer class="py-12 px-4 bg-surface-900 text-surface-0">
|
|
297
|
+
<div class="max-w-4xl mx-auto text-center">
|
|
298
|
+
<div class="mb-8">
|
|
299
|
+
<h3 class="text-2xl font-bold mb-4">Live Change Framework</h3>
|
|
300
|
+
<p class="text-surface-400 max-w-xl mx-auto text-center">
|
|
301
|
+
Building the future of real-time web applications with innovative synchronization technology
|
|
302
|
+
</p>
|
|
303
|
+
</div>
|
|
304
|
+
|
|
305
|
+
<div class="flex justify-center items-center space-x-8 mb-8">
|
|
306
|
+
<a href="#" class="text-surface-400 hover:text-surface-0 transition-colors p-2">
|
|
307
|
+
<i class="pi pi-github text-2xl"></i>
|
|
308
|
+
</a>
|
|
309
|
+
<a href="#" class="text-surface-400 hover:text-surface-0 transition-colors p-2">
|
|
310
|
+
<i class="pi pi-twitter text-2xl"></i>
|
|
311
|
+
</a>
|
|
312
|
+
<a href="#" class="text-surface-400 hover:text-surface-0 transition-colors p-2">
|
|
313
|
+
<i class="pi pi-discord text-2xl"></i>
|
|
314
|
+
</a>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<div class="text-surface-400 text-sm text-center">
|
|
318
|
+
© 2024 Live Change Framework. Built with 💙 for the developer community.
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
</footer>
|
|
322
|
+
</div>
|
|
323
|
+
</template>
|
|
324
|
+
|
|
325
|
+
<script setup>
|
|
326
|
+
import Button from 'primevue/button'
|
|
327
|
+
import Card from 'primevue/card'
|
|
328
|
+
|
|
329
|
+
// SEO Meta
|
|
330
|
+
import { useHead } from '@vueuse/head'
|
|
331
|
+
|
|
332
|
+
useHead({
|
|
333
|
+
title: 'Live Change - Real-time Web Framework',
|
|
334
|
+
meta: [
|
|
335
|
+
{
|
|
336
|
+
name: 'description',
|
|
337
|
+
content: 'Live Change is a revolutionary real-time web framework with seamless synchronization, SSR support, and comprehensive tooling for modern applications.'
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: 'keywords',
|
|
341
|
+
content: 'real-time, web framework, SSR, live data, synchronization, Vue.js, TypeScript'
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
property: 'og:title',
|
|
345
|
+
content: 'Live Change - Real-time Web Framework'
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
property: 'og:description',
|
|
349
|
+
content: 'Build modern real-time applications with Live Change framework. Advanced synchronization, live queries, and comprehensive tooling.'
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
property: 'og:type',
|
|
353
|
+
content: 'website'
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
})
|
|
357
|
+
</script>
|
|
358
|
+
|
|
359
|
+
<style scoped>
|
|
360
|
+
/* Custom animations */
|
|
361
|
+
@keyframes float {
|
|
362
|
+
0%, 100% {
|
|
363
|
+
transform: translateY(0px);
|
|
364
|
+
}
|
|
365
|
+
50% {
|
|
366
|
+
transform: translateY(-20px);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.animate-float {
|
|
371
|
+
animation: float 6s ease-in-out infinite;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* Custom gradients */
|
|
375
|
+
.gradient-text {
|
|
376
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
377
|
+
-webkit-background-clip: text;
|
|
378
|
+
-webkit-text-fill-color: transparent;
|
|
379
|
+
background-clip: text;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/* Smooth scroll behavior */
|
|
383
|
+
html {
|
|
384
|
+
scroll-behavior: smooth;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/* Card hover effects */
|
|
388
|
+
.card-hover {
|
|
389
|
+
transition: all 0.3s ease;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.card-hover:hover {
|
|
393
|
+
transform: translateY(-8px);
|
|
394
|
+
}
|
|
395
|
+
</style>
|
package/front/src/router.js
CHANGED
|
@@ -22,11 +22,6 @@ export function routes(config = {}) {
|
|
|
22
22
|
...userRoutes({ ...config, prefix: prefix + 'user/' }),
|
|
23
23
|
...autoFormRoutes({ ...config, prefix: prefix + 'auto-form' }),
|
|
24
24
|
|
|
25
|
-
route({
|
|
26
|
-
name: 'index', path: prefix, meta: { },
|
|
27
|
-
component: () => import("./Index.vue")
|
|
28
|
-
}),
|
|
29
|
-
|
|
30
25
|
...pagesRoutes,
|
|
31
26
|
|
|
32
27
|
...contentEditRoutes({ ...config }),
|
|
@@ -41,6 +36,9 @@ export async function sitemap(route, api) {
|
|
|
41
36
|
route({
|
|
42
37
|
name: 'index'
|
|
43
38
|
})
|
|
39
|
+
route({
|
|
40
|
+
name: 'clock-test'
|
|
41
|
+
})
|
|
44
42
|
await pagesSitemap(route, api)
|
|
45
43
|
}
|
|
46
44
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/frontend-template",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.139",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"memDev": "tsx --inspect --expose-gc server/start.js memDev --enableSessions --initScript ./init.js --dbAccess",
|
|
6
6
|
"localDevInit": "tsx server/start.js localDev --enableSessions --initScript ./init.js --dbAccess",
|
|
@@ -32,51 +32,57 @@
|
|
|
32
32
|
"generate": "vite build --ssrManifest --outDir dist/static && yarn build:server && tsx prerender",
|
|
33
33
|
"debug": "tsx --inspect-brk server",
|
|
34
34
|
"describe": "tsx server/start.js describe",
|
|
35
|
-
"changes": "tsx server/start.js changes"
|
|
35
|
+
"changes": "tsx server/start.js changes",
|
|
36
|
+
"prerender": "cross-env NODE_ENV=production node dist/server/start.js --enableSessions",
|
|
37
|
+
"prerenderMem": "cross-env NODE_ENV=production node dist/server/start.js prerender --enableSessions --withDb --dbBackend mem --createDb --withApi --withServices --updateServices",
|
|
38
|
+
"prerenderLocal": "cross-env NODE_ENV=production node dist/server/start.js prerender --enableSessions --withDb --createDb --withApi --withServices --updateServices",
|
|
39
|
+
"prerenderTsx": "cross-env NODE_ENV=production tsx server/start.js prerender --enableSessions",
|
|
40
|
+
"prerenderMemTsx": "cross-env NODE_ENV=production tsx server/start.js prerender --enableSessions --withDb --dbBackend mem --createDb --withApi --withServices --updateServices",
|
|
41
|
+
"prerenderLocalTsx": "cross-env NODE_ENV=production tsx server/start.js prerender --enableSessions --withDb --createDb --withApi --withServices --updateServices"
|
|
36
42
|
},
|
|
37
43
|
"type": "module",
|
|
38
44
|
"dependencies": {
|
|
39
45
|
"@codemirror/language": "6.10.1",
|
|
40
46
|
"@dotenvx/dotenvx": "0.27.0",
|
|
41
47
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
|
42
|
-
"@live-change/access-control-frontend": "^0.9.
|
|
43
|
-
"@live-change/access-control-service": "^0.9.
|
|
44
|
-
"@live-change/agreement-service": "^0.9.
|
|
45
|
-
"@live-change/backup-service": "^0.9.
|
|
46
|
-
"@live-change/blog-frontend": "^0.9.
|
|
47
|
-
"@live-change/blog-service": "^0.9.
|
|
48
|
-
"@live-change/cli": "^0.9.
|
|
49
|
-
"@live-change/content-frontend": "^0.9.
|
|
50
|
-
"@live-change/content-service": "^0.9.
|
|
51
|
-
"@live-change/dao": "^0.9.
|
|
52
|
-
"@live-change/dao-vue3": "^0.9.
|
|
53
|
-
"@live-change/dao-websocket": "^0.9.
|
|
54
|
-
"@live-change/db-client": "^0.9.
|
|
55
|
-
"@live-change/draft-service": "^0.9.
|
|
56
|
-
"@live-change/email-service": "^0.9.
|
|
57
|
-
"@live-change/framework": "^0.9.
|
|
58
|
-
"@live-change/frontend-auto-form": "^0.9.
|
|
59
|
-
"@live-change/frontend-base": "^0.9.
|
|
60
|
-
"@live-change/geoip-service": "^0.9.
|
|
61
|
-
"@live-change/image-frontend": "^0.9.
|
|
62
|
-
"@live-change/locale-settings-service": "^0.9.
|
|
63
|
-
"@live-change/password-authentication-service": "^0.9.
|
|
64
|
-
"@live-change/prosemirror-service": "^0.9.
|
|
65
|
-
"@live-change/secret-code-service": "^0.9.
|
|
66
|
-
"@live-change/secret-link-service": "^0.9.
|
|
67
|
-
"@live-change/session-service": "^0.9.
|
|
68
|
-
"@live-change/task-frontend": "^0.9.
|
|
69
|
-
"@live-change/task-service": "^0.9.
|
|
70
|
-
"@live-change/upload-frontend": "^0.9.
|
|
71
|
-
"@live-change/url-frontend": "^0.9.
|
|
72
|
-
"@live-change/url-service": "^0.9.
|
|
73
|
-
"@live-change/user-frontend": "^0.9.
|
|
74
|
-
"@live-change/user-identification-service": "^0.9.
|
|
75
|
-
"@live-change/user-service": "^0.9.
|
|
76
|
-
"@live-change/vote-service": "^0.9.
|
|
77
|
-
"@live-change/vue3-components": "^0.9.
|
|
78
|
-
"@live-change/vue3-ssr": "^0.9.
|
|
79
|
-
"@live-change/wysiwyg-frontend": "^0.9.
|
|
48
|
+
"@live-change/access-control-frontend": "^0.9.139",
|
|
49
|
+
"@live-change/access-control-service": "^0.9.139",
|
|
50
|
+
"@live-change/agreement-service": "^0.9.139",
|
|
51
|
+
"@live-change/backup-service": "^0.9.139",
|
|
52
|
+
"@live-change/blog-frontend": "^0.9.139",
|
|
53
|
+
"@live-change/blog-service": "^0.9.139",
|
|
54
|
+
"@live-change/cli": "^0.9.139",
|
|
55
|
+
"@live-change/content-frontend": "^0.9.139",
|
|
56
|
+
"@live-change/content-service": "^0.9.139",
|
|
57
|
+
"@live-change/dao": "^0.9.139",
|
|
58
|
+
"@live-change/dao-vue3": "^0.9.139",
|
|
59
|
+
"@live-change/dao-websocket": "^0.9.139",
|
|
60
|
+
"@live-change/db-client": "^0.9.139",
|
|
61
|
+
"@live-change/draft-service": "^0.9.139",
|
|
62
|
+
"@live-change/email-service": "^0.9.139",
|
|
63
|
+
"@live-change/framework": "^0.9.139",
|
|
64
|
+
"@live-change/frontend-auto-form": "^0.9.139",
|
|
65
|
+
"@live-change/frontend-base": "^0.9.139",
|
|
66
|
+
"@live-change/geoip-service": "^0.9.139",
|
|
67
|
+
"@live-change/image-frontend": "^0.9.139",
|
|
68
|
+
"@live-change/locale-settings-service": "^0.9.139",
|
|
69
|
+
"@live-change/password-authentication-service": "^0.9.139",
|
|
70
|
+
"@live-change/prosemirror-service": "^0.9.139",
|
|
71
|
+
"@live-change/secret-code-service": "^0.9.139",
|
|
72
|
+
"@live-change/secret-link-service": "^0.9.139",
|
|
73
|
+
"@live-change/session-service": "^0.9.139",
|
|
74
|
+
"@live-change/task-frontend": "^0.9.139",
|
|
75
|
+
"@live-change/task-service": "^0.9.139",
|
|
76
|
+
"@live-change/upload-frontend": "^0.9.139",
|
|
77
|
+
"@live-change/url-frontend": "^0.9.139",
|
|
78
|
+
"@live-change/url-service": "^0.9.139",
|
|
79
|
+
"@live-change/user-frontend": "^0.9.139",
|
|
80
|
+
"@live-change/user-identification-service": "^0.9.139",
|
|
81
|
+
"@live-change/user-service": "^0.9.139",
|
|
82
|
+
"@live-change/vote-service": "^0.9.139",
|
|
83
|
+
"@live-change/vue3-components": "^0.9.139",
|
|
84
|
+
"@live-change/vue3-ssr": "^0.9.139",
|
|
85
|
+
"@live-change/wysiwyg-frontend": "^0.9.139",
|
|
80
86
|
"@vueuse/core": "^12.3.0",
|
|
81
87
|
"codeceptjs-assert": "^0.0.5",
|
|
82
88
|
"compression": "^1.7.5",
|
|
@@ -108,5 +114,5 @@
|
|
|
108
114
|
"author": "Michał Łaszczewski <michal@laszczewski.pl>",
|
|
109
115
|
"license": "ISC",
|
|
110
116
|
"description": "",
|
|
111
|
-
"gitHead": "
|
|
117
|
+
"gitHead": "9202c36abc25e3baf5fe39806d89c3fab203f428"
|
|
112
118
|
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "6.0",
|
|
3
|
-
"nxVersion": "20.8.2",
|
|
4
|
-
"pathMappings": {},
|
|
5
|
-
"nxJsonPlugins": [],
|
|
6
|
-
"fileMap": {
|
|
7
|
-
"projectFileMap": {},
|
|
8
|
-
"nonProjectFiles": [
|
|
9
|
-
{
|
|
10
|
-
"file": ".gitignore",
|
|
11
|
-
"hash": "6515931634565451229"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"file": "Dockerfile",
|
|
15
|
-
"hash": "121979560174086840"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"file": "LICENSE",
|
|
19
|
-
"hash": "10221119794387200971"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"file": "data/.placeholder",
|
|
23
|
-
"hash": "3244421341483603138"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"file": "dev.Dockerfile",
|
|
27
|
-
"hash": "12404327134398031706"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"file": "docker/app.initd.sh",
|
|
31
|
-
"hash": "5689466769238316025"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"file": "docker/build-and-upload.sh",
|
|
35
|
-
"hash": "417670481237399882"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"file": "docker/build-docker-and-upload.sh",
|
|
39
|
-
"hash": "10415899014440850502"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"file": "docker/commit-new-version.sh",
|
|
43
|
-
"hash": "5160018103227051012"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"file": "docker/k8s-rsync-helper.sh",
|
|
47
|
-
"hash": "12840580596915123557"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"file": "docker/onlyDependencies.js",
|
|
51
|
-
"hash": "13135394580253028435"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"file": "docker/parse-args-and-config.sh",
|
|
55
|
-
"hash": "13923189966979506571"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"file": "docker/restore-backup-with-service.sh",
|
|
59
|
-
"hash": "10918919254951884109"
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"file": "docker/restore-backup.sh",
|
|
63
|
-
"hash": "17157081294258412437"
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"file": "docker/start-service.sh",
|
|
67
|
-
"hash": "13107251553503965386"
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"file": "docker/upload-backup-and-restore.sh",
|
|
71
|
-
"hash": "16296194178343837935"
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"file": "front/index.html",
|
|
75
|
-
"hash": "3170363056965810468"
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"file": "front/locales/en.js",
|
|
79
|
-
"hash": "8992398117446253297"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"file": "front/locales/en.json",
|
|
83
|
-
"hash": "7756539891184290419"
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"file": "front/public/favicon.ico",
|
|
87
|
-
"hash": "11176796980188620760"
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
"file": "front/public/images/empty-photo.svg",
|
|
91
|
-
"hash": "9393138513813369674"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"file": "front/public/images/empty-user-photo.svg",
|
|
95
|
-
"hash": "17548039285248668212"
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
"file": "front/public/images/logo.svg",
|
|
99
|
-
"hash": "5934164668360941413"
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"file": "front/public/images/logo128.png",
|
|
103
|
-
"hash": "4924117807669085214"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"file": "front/src/App.vue",
|
|
107
|
-
"hash": "11943486175633065633"
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
"file": "front/src/Index.vue",
|
|
111
|
-
"hash": "10288195062045076599"
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
"file": "front/src/analytics/index.js",
|
|
115
|
-
"hash": "492811393913301668"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"file": "front/src/components/Clock.vue",
|
|
119
|
-
"hash": "3593958769210425701"
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
"file": "front/src/components/NavBar.vue",
|
|
123
|
-
"hash": "8794971727282858242"
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
"file": "front/src/config.js",
|
|
127
|
-
"hash": "11550156468258766293"
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"file": "front/src/entry-client.js",
|
|
131
|
-
"hash": "1218837904372604167"
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"file": "front/src/entry-server.js",
|
|
135
|
-
"hash": "406370987563099630"
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
"file": "front/src/router.js",
|
|
139
|
-
"hash": "13294193569918029402"
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"file": "front/tsconfig.json",
|
|
143
|
-
"hash": "6166366661637344199"
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
"file": "front/tsconfig.node.json",
|
|
147
|
-
"hash": "4208030242441905014"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"file": "front/vite.config.ts",
|
|
151
|
-
"hash": "9842187989112314066"
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
"file": "index.js",
|
|
155
|
-
"hash": "11269213519712721017"
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
"file": "package.json",
|
|
159
|
-
"hash": "8113744260716147283"
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
"file": "server/app.config.js",
|
|
163
|
-
"hash": "11667286885984348384"
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
"file": "server/init.js",
|
|
167
|
-
"hash": "16775016632273161558"
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
"file": "server/page.documentType.js",
|
|
171
|
-
"hash": "4319267302010918354"
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
"file": "server/security.config.js",
|
|
175
|
-
"hash": "6483730663450187822"
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
"file": "server/services.list.js",
|
|
179
|
-
"hash": "200506645507476910"
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
"file": "server/start.js",
|
|
183
|
-
"hash": "17392699231217975998"
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"file": "start-dev-docker.sh",
|
|
187
|
-
"hash": "1356997101209839594"
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
"file": "tsconfig.json",
|
|
191
|
-
"hash": "14656447440708893958"
|
|
192
|
-
}
|
|
193
|
-
]
|
|
194
|
-
}
|
|
195
|
-
}
|
|
Binary file
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|