brand: update launcher foreground, feature graphic, auth visuals, brand docs
|
|
@ -72,3 +72,6 @@ docs/img/sam.jpg
|
||||||
ClaudeReport.md
|
ClaudeReport.md
|
||||||
ClaudeReport.md
|
ClaudeReport.md
|
||||||
ClaudeReport.md
|
ClaudeReport.md
|
||||||
|
docs/brand/visual-identity.md
|
||||||
|
docs/brand/asset-system.md
|
||||||
|
docs/brand/visual-identity.md
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.alpha
|
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
|
|
@ -80,7 +79,7 @@ internal fun AuthLogoMark(
|
||||||
painter = painterResource(R.drawable.ic_launcher_foreground),
|
painter = painterResource(R.drawable.ic_launcher_foreground),
|
||||||
contentDescription = "Closer",
|
contentDescription = "Closer",
|
||||||
contentScale = ContentScale.Fit,
|
contentScale = ContentScale.Fit,
|
||||||
modifier = Modifier.matchParentSize().alpha(0.96f)
|
modifier = Modifier.matchParentSize()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import androidx.compose.animation.core.Spring
|
||||||
import androidx.compose.animation.core.infiniteRepeatable
|
import androidx.compose.animation.core.infiniteRepeatable
|
||||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
import androidx.compose.animation.core.rememberInfiniteTransition
|
||||||
import androidx.compose.animation.core.tween
|
import androidx.compose.animation.core.tween
|
||||||
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.border
|
import androidx.compose.foundation.border
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
|
@ -27,7 +28,6 @@ import androidx.compose.foundation.layout.width
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Favorite
|
|
||||||
import androidx.compose.material.icons.filled.Person
|
import androidx.compose.material.icons.filled.Person
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
|
|
@ -49,6 +49,7 @@ import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.draw.scale
|
import androidx.compose.ui.draw.scale
|
||||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
@ -57,6 +58,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.lifecycle.SavedStateHandle
|
import androidx.lifecycle.SavedStateHandle
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import app.closer.R
|
||||||
import app.closer.core.navigation.AppRoute
|
import app.closer.core.navigation.AppRoute
|
||||||
import app.closer.domain.repository.AuthRepository
|
import app.closer.domain.repository.AuthRepository
|
||||||
import app.closer.domain.repository.CoupleRepository
|
import app.closer.domain.repository.CoupleRepository
|
||||||
|
|
@ -205,15 +207,14 @@ fun PairingSuccessScreen(
|
||||||
.background(MaterialTheme.colorScheme.background)
|
.background(MaterialTheme.colorScheme.background)
|
||||||
.padding(5.dp)
|
.padding(5.dp)
|
||||||
.clip(CircleShape)
|
.clip(CircleShape)
|
||||||
.background(SettingsPrimary),
|
.background(Color(0xFFFFF8FC)),
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
Icon(
|
Image(
|
||||||
Icons.Filled.Favorite,
|
painter = painterResource(R.drawable.closer_mark_loader),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
tint = SettingsOnPrimary,
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(28.dp)
|
.size(38.dp)
|
||||||
.scale(pulse)
|
.scale(pulse)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 47 KiB |
|
|
@ -66,6 +66,8 @@ This section is only about the artwork used to represent notifications, not noti
|
||||||
| Asset | Use | Source / Target |
|
| Asset | Use | Source / Target |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| Primary app mark | Launcher, favicon, small brand moments | `docs/brand/sources/closer-approved-icon-source.png` |
|
| Primary app mark | Launcher, favicon, small brand moments | `docs/brand/sources/closer-approved-icon-source.png` |
|
||||||
|
| Mark for dark backgrounds | Logo use on aubergine/purple surfaces | `docs/brand/sources/closer-mark-on-dark.svg` |
|
||||||
|
| Mark for light backgrounds | Logo use on blush/white/light surfaces | `docs/brand/sources/closer-mark-on-light.svg` |
|
||||||
| Adaptive foreground | Android launcher layer | `app/src/main/res/drawable/ic_launcher_foreground.xml` |
|
| Adaptive foreground | Android launcher layer | `app/src/main/res/drawable/ic_launcher_foreground.xml` |
|
||||||
| Adaptive background | Android launcher layer | `app/src/main/res/drawable/ic_launcher_background.xml` |
|
| Adaptive background | Android launcher layer | `app/src/main/res/drawable/ic_launcher_background.xml` |
|
||||||
| Monochrome mark | Android themed icon, single-color use | `app/src/main/res/drawable/ic_launcher_monochrome.xml` |
|
| Monochrome mark | Android themed icon, single-color use | `app/src/main/res/drawable/ic_launcher_monochrome.xml` |
|
||||||
|
|
@ -80,6 +82,10 @@ approved pink upper C, lavender lower sweep, heart-shaped inner space, and true
|
||||||
redraw it as a generic `C`, turn the keyhole into a heart, add a key or lock shackle, add faces, add
|
redraw it as a generic `C`, turn the keyhole into a heart, add a key or lock shackle, add faces, add
|
||||||
text inside it, or use it as a reaction emoji.
|
text inside it, or use it as a reaction emoji.
|
||||||
|
|
||||||
|
Keyhole rule: keep the dark keyhole in the official launcher/store icon. Use the white keyhole only
|
||||||
|
when the transparent mark sits directly on dark aubergine/purple. Use the aubergine keyhole on light
|
||||||
|
or blush backgrounds.
|
||||||
|
|
||||||
### 2. App Icons
|
### 2. App Icons
|
||||||
|
|
||||||
| Platform | Required Assets |
|
| Platform | Required Assets |
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 1.5 MiB |
|
|
@ -17,6 +17,8 @@ meeting in one private space; the keyhole represents trust and privacy.
|
||||||
|
|
||||||
- Master mark source: `docs/brand/sources/closer-approved-icon-source.png`
|
- Master mark source: `docs/brand/sources/closer-approved-icon-source.png`
|
||||||
- Transparent mark source: `docs/brand/sources/closer-mark-transparent-keyhole-aubergine.png`
|
- Transparent mark source: `docs/brand/sources/closer-mark-transparent-keyhole-aubergine.png`
|
||||||
|
- Dark-background mark source: `docs/brand/sources/closer-mark-on-dark.svg`
|
||||||
|
- Light-background mark source: `docs/brand/sources/closer-mark-on-light.svg`
|
||||||
- Launcher source: `docs/store/sources/app-icon.svg`
|
- Launcher source: `docs/store/sources/app-icon.svg`
|
||||||
- Android adaptive layers: `app/src/main/res/drawable/ic_launcher_*`
|
- Android adaptive layers: `app/src/main/res/drawable/ic_launcher_*`
|
||||||
- Android notification glyph: `app/src/main/res/drawable-nodpi/ic_notification_closer.png`
|
- Android notification glyph: `app/src/main/res/drawable-nodpi/ic_notification_closer.png`
|
||||||
|
|
@ -27,6 +29,20 @@ Keep the mark visually faithful to the approved artwork. Do not redraw it as a g
|
||||||
the aperture into an `O`, add a padlock shackle, turn the keyhole into a heart, add a separate key,
|
the aperture into an `O`, add a padlock shackle, turn the keyhole into a heart, add a separate key,
|
||||||
or place text inside the icon.
|
or place text inside the icon.
|
||||||
|
|
||||||
|
### Keyhole color
|
||||||
|
|
||||||
|
Use the keyhole color to support contrast without changing the official icon:
|
||||||
|
|
||||||
|
- **Primary app icon / launcher / store icon:** keep the approved dark keyhole. It feels private and
|
||||||
|
premium, and keeps the icon from looking like a generic security app.
|
||||||
|
- **Transparent mark on dark aubergine or purple:** use the white-keyhole variant so the privacy
|
||||||
|
cue stays visible.
|
||||||
|
- **Transparent mark on blush, white, or light UI:** use the aubergine-keyhole variant first; use
|
||||||
|
the black-keyhole variant only when maximum contrast is needed.
|
||||||
|
- **Notification small icon:** use the single-color platform glyph; do not use the full-color
|
||||||
|
launcher art.
|
||||||
|
- **Loading mark:** use the aubergine-keyhole variant on light/card surfaces.
|
||||||
|
|
||||||
## Core colors
|
## Core colors
|
||||||
|
|
||||||
| Role | Color | Hex |
|
| Role | Color | Hex |
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 477 KiB After Width: | Height: | Size: 458 KiB |
|
|
@ -13,7 +13,7 @@
|
||||||
<path d="M0 372c144-62 292-57 449-14 142 39 259 43 358 7 70-25 142-33 217-13v148H0Z" fill="#180C20" opacity=".34"/>
|
<path d="M0 372c144-62 292-57 449-14 142 39 259 43 358 7 70-25 142-33 217-13v148H0Z" fill="#180C20" opacity=".34"/>
|
||||||
<path d="M900 0h124v500H820c31-76 34-154 8-236C800 174 812 88 900 0Z" fill="#F7C8E4" opacity=".08"/>
|
<path d="M900 0h124v500H820c31-76 34-154 8-236C800 174 812 88 900 0Z" fill="#F7C8E4" opacity=".08"/>
|
||||||
|
|
||||||
<image x="68" y="74" width="312" height="312" href="docs/brand/sources/closer-approved-icon-square.png" preserveAspectRatio="xMidYMid slice" filter="url(#markShadow)"/>
|
<image x="68" y="74" width="312" height="312" href="docs/brand/sources/closer-approved-icon-square-white-keyhole.png" preserveAspectRatio="xMidYMid slice" filter="url(#markShadow)"/>
|
||||||
|
|
||||||
<text x="408" y="142" fill="#FFF8FC" font-family="DejaVu Sans" font-size="72" font-weight="700">Closer</text>
|
<text x="408" y="142" fill="#FFF8FC" font-family="DejaVu Sans" font-size="72" font-weight="700">Closer</text>
|
||||||
<text x="412" y="198" fill="#F7C8E4" font-family="DejaVu Sans" font-size="26" font-weight="600">A private space</text>
|
<text x="412" y="198" fill="#F7C8E4" font-family="DejaVu Sans" font-size="26" font-weight="600">A private space</text>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |