juxscript 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.
Files changed (61) hide show
  1. package/README.md +292 -0
  2. package/bin/cli.js +149 -0
  3. package/lib/adapters/base-adapter.js +35 -0
  4. package/lib/adapters/index.js +33 -0
  5. package/lib/adapters/mysql-adapter.js +65 -0
  6. package/lib/adapters/postgres-adapter.js +70 -0
  7. package/lib/adapters/sqlite-adapter.js +56 -0
  8. package/lib/components/app.ts +124 -0
  9. package/lib/components/button.ts +136 -0
  10. package/lib/components/card.ts +205 -0
  11. package/lib/components/chart.ts +125 -0
  12. package/lib/components/code.ts +242 -0
  13. package/lib/components/container.ts +282 -0
  14. package/lib/components/data.ts +105 -0
  15. package/lib/components/docs-data.json +1211 -0
  16. package/lib/components/error-handler.ts +285 -0
  17. package/lib/components/footer.ts +146 -0
  18. package/lib/components/header.ts +167 -0
  19. package/lib/components/hero.ts +170 -0
  20. package/lib/components/import.ts +430 -0
  21. package/lib/components/input.ts +175 -0
  22. package/lib/components/layout.ts +113 -0
  23. package/lib/components/list.ts +392 -0
  24. package/lib/components/main.ts +111 -0
  25. package/lib/components/menu.ts +170 -0
  26. package/lib/components/modal.ts +216 -0
  27. package/lib/components/nav.ts +136 -0
  28. package/lib/components/node.ts +200 -0
  29. package/lib/components/reactivity.js +104 -0
  30. package/lib/components/script.ts +152 -0
  31. package/lib/components/sidebar.ts +168 -0
  32. package/lib/components/style.ts +129 -0
  33. package/lib/components/table.ts +279 -0
  34. package/lib/components/tabs.ts +191 -0
  35. package/lib/components/theme.ts +97 -0
  36. package/lib/components/view.ts +174 -0
  37. package/lib/jux.ts +203 -0
  38. package/lib/layouts/default.css +260 -0
  39. package/lib/layouts/default.jux +8 -0
  40. package/lib/layouts/figma.css +334 -0
  41. package/lib/layouts/figma.jux +0 -0
  42. package/lib/layouts/notion.css +258 -0
  43. package/lib/styles/base-theme.css +186 -0
  44. package/lib/styles/dark-theme.css +144 -0
  45. package/lib/styles/global.css +1131 -0
  46. package/lib/styles/light-theme.css +144 -0
  47. package/lib/styles/tokens/dark.css +86 -0
  48. package/lib/styles/tokens/light.css +86 -0
  49. package/lib/themes/dark.css +86 -0
  50. package/lib/themes/light.css +86 -0
  51. package/lib/utils/path-resolver.js +23 -0
  52. package/machinery/compiler.js +262 -0
  53. package/machinery/doc-generator.js +160 -0
  54. package/machinery/generators/css.js +128 -0
  55. package/machinery/generators/html.js +108 -0
  56. package/machinery/imports.js +155 -0
  57. package/machinery/server.js +185 -0
  58. package/machinery/validators/file-validator.js +123 -0
  59. package/machinery/watcher.js +148 -0
  60. package/package.json +58 -0
  61. package/types/globals.d.ts +16 -0
