P4: gitea-renderable parity-gallery-grid.md (markdown with inline images)

Gitea serves raw .html with Content-Type: text/plain for security, so the
HTML gallery only renders via `open` locally or external static hosting.
Add a parallel markdown version that gitea's /src/ view renders natively
with inline images.

View: https://gitea.treytartt.com/admin/honeyDueKMP/src/branch/rc/android-ios-parity/docs/parity-gallery-grid.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-04-18 23:59:06 -05:00
parent 031d61157f
commit 3944223a5e
3 changed files with 576 additions and 6 deletions

531
docs/parity-gallery-grid.md Normal file
View File

@@ -0,0 +1,531 @@
# honeyDue parity gallery
*93 Android · 58 iOS · 37 screens*
Auto-generated by `scripts/build_parity_gallery.py` — do not hand-edit.
See [parity-gallery.md](parity-gallery.md) for the workflow guide.
## Screens
- [add_residence](#add-residence)
- [add_task](#add-task)
- [add_task_with_residence](#add-task-with-residence)
- [all_tasks](#all-tasks)
- [contractors_list](#contractors-list)
- [documents_warranties](#documents-warranties)
- [edit_residence](#edit-residence)
- [feature_comparison](#feature-comparison)
- [forgot_password](#forgot-password)
- [home](#home)
- [join_residence](#join-residence)
- [login](#login)
- [manage_users](#manage-users)
- [notification_preferences](#notification-preferences)
- [onboarding_create_account](#onboarding-create-account)
- [onboarding_first_task](#onboarding-first-task)
- [onboarding_home_profile](#onboarding-home-profile)
- [onboarding_join_residence](#onboarding-join-residence)
- [onboarding_location](#onboarding-location)
- [onboarding_name_residence](#onboarding-name-residence)
- [onboarding_subscription](#onboarding-subscription)
- [onboarding_value_props](#onboarding-value-props)
- [onboarding_verify_email](#onboarding-verify-email)
- [onboarding_welcome](#onboarding-welcome)
- [profile_edit](#profile-edit)
- [profile_tab](#profile-tab)
- [register](#register)
- [reset_password](#reset-password)
- [residence_detail](#residence-detail)
- [residences](#residences)
- [residences_list](#residences-list)
- [task_suggestions](#task-suggestions)
- [task_templates_browser](#task-templates-browser)
- [tasks](#tasks)
- [theme_selection](#theme-selection)
- [verify_email](#verify-email)
- [verify_reset_code](#verify-reset-code)
---
## add_residence<a id='add-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/add_residence_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_residence_empty.add_residence_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/add_residence_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_residence_empty.add_residence_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/add_residence_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/add_residence_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## add_task<a id='add-task'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_task_empty.add_task_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_task_empty.add_task_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## add_task_with_residence<a id='add-task-with-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_task_with_residence_empty.add_task_with_residence_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_add_task_with_residence_empty.add_task_with_residence_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## all_tasks<a id='all-tasks'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/all_tasks_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_all_tasks_empty.all_tasks_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_all_tasks_empty.all_tasks_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## contractors_list<a id='contractors-list'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_contractors_list_empty.contractors_list_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_contractors_list_empty.contractors_list_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## documents_warranties<a id='documents-warranties'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_documents_warranties_empty.documents_warranties_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_documents_warranties_empty.documents_warranties_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## edit_residence<a id='edit-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/edit_residence_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/edit_residence_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/edit_residence_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/edit_residence_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## feature_comparison<a id='feature-comparison'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_feature_comparison_empty.feature_comparison_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_feature_comparison_empty.feature_comparison_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## forgot_password<a id='forgot-password'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/forgot_password_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_forgot_password_empty.forgot_password_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/forgot_password_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_forgot_password_empty.forgot_password_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/forgot_password_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/forgot_password_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## home<a id='home'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/home_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/home_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/home_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/home_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## join_residence<a id='join-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/join_residence_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_join_residence_empty.join_residence_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/join_residence_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_join_residence_empty.join_residence_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/join_residence_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/join_residence_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## login<a id='login'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/login_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_login_empty.login_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/login_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_login_empty.login_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/login_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/login_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## manage_users<a id='manage-users'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/manage_users_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/manage_users_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/manage_users_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/manage_users_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## notification_preferences<a id='notification-preferences'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_notification_preferences_empty.notification_preferences_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_notification_preferences_empty.notification_preferences_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_create_account<a id='onboarding-create-account'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_create_account_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_create_account_empty.onboarding_create_account_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_create_account_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_create_account_empty.onboarding_create_account_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_create_account_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_create_account_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_first_task<a id='onboarding-first-task'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_first_task_empty.onboarding_first_task_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_first_task_empty.onboarding_first_task_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_home_profile<a id='onboarding-home-profile'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_home_profile_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_home_profile_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_home_profile_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_home_profile_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_join_residence<a id='onboarding-join-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_join_residence_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_join_residence_empty.onboarding_join_residence_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_join_residence_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_join_residence_empty.onboarding_join_residence_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_join_residence_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_join_residence_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_location<a id='onboarding-location'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_location_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_location_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_location_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_location_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_name_residence<a id='onboarding-name-residence'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_name_residence_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_name_residence_empty.onboarding_name_residence_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_name_residence_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_name_residence_empty.onboarding_name_residence_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_name_residence_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_name_residence_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_subscription<a id='onboarding-subscription'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_subscription_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_subscription_empty.onboarding_subscription_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_subscription_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_subscription_empty.onboarding_subscription_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_subscription_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_subscription_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_value_props<a id='onboarding-value-props'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_value_props_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_value_props_empty.onboarding_value_props_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_value_props_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_value_props_empty.onboarding_value_props_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_value_props_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_value_props_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_verify_email<a id='onboarding-verify-email'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_verify_email_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_verify_email_empty.onboarding_verify_email_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_verify_email_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_verify_email_empty.onboarding_verify_email_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_verify_email_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_verify_email_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## onboarding_welcome<a id='onboarding-welcome'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_welcome_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_welcome_empty.onboarding_welcome_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_welcome_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_onboarding_welcome_empty.onboarding_welcome_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_welcome_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/onboarding_welcome_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## profile_edit<a id='profile-edit'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_profile_edit_empty.profile_edit_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_profile_edit_empty.profile_edit_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## profile_tab<a id='profile-tab'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_profile_tab_empty.profile_tab_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_profile_tab_empty.profile_tab_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## register<a id='register'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/register_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_register_empty.register_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/register_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_register_empty.register_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/register_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/register_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## reset_password<a id='reset-password'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/reset_password_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_reset_password_empty.reset_password_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/reset_password_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_reset_password_empty.reset_password_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/reset_password_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/reset_password_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## residence_detail<a id='residence-detail'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/residence_detail_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/residence_detail_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/residence_detail_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/residence_detail_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## residences<a id='residences'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/residences_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/residences_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/residences_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/residences_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## residences_list<a id='residences-list'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_residences_list_empty.residences_list_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_residences_list_empty.residences_list_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## task_suggestions<a id='task-suggestions'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_task_suggestions_empty.task_suggestions_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_task_suggestions_empty.task_suggestions_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## task_templates_browser<a id='task-templates-browser'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_task_templates_browser_empty.task_templates_browser_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_task_templates_browser_empty.task_templates_browser_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## tasks<a id='tasks'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/tasks_empty_light.png) | _missing_ |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/tasks_empty_dark.png) | _missing_ |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/tasks_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/tasks_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## theme_selection<a id='theme-selection'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_theme_selection_empty.theme_selection_empty_light.png) |
| **empty** / dark | _missing_ | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_theme_selection_empty.theme_selection_empty_dark.png) |
| **populated** / light | _missing_ | _missing_ |
| **populated** / dark | _missing_ | _missing_ |
[top](#honeydue-parity-gallery)
---
## verify_email<a id='verify-email'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/verify_email_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_verify_email_empty.verify_email_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/verify_email_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_verify_email_empty.verify_email_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/verify_email_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/verify_email_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---
## verify_reset_code<a id='verify-reset-code'></a>
| State / Mode | Android | iOS |
|---|---|---|
| **empty** / light | ![](../composeApp/src/androidUnitTest/roborazzi/verify_reset_code_empty_light.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_verify_reset_code_empty.verify_reset_code_empty_light.png) |
| **empty** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/verify_reset_code_empty_dark.png) | ![](../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_verify_reset_code_empty.verify_reset_code_empty_dark.png) |
| **populated** / light | ![](../composeApp/src/androidUnitTest/roborazzi/verify_reset_code_populated_light.png) | _missing_ |
| **populated** / dark | ![](../composeApp/src/androidUnitTest/roborazzi/verify_reset_code_populated_dark.png) | _missing_ |
[top](#honeydue-parity-gallery)
---

View File

@@ -27,7 +27,7 @@
border-radius: 4px; color: #8b949e; font-size: 12px; }
</style></head><body>
<h1>honeyDue parity gallery</h1>
<div class='meta'>91 Android · 58 iOS · 37 screens</div>
<div class='meta'>93 Android · 58 iOS · 37 screens</div>
<div class='nav'><a href='#add_residence'>add_residence</a> <a href='#add_task'>add_task</a> <a href='#add_task_with_residence'>add_task_with_residence</a> <a href='#all_tasks'>all_tasks</a> <a href='#contractors_list'>contractors_list</a> <a href='#documents_warranties'>documents_warranties</a> <a href='#edit_residence'>edit_residence</a> <a href='#feature_comparison'>feature_comparison</a> <a href='#forgot_password'>forgot_password</a> <a href='#home'>home</a> <a href='#join_residence'>join_residence</a> <a href='#login'>login</a> <a href='#manage_users'>manage_users</a> <a href='#notification_preferences'>notification_preferences</a> <a href='#onboarding_create_account'>onboarding_create_account</a> <a href='#onboarding_first_task'>onboarding_first_task</a> <a href='#onboarding_home_profile'>onboarding_home_profile</a> <a href='#onboarding_join_residence'>onboarding_join_residence</a> <a href='#onboarding_location'>onboarding_location</a> <a href='#onboarding_name_residence'>onboarding_name_residence</a> <a href='#onboarding_subscription'>onboarding_subscription</a> <a href='#onboarding_value_props'>onboarding_value_props</a> <a href='#onboarding_verify_email'>onboarding_verify_email</a> <a href='#onboarding_welcome'>onboarding_welcome</a> <a href='#profile_edit'>profile_edit</a> <a href='#profile_tab'>profile_tab</a> <a href='#register'>register</a> <a href='#reset_password'>reset_password</a> <a href='#residence_detail'>residence_detail</a> <a href='#residences'>residences</a> <a href='#residences_list'>residences_list</a> <a href='#task_suggestions'>task_suggestions</a> <a href='#task_templates_browser'>task_templates_browser</a> <a href='#tasks'>tasks</a> <a href='#theme_selection'>theme_selection</a> <a href='#verify_email'>verify_email</a> <a href='#verify_reset_code'>verify_reset_code</a></div>
<div class='grid-header'><div class='label'></div><div>Android</div><div>iOS</div></div>
<div class='screen' id='add_residence'>
@@ -53,7 +53,7 @@
</div>
<div class='screen' id='all_tasks'>
<h2>all_tasks</h2>
<div class='row'><div class='label'>empty<br><span class='mode'>light</span></div><div class='missing'>Android missing</div><img loading='lazy' src='../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_all_tasks_empty.all_tasks_empty_light.png' alt='all_tasks_empty_light iOS'/></div>
<div class='row'><div class='label'>empty<br><span class='mode'>light</span></div><img loading='lazy' src='../composeApp/src/androidUnitTest/roborazzi/all_tasks_empty_light.png' alt='all_tasks_empty_light Android'/><img loading='lazy' src='../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_all_tasks_empty.all_tasks_empty_light.png' alt='all_tasks_empty_light iOS'/></div>
<div class='row'><div class='label'>empty<br><span class='mode'>dark</span></div><div class='missing'>Android missing</div><img loading='lazy' src='../iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests/test_all_tasks_empty.all_tasks_empty_dark.png' alt='all_tasks_empty_dark iOS'/></div>
<div class='row'><div class='label'>populated<br><span class='mode'>light</span></div><div class='missing'>Android missing</div><div class='missing'>iOS missing</div></div>
<div class='row'><div class='label'>populated<br><span class='mode'>dark</span></div><div class='missing'>Android missing</div><div class='missing'>iOS missing</div></div>
@@ -266,7 +266,7 @@
<div class='row'><div class='label'>empty<br><span class='mode'>light</span></div><img loading='lazy' src='../composeApp/src/androidUnitTest/roborazzi/tasks_empty_light.png' alt='tasks_empty_light Android'/><div class='missing'>iOS missing</div></div>
<div class='row'><div class='label'>empty<br><span class='mode'>dark</span></div><img loading='lazy' src='../composeApp/src/androidUnitTest/roborazzi/tasks_empty_dark.png' alt='tasks_empty_dark Android'/><div class='missing'>iOS missing</div></div>
<div class='row'><div class='label'>populated<br><span class='mode'>light</span></div><img loading='lazy' src='../composeApp/src/androidUnitTest/roborazzi/tasks_populated_light.png' alt='tasks_populated_light Android'/><div class='missing'>iOS missing</div></div>
<div class='row'><div class='label'>populated<br><span class='mode'>dark</span></div><div class='missing'>Android missing</div><div class='missing'>iOS missing</div></div>
<div class='row'><div class='label'>populated<br><span class='mode'>dark</span></div><img loading='lazy' src='../composeApp/src/androidUnitTest/roborazzi/tasks_populated_dark.png' alt='tasks_populated_dark Android'/><div class='missing'>iOS missing</div></div>
</div>
<div class='screen' id='theme_selection'>
<h2>theme_selection</h2>

View File

@@ -25,7 +25,8 @@ import sys
REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ANDROID_DIR = "composeApp/src/androidUnitTest/roborazzi"
IOS_DIR = "iosApp/HoneyDueTests/__Snapshots__/SnapshotGalleryTests"
OUT = "docs/parity-gallery.html"
OUT_HTML = "docs/parity-gallery.html"
OUT_MD = "docs/parity-gallery-grid.md"
# swift-snapshot-testing names files "test_<func>.<name>.png" — strip prefix
IOS_NAME_RE = re.compile(r"^test_[^.]+\.(.+)\.png$")
@@ -63,13 +64,51 @@ def parse_key(key: str) -> tuple[str, str, str]:
return key, "?", "?"
def write_markdown(android: dict[str, str], ios: dict[str, str], screens: list[str]) -> None:
"""Emit a gitea-renderable grid as markdown tables.
Gitea serves .html as text/plain (security), but renders .md natively at
its /src/ URL with inline images. This output is the browser-viewable one.
"""
out = os.path.join(REPO_ROOT, OUT_MD)
os.makedirs(os.path.dirname(out), exist_ok=True)
# Markdown image paths are relative to the .md file, which lives in docs/.
# We already compute relative-to-docs paths in load(); those apply here too.
with open(out, "w", encoding="utf-8") as f:
f.write("# honeyDue parity gallery\n\n")
f.write(f"*{len(android)} Android · {len(ios)} iOS · {len(screens)} screens*\n\n")
f.write("Auto-generated by `scripts/build_parity_gallery.py` — do not hand-edit.\n\n")
f.write("See [parity-gallery.md](parity-gallery.md) for the workflow guide.\n\n")
f.write("## Screens\n\n")
for s in screens:
f.write(f"- [{s}](#{s.replace('_', '-')})\n")
f.write("\n---\n\n")
for screen in screens:
anchor = screen.replace("_", "-")
f.write(f"## {screen}<a id='{anchor}'></a>\n\n")
f.write("| State / Mode | Android | iOS |\n")
f.write("|---|---|---|\n")
for state in ("empty", "populated"):
for mode in ("light", "dark"):
key = f"{screen}_{state}_{mode}"
a = android.get(key)
i = ios.get(key)
a_cell = f"![]({a})" if a else "_missing_"
i_cell = f"![]({i})" if i else "_missing_"
f.write(f"| **{state}** / {mode} | {a_cell} | {i_cell} |\n")
f.write("\n[top](#honeydue-parity-gallery)\n\n---\n\n")
print(f"wrote {OUT_MD}")
def main() -> int:
android = load("android", ANDROID_DIR)
ios = load("ios", IOS_DIR)
keys = sorted(set(android) | set(ios))
screens = sorted({parse_key(k)[0] for k in keys})
out_path = os.path.join(REPO_ROOT, OUT)
write_markdown(android, ios, screens)
out_path = os.path.join(REPO_ROOT, OUT_HTML)
os.makedirs(os.path.dirname(out_path), exist_ok=True)
with open(out_path, "w", encoding="utf-8") as f:
f.write(PAGE_HEAD)
@@ -111,7 +150,7 @@ def main() -> int:
f.write("</div>\n")
f.write(PAGE_FOOT)
print(f"wrote {OUT}: {len(screens)} screens, {len(android)} Android + {len(ios)} iOS images")
print(f"wrote {OUT_HTML}: {len(screens)} screens, {len(android)} Android + {len(ios)} iOS images")
return 0