@liqvid/studio 1.0.0-alpha.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 (129) hide show
  1. package/LICENSE +9 -0
  2. package/dist/esm/LiqvidDevToolsProvider.js +49 -0
  3. package/dist/esm/api/contract.mjs +48 -0
  4. package/dist/esm/api/project-meta.mjs +33 -0
  5. package/dist/esm/api/recording.mjs +156 -0
  6. package/dist/esm/api/root.mjs +4 -0
  7. package/dist/esm/api/static-file.mjs +82 -0
  8. package/dist/esm/api/types.mjs +1 -0
  9. package/dist/esm/client.mjs +98 -0
  10. package/dist/esm/conventions.mjs +3 -0
  11. package/dist/esm/index.mjs +20 -0
  12. package/dist/esm/initialize.mjs +50 -0
  13. package/dist/esm/jobs/watch-assets.mjs +99 -0
  14. package/dist/esm/jobs/watch-project-files.mjs +216 -0
  15. package/dist/esm/next/api.mjs +48 -0
  16. package/dist/esm/next/page.js +15 -0
  17. package/dist/esm/pages/NewProjectButton.js +62 -0
  18. package/dist/esm/pages/RebuildButton.js +24 -0
  19. package/dist/esm/pages/root-actions.js +151 -0
  20. package/dist/esm/pages/root.js +25 -0
  21. package/dist/esm/pages/root.module.css +326 -0
  22. package/dist/esm/palette.css +279 -0
  23. package/dist/esm/providers/hosting/github-pages.mjs +10 -0
  24. package/dist/esm/providers/hosting/liqvid-studio.mjs +8 -0
  25. package/dist/esm/providers/hosting/s3.mjs +9 -0
  26. package/dist/esm/providers/hosting/sftp.mjs +22 -0
  27. package/dist/esm/providers/index.mjs +10 -0
  28. package/dist/esm/providers/social/bluesky.mjs +8 -0
  29. package/dist/esm/providers/social/facebook.mjs +8 -0
  30. package/dist/esm/providers/social/instagram.mjs +8 -0
  31. package/dist/esm/providers/social/twitter.mjs +7 -0
  32. package/dist/esm/providers/social/youtube.mjs +7 -0
  33. package/dist/esm/providers/types.mjs +1 -0
  34. package/dist/esm/publish.mjs +37 -0
  35. package/dist/esm/recording/RecordingControl.js +110 -0
  36. package/dist/esm/recording/RecordingControl.module.css +0 -0
  37. package/dist/esm/recording/RecordingDialog.js +114 -0
  38. package/dist/esm/recording/RecordingDialog.module.css +194 -0
  39. package/dist/esm/schemas/liqvid-config.mjs +32 -0
  40. package/dist/esm/schemas/project.mjs +27 -0
  41. package/dist/esm/schemas/recording-meta.mjs +11 -0
  42. package/dist/esm/types/assets.mjs +1 -0
  43. package/dist/esm/types.mjs +12 -0
  44. package/dist/esm/ui/Dialog.js +71 -0
  45. package/dist/esm/ui/DockableDialog.js +131 -0
  46. package/dist/esm/ui/DockableDialog.module.css +63 -0
  47. package/dist/esm/ui/RadioTabs.js +13 -0
  48. package/dist/esm/ui/RadioTabs.module.css +54 -0
  49. package/dist/esm/ui/Tabs.js +29 -0
  50. package/dist/esm/ui/Tabs.module.css +31 -0
  51. package/dist/esm/ui/Toast.js +64 -0
  52. package/dist/esm/ui/Toast.module.css +50 -0
  53. package/dist/esm/ui/Toaster.js +13 -0
  54. package/dist/esm/ui/Toaster.module.css +9 -0
  55. package/dist/esm/ui/test.js +14 -0
  56. package/dist/esm/utils/dom.mjs +6 -0
  57. package/dist/esm/utils/fs.mjs +94 -0
  58. package/dist/esm/utils/misc.mjs +15 -0
  59. package/dist/esm/utils/react.mjs +8 -0
  60. package/dist/esm/utils/rsync.mjs +57 -0
  61. package/dist/templates/project.json.hbs +5 -0
  62. package/dist/templates/projects/code/page.tsx.hbs +23 -0
  63. package/dist/templates/projects/code/src/assets.ts.hbs +9 -0
  64. package/dist/templates/projects/code/src/client.tsx.hbs +22 -0
  65. package/dist/templates/projects/code/src/helpers.ts.hbs +21 -0
  66. package/dist/templates/projects/code/src/highlights.ts.hbs +3 -0
  67. package/dist/templates/projects/code/src/markers.ts.hbs +13 -0
  68. package/dist/templates/projects/code/src/project.ts.hbs +23 -0
  69. package/dist/templates/projects/code/template.json +3 -0
  70. package/dist/templates/projects/default/page.tsx.hbs +23 -0
  71. package/dist/templates/projects/default/src/assets.ts.hbs +9 -0
  72. package/dist/templates/projects/default/src/client.tsx.hbs +22 -0
  73. package/dist/templates/projects/default/src/helpers.ts.hbs +21 -0
  74. package/dist/templates/projects/default/src/highlights.ts.hbs +3 -0
  75. package/dist/templates/projects/default/src/markers.ts.hbs +13 -0
  76. package/dist/templates/projects/default/src/project.ts.hbs +23 -0
  77. package/dist/templates/projects/default/template.json +4 -0
  78. package/dist/templates/types.ts.hbs +20 -0
  79. package/dist/types/LiqvidDevToolsProvider.d.ts +12 -0
  80. package/dist/types/api/contract.d.mts +66 -0
  81. package/dist/types/api/project-meta.d.mts +1 -0
  82. package/dist/types/api/recording.d.mts +5 -0
  83. package/dist/types/api/root.d.mts +1 -0
  84. package/dist/types/api/static-file.d.mts +6 -0
  85. package/dist/types/api/types.d.mts +1 -0
  86. package/dist/types/client.d.mts +43 -0
  87. package/dist/types/conventions.d.mts +3 -0
  88. package/dist/types/index.d.mts +19 -0
  89. package/dist/types/initialize.d.mts +14 -0
  90. package/dist/types/jobs/watch-assets.d.mts +18 -0
  91. package/dist/types/jobs/watch-project-files.d.mts +4 -0
  92. package/dist/types/next/api.d.mts +14 -0
  93. package/dist/types/next/page.d.ts +4 -0
  94. package/dist/types/pages/NewProjectButton.d.ts +1 -0
  95. package/dist/types/pages/RebuildButton.d.ts +1 -0
  96. package/dist/types/pages/root-actions.d.ts +29 -0
  97. package/dist/types/pages/root.d.ts +1 -0
  98. package/dist/types/providers/hosting/github-pages.d.mts +11 -0
  99. package/dist/types/providers/hosting/liqvid-studio.d.mts +10 -0
  100. package/dist/types/providers/hosting/s3.d.mts +11 -0
  101. package/dist/types/providers/hosting/sftp.d.mts +13 -0
  102. package/dist/types/providers/index.d.mts +10 -0
  103. package/dist/types/providers/social/bluesky.d.mts +10 -0
  104. package/dist/types/providers/social/facebook.d.mts +10 -0
  105. package/dist/types/providers/social/instagram.d.mts +10 -0
  106. package/dist/types/providers/social/twitter.d.mts +9 -0
  107. package/dist/types/providers/social/youtube.d.mts +9 -0
  108. package/dist/types/providers/types.d.mts +9 -0
  109. package/dist/types/publish.d.mts +1 -0
  110. package/dist/types/recording/RecordingControl.d.ts +16 -0
  111. package/dist/types/recording/RecordingDialog.d.ts +10 -0
  112. package/dist/types/schemas/liqvid-config.d.mts +51 -0
  113. package/dist/types/schemas/project.d.mts +51 -0
  114. package/dist/types/schemas/recording-meta.d.mts +17 -0
  115. package/dist/types/types/assets.d.mts +3 -0
  116. package/dist/types/types.d.mts +20 -0
  117. package/dist/types/ui/Dialog.d.ts +31 -0
  118. package/dist/types/ui/DockableDialog.d.ts +25 -0
  119. package/dist/types/ui/RadioTabs.d.ts +18 -0
  120. package/dist/types/ui/Tabs.d.ts +9 -0
  121. package/dist/types/ui/Toast.d.ts +23 -0
  122. package/dist/types/ui/Toaster.d.ts +6 -0
  123. package/dist/types/ui/test.d.ts +9 -0
  124. package/dist/types/utils/dom.d.mts +3 -0
  125. package/dist/types/utils/fs.d.mts +32 -0
  126. package/dist/types/utils/misc.d.mts +4 -0
  127. package/dist/types/utils/react.d.mts +5 -0
  128. package/dist/types/utils/rsync.d.mts +10 -0
  129. package/package.json +94 -0
