Commit Graph

3426 Commits

Author SHA1 Message Date
another-simple-pixel edb3495a8f GroupWelcomeView: wrap message editor/preview and buttons in SectionView cards 2026-05-16 13:04:02 -07:00
another-simple-pixel 9114a36848 Section: bump section item minHeight by 2dp more (56 → 58) 2026-05-16 13:03:11 -07:00
another-simple-pixel 633e0f4140 Section + ChatListNavLink.android: align in-card chat row divider with desktop; canvas to 0.94
Two changes:

1) Theme.kt LIGHT canvas: 0.97f → 0.94f (#F0F0F0). User wants more
   contrast against cards. With Material's default 0.04-alpha hover
   (#F5F5F5) this puts hover LIGHTER than canvas by 5 units — unusual
   direction but it's the user's call; they'll evaluate visually.

2) ChatListNavLinkView.android: when rendered inside a SectionView card
   (e.g. contact list inside NewChatSheet after the forEach-into-card
   refactor), use SectionDivider() — same 2dp full-width canvas-color
   divider as desktop. Outside a card (main chat list), fall back to
   the original Material `Divider(Modifier.padding(horizontal = 8.dp))`
   so unchanged for that context.

3) LocalInSectionCard made `internal` so the android-specific file can
   read it. Same pattern as LocalAppColors etc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 12:48:34 -07:00
another-simple-pixel 64d8fca9cd Migrate views: move all SectionTextFooter / SectionSpacer out of SectionView lambdas
Same pre-card-chrome pattern as elsewhere. MigrateToDevice (4 footers)
and MigrateFromDevice (9 footers + 1 SectionSpacer in error view)
historically wrote captions and inter-card spacers inside their
SectionView content lambdas. After PR #6777 added card chrome these
rendered inside the white cards.

MigrateToDevice fixes (4 footers, one per sub-view):
- Confirm network settings footer
- Database init failed retry footer
- Archive import failed retry footer
- Passphrase entering dynamic footer

MigrateFromDevice fixes (9 footers + 1 SectionSpacer):
- ChatStopFailed view footer
- Passphrase confirmation footer
- Upload confirmation footer
- Upload failed retry footer
- Link shown view: archive-will-be-deleted + choose-migrate footers
- Finished view: 2 warning footers (must-not-use-two-devices,
  using-on-two-devices-breaks-encryption)
- Implicit SectionSpacer at ChatStopFailed view also moved out

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 12:32:15 -07:00
another-simple-pixel e2e3958d67 Move SectionTextFooter / Spacer out of cards in 5 screens
Fixes from the user's verified list of misplaced footers/spacers:

