snice 3.3.0 → 3.4.0
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/bin/snice.js +56 -11
- package/bin/templates/CLAUDE.md +138 -0
- package/bin/templates/base/src/components/counter-button.ts +2 -2
- package/bin/templates/base/src/components/feature-card.ts +59 -0
- package/bin/templates/base/src/components/feature-card.types.ts +5 -0
- package/bin/templates/base/src/main.ts +7 -2
- package/bin/templates/base/src/pages/about-page.ts +8 -5
- package/bin/templates/base/src/pages/home-page.ts +47 -28
- package/bin/templates/base/src/pages/not-found-page.ts +7 -4
- package/bin/templates/base/src/types/api-response.ts +5 -0
- package/bin/templates/base/src/types/status.ts +1 -0
- package/bin/templates/base/src/types/theme.ts +1 -0
- package/bin/templates/base/src/types/user.ts +5 -0
- package/bin/templates/social/README.md +42 -0
- package/bin/templates/social/global.d.ts +14 -0
- package/bin/templates/social/index.html +13 -0
- package/bin/templates/social/package.json +21 -0
- package/bin/templates/social/public/vite.svg +1 -0
- package/bin/templates/social/src/main.ts +33 -0
- package/bin/templates/social/src/pages/feed-page.ts +111 -0
- package/bin/templates/social/src/pages/messages-page.ts +102 -0
- package/bin/templates/social/src/pages/not-found-page.ts +46 -0
- package/bin/templates/social/src/pages/profile-page.ts +99 -0
- package/bin/templates/social/src/pages/settings-page.ts +119 -0
- package/bin/templates/social/src/router.ts +9 -0
- package/bin/templates/social/src/styles/global.css +147 -0
- package/bin/templates/social/tsconfig.json +22 -0
- package/bin/templates/social/vite.config.ts +38 -0
- package/dist/components/accordion/snice-accordion-item.js +1 -1
- package/dist/components/accordion/snice-accordion-item.js.map +1 -1
- package/dist/components/accordion/snice-accordion.js +1 -1
- package/dist/components/accordion/snice-accordion.js.map +1 -1
- package/dist/components/actions/snice-actions.js +4 -4
- package/dist/components/actions/snice-actions.js.map +1 -1
- package/dist/components/audio-recorder/snice-audio-recorder.js +6 -6
- package/dist/components/audio-recorder/snice-audio-recorder.js.map +1 -1
- package/dist/components/avatar/snice-avatar.js +1 -1
- package/dist/components/avatar/snice-avatar.js.map +1 -1
- package/dist/components/badge/snice-badge.js +1 -1
- package/dist/components/badge/snice-badge.js.map +1 -1
- package/dist/components/breadcrumbs/snice-breadcrumbs.js +3 -3
- package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -1
- package/dist/components/calendar/snice-calendar.js +3 -3
- package/dist/components/calendar/snice-calendar.js.map +1 -1
- package/dist/components/camera/snice-camera.js +1 -1
- package/dist/components/camera/snice-camera.js.map +1 -1
- package/dist/components/card/snice-card.js +1 -1
- package/dist/components/card/snice-card.js.map +1 -1
- package/dist/components/carousel/snice-carousel.js +2 -2
- package/dist/components/carousel/snice-carousel.js.map +1 -1
- package/dist/components/chart/snice-chart.js +23 -17
- package/dist/components/chart/snice-chart.js.map +1 -1
- package/dist/components/chat/snice-chat.js +9 -9
- package/dist/components/chat/snice-chat.js.map +1 -1
- package/dist/components/code-block/snice-code-block.js +2 -2
- package/dist/components/code-block/snice-code-block.js.map +1 -1
- package/dist/components/color-display/snice-color-display.js +1 -1
- package/dist/components/color-display/snice-color-display.js.map +1 -1
- package/dist/components/command-palette/snice-command-palette.js +3 -3
- package/dist/components/command-palette/snice-command-palette.js.map +1 -1
- package/dist/components/divider/snice-divider.js +2 -2
- package/dist/components/divider/snice-divider.js.map +1 -1
- package/dist/components/doc/snice-doc.js +4 -4
- package/dist/components/doc/snice-doc.js.map +1 -1
- package/dist/components/draw/snice-draw.js +1 -1
- package/dist/components/draw/snice-draw.js.map +1 -1
- package/dist/components/drawer/snice-drawer.js +1 -1
- package/dist/components/drawer/snice-drawer.js.map +1 -1
- package/dist/components/gantt/snice-gantt.js +2 -2
- package/dist/components/gantt/snice-gantt.js.map +1 -1
- package/dist/components/image/snice-image.js +2 -2
- package/dist/components/image/snice-image.js.map +1 -1
- package/dist/components/kanban/snice-kanban.js +2 -2
- package/dist/components/kanban/snice-kanban.js.map +1 -1
- package/dist/components/kpi/snice-kpi.js +1 -1
- package/dist/components/kpi/snice-kpi.js.map +1 -1
- package/dist/components/link/snice-link.js +1 -1
- package/dist/components/link/snice-link.js.map +1 -1
- package/dist/components/list/snice-list-item.js +1 -1
- package/dist/components/list/snice-list-item.js.map +1 -1
- package/dist/components/list/snice-list.js +18 -12
- package/dist/components/list/snice-list.js.map +1 -1
- package/dist/components/list/snice-list.types.d.ts +7 -25
- package/dist/components/location/snice-location.js +1 -1
- package/dist/components/location/snice-location.js.map +1 -1
- package/dist/components/menu/snice-menu-divider.js +1 -1
- package/dist/components/menu/snice-menu-divider.js.map +1 -1
- package/dist/components/menu/snice-menu-item.js +1 -1
- package/dist/components/menu/snice-menu-item.js.map +1 -1
- package/dist/components/menu/snice-menu.js +1 -1
- package/dist/components/menu/snice-menu.js.map +1 -1
- package/dist/components/progress/snice-progress.js +2 -2
- package/dist/components/progress/snice-progress.js.map +1 -1
- package/dist/components/qr-code/qrcode.js +11 -1
- package/dist/components/qr-code/qrcode.js.map +1 -1
- package/dist/components/qr-code/snice-qr-code.js +9 -2
- package/dist/components/qr-code/snice-qr-code.js.map +1 -1
- package/dist/components/select/snice-select.js +1 -1
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/skeleton/snice-skeleton.js +1 -1
- package/dist/components/skeleton/snice-skeleton.js.map +1 -1
- package/dist/components/sparkline/snice-sparkline.js +1 -1
- package/dist/components/sparkline/snice-sparkline.js.map +1 -1
- package/dist/components/spinner/snice-spinner.js +1 -1
- package/dist/components/spinner/snice-spinner.js.map +1 -1
- package/dist/components/split-pane/snice-split-pane.js +1 -1
- package/dist/components/split-pane/snice-split-pane.js.map +1 -1
- package/dist/components/stat/snice-stat.js +1 -1
- package/dist/components/stat/snice-stat.js.map +1 -1
- package/dist/components/stepper/snice-stepper-panel.js +1 -1
- package/dist/components/stepper/snice-stepper-panel.js.map +1 -1
- package/dist/components/stepper/snice-stepper.js +2 -2
- package/dist/components/stepper/snice-stepper.js.map +1 -1
- package/dist/components/theme/theme.css +234 -0
- package/dist/components/timeline/snice-timeline.js +2 -2
- package/dist/components/timeline/snice-timeline.js.map +1 -1
- package/dist/components/tree/snice-tree-item.js +1 -1
- package/dist/components/tree/snice-tree-item.js.map +1 -1
- package/dist/components/tree/snice-tree.js +1 -1
- package/dist/components/tree/snice-tree.js.map +1 -1
- package/dist/components/virtual-scroller/snice-virtual-scroller.js +3 -3
- package/dist/components/virtual-scroller/snice-virtual-scroller.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { page } from '../router';
|
|
2
|
+
import { render, styles, html, css } from 'snice';
|
|
3
|
+
import type { Placard } from 'snice';
|
|
4
|
+
|
|
5
|
+
const placard: Placard = {
|
|
6
|
+
name: 'feed',
|
|
7
|
+
title: 'Feed',
|
|
8
|
+
icon: '🏠',
|
|
9
|
+
show: true,
|
|
10
|
+
order: 1
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
@page({ tag: 'feed-page', routes: ['/'], placard })
|
|
14
|
+
export class FeedPage extends HTMLElement {
|
|
15
|
+
@render()
|
|
16
|
+
renderContent() {
|
|
17
|
+
return html/*html*/`
|
|
18
|
+
<div class="container">
|
|
19
|
+
<h1>Your Feed</h1>
|
|
20
|
+
|
|
21
|
+
<snice-card class="post">
|
|
22
|
+
<div class="post-header">
|
|
23
|
+
<snice-avatar
|
|
24
|
+
name="Sarah Chen"
|
|
25
|
+
size="48"
|
|
26
|
+
src="https://i.pravatar.cc/150?img=1">
|
|
27
|
+
</snice-avatar>
|
|
28
|
+
<div class="post-author">
|
|
29
|
+
<span class="post-name">Sarah Chen</span>
|
|
30
|
+
<span class="post-time">2 hours ago</span>
|
|
31
|
+
</div>
|
|
32
|
+
<snice-badge variant="success">Following</snice-badge>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="post-content">
|
|
35
|
+
Just launched our new product! 🚀 Check it out and let me know what you think.
|
|
36
|
+
Really excited to share this with the community.
|
|
37
|
+
</div>
|
|
38
|
+
<div class="post-actions">
|
|
39
|
+
<snice-button variant="text" size="small">👍 Like (24)</snice-button>
|
|
40
|
+
<snice-button variant="text" size="small">💬 Comment (5)</snice-button>
|
|
41
|
+
<snice-button variant="text" size="small">🔗 Share</snice-button>
|
|
42
|
+
</div>
|
|
43
|
+
</snice-card>
|
|
44
|
+
|
|
45
|
+
<snice-card class="post">
|
|
46
|
+
<div class="post-header">
|
|
47
|
+
<snice-avatar
|
|
48
|
+
name="Mike Johnson"
|
|
49
|
+
size="48"
|
|
50
|
+
src="https://i.pravatar.cc/150?img=12">
|
|
51
|
+
</snice-avatar>
|
|
52
|
+
<div class="post-author">
|
|
53
|
+
<span class="post-name">Mike Johnson</span>
|
|
54
|
+
<span class="post-time">5 hours ago</span>
|
|
55
|
+
</div>
|
|
56
|
+
<snice-badge variant="primary">Developer</snice-badge>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="post-content">
|
|
59
|
+
Working on a new open source project. Looking for contributors!
|
|
60
|
+
If you're interested in web components, reach out.
|
|
61
|
+
</div>
|
|
62
|
+
<div class="post-actions">
|
|
63
|
+
<snice-button variant="text" size="small">👍 Like (42)</snice-button>
|
|
64
|
+
<snice-button variant="text" size="small">💬 Comment (12)</snice-button>
|
|
65
|
+
<snice-button variant="text" size="small">🔗 Share</snice-button>
|
|
66
|
+
</div>
|
|
67
|
+
</snice-card>
|
|
68
|
+
|
|
69
|
+
<snice-card class="post">
|
|
70
|
+
<div class="post-header">
|
|
71
|
+
<snice-avatar
|
|
72
|
+
name="Emma Davis"
|
|
73
|
+
size="48"
|
|
74
|
+
src="https://i.pravatar.cc/150?img=5">
|
|
75
|
+
</snice-avatar>
|
|
76
|
+
<div class="post-author">
|
|
77
|
+
<span class="post-name">Emma Davis</span>
|
|
78
|
+
<span class="post-time">1 day ago</span>
|
|
79
|
+
</div>
|
|
80
|
+
<snice-badge variant="warning">Designer</snice-badge>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="post-content">
|
|
83
|
+
New design system is live! 🎨 We've updated our color palette and typography.
|
|
84
|
+
Feedback welcome!
|
|
85
|
+
</div>
|
|
86
|
+
<div class="post-actions">
|
|
87
|
+
<snice-button variant="text" size="small">👍 Like (67)</snice-button>
|
|
88
|
+
<snice-button variant="text" size="small">💬 Comment (18)</snice-button>
|
|
89
|
+
<snice-button variant="text" size="small">🔗 Share</snice-button>
|
|
90
|
+
</div>
|
|
91
|
+
</snice-card>
|
|
92
|
+
</div>
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@styles()
|
|
97
|
+
componentStyles() {
|
|
98
|
+
return css/*css*/`
|
|
99
|
+
.container {
|
|
100
|
+
max-width: 800px;
|
|
101
|
+
margin: 0 auto;
|
|
102
|
+
padding: 2rem 1rem;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
h1 {
|
|
106
|
+
margin-bottom: 2rem;
|
|
107
|
+
color: var(--text-color);
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { page } from '../router';
|
|
2
|
+
import { render, styles, html, css } from 'snice';
|
|
3
|
+
import type { Placard } from 'snice';
|
|
4
|
+
|
|
5
|
+
const placard: Placard = {
|
|
6
|
+
name: 'messages',
|
|
7
|
+
title: 'Messages',
|
|
8
|
+
icon: '💬',
|
|
9
|
+
show: true,
|
|
10
|
+
order: 3
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
@page({ tag: 'messages-page', routes: ['/messages'], placard })
|
|
14
|
+
export class MessagesPage extends HTMLElement {
|
|
15
|
+
@render()
|
|
16
|
+
renderContent() {
|
|
17
|
+
return html/*html*/`
|
|
18
|
+
<div class="container">
|
|
19
|
+
<h1>Messages</h1>
|
|
20
|
+
|
|
21
|
+
<snice-card>
|
|
22
|
+
<div class="message-item">
|
|
23
|
+
<snice-avatar
|
|
24
|
+
name="Sarah Chen"
|
|
25
|
+
size="48"
|
|
26
|
+
src="https://i.pravatar.cc/150?img=1">
|
|
27
|
+
</snice-avatar>
|
|
28
|
+
<div class="message-content">
|
|
29
|
+
<div class="message-name">Sarah Chen</div>
|
|
30
|
+
<div class="message-preview">Thanks for the feedback! Let's discuss...</div>
|
|
31
|
+
</div>
|
|
32
|
+
<snice-badge variant="primary">2</snice-badge>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="message-item">
|
|
36
|
+
<snice-avatar
|
|
37
|
+
name="Mike Johnson"
|
|
38
|
+
size="48"
|
|
39
|
+
src="https://i.pravatar.cc/150?img=12">
|
|
40
|
+
</snice-avatar>
|
|
41
|
+
<div class="message-content">
|
|
42
|
+
<div class="message-name">Mike Johnson</div>
|
|
43
|
+
<div class="message-preview">Can we schedule a call tomorrow?</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="message-item">
|
|
48
|
+
<snice-avatar
|
|
49
|
+
name="Emma Davis"
|
|
50
|
+
size="48"
|
|
51
|
+
src="https://i.pravatar.cc/150?img=5">
|
|
52
|
+
</snice-avatar>
|
|
53
|
+
<div class="message-content">
|
|
54
|
+
<div class="message-name">Emma Davis</div>
|
|
55
|
+
<div class="message-preview">The new designs look great! 🎨</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div class="message-item">
|
|
60
|
+
<snice-avatar
|
|
61
|
+
name="John Smith"
|
|
62
|
+
size="48"
|
|
63
|
+
src="https://i.pravatar.cc/150?img=13">
|
|
64
|
+
</snice-avatar>
|
|
65
|
+
<div class="message-content">
|
|
66
|
+
<div class="message-name">John Smith</div>
|
|
67
|
+
<div class="message-preview">Meeting confirmed for 3pm</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<div class="message-item">
|
|
72
|
+
<snice-avatar
|
|
73
|
+
name="Lisa Brown"
|
|
74
|
+
size="48"
|
|
75
|
+
src="https://i.pravatar.cc/150?img=9">
|
|
76
|
+
</snice-avatar>
|
|
77
|
+
<div class="message-content">
|
|
78
|
+
<div class="message-name">Lisa Brown</div>
|
|
79
|
+
<div class="message-preview">Thanks for your help!</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</snice-card>
|
|
83
|
+
</div>
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@styles()
|
|
88
|
+
componentStyles() {
|
|
89
|
+
return css/*css*/`
|
|
90
|
+
.container {
|
|
91
|
+
max-width: 800px;
|
|
92
|
+
margin: 0 auto;
|
|
93
|
+
padding: 2rem 1rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
h1 {
|
|
97
|
+
margin-bottom: 2rem;
|
|
98
|
+
color: var(--text-color);
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { page } from '../router';
|
|
2
|
+
import { render, styles, html, css } from 'snice';
|
|
3
|
+
|
|
4
|
+
@page({ tag: 'not-found-page', routes: ['/404'] })
|
|
5
|
+
export class NotFoundPage extends HTMLElement {
|
|
6
|
+
@render()
|
|
7
|
+
renderContent() {
|
|
8
|
+
return html/*html*/`
|
|
9
|
+
<div class="container">
|
|
10
|
+
<h1>404</h1>
|
|
11
|
+
<p>Page not found</p>
|
|
12
|
+
<snice-button variant="primary">
|
|
13
|
+
<a href="#/" style="color: inherit; text-decoration: none;">Go Home</a>
|
|
14
|
+
</snice-button>
|
|
15
|
+
</div>
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@styles()
|
|
20
|
+
componentStyles() {
|
|
21
|
+
return css/*css*/`
|
|
22
|
+
.container {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
min-height: 60vh;
|
|
28
|
+
text-align: center;
|
|
29
|
+
padding: 2rem;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
h1 {
|
|
33
|
+
font-size: 6rem;
|
|
34
|
+
font-weight: bold;
|
|
35
|
+
color: var(--primary-color);
|
|
36
|
+
margin-bottom: 1rem;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
p {
|
|
40
|
+
font-size: 1.5rem;
|
|
41
|
+
color: var(--text-light);
|
|
42
|
+
margin-bottom: 2rem;
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { page } from '../router';
|
|
2
|
+
import { render, styles, html, css } from 'snice';
|
|
3
|
+
import type { Placard } from 'snice';
|
|
4
|
+
|
|
5
|
+
const placard: Placard = {
|
|
6
|
+
name: 'profile',
|
|
7
|
+
title: 'Profile',
|
|
8
|
+
icon: '👤',
|
|
9
|
+
show: true,
|
|
10
|
+
order: 2
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
@page({ tag: 'profile-page', routes: ['/profile'], placard })
|
|
14
|
+
export class ProfilePage extends HTMLElement {
|
|
15
|
+
@render()
|
|
16
|
+
renderContent() {
|
|
17
|
+
return html/*html*/`
|
|
18
|
+
<div class="container">
|
|
19
|
+
<snice-card>
|
|
20
|
+
<div class="profile-header">
|
|
21
|
+
<snice-avatar
|
|
22
|
+
name="Alex Morgan"
|
|
23
|
+
size="120"
|
|
24
|
+
src="https://i.pravatar.cc/150?img=8">
|
|
25
|
+
</snice-avatar>
|
|
26
|
+
<h1 class="profile-name">Alex Morgan</h1>
|
|
27
|
+
<p class="profile-bio">Full-stack developer | Web components enthusiast | Coffee addict ☕</p>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="stats-grid">
|
|
31
|
+
<snice-stat
|
|
32
|
+
label="Posts"
|
|
33
|
+
value="142">
|
|
34
|
+
</snice-stat>
|
|
35
|
+
<snice-stat
|
|
36
|
+
label="Followers"
|
|
37
|
+
value="1.2k">
|
|
38
|
+
</snice-stat>
|
|
39
|
+
<snice-stat
|
|
40
|
+
label="Following"
|
|
41
|
+
value="384">
|
|
42
|
+
</snice-stat>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<snice-tabs>
|
|
46
|
+
<snice-tab slot="tab" panel="posts" active>Posts</snice-tab>
|
|
47
|
+
<snice-tab slot="tab" panel="about">About</snice-tab>
|
|
48
|
+
<snice-tab slot="tab" panel="activity">Activity</snice-tab>
|
|
49
|
+
|
|
50
|
+
<snice-tab-panel slot="panel" name="posts">
|
|
51
|
+
<div style="padding: 1rem;">
|
|
52
|
+
<p>Your recent posts will appear here.</p>
|
|
53
|
+
<br>
|
|
54
|
+
<snice-button variant="primary">Create Post</snice-button>
|
|
55
|
+
</div>
|
|
56
|
+
</snice-tab-panel>
|
|
57
|
+
|
|
58
|
+
<snice-tab-panel slot="panel" name="about">
|
|
59
|
+
<div style="padding: 1rem;">
|
|
60
|
+
<h3>About Me</h3>
|
|
61
|
+
<p style="margin-top: 1rem;">
|
|
62
|
+
Passionate about building modern web applications with
|
|
63
|
+
cutting-edge technologies. Love sharing knowledge and
|
|
64
|
+
collaborating with the community.
|
|
65
|
+
</p>
|
|
66
|
+
<br>
|
|
67
|
+
<h3>Skills</h3>
|
|
68
|
+
<div style="display: flex; gap: 0.5rem; margin-top: 1rem; flex-wrap: wrap;">
|
|
69
|
+
<snice-badge>JavaScript</snice-badge>
|
|
70
|
+
<snice-badge>TypeScript</snice-badge>
|
|
71
|
+
<snice-badge>Web Components</snice-badge>
|
|
72
|
+
<snice-badge>CSS</snice-badge>
|
|
73
|
+
<snice-badge>Node.js</snice-badge>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</snice-tab-panel>
|
|
77
|
+
|
|
78
|
+
<snice-tab-panel slot="panel" name="activity">
|
|
79
|
+
<div style="padding: 1rem;">
|
|
80
|
+
<p>Recent activity will be shown here.</p>
|
|
81
|
+
</div>
|
|
82
|
+
</snice-tab-panel>
|
|
83
|
+
</snice-tabs>
|
|
84
|
+
</snice-card>
|
|
85
|
+
</div>
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@styles()
|
|
90
|
+
componentStyles() {
|
|
91
|
+
return css/*css*/`
|
|
92
|
+
.container {
|
|
93
|
+
max-width: 900px;
|
|
94
|
+
margin: 0 auto;
|
|
95
|
+
padding: 2rem 1rem;
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { page } from '../router';
|
|
2
|
+
import { render, styles, html, css } from 'snice';
|
|
3
|
+
import type { Placard } from 'snice';
|
|
4
|
+
|
|
5
|
+
const placard: Placard = {
|
|
6
|
+
name: 'settings',
|
|
7
|
+
title: 'Settings',
|
|
8
|
+
icon: '⚙️',
|
|
9
|
+
show: true,
|
|
10
|
+
order: 4
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
@page({ tag: 'settings-page', routes: ['/settings'], placard })
|
|
14
|
+
export class SettingsPage extends HTMLElement {
|
|
15
|
+
@render()
|
|
16
|
+
renderContent() {
|
|
17
|
+
return html/*html*/`
|
|
18
|
+
<div class="container">
|
|
19
|
+
<h1>Settings</h1>
|
|
20
|
+
|
|
21
|
+
<snice-card class="settings-section">
|
|
22
|
+
<h2>Profile Settings</h2>
|
|
23
|
+
<div class="settings-group">
|
|
24
|
+
<snice-input
|
|
25
|
+
label="Display Name"
|
|
26
|
+
value="Alex Morgan"
|
|
27
|
+
placeholder="Enter your name">
|
|
28
|
+
</snice-input>
|
|
29
|
+
|
|
30
|
+
<snice-input
|
|
31
|
+
label="Email"
|
|
32
|
+
type="email"
|
|
33
|
+
value="alex.morgan@example.com"
|
|
34
|
+
placeholder="Enter your email">
|
|
35
|
+
</snice-input>
|
|
36
|
+
|
|
37
|
+
<snice-textarea
|
|
38
|
+
label="Bio"
|
|
39
|
+
value="Full-stack developer | Web components enthusiast"
|
|
40
|
+
placeholder="Tell us about yourself"
|
|
41
|
+
rows="4">
|
|
42
|
+
</snice-textarea>
|
|
43
|
+
</div>
|
|
44
|
+
</snice-card>
|
|
45
|
+
|
|
46
|
+
<snice-card class="settings-section">
|
|
47
|
+
<h2>Notifications</h2>
|
|
48
|
+
<div class="settings-group">
|
|
49
|
+
<div class="setting-item">
|
|
50
|
+
<div class="setting-label">
|
|
51
|
+
<span class="setting-title">Email Notifications</span>
|
|
52
|
+
<span class="setting-description">Receive email updates about your activity</span>
|
|
53
|
+
</div>
|
|
54
|
+
<snice-switch checked></snice-switch>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="setting-item">
|
|
58
|
+
<div class="setting-label">
|
|
59
|
+
<span class="setting-title">Push Notifications</span>
|
|
60
|
+
<span class="setting-description">Receive push notifications on your device</span>
|
|
61
|
+
</div>
|
|
62
|
+
<snice-switch checked></snice-switch>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="setting-item">
|
|
66
|
+
<div class="setting-label">
|
|
67
|
+
<span class="setting-title">Weekly Digest</span>
|
|
68
|
+
<span class="setting-description">Get a weekly summary of your activity</span>
|
|
69
|
+
</div>
|
|
70
|
+
<snice-switch></snice-switch>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</snice-card>
|
|
74
|
+
|
|
75
|
+
<snice-card class="settings-section">
|
|
76
|
+
<h2>Privacy</h2>
|
|
77
|
+
<div class="settings-group">
|
|
78
|
+
<div class="setting-item">
|
|
79
|
+
<div class="setting-label">
|
|
80
|
+
<span class="setting-title">Private Profile</span>
|
|
81
|
+
<span class="setting-description">Make your profile visible to followers only</span>
|
|
82
|
+
</div>
|
|
83
|
+
<snice-switch></snice-switch>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div class="setting-item">
|
|
87
|
+
<div class="setting-label">
|
|
88
|
+
<span class="setting-title">Show Activity Status</span>
|
|
89
|
+
<span class="setting-description">Let others see when you're online</span>
|
|
90
|
+
</div>
|
|
91
|
+
<snice-switch checked></snice-switch>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</snice-card>
|
|
95
|
+
|
|
96
|
+
<div style="display: flex; gap: 1rem;">
|
|
97
|
+
<snice-button variant="primary">Save Changes</snice-button>
|
|
98
|
+
<snice-button variant="secondary">Cancel</snice-button>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@styles()
|
|
105
|
+
componentStyles() {
|
|
106
|
+
return css/*css*/`
|
|
107
|
+
.container {
|
|
108
|
+
max-width: 800px;
|
|
109
|
+
margin: 0 auto;
|
|
110
|
+
padding: 2rem 1rem;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
h1 {
|
|
114
|
+
margin-bottom: 2rem;
|
|
115
|
+
color: var(--text-color);
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
* {
|
|
2
|
+
margin: 0;
|
|
3
|
+
padding: 0;
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
9
|
+
background: var(--background-color, #f5f5f5);
|
|
10
|
+
color: var(--text-color, #333);
|
|
11
|
+
line-height: 1.5;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
#app {
|
|
15
|
+
min-height: 100vh;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.post {
|
|
19
|
+
margin-bottom: 1rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.post-header {
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: 1rem;
|
|
26
|
+
margin-bottom: 1rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.post-author {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.post-name {
|
|
35
|
+
font-weight: 600;
|
|
36
|
+
color: var(--text-color);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.post-time {
|
|
40
|
+
font-size: 0.875rem;
|
|
41
|
+
color: var(--text-light, #666);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.post-content {
|
|
45
|
+
margin-bottom: 1rem;
|
|
46
|
+
line-height: 1.6;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.post-actions {
|
|
50
|
+
display: flex;
|
|
51
|
+
gap: 1rem;
|
|
52
|
+
padding-top: 1rem;
|
|
53
|
+
border-top: 1px solid var(--border-color, #e0e0e0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.profile-header {
|
|
57
|
+
text-align: center;
|
|
58
|
+
padding: 2rem;
|
|
59
|
+
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
|
|
60
|
+
color: white;
|
|
61
|
+
border-radius: 12px 12px 0 0;
|
|
62
|
+
margin-bottom: 2rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.profile-name {
|
|
66
|
+
font-size: 1.5rem;
|
|
67
|
+
font-weight: 600;
|
|
68
|
+
margin-top: 1rem;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.profile-bio {
|
|
72
|
+
margin-top: 0.5rem;
|
|
73
|
+
opacity: 0.9;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.stats-grid {
|
|
77
|
+
display: grid;
|
|
78
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
79
|
+
gap: 1rem;
|
|
80
|
+
margin-bottom: 2rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.message-item {
|
|
84
|
+
display: flex;
|
|
85
|
+
gap: 1rem;
|
|
86
|
+
padding: 1rem;
|
|
87
|
+
border-bottom: 1px solid var(--border-color, #e0e0e0);
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
transition: background 0.2s;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.message-item:hover {
|
|
93
|
+
background: var(--background-hover, #f9f9f9);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.message-content {
|
|
97
|
+
flex: 1;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.message-name {
|
|
101
|
+
font-weight: 600;
|
|
102
|
+
margin-bottom: 0.25rem;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.message-preview {
|
|
106
|
+
font-size: 0.875rem;
|
|
107
|
+
color: var(--text-light, #666);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.settings-section {
|
|
111
|
+
margin-bottom: 2rem;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.settings-section h2 {
|
|
115
|
+
font-size: 1.25rem;
|
|
116
|
+
margin-bottom: 1rem;
|
|
117
|
+
color: var(--text-color);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.settings-group {
|
|
121
|
+
display: flex;
|
|
122
|
+
flex-direction: column;
|
|
123
|
+
gap: 1rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.setting-item {
|
|
127
|
+
display: flex;
|
|
128
|
+
justify-content: space-between;
|
|
129
|
+
align-items: center;
|
|
130
|
+
padding: 1rem 0;
|
|
131
|
+
border-bottom: 1px solid var(--border-color, #e0e0e0);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.setting-label {
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
gap: 0.25rem;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.setting-title {
|
|
141
|
+
font-weight: 500;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.setting-description {
|
|
145
|
+
font-size: 0.875rem;
|
|
146
|
+
color: var(--text-light, #666);
|
|
147
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"allowImportingTsExtensions": true,
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"strict": true,
|
|
13
|
+
"noUnusedLocals": true,
|
|
14
|
+
"noUnusedParameters": true,
|
|
15
|
+
"noFallthroughCasesInSwitch": true,
|
|
16
|
+
"experimentalDecorators": false,
|
|
17
|
+
"emitDecoratorMetadata": false,
|
|
18
|
+
"useDefineForClassFields": false,
|
|
19
|
+
"types": ["vite/client", "node"]
|
|
20
|
+
},
|
|
21
|
+
"include": ["src"]
|
|
22
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import swc from 'unplugin-swc';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [
|
|
6
|
+
swc.vite({
|
|
7
|
+
jsc: {
|
|
8
|
+
parser: {
|
|
9
|
+
syntax: 'typescript',
|
|
10
|
+
decorators: true,
|
|
11
|
+
},
|
|
12
|
+
target: 'es2022',
|
|
13
|
+
transform: {
|
|
14
|
+
decoratorMetadata: false,
|
|
15
|
+
decoratorVersion: '2022-03',
|
|
16
|
+
useDefineForClassFields: false,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
}),
|
|
20
|
+
],
|
|
21
|
+
build: {
|
|
22
|
+
target: 'es2015',
|
|
23
|
+
minify: 'terser',
|
|
24
|
+
cssMinify: true,
|
|
25
|
+
rollupOptions: {
|
|
26
|
+
output: {
|
|
27
|
+
manualChunks: {
|
|
28
|
+
vendor: ['snice']
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
sourcemap: true,
|
|
33
|
+
chunkSizeWarningLimit: 500
|
|
34
|
+
},
|
|
35
|
+
esbuild: {
|
|
36
|
+
drop: process.env.NODE_ENV === 'production' ? ['debugger'] : []
|
|
37
|
+
}
|
|
38
|
+
});
|