@@ -0,0 +1,326 @@
1
+ .main {
2
+ color-scheme: light dark;
3
+ margin: 0 auto;
4
+ padding: 80px;
5
+ width: 48rem;
6
+ }
7
+
8
+ .headerRow {
9
+ align-items: center;
10
+ display: flex;
11
+ gap: 1rem;
12
+ margin-bottom: 1rem;
13
+ }
14
+
15
+ .header {
16
+ font-weight: bold;
17
+ font-size: 3.75rem;
18
+ }
19
+
20
+ .rebuildButton {
21
+ background: light-dark(#f0f0f0, #333);
22
+ border: 1px solid light-dark(#ccc, #555);
23
+ border-radius: 4px;
24
+ color: light-dark(#333, #fff);
25
+ cursor: pointer;
26
+ font-size: 0.875rem;
27
+ padding: 0.5rem 1rem;
28
+ transition: background-color 0.15s;
29
+
30
+ &:hover:not(:disabled) {
31
+ background: light-dark(#e0e0e0, #444);
32
+ }
33
+
34
+ &:disabled {
35
+ cursor: not-allowed;
36
+ opacity: 0.6;
37
+ }
38
+ }
39
+
40
+ .projectList {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 1rem;
44
+
45
+ > li {
46
+ display: flex;
47
+ align-items: center;
48
+ border-radius: 4px;
49
+ border: 1px solid light-dark(#eee, #333);
50
+ font-size: 1rem;
51
+
52
+ > :link {
53
+ display: flex;
54
+ flex: 1;
55
+ align-items: center;
56
+ gap: 1rem;
57
+ padding: 0.5rem;
58
+ }
59
+ }
60
+ }
61
+
62
+ .thumbnail {
63
+ border-radius: 4px;
64
+ display: flex;
65
+ position: relative;
66
+ width: 9rem;
67
+ }
68
+
69
+ .duration {
70
+ /* position */
71
+ bottom: 0;
72
+ position: absolute;
73
+ right: 0;
74
+
75
+ /* background/borders/padding */
76
+ background: #0001;
77
+ border-radius: 2px 0 0 0;
78
+ padding: 4px 4px;
79
+
80
+ /* text */
81
+ color: #fff;
82
+ font-size: 10px;
83
+ line-height: 1;
84
+ }
85
+
86
+ .actions {
87
+ padding: 0.5rem 1rem;
88
+ }
89
+
90
+ .productionLink {
91
+ margin-left: auto;
92
+ color: light-dark(#666, #999);
93
+ font-size: 0.875rem;
94
+ text-decoration: none;
95
+ text-align: right;
96
+ width: min-content;
97
+
98
+ &:hover {
99
+ color: light-dark(#333, #fff);
100
+ }
101
+ }
102
+
103
+ .newProjectButton {
104
+ background: light-dark(#2563eb, #3b82f6);
105
+ border: 1px solid light-dark(#1d4ed8, #2563eb);
106
+ border-radius: 4px;
107
+ color: #fff;
108
+ cursor: pointer;
109
+ font-size: 0.875rem;
110
+ font-weight: 500;
111
+ padding: 0.5rem 1rem;
112
+ transition: background-color 0.15s;
113
+
114
+ &:hover:not(:disabled) {
115
+ background: light-dark(#1d4ed8, #2563eb);
116
+ }
117
+
118
+ &:disabled {
119
+ cursor: not-allowed;
120
+ opacity: 0.6;
121
+ }
122
+ }
123
+
124
+ .dialogOverlay {
125
+ background: rgb(0 0 0 / 0.5);
126
+ inset: 0;
127
+ position: fixed;
128
+ }
129
+
130
+ .dialog {
131
+ background: light-dark(#fff, #1f1f1f);
132
+ border: 1px solid light-dark(#e5e5e5, #333);
133
+ border-radius: 8px;
134
+ box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
135
+ color: light-dark(#1f1f1f, #fff);
136
+ left: 50%;
137
+ max-width: 28rem;
138
+ padding: 1.5rem;
139
+ position: fixed;
140
+ top: 50%;
141
+ transform: translate(-50%, -50%);
142
+ width: calc(100% - 2rem);
143
+ }
144
+
145
+ .dialogForm {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 1.25rem;
149
+ }
150
+
151
+ .dialogTitle {
152
+ font-size: 1.25rem;
153
+ font-weight: 600;
154
+ margin: 0;
155
+ }
156
+
157
+ .formField {
158
+ display: flex;
159
+ flex-direction: column;
160
+ gap: 0.375rem;
161
+
162
+ label {
163
+ font-size: 0.875rem;
164
+ font-weight: 500;
165
+ }
166
+
167
+ input {
168
+ background: light-dark(#fff, #2a2a2a);
169
+ border: 1px solid light-dark(#d1d5db, #4b5563);
170
+ border-radius: 4px;
171
+ color: inherit;
172
+ font-size: 0.875rem;
173
+ padding: 0.5rem 0.75rem;
174
+
175
+ &:focus {
176
+ border-color: light-dark(#2563eb, #3b82f6);
177
+ outline: 2px solid light-dark(#2563eb, #3b82f6);
178
+ outline-offset: 1px;
179
+ }
180
+
181
+ &:disabled {
182
+ background: light-dark(#f3f4f6, #1a1a1a);
183
+ cursor: not-allowed;
184
+ }
185
+ }
186
+ }
187
+
188
+ .fieldHint {
189
+ color: light-dark(#6b7280, #9ca3af);
190
+ font-size: 0.75rem;
191
+ }
192
+
193
+ .error {
194
+ background: light-dark(#fef2f2, #450a0a);
195
+ border: 1px solid light-dark(#fecaca, #7f1d1d);
196
+ border-radius: 4px;
197
+ color: light-dark(#dc2626, #fca5a5);
198
+ font-size: 0.875rem;
199
+ padding: 0.5rem 0.75rem;
200
+ }
201
+
202
+ .dialogActions {
203
+ display: flex;
204
+ gap: 0.75rem;
205
+ justify-content: flex-end;
206
+ margin-top: 0.5rem;
207
+ }
208
+
209
+ .cancelButton {
210
+ background: light-dark(#f3f4f6, #374151);
211
+ border: 1px solid light-dark(#d1d5db, #4b5563);
212
+ border-radius: 4px;
213
+ color: light-dark(#374151, #f3f4f6);
214
+ cursor: pointer;
215
+ font-size: 0.875rem;
216
+ padding: 0.5rem 1rem;
217
+ transition: background-color 0.15s;
218
+
219
+ &:hover:not(:disabled) {
220
+ background: light-dark(#e5e7eb, #4b5563);
221
+ }
222
+
223
+ &:disabled {
224
+ cursor: not-allowed;
225
+ opacity: 0.6;
226
+ }
227
+ }
228
+
229
+ .submitButton {
230
+ background: light-dark(#2563eb, #3b82f6);
231
+ border: 1px solid light-dark(#1d4ed8, #2563eb);
232
+ border-radius: 4px;
233
+ color: #fff;
234
+ cursor: pointer;
235
+ font-size: 0.875rem;
236
+ font-weight: 500;
237
+ padding: 0.5rem 1rem;
238
+ transition: background-color 0.15s;
239
+
240
+ &:hover:not(:disabled) {
241
+ background: light-dark(#1d4ed8, #2563eb);
242
+ }
243
+
244
+ &:disabled {
245
+ cursor: not-allowed;
246
+ opacity: 0.6;
247
+ }
248
+ }
249
+
250
+ /* Select (Base UI) */
251
+ .selectTrigger {
252
+ align-items: center;
253
+ background: light-dark(#fff, #2a2a2a);
254
+ border: 1px solid light-dark(#d1d5db, #4b5563);
255
+ border-radius: 4px;
256
+ color: inherit;
257
+ cursor: pointer;
258
+ display: flex;
259
+ font-size: 0.875rem;
260
+ gap: 0.5rem;
261
+ justify-content: space-between;
262
+ padding: 0.5rem 0.75rem;
263
+
264
+ &:focus {
265
+ border-color: light-dark(#2563eb, #3b82f6);
266
+ outline: 2px solid light-dark(#2563eb, #3b82f6);
267
+ outline-offset: 1px;
268
+ }
269
+
270
+ &:disabled {
271
+ background: light-dark(#f3f4f6, #1a1a1a);
272
+ cursor: not-allowed;
273
+ }
274
+ }
275
+
276
+ .selectIcon {
277
+ color: light-dark(#6b7280, #9ca3af);
278
+ display: flex;
279
+ }
280
+
281
+ .selectContent {
282
+ background: light-dark(#fff, #2a2a2a);
283
+ border: 1px solid light-dark(#d1d5db, #4b5563);
284
+ border-radius: 4px;
285
+ box-shadow:
286
+ 0 10px 38px -10px rgb(0 0 0 / 0.35),
287
+ 0 10px 20px -15px rgb(0 0 0 / 0.2);
288
+ overflow: hidden;
289
+ z-index: 100;
290
+ }
291
+
292
+ .selectViewport {
293
+ padding: 0.25rem;
294
+ }
295
+
296
+ .selectItem {
297
+ align-items: center;
298
+ border-radius: 3px;
299
+ color: light-dark(#1f1f1f, #fff);
300
+ cursor: pointer;
301
+ display: flex;
302
+ font-size: 0.875rem;
303
+ gap: 0.5rem;
304
+ padding: 0.5rem 0.75rem;
305
+ padding-right: 2rem;
306
+ position: relative;
307
+ user-select: none;
308
+
309
+ &:focus {
310
+ background: light-dark(#f3f4f6, #374151);
311
+ outline: none;
312
+ }
313
+
314
+ &[data-highlighted] {
315
+ background: light-dark(#f3f4f6, #374151);
316
+ outline: none;
317
+ }
318
+ }
319
+
320
+ .selectItemIndicator {
321
+ align-items: center;
322
+ display: flex;
323
+ justify-content: center;
324
+ position: absolute;
325
+ right: 0.5rem;
326
+ }
@@ -0,0 +1,279 @@
1
+ :root {
2
+ /* accent */
3
+ --accent-app: light-dark(#fffcfd, #180e11);
4
+ --accent-subtle: light-dark(#fef7f9, #221217);
5
+ --accent-ui: light-dark(#ffe9f0, #3d0f24);
6
+ --accent-hover: light-dark(#fddce7, #55002d);
7
+ --accent-active: light-dark(#f8cfdc, #660138);
8
+ --accent-sep: light-dark(#f1c0d0, #771245);
9
+ --accent-focus: light-dark(#e8adc1, #922257);
10
+ --accent-sep-hover: light-dark(#de95b0, #bd2b72);
11
+ --accent-solid: light-dark(#af1866, #af1866);
12
+ --accent-solid-hover: light-dark(#9e0058, #922257);
13
+ --accent-dim: light-dark(#c22f75, #ff89bc);
14
+ --accent-normal: light-dark(#62193a, #ffcee2);
15
+
16
+ --accent-a1: #ff005503;
17
+ --accent-a2: #e0004008;
18
+ --accent-a3: #ff005216;
19
+ --accent-a4: #f1005123;
20
+ --accent-a5: #da004630;
21
+ --accent-a6: #c700413f;
22
+ --accent-a7: #b8003f52;
23
+ --accent-a8: #b001416a;
24
+ --accent-a9: #a70056e7;
25
+ --accent-a10: #9e0058;
26
+ --accent-a11: #b40056d0;
27
+ --accent-a12: #510025e6;
28
+
29
+ --accent-contrast: #fff;
30
+ --accent-surface: #fef5f8cc;
31
+ --accent-indicator: #af1866;
32
+ --accent-track: #af1866;
33
+
34
+ /* gray */
35
+ --gray-app: light-dark(#fcfcfd, #111113);
36
+ --gray-subtle: light-dark(#f9f9fb, #19191b);
37
+ --gray-ui: light-dark(#eff0f3, #222325);
38
+ --gray-hover: light-dark(#e7e8ec, #292a2e);
39
+ --gray-active: light-dark(#e0e1e6, #303136);
40
+ --gray-sep: light-dark(#d8d9e0, #393a40);
41
+ --gray-focus: light-dark(#cdced7, #46484f);
42
+ --gray-sep-hover: light-dark(#b9bbc6, #5f606a);
43
+ --gray-solid: light-dark(#8b8d98, #6c6e79);
44
+ --gray-solid-hover: light-dark(#80828d, #797b86);
45
+ --gray-dim: light-dark(#62636c, #b2b3bd);
46
+ --gray-normal: light-dark(#1e1f24, #eeeef0);
47
+
48
+ --gray-a1: #00005503;
49
+ --gray-a2: #00005506;
50
+ --gray-a3: #00104010;
51
+ --gray-a4: #000b3618;
52
+ --gray-a5: #0009321f;
53
+ --gray-a6: #00073527;
54
+ --gray-a7: #00063332;
55
+ --gray-a8: #00083046;
56
+ --gray-a9: #00051d74;
57
+ --gray-a10: #00051b7f;
58
+ --gray-a11: #0002119d;
59
+ --gray-a12: #000107e1;
60
+
61
+ --gray-contrast: #ffffff;
62
+ --gray-surface: #ffffffcc;
63
+ --gray-indicator: #8b8d98;
64
+ --gray-track: #8b8d98;
65
+ }
66
+
67
+ .dark,
68
+ .dark-theme {
69
+ --accent-a1: #f1001208;
70
+ --accent-a2: #f61f6213;
71
+ --accent-a3: #fb077630;
72
+ --accent-a4: #ff007349;
73
+ --accent-a5: #fd007e5c;
74
+ --accent-a6: #fd13896e;
75
+ --accent-a7: #fe30918b;
76
+ --accent-a8: #fe3596b9;
77
+ --accent-a9: #fe1b90aa;
78
+ --accent-a10: #fe30918b;
79
+ --accent-a11: #ff89bc;
80
+ --accent-a12: #ffcee2;
81
+
82
+ --accent-contrast: #fff;
83
+ --accent-surface: #33131d80;
84
+ --accent-indicator: #af1866;
85
+ --accent-track: #af1866;
86
+ }
87
+
88
+ .dark,
89
+ .dark-theme {
90
+ --gray-a1: #1111bb03;
91
+ --gray-a2: #cbcbf90b;
92
+ --gray-a3: #d6e2f916;
93
+ --gray-a4: #d1d9f920;
94
+ --gray-a5: #d7ddfd28;
95
+ --gray-a6: #d9defc33;
96
+ --gray-a7: #dae2fd43;
97
+ --gray-a8: #e0e3fd60;
98
+ --gray-a9: #e0e4fd70;
99
+ --gray-a10: #e3e7fd7e;
100
+ --gray-a11: #eff0feb9;
101
+ --gray-a12: #fdfdffef;
102
+
103
+ --gray-contrast: #ffffff;
104
+ --gray-surface: rgba(0, 0, 0, 0.05);
105
+ --gray-indicator: #6c6e79;
106
+ --gray-track: #6c6e79;
107
+ }
108
+
109
+ /* fancy color spaces */
110
+
111
+ @supports (color: color(display-p3 1 1 1)) {
112
+ @media (color-gamut: p3) {
113
+ :root,
114
+ .light,
115
+ .light-theme {
116
+ --accent-app: oklch(99.4% 0.0032 356.4);
117
+ --accent-subtle: oklch(98.2% 0.0078 356.4);
118
+ --accent-ui: oklch(95.4% 0.0244 356.4);
119
+ --accent-hover: oklch(92.5% 0.038 356.4);
120
+ --accent-active: oklch(89.3% 0.0496 356.4);
121
+ --accent-sep: oklch(85.5% 0.0602 356.4);
122
+ --accent-focus: oklch(80.8% 0.0738 356.4);
123
+ --accent-sep-hover: oklch(75.1% 0.0937 356.4);
124
+ --accent-solid: oklch(50% 0.1909 356.4);
125
+ --accent-solid-hover: oklch(45% 0.1909 356.4);
126
+ --accent-dim: oklch(55.4% 0.1909 356.4);
127
+ --accent-normal: oklch(34.4% 0.1096 356.4);
128
+
129
+ --accent-a1: color(display-p3 0.6745 0.0235 0.349 / 0.012);
130
+ --accent-a2: color(display-p3 0.7569 0.0196 0.2667 / 0.032);
131
+ --accent-a3: color(display-p3 0.8118 0.0078 0.2941 / 0.083);
132
+ --accent-a4: color(display-p3 0.7961 0.0078 0.298 / 0.134);
133
+ --accent-a5: color(display-p3 0.698 0.0039 0.2431 / 0.181);
134
+ --accent-a6: color(display-p3 0.6431 0.0039 0.2353 / 0.24);
135
+ --accent-a7: color(display-p3 0.6039 0.0039 0.2157 / 0.314);
136
+ --accent-a8: color(display-p3 0.5765 0.0039 0.2235 / 0.404);
137
+ --accent-a9: color(display-p3 0.5569 0 0.2784 / 0.836);
138
+ --accent-a10: color(display-p3 0.5137 0 0.2588 / 0.891);
139
+ --accent-a11: color(display-p3 0.6118 0 0.2863 / 0.765);
140
+ --accent-a12: color(display-p3 0.2627 0 0.1176 / 0.879);
141
+
142
+ --accent-contrast: #fff;
143
+ --accent-surface: color(display-p3 0.9922 0.9608 0.9725 / 0.8);
144
+ --accent-indicator: oklch(50% 0.1909 356.4);
145
+ --accent-track: oklch(50% 0.1909 356.4);
146
+ }
147
+ }
148
+ }
149
+
150
+ @supports (color: color(display-p3 1 1 1)) {
151
+ @media (color-gamut: p3) {
152
+ :root,
153
+ .light,
154
+ .light-theme {
155
+ --gray-app: oklch(99.1% 0.0015 277.7);
156
+ --gray-subtle: oklch(98.2% 0.003 277.7);
157
+ --gray-ui: oklch(95.6% 0.0045 277.7);
158
+ --gray-hover: oklch(93.1% 0.0061 277.7);
159
+ --gray-active: oklch(91% 0.0077 277.7);
160
+ --gray-sep: oklch(88.8% 0.0093 277.7);
161
+ --gray-focus: oklch(85.3% 0.0117 277.7);
162
+ --gray-sep-hover: oklch(79.4% 0.016 277.7);
163
+ --gray-solid: oklch(64.6% 0.0165 277.7);
164
+ --gray-solid-hover: oklch(61% 0.0161 277.7);
165
+ --gray-dim: oklch(50.3% 0.0139 277.7);
166
+ --gray-normal: oklch(24.1% 0.0099 277.7);
167
+
168
+ --gray-a1: color(display-p3 0.0235 0.0235 0.349 / 0.012);
169
+ --gray-a2: color(display-p3 0.0235 0.0235 0.349 / 0.024);
170
+ --gray-a3: color(display-p3 0.0078 0.0667 0.2549 / 0.063);
171
+ --gray-a4: color(display-p3 0.0118 0.051 0.2157 / 0.095);
172
+ --gray-a5: color(display-p3 0.0039 0.0392 0.2 / 0.122);
173
+ --gray-a6: color(display-p3 0.0039 0.0275 0.1804 / 0.153);
174
+ --gray-a7: color(display-p3 0.0078 0.0275 0.1843 / 0.197);
175
+ --gray-a8: color(display-p3 0.0039 0.0314 0.1765 / 0.275);
176
+ --gray-a9: color(display-p3 0.0039 0.0196 0.1059 / 0.455);
177
+ --gray-a10: color(display-p3 0.0039 0.0196 0.098 / 0.499);
178
+ --gray-a11: color(display-p3 0 0.0078 0.0588 / 0.616);
179
+ --gray-a12: color(display-p3 0 0.0039 0.0275 / 0.883);
180
+
181
+ --gray-contrast: #ffffff;
182
+ --gray-surface: color(display-p3 1 1 1 / 80%);
183
+ --gray-indicator: oklch(64.6% 0.0165 277.7);
184
+ --gray-track: oklch(64.6% 0.0165 277.7);
185
+ }
186
+ }
187
+ }
188
+
189
+ @supports (color: color(display-p3 1 1 1)) {
190
+ @media (color-gamut: p3) {
191
+ .dark,
192
+ .dark-theme {
193
+ --accent-app: oklch(17.8% 0.0184 356.4);
194
+ --accent-subtle: oklch(20.5% 0.0285 356.4);
195
+ --accent-ui: oklch(25.5% 0.0766 356.4);
196
+ --accent-hover: oklch(29.3% 0.1216 356.4);
197
+ --accent-active: oklch(33.2% 0.1346 356.4);
198
+ --accent-sep: oklch(38.2% 0.1401 356.4);
199
+ --accent-focus: oklch(45% 0.1546 356.4);
200
+ --accent-sep-hover: oklch(54.2% 0.1909 356.4);
201
+ --accent-solid: oklch(50% 0.1909 356.4);
202
+ --accent-solid-hover: oklch(45% 0.1546 356.4);
203
+ --accent-dim: oklch(78.7% 0.1909 356.4);
204
+ --accent-normal: oklch(90.9% 0.0697 356.4);
205
+
206
+ --accent-a1: color(display-p3 0.9608 0 0.0667 / 0.022);
207
+ --accent-a2: color(display-p3 0.9882 0.1922 0.4353 / 0.064);
208
+ --accent-a3: color(display-p3 1 0.0941 0.498 / 0.164);
209
+ --accent-a4: color(display-p3 0.9961 0 0.4863 / 0.253);
210
+ --accent-a5: color(display-p3 0.9961 0.0431 0.5294 / 0.32);
211
+ --accent-a6: color(display-p3 1 0.1922 0.5843 / 0.387);
212
+ --accent-a7: color(display-p3 1 0.2824 0.6157 / 0.492);
213
+ --accent-a8: color(display-p3 1 0.3059 0.6353 / 0.66);
214
+ --accent-a9: color(display-p3 0.9961 0.2275 0.6078 / 0.606);
215
+ --accent-a10: color(display-p3 1 0.2824 0.6157 / 0.492);
216
+ --accent-a11: color(display-p3 1 0.5961 0.7765 / 0.933);
217
+ --accent-a12: color(display-p3 0.9961 0.8392 0.9098 / 0.967);
218
+
219
+ --accent-contrast: #fff;
220
+ --accent-surface: color(display-p3 0.1725 0.0706 0.1098 / 0.5);
221
+ --accent-indicator: oklch(50% 0.1909 356.4);
222
+ --accent-track: oklch(50% 0.1909 356.4);
223
+ }
224
+ }
225
+ }
226
+
227
+ @supports (color: color(display-p3 1 1 1)) {
228
+ @media (color-gamut: p3) {
229
+ .dark,
230
+ .dark-theme {
231
+ --gray-app: oklch(17.8% 0.0042 277.7);
232
+ --gray-subtle: oklch(21.5% 0.004 277.7);
233
+ --gray-ui: oklch(25.5% 0.0055 277.7);
234
+ --gray-hover: oklch(28.4% 0.0075 277.7);
235
+ --gray-active: oklch(31.4% 0.0089 277.7);
236
+ --gray-sep: oklch(35% 0.01 277.7);
237
+ --gray-focus: oklch(40.2% 0.0121 277.7);
238
+ --gray-sep-hover: oklch(49.2% 0.0157 277.7);
239
+ --gray-solid: oklch(54% 0.0167 277.7);
240
+ --gray-solid-hover: oklch(58.6% 0.0165 277.7);
241
+ --gray-dim: oklch(77% 0.0138 277.7);
242
+ --gray-normal: oklch(94.9% 0.0026 277.7);
243
+
244
+ --gray-a1: color(display-p3 0.0667 0.0667 0.9412 / 0.009);
245
+ --gray-a2: color(display-p3 0.8 0.8 0.9804 / 0.043);
246
+ --gray-a3: color(display-p3 0.851 0.898 0.9882 / 0.085);
247
+ --gray-a4: color(display-p3 0.8392 0.8706 1 / 0.122);
248
+ --gray-a5: color(display-p3 0.8471 0.8745 1 / 0.156);
249
+ --gray-a6: color(display-p3 0.8784 0.898 1 / 0.194);
250
+ --gray-a7: color(display-p3 0.8745 0.9059 0.9961 / 0.257);
251
+ --gray-a8: color(display-p3 0.8941 0.9059 1 / 0.37);
252
+ --gray-a9: color(display-p3 0.8902 0.9098 1 / 0.433);
253
+ --gray-a10: color(display-p3 0.902 0.9176 1 / 0.488);
254
+ --gray-a11: color(display-p3 0.9451 0.949 1 / 0.719);
255
+ --gray-a12: color(display-p3 0.9922 0.9922 1 / 0.937);
256
+
257
+ --gray-contrast: #ffffff;
258
+ --gray-surface: color(display-p3 0 0 0 / 5%);
259
+ --gray-indicator: oklch(54% 0.0167 277.7);
260
+ --gray-track: oklch(54% 0.0167 277.7);
261
+ }
262
+ }
263
+ }
264
+
265
+ .lv-studio-button {
266
+ background-color: var(--accent-ui);
267
+ border-radius: 3px;
268
+ cursor: pointer;
269
+ font-size: 14px;
270
+ padding: 4px 8px;
271
+
272
+ &:hover {
273
+ background-color: var(--accent-hover);
274
+ }
275
+
276
+ &:active {
277
+ background-color: var(--accent-active);
278
+ }
279
+ }
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigGitHubPages = z.object({
3
+ repository: z.string(),
4
+ root: z.boolean().optional(),
5
+ username: z.string(),
6
+ });
7
+ export class GitHubPagesProvider {
8
+ // constructor(_options: ProviderConfigGitHubPages) {}
9
+ async publishContent() { }
10
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigLiqvidStudio = z.object({
3
+ username: z.string(),
4
+ });
5
+ export class LiqvidStudioProvider {
6
+ async publishContent() { }
7
+ async publishMedia() { }
8
+ }
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigS3 = z.object({
3
+ bucket: z.string(),
4
+ prefix: z.string().optional(),
5
+ });
6
+ export class S3Provider {
7
+ async publishContent() { }
8
+ async publishMedia() { }
9
+ }
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import { rsyncRemoteDirectory } from "../../utils/rsync.mjs";
3
+ export const ProviderConfigSFTP = z.object({
4
+ host: z.string(),
5
+ path: z.string(),
6
+ });
7
+ export class SFTPProvider {
8
+ #host;
9
+ #path;
10
+ constructor(options) {
11
+ this.#host = options.host;
12
+ this.#path = options.path;
13
+ }
14
+ async publishContent(localDir) {
15
+ await rsyncRemoteDirectory({
16
+ host: this.#host,
17
+ localDir,
18
+ remoteDir: this.#path,
19
+ });
20
+ }
21
+ async publishMedia(_localDir) { }
22
+ }
@@ -0,0 +1,10 @@
1
+ import { GitHubPagesProvider } from "./hosting/github-pages.mjs";
2
+ import { LiqvidStudioProvider } from "./hosting/liqvid-studio.mjs";
3
+ import { S3Provider } from "./hosting/s3.mjs";
4
+ import { SFTPProvider } from "./hosting/sftp.mjs";
5
+ export const providersMap = {
6
+ githubPages: GitHubPagesProvider,
7
+ liqvidStudio: LiqvidStudioProvider,
8
+ s3: S3Provider,
9
+ sftp: SFTPProvider,
10
+ };
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigBlueSky = z.object({
3
+ username: z.string(),
4
+ });
5
+ export class BlueSkyProvider {
6
+ constructor(_options) { }
7
+ async publish() { }
8
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigFacebook = z.object({
3
+ username: z.string(),
4
+ });
5
+ export class FacebookProvider {
6
+ constructor(_options) { }
7
+ async publish() { }
8
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigInstagram = z.object({
3
+ username: z.string(),
4
+ });
5
+ export class InstagramProvider {
6
+ constructor(_options) { }
7
+ async publish() { }
8
+ }
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigTwitter = z.object({
3
+ username: z.string(),
4
+ });
5
+ export class TwitterProvider {
6
+ async publish() { }
7
+ }