- ChatInfoView: SimpleX address footer ("You can share this address
  with your contacts to let them connect with you.") moved out of the
  address SectionView lambda.
- GroupMemberInfoView: same string for member address.
- Appearance: SectionSpacer in the Image-wallpaper branch (after
  "Remove image" button) removed — it created 30dp empty padding
  inside the THEMES card only when a custom image was selected.
- NotificationsSettingsView: Xiaomi battery-optimization footer
  ("Xiaomi devices: please enable Autostart...") moved out of the
  notifications SectionView lambda (visible only on Xiaomi devices
  in Periodic/Service notification mode).
- ConnectMobileView: dropped the 20dp Spacer that sat inside the QR
  SectionView after the developer-tools "Share link" row — visible
  as extra padding below Share link inside the card.

Same pre-card-chrome pattern as other moves: helpers placed inside
SectionView lambdas before PR #6777 rendered fine when SectionView was
a plain Column; after card chrome they render inside the white card.
Moved them outside so footers read as captions and spacers actually
separate cards.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 12:26:37 -07:00
another-simple-pixel f9b4c97d3f Section: bump section item minHeight by 6dp (50 → 56)
User asked for taller settings rows. Bump the default minHeight in
all four SectionItemView family functions from DEFAULT_MIN_SECTION_ITEM_HEIGHT
(50dp) to DEFAULT_MIN_SECTION_ITEM_HEIGHT + 6.dp (56dp).

Scoped to SectionItemView callers only — does not touch the global
DEFAULT_MIN_SECTION_ITEM_HEIGHT constant, so non-section callers
(ChatItemInfoView, ComposeContextProfilePicker, TagListView,
UserPicker) keep the 50dp baseline.

Callers that pass explicit minHeight (e.g. 54dp in GroupChatInfoView
members) are unaffected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 11:57:33 -07:00
another-simple-pixel 0c6ec43a8d Section + Theme: lighten LIGHT canvas to 0.97; revert custom hover overlay
User feedback: the off-white canvas at 0.95 (#F2F2F2) read as too
dark. Two coordinated changes:

- canvasColorForCurrentTheme LIGHT branch: 0.95f → 0.97f. Canvas now
  #F7F7F7 (3% darker than white, was 5%). Still distinct from pure
  white card but lighter.

- Drop the custom sectionItemHover Modifier helper (and its hoverable
  + InteractionSource + background machinery). The reason for the
  custom hover was that the default Material 0.04-alpha ripple hover
  (#F5F5F5 on white card) blended with the old #F2F2F2 canvas. With
  the lighter canvas at #F7F7F7 the default hover #F5F5F5 is now
  visibly darker than canvas (2 units delta) — visible enough at
  Material default without our custom override.

Removed unused MutableInteractionSource and collectIsHoveredAsState
imports.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 11:54:26 -07:00
another-simple-pixel f75bbf9059 Section: suppress hover on rows whose action is an inline control (switch/dropdown)
sectionItemHover used to show on every row inside a section card. But
rows where the action is an inline control (switch via PreferenceToggle,
dropdown via ExposedDropDownSettingRow) are not "interactive as a row"
— the user has to hit the actual control, not the whole row. Showing
hover on the whole row was misleading.

Add `clickable: Boolean = true` param to sectionItemHover; suppress when
false. SectionItemView and SectionItemViewSpaceBetween pass
`clickable = click != null`. SectionItemViewLongClickable keeps the
default (its click is non-nullable, always interactive).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 11:46:41 -07:00
another-simple-pixel 8862e05b7f SocksProxySettings: split UseOnionHosts so the dynamic description footer renders outside the card
UseOnionHosts wrapped its ExposedDropDownSettingRow and a dynamic
SectionTextFooter ("Onion hosts will be used when available." / similar)
in a Column, so when UseOnionHosts was called inside a SectionView
lambda the footer rendered inside the white card.

Split into two composables:
- UseOnionHosts — only the dropdown row (no longer wraps in Column)
- UseOnionHostsDescription — only the dynamic SectionTextFooter,
  called separately by the caller

Shared `onionHostsValues` is now a private @Composable val accessible
to both. In SocksProxySettings, UseOnionHostsDescription is now placed
AFTER the SectionView block (alongside the existing
"Disable onion hosts when not supported" caption) so the dynamic
description reads as a caption below the card.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 10:12:26 -07:00
another-simple-pixel 54ef065589 SocksProxySettings: move section text footers out of SectionView lambdas
Same pre-card-chrome pattern as elsewhere: two SectionTextFooter calls
("Disable onion hosts when not supported" and the proxy-auth footer)
were inside their SectionView lambdas in SocksProxySettings, so after
the card chrome was added they rendered inside the white cards as
inline content. Move both out so they read as captions below the
corresponding cards.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 10:03:13 -07:00
another-simple-pixel aaff2c8455 NetworkAndServers: rewrite UseSocksProxySwitch via SettingsActionItemWithContent
UseSocksProxySwitch was a custom Row with hard-coded horizontal padding
of DEFAULT_PADDING (20dp) — but its neighbours on the messages card are
SettingsActionItem rows that go through SectionItemView with the new
CARD_ITEM_PADDING (15dp). 5dp icon misalignment between the SOCKS
toggle row and the rest, plus no auto-divider underneath since it
wasn't a SectionItemView.

Replace the custom Row with SettingsActionItemWithContent — same
icon + label + DefaultSwitch shape, now wrapped in SectionItemView so
it shares padding and auto-divider with siblings.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 10:02:07 -07:00
another-simple-pixel 5115ac4fe7 RTCServers: wrap Configure ICE servers toggle in SectionView card
Your ICE servers screen had its Configure-ICE toggle and the description
text / editor / read-only display all directly in a raw Column with no
card chrome. Wrap the toggle row in SectionView so it reads as a card
matching the iOS-style facelift. The description text and the
TextEditor / read-only Surface stay in the same loose Column below
(they're a form/display block, not a settings row).

Removed the explicit `padding = PaddingValues()` on the
SectionItemViewSpaceBetween — inside SectionView it inherits
CARD_ITEM_PADDING by default which is what we want now.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:58:57 -07:00
another-simple-pixel dc7f5427fc Section: lighten section item hover overlay from 0.08 to 0.05 alpha
0.08 read as too dark on white cards. Original Compose default 0.04
blended with the off-white canvas (#F2F2F2 vs ~#F5F5F5). 0.05 is the
midpoint — still visibly distinct from canvas (~#F2F2F2 canvas vs
~#F3F3F3 hover on white card) but no longer reads as a heavy box.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:56:52 -07:00
another-simple-pixel 17a6e344f3 Section: suppress sectionItemHover on disabled SectionItemView
sectionItemHover was applied unconditionally inside section cards, so a
disabled row would still show the hover overlay on mouseover —
misleading: the visible interactive feedback contradicts the disabled
state (no click reaction).

Add `enabled: Boolean = true` parameter; the helper now returns `this`
unchanged when `enabled = false`. The 3 SectionItemView family
functions that own a modifier chain pass `enabled = !disabled`.
SectionItemViewWithoutMinPadding inherits through SectionItemView delegation.

Non-clickable info rows (click == null but disabled = false) still get
the hover overlay — that's intentional cursor feedback matching iOS
Settings behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:53:29 -07:00
another-simple-pixel f223267687 Section: replace deprecated RippleTheme override with modern Modifier.hoverable + background
Drop SectionRippleTheme/RippleAlpha/LocalRippleTheme machinery (deprecated
in newer Compose Material, would not compile with the project's warnings-
as-errors policy without DEPRECATION_ERROR suppress, which is a code
smell). Replace with a Modifier.hoverable + Modifier.background pattern —
the modern Compose-native way to apply a hover overlay:

- New private @Composable Modifier.sectionItemHover() that:
  - returns Modifier as-is outside SectionView card (LocalInSectionCard = false)
  - inside a card, attaches its own MutableInteractionSource via .hoverable()
    and paints a transparent or onBackground@0.08-alpha background based on
    collectIsHoveredAsState

- Applied alongside .sectionItemDivider() in each SectionItemView modifier
  chain. Click ripple keeps coming from Modifier.clickable's own indication
  (default ripple, no changes there).

- Drop @file:Suppress deprecation lines; drop SectionRippleTheme object;
  drop ripple imports; drop LocalRippleTheme from CompositionLocalProvider
  calls in three SectionView variants.

Visual result identical to the previous attempt (hovered row gets a visible
gray overlay on LIGHT canvas), no deprecated APIs, no warnings-as-errors
fight. Click ripple unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:46:55 -07:00
another-simple-pixel acf47cbcb4 Section: also suppress DEPRECATION_ERROR — RippleTheme is @Deprecated(level=ERROR)
Previous attempt (4bf981a6b) suppressed DEPRECATION but the Compose
library deprecated RippleTheme with level=DeprecationLevel.ERROR, which
requires the DEPRECATION_ERROR suppression key instead. Add both so
either severity is covered.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:44:16 -07:00
another-simple-pixel 4bf981a6b9 Section: suppress RippleTheme deprecation warnings (build was treating warnings as errors)
`androidx.compose.material.ripple.RippleTheme` and `LocalRippleTheme`
were deprecated in newer Compose Material in favor of the modern
Indication APIs. Our SectionRippleTheme override (a5b199660) hit those
deprecations and the project's Kotlin compiler flags treat warnings as
errors, breaking the build.

Add `@file:Suppress("DEPRECATION")` to Section.kt — narrow file-level
scope. Modern Indication-based ripple migration is a separate, larger
concern; suppress for now so the section hover-alpha override keeps
working.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:40:14 -07:00
another-simple-pixel 8f434477b2 ConnectMobileView: move footer + spacer out of "this device name" SectionView lambda
Same pre-card-chrome pattern: SectionTextFooter and SectionDividerSpaced
were inside the SectionView around DeviceNameField + multicast toggle,
so they rendered inside the white card after PR #6777 — visible as an
extra empty padding below the "Discoverable via local network" toggle
(the SectionDividerSpaced 10dp Spacer inside the card).

Move both outside the SectionView so the footer reads as caption below
the card and the spacer separates this card from the next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:34:35 -07:00
another-simple-pixel c61ea01092 WelcomeView: wrap Create profile action button in SectionView card
The Create profile action SettingsActionItem at the bottom of the
Create profile screen was loose on canvas. Wrap in SectionView so it
reads as a single-item card matching the iOS-style facelift. The two
SectionTextFooter captions below stay outside the card.

Added missing `import SectionView`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:33:22 -07:00
another-simple-pixel 58eeb66281 UserAddressView: move "contacts remain connected" footer out; pad welcome message field; wrap Save in card
Three SimpleX address fixes:
- "Your contacts will remain connected" SectionTextFooter moved out of
  the DeleteAddressButton SectionView (was rendering inside the card).
- Address settings > welcome message field gets 10dp vertical
  contentPadding on its SectionView so the TextEditor doesn't sit flush
  against the card top/bottom.
- Address settings > Save action wrapped in its own SectionView so it
  reads as a single-item card.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:31:31 -07:00
another-simple-pixel c25f36a900 TagListView: wrap Add/Save list button in SectionView card
The "Add to list" / "Save list" action button in TagListEditor (opened
from chatlist "+" Add list) was a loose SectionItemView on the canvas
with no card chrome. Wrap in SectionView so it reads as a single-item
card. ChatTagInput stays as a form field above.

Added missing `import SectionView`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:27:52 -07:00
another-simple-pixel 4d9319d12a AddGroupView/AddChannelView: wrap action buttons + toggles in SectionView card
In Create group and Create public channel screens the action buttons
(Create / Configure relays) and incognito toggle were rendered as loose
SectionItemViews on the gray canvas with no card chrome. Wrap them in
SectionView so they read as a single card matching the iOS-style facelift.
The display-name input above and the descriptive footer below stay
outside the card (text input keeps its own padding, footer reads as
caption).

Added missing `import SectionView` in AddGroupView.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:26:23 -07:00
another-simple-pixel 3a9ece8d1e NewChatSheet: render filtered contact list inside SectionView card
The "Contacts" header was a SectionView with empty content lambda, and
the actual contact rows were rendered as separate LazyColumn items
OUTSIDE the SectionView — so they sat on canvas without card chrome.

Move filteredContactChats.forEachIndexed { ContactListNavLinkView }
INSIDE the SectionView lambda in both OneHandLazyColumn and
NonOneHandLazyColumn so the contacts read as a single card matching
the iOS-style facelift.

Same trade-off as GroupChatInfoView members fix (fa29bb7a): lazy
rendering of contact rows replaced with eager composition inside a
Column. For typical contact lists (<100) imperceptible; very long
lists may compose slower on open.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:24:35 -07:00
another-simple-pixel b187cf1f85 GroupChatInfoView: move chat-ttl footer caption out of SectionView lambda
Same pre-card-chrome pattern as ChatInfoView (fixed in b1a1dad8):
SectionTextFooter("Delete chat messages from your device.") sat inside
the SectionView around ChatTTLOption, so it rendered inside the white
card after PR #6777 added card chrome. Move it out so the caption sits
below the card iOS-style.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:16:29 -07:00
another-simple-pixel 772d4f04e2 ServersSummaryView: wrap "Showing info for" dropdown in SectionView card
The user-selection ExposedDropDownSettingRow at the top of the
servers info screen was rendered loose on the canvas with no card
chrome. Wrap in SectionView so it reads as a card matching the rest
of the screen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:15:03 -07:00
another-simple-pixel 4137234086 Appearance + Customize theme: bring loose items into cards, drop spurious spacer
Four small fixes on the same theme-related screens:

- Move "Customize theme" SectionItemView INSIDE the THEMES SectionView
  in AppearanceView so it sits in the same card as Color mode / Dark
  mode colors with an auto-divider above it.
- Wrap WallpaperPresetSelector (theme slots + chat preview) and the
  conditional Remove-image button in CustomizeThemeView with a
  SectionView so they read as a card, matching the Appearance themes
  card pattern. Add a SectionDividerSpaced after.
- Drop SectionSpacer() that sat between the Wallpaper tint row and the
  Sent message row inside WallpaperSetupView — auto-divider on the
  Wallpaper tint SectionItemView already provides separation; the
  30dp spacer rendered as extra empty padding inside the card.
- Wrap the Reset colors action in a single-item SectionView so it
  reads as its own card, matching the export/import card below.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:14:08 -07:00
another-simple-pixel 753b366b08 Appearance: fix Transparency truncation and SettingsActionItem horizontal padding
Two layout regressions from earlier facelift commits where slider/item
math assumed DEFAULT_PADDING (20dp) for inner card padding, but the
facelift uses CARD_PADDING (16dp outer) + CARD_ITEM_PADDING (15dp inner)
= 31dp per side instead of 20dp.

- Slider widthIn calc in AppToolbarsSection and MessageShapeSection
  used (maxWidth - DEFAULT_PADDING * 2) so the slider was ~22dp wider
  than it should be, shrinking the label Box (weight 1f) and clipping
  "Transparency" to "Transparenc". Switched to
  (CARD_PADDING + CARD_ITEM_PADDING) * 2.
- SettingsActionItemWithContent explicitly passed
  PaddingValues(horizontal = DEFAULT_PADDING) to its SectionItemView,
  overriding the new CARD_ITEM_PADDING default. That made any row using
  SettingsPreferenceItem/SettingsActionItem sit 5dp further inset than
  rows using plain SectionItemViewWithoutMinPadding — visible as a left
  indent on "Tail" relative to "Corner". Replaced with CARD_ITEM_PADDING
  so it matches.

Removed `private` from CARD_PADDING and CARD_ITEM_PADDING in Section.kt
to allow imports from other files (used the same way as SectionView etc.
are imported individually).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:09:18 -07:00
another-simple-pixel 1d978fb2e0 NetworkAndServers: move ConditionsButton into operators card; wrap Save servers in its own card
- "Review conditions" (ConditionsButton — a bare SectionItemView) was
  rendered between the operators card and the messages card on the
  canvas without card chrome. Move it inside the operators SectionView
  lambda after the operator rows, so it shares the card and gets a
  2dp auto-divider above it separating it from the operator list.
- "Save servers" (a bare SectionItemView further down) is now wrapped
  in its own SectionView so it reads as a single-item card matching
  the iOS-style facelift of the rest of the screen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:03:52 -07:00
another-simple-pixel 20daf4b4eb ProtocolServerView: pad CustomServer address field inside its card
The TextEditor (144dp tall input) sat flush against the top and bottom
edges of its containing SectionView card on the New server screen.
Pass padding = PaddingValues(vertical = DEFAULT_PADDING_HALF) to the
SectionView so the field gets 10dp of breathing room top and bottom
inside the card.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 09:01:41 -07:00
another-simple-pixel a5b1996605 Section: bump hover ripple alpha to 0.08 on LIGHT theme for visibility against canvas
Default Compose Material 1 RippleTheme uses hoveredAlpha=0.04 for LIGHT,
producing a Black·0.04 overlay (~#F5F5F5) on white cards — visually 3
units per channel away from the off-white canvas (~#F2F2F2), so the
hover state blends into the canvas and the row looks unfocused.

Add a section-local SectionRippleTheme that mirrors Material's defaults
for everything except hoveredAlpha on LIGHT (raised to 0.08 → ~#EBEBEB
overlay, ~7 units delta from canvas — visibly distinct). Dark themes
keep Material defaults since their hover contrast is already adequate.

Provided via CompositionLocalProvider in all three SectionView variants
alongside LocalInSectionCard, so it scopes only to section card items.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:58:58 -07:00
another-simple-pixel 3e3d092ee9 Section: fix item divider position — paint via drawWithContent at full row bottom
8050676b moved sectionItemDivider() AFTER clickable.padding() in the
modifier chain to make the line paint on top of clickable's hover
indication. Side effect: drawBehind then saw the size of the
padding-reduced content area, not the full row, so dividers rendered
15dp ABOVE the actual row bottom (in the middle of the row's bottom
padding zone) instead of at the row edge between adjacent items.

Fix: keep sectionItemDivider() in the modifier val BEFORE clickable/
padding (so size = full row outer bounds) AND switch from drawBehind
to drawWithContent { drawContent(); drawLine(...) } so the line is
painted AFTER the chain's content + hover indication draw. Both
goals satisfied: divider sits at the true row bottom AND paints on
top of hover overlay.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:48:56 -07:00
another-simple-pixel a6bb45fb8d Appearance: add missing SectionDivider import
f922d8fc introduced SectionDivider() call in the themes card but forgot
to add the per-symbol import. SectionView/SectionDividerSpaced etc. in
this codebase are imported individually (Section.kt declares them at
top level, not inside a package), so SectionDivider needs its own
import line.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:41:33 -07:00
another-simple-pixel 9d94fa2048 ServersSummaryView: wrap Message reception sections in SectionView card
SubscriptionsSectionView and SMPSubscriptionsSection both rendered their
InfoRows + control item in a plain Column without card chrome — so on
the Servers info screen the "Message reception" section title sat above
loose rows on the gray canvas (no card), inconsistent with the rest of
the screen. Wrap the inner Column in SectionView so the rows get the
raised iOS-style card look. The custom header Row (title + subscription
status indicator) stays outside the card so the icon stays inline with
the title text.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:30:38 -07:00
another-simple-pixel c7a6a281c9 ChatInfoView: move E2E encryption card spacer out of SectionView lambda
Same pre-card-chrome pattern: SectionDividerSpaced was inside the
single-row SectionView around the InfoRow, so after PR #6777 added
card chrome it rendered as a white gap inside the card (under the
auto-divider on the InfoRow), producing the "extra divider + gap"
the user reported.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:27:47 -07:00
another-simple-pixel fa29bb7a71 GroupChatInfoView: render group members inside the same SectionView card as owner
Previously the members card showed only the current user (owner) and the
add-members button — the actual group members were rendered as separate
LazyColumn items() OUTSIDE the SectionView, so they sat on the gray
canvas without card chrome. Visually inconsistent: owner in a card,
everyone else floating.

Move filteredMembers.value.forEach { ... } INSIDE the SectionView lambda
so every member row is part of the same card as the owner. Drop the
explicit Divider() call (auto-divider handles it now). Move remember
key to member.groupMemberId so per-member state survives reorders.

Trade-off: lazy rendering of member rows is replaced with eager
composition inside a Column. For typical groups (<100 members) this is
imperceptible; very large groups may compose slower on open. Watching
for reports.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:26:42 -07:00
another-simple-pixel 75006897e3 ChatWallpaperEditor: wrap loose params in SectionView cards
In ChatInfo > Chat theme screen the wallpaper preset selector, the
wallpaper setup controls, the reset/set-default buttons and the
"Apply to" mode dropdown were rendered as loose composables on a gray
canvas — no card chrome, inconsistent with the rest of Appearance.

Wrap them in SectionView so they read as raised iOS-style cards:
- wallpaper preset selector + setup view → one card
- reset-to-global + set-default buttons → one card
- (advanced mode) Apply-to dropdown → one card
- (collapsed mode) Advanced-settings button → one card

CustomizeThemeColorsSection and ImportExportThemeSection were already
SectionView-wrapped and remain unchanged. UserWallpaperEditor (sister
function with similar layout, lines 28-220) is intentionally left
alone — user reported only the chat-theme entry point.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:23:22 -07:00
another-simple-pixel b1a1dad88e ChatInfoView: move chat-ttl footer caption out of SectionView lambda
Same pre-card-chrome pattern: SectionTextFooter("Delete chat messages
from your device.") was inside the ChatTTLOption SectionView lambda, so
after PR #6777 added card chrome it rendered inside the card. Move it
out so the caption sits below the card iOS-style.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:11:58 -07:00
another-simple-pixel b186b5b012 DeveloperView: move card footer/bottom-spacer out of SectionView lambdas
Same pre-card-chrome pattern as NetworkAndServers: SectionTextFooter
("Show: Database IDs and Transport isolation...") and SectionBottomSpacer
were inside SectionView lambdas, so after PR #6777 added card chrome they
rendered inside the white card area — the footer caption sat inside the
first card and the 48dp bottom spacer appeared as an empty row at the
end of the deprecated-options card (after SimpleX links).

Move both out of the SectionView lambda so the footer reads as a caption
below the first card and the bottom spacer adds safe-area room after the
deprecated-options card (not inside it).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:10:26 -07:00
another-simple-pixel 26e95789be NetworkAndServers: move messages card footer/spacer out of SectionView
Before PR #6777 SectionView had no card chrome, so SectionTextFooter and
SectionDividerSpaced placed inside its content lambda rendered as plain
inline content. After the card chrome was added, the same code rendered
the footer caption and the spacer INSIDE the white card area, producing
an unwanted gap (and visible auto-divider tail) under Advanced network
settings.

Move both out of the SectionView lambda so the footer reads as a caption
below the card (iOS-style) and the spacer separates this card from the
next one.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:06:14 -07:00
another-simple-pixel 978f9a458f Appearance: symmetric vertical padding around profile avatar row
ProfileImageSection's Row had Modifier.padding(top = 10.dp), giving 10dp
above the avatar and 0dp below — visibly asymmetric inside the card.
Changed to vertical = 10.dp so top and bottom padding match.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 08:00:22 -07:00
another-simple-pixel f922d8fcd6 Section: repurpose SectionDivider() as explicit 2dp canvas-color line; use in Appearance themes card
SectionDivider() composable had 0 callsites and used Material Divider
with horizontal inset (unused legacy). Repurposed to draw a 2dp
canvas-color Box matching the auto-divider style used by
SectionItemView, gated by LocalInSectionCard so it no-ops outside a
section card.

Use it in Appearance themes card between WallpaperPresetSelector
(custom composable, not a SectionItemView, so no auto-divider) and the
following content (Remove image / Color mode / Dark mode), providing
the visual separator the user expects between the theme grid and the
rows below it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 07:59:30 -07:00
another-simple-pixel 10125572f2 Appearance: drop redundant 10dp spacer between Apply-to row and wallpaper preview
Before section facelift the spacer separated the Apply-to row from the
wallpaper preview block visually. With the new 2dp item divider drawing
under the Apply-to row that separation is already provided, and the spacer
leaves an awkward white gap between the divider and the preview.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 07:56:28 -07:00
another-simple-pixel 92fb07ca68 Section: trim section item horizontal padding to 15dp
CARD_PADDING (16dp) still drives outer card margin from screen edge.
Item content inside the card now uses CARD_ITEM_PADDING = CARD_PADDING - 1.dp,
giving the row text a slightly tighter horizontal inset that reads
better at the current card width.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 07:52:40 -07:00
another-simple-pixel 8050676bb7 Section: paint item divider on top of clickable's hover indication
Previously sectionItemDivider() was inside the modifier val before
clickable, so the hover background drew over it inconsistently — on
hover the row's content area got a tinted overlay while the 2dp
divider area stayed at canvas color, creating visible contrast that
read as a "dark line below hovered row".

Moving the modifier to the end of the chain (after clickable+padding)
makes drawBehind paint after the hover indication, so the divider
color is consistently #F2F2F2-ish regardless of hover state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 07:43:17 -07:00
another-simple-pixel aeb48d522e Section facelift: LIGHT canvas swap, equal padding, 2dp item dividers
- LIGHT canvas (themedBackground) now paints the off-white formula
  (bg.mixWith(onBackground, 0.95f)) so white cards read as raised.
  DARK/BLACK keep palette bg (cards already raised via founder's
  formula in Section.kt). SIMPLEX keeps its gradient.
- Section cards in LIGHT switch from formula to pure white via
  Color.White. DARK/BLACK keep the formula, unchanged.
- Section card horizontal padding equalized to 16dp on outer + inner
  for clean canvas-edge alignment. extraPadding (icon-indented rows)
  keeps DEFAULT_PADDING * 1.7f.
- 2dp dividers between rows inside section cards, color matches the
  per-theme canvas (SIMPLEX uses gradient bottom stop). Implemented via
  Modifier.drawBehind on each SectionItemView, gated by a private
  LocalInSectionCard CompositionLocal set true only by SectionView's
  inner Column — standalone SectionItemView usage (alerts, pickers)
  stays unaffected. Single canvas helper canvasColorForCurrentTheme()
  in Theme.kt is the source of truth for both canvas paint and divider
  color.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 07:25:29 -07:00
Evgeny @ SimpleX Chat 54f890ad88 Merge branch 'master' into ep/new-design 2026-05-15 09:17:42 +00:00
SimpleX Chat 1491f68cd2 6.5.2: android 349, desktop 143 2026-05-14 16:57:01 +01:00
Evgeny Poberezkin 0c94f6bf10 6.5.2: ios 332 2026-05-14 16:52:53 +01:00
Evgeny Poberezkin da05273293 ios: update core library 2026-05-14 16:00:10 +01:00
Narasimha-sc 4bea161724 ios: hide private notes from share channel picker (#6980)
Companion to #6958 (Android/Desktop). Channel-link "Share via chat"
picker showed Saved Messages, which produced `Failed reading: empty`
on tap because `*<id>` has no branch in `sendRefP`. Add `includeLocal`
flag to `filterChatsToForwardTo` (default true) and to
`ChatItemForwardingView`; `shareChannelPicker` passes false.

Bug #2 from #6958 (button on plain groups) is not present on iOS —
`GroupLinkView.swift:110` already gates by `publicGroup != nil`.
2026-05-14 15:33:55 +01:00