feat: v1.1 — highlight-weighted metering, settings modal, photo viewer, shutter sound control, cleanup

This commit is contained in:
2026-09-09 09:41:55 +07:00
parent e9a9005ef2
commit 09dbc72cce
46 changed files with 1684 additions and 2491 deletions
+23 -1
View File
@@ -5,6 +5,24 @@ export type FrameId = 'none' | 'polaroid' | 'classic-white' | 'cinematic' | 'wal
// 2:3 photo (w/h = 2/3). "full" = current fullscreen behaviour (no ratio crop).
// Wall Frame ignores the ratio (frame + export keep fullscreen as before).
export type AspectRatio = 'full' | '4:3' | '3:2';
// Full-frame metering behaviour. Evaluative = the camera's default whole-scene
// metering (offset 0). Highlight-weighted protects bright areas by underexposing
// (~ -0.7EV) — the camera lib exposes no real metering-mode API, so this is the
// closest honest approximation via the existing EV path.
export type MeterMode = 'evaluative' | 'highlight';
// Camera shutter sound. OS policy may force the click on in some regions;
// there is no native volume control (OFF/ON only).
export type ShutterSound = 'on' | 'off';
// One photo in the in-app session history (recent captures + library exports).
// uri = app-cache JPEG; assetId (when savedToLibrary) = the MediaLibrary asset
// so the trash button can remove the gallery copy too.
export interface PhotoEntry {
id: string;
uri: string;
recipeName: string;
savedToLibrary: boolean;
assetId?: string | null;
}
// w/h of the final upright photo for each non-full choice.
export const ASPECT_RATIO_W_H: Record<Exclude<AspectRatio, 'full'>, number> = {
'4:3': 3 / 4,
@@ -16,12 +34,16 @@ export const ASPECT_RATIO_W_H: Record<Exclude<AspectRatio, 'full'>, number> = {
// cool tint in shade, plus a seasonal atmospheric haze/fog veil.
export type CinemaSeason = 'spring' | 'summer' | 'autumn' | 'winter';
export type BaseFilter = 'classic-neg' | 'classic-chrome' | 'provia' | 'velvia' | 'astia' | 'eterna' | 'monochrome' | 'none';
export interface ColorAdjustments {
exposure: number; // -10 to +10 (mapped to matrix multiplier or offset)
contrast: number; // -10 to +10
saturation: number; // -10 to +10
temperature: number; // 2500 to 10000 (Kelvin)
tint: number; // -10 to +10
wbRed?: number; // Fuji WB fine-tune, Red axis (-9..9) — extra red-channel gain
wbBlue?: number; // Fuji WB fine-tune, Blue axis (-9..9) — extra blue-channel gain
highlight: number; // -10 to +10 (- pulls highlights down / roll, + brightens)
shadow: number; // -10 to +10 (+ lifts shadows, - deepens)
denoise: number; // 0 to 10 (mapped to blur sigma)
@@ -38,7 +60,7 @@ export interface Recipe {
id: string;
name: string;
isCustom?: boolean;
baseFilter: 'classic-neg' | 'provia' | 'velvia' | 'monochrome' | 'none';
baseFilter: BaseFilter;
adjustments: ColorAdjustments;
frameId?: FrameId; // e.g. 'none', 'polaroid', 'classic-white', 'cinematic', 'wallframe'
cinema?: CinemaSeason | null; // seasonal atmosphere grade (optional)