openuispec 0.1.18 → 0.1.20

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 (98) hide show
  1. package/README.md +52 -34
  2. package/cli/index.ts +1 -1
  3. package/cli/init.ts +48 -211
  4. package/docs/stress-test-maturity-report.md +97 -0
  5. package/examples/todo-orbit/AGENTS.md +127 -0
  6. package/examples/todo-orbit/CLAUDE.md +75 -0
  7. package/examples/todo-orbit/README.md +62 -0
  8. package/examples/todo-orbit/generated/android/Todo Orbit/README.md +14 -0
  9. package/examples/todo-orbit/generated/android/Todo Orbit/app/build.gradle.kts +58 -0
  10. package/examples/todo-orbit/generated/android/Todo Orbit/app/proguard-rules.pro +1 -0
  11. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/AndroidManifest.xml +20 -0
  12. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/MainActivity.kt +14 -0
  13. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/TodoOrbitApp.kt +345 -0
  14. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/AppLogic.kt +231 -0
  15. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Models.kt +169 -0
  16. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Strings.kt +8 -0
  17. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/components/CommonComponents.kt +185 -0
  18. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/AnalyticsScreen.kt +193 -0
  19. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/SettingsScreen.kt +102 -0
  20. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/TasksScreen.kt +342 -0
  21. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/sheets/EditorSheets.kt +344 -0
  22. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/theme/TodoOrbitTheme.kt +59 -0
  23. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values/strings.xml +148 -0
  24. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values-ru/strings.xml +154 -0
  25. package/examples/todo-orbit/generated/android/Todo Orbit/build.gradle.kts +4 -0
  26. package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.jar +0 -0
  27. package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.properties +7 -0
  28. package/examples/todo-orbit/generated/android/Todo Orbit/gradle.properties +4 -0
  29. package/examples/todo-orbit/generated/android/Todo Orbit/gradlew +248 -0
  30. package/examples/todo-orbit/generated/android/Todo Orbit/gradlew.bat +93 -0
  31. package/examples/todo-orbit/generated/android/Todo Orbit/settings.gradle.kts +18 -0
  32. package/examples/todo-orbit/generated/ios/Todo Orbit/README.md +29 -0
  33. package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/en.lproj/Localizable.strings +118 -0
  34. package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/ru.lproj/Localizable.strings +118 -0
  35. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/App/TodoOrbitApp.swift +50 -0
  36. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/OrbitChrome.swift +204 -0
  37. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/SchedulePreviewView.swift +126 -0
  38. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/TrendChartView.swift +70 -0
  39. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/RecurringRuleSheet.swift +123 -0
  40. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/TaskEditorSheet.swift +60 -0
  41. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Models/DomainModels.swift +238 -0
  42. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/AnalyticsView.swift +94 -0
  43. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/SettingsView.swift +74 -0
  44. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/TasksHomeView.swift +363 -0
  45. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Support/AppModel.swift +324 -0
  46. package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.pbxproj +408 -0
  47. package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  48. package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/xcshareddata/xcschemes/TodoOrbit.xcscheme +79 -0
  49. package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +24 -0
  50. package/examples/todo-orbit/generated/web/Todo Orbit/index.html +16 -0
  51. package/examples/todo-orbit/generated/web/Todo Orbit/package-lock.json +1087 -0
  52. package/examples/todo-orbit/generated/web/Todo Orbit/package.json +24 -0
  53. package/examples/todo-orbit/generated/web/Todo Orbit/src/App.tsx +2114 -0
  54. package/examples/todo-orbit/generated/web/Todo Orbit/src/main.tsx +13 -0
  55. package/examples/todo-orbit/generated/web/Todo Orbit/src/styles.css +886 -0
  56. package/examples/todo-orbit/generated/web/Todo Orbit/tsconfig.json +19 -0
  57. package/examples/todo-orbit/generated/web/Todo Orbit/vite.config.ts +6 -0
  58. package/examples/todo-orbit/openuispec/README.md +158 -0
  59. package/examples/todo-orbit/openuispec/contracts/.gitkeep +0 -0
  60. package/examples/todo-orbit/openuispec/contracts/action_trigger.yaml +28 -0
  61. package/examples/todo-orbit/openuispec/contracts/collection.yaml +32 -0
  62. package/examples/todo-orbit/openuispec/contracts/data_display.yaml +38 -0
  63. package/examples/todo-orbit/openuispec/contracts/feedback.yaml +32 -0
  64. package/examples/todo-orbit/openuispec/contracts/input_field.yaml +52 -0
  65. package/examples/todo-orbit/openuispec/contracts/nav_container.yaml +47 -0
  66. package/examples/todo-orbit/openuispec/contracts/surface.yaml +28 -0
  67. package/examples/todo-orbit/openuispec/contracts/x_schedule_preview.yaml +134 -0
  68. package/examples/todo-orbit/openuispec/contracts/x_task_trend_chart.yaml +139 -0
  69. package/examples/todo-orbit/openuispec/flows/.gitkeep +0 -0
  70. package/examples/todo-orbit/openuispec/flows/create_recurring_rule.yaml +253 -0
  71. package/examples/todo-orbit/openuispec/flows/create_task.yaml +118 -0
  72. package/examples/todo-orbit/openuispec/flows/edit_task.yaml +126 -0
  73. package/examples/todo-orbit/openuispec/locales/.gitkeep +0 -0
  74. package/examples/todo-orbit/openuispec/locales/en.json +150 -0
  75. package/examples/todo-orbit/openuispec/locales/ru.json +150 -0
  76. package/examples/todo-orbit/openuispec/openuispec.yaml +122 -0
  77. package/examples/todo-orbit/openuispec/platform/.gitkeep +0 -0
  78. package/examples/todo-orbit/openuispec/platform/android.yaml +19 -0
  79. package/examples/todo-orbit/openuispec/platform/ios.yaml +20 -0
  80. package/examples/todo-orbit/openuispec/platform/web.yaml +22 -0
  81. package/examples/todo-orbit/openuispec/screens/.gitkeep +0 -0
  82. package/examples/todo-orbit/openuispec/screens/analytics.yaml +140 -0
  83. package/examples/todo-orbit/openuispec/screens/home.yaml +173 -0
  84. package/examples/todo-orbit/openuispec/screens/settings.yaml +149 -0
  85. package/examples/todo-orbit/openuispec/screens/task_detail.yaml +223 -0
  86. package/examples/todo-orbit/openuispec/tokens/.gitkeep +0 -0
  87. package/examples/todo-orbit/openuispec/tokens/color.yaml +93 -0
  88. package/examples/todo-orbit/openuispec/tokens/elevation.yaml +25 -0
  89. package/examples/todo-orbit/openuispec/tokens/icons.yaml +92 -0
  90. package/examples/todo-orbit/openuispec/tokens/layout.yaml +107 -0
  91. package/examples/todo-orbit/openuispec/tokens/motion.yaml +39 -0
  92. package/examples/todo-orbit/openuispec/tokens/spacing.yaml +18 -0
  93. package/examples/todo-orbit/openuispec/tokens/themes.yaml +23 -0
  94. package/examples/todo-orbit/openuispec/tokens/typography.yaml +52 -0
  95. package/package.json +1 -1
  96. package/schema/screen.schema.json +9 -0
  97. package/schema/validate.ts +0 -2
  98. package/spec/openuispec-v0.1.md +129 -27
