@tomorrowos/sdk 0.2.4 → 0.3.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.
@@ -1,329 +1,458 @@
1
- * {
2
- box-sizing: border-box;
3
- }
4
-
5
- body {
6
- margin: 0;
7
- font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
8
- background: #f4f3f0;
9
- color: #0a0908;
10
- }
11
-
12
- .app-header {
13
- padding: 1rem 1.5rem;
14
- background: #0a0908;
15
- color: #fafaf9;
16
- }
17
-
18
- .app-header h1 {
19
- margin: 0;
20
- font-size: 1.25rem;
21
- font-weight: 600;
22
- }
23
-
24
- .app-header p {
25
- margin: 0.35rem 0 0;
26
- font-size: 0.875rem;
27
- opacity: 0.8;
28
- }
29
-
30
- .layout {
31
- display: flex;
32
- gap: 0;
33
- min-height: calc(100vh - 4.5rem);
34
- }
35
-
36
- .panel-main {
37
- flex: 1;
38
- padding: 1.25rem 1.5rem 2rem;
39
- overflow: auto;
40
- }
41
-
42
- .panel-playlist {
43
- width: 320px;
44
- flex-shrink: 0;
45
- background: #fff;
46
- border-left: 1px solid #e4e1dc;
47
- display: flex;
48
- flex-direction: column;
49
- }
50
-
51
- .card {
52
- background: #fff;
53
- border: 1px solid #e4e1dc;
54
- border-radius: 10px;
55
- padding: 1rem 1.1rem;
56
- margin-bottom: 1rem;
57
- }
58
-
59
- .card h2 {
60
- margin: 0 0 0.75rem;
61
- font-size: 0.95rem;
62
- font-weight: 600;
63
- }
64
-
65
- .hint {
66
- margin: 0 0 0.75rem;
67
- font-size: 0.8rem;
68
- color: #666;
69
- }
70
-
71
- .devices-grid {
72
- display: grid;
73
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
74
- gap: 0.85rem;
75
- }
76
-
77
- .devices-empty {
78
- margin: 0;
79
- color: #666;
80
- font-size: 0.875rem;
81
- grid-column: 1 / -1;
82
- }
83
-
84
- .device-card {
85
- border: 1px solid #e4e1dc;
86
- border-radius: 8px;
87
- padding: 0.85rem 0.95rem;
88
- background: #fafaf9;
89
- }
90
-
91
- .device-card-header {
92
- display: flex;
93
- align-items: center;
94
- gap: 0.5rem;
95
- margin-bottom: 0.65rem;
96
- }
97
-
98
- .device-card-title {
99
- margin: 0;
100
- font-size: 0.95rem;
101
- font-weight: 600;
102
- line-height: 1.2;
103
- }
104
-
105
- .status-led {
106
- width: 11px;
107
- height: 11px;
108
- border-radius: 50%;
109
- flex-shrink: 0;
110
- box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.06);
111
- }
112
-
113
- .status-led--online {
114
- background: #12b76a;
115
- box-shadow: 0 0 8px rgba(18, 183, 106, 0.55);
116
- }
117
-
118
- .status-led--offline {
119
- background: #f04438;
120
- box-shadow: 0 0 8px rgba(240, 68, 56, 0.45);
121
- }
122
-
123
- .device-meta {
124
- display: grid;
125
- gap: 0.35rem;
126
- font-size: 0.78rem;
127
- color: #444;
128
- margin-bottom: 0.75rem;
129
- }
130
-
131
- .device-meta dt {
132
- font-weight: 600;
133
- color: #666;
134
- display: inline;
135
- }
136
-
137
- .device-meta dt::after {
138
- content: ": ";
139
- }
140
-
141
- .device-meta dd {
142
- display: inline;
143
- margin: 0;
144
- word-break: break-all;
145
- }
146
-
147
- .device-meta-row {
148
- display: block;
149
- }
150
-
151
- .device-card-actions {
152
- display: flex;
153
- flex-wrap: wrap;
154
- gap: 0.4rem;
155
- }
156
-
157
- .device-card-actions button {
158
- font-size: 0.78rem;
159
- padding: 0.35rem 0.6rem;
160
- }
161
-
162
- .row {
163
- display: flex;
164
- flex-wrap: wrap;
165
- gap: 0.5rem;
166
- align-items: center;
167
- }
168
-
169
- input[type="text"],
170
- input[type="date"],
171
- input[type="time"],
172
- select {
173
- font: inherit;
174
- padding: 0.45rem 0.6rem;
175
- border: 1px solid #d6d2cb;
176
- border-radius: 6px;
177
- background: #fff;
178
- }
179
-
180
- button {
181
- font: inherit;
182
- padding: 0.45rem 0.85rem;
183
- border-radius: 6px;
184
- border: 1px solid #d6d2cb;
185
- background: #fff;
186
- cursor: pointer;
187
- }
188
-
189
- button:hover {
190
- background: #f5f3ef;
191
- }
192
-
193
- button.primary {
194
- background: #ff8a3d;
195
- border-color: #e67320;
196
- color: #0a0908;
197
- font-weight: 600;
198
- }
199
-
200
- button.primary:hover {
201
- background: #ff9a57;
202
- }
203
-
204
- button.danger {
205
- color: #b42318;
206
- border-color: #fecdca;
207
- }
208
-
209
- .schedule-grid {
210
- display: grid;
211
- grid-template-columns: 1fr 1fr;
212
- gap: 0.65rem 1rem;
213
- }
214
-
215
- .schedule-grid label {
216
- display: flex;
217
- flex-direction: column;
218
- gap: 0.25rem;
219
- font-size: 0.8rem;
220
- color: #444;
221
- }
222
-
223
- .days-row {
224
- grid-column: 1 / -1;
225
- display: flex;
226
- flex-wrap: wrap;
227
- gap: 0.5rem 0.75rem;
228
- font-size: 0.8rem;
229
- }
230
-
231
- .days-row label {
232
- flex-direction: row;
233
- align-items: center;
234
- gap: 0.35rem;
235
- color: #0a0908;
236
- }
237
-
238
- .playlist-header {
239
- display: flex;
240
- align-items: center;
241
- justify-content: space-between;
242
- padding: 1rem 1rem 0.75rem;
243
- border-bottom: 1px solid #e4e1dc;
244
- }
245
-
246
- .playlist-header h2 {
247
- margin: 0;
248
- font-size: 0.95rem;
249
- }
250
-
251
- .playlist-list {
252
- list-style: none;
253
- margin: 0;
254
- padding: 0.5rem;
255
- flex: 1;
256
- overflow-y: auto;
257
- }
258
-
259
- .playlist-empty {
260
- padding: 1.5rem 1rem;
261
- text-align: center;
262
- color: #888;
263
- font-size: 0.875rem;
264
- }
265
-
266
- .playlist-item {
267
- border: 1px solid #e4e1dc;
268
- border-radius: 8px;
269
- padding: 0.65rem;
270
- margin-bottom: 0.5rem;
271
- background: #fafaf9;
272
- }
273
-
274
- .playlist-item-thumb {
275
- width: 100%;
276
- aspect-ratio: 16 / 9;
277
- object-fit: cover;
278
- border-radius: 4px;
279
- background: #e4e1dc;
280
- display: block;
281
- margin-bottom: 0.5rem;
282
- }
283
-
284
- .playlist-item-name {
285
- font-size: 0.8rem;
286
- font-weight: 600;
287
- word-break: break-all;
288
- margin-bottom: 0.35rem;
289
- }
290
-
291
- .playlist-item-meta {
292
- font-size: 0.75rem;
293
- color: #666;
294
- margin-bottom: 0.45rem;
295
- }
296
-
297
- .playlist-item-actions {
298
- display: flex;
299
- gap: 0.35rem;
300
- align-items: center;
301
- }
302
-
303
- .playlist-item-actions input[type="number"] {
304
- width: 5rem;
305
- font: inherit;
306
- padding: 0.25rem 0.4rem;
307
- border: 1px solid #d6d2cb;
308
- border-radius: 4px;
309
- }
310
-
311
- .publish-bar {
312
- padding: 1rem 0 0;
313
- }
314
-
315
- #result {
316
- margin: 0;
317
- padding: 0.75rem;
318
- background: #0a0908;
319
- color: #e8e6e3;
320
- border-radius: 8px;
321
- font-size: 0.75rem;
322
- max-height: 10rem;
323
- overflow: auto;
324
- white-space: pre-wrap;
325
- }
326
-
327
- .hidden {
328
- display: none !important;
329
- }
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ body {
6
+ margin: 0;
7
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
8
+ background: #f4f3f0;
9
+ color: #0a0908;
10
+ }
11
+
12
+ .app-header {
13
+ padding: 1rem 1.5rem;
14
+ background: #0a0908;
15
+ color: #fafaf9;
16
+ }
17
+
18
+ .app-header h1 {
19
+ margin: 0;
20
+ font-size: 1.25rem;
21
+ font-weight: 600;
22
+ }
23
+
24
+ .app-header p {
25
+ margin: 0.35rem 0 0;
26
+ font-size: 0.875rem;
27
+ opacity: 0.8;
28
+ }
29
+
30
+ .layout {
31
+ display: flex;
32
+ gap: 0;
33
+ min-height: calc(100vh - 4.5rem);
34
+ }
35
+
36
+ .panel-main {
37
+ flex: 1;
38
+ padding: 1.25rem 1.5rem 2rem;
39
+ overflow: auto;
40
+ }
41
+
42
+ .panel-playlist-nav {
43
+ width: 220px;
44
+ flex-shrink: 0;
45
+ background: #fff;
46
+ border-right: 1px solid #e4e1dc;
47
+ display: flex;
48
+ flex-direction: column;
49
+ padding: 0.75rem;
50
+ }
51
+
52
+ .playlist-nav-header {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ margin-bottom: 0.5rem;
57
+ }
58
+
59
+ .playlist-nav-header h2 {
60
+ margin: 0;
61
+ font-size: 0.95rem;
62
+ }
63
+
64
+ .playlist-catalog {
65
+ list-style: none;
66
+ margin: 0;
67
+ padding: 0;
68
+ overflow: auto;
69
+ flex: 1;
70
+ }
71
+
72
+ .playlist-catalog-item {
73
+ border: 1px solid #e4e1dc;
74
+ border-radius: 6px;
75
+ padding: 0.5rem 0.6rem;
76
+ margin-bottom: 0.4rem;
77
+ cursor: pointer;
78
+ font-size: 0.85rem;
79
+ }
80
+
81
+ .playlist-catalog-item--active {
82
+ border-color: #ff8a3d;
83
+ background: #fff5ee;
84
+ }
85
+
86
+ .playlist-catalog-item small {
87
+ display: block;
88
+ color: #666;
89
+ margin-top: 0.2rem;
90
+ }
91
+
92
+ .panel-playlist {
93
+ width: 300px;
94
+ flex-shrink: 0;
95
+ background: #fff;
96
+ border-left: 1px solid #e4e1dc;
97
+ display: flex;
98
+ flex-direction: column;
99
+ }
100
+
101
+ .card {
102
+ background: #fff;
103
+ border: 1px solid #e4e1dc;
104
+ border-radius: 10px;
105
+ padding: 1rem 1.1rem;
106
+ margin-bottom: 1rem;
107
+ }
108
+
109
+ .card h2 {
110
+ margin: 0 0 0.75rem;
111
+ font-size: 0.95rem;
112
+ font-weight: 600;
113
+ }
114
+
115
+ .hint {
116
+ margin: 0 0 0.75rem;
117
+ font-size: 0.8rem;
118
+ color: #666;
119
+ }
120
+
121
+ .devices-grid {
122
+ display: grid;
123
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
124
+ gap: 0.85rem;
125
+ }
126
+
127
+ .devices-empty {
128
+ margin: 0;
129
+ color: #666;
130
+ font-size: 0.875rem;
131
+ grid-column: 1 / -1;
132
+ }
133
+
134
+ .device-card {
135
+ border: 1px solid #e4e1dc;
136
+ border-radius: 8px;
137
+ padding: 0.85rem 0.95rem;
138
+ background: #fafaf9;
139
+ }
140
+
141
+ .device-card-header {
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 0.5rem;
145
+ margin-bottom: 0.65rem;
146
+ }
147
+
148
+ .device-card-title {
149
+ margin: 0;
150
+ font-size: 0.95rem;
151
+ font-weight: 600;
152
+ line-height: 1.2;
153
+ }
154
+
155
+ .status-led {
156
+ width: 11px;
157
+ height: 11px;
158
+ border-radius: 50%;
159
+ flex-shrink: 0;
160
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.06);
161
+ }
162
+
163
+ .status-led--online {
164
+ background: #12b76a;
165
+ box-shadow: 0 0 8px rgba(18, 183, 106, 0.55);
166
+ }
167
+
168
+ .status-led--offline {
169
+ background: #f04438;
170
+ box-shadow: 0 0 8px rgba(240, 68, 56, 0.45);
171
+ }
172
+
173
+ .device-meta {
174
+ display: grid;
175
+ gap: 0.35rem;
176
+ font-size: 0.78rem;
177
+ color: #444;
178
+ margin-bottom: 0.75rem;
179
+ }
180
+
181
+ .device-meta dt {
182
+ font-weight: 600;
183
+ color: #666;
184
+ display: inline;
185
+ }
186
+
187
+ .device-meta dt::after {
188
+ content: ": ";
189
+ }
190
+
191
+ .device-meta dd {
192
+ display: inline;
193
+ margin: 0;
194
+ word-break: break-all;
195
+ }
196
+
197
+ .device-meta-row {
198
+ display: block;
199
+ }
200
+
201
+ .device-card-actions {
202
+ display: flex;
203
+ flex-wrap: wrap;
204
+ gap: 0.4rem;
205
+ }
206
+
207
+ .device-card-actions button {
208
+ font-size: 0.78rem;
209
+ padding: 0.35rem 0.6rem;
210
+ }
211
+
212
+ .row {
213
+ display: flex;
214
+ flex-wrap: wrap;
215
+ gap: 0.5rem;
216
+ align-items: center;
217
+ }
218
+
219
+ input[type="text"],
220
+ input[type="date"],
221
+ input[type="time"],
222
+ select {
223
+ font: inherit;
224
+ padding: 0.45rem 0.6rem;
225
+ border: 1px solid #d6d2cb;
226
+ border-radius: 6px;
227
+ background: #fff;
228
+ }
229
+
230
+ button {
231
+ font: inherit;
232
+ padding: 0.45rem 0.85rem;
233
+ border-radius: 6px;
234
+ border: 1px solid #d6d2cb;
235
+ background: #fff;
236
+ cursor: pointer;
237
+ }
238
+
239
+ button:hover {
240
+ background: #f5f3ef;
241
+ }
242
+
243
+ button.primary {
244
+ background: #ff8a3d;
245
+ border-color: #e67320;
246
+ color: #0a0908;
247
+ font-weight: 600;
248
+ }
249
+
250
+ button.primary:hover {
251
+ background: #ff9a57;
252
+ }
253
+
254
+ button.danger {
255
+ color: #b42318;
256
+ border-color: #fecdca;
257
+ }
258
+
259
+ .schedule-grid {
260
+ display: grid;
261
+ grid-template-columns: 1fr 1fr;
262
+ gap: 0.65rem 1rem;
263
+ }
264
+
265
+ .schedule-grid label {
266
+ display: flex;
267
+ flex-direction: column;
268
+ gap: 0.25rem;
269
+ font-size: 0.8rem;
270
+ color: #444;
271
+ }
272
+
273
+ .days-row {
274
+ grid-column: 1 / -1;
275
+ display: flex;
276
+ flex-wrap: wrap;
277
+ gap: 0.5rem 0.75rem;
278
+ font-size: 0.8rem;
279
+ }
280
+
281
+ .days-row label {
282
+ flex-direction: row;
283
+ align-items: center;
284
+ gap: 0.35rem;
285
+ color: #0a0908;
286
+ }
287
+
288
+ .playlist-header {
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: space-between;
292
+ padding: 1rem 1rem 0.75rem;
293
+ border-bottom: 1px solid #e4e1dc;
294
+ }
295
+
296
+ .playlist-header h2 {
297
+ margin: 0;
298
+ font-size: 0.95rem;
299
+ }
300
+
301
+ .playlist-list {
302
+ list-style: none;
303
+ margin: 0;
304
+ padding: 0.5rem;
305
+ flex: 1;
306
+ overflow-y: auto;
307
+ }
308
+
309
+ .playlist-empty {
310
+ padding: 1.5rem 1rem;
311
+ text-align: center;
312
+ color: #888;
313
+ font-size: 0.875rem;
314
+ }
315
+
316
+ .playlist-item {
317
+ border: 1px solid #e4e1dc;
318
+ border-radius: 8px;
319
+ padding: 0.65rem;
320
+ margin-bottom: 0.5rem;
321
+ background: #fafaf9;
322
+ }
323
+
324
+ .playlist-item-thumb {
325
+ width: 100%;
326
+ aspect-ratio: 16 / 9;
327
+ object-fit: cover;
328
+ border-radius: 4px;
329
+ background: #e4e1dc;
330
+ display: block;
331
+ margin-bottom: 0.5rem;
332
+ }
333
+
334
+ .playlist-item-name {
335
+ font-size: 0.8rem;
336
+ font-weight: 600;
337
+ word-break: break-all;
338
+ margin-bottom: 0.35rem;
339
+ }
340
+
341
+ .playlist-item-meta {
342
+ font-size: 0.75rem;
343
+ color: #666;
344
+ margin-bottom: 0.45rem;
345
+ }
346
+
347
+ .playlist-item-actions {
348
+ display: flex;
349
+ gap: 0.35rem;
350
+ align-items: center;
351
+ }
352
+
353
+ .playlist-item-actions input[type="number"] {
354
+ width: 5rem;
355
+ font: inherit;
356
+ padding: 0.25rem 0.4rem;
357
+ border: 1px solid #d6d2cb;
358
+ border-radius: 4px;
359
+ }
360
+
361
+ .publish-bar {
362
+ padding: 1rem 0 0;
363
+ }
364
+
365
+ #result {
366
+ margin: 0;
367
+ padding: 0.75rem;
368
+ background: #0a0908;
369
+ color: #e8e6e3;
370
+ border-radius: 8px;
371
+ font-size: 0.75rem;
372
+ max-height: 10rem;
373
+ overflow: auto;
374
+ white-space: pre-wrap;
375
+ }
376
+
377
+ .hidden {
378
+ display: none !important;
379
+ }
380
+
381
+ .field-label {
382
+ display: block;
383
+ margin-bottom: 0.75rem;
384
+ font-size: 0.85rem;
385
+ font-weight: 600;
386
+ }
387
+
388
+ .field-label input {
389
+ display: block;
390
+ width: 100%;
391
+ margin-top: 0.35rem;
392
+ font-weight: 400;
393
+ }
394
+
395
+ .subheading {
396
+ margin: 0.5rem 0 0.35rem;
397
+ font-size: 0.9rem;
398
+ }
399
+
400
+ .editor-actions {
401
+ display: flex;
402
+ flex-wrap: wrap;
403
+ gap: 0.5rem;
404
+ margin-top: 0.75rem;
405
+ }
406
+
407
+ .device-published-list {
408
+ margin: 0 0 0.65rem;
409
+ padding: 0;
410
+ list-style: none;
411
+ font-size: 0.78rem;
412
+ }
413
+
414
+ .device-published-list li {
415
+ display: flex;
416
+ align-items: center;
417
+ justify-content: space-between;
418
+ gap: 0.35rem;
419
+ margin-bottom: 0.25rem;
420
+ }
421
+
422
+ .modal {
423
+ position: fixed;
424
+ inset: 0;
425
+ z-index: 1000;
426
+ display: flex;
427
+ align-items: center;
428
+ justify-content: center;
429
+ }
430
+
431
+ .modal-backdrop {
432
+ position: absolute;
433
+ inset: 0;
434
+ background: rgba(0, 0, 0, 0.45);
435
+ }
436
+
437
+ .modal-card {
438
+ position: relative;
439
+ background: #fff;
440
+ border-radius: 10px;
441
+ padding: 1.25rem;
442
+ width: min(92vw, 420px);
443
+ max-height: 80vh;
444
+ overflow: auto;
445
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
446
+ }
447
+
448
+ .publish-checklist label {
449
+ display: block;
450
+ margin-bottom: 0.45rem;
451
+ font-size: 0.9rem;
452
+ }
453
+
454
+ .modal-actions {
455
+ display: flex;
456
+ gap: 0.5rem;
457
+ margin-top: 1rem;
458
+ }