@spwig/theme-cli 1.0.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/README.md +278 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +99 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/component.d.ts +13 -0
- package/dist/commands/component.d.ts.map +1 -0
- package/dist/commands/component.js +229 -0
- package/dist/commands/component.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +249 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/package.d.ts +12 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +320 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +204 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/component_manifest_schema.json +221 -0
- package/dist/schemas/theme_manifest_schema.json +267 -0
- package/dist/templates/components/blank.template.html.template +4 -0
- package/dist/templates/components/footer.manifest.json.template +11 -0
- package/dist/templates/components/footer.template.html.template +36 -0
- package/dist/templates/components/header.manifest.json.template +11 -0
- package/dist/templates/components/header.schema.json.template +23 -0
- package/dist/templates/components/header.template.html.template +39 -0
- package/dist/templates/components/schema.json.template +15 -0
- package/dist/templates/components/section.manifest.json.template +11 -0
- package/dist/templates/components/section.template.html.template +13 -0
- package/dist/templates/components/utility.manifest.json.template +11 -0
- package/dist/templates/theme/README.md.template +64 -0
- package/dist/templates/theme/design_tokens.json.template +66 -0
- package/dist/templates/theme/manifest.json.template +40 -0
- package/dist/utils/file-system.d.ts +49 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +115 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/validation.d.ts +40 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +98 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
- package/schemas/component_manifest_schema.json +221 -0
- package/schemas/theme_manifest_schema.json +267 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Theme Package Manifest Schema",
|
|
4
|
+
"description": "Schema for Spwig theme package manifests with bundled components",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"name",
|
|
8
|
+
"version",
|
|
9
|
+
"display_name",
|
|
10
|
+
"description",
|
|
11
|
+
"author"
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"name": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
17
|
+
"minLength": 2,
|
|
18
|
+
"maxLength": 50,
|
|
19
|
+
"description": "Theme identifier (lowercase, alphanumeric with hyphens)"
|
|
20
|
+
},
|
|
21
|
+
"version": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
|
|
24
|
+
"description": "Semantic version (e.g., 1.0.0)"
|
|
25
|
+
},
|
|
26
|
+
"display_name": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"minLength": 1,
|
|
29
|
+
"maxLength": 100,
|
|
30
|
+
"description": "Human-readable theme name"
|
|
31
|
+
},
|
|
32
|
+
"description": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"minLength": 10,
|
|
35
|
+
"maxLength": 1000,
|
|
36
|
+
"description": "Theme description for marketplace listing"
|
|
37
|
+
},
|
|
38
|
+
"author": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"minLength": 1,
|
|
41
|
+
"maxLength": 100,
|
|
42
|
+
"description": "Theme author/vendor name"
|
|
43
|
+
},
|
|
44
|
+
"license": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"enum": ["MIT", "Apache-2.0", "GPL-3.0", "Proprietary"],
|
|
47
|
+
"default": "Proprietary",
|
|
48
|
+
"description": "Theme license type"
|
|
49
|
+
},
|
|
50
|
+
"bundled_components": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": ["type", "name", "path"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"type": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"enum": ["header", "footer", "section", "utility"],
|
|
59
|
+
"description": "Component type"
|
|
60
|
+
},
|
|
61
|
+
"name": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"pattern": "^[a-z][a-z0-9_-]*$",
|
|
64
|
+
"description": "Component name"
|
|
65
|
+
},
|
|
66
|
+
"path": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"pattern": "^components/",
|
|
69
|
+
"description": "Relative path to component directory"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"description": "List of components bundled with this theme"
|
|
74
|
+
},
|
|
75
|
+
"page_schemas": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"properties": {
|
|
78
|
+
"home": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"description": "Path to home page schema"
|
|
81
|
+
},
|
|
82
|
+
"product": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "Path to product page schema"
|
|
85
|
+
},
|
|
86
|
+
"collection": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Path to collection page schema"
|
|
89
|
+
},
|
|
90
|
+
"cart": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"description": "Path to cart page schema"
|
|
93
|
+
},
|
|
94
|
+
"checkout": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "Path to checkout page schema"
|
|
97
|
+
},
|
|
98
|
+
"landing": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"description": "Path to landing page schema"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"additionalProperties": {
|
|
104
|
+
"type": "string"
|
|
105
|
+
},
|
|
106
|
+
"description": "Page schema file paths"
|
|
107
|
+
},
|
|
108
|
+
"design_tokens": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "Path to design tokens file (colors, fonts, spacing)"
|
|
111
|
+
},
|
|
112
|
+
"preview_image": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"pattern": "^.+\\.(png|jpg|jpeg|webp)$",
|
|
115
|
+
"description": "Theme preview image filename (recommended: 600x800px, max 5MB)"
|
|
116
|
+
},
|
|
117
|
+
"screenshots": {
|
|
118
|
+
"type": "array",
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"pattern": "^.+\\.(png|jpg|jpeg|webp)$"
|
|
122
|
+
},
|
|
123
|
+
"maxItems": 10,
|
|
124
|
+
"description": "Screenshot filenames for theme showcase (recommended: 1200x800px, max 5MB each)"
|
|
125
|
+
},
|
|
126
|
+
"demo_url": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"format": "uri",
|
|
129
|
+
"description": "URL to live demo of theme"
|
|
130
|
+
},
|
|
131
|
+
"documentation_url": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"format": "uri",
|
|
134
|
+
"description": "URL to theme documentation"
|
|
135
|
+
},
|
|
136
|
+
"support_url": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"format": "uri",
|
|
139
|
+
"description": "URL for theme support"
|
|
140
|
+
},
|
|
141
|
+
"tags": {
|
|
142
|
+
"type": "array",
|
|
143
|
+
"maxItems": 10,
|
|
144
|
+
"items": {
|
|
145
|
+
"type": "string",
|
|
146
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
147
|
+
"maxLength": 30
|
|
148
|
+
},
|
|
149
|
+
"description": "Searchable tags for theme marketplace"
|
|
150
|
+
},
|
|
151
|
+
"categories": {
|
|
152
|
+
"type": "array",
|
|
153
|
+
"items": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"enum": [
|
|
156
|
+
"fashion",
|
|
157
|
+
"electronics",
|
|
158
|
+
"home-garden",
|
|
159
|
+
"sports",
|
|
160
|
+
"beauty",
|
|
161
|
+
"food-beverage",
|
|
162
|
+
"books",
|
|
163
|
+
"toys",
|
|
164
|
+
"jewelry",
|
|
165
|
+
"automotive",
|
|
166
|
+
"general"
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
"description": "Theme categories for marketplace organization"
|
|
170
|
+
},
|
|
171
|
+
"color_schemes": {
|
|
172
|
+
"type": "array",
|
|
173
|
+
"items": {
|
|
174
|
+
"type": "object",
|
|
175
|
+
"required": ["name", "colors"],
|
|
176
|
+
"properties": {
|
|
177
|
+
"name": {
|
|
178
|
+
"type": "string",
|
|
179
|
+
"description": "Color scheme name (e.g., 'Light', 'Dark')"
|
|
180
|
+
},
|
|
181
|
+
"colors": {
|
|
182
|
+
"type": "object",
|
|
183
|
+
"properties": {
|
|
184
|
+
"primary": {
|
|
185
|
+
"type": "string",
|
|
186
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
187
|
+
},
|
|
188
|
+
"secondary": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
191
|
+
},
|
|
192
|
+
"accent": {
|
|
193
|
+
"type": "string",
|
|
194
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
195
|
+
},
|
|
196
|
+
"background": {
|
|
197
|
+
"type": "string",
|
|
198
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
199
|
+
},
|
|
200
|
+
"text": {
|
|
201
|
+
"type": "string",
|
|
202
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"description": "Pre-defined color schemes for theme"
|
|
209
|
+
},
|
|
210
|
+
"features": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"items": {
|
|
213
|
+
"type": "string"
|
|
214
|
+
},
|
|
215
|
+
"description": "List of theme features for marketing"
|
|
216
|
+
},
|
|
217
|
+
"min_platform_version": {
|
|
218
|
+
"type": "string",
|
|
219
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
|
|
220
|
+
"description": "Minimum platform version required"
|
|
221
|
+
},
|
|
222
|
+
"max_platform_version": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
|
|
225
|
+
"description": "Maximum platform version supported"
|
|
226
|
+
},
|
|
227
|
+
"changelog": {
|
|
228
|
+
"type": "array",
|
|
229
|
+
"items": {
|
|
230
|
+
"type": "object",
|
|
231
|
+
"required": ["version", "date", "changes"],
|
|
232
|
+
"properties": {
|
|
233
|
+
"version": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
|
|
236
|
+
},
|
|
237
|
+
"date": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
240
|
+
},
|
|
241
|
+
"changes": {
|
|
242
|
+
"type": "array",
|
|
243
|
+
"minItems": 1,
|
|
244
|
+
"items": {
|
|
245
|
+
"type": "string"
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"description": "Version history and changes"
|
|
251
|
+
},
|
|
252
|
+
"total_size_bytes": {
|
|
253
|
+
"type": "integer",
|
|
254
|
+
"description": "Total package size in bytes (added during packaging)"
|
|
255
|
+
},
|
|
256
|
+
"file_count": {
|
|
257
|
+
"type": "integer",
|
|
258
|
+
"description": "Total number of files (added during packaging)"
|
|
259
|
+
},
|
|
260
|
+
"checksum": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"pattern": "^sha256:[a-f0-9]{64}$",
|
|
263
|
+
"description": "SHA256 checksum of package contents (added during packaging)"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"additionalProperties": false
|
|
267
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{componentName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"display_name": "{{displayName}}",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"tier_compatibility": ["A", "B", "C"],
|
|
8
|
+
"regions": ["footer"],
|
|
9
|
+
"category": "footer",
|
|
10
|
+
"tags": ["footer", "navigation"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<footer class="site-footer">
|
|
2
|
+
<div class="container">
|
|
3
|
+
<div class="footer-content">
|
|
4
|
+
<!-- Footer Links -->
|
|
5
|
+
<div class="footer-section">
|
|
6
|
+
<h3>Quick Links</h3>
|
|
7
|
+
<nav class="footer-nav">
|
|
8
|
+
{% for item in navigation.footer_menu %}
|
|
9
|
+
<a href="{{ item.url }}">{{ item.title }}</a>
|
|
10
|
+
{% endfor %}
|
|
11
|
+
</nav>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<!-- Contact Info -->
|
|
15
|
+
<div class="footer-section">
|
|
16
|
+
<h3>Contact</h3>
|
|
17
|
+
<div class="contact-info">
|
|
18
|
+
{% if store.email %}
|
|
19
|
+
<p>Email: {{ store.email }}</p>
|
|
20
|
+
{% endif %}
|
|
21
|
+
{% if store.phone %}
|
|
22
|
+
<p>Phone: {{ store.phone }}</p>
|
|
23
|
+
{% endif %}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<!-- Copyright -->
|
|
28
|
+
<div class="footer-bottom">
|
|
29
|
+
<p>© {{ "now" | date: "%Y" }} {{ store.name }}. All rights reserved.</p>
|
|
30
|
+
{% if settings.show_powered_by %}
|
|
31
|
+
<p>Powered by Spwig</p>
|
|
32
|
+
{% endif %}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</footer>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{componentName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"display_name": "{{displayName}}",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"tier_compatibility": ["A", "B", "C"],
|
|
8
|
+
"regions": ["header"],
|
|
9
|
+
"category": "header",
|
|
10
|
+
"tags": ["navigation", "header"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"settings": [
|
|
3
|
+
{
|
|
4
|
+
"id": "background_color",
|
|
5
|
+
"type": "color",
|
|
6
|
+
"label": "Background Color",
|
|
7
|
+
"default": "#ffffff"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "show_logo",
|
|
11
|
+
"type": "checkbox",
|
|
12
|
+
"label": "Show Logo",
|
|
13
|
+
"default": true
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "sticky",
|
|
17
|
+
"type": "checkbox",
|
|
18
|
+
"label": "Sticky Header",
|
|
19
|
+
"info": "Header stays at top when scrolling",
|
|
20
|
+
"default": false
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<header class="site-header" style="background-color: {{ settings.background_color }};">
|
|
2
|
+
<div class="container">
|
|
3
|
+
<div class="header-content">
|
|
4
|
+
<!-- Logo -->
|
|
5
|
+
<div class="header-logo">
|
|
6
|
+
{% if settings.show_logo and store.logo %}
|
|
7
|
+
<a href="/">
|
|
8
|
+
<img src="{{ store.logo }}" alt="{{ store.name }}" class="logo-image">
|
|
9
|
+
</a>
|
|
10
|
+
{% else %}
|
|
11
|
+
<a href="/" class="logo-text">
|
|
12
|
+
{{ store.name }}
|
|
13
|
+
</a>
|
|
14
|
+
{% endif %}
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<!-- Navigation -->
|
|
18
|
+
<nav class="main-navigation">
|
|
19
|
+
{% for item in navigation.main_menu %}
|
|
20
|
+
<a href="{{ item.url }}" class="nav-link">
|
|
21
|
+
{{ item.title }}
|
|
22
|
+
</a>
|
|
23
|
+
{% endfor %}
|
|
24
|
+
</nav>
|
|
25
|
+
|
|
26
|
+
<!-- Cart Icon -->
|
|
27
|
+
<div class="header-actions">
|
|
28
|
+
<a href="/cart" class="cart-link">
|
|
29
|
+
<svg class="cart-icon" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
|
30
|
+
<path d="M9 2L9 4M15 2L15 4M3 8h18M5 8h14a2 2 0 012 2v10a2 2 0 01-2 2H5a2 2 0 01-2-2V10a2 2 0 012-2z" stroke-width="2" stroke-linecap="round"/>
|
|
31
|
+
</svg>
|
|
32
|
+
{% if cart.item_count > 0 %}
|
|
33
|
+
<span class="cart-count">{{ cart.item_count }}</span>
|
|
34
|
+
{% endif %}
|
|
35
|
+
</a>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</header>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Component Settings",
|
|
5
|
+
"description": "Configuration options for this component",
|
|
6
|
+
"properties": {
|
|
7
|
+
"example_setting": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"title": "Example Setting",
|
|
10
|
+
"description": "This is an example setting - replace with your own",
|
|
11
|
+
"default": "default value"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"required": []
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{componentName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"display_name": "{{displayName}}",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"tier_compatibility": ["A", "B", "C"],
|
|
8
|
+
"regions": ["main", "sidebar"],
|
|
9
|
+
"category": "section",
|
|
10
|
+
"tags": ["section", "content"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<section class="hero-section" style="background-color: {{ settings.background_color }};">
|
|
2
|
+
<div class="container">
|
|
3
|
+
<div class="hero-content">
|
|
4
|
+
<h1 class="hero-title">{{ settings.title }}</h1>
|
|
5
|
+
<p class="hero-description">{{ settings.description }}</p>
|
|
6
|
+
{% if settings.show_button %}
|
|
7
|
+
<a href="{{ settings.button_url }}" class="hero-button">
|
|
8
|
+
{{ settings.button_text }}
|
|
9
|
+
</a>
|
|
10
|
+
{% endif %}
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</section>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{componentName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"display_name": "{{displayName}}",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"tier_compatibility": ["A", "B", "C"],
|
|
8
|
+
"regions": ["header", "footer", "sidebar"],
|
|
9
|
+
"category": "utility",
|
|
10
|
+
"tags": ["utility"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# {{displayName}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
## Theme Information
|
|
6
|
+
|
|
7
|
+
- **Author**: {{author}}
|
|
8
|
+
- **Version**: 1.0.0
|
|
9
|
+
- **License**: {{license}}
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- Responsive design optimized for all devices
|
|
14
|
+
- Modern and clean aesthetics
|
|
15
|
+
- Customizable color schemes via design tokens
|
|
16
|
+
- Performance optimized
|
|
17
|
+
- Accessible and SEO-friendly
|
|
18
|
+
|
|
19
|
+
## Development
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Start development server
|
|
23
|
+
spwig dev
|
|
24
|
+
|
|
25
|
+
# Validate theme
|
|
26
|
+
spwig validate
|
|
27
|
+
|
|
28
|
+
# Package for distribution
|
|
29
|
+
spwig package
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Bundled Components
|
|
33
|
+
|
|
34
|
+
This theme includes the following components:
|
|
35
|
+
|
|
36
|
+
- **Default Header** - Site header with navigation
|
|
37
|
+
- **Default Footer** - Site footer with links
|
|
38
|
+
- **Hero Section** - Eye-catching hero banner
|
|
39
|
+
|
|
40
|
+
## Customization
|
|
41
|
+
|
|
42
|
+
### Design Tokens
|
|
43
|
+
|
|
44
|
+
Edit `design_tokens.json` to customize colors, typography, spacing, and more.
|
|
45
|
+
|
|
46
|
+
### Components
|
|
47
|
+
|
|
48
|
+
Components are located in the `components/` directory. Each component has:
|
|
49
|
+
- `manifest.json` - Component configuration
|
|
50
|
+
- `template.html` - Component template
|
|
51
|
+
- `schema.json` - Component settings schema
|
|
52
|
+
- `styles.css` - Component styles (optional)
|
|
53
|
+
|
|
54
|
+
### Pages
|
|
55
|
+
|
|
56
|
+
Page schemas are in the `pages/` directory. Configure which components appear on each page type.
|
|
57
|
+
|
|
58
|
+
## Support
|
|
59
|
+
|
|
60
|
+
For questions or support, please contact {{author}}.
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
This theme is licensed under the {{license}} license.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"colors": {
|
|
3
|
+
"primary": "#2563eb",
|
|
4
|
+
"secondary": "#64748b",
|
|
5
|
+
"accent": "#f59e0b",
|
|
6
|
+
"background": "#ffffff",
|
|
7
|
+
"text": "#1e293b",
|
|
8
|
+
"success": "#10b981",
|
|
9
|
+
"warning": "#f59e0b",
|
|
10
|
+
"error": "#ef4444",
|
|
11
|
+
"border": "#e2e8f0"
|
|
12
|
+
},
|
|
13
|
+
"typography": {
|
|
14
|
+
"heading_font": "Inter, system-ui, sans-serif",
|
|
15
|
+
"body_font": "Inter, system-ui, sans-serif",
|
|
16
|
+
"mono_font": "Consolas, Monaco, monospace",
|
|
17
|
+
"base_size": "16px",
|
|
18
|
+
"scale": 1.25,
|
|
19
|
+
"weights": {
|
|
20
|
+
"light": 300,
|
|
21
|
+
"normal": 400,
|
|
22
|
+
"medium": 500,
|
|
23
|
+
"semibold": 600,
|
|
24
|
+
"bold": 700
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"spacing": {
|
|
28
|
+
"unit": "0.25rem",
|
|
29
|
+
"scale": [0, 1, 2, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]
|
|
30
|
+
},
|
|
31
|
+
"breakpoints": {
|
|
32
|
+
"mobile": "640px",
|
|
33
|
+
"tablet": "768px",
|
|
34
|
+
"desktop": "1024px",
|
|
35
|
+
"wide": "1280px"
|
|
36
|
+
},
|
|
37
|
+
"borders": {
|
|
38
|
+
"radius": {
|
|
39
|
+
"none": "0",
|
|
40
|
+
"sm": "0.125rem",
|
|
41
|
+
"default": "0.25rem",
|
|
42
|
+
"md": "0.375rem",
|
|
43
|
+
"lg": "0.5rem",
|
|
44
|
+
"xl": "0.75rem",
|
|
45
|
+
"full": "9999px"
|
|
46
|
+
},
|
|
47
|
+
"width": {
|
|
48
|
+
"default": "1px",
|
|
49
|
+
"thick": "2px",
|
|
50
|
+
"thicker": "4px"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"shadows": {
|
|
54
|
+
"sm": "0 1px 2px 0 rgba(0, 0, 0, 0.05)",
|
|
55
|
+
"default": "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",
|
|
56
|
+
"md": "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",
|
|
57
|
+
"lg": "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
|
|
58
|
+
"xl": "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)"
|
|
59
|
+
},
|
|
60
|
+
"transitions": {
|
|
61
|
+
"fast": "150ms",
|
|
62
|
+
"default": "300ms",
|
|
63
|
+
"slow": "500ms",
|
|
64
|
+
"easing": "cubic-bezier(0.4, 0, 0.2, 1)"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{themeName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"display_name": "{{displayName}}",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"license": "{{license}}",
|
|
8
|
+
"bundled_components": [
|
|
9
|
+
{
|
|
10
|
+
"type": "header",
|
|
11
|
+
"name": "default_header",
|
|
12
|
+
"path": "components/headers/default_header"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"type": "footer",
|
|
16
|
+
"name": "default_footer",
|
|
17
|
+
"path": "components/footers/default_footer"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"type": "section",
|
|
21
|
+
"name": "hero_section",
|
|
22
|
+
"path": "components/sections/hero_section"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"page_schemas": {
|
|
26
|
+
"home": "pages/home.json",
|
|
27
|
+
"product": "pages/product.json",
|
|
28
|
+
"collection": "pages/collection.json",
|
|
29
|
+
"cart": "pages/cart.json"
|
|
30
|
+
},
|
|
31
|
+
"design_tokens": "design_tokens.json",
|
|
32
|
+
"tags": ["ecommerce", "modern"],
|
|
33
|
+
"categories": ["general"],
|
|
34
|
+
"features": [
|
|
35
|
+
"Responsive design",
|
|
36
|
+
"Modern aesthetics",
|
|
37
|
+
"Customizable color schemes",
|
|
38
|
+
"Performance optimized"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a directory exists
|
|
3
|
+
*/
|
|
4
|
+
export declare function directoryExists(dirPath: string): Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Check if a file exists
|
|
7
|
+
*/
|
|
8
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Ensure directory exists, create if it doesn't
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureDirectory(dirPath: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Read JSON file
|
|
15
|
+
*/
|
|
16
|
+
export declare function readJSON<T = any>(filePath: string): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Write JSON file with formatting
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeJSON(filePath: string, data: any): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Copy file
|
|
23
|
+
*/
|
|
24
|
+
export declare function copyFile(source: string, destination: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Copy directory recursively
|
|
27
|
+
*/
|
|
28
|
+
export declare function copyDirectory(source: string, destination: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Read template file and replace placeholders
|
|
31
|
+
*/
|
|
32
|
+
export declare function readTemplate(templatePath: string, variables: Record<string, string>): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Write file from template
|
|
35
|
+
*/
|
|
36
|
+
export declare function writeFromTemplate(templatePath: string, outputPath: string, variables: Record<string, string>): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get all files in directory recursively
|
|
39
|
+
*/
|
|
40
|
+
export declare function getFilesRecursively(dirPath: string): Promise<string[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate file size
|
|
43
|
+
*/
|
|
44
|
+
export declare function getFileSize(filePath: string): Promise<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Calculate directory size
|
|
47
|
+
*/
|
|
48
|
+
export declare function getDirectorySize(dirPath: string): Promise<number>;
|
|
49
|
+
//# sourceMappingURL=file-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGpE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB5E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASvE"}
|