@@ -0,0 +1,886 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap");
2
+
3
+ :root {
4
+ color-scheme: light;
5
+ --bg: #fcfcf9;
6
+ --bg-secondary: #f3f4ee;
7
+ --bg-tertiary: #e7ebe4;
8
+ --text: #172026;
9
+ --text-secondary: #52606d;
10
+ --text-muted: #7b8794;
11
+ --border: rgba(203, 210, 217, 0.5);
12
+ --primary: #0f766e;
13
+ --primary-strong: #0b5e59;
14
+ --secondary: #f59e0b;
15
+ --success: #15803d;
16
+ --warning: #d97706;
17
+ --danger: #dc2626;
18
+ --info: #2563eb;
19
+ --priority-low: #94a3b8;
20
+ --priority-medium: #2563eb;
21
+ --priority-high: #d97706;
22
+ --shadow-lg: 0 24px 70px rgba(23, 32, 38, 0.12);
23
+ --shadow-sm: 0 10px 30px rgba(23, 32, 38, 0.08);
24
+ --cut: 14px;
25
+ --radius: 20px;
26
+ --page-padding: 24px;
27
+ }
28
+
29
+ :root[data-theme="dark"] {
30
+ color-scheme: dark;
31
+ --bg: #0f1418;
32
+ --bg-secondary: #172026;
33
+ --bg-tertiary: #202a31;
34
+ --text: #f7faf8;
35
+ --text-secondary: #ced6dd;
36
+ --text-muted: #97a6b2;
37
+ --border: rgba(176, 184, 193, 0.24);
38
+ --primary: #29a89d;
39
+ --primary-strong: #39c1b5;
40
+ --secondary: #ffc24b;
41
+ --success: #31b362;
42
+ --warning: #ff9d2e;
43
+ --danger: #ff6b6b;
44
+ --info: #5d91ff;
45
+ --priority-low: #8ea3b8;
46
+ --priority-medium: #5d91ff;
47
+ --priority-high: #ff9d2e;
48
+ --shadow-lg: 0 28px 70px rgba(0, 0, 0, 0.32);
49
+ --shadow-sm: 0 12px 32px rgba(0, 0, 0, 0.22);
50
+ }
51
+
52
+ * {
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ html,
57
+ body,
58
+ #root {
59
+ min-height: 100%;
60
+ }
61
+
62
+ body {
63
+ margin: 0;
64
+ font-family: "Manrope", sans-serif;
65
+ background:
66
+ radial-gradient(circle at top left, rgba(245, 158, 11, 0.18), transparent 26%),
67
+ radial-gradient(circle at bottom right, rgba(15, 118, 110, 0.16), transparent 30%),
68
+ linear-gradient(180deg, var(--bg) 0%, var(--bg-tertiary) 100%);
69
+ color: var(--text);
70
+ }
71
+
72
+ button,
73
+ input,
74
+ select,
75
+ textarea {
76
+ font: inherit;
77
+ }
78
+
79
+ button {
80
+ cursor: pointer;
81
+ }
82
+
83
+ .app-frame {
84
+ min-height: 100vh;
85
+ }
86
+
87
+ .shell-layout {
88
+ display: grid;
89
+ grid-template-columns: 280px minmax(0, 1fr);
90
+ min-height: 100vh;
91
+ }
92
+
93
+ .nav-shell {
94
+ position: sticky;
95
+ top: 0;
96
+ min-height: 100vh;
97
+ padding: 28px;
98
+ border-right: 1px solid var(--border);
99
+ background: rgba(255, 255, 255, 0.42);
100
+ backdrop-filter: blur(24px);
101
+ }
102
+
103
+ .brand-lockup {
104
+ display: flex;
105
+ gap: 16px;
106
+ align-items: center;
107
+ margin-bottom: 32px;
108
+ }
109
+
110
+ .brand-lockup h1 {
111
+ margin: 0;
112
+ font-size: 30px;
113
+ letter-spacing: -0.03em;
114
+ }
115
+
116
+ .brand-mark {
117
+ width: 60px;
118
+ height: 60px;
119
+ display: grid;
120
+ place-items: center;
121
+ font-weight: 800;
122
+ color: white;
123
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
124
+ clip-path: polygon(var(--cut) 0, 100% 0, 100% calc(100% - var(--cut)), calc(100% - var(--cut)) 100%, 0 100%, 0 var(--cut));
125
+ }
126
+
127
+ .eyebrow {
128
+ margin: 0 0 6px;
129
+ color: var(--text-muted);
130
+ font-size: 12px;
131
+ font-weight: 700;
132
+ letter-spacing: 0.12em;
133
+ text-transform: uppercase;
134
+ }
135
+
136
+ .primary-nav {
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: 10px;
140
+ }
141
+
142
+ .nav-item {
143
+ --cut-border-width: 0px;
144
+ --cut-border-color: transparent;
145
+ --cut-fill: transparent;
146
+ --cut-inner: calc(var(--cut) - var(--cut-border-width));
147
+ position: relative;
148
+ isolation: isolate;
149
+ padding: 14px 16px;
150
+ background: var(--cut-border-color);
151
+ color: var(--text-secondary);
152
+ text-decoration: none;
153
+ transition: 180ms ease;
154
+ clip-path: polygon(var(--cut) 0, 100% 0, 100% calc(100% - var(--cut)), calc(100% - var(--cut)) 100%, 0 100%, 0 var(--cut));
155
+ }
156
+
157
+ .nav-item::before {
158
+ content: "";
159
+ position: absolute;
160
+ inset: var(--cut-border-width);
161
+ z-index: -1;
162
+ background: var(--cut-fill);
163
+ clip-path: polygon(var(--cut-inner) 0, 100% 0, 100% calc(100% - var(--cut-inner)), calc(100% - var(--cut-inner)) 100%, 0 100%, 0 var(--cut-inner));
164
+ }
165
+
166
+ .nav-item:hover,
167
+ .nav-item.active {
168
+ --cut-border-width: 1px;
169
+ --cut-border-color: var(--border);
170
+ --cut-fill: rgba(15, 118, 110, 0.08);
171
+ color: var(--text);
172
+ }
173
+
174
+ .nav-note {
175
+ margin-top: 28px;
176
+ }
177
+
178
+ .nav-note strong,
179
+ .nav-note span {
180
+ display: block;
181
+ }
182
+
183
+ .nav-note span {
184
+ margin-top: 8px;
185
+ color: var(--text-secondary);
186
+ line-height: 1.5;
187
+ }
188
+
189
+ .screen-shell {
190
+ padding: var(--page-padding);
191
+ }
192
+
193
+ .screen {
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 24px;
197
+ }
198
+
199
+ .screen-header {
200
+ display: flex;
201
+ justify-content: space-between;
202
+ gap: 16px;
203
+ align-items: flex-start;
204
+ }
205
+
206
+ .screen-header h2,
207
+ .section-head h3,
208
+ .modal-header h3 {
209
+ margin: 0;
210
+ font-size: 24px;
211
+ line-height: 1.2;
212
+ letter-spacing: -0.02em;
213
+ }
214
+
215
+ .screen-subtitle {
216
+ margin: 8px 0 0;
217
+ max-width: 72ch;
218
+ color: var(--text-secondary);
219
+ line-height: 1.5;
220
+ }
221
+
222
+ .home-layout.desktop {
223
+ display: grid;
224
+ grid-template-columns: minmax(0, 0.85fr) minmax(360px, 0.65fr);
225
+ gap: 24px;
226
+ align-items: start;
227
+ }
228
+
229
+ .home-primary,
230
+ .home-secondary {
231
+ display: flex;
232
+ flex-direction: column;
233
+ gap: 20px;
234
+ }
235
+
236
+ .field-block {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 8px;
240
+ }
241
+
242
+ .field-label {
243
+ font-size: 14px;
244
+ font-weight: 700;
245
+ color: var(--text-secondary);
246
+ }
247
+
248
+ .field-helper,
249
+ .field-error {
250
+ font-size: 12px;
251
+ line-height: 1.4;
252
+ }
253
+
254
+ .field-helper {
255
+ color: var(--text-muted);
256
+ }
257
+
258
+ .field-error {
259
+ color: var(--danger);
260
+ }
261
+
262
+ .cut-surface,
263
+ .cut-panel,
264
+ .cut-input,
265
+ .cut-button,
266
+ .toast {
267
+ --cut-border-width: 0px;
268
+ --cut-border-color: transparent;
269
+ --cut-fill: transparent;
270
+ --cut-inner: calc(var(--cut) - var(--cut-border-width));
271
+ position: relative;
272
+ isolation: isolate;
273
+ background: var(--cut-border-color);
274
+ clip-path: polygon(var(--cut) 0, 100% 0, 100% calc(100% - var(--cut)), calc(100% - var(--cut)) 100%, 0 100%, 0 var(--cut));
275
+ }
276
+
277
+ .cut-surface::before,
278
+ .cut-panel::before,
279
+ .cut-input::before,
280
+ .cut-button::before,
281
+ .toast::before {
282
+ content: "";
283
+ position: absolute;
284
+ inset: var(--cut-border-width);
285
+ z-index: -1;
286
+ pointer-events: none;
287
+ background: var(--cut-fill);
288
+ clip-path: polygon(var(--cut-inner) 0, 100% 0, 100% calc(100% - var(--cut-inner)), calc(100% - var(--cut-inner)) 100%, 0 100%, 0 var(--cut-inner));
289
+ }
290
+
291
+ .cut-surface,
292
+ .cut-panel {
293
+ --cut-border-width: 1px;
294
+ --cut-border-color: var(--border);
295
+ --cut-fill: rgba(255, 255, 255, 0.72);
296
+ box-shadow: var(--shadow-sm);
297
+ }
298
+
299
+ .cut-surface {
300
+ padding: 24px;
301
+ }
302
+
303
+ .cut-panel {
304
+ padding: 16px;
305
+ }
306
+
307
+ .input-shell {
308
+ --cut-border-width: 2px;
309
+ --cut-border-color: var(--primary);
310
+ --cut-fill: var(--bg-secondary);
311
+ display: flex;
312
+ align-items: center;
313
+ gap: 12px;
314
+ min-height: 54px;
315
+ padding: 0 16px;
316
+ }
317
+
318
+ .input-shell.error {
319
+ --cut-border-color: var(--danger);
320
+ }
321
+
322
+ .input-shell.disabled {
323
+ opacity: 0.5;
324
+ }
325
+
326
+ .input-shell input,
327
+ .input-shell select,
328
+ .input-shell textarea {
329
+ width: 100%;
330
+ border: 0;
331
+ outline: none;
332
+ color: var(--text);
333
+ background: transparent;
334
+ }
335
+
336
+ .textarea-shell {
337
+ min-height: 120px;
338
+ align-items: flex-start;
339
+ padding: 16px;
340
+ }
341
+
342
+ .textarea-shell textarea {
343
+ min-height: 90px;
344
+ resize: vertical;
345
+ }
346
+
347
+ .leading-icon,
348
+ .button-icon {
349
+ color: var(--text-muted);
350
+ }
351
+
352
+ .clear-button {
353
+ border: 0;
354
+ background: transparent;
355
+ color: var(--text-muted);
356
+ font-size: 20px;
357
+ }
358
+
359
+ .chip-row,
360
+ .action-row,
361
+ .modal-actions {
362
+ display: flex;
363
+ flex-wrap: wrap;
364
+ gap: 12px;
365
+ }
366
+
367
+ .cut-button {
368
+ --cut-border-width: 0px;
369
+ appearance: none;
370
+ -webkit-appearance: none;
371
+ border: 0;
372
+ outline: none;
373
+ background: transparent;
374
+ padding: 14px 18px;
375
+ display: inline-flex;
376
+ align-items: center;
377
+ gap: 10px;
378
+ font-weight: 700;
379
+ transition: transform 180ms ease, background 180ms ease, border-color 180ms ease;
380
+ }
381
+
382
+ .cut-button::-moz-focus-inner {
383
+ border: 0;
384
+ }
385
+
386
+ .cut-button:hover {
387
+ transform: translateY(-1px);
388
+ }
389
+
390
+ .cut-button.primary {
391
+ --cut-fill: linear-gradient(135deg, var(--primary), var(--primary-strong));
392
+ color: white;
393
+ }
394
+
395
+ .cut-button.ghost {
396
+ --cut-border-width: 1px;
397
+ --cut-border-color: var(--border);
398
+ --cut-fill: rgba(255, 255, 255, 0.66);
399
+ color: var(--text);
400
+ }
401
+
402
+ .cut-button.ghost.selected {
403
+ --cut-border-color: rgba(15, 118, 110, 0.24);
404
+ --cut-fill: rgba(15, 118, 110, 0.12);
405
+ }
406
+
407
+ .cut-button.danger {
408
+ --cut-border-width: 1px;
409
+ --cut-border-color: rgba(220, 38, 38, 0.22);
410
+ --cut-fill: rgba(220, 38, 38, 0.12);
411
+ color: var(--danger);
412
+ }
413
+
414
+ .full-width {
415
+ width: 100%;
416
+ justify-content: center;
417
+ }
418
+
419
+ .task-list {
420
+ display: flex;
421
+ flex-direction: column;
422
+ gap: 8px;
423
+ }
424
+
425
+ .task-row {
426
+ width: 100%;
427
+ display: grid;
428
+ grid-template-columns: auto 1fr auto;
429
+ gap: 16px;
430
+ align-items: center;
431
+ border: 1px solid transparent;
432
+ border-radius: 18px;
433
+ background: transparent;
434
+ padding: 14px;
435
+ color: inherit;
436
+ text-align: left;
437
+ }
438
+
439
+ .task-row.selected,
440
+ .task-row:hover {
441
+ border-color: var(--border);
442
+ background: rgba(15, 118, 110, 0.06);
443
+ }
444
+
445
+ .checkbox-shell {
446
+ display: grid;
447
+ place-items: center;
448
+ }
449
+
450
+ .checkbox-shell input {
451
+ width: 18px;
452
+ height: 18px;
453
+ accent-color: var(--primary);
454
+ }
455
+
456
+ .task-copy {
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 6px;
460
+ }
461
+
462
+ .task-copy span {
463
+ color: var(--text-secondary);
464
+ }
465
+
466
+ .priority-dot {
467
+ width: 12px;
468
+ height: 12px;
469
+ border-radius: 999px;
470
+ }
471
+
472
+ .task-detail {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 24px;
476
+ }
477
+
478
+ .hero-card {
479
+ display: flex;
480
+ justify-content: space-between;
481
+ gap: 16px;
482
+ align-items: flex-start;
483
+ }
484
+
485
+ .status-badge {
486
+ border-radius: 999px;
487
+ padding: 10px 14px;
488
+ font-size: 12px;
489
+ font-weight: 800;
490
+ letter-spacing: 0.08em;
491
+ text-transform: uppercase;
492
+ }
493
+
494
+ .status-badge.open {
495
+ background: rgba(37, 99, 235, 0.12);
496
+ color: var(--info);
497
+ }
498
+
499
+ .status-badge.done {
500
+ background: rgba(21, 128, 61, 0.12);
501
+ color: var(--success);
502
+ }
503
+
504
+ .stat-grid,
505
+ .analytics-grid {
506
+ display: grid;
507
+ grid-template-columns: repeat(2, minmax(0, 1fr));
508
+ gap: 12px;
509
+ }
510
+
511
+ .stat-card {
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: 8px;
515
+ }
516
+
517
+ .stat-card span {
518
+ color: var(--text-secondary);
519
+ }
520
+
521
+ .stat-card strong {
522
+ font-size: 28px;
523
+ }
524
+
525
+ .detail-section,
526
+ .detail-list {
527
+ display: flex;
528
+ flex-direction: column;
529
+ gap: 12px;
530
+ }
531
+
532
+ .detail-row,
533
+ .table-row,
534
+ .preview-item {
535
+ display: flex;
536
+ justify-content: space-between;
537
+ gap: 16px;
538
+ align-items: center;
539
+ border-top: 1px solid var(--border);
540
+ padding-top: 12px;
541
+ }
542
+
543
+ .detail-row:first-child,
544
+ .table-row:first-child {
545
+ border-top: 0;
546
+ padding-top: 0;
547
+ }
548
+
549
+ .table-list {
550
+ display: flex;
551
+ flex-direction: column;
552
+ gap: 14px;
553
+ }
554
+
555
+ .table-row span,
556
+ .detail-row span {
557
+ color: var(--text-secondary);
558
+ }
559
+
560
+ .chart-card {
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: 16px;
564
+ }
565
+
566
+ .section-head {
567
+ display: flex;
568
+ justify-content: space-between;
569
+ gap: 12px;
570
+ align-items: center;
571
+ }
572
+
573
+ .section-head.compact {
574
+ align-items: flex-start;
575
+ }
576
+
577
+ .legend {
578
+ display: flex;
579
+ gap: 14px;
580
+ color: var(--text-secondary);
581
+ font-size: 14px;
582
+ }
583
+
584
+ .legend span {
585
+ display: inline-flex;
586
+ align-items: center;
587
+ gap: 8px;
588
+ }
589
+
590
+ .legend-dot {
591
+ width: 10px;
592
+ height: 10px;
593
+ border-radius: 999px;
594
+ display: inline-block;
595
+ }
596
+
597
+ .legend-dot.created {
598
+ background: var(--secondary);
599
+ }
600
+
601
+ .legend-dot.completed {
602
+ background: var(--primary);
603
+ }
604
+
605
+ .trend-chart {
606
+ width: 100%;
607
+ height: auto;
608
+ overflow: visible;
609
+ }
610
+
611
+ .grid-line {
612
+ stroke: var(--border);
613
+ stroke-width: 1;
614
+ }
615
+
616
+ .line {
617
+ fill: none;
618
+ stroke-width: 3;
619
+ }
620
+
621
+ .line.created {
622
+ stroke: var(--secondary);
623
+ }
624
+
625
+ .line.completed {
626
+ stroke: var(--primary);
627
+ }
628
+
629
+ .point {
630
+ fill: var(--primary);
631
+ stroke: var(--bg);
632
+ stroke-width: 3;
633
+ }
634
+
635
+ .point.active {
636
+ fill: var(--secondary);
637
+ }
638
+
639
+ .chart-label {
640
+ fill: var(--text-muted);
641
+ font-size: 12px;
642
+ }
643
+
644
+ .chart-callout {
645
+ display: flex;
646
+ gap: 18px;
647
+ align-items: center;
648
+ color: var(--text-secondary);
649
+ }
650
+
651
+ .preview-card,
652
+ .form-stack,
653
+ .settings-grid {
654
+ display: flex;
655
+ flex-direction: column;
656
+ gap: 16px;
657
+ }
658
+
659
+ .preview-list {
660
+ display: flex;
661
+ flex-direction: column;
662
+ gap: 10px;
663
+ }
664
+
665
+ .preview-item {
666
+ padding: 14px 16px;
667
+ border: 1px solid var(--border);
668
+ background: var(--bg-secondary);
669
+ }
670
+
671
+ .preview-item.next {
672
+ border-color: rgba(15, 118, 110, 0.3);
673
+ background: rgba(15, 118, 110, 0.08);
674
+ }
675
+
676
+ .inline-error {
677
+ border: 1px solid rgba(220, 38, 38, 0.2);
678
+ background: rgba(220, 38, 38, 0.1);
679
+ color: var(--danger);
680
+ padding: 14px 16px;
681
+ }
682
+
683
+ .toggle-row {
684
+ display: flex;
685
+ justify-content: space-between;
686
+ gap: 16px;
687
+ align-items: center;
688
+ padding: 16px 0;
689
+ border-top: 1px solid var(--border);
690
+ }
691
+
692
+ .toggle-row:first-of-type {
693
+ border-top: 0;
694
+ padding-top: 0;
695
+ }
696
+
697
+ .toggle-row > div {
698
+ display: flex;
699
+ flex-direction: column;
700
+ gap: 6px;
701
+ }
702
+
703
+ .toggle-pill {
704
+ width: 58px;
705
+ height: 34px;
706
+ border: 1px solid transparent;
707
+ border-radius: 999px;
708
+ background: rgba(123, 135, 148, 0.24);
709
+ padding: 4px;
710
+ transition: 180ms ease;
711
+ }
712
+
713
+ .toggle-pill span {
714
+ width: 24px;
715
+ height: 24px;
716
+ border-radius: 999px;
717
+ background: white;
718
+ display: block;
719
+ transition: 180ms ease;
720
+ }
721
+
722
+ .toggle-pill.checked {
723
+ background: var(--primary);
724
+ }
725
+
726
+ .toggle-pill.checked span {
727
+ transform: translateX(24px);
728
+ }
729
+
730
+ .modal-backdrop {
731
+ position: fixed;
732
+ inset: 0;
733
+ display: grid;
734
+ place-items: center;
735
+ padding: 24px;
736
+ background: rgba(15, 20, 24, 0.44);
737
+ backdrop-filter: blur(18px);
738
+ }
739
+
740
+ .modal-card {
741
+ width: min(720px, 100%);
742
+ max-height: 90vh;
743
+ overflow: auto;
744
+ }
745
+
746
+ .modal-card.wide {
747
+ width: min(1120px, 100%);
748
+ }
749
+
750
+ .modal-header {
751
+ display: flex;
752
+ justify-content: space-between;
753
+ gap: 16px;
754
+ align-items: flex-start;
755
+ margin-bottom: 20px;
756
+ }
757
+
758
+ .modal-two-column {
759
+ display: grid;
760
+ grid-template-columns: minmax(0, 0.95fr) minmax(320px, 0.75fr);
761
+ gap: 20px;
762
+ }
763
+
764
+ .toast-stack {
765
+ position: fixed;
766
+ right: 20px;
767
+ bottom: 20px;
768
+ display: flex;
769
+ flex-direction: column;
770
+ gap: 10px;
771
+ z-index: 20;
772
+ }
773
+
774
+ .toast {
775
+ border: 1px solid transparent;
776
+ min-width: 260px;
777
+ padding: 14px 16px;
778
+ text-align: left;
779
+ color: white;
780
+ box-shadow: var(--shadow-lg);
781
+ }
782
+
783
+ .toast.success {
784
+ background: var(--success);
785
+ }
786
+
787
+ .toast.warning {
788
+ background: var(--warning);
789
+ }
790
+
791
+ .toast.error {
792
+ background: var(--danger);
793
+ }
794
+
795
+ .toast.info {
796
+ background: var(--info);
797
+ }
798
+
799
+ .empty-state {
800
+ padding: 24px;
801
+ display: grid;
802
+ gap: 10px;
803
+ justify-items: start;
804
+ }
805
+
806
+ .empty-state.compact {
807
+ padding: 12px 0 0;
808
+ }
809
+
810
+ .empty-state h3 {
811
+ margin: 0;
812
+ }
813
+
814
+ .empty-state p {
815
+ margin: 0;
816
+ color: var(--text-secondary);
817
+ }
818
+
819
+ .empty-icon {
820
+ width: 40px;
821
+ height: 40px;
822
+ display: grid;
823
+ place-items: center;
824
+ border-radius: 999px;
825
+ background: rgba(15, 118, 110, 0.1);
826
+ color: var(--primary);
827
+ }
828
+
829
+ .rule-list {
830
+ display: flex;
831
+ flex-direction: column;
832
+ gap: 10px;
833
+ }
834
+
835
+ .rule-card {
836
+ padding: 14px 16px;
837
+ border: 1px solid var(--border);
838
+ background: rgba(255, 255, 255, 0.5);
839
+ }
840
+
841
+ .rule-card span {
842
+ display: block;
843
+ margin-top: 6px;
844
+ color: var(--text-secondary);
845
+ }
846
+
847
+ @media (max-width: 1079px) {
848
+ .shell-layout,
849
+ .modal-two-column {
850
+ grid-template-columns: 1fr;
851
+ }
852
+
853
+ .nav-shell {
854
+ position: static;
855
+ min-height: auto;
856
+ border-right: 0;
857
+ border-bottom: 1px solid var(--border);
858
+ }
859
+
860
+ .screen-header,
861
+ .modal-header,
862
+ .section-head {
863
+ flex-direction: column;
864
+ }
865
+ }
866
+
867
+ @media (max-width: 720px) {
868
+ :root {
869
+ --page-padding: 16px;
870
+ --cut: 12px;
871
+ }
872
+
873
+ .stat-grid,
874
+ .analytics-grid {
875
+ grid-template-columns: 1fr;
876
+ }
877
+
878
+ .toast-stack {
879
+ left: 16px;
880
+ right: 16px;
881
+ }
882
+
883
+ .toast {
884
+ min-width: 0;
885
+ }
886
+ }