* feat: show no internet notice in add profile screen
* feat: show no internet notice in switch profile screen
* feat: show no internet notice in login screen
* feat: show no internet notice in sign up screen
* feat: show no internet notice in edit profile screen
* docs: update changelog
* chore: add connectivity plus
* feat: add provider to detect offline state
* test: improve coverage of add logs screen
* feat: add waiting for internet translations
* feat: show no internet notice in chat list
* docs: update changelog
* refactor: rename use chat avatar to use chat profile and move color logic inside
* refactor: receive avatar color in wn avatar header
* refactor: use renamed hook in chat screen
* feat: show replies, use chat stream and use fixed avatar color in chat invite screen
* docs: updat change log
* feat: Add WnChatListItem and refactor ChatListTile to use it
- Create WnChatListItem widget matching Figma specs
- Refactor ChatListTile to use WnChatListItem
- Add "you" localization key
- Add tests for WnChatListItem and update ChatListTile tests
- Update test_helpers to support provider overrides
* fix(widgets): improve WnChatListItem design to match Figma
- Use medium14Compact typography for message preview (was medium14)
- Support 2-line message preview with ellipsis truncation
- Center status icon vertically relative to message text
- Add colored status icons: red for failed, blue for request
- Add widgetbook showcase with 'Is From You' knob
- Add two-line message examples to widgetbook
- Wrap widgetbook in DesignWidthContainer (390px)
* feat(widgets): add WnChatList container with scroll edge effect
Extract reusable WnChatList widget from ChatListScreen that handles
loading, empty, and list states. The chat list extends full-screen
behind the WnSlate header using a Stack layout, with a scroll-aware
gradient fade effect at the top so items visually dissolve as they
scroll up behind the slate and into the status bar area.
* feat(chat-list): add pull-to-reveal search and filters header
Add search/filter bar that slides down from behind the slate when
pulling down on the chat list. The header commits to open once the
user drags past 50% and dismisses when scrolling up. Includes
WnSearchAndFilters widget with search field and filter chips.
Closes#148
* add scroll animations for chat list
* fix(test): address PR review feedback and improve widget test coverage
- Rename misleading test description to 'renders chat status widget when status is provided'
- Remove weak 'renders selected state background' test that asserted nothing meaningful
- Add test for pending group with name to cover chat_list_tile.dart avatarName path
- Clean up unnecessary comments in wn_chat_list_item_test.dart
* fix(test): improve test style and use byKey for icon lookup
- Extract finder variable in chat_list_tile_test to keep lines under 100 chars
- Add Key('notification_off_icon') to WnChatListItem notification icon
- Replace widget predicate with find.byKey in notification off test
- Reformat long testWidgets declaration to wrap under 100 chars
- Remove unused wn_icon.dart import from test
* fix: translate l10n strings, remove unused isTyping param, fix test pubkeys
- Translate search/filterChats/filterArchive into de/es/fr/it/pt/ru/tr
- Remove unused isTyping parameter from WnChatListItem
- Use valid 64-char hex pubkeys in chat_list_tile tests
- Remove unnecessary comments from ChatListTile
* fix: restore reversed chat list ordering and extract magic constants
Restore reversed indexing in ChatListScreen itemBuilder so newest/updated
chats appear at the top, aligning with useChatList hook behavior.
Extract repeated values in WnChatList into named constants:
- _kAnimationDuration for the four Duration(milliseconds: 200) usages
- horizontalPadding for the duplicated 10.w ListView/header padding
- _kDismissThreshold (0.7) and _kOpenThreshold (0.5) for header reveal
Fix test pubkeys in chat_list_tile_test to use valid 64-char hex constants
and update chat_list_screen_test expectations for reversed ordering.
---------
Co-authored-by: emir yorulmaz <emiryorulmaz@ikmail.com>
* chore: use whitenoise app team and bundle id
* chore: add apk commands
* chore: rename package from sloth to whitenoise
* docs: remove sloth word from readme and agents.md
* chore: replace sloth texts with whitenoise
* chore: remove unused error screen
* docs: copy LICENSE file from whitenoise repo
* chore: upgrade version to 0.3.0+15 so that android apk can replace old whitenoise ones
* refactor: rename MyApp to WnApp
* chore: use new staging bundle id
* chore: rename org.parres to IPF
* chore: remove .so file
* fix: make android signer work after bundle id change
* core: replace org.parres with dev.ipf for widgebtook
* test: improve coverage
* feat: add text widget that has ellipsis in middle
* feat: add wn copy card
* docs: add wn copy card story and rename wn avatar story
* refactor: move use system notice to hook
* feat: add translation for on copy pubkey error
* feat: use wn copy card and use system notice in screens
* test: add tests for uncovered back navigaiton in user search screen
* feat: change pubkey formatting to 4 chars groups
* test: improve formatting tests by moving hex to npub mapping to base mock
* feat: change formatting initials to just one
* feat: calculate accent color from pubkey
* refactor: extract image picker logic to hook, to be able to then replace wn image picker with wn avatar
* feat: adjust avatar design
* feat: use avatar colors
* feat: handle pick error case and replace image picker with avatar in signup an edit profile screens
* docs: add avatar widgetbook story
* test: fix dropdown tests warnings
* docs: update changelog
* test: use hex pubkeys in tests
* fix: overflow in settings screen
* feat(widgets): add slate design input components
Replace WnTextFormField with new slate design input widgets:
- WnInput: Single-line text input with optional label, helper text,
inline action, and trailing action support
- WnInputPassword: Password input with visibility toggle, scan QR
button, and paste/clear actions
- WnInputTextArea: Multi-line text input with configurable minimum
height based on size variant
All components support two sizes (44px and 56px) matching the Figma
design system, with consistent typography (Manrope Medium 14px) and
semantic colors.
Closes#65
* fix: add .toInt() to clamp result and improve password input test coverage
- Fix type error in wn_copyable_field.dart (clamp returns num, need int)
- Add tests for labelHelpIcon callback in WnInputPassword
- All input widgets now have 100% test coverage
* fix: improve input widgets and test reliability
- Add obscurable to useEffect deps in WnCopyableField
- Use .h for height sizing in WnCopyableField Container
- Add key to password field container for testability
- Add second toggle check in visibility test
- Update size tests to assert actual rendered heights
- Fix mountWidget/mountStackedWidget to call setUpTestView
* fix: improve WnInputPassword responsive sizing and disabled state
- Use backgroundSecondary for disabled background (visual distinction)
- Split inlineActionSize into separate width (.w) and height (.h) vars
- Apply same pattern to _buildInlineAction and _buildTrailingAction
- Fix labelHelpIcon SizedBox to use .h for height
* fix(widgets): align input background color with Figma design
Remove redundant ternary for background color in WnInput and
WnInputPassword. Per Figma design, both enabled and disabled states
use backgroundPrimary - disabled state is distinguished by text color.
* refactor(widgets): clean up WnInput code
- Remove redundant Padding with EdgeInsets.all(0.w) around help icon
- Use spread operator to combine inlineAction SizedBox and Gap into
single conditional block
* refactor(widgets): improve WnInput tap target and deduplicate styles
- Add HitTestBehavior.opaque to label help icon GestureDetector so
full 18.w SizedBox is tappable, not just the 14.w icon
- Extract _baseInfoTextStyle getter to deduplicate TextStyle in
_buildHelperText and _buildErrorText methods
* feat(widgets): add focus/hover states and disable interactions for WnInput
- Convert WnInput to HookWidget to track focus and hover state
- Add _getBorderColor method that computes border based on enabled,
focused, hovered, and error states
- Add MouseRegion for hover detection and Focus wrapper for focus tracking
- Wrap inlineAction and trailingAction with IgnorePointer when disabled
to prevent interactions on disabled inputs
* fix(widgets): always register MouseRegion callbacks in WnInput
Keep onEnter and onExit callbacks always registered but change behavior:
- onEnter only sets hover state when enabled
- onExit always clears hover state to prevent stale state on disabled widgets
* fix(widgets): use backgroundSecondary for disabled WnInputTextArea
* fix(widgets): use .h for height values in WnInput components
Per AGENTS.md guidelines, use .w for width-based values and .h for
height-based values with flutter_screenutil.
* test(widgets): add hover state tests for WnInput to achieve 100% coverage
* test(widgets): improve WnInput tests to verify actual visual behavior
- Add 'input_field_container' key to WnInput for testability
- Update size tests to verify actual rendered height (56px vs 44px)
- Update hover tests to verify border color changes:
- tertiary -> secondary on hover
- secondary -> tertiary on exit
- tertiary stays tertiary when disabled and hovered
* Update formatting
* refactor(widgets): improve input widget consistency and accessibility
- Extract shared _baseInfoTextStyle in WnInputPassword for helper/error text
- Add HitTestBehavior.opaque to labelHelpIcon GestureDetector for full tap area
- Gate inline action buttons by enabled state in WnInputPassword
- Fix height unit from .w to .h in WnInputTextArea help icon SizedBox
- Add height assertions to WnInputTextArea size tests
* fix(widgets): use correct semantic color for error text
Change error text color from fillDestructive to backgroundContentDestructive
to match Figma design specifications.
Fixes PR #115 review comments.
* Add internationalization support with 8 languages
- Add locale provider with system/manual language selection
- Add ARB translation files for EN, ES, FR, DE, IT, PT, RU, TR
- Localize all 19 screens and 23 widgets
- Add locale-aware date/number/currency formatters
- Add comprehensive locale provider tests (40+ tests)
- Add language selector in app settings
- Include proper ICU plural forms for all languages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Formatting
* Regenerate flutter_rust_bridge bindings after rebase
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Formatting
* Improve locale persistence and add profile error strings
- Refactor LocaleNotifier to use secure storage for locale preference
- Add profileLoadError and profileSaveError localization strings
- Update tests for new locale provider implementation
- Fix various test issues and remove unused imports
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Improve test coverage and fix CI l10n validation
- Fix CI workflow to use jq for reliable ARB key extraction instead of grep
- Add error handling tests for LocaleProvider storage failures
- Add failure simulation flags to MockWnApi and MockSecureStorage
- Add tests for LocaleFormatters, LocalePersistenceException, and edge cases
- Add UI error handling tests for language update and npub conversion failures
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Improve dropdown scroll UX and fix test reliability
- Add scroll fade indicators to dropdown when options exceed visible items
- Refactor dropdown list into _ScrollableDropdownList widget
- Improve CI l10n validation with better jq error handling
- Remove unused _resolveSystemLanguageCode method
- Fix async test expectations in locale provider tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add atomic locale storage rollback and CI orphaned key detection
- Locale provider now captures previous preference before changes and
restores it atomically if the rust API call fails
- CI l10n validation now detects extra/orphaned keys in locale files
(not just missing keys), with improved error messaging
- Added tests for storage rollback behavior on API failure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Remove unused import
* refactor: move l10n keys validation to scrip folder
* Update spanish localizations
* fix(l10n): improve Spanish key terminology (clave → llave)
Use 'llave' instead of 'clave' for cryptographic keys in Spanish
translations, which is more commonly used in technical contexts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci: add pub cache to l10n-validation and locale validation to precommit
- Add Flutter pub cache step to l10n-validation CI job for faster runs
- Add validate-locales-keys to precommit and precommit-check recipes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ci): use correct github.workspace context in l10n cache
Replace runner.workspace with github.workspace for the pub-cache
path in l10n-validation job. runner.workspace is not a valid
GitHub Actions context.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: josefinalliende <mariajosefinaalliende@gmail.com>
* feat: improve use user metadata hook
* feat: add hook to fetch and sort pending welcomes
* feat: add animated avatar for welcome tiles
* feat: add chat list welcome tile
* feat: skip onboarding on login
* feat: show welcomes in chat list with pull to refresh
* feat: refresh welcomes in chat list navigation
* feat: add welcome screen
* chore: run check coverage script on coverage report comand
* chore: change coderabbit to assertive mode
* feat: improve go back