@@ -0,0 +1,334 @@
1
+ /* Figma Layout: All 7 containers */
2
+ #app {
3
+ display: grid;
4
+ grid-template-areas:
5
+ "header header header"
6
+ "subheader subheader subheader"
7
+ "sidebar main aside"
8
+ "footer footer footer";
9
+ grid-template-columns: 250px 1fr 300px;
10
+ grid-template-rows: 60px auto 1fr 60px;
11
+ min-height: 100vh;
12
+ }
13
+
14
+ /* Header */
15
+ #appheader {
16
+ grid-area: header;
17
+ background: var(--color-surface-elevated);
18
+ border-bottom: var(--border-width) solid var(--color-border);
19
+ display: flex;
20
+ align-items: center;
21
+ padding: var(--space-sm) var(--space-lg);
22
+ gap: var(--space-lg);
23
+ }
24
+
25
+ #appheader-logo {
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ #appheader-nav {
30
+ flex: 1;
31
+ display: flex;
32
+ gap: var(--space-md);
33
+ }
34
+
35
+ #appheader-actions {
36
+ flex-shrink: 0;
37
+ display: flex;
38
+ gap: var(--space-sm);
39
+ }
40
+
41
+ /* Subheader */
42
+ #appsubheader {
43
+ grid-area: subheader;
44
+ background: var(--color-surface-base);
45
+ border-bottom: var(--border-width) solid var(--color-border);
46
+ padding: var(--space-sm) var(--space-md);
47
+ display: flex;
48
+ align-items: center;
49
+ gap: var(--space-lg);
50
+ }
51
+
52
+ #appsubheader-breadcrumbs {
53
+ flex: 0 0 auto;
54
+ display: flex;
55
+ align-items: center;
56
+ gap: var(--space-xs);
57
+ }
58
+
59
+ #appsubheader-tabs {
60
+ flex: 1;
61
+ display: flex;
62
+ gap: var(--space-sm);
63
+ }
64
+
65
+ #appsubheader-actions {
66
+ flex-shrink: 0;
67
+ display: flex;
68
+ gap: var(--space-sm);
69
+ }
70
+
71
+ /* Sidebar */
72
+ #appsidebar {
73
+ grid-area: sidebar;
74
+ overflow-y: auto;
75
+ background: var(--color-surface-base);
76
+ border-right: var(--border-width) solid var(--color-border);
77
+ transition: transform var(--transition-base);
78
+ display: flex;
79
+ flex-direction: column;
80
+ }
81
+
82
+ #appsidebar-header {
83
+ padding: var(--space-md);
84
+ border-bottom: var(--border-width) solid var(--color-border);
85
+ flex-shrink: 0;
86
+ }
87
+
88
+ #appsidebar-content {
89
+ flex: 1;
90
+ overflow-y: auto;
91
+ padding: var(--space-sm);
92
+ }
93
+
94
+ #appsidebar-footer {
95
+ padding: var(--space-md);
96
+ border-top: var(--border-width) solid var(--color-border);
97
+ flex-shrink: 0;
98
+ }
99
+
100
+ /* Main */
101
+ #appmain {
102
+ grid-area: main;
103
+ overflow: auto;
104
+ background: var(--color-background);
105
+ padding: var(--space-xl);
106
+ }
107
+
108
+ /* Aside (Right Sidebar) */
109
+ #appaside {
110
+ grid-area: aside;
111
+ overflow-y: auto;
112
+ background: var(--color-surface-base);
113
+ border-left: var(--border-width) solid var(--color-border);
114
+ transition: transform var(--transition-base);
115
+ display: flex;
116
+ flex-direction: column;
117
+ }
118
+
119
+ #appaside-header {
120
+ padding: var(--space-md);
121
+ border-bottom: var(--border-width) solid var(--color-border);
122
+ flex-shrink: 0;
123
+ }
124
+
125
+ #appaside-content {
126
+ flex: 1;
127
+ overflow-y: auto;
128
+ padding: var(--space-md);
129
+ }
130
+
131
+ #appaside-footer {
132
+ padding: var(--space-md);
133
+ border-top: var(--border-width) solid var(--color-border);
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ /* Footer */
138
+ #appfooter {
139
+ grid-area: footer;
140
+ background: var(--color-surface-elevated);
141
+ border-top: var(--border-width) solid var(--color-border);
142
+ padding: var(--space-sm) var(--space-md);
143
+ display: flex;
144
+ justify-content: space-between;
145
+ align-items: center;
146
+ }
147
+
148
+ #appfooter-content {
149
+ flex: 1;
150
+ }
151
+
152
+ #appfooter-legal {
153
+ flex-shrink: 0;
154
+ font-size: var(--font-size-sm);
155
+ color: var(--color-text-secondary);
156
+ }
157
+
158
+ /* Modal */
159
+ #appmodal {
160
+ position: fixed;
161
+ top: 0;
162
+ left: 0;
163
+ right: 0;
164
+ bottom: 0;
165
+ z-index: 2000;
166
+ display: none;
167
+ }
168
+
169
+ #appmodal[aria-hidden="false"] {
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ }
174
+
175
+ #appmodal-backdrop {
176
+ position: absolute;
177
+ inset: 0;
178
+ background: rgba(0, 0, 0, 0.6);
179
+ backdrop-filter: blur(4px);
180
+ }
181
+
182
+ #appmodal-container {
183
+ position: relative;
184
+ background: var(--color-surface-elevated);
185
+ border-radius: var(--radius-lg);
186
+ box-shadow: var(--shadow-2xl);
187
+ max-width: 90vw;
188
+ max-height: 90vh;
189
+ display: flex;
190
+ flex-direction: column;
191
+ overflow: hidden;
192
+ }
193
+
194
+ #appmodal-header {
195
+ padding: var(--space-lg);
196
+ border-bottom: var(--border-width) solid var(--color-border);
197
+ flex-shrink: 0;
198
+ }
199
+
200
+ #appmodal-content {
201
+ flex: 1;
202
+ overflow-y: auto;
203
+ padding: var(--space-lg);
204
+ }
205
+
206
+ #appmodal-footer {
207
+ padding: var(--space-lg);
208
+ border-top: var(--border-width) solid var(--color-border);
209
+ flex-shrink: 0;
210
+ display: flex;
211
+ gap: var(--space-sm);
212
+ justify-content: flex-end;
213
+ }
214
+
215
+ /* Tablet (landscape) */
216
+ @media (max-width: 1280px) {
217
+ #app {
218
+ grid-template-columns: 200px 1fr 250px;
219
+ }
220
+ }
221
+
222
+ /* Tablet (portrait) - hide aside */
223
+ @media (max-width: 1024px) {
224
+ #app {
225
+ grid-template-areas:
226
+ "header header"
227
+ "subheader subheader"
228
+ "sidebar main"
229
+ "footer footer";
230
+ grid-template-columns: 200px 1fr;
231
+ }
232
+
233
+ #appaside {
234
+ position: fixed;
235
+ top: 120px;
236
+ right: 0;
237
+ bottom: 60px;
238
+ width: 280px;
239
+ z-index: 98;
240
+ transform: translateX(100%);
241
+ box-shadow: var(--shadow-xl);
242
+ }
243
+
244
+ #appaside.visible {
245
+ transform: translateX(0);
246
+ }
247
+
248
+ #appsubheader {
249
+ padding: var(--space-xs) var(--space-sm);
250
+ gap: var(--space-md);
251
+ }
252
+ }
253
+
254
+ /* Mobile */
255
+ @media (max-width: 768px) {
256
+ #app {
257
+ grid-template-areas:
258
+ "header"
259
+ "subheader"
260
+ "main"
261
+ "footer";
262
+ grid-template-columns: 1fr;
263
+ grid-template-rows: 60px auto 1fr 60px;
264
+ }
265
+
266
+ #appsidebar {
267
+ position: fixed;
268
+ top: 60px;
269
+ left: 0;
270
+ bottom: 60px;
271
+ width: 280px;
272
+ max-width: 80vw;
273
+ z-index: 99;
274
+ transform: translateX(-100%);
275
+ box-shadow: var(--shadow-xl);
276
+ }
277
+
278
+ #appsidebar.visible {
279
+ transform: translateX(0);
280
+ }
281
+
282
+ #appaside {
283
+ top: 60px;
284
+ width: 280px;
285
+ max-width: 80vw;
286
+ }
287
+
288
+ #appmain {
289
+ padding: var(--space-md);
290
+ }
291
+
292
+ #appheader {
293
+ padding: var(--space-xs) var(--space-md);
294
+ gap: var(--space-md);
295
+ }
296
+
297
+ #appsubheader {
298
+ padding: var(--space-xs) var(--space-sm);
299
+ font-size: var(--font-size-sm);
300
+ flex-wrap: wrap;
301
+ }
302
+
303
+ #appfooter {
304
+ padding: var(--space-xs) var(--space-sm);
305
+ font-size: var(--font-size-sm);
306
+ flex-direction: column;
307
+ gap: var(--space-xs);
308
+ text-align: center;
309
+ }
310
+ }
311
+
312
+ /* Small mobile */
313
+ @media (max-width: 480px) {
314
+ #appsidebar,
315
+ #appaside {
316
+ width: 100%;
317
+ max-width: 100vw;
318
+ }
319
+
320
+ #appmain {
321
+ padding: var(--space-sm);
322
+ }
323
+
324
+ #appheader,
325
+ #appsubheader,
326
+ #appfooter {
327
+ padding: var(--space-xs) var(--space-sm);
328
+ }
329
+
330
+ #appmodal-container {
331
+ max-width: 95vw;
332
+ max-height: 95vh;
333
+ }
334
+ }
File without changes
@@ -0,0 +1,258 @@
1
+ /* Notion Layout Grid */
2
+ #app {
3
+ display: grid;
4
+ grid-template-areas:
5
+ "header header"
6
+ "sidebar main"
7
+ "footer footer";
8
+ grid-template-columns: 250px 1fr;
9
+ grid-template-rows: auto 1fr auto;
10
+ min-height: 100vh;
11
+ }
12
+
13
+ /* Header */
14
+ #appheader {
15
+ grid-area: header;
16
+ position: sticky;
17
+ top: 0;
18
+ z-index: 100;
19
+ background: var(--color-surface-elevated);
20
+ border-bottom: var(--border-width) solid var(--color-border);
21
+ display: flex;
22
+ align-items: center;
23
+ padding: var(--space-md) var(--space-lg);
24
+ gap: var(--space-lg);
25
+ }
26
+
27
+ #appheader-logo {
28
+ flex-shrink: 0;
29
+ }
30
+
31
+ #appheader-nav {
32
+ flex: 1;
33
+ display: flex;
34
+ gap: var(--space-md);
35
+ }
36
+
37
+ #appheader-actions {
38
+ flex-shrink: 0;
39
+ display: flex;
40
+ gap: var(--space-sm);
41
+ }
42
+
43
+ /* Subheader - Hidden in notion layout */
44
+ #appsubheader {
45
+ display: none;
46
+ }
47
+
48
+ #appsubheader-breadcrumbs,
49
+ #appsubheader-tabs,
50
+ #appsubheader-actions {
51
+ display: none;
52
+ }
53
+
54
+ /* Sidebar */
55
+ #appsidebar {
56
+ grid-area: sidebar;
57
+ overflow-y: auto;
58
+ background: var(--color-surface-base);
59
+ border-right: var(--border-width) solid var(--color-border);
60
+ transition: transform var(--transition-base);
61
+ display: flex;
62
+ flex-direction: column;
63
+ }
64
+
65
+ #appsidebar-header {
66
+ padding: var(--space-md);
67
+ border-bottom: var(--border-width) solid var(--color-border);
68
+ flex-shrink: 0;
69
+ }
70
+
71
+ #appsidebar-content {
72
+ flex: 1;
73
+ overflow-y: auto;
74
+ padding: var(--space-sm);
75
+ }
76
+
77
+ #appsidebar-footer {
78
+ padding: var(--space-md);
79
+ border-top: var(--border-width) solid var(--color-border);
80
+ flex-shrink: 0;
81
+ }
82
+
83
+ /* Main */
84
+ #appmain {
85
+ grid-area: main;
86
+ overflow-y: auto;
87
+ padding: var(--space-xl);
88
+ background: var(--color-background);
89
+ }
90
+
91
+ /* Aside - Hidden in notion layout */
92
+ #appaside {
93
+ display: none;
94
+ }
95
+
96
+ #appaside-header,
97
+ #appaside-content,
98
+ #appaside-footer {
99
+ display: none;
100
+ }
101
+
102
+ /* Footer */
103
+ #appfooter {
104
+ grid-area: footer;
105
+ background: var(--color-surface-elevated);
106
+ border-top: var(--border-width) solid var(--color-border);
107
+ padding: var(--space-lg) var(--space-xl);
108
+ display: flex;
109
+ justify-content: space-between;
110
+ align-items: center;
111
+ }
112
+
113
+ #appfooter-content {
114
+ flex: 1;
115
+ }
116
+
117
+ #appfooter-legal {
118
+ flex-shrink: 0;
119
+ font-size: var(--font-size-sm);
120
+ color: var(--color-text-secondary);
121
+ }
122
+
123
+ /* Modal */
124
+ #appmodal {
125
+ position: fixed;
126
+ top: 0;
127
+ left: 0;
128
+ right: 0;
129
+ bottom: 0;
130
+ z-index: 2000;
131
+ display: none;
132
+ }
133
+
134
+ #appmodal[aria-hidden="false"] {
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ }
139
+
140
+ #appmodal-backdrop {
141
+ position: absolute;
142
+ inset: 0;
143
+ background: rgba(0, 0, 0, 0.6);
144
+ backdrop-filter: blur(4px);
145
+ }
146
+
147
+ #appmodal-container {
148
+ position: relative;
149
+ background: var(--color-surface-elevated);
150
+ border-radius: var(--radius-lg);
151
+ box-shadow: var(--shadow-2xl);
152
+ max-width: 90vw;
153
+ max-height: 90vh;
154
+ display: flex;
155
+ flex-direction: column;
156
+ overflow: hidden;
157
+ }
158
+
159
+ #appmodal-header {
160
+ padding: var(--space-lg);
161
+ border-bottom: var(--border-width) solid var(--color-border);
162
+ flex-shrink: 0;
163
+ }
164
+
165
+ #appmodal-content {
166
+ flex: 1;
167
+ overflow-y: auto;
168
+ padding: var(--space-lg);
169
+ }
170
+
171
+ #appmodal-footer {
172
+ padding: var(--space-lg);
173
+ border-top: var(--border-width) solid var(--color-border);
174
+ flex-shrink: 0;
175
+ display: flex;
176
+ gap: var(--space-sm);
177
+ justify-content: flex-end;
178
+ }
179
+
180
+ /* Tablet (portrait) */
181
+ @media (max-width: 1024px) {
182
+ #app {
183
+ grid-template-columns: 200px 1fr;
184
+ }
185
+
186
+ #appmain {
187
+ padding: var(--space-lg);
188
+ }
189
+
190
+ #appheader {
191
+ padding: var(--space-sm) var(--space-md);
192
+ gap: var(--space-md);
193
+ }
194
+ }
195
+
196
+ /* Mobile */
197
+ @media (max-width: 768px) {
198
+ #app {
199
+ grid-template-areas:
200
+ "header"
201
+ "main"
202
+ "footer";
203
+ grid-template-columns: 1fr;
204
+ }
205
+
206
+ #appsidebar {
207
+ position: fixed;
208
+ top: 60px;
209
+ left: 0;
210
+ bottom: 0;
211
+ width: 280px;
212
+ max-width: 80vw;
213
+ z-index: 99;
214
+ transform: translateX(-100%);
215
+ box-shadow: var(--shadow-xl);
216
+ }
217
+
218
+ #appsidebar.visible {
219
+ transform: translateX(0);
220
+ }
221
+
222
+ #appmain {
223
+ padding: var(--space-md);
224
+ }
225
+
226
+ #appheader {
227
+ padding: var(--space-xs) var(--space-md);
228
+ }
229
+
230
+ #appfooter {
231
+ padding: var(--space-md) var(--space-lg);
232
+ flex-direction: column;
233
+ gap: var(--space-sm);
234
+ text-align: center;
235
+ }
236
+ }
237
+
238
+ /* Small mobile */
239
+ @media (max-width: 480px) {
240
+ #appsidebar {
241
+ width: 100%;
242
+ max-width: 100vw;
243
+ }
244
+
245
+ #appmain {
246
+ padding: var(--space-sm);
247
+ }
248
+
249
+ #appfooter {
250
+ padding: var(--space-sm) var(--space-md);
251
+ font-size: var(--font-size-sm);
252
+ }
253
+
254
+ #appmodal-container {
255
+ max-width: 95vw;
256
+ max-height: 95vh;
257
+ }
258
+ }