openuispec 0.1.18 → 0.1.19
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 +52 -34
- package/cli/index.ts +1 -1
- package/docs/stress-test-maturity-report.md +97 -0
- package/examples/todo-orbit/AGENTS.md +127 -0
- package/examples/todo-orbit/CLAUDE.md +127 -0
- package/examples/todo-orbit/README.md +62 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/README.md +14 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/build.gradle.kts +58 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/proguard-rules.pro +1 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/AndroidManifest.xml +20 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/MainActivity.kt +14 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/TodoOrbitApp.kt +345 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/AppLogic.kt +231 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Models.kt +169 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Strings.kt +8 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/components/CommonComponents.kt +185 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/AnalyticsScreen.kt +193 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/SettingsScreen.kt +102 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/TasksScreen.kt +342 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/sheets/EditorSheets.kt +344 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/theme/TodoOrbitTheme.kt +59 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values/strings.xml +148 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values-ru/strings.xml +154 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/build.gradle.kts +4 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle.properties +4 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew +248 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew.bat +93 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/settings.gradle.kts +18 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/README.md +29 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/en.lproj/Localizable.strings +118 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/ru.lproj/Localizable.strings +118 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/App/TodoOrbitApp.swift +50 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/OrbitChrome.swift +204 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/SchedulePreviewView.swift +126 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/TrendChartView.swift +70 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/RecurringRuleSheet.swift +123 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/TaskEditorSheet.swift +60 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Models/DomainModels.swift +238 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/AnalyticsView.swift +94 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/SettingsView.swift +74 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/TasksHomeView.swift +363 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Support/AppModel.swift +324 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.pbxproj +408 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/xcshareddata/xcschemes/TodoOrbit.xcscheme +79 -0
- package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +24 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/index.html +16 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/package-lock.json +1087 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/package.json +24 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/src/App.tsx +2114 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/src/main.tsx +13 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/src/styles.css +886 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/tsconfig.json +19 -0
- package/examples/todo-orbit/generated/web/Todo Orbit/vite.config.ts +6 -0
- package/examples/todo-orbit/openuispec/README.md +158 -0
- package/examples/todo-orbit/openuispec/contracts/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/contracts/action_trigger.yaml +28 -0
- package/examples/todo-orbit/openuispec/contracts/collection.yaml +32 -0
- package/examples/todo-orbit/openuispec/contracts/data_display.yaml +38 -0
- package/examples/todo-orbit/openuispec/contracts/feedback.yaml +32 -0
- package/examples/todo-orbit/openuispec/contracts/input_field.yaml +52 -0
- package/examples/todo-orbit/openuispec/contracts/nav_container.yaml +47 -0
- package/examples/todo-orbit/openuispec/contracts/surface.yaml +28 -0
- package/examples/todo-orbit/openuispec/contracts/x_schedule_preview.yaml +134 -0
- package/examples/todo-orbit/openuispec/contracts/x_task_trend_chart.yaml +139 -0
- package/examples/todo-orbit/openuispec/flows/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/flows/create_recurring_rule.yaml +253 -0
- package/examples/todo-orbit/openuispec/flows/create_task.yaml +118 -0
- package/examples/todo-orbit/openuispec/flows/edit_task.yaml +126 -0
- package/examples/todo-orbit/openuispec/locales/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/locales/en.json +150 -0
- package/examples/todo-orbit/openuispec/locales/ru.json +150 -0
- package/examples/todo-orbit/openuispec/openuispec.yaml +122 -0
- package/examples/todo-orbit/openuispec/platform/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/platform/android.yaml +19 -0
- package/examples/todo-orbit/openuispec/platform/ios.yaml +20 -0
- package/examples/todo-orbit/openuispec/platform/web.yaml +22 -0
- package/examples/todo-orbit/openuispec/screens/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/screens/analytics.yaml +139 -0
- package/examples/todo-orbit/openuispec/screens/home.yaml +172 -0
- package/examples/todo-orbit/openuispec/screens/settings.yaml +148 -0
- package/examples/todo-orbit/openuispec/screens/task_detail.yaml +223 -0
- package/examples/todo-orbit/openuispec/tokens/.gitkeep +0 -0
- package/examples/todo-orbit/openuispec/tokens/color.yaml +93 -0
- package/examples/todo-orbit/openuispec/tokens/elevation.yaml +25 -0
- package/examples/todo-orbit/openuispec/tokens/icons.yaml +92 -0
- package/examples/todo-orbit/openuispec/tokens/layout.yaml +107 -0
- package/examples/todo-orbit/openuispec/tokens/motion.yaml +39 -0
- package/examples/todo-orbit/openuispec/tokens/spacing.yaml +18 -0
- package/examples/todo-orbit/openuispec/tokens/themes.yaml +23 -0
- package/examples/todo-orbit/openuispec/tokens/typography.yaml +52 -0
- package/package.json +1 -1
- package/schema/validate.ts +0 -2
- package/spec/openuispec-v0.1.md +76 -12
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$locale": "en",
|
|
3
|
+
"$direction": "ltr",
|
|
4
|
+
"nav.tasks": "Tasks",
|
|
5
|
+
"nav.analytics": "Analytics",
|
|
6
|
+
"nav.settings": "Settings",
|
|
7
|
+
"home.title": "Today, organized",
|
|
8
|
+
"home.summary": "{open, plural, =0 {Everything is done} one {# task left out of {total}} other {# tasks left out of {total}}}",
|
|
9
|
+
"home.search_label": "Search tasks",
|
|
10
|
+
"home.search_placeholder": "Search by title or notes",
|
|
11
|
+
"home.filter.all": "All",
|
|
12
|
+
"home.filter.open": "Open",
|
|
13
|
+
"home.filter.done": "Done",
|
|
14
|
+
"home.mark_complete": "Mark {title} complete",
|
|
15
|
+
"home.empty_title": "Nothing to do",
|
|
16
|
+
"home.empty_body": "Add a task or switch filters to see more items.",
|
|
17
|
+
"home.new_task": "New task",
|
|
18
|
+
"analytics.title": "Task analytics",
|
|
19
|
+
"analytics.subtitle": "Monitor throughput, overdue work, and completion trends.",
|
|
20
|
+
"analytics.period_week": "Week",
|
|
21
|
+
"analytics.period_month": "Month",
|
|
22
|
+
"analytics.period_quarter": "Quarter",
|
|
23
|
+
"analytics.completed_today": "Completed today",
|
|
24
|
+
"analytics.open_tasks": "Open tasks",
|
|
25
|
+
"analytics.overdue_tasks": "Overdue",
|
|
26
|
+
"analytics.completion_rate": "Completion rate",
|
|
27
|
+
"analytics.overdue_section": "Overdue review",
|
|
28
|
+
"analytics.overdue_subtitle": "Tasks that need attention first.",
|
|
29
|
+
"analytics.trend_subtitle": "Completion trend",
|
|
30
|
+
"analytics.legend_completed": "Completed",
|
|
31
|
+
"analytics.legend_created": "Created",
|
|
32
|
+
"analytics.empty_trend": "No trend data yet.",
|
|
33
|
+
"analytics.empty_overdue": "No overdue tasks",
|
|
34
|
+
"analytics.empty_overdue_body": "Everything important is on track.",
|
|
35
|
+
"task_detail.status": "Status",
|
|
36
|
+
"task_detail.priority": "Priority",
|
|
37
|
+
"task_detail.notes": "Notes",
|
|
38
|
+
"task_detail.due_date": "Due date",
|
|
39
|
+
"task_detail.no_due_date": "No deadline",
|
|
40
|
+
"task_detail.created": "Created",
|
|
41
|
+
"task_detail.updated": "Updated",
|
|
42
|
+
"task_detail.edit": "Edit task",
|
|
43
|
+
"task_detail.toggle_status": "Toggle status",
|
|
44
|
+
"task_detail.more_info": "More info",
|
|
45
|
+
"task_detail.delete": "Delete task",
|
|
46
|
+
"task_detail.delete_title": "Delete this task?",
|
|
47
|
+
"task_detail.delete_message": "This action cannot be undone.",
|
|
48
|
+
"task_detail.updated_feedback": "Task updated",
|
|
49
|
+
"task_detail.update_error": "Could not update task",
|
|
50
|
+
"task_detail.deleted_feedback": "Task deleted",
|
|
51
|
+
"settings.title": "Preferences",
|
|
52
|
+
"settings.subtitle": "Adjust language and theme for every platform target.",
|
|
53
|
+
"settings.language": "Language",
|
|
54
|
+
"settings.language_en": "English",
|
|
55
|
+
"settings.language_ru": "Russian",
|
|
56
|
+
"settings.theme": "Theme",
|
|
57
|
+
"settings.theme_light": "Light",
|
|
58
|
+
"settings.theme_dark": "Dark",
|
|
59
|
+
"settings.reminders": "Due date reminders",
|
|
60
|
+
"settings.reminders_helper": "Notify me before tasks are due.",
|
|
61
|
+
"settings.daily_summary": "Daily summary",
|
|
62
|
+
"settings.daily_summary_helper": "Send a summary of open work each morning.",
|
|
63
|
+
"settings.automation_title": "Automation",
|
|
64
|
+
"settings.automation_subtitle": "Create recurring task rules to stress conditional forms and validation.",
|
|
65
|
+
"settings.automation_create_rule": "Create recurring rule",
|
|
66
|
+
"settings.save": "Save changes",
|
|
67
|
+
"settings.saving": "Saving...",
|
|
68
|
+
"settings.saved": "Preferences updated",
|
|
69
|
+
"settings.error_title": "Could not update preferences",
|
|
70
|
+
"recurring_rule.title": "Recurring rule",
|
|
71
|
+
"recurring_rule.subtitle": "Configure a reusable schedule with conditional inputs and validation.",
|
|
72
|
+
"recurring_rule.save": "Save rule",
|
|
73
|
+
"recurring_rule.saving": "Saving...",
|
|
74
|
+
"recurring_rule.success": "Recurring rule created",
|
|
75
|
+
"recurring_rule.error_title": "Could not create recurring rule",
|
|
76
|
+
"recurring_rule.field_name": "Rule name",
|
|
77
|
+
"recurring_rule.field_name_placeholder": "Daily planning ritual",
|
|
78
|
+
"recurring_rule.field_confirm_name": "Confirm rule name",
|
|
79
|
+
"recurring_rule.field_confirm_name_placeholder": "Repeat the rule name",
|
|
80
|
+
"recurring_rule.field_cadence": "Cadence",
|
|
81
|
+
"recurring_rule.cadence_daily": "Daily",
|
|
82
|
+
"recurring_rule.cadence_weekly": "Weekly",
|
|
83
|
+
"recurring_rule.cadence_monthly": "Monthly",
|
|
84
|
+
"recurring_rule.field_interval": "Repeat every",
|
|
85
|
+
"recurring_rule.field_interval_helper": "Use whole numbers between 1 and 30.",
|
|
86
|
+
"recurring_rule.field_weekday": "Weekday",
|
|
87
|
+
"recurring_rule.field_month_day": "Day of month",
|
|
88
|
+
"recurring_rule.field_month_day_helper": "Limited to 28 for portable scheduling.",
|
|
89
|
+
"recurring_rule.field_start_date": "Start date",
|
|
90
|
+
"recurring_rule.field_has_end_date": "Set an end date",
|
|
91
|
+
"recurring_rule.field_has_end_date_helper": "Stop generating tasks after a specific date.",
|
|
92
|
+
"recurring_rule.field_end_date": "End date",
|
|
93
|
+
"recurring_rule.field_remind_at": "Reminder time",
|
|
94
|
+
"recurring_rule.field_remind_at_placeholder": "09:00",
|
|
95
|
+
"recurring_rule.field_remind_at_helper": "24-hour time in HH:MM format. Shown only when reminders are enabled.",
|
|
96
|
+
"recurring_rule.field_enable_summary": "Attach daily summary delivery",
|
|
97
|
+
"recurring_rule.field_enable_summary_helper": "Choose how the summary should be delivered for this rule.",
|
|
98
|
+
"recurring_rule.field_summary_channel": "Summary channel",
|
|
99
|
+
"recurring_rule.summary_push": "Push notification",
|
|
100
|
+
"recurring_rule.summary_email": "Email",
|
|
101
|
+
"recurring_preview.title": "Upcoming schedule preview",
|
|
102
|
+
"recurring_preview.empty": "No upcoming dates can be generated from this rule.",
|
|
103
|
+
"recurring_preview.invalid": "Complete the cadence and date fields to preview the schedule.",
|
|
104
|
+
"create_task.title": "New task",
|
|
105
|
+
"create_task.save": "Save",
|
|
106
|
+
"create_task.saving": "Saving...",
|
|
107
|
+
"create_task.field_title": "Title",
|
|
108
|
+
"create_task.field_title_placeholder": "What needs to be done?",
|
|
109
|
+
"create_task.field_notes": "Notes",
|
|
110
|
+
"create_task.field_notes_placeholder": "Context, links, or next steps",
|
|
111
|
+
"create_task.field_priority": "Priority",
|
|
112
|
+
"create_task.field_due_date": "Due date",
|
|
113
|
+
"create_task.field_due_date_placeholder": "No deadline",
|
|
114
|
+
"create_task.success": "Task created",
|
|
115
|
+
"create_task.error_title": "Could not create task",
|
|
116
|
+
"edit_task.title": "Edit task",
|
|
117
|
+
"edit_task.save": "Save",
|
|
118
|
+
"edit_task.saving": "Saving...",
|
|
119
|
+
"edit_task.field_title": "Title",
|
|
120
|
+
"edit_task.field_notes": "Notes",
|
|
121
|
+
"edit_task.field_priority": "Priority",
|
|
122
|
+
"edit_task.field_due_date": "Due date",
|
|
123
|
+
"edit_task.success": "Task saved",
|
|
124
|
+
"edit_task.error_title": "Could not save task",
|
|
125
|
+
"priority.low": "Low",
|
|
126
|
+
"priority.medium": "Medium",
|
|
127
|
+
"priority.high": "High",
|
|
128
|
+
"status.open": "Open",
|
|
129
|
+
"status.done": "Done",
|
|
130
|
+
"validation.min_length": "Must be at least {min} characters",
|
|
131
|
+
"validation.min_value": "Must be at least {min}",
|
|
132
|
+
"validation.max_value": "Must be no more than {max}",
|
|
133
|
+
"validation.fix_errors": "Fix the highlighted fields before saving.",
|
|
134
|
+
"validation.rule_name_min_length": "Rule name must be at least {min} characters",
|
|
135
|
+
"validation.rule_name_reserved": "The default name is reserved. Choose a more specific label.",
|
|
136
|
+
"validation.rule_name_taken": "A recurring rule with this name already exists.",
|
|
137
|
+
"validation.match_field": "Fields do not match",
|
|
138
|
+
"validation.end_date_after_start": "End date must be the same as or later than the start date.",
|
|
139
|
+
"validation.time_format": "Use a 24-hour time like 09:00",
|
|
140
|
+
"validation.month_day_max": "Choose a day between 1 and 28",
|
|
141
|
+
"weekday.mon": "Monday",
|
|
142
|
+
"weekday.tue": "Tuesday",
|
|
143
|
+
"weekday.wed": "Wednesday",
|
|
144
|
+
"weekday.thu": "Thursday",
|
|
145
|
+
"weekday.fri": "Friday",
|
|
146
|
+
"weekday.sat": "Saturday",
|
|
147
|
+
"weekday.sun": "Sunday",
|
|
148
|
+
"common.cancel": "Cancel",
|
|
149
|
+
"common.delete": "Delete"
|
|
150
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$locale": "ru",
|
|
3
|
+
"$direction": "ltr",
|
|
4
|
+
"nav.tasks": "Задачи",
|
|
5
|
+
"nav.analytics": "Аналитика",
|
|
6
|
+
"nav.settings": "Настройки",
|
|
7
|
+
"home.title": "Сегодня все под контролем",
|
|
8
|
+
"home.summary": "{open, plural, =0 {Все задачи закрыты} one {Осталась # задача из {total}} few {Осталось # задачи из {total}} many {Осталось # задач из {total}} other {Осталось # задачи из {total}}}",
|
|
9
|
+
"home.search_label": "Поиск задач",
|
|
10
|
+
"home.search_placeholder": "Искать по названию или заметкам",
|
|
11
|
+
"home.filter.all": "Все",
|
|
12
|
+
"home.filter.open": "Открытые",
|
|
13
|
+
"home.filter.done": "Выполненные",
|
|
14
|
+
"home.mark_complete": "Отметить задачу «{title}» выполненной",
|
|
15
|
+
"home.empty_title": "Список пуст",
|
|
16
|
+
"home.empty_body": "Добавьте задачу или смените фильтр, чтобы увидеть элементы.",
|
|
17
|
+
"home.new_task": "Новая задача",
|
|
18
|
+
"analytics.title": "Аналитика задач",
|
|
19
|
+
"analytics.subtitle": "Следите за выполнением, просроченными задачами и динамикой.",
|
|
20
|
+
"analytics.period_week": "Неделя",
|
|
21
|
+
"analytics.period_month": "Месяц",
|
|
22
|
+
"analytics.period_quarter": "Квартал",
|
|
23
|
+
"analytics.completed_today": "Выполнено сегодня",
|
|
24
|
+
"analytics.open_tasks": "Открытые задачи",
|
|
25
|
+
"analytics.overdue_tasks": "Просрочено",
|
|
26
|
+
"analytics.completion_rate": "Процент выполнения",
|
|
27
|
+
"analytics.overdue_section": "Просроченные задачи",
|
|
28
|
+
"analytics.overdue_subtitle": "Задачи, которым нужно уделить внимание в первую очередь.",
|
|
29
|
+
"analytics.trend_subtitle": "Динамика выполнения",
|
|
30
|
+
"analytics.legend_completed": "Выполнено",
|
|
31
|
+
"analytics.legend_created": "Создано",
|
|
32
|
+
"analytics.empty_trend": "Данные тренда пока отсутствуют.",
|
|
33
|
+
"analytics.empty_overdue": "Просроченных задач нет",
|
|
34
|
+
"analytics.empty_overdue_body": "Все важные задачи идут по плану.",
|
|
35
|
+
"task_detail.status": "Статус",
|
|
36
|
+
"task_detail.priority": "Приоритет",
|
|
37
|
+
"task_detail.notes": "Заметки",
|
|
38
|
+
"task_detail.due_date": "Срок",
|
|
39
|
+
"task_detail.no_due_date": "Без срока",
|
|
40
|
+
"task_detail.created": "Создано",
|
|
41
|
+
"task_detail.updated": "Обновлено",
|
|
42
|
+
"task_detail.edit": "Редактировать задачу",
|
|
43
|
+
"task_detail.toggle_status": "Сменить статус",
|
|
44
|
+
"task_detail.more_info": "Подробнее",
|
|
45
|
+
"task_detail.delete": "Удалить задачу",
|
|
46
|
+
"task_detail.delete_title": "Удалить эту задачу?",
|
|
47
|
+
"task_detail.delete_message": "Это действие нельзя отменить.",
|
|
48
|
+
"task_detail.updated_feedback": "Задача обновлена",
|
|
49
|
+
"task_detail.update_error": "Не удалось обновить задачу",
|
|
50
|
+
"task_detail.deleted_feedback": "Задача удалена",
|
|
51
|
+
"settings.title": "Параметры",
|
|
52
|
+
"settings.subtitle": "Измените язык и тему для всех целевых платформ.",
|
|
53
|
+
"settings.language": "Язык",
|
|
54
|
+
"settings.language_en": "Английский",
|
|
55
|
+
"settings.language_ru": "Русский",
|
|
56
|
+
"settings.theme": "Тема",
|
|
57
|
+
"settings.theme_light": "Светлая",
|
|
58
|
+
"settings.theme_dark": "Тёмная",
|
|
59
|
+
"settings.reminders": "Напоминания о сроках",
|
|
60
|
+
"settings.reminders_helper": "Уведомлять перед наступлением срока задачи.",
|
|
61
|
+
"settings.daily_summary": "Ежедневная сводка",
|
|
62
|
+
"settings.daily_summary_helper": "Присылать утреннюю сводку по открытым задачам.",
|
|
63
|
+
"settings.automation_title": "Автоматизация",
|
|
64
|
+
"settings.automation_subtitle": "Создавайте повторяющиеся правила задач, чтобы проверить условные формы и валидацию.",
|
|
65
|
+
"settings.automation_create_rule": "Создать правило",
|
|
66
|
+
"settings.save": "Сохранить",
|
|
67
|
+
"settings.saving": "Сохранение...",
|
|
68
|
+
"settings.saved": "Параметры обновлены",
|
|
69
|
+
"settings.error_title": "Не удалось обновить параметры",
|
|
70
|
+
"recurring_rule.title": "Повторяющееся правило",
|
|
71
|
+
"recurring_rule.subtitle": "Настройте расписание с условными полями и валидацией.",
|
|
72
|
+
"recurring_rule.save": "Сохранить правило",
|
|
73
|
+
"recurring_rule.saving": "Сохранение...",
|
|
74
|
+
"recurring_rule.success": "Повторяющееся правило создано",
|
|
75
|
+
"recurring_rule.error_title": "Не удалось создать правило",
|
|
76
|
+
"recurring_rule.field_name": "Название правила",
|
|
77
|
+
"recurring_rule.field_name_placeholder": "Ежедневный ритуал планирования",
|
|
78
|
+
"recurring_rule.field_confirm_name": "Подтвердите название",
|
|
79
|
+
"recurring_rule.field_confirm_name_placeholder": "Повторите название правила",
|
|
80
|
+
"recurring_rule.field_cadence": "Периодичность",
|
|
81
|
+
"recurring_rule.cadence_daily": "Ежедневно",
|
|
82
|
+
"recurring_rule.cadence_weekly": "Еженедельно",
|
|
83
|
+
"recurring_rule.cadence_monthly": "Ежемесячно",
|
|
84
|
+
"recurring_rule.field_interval": "Повторять каждые",
|
|
85
|
+
"recurring_rule.field_interval_helper": "Используйте целые числа от 1 до 30.",
|
|
86
|
+
"recurring_rule.field_weekday": "День недели",
|
|
87
|
+
"recurring_rule.field_month_day": "День месяца",
|
|
88
|
+
"recurring_rule.field_month_day_helper": "Ограничено 28 днями для переносимого расписания.",
|
|
89
|
+
"recurring_rule.field_start_date": "Дата начала",
|
|
90
|
+
"recurring_rule.field_has_end_date": "Указать дату окончания",
|
|
91
|
+
"recurring_rule.field_has_end_date_helper": "Прекратить создание задач после определённой даты.",
|
|
92
|
+
"recurring_rule.field_end_date": "Дата окончания",
|
|
93
|
+
"recurring_rule.field_remind_at": "Время напоминания",
|
|
94
|
+
"recurring_rule.field_remind_at_placeholder": "09:00",
|
|
95
|
+
"recurring_rule.field_remind_at_helper": "24-часовой формат HH:MM. Поле показывается, только если напоминания включены.",
|
|
96
|
+
"recurring_rule.field_enable_summary": "Добавить ежедневную сводку",
|
|
97
|
+
"recurring_rule.field_enable_summary_helper": "Выберите способ доставки сводки для этого правила.",
|
|
98
|
+
"recurring_rule.field_summary_channel": "Канал сводки",
|
|
99
|
+
"recurring_rule.summary_push": "Push-уведомление",
|
|
100
|
+
"recurring_rule.summary_email": "Электронная почта",
|
|
101
|
+
"recurring_preview.title": "Предпросмотр расписания",
|
|
102
|
+
"recurring_preview.empty": "Для этого правила не удаётся сформировать будущие даты.",
|
|
103
|
+
"recurring_preview.invalid": "Заполните периодичность и даты, чтобы увидеть предпросмотр расписания.",
|
|
104
|
+
"create_task.title": "Новая задача",
|
|
105
|
+
"create_task.save": "Сохранить",
|
|
106
|
+
"create_task.saving": "Сохранение...",
|
|
107
|
+
"create_task.field_title": "Название",
|
|
108
|
+
"create_task.field_title_placeholder": "Что нужно сделать?",
|
|
109
|
+
"create_task.field_notes": "Заметки",
|
|
110
|
+
"create_task.field_notes_placeholder": "Контекст, ссылки или следующие шаги",
|
|
111
|
+
"create_task.field_priority": "Приоритет",
|
|
112
|
+
"create_task.field_due_date": "Срок",
|
|
113
|
+
"create_task.field_due_date_placeholder": "Без срока",
|
|
114
|
+
"create_task.success": "Задача создана",
|
|
115
|
+
"create_task.error_title": "Не удалось создать задачу",
|
|
116
|
+
"edit_task.title": "Редактировать задачу",
|
|
117
|
+
"edit_task.save": "Сохранить",
|
|
118
|
+
"edit_task.saving": "Сохранение...",
|
|
119
|
+
"edit_task.field_title": "Название",
|
|
120
|
+
"edit_task.field_notes": "Заметки",
|
|
121
|
+
"edit_task.field_priority": "Приоритет",
|
|
122
|
+
"edit_task.field_due_date": "Срок",
|
|
123
|
+
"edit_task.success": "Задача сохранена",
|
|
124
|
+
"edit_task.error_title": "Не удалось сохранить задачу",
|
|
125
|
+
"priority.low": "Низкий",
|
|
126
|
+
"priority.medium": "Средний",
|
|
127
|
+
"priority.high": "Высокий",
|
|
128
|
+
"status.open": "Открыта",
|
|
129
|
+
"status.done": "Выполнена",
|
|
130
|
+
"validation.min_length": "Минимум {min} символа(ов)",
|
|
131
|
+
"validation.min_value": "Значение должно быть не меньше {min}",
|
|
132
|
+
"validation.max_value": "Значение должно быть не больше {max}",
|
|
133
|
+
"validation.fix_errors": "Исправьте выделенные поля перед сохранением.",
|
|
134
|
+
"validation.rule_name_min_length": "Название правила должно содержать минимум {min} символа(ов)",
|
|
135
|
+
"validation.rule_name_reserved": "Название по умолчанию зарезервировано. Укажите более точную метку.",
|
|
136
|
+
"validation.rule_name_taken": "Правило с таким названием уже существует.",
|
|
137
|
+
"validation.match_field": "Поля не совпадают",
|
|
138
|
+
"validation.end_date_after_start": "Дата окончания должна быть не раньше даты начала.",
|
|
139
|
+
"validation.time_format": "Используйте 24-часовой формат, например 09:00",
|
|
140
|
+
"validation.month_day_max": "Выберите день от 1 до 28",
|
|
141
|
+
"weekday.mon": "Понедельник",
|
|
142
|
+
"weekday.tue": "Вторник",
|
|
143
|
+
"weekday.wed": "Среда",
|
|
144
|
+
"weekday.thu": "Четверг",
|
|
145
|
+
"weekday.fri": "Пятница",
|
|
146
|
+
"weekday.sat": "Суббота",
|
|
147
|
+
"weekday.sun": "Воскресенье",
|
|
148
|
+
"common.cancel": "Отмена",
|
|
149
|
+
"common.delete": "Удалить"
|
|
150
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# openuispec-sample — OpenUISpec v0.1
|
|
2
|
+
spec_version: "0.1"
|
|
3
|
+
|
|
4
|
+
project:
|
|
5
|
+
name: "Todo Orbit"
|
|
6
|
+
description: "A bilingual todo app spec for testing OpenUISpec generation and drift"
|
|
7
|
+
icon: "checkmark_list"
|
|
8
|
+
|
|
9
|
+
includes:
|
|
10
|
+
tokens: "./tokens/"
|
|
11
|
+
contracts: "./contracts/"
|
|
12
|
+
screens: "./screens/"
|
|
13
|
+
flows: "./flows/"
|
|
14
|
+
platform: "./platform/"
|
|
15
|
+
locales: "./locales/"
|
|
16
|
+
|
|
17
|
+
custom_contracts:
|
|
18
|
+
- "./contracts/x_task_trend_chart.yaml"
|
|
19
|
+
- "./contracts/x_schedule_preview.yaml"
|
|
20
|
+
|
|
21
|
+
i18n:
|
|
22
|
+
default_locale: "en"
|
|
23
|
+
supported_locales: [en, ru]
|
|
24
|
+
fallback_strategy: "default"
|
|
25
|
+
|
|
26
|
+
generation:
|
|
27
|
+
targets: [ios, android, web]
|
|
28
|
+
# output_dir: # Optional: map targets to code directories
|
|
29
|
+
# ios: "../ios-app/" # relative to this file
|
|
30
|
+
# android: "../android-app/"
|
|
31
|
+
# web: "../web-ui/"
|
|
32
|
+
output_format:
|
|
33
|
+
ios: { language: swift, framework: swiftui, min_version: "17.0" }
|
|
34
|
+
android: { language: kotlin, framework: compose, min_sdk: 26 }
|
|
35
|
+
web: { language: typescript, framework: react, bundler: vite }
|
|
36
|
+
|
|
37
|
+
formatters:
|
|
38
|
+
priority_label:
|
|
39
|
+
input: enum
|
|
40
|
+
output: string
|
|
41
|
+
mapping:
|
|
42
|
+
low: "$t:priority.low"
|
|
43
|
+
medium: "$t:priority.medium"
|
|
44
|
+
high: "$t:priority.high"
|
|
45
|
+
status_label:
|
|
46
|
+
input: enum
|
|
47
|
+
output: string
|
|
48
|
+
mapping:
|
|
49
|
+
open: "$t:status.open"
|
|
50
|
+
done: "$t:status.done"
|
|
51
|
+
|
|
52
|
+
mappers:
|
|
53
|
+
task_status_severity:
|
|
54
|
+
open: info
|
|
55
|
+
done: success
|
|
56
|
+
priority_to_severity:
|
|
57
|
+
low: neutral
|
|
58
|
+
medium: info
|
|
59
|
+
high: warning
|
|
60
|
+
|
|
61
|
+
data_model:
|
|
62
|
+
task:
|
|
63
|
+
id: { type: string, format: uuid }
|
|
64
|
+
title: { type: string, max_length: 160 }
|
|
65
|
+
notes: { type: string, required: false }
|
|
66
|
+
status: { type: enum, values: [open, done] }
|
|
67
|
+
priority: { type: enum, values: [low, medium, high] }
|
|
68
|
+
due_date: { type: date, required: false }
|
|
69
|
+
created_at: { type: datetime }
|
|
70
|
+
updated_at: { type: datetime }
|
|
71
|
+
|
|
72
|
+
preferences:
|
|
73
|
+
locale: { type: enum, values: [en, ru] }
|
|
74
|
+
theme: { type: enum, values: [light, dark] }
|
|
75
|
+
reminders_enabled: { type: bool }
|
|
76
|
+
daily_summary_enabled: { type: bool }
|
|
77
|
+
|
|
78
|
+
analytics_snapshot:
|
|
79
|
+
completed_today: { type: int }
|
|
80
|
+
open_tasks: { type: int }
|
|
81
|
+
overdue_tasks: { type: int }
|
|
82
|
+
completion_rate: { type: float }
|
|
83
|
+
|
|
84
|
+
trend_point:
|
|
85
|
+
label: { type: string }
|
|
86
|
+
completed: { type: int }
|
|
87
|
+
created: { type: int }
|
|
88
|
+
|
|
89
|
+
recurring_rule:
|
|
90
|
+
id: { type: string, format: uuid }
|
|
91
|
+
name: { type: string, max_length: 80 }
|
|
92
|
+
cadence: { type: enum, values: [daily, weekly, monthly] }
|
|
93
|
+
interval: { type: int }
|
|
94
|
+
weekday: { type: enum, values: [mon, tue, wed, thu, fri, sat, sun], required: false }
|
|
95
|
+
month_day: { type: int, required: false }
|
|
96
|
+
start_date: { type: date }
|
|
97
|
+
end_date: { type: date, required: false }
|
|
98
|
+
remind_at: { type: string, required: false }
|
|
99
|
+
summary_channel: { type: enum, values: [push, email], required: false }
|
|
100
|
+
|
|
101
|
+
api:
|
|
102
|
+
base_url: "/api/v1"
|
|
103
|
+
auth: "bearer_token"
|
|
104
|
+
endpoints:
|
|
105
|
+
tasks:
|
|
106
|
+
list: { method: GET, path: "/tasks", params: [filter, search] }
|
|
107
|
+
getById: { method: GET, path: "/tasks/:id" }
|
|
108
|
+
create: { method: POST, path: "/tasks", body: "task" }
|
|
109
|
+
update: { method: PATCH, path: "/tasks/:id", body: "task" }
|
|
110
|
+
toggleStatus: { method: PATCH, path: "/tasks/:id/status" }
|
|
111
|
+
delete: { method: DELETE, path: "/tasks/:id" }
|
|
112
|
+
counts: { method: GET, path: "/tasks/counts" }
|
|
113
|
+
preferences:
|
|
114
|
+
get: { method: GET, path: "/preferences" }
|
|
115
|
+
update: { method: PATCH, path: "/preferences", body: "preferences" }
|
|
116
|
+
analytics:
|
|
117
|
+
overview: { method: GET, path: "/analytics/overview", params: [period] }
|
|
118
|
+
trend: { method: GET, path: "/analytics/trend", params: [period] }
|
|
119
|
+
overdue: { method: GET, path: "/analytics/overdue", params: [limit] }
|
|
120
|
+
recurring:
|
|
121
|
+
create: { method: POST, path: "/recurring-rules", body: "recurring_rule" }
|
|
122
|
+
checkName: { method: GET, path: "/recurring-rules/check-name", params: [value] }
|
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
android:
|
|
2
|
+
framework: compose
|
|
3
|
+
language: kotlin
|
|
4
|
+
min_sdk: 26
|
|
5
|
+
|
|
6
|
+
overrides:
|
|
7
|
+
x_task_trend_chart:
|
|
8
|
+
compact: { uses_canvas_rendering: true }
|
|
9
|
+
detail: { uses_canvas_rendering: true, supports_pointer_highlight: true }
|
|
10
|
+
x_schedule_preview:
|
|
11
|
+
compact: { uses_lazy_column: true }
|
|
12
|
+
detail: { uses_lazy_column: true, supports_animated_content: true }
|
|
13
|
+
|
|
14
|
+
behaviors:
|
|
15
|
+
dynamic_type: true
|
|
16
|
+
|
|
17
|
+
generation:
|
|
18
|
+
architecture: "MVVM"
|
|
19
|
+
naming: "Kotlin conventions"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
ios:
|
|
2
|
+
framework: swiftui
|
|
3
|
+
min_version: "17.0"
|
|
4
|
+
|
|
5
|
+
overrides:
|
|
6
|
+
x_task_trend_chart:
|
|
7
|
+
compact: { uses_native_chart_framework: true }
|
|
8
|
+
detail: { uses_native_chart_framework: true, supports_rule_mark: true }
|
|
9
|
+
x_schedule_preview:
|
|
10
|
+
compact: { uses_timeline_view: true }
|
|
11
|
+
detail: { uses_timeline_view: true, supports_content_transition: true }
|
|
12
|
+
|
|
13
|
+
behaviors:
|
|
14
|
+
dynamic_type: true
|
|
15
|
+
safe_area_respect: true
|
|
16
|
+
|
|
17
|
+
generation:
|
|
18
|
+
imports: ["SwiftUI", "Foundation"]
|
|
19
|
+
architecture: "MVVM with @Observable"
|
|
20
|
+
naming: "Swift conventions"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
web:
|
|
2
|
+
framework: react
|
|
3
|
+
language: typescript
|
|
4
|
+
|
|
5
|
+
overrides:
|
|
6
|
+
x_task_trend_chart:
|
|
7
|
+
compact: { implementation: "svg", responsive: true }
|
|
8
|
+
detail: { implementation: "svg", responsive: true, supports_tooltip: true }
|
|
9
|
+
x_schedule_preview:
|
|
10
|
+
compact: { implementation: "semantic_list", responsive: true }
|
|
11
|
+
detail: { implementation: "semantic_list", responsive: true, supports_staggered_updates: true }
|
|
12
|
+
|
|
13
|
+
behaviors:
|
|
14
|
+
prefers_color_scheme: true
|
|
15
|
+
keyboard_navigation: true
|
|
16
|
+
|
|
17
|
+
generation:
|
|
18
|
+
bundler: "vite"
|
|
19
|
+
css: "custom_css"
|
|
20
|
+
routing: "react_router"
|
|
21
|
+
state: "zustand"
|
|
22
|
+
naming: "React conventions"
|
|
File without changes
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
analytics:
|
|
2
|
+
semantic: "Analytics dashboard for productivity trends, weekly completion, and overdue task review"
|
|
3
|
+
status: ready
|
|
4
|
+
|
|
5
|
+
data:
|
|
6
|
+
overview:
|
|
7
|
+
source: "api.analytics.overview"
|
|
8
|
+
params: { period: "state.period" }
|
|
9
|
+
trend:
|
|
10
|
+
source: "api.analytics.trend"
|
|
11
|
+
params: { period: "state.period" }
|
|
12
|
+
overdue:
|
|
13
|
+
source: "api.analytics.overdue"
|
|
14
|
+
params: { limit: 10 }
|
|
15
|
+
|
|
16
|
+
state:
|
|
17
|
+
period:
|
|
18
|
+
type: enum
|
|
19
|
+
values: [week, month, quarter]
|
|
20
|
+
default: week
|
|
21
|
+
|
|
22
|
+
navigation:
|
|
23
|
+
contract: nav_container
|
|
24
|
+
props:
|
|
25
|
+
items:
|
|
26
|
+
- id: "tasks"
|
|
27
|
+
label: "$t:nav.tasks"
|
|
28
|
+
icon: "checkmark_list"
|
|
29
|
+
icon_active: "checkmark_list_fill"
|
|
30
|
+
destination: "screens/home"
|
|
31
|
+
- id: "analytics"
|
|
32
|
+
label: "$t:nav.analytics"
|
|
33
|
+
icon: "chart_line"
|
|
34
|
+
icon_active: "chart_line_fill"
|
|
35
|
+
destination: "screens/analytics"
|
|
36
|
+
- id: "settings"
|
|
37
|
+
label: "$t:nav.settings"
|
|
38
|
+
icon: "gear"
|
|
39
|
+
icon_active: "gear_fill"
|
|
40
|
+
destination: "screens/settings"
|
|
41
|
+
selected: "analytics"
|
|
42
|
+
adaptive:
|
|
43
|
+
compact: { variant: tab_bar }
|
|
44
|
+
regular: { variant: rail }
|
|
45
|
+
expanded: { variant: sidebar, collapsed: false }
|
|
46
|
+
|
|
47
|
+
layout:
|
|
48
|
+
type: scroll_vertical
|
|
49
|
+
safe_area: true
|
|
50
|
+
padding: "spacing.page_margin"
|
|
51
|
+
sections:
|
|
52
|
+
- id: header
|
|
53
|
+
layout: { type: stack, spacing: "spacing.sm" }
|
|
54
|
+
children:
|
|
55
|
+
- contract: data_display
|
|
56
|
+
variant: inline
|
|
57
|
+
props:
|
|
58
|
+
title: "$t:analytics.title"
|
|
59
|
+
subtitle: "$t:analytics.subtitle"
|
|
60
|
+
tokens_override:
|
|
61
|
+
title_style: "typography.heading_lg"
|
|
62
|
+
subtitle_style: "typography.body_sm"
|
|
63
|
+
|
|
64
|
+
- id: period_filter
|
|
65
|
+
margin_top: "spacing.md"
|
|
66
|
+
contract: collection
|
|
67
|
+
variant: chips
|
|
68
|
+
props:
|
|
69
|
+
data:
|
|
70
|
+
- { id: "week", label: "$t:analytics.period_week" }
|
|
71
|
+
- { id: "month", label: "$t:analytics.period_month" }
|
|
72
|
+
- { id: "quarter", label: "$t:analytics.period_quarter" }
|
|
73
|
+
item_contract: action_trigger
|
|
74
|
+
item_variant: ghost
|
|
75
|
+
item_props_map:
|
|
76
|
+
label: "item.label"
|
|
77
|
+
selectable: true
|
|
78
|
+
selection_mode: single
|
|
79
|
+
selected: "state.period"
|
|
80
|
+
action:
|
|
81
|
+
type: set_state
|
|
82
|
+
target: "state.period"
|
|
83
|
+
value: "item.id"
|
|
84
|
+
|
|
85
|
+
- id: stats
|
|
86
|
+
margin_top: "spacing.lg"
|
|
87
|
+
contract: collection
|
|
88
|
+
variant: grid
|
|
89
|
+
props:
|
|
90
|
+
data:
|
|
91
|
+
- { id: "completed", title: "$t:analytics.completed_today", value: "overview.completed_today" }
|
|
92
|
+
- { id: "open", title: "$t:analytics.open_tasks", value: "overview.open_tasks" }
|
|
93
|
+
- { id: "overdue", title: "$t:analytics.overdue_tasks", value: "overview.overdue_tasks" }
|
|
94
|
+
- { id: "rate", title: "$t:analytics.completion_rate", value: "overview.completion_rate" }
|
|
95
|
+
item_contract: data_display
|
|
96
|
+
item_variant: stat
|
|
97
|
+
item_props_map:
|
|
98
|
+
title: "item.title"
|
|
99
|
+
body: "item.value"
|
|
100
|
+
columns: 2
|
|
101
|
+
|
|
102
|
+
- id: trend_chart
|
|
103
|
+
margin_top: "spacing.lg"
|
|
104
|
+
contract: x_task_trend_chart
|
|
105
|
+
variant: detail
|
|
106
|
+
props:
|
|
107
|
+
series: "trend"
|
|
108
|
+
metric: completed
|
|
109
|
+
period: "state.period"
|
|
110
|
+
show_legend: true
|
|
111
|
+
empty_message: "$t:analytics.empty_trend"
|
|
112
|
+
|
|
113
|
+
- id: overdue_header
|
|
114
|
+
margin_top: "spacing.xl"
|
|
115
|
+
contract: data_display
|
|
116
|
+
variant: inline
|
|
117
|
+
props:
|
|
118
|
+
title: "$t:analytics.overdue_section"
|
|
119
|
+
subtitle: "$t:analytics.overdue_subtitle"
|
|
120
|
+
tokens_override:
|
|
121
|
+
title_style: "typography.heading"
|
|
122
|
+
subtitle_style: "typography.body_sm"
|
|
123
|
+
|
|
124
|
+
- id: overdue_table
|
|
125
|
+
margin_top: "spacing.sm"
|
|
126
|
+
contract: collection
|
|
127
|
+
variant: table
|
|
128
|
+
props:
|
|
129
|
+
data: "overdue"
|
|
130
|
+
item_contract: data_display
|
|
131
|
+
item_variant: compact
|
|
132
|
+
item_props_map:
|
|
133
|
+
title: "item.title"
|
|
134
|
+
subtitle: "{item.priority | format:priority_label}"
|
|
135
|
+
trailing: "item.due_date"
|
|
136
|
+
empty_state:
|
|
137
|
+
icon: "checkmark_circle_fill"
|
|
138
|
+
title: "$t:analytics.empty_overdue"
|
|
139
|
+
body: "$t:analytics.empty_overdue_body"
|