diff --git a/.gitignore b/.gitignore index 330d7e8..a736679 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,12 @@ DerivedData/ Packages/ Package.resolved +# Fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output + # macOS .DS_Store *.swp diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..7a118b4 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..87eb440 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,332 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.8) + abbrev (0.1.2) + addressable (2.8.9) + public_suffix (>= 2.0.2, < 8.0) + artifactory (3.0.17) + atomos (0.1.3) + aws-eventstream (1.4.0) + aws-partitions (1.1223.0) + aws-sdk-core (3.243.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal + jmespath (~> 1, >= 1.6.1) + logger + aws-sdk-kms (1.122.0) + aws-sdk-core (~> 3, >= 3.241.4) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.215.0) + aws-sdk-core (~> 3, >= 3.243.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + base64 (0.2.0) + benchmark (0.5.0) + bigdecimal (4.0.1) + claide (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + csv (3.3.5) + declarative (0.0.20) + digest-crc (0.7.0) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.6.20240107) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.112.0) + faraday (1.8.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.8) + faraday (>= 0.8.0) + http-cookie (>= 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.1) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday_middleware (1.2.1) + faraday (~> 1.0) + fastimage (2.4.0) + fastlane (2.232.2) + CFPropertyList (>= 2.3, < 4.0.0) + abbrev (~> 0.1.2) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.197) + babosa (>= 1.0.3, < 2.0.0) + base64 (~> 0.2.0) + benchmark (>= 0.1.0) + bundler (>= 1.17.3, < 5.0.0) + colored (~> 1.2) + commander (~> 4.6) + csv (~> 3.3) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-env (>= 1.6.0, <= 2.1.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + http-cookie (~> 1.0.5) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + logger (>= 1.6, < 2.0) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (>= 2.0.0, < 3.0.0) + mutex_m (~> 0.3.0) + naturally (~> 2.2) + nkf (~> 0.2.0) + optparse (>= 0.1.1, < 1.0.0) + ostruct (>= 0.1.0) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.5) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (~> 3) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.4.1) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.96.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-core (0.18.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 1.9) + httpclient (>= 2.8.3, < 3.a) + mini_mime (~> 1.0) + mutex_m + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + google-apis-iamcredentials_v1 (0.26.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-playcustomapp_v1 (0.17.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-storage_v1 (0.61.0) + google-apis-core (>= 0.15.0, < 2.a) + google-cloud-core (1.8.0) + google-cloud-env (>= 1.0, < 3.a) + google-cloud-errors (~> 1.0) + google-cloud-env (2.1.1) + faraday (>= 1.0, < 3.a) + google-cloud-errors (1.5.0) + google-cloud-storage (1.58.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-core (>= 0.18, < 2) + google-apis-iamcredentials_v1 (~> 0.18) + google-apis-storage_v1 (>= 0.42) + google-cloud-core (~> 1.6) + googleauth (~> 1.9) + mini_mime (~> 1.0) + googleauth (1.11.2) + faraday (>= 1.0, < 3.a) + google-cloud-env (~> 2.1) + jwt (>= 1.4, < 3.0) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.8) + domain_name (~> 0.5) + httpclient (2.9.0) + mutex_m + jmespath (1.6.2) + json (2.19.1) + jwt (2.10.2) + base64 + logger (1.7.0) + mini_magick (4.13.2) + mini_mime (1.1.5) + multi_json (1.19.1) + multipart-post (2.4.1) + mutex_m (0.3.0) + nanaimo (0.4.0) + naturally (2.3.0) + nkf (0.2.0) + optparse (0.8.1) + os (1.1.4) + ostruct (0.6.3) + plist (3.7.2) + public_suffix (7.0.5) + rake (13.3.1) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.3.0) + rexml (3.4.4) + rouge (3.28.0) + ruby2_keywords (0.0.5) + rubyzip (2.4.1) + security (0.1.5) + signet (0.21.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 4.0) + multi_json (~> 1.10) + simctl (1.6.10) + CFPropertyList + naturally + sysrandom (1.0.5) + terminal-notifier (2.0.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.2) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unicode-display_width (2.6.0) + word_wrap (1.0.0) + xcodeproj (1.27.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.4.0) + rexml (>= 3.3.6, < 4.0) + xcpretty (0.4.1) + rouge (~> 3.28.0) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + arm64-darwin-25 + ruby + +DEPENDENCIES + fastlane + +CHECKSUMS + CFPropertyList (3.0.8) sha256=2c99d0d980536d3d7ab252f7bd59ac8be50fbdd1ff487c98c949bb66bb114261 + abbrev (0.1.2) sha256=ad1b4eaaaed4cb722d5684d63949e4bde1d34f2a95e20db93aecfe7cbac74242 + addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485 + artifactory (3.0.17) sha256=3023d5c964c31674090d655a516f38ca75665c15084140c08b7f2841131af263 + atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f + aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b + aws-partitions (1.1223.0) sha256=cdc1b936c2d343c4235f8a0a276bfc27ce17b389b1848a70479b9a686e1f48f3 + aws-sdk-core (3.243.0) sha256=a014eef785124b71d28325783fa422a1512f8421ec9b6e3931c8b0ca3fbb0f1c + aws-sdk-kms (1.122.0) sha256=47ce3f51b26bd7d76f1270cfdfca17b40073ecd3219c8c9400788712abfb4eb8 + aws-sdk-s3 (1.215.0) sha256=15e90b20d985e343cd2cd315c030226b4f8826dd2a031c237cfcd8e0893b01ce + aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00 + babosa (1.0.4) sha256=18dea450f595462ed7cb80595abd76b2e535db8c91b350f6c4b3d73986c5bc99 + base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507 + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7 + claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e + colored (1.2) sha256=9d82b47ac589ce7f6cab64b1f194a2009e9fd00c326a5357321f44afab2c1d2c + colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a + commander (4.6.0) sha256=7d1ddc3fccae60cc906b4131b916107e2ef0108858f485fdda30610c0f2913d9 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + declarative (0.0.20) sha256=8021dd6cb17ab2b61233c56903d3f5a259c5cf43c80ff332d447d395b17d9ff9 + digest-crc (0.7.0) sha256=64adc23a26a241044cbe6732477ca1b3c281d79e2240bcff275a37a5a0d78c07 + domain_name (0.6.20240107) sha256=5f693b2215708476517479bf2b3802e49068ad82167bcd2286f899536a17d933 + dotenv (2.8.1) sha256=c5944793349ae03c432e1780a2ca929d60b88c7d14d52d630db0508c3a8a17d8 + emoji_regex (3.2.3) sha256=ecd8be856b7691406c6bf3bb3a5e55d6ed683ffab98b4aa531bb90e1ddcc564b + excon (0.112.0) sha256=daf9ac3a4c2fc9aa48383a33da77ecb44fa395111e973084d5c52f6f214ae0f0 + faraday (1.8.0) sha256=d1fb776cf25973b7f52a82b625bb0a009fe30ad6021ef838fb9109bf1ea6d029 + faraday-cookie_jar (0.0.8) sha256=0140605823f8cc63c7028fccee486aaed8e54835c360cffc1f7c8c07c4299dbb + faraday-em_http (1.0.0) sha256=7a3d4c7079789121054f57e08cd4ef7e40ad1549b63101f38c7093a9d6c59689 + faraday-em_synchrony (1.0.1) sha256=bf3ce45dcf543088d319ab051f80985ea6d294930635b7a0b966563179f81750 + faraday-excon (1.1.0) sha256=b055c842376734d7f74350fe8611542ae2000c5387348d9ba9708109d6e40940 + faraday-httpclient (1.0.1) sha256=4c8ff1f0973ff835be8d043ef16aaf54f47f25b7578f6d916deee8399a04d33b + faraday-net_http (1.0.2) sha256=63992efea42c925a20818cf3c0830947948541fdcf345842755510d266e4c682 + faraday-net_http_persistent (1.2.0) sha256=0b0cbc8f03dab943c3e1cc58d8b7beb142d9df068b39c718cd83e39260348335 + faraday-patron (1.0.0) sha256=dc2cd7b340bb3cc8e36bcb9e6e7eff43d134b6d526d5f3429c7a7680ddd38fa7 + faraday-rack (1.0.0) sha256=ef60ec969a2bb95b8dbf24400155aee64a00fc8ba6c6a4d3968562bcc92328c0 + faraday_middleware (1.2.1) sha256=d45b78c8ee864c4783fbc276f845243d4a7918a67301c052647bacabec0529e9 + fastimage (2.4.0) sha256=5fce375e27d3bdbb46c18dbca6ba9af29d3304801ae1eb995771c4796c5ac7e8 + fastlane (2.232.2) sha256=978689f60f0fc3d54699de86ef12be4eda9f5b52217c1798965257c390d2b112 + fastlane-sirp (1.0.0) sha256=66478f25bcd039ec02ccf65625373fca29646fa73d655eb533c915f106c5e641 + gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939 + google-apis-androidpublisher_v3 (0.96.0) sha256=9e27b03295fdd2c4a67b5e4d11f891492c89f73beff4a3f9323419165a56d01c + google-apis-core (0.18.0) sha256=96b057816feeeab448139ed5b5c78eab7fc2a9d8958f0fbc8217dedffad054ee + google-apis-iamcredentials_v1 (0.26.0) sha256=3ff70a10a1d6cddf2554e95b7c5df2c26afdeaeb64100048a355194da19e48a3 + google-apis-playcustomapp_v1 (0.17.0) sha256=d5bc90b705f3f862bab4998086449b0abe704ee1685a84821daa90ca7fa95a78 + google-apis-storage_v1 (0.61.0) sha256=b330e599b58e6a01533c189525398d6dbdbaf101ffb0c60145940b57e1c982e8 + google-cloud-core (1.8.0) sha256=e572edcbf189cfcab16590628a516cec3f4f63454b730e59f0b36575120281cf + google-cloud-env (2.1.1) sha256=cf4bb8c7d517ee1ea692baedf06e0b56ce68007549d8d5a66481aa9f97f46999 + google-cloud-errors (1.5.0) sha256=b56be28b8c10628125214dde571b925cfcebdbc58619e598250c37a2114f7b4b + google-cloud-storage (1.58.0) sha256=1bedc07a9c75af169e1ede1dd306b9f941f9ffa9e7095d0364c0803c468fdffd + googleauth (1.11.2) sha256=7e6bacaeed7aea3dd66dcea985266839816af6633e9f5983c3c2e0e40a44731e + highline (2.0.3) sha256=2ddd5c127d4692721486f91737307236fe005352d12a4202e26c48614f719479 + http-cookie (1.0.8) sha256=b14fe0445cf24bf9ae098633e9b8d42e4c07c3c1f700672b09fbfe32ffd41aa6 + httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8 + jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 + json (2.19.1) sha256=dd94fdc59e48bff85913829a32350b3148156bc4fd2a95a2568a78b11344082d + jwt (2.10.2) sha256=31e1ee46f7359883d5e622446969fe9c118c3da87a0b1dca765ce269c3a0c4f4 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + mini_magick (4.13.2) sha256=71d6258e0e8a3d04a9a0a09784d5d857b403a198a51dd4f882510435eb95ddd9 + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7 + multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8 + mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 + nanaimo (0.4.0) sha256=faf069551bab17f15169c1f74a1c73c220657e71b6e900919897a10d991d0723 + naturally (2.3.0) sha256=459923cf76c2e6613048301742363200c3c7e4904c324097d54a67401e179e01 + nkf (0.2.0) sha256=fbc151bda025451f627fafdfcb3f4f13d0b22ae11f58c6d3a2939c76c5f5f126 + optparse (0.8.1) sha256=42bea10d53907ccff4f080a69991441d611fbf8733b60ed1ce9ee365ce03bd1a + os (1.1.4) sha256=57816d6a334e7bd6aed048f4b0308226c5fb027433b67d90a9ab435f35108d3f + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + plist (3.7.2) sha256=d37a4527cc1116064393df4b40e1dbbc94c65fa9ca2eec52edf9a13616718a42 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c + representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace + retriable (3.3.0) sha256=b6a5a4000a0dc04fcbea0976d5af3bf62c142e8d2d5c85191369ed9ff8bdfe11 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (3.28.0) sha256=0d6de482c7624000d92697772ab14e48dca35629f8ddf3f4b21c99183fd70e20 + ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef + rubyzip (2.4.1) sha256=8577c88edc1fde8935eb91064c5cb1aef9ad5494b940cf19c775ee833e075615 + security (0.1.5) sha256=3a977a0eca7706e804c96db0dd9619e0a94969fe3aac9680fcfc2bf9b8a833b7 + signet (0.21.0) sha256=d617e9fbf24928280d39dcfefba9a0372d1c38187ffffd0a9283957a10a8cd5b + simctl (1.6.10) sha256=b99077f4d13ad81eace9f86bf5ba4df1b0b893a4d1b368bd3ed59b5b27f9236b + sysrandom (1.0.5) sha256=5ac1ac3c2ec64ef76ac91018059f541b7e8f437fbda1ccddb4f2c56a9ccf1e75 + terminal-notifier (2.0.0) sha256=7a0d2b2212ab9835c07f4b2e22a94cff64149dba1eed203c04835f7991078cea + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3 + tty-cursor (0.7.1) sha256=79534185e6a777888d88628b14b6a1fdf5154a603f285f80b1753e1908e0bf48 + tty-screen (0.8.2) sha256=c090652115beae764336c28802d633f204fb84da93c6a968aa5d8e319e819b50 + tty-spinner (0.9.3) sha256=0e036f047b4ffb61f2aa45f5a770ec00b4d04130531558a94bfc5b192b570542 + uber (0.1.0) sha256=5beeb407ff807b5db994f82fa9ee07cfceaa561dad8af20be880bc67eba935dc + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + word_wrap (1.0.0) sha256=f556d4224c812e371000f12a6ee8102e0daa724a314c3f246afaad76d82accc7 + xcodeproj (1.27.0) sha256=8cc7a73b4505c227deab044dce118ede787041c702bc47636856a2e566f854d3 + xcpretty (0.4.1) sha256=b14c50e721f6589ee3d6f5353e2c2cfcd8541fa1ea16d6c602807dd7327f3892 + xcpretty-travis-formatter (1.0.1) sha256=aacc332f17cb7b2cba222994e2adc74223db88724fe76341483ad3098e232f93 + +BUNDLED WITH + 4.0.3 diff --git a/Rosetta.xcodeproj/project.pbxproj b/Rosetta.xcodeproj/project.pbxproj index c7abfe2..aaa9c54 100644 --- a/Rosetta.xcodeproj/project.pbxproj +++ b/Rosetta.xcodeproj/project.pbxproj @@ -264,7 +264,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = QN8Z263QGX; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -280,7 +280,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.rosetta.dev; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -291,6 +291,7 @@ SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; @@ -301,7 +302,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = QN8Z263QGX; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -317,7 +318,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.rosetta.dev; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -328,6 +329,7 @@ SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; diff --git a/Rosetta/DesignSystem/Components/ButtonStyles.swift b/Rosetta/DesignSystem/Components/ButtonStyles.swift index bb6193d..ecaf931 100644 --- a/Rosetta/DesignSystem/Components/ButtonStyles.swift +++ b/Rosetta/DesignSystem/Components/ButtonStyles.swift @@ -27,7 +27,9 @@ struct GlassBackButton: View { .glassEffect(.regular, in: .circle) } else { Circle() - .fill(.ultraThinMaterial) + .fill(.thinMaterial) + .overlay { Circle().strokeBorder(Color.white.opacity(0.18), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.12), radius: 20, y: 8) } } } diff --git a/Rosetta/DesignSystem/Components/GlassCard.swift b/Rosetta/DesignSystem/Components/GlassCard.swift index f229849..596df78 100644 --- a/Rosetta/DesignSystem/Components/GlassCard.swift +++ b/Rosetta/DesignSystem/Components/GlassCard.swift @@ -20,10 +20,12 @@ struct GlassCard: View { content() .glassEffect(.regular, in: RoundedRectangle(cornerRadius: cornerRadius)) } else { + let shape = RoundedRectangle(cornerRadius: cornerRadius, style: .continuous) content() .background { - RoundedRectangle(cornerRadius: cornerRadius) - .fill(.ultraThinMaterial) + shape.fill(.thinMaterial) + .overlay { shape.strokeBorder(Color.white.opacity(0.10), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.10), radius: 16, y: 6) } } } diff --git a/Rosetta/DesignSystem/Components/GlassModifier.swift b/Rosetta/DesignSystem/Components/GlassModifier.swift index 1eb095a..d5455da 100644 --- a/Rosetta/DesignSystem/Components/GlassModifier.swift +++ b/Rosetta/DesignSystem/Components/GlassModifier.swift @@ -3,7 +3,7 @@ import SwiftUI // MARK: - Glass Modifier // // iOS 26+: native .glassEffect API -// iOS < 26: .ultraThinMaterial blur +// iOS < 26: .thinMaterial blur + stroke + shadow struct GlassModifier: ViewModifier { let cornerRadius: CGFloat @@ -20,7 +20,9 @@ struct GlassModifier: ViewModifier { } else { content .background { - shape.fill(.ultraThinMaterial) + shape.fill(.thinMaterial) + .overlay { shape.strokeBorder(Color.white.opacity(0.10), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.10), radius: 16, y: 6) } } } @@ -44,7 +46,9 @@ extension View { } } else { background { - Capsule().fill(.ultraThinMaterial) + Capsule().fill(.thinMaterial) + .overlay { Capsule().strokeBorder(Color.white.opacity(0.10), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.10), radius: 16, y: 6) } } } diff --git a/Rosetta/DesignSystem/Components/GlassModifiers.swift b/Rosetta/DesignSystem/Components/GlassModifiers.swift index 40808fe..66ccb4c 100644 --- a/Rosetta/DesignSystem/Components/GlassModifiers.swift +++ b/Rosetta/DesignSystem/Components/GlassModifiers.swift @@ -3,14 +3,14 @@ import SwiftUI // MARK: - Glass Navigation Bar Modifier /// iOS 26+: native glassmorphism (no explicit background needed). -/// iOS < 26: solid adaptive background. +/// iOS < 26: frosted glass material (Telegram-style). struct GlassNavBarModifier: ViewModifier { func body(content: Content) -> some View { if #available(iOS 26, *) { content } else { content - .toolbarBackground(RosettaColors.Adaptive.background, for: .navigationBar) + .toolbarBackground(.regularMaterial, for: .navigationBar) } } } diff --git a/Rosetta/DesignSystem/Components/RosettaTabBar.swift b/Rosetta/DesignSystem/Components/RosettaTabBar.swift index cff59fc..cf59a43 100644 --- a/Rosetta/DesignSystem/Components/RosettaTabBar.swift +++ b/Rosetta/DesignSystem/Components/RosettaTabBar.swift @@ -134,13 +134,14 @@ struct RosettaTabBar: View { } .background { if #available(iOS 26.0, *) { - // iOS 26+ — liquid glass material for the capsule pill + // iOS 26+ — native liquid glass Capsule() - .fill(.ultraThinMaterial) + .fill(.clear) + .glassEffect(.regular, in: .capsule) } else { - // iOS < 26 — solid dark capsule + // iOS < 26 — frosted glass material (Telegram-style) Capsule() - .fill(TabBarColors.pillBackground) + .fill(.regularMaterial) .overlay( Capsule() .strokeBorder(TabBarColors.pillBorder, lineWidth: 0.5) @@ -181,11 +182,14 @@ struct RosettaTabBar: View { Group { if #available(iOS 26.0, *) { - Capsule().fill(.thinMaterial) + // iOS 26+ — native liquid glass + Capsule().fill(.clear) + .glassEffect(.regular, in: .capsule) .frame(width: width) .offset(x: xOffset) } else { - Capsule().fill(TabBarColors.selectionBackground) + // iOS < 26 — thin frosted glass + Capsule().fill(.thinMaterial) .frame(width: width - 4) .padding(.vertical, 4) .offset(x: xOffset) diff --git a/Rosetta/Features/Chats/ChatDetail/ChatDetailView.swift b/Rosetta/Features/Chats/ChatDetail/ChatDetailView.swift index cb22fc9..c6dd1c6 100644 --- a/Rosetta/Features/Chats/ChatDetail/ChatDetailView.swift +++ b/Rosetta/Features/Chats/ChatDetail/ChatDetailView.swift @@ -89,21 +89,22 @@ struct ChatDetailView: View { private var content: some View { GeometryReader { geometry in ZStack { - RosettaColors.Adaptive.background.ignoresSafeArea() - - tiledChatBackground - .ignoresSafeArea() - messagesList(maxBubbleWidth: max(min(geometry.size.width * 0.72, 380), 140)) } + .overlay { chatEdgeGradients } .safeAreaInset(edge: .bottom, spacing: 0) { composer } - + .background { + ZStack { + RosettaColors.Adaptive.background + tiledChatBackground + } + .ignoresSafeArea() + } .navigationBarTitleDisplayMode(.inline) - .navigationBarBackButtonHidden(true) // скрываем стандартный back, но НЕ навбар + .navigationBarBackButtonHidden(true) .enableSwipeBack() - .toolbarBackground(.visible, for: .navigationBar) - .applyGlassNavBar() - .toolbar { chatDetailToolbar } // твой header тут + .modifier(ChatDetailNavBarStyleModifier()) + .toolbar { chatDetailToolbar } .toolbar(.hidden, for: .tabBar) .task { isViewActive = true @@ -158,7 +159,7 @@ private extension ChatDetailView { } Text(subtitleText) - .font(.system(size: 11, weight: .regular)) + .font(.system(size: 12, weight: .medium)) .foregroundStyle( isTyping || (dialog?.isOnline == true) ? RosettaColors.online @@ -216,6 +217,39 @@ private extension ChatDetailView { RosettaColors.adaptive(light: Color(hex: 0x2C2C2E), dark: Color(hex: 0x2C2C2E)) } + // MARK: - Edge Gradients (Telegram-style) + + /// Top: native SwiftUI Material blur with gradient mask — blurs content behind it. + @ViewBuilder + var chatEdgeGradients: some View { + if #available(iOS 26, *) { + EmptyView() + } else { + VStack(spacing: 0) { + // Telegram-style: dark gradient that smoothly fades content into + // the dark background behind the nav bar pills. + // NOT a material blur — Telegram uses dark overlay, not light material. + LinearGradient( + stops: [ + .init(color: Color.black.opacity(0.85), location: 0.0), + .init(color: Color.black.opacity(0.75), location: 0.2), + .init(color: Color.black.opacity(0.55), location: 0.4), + .init(color: Color.black.opacity(0.3), location: 0.6), + .init(color: Color.black.opacity(0.12), location: 0.78), + .init(color: Color.black.opacity(0.0), location: 1.0), + ], + startPoint: .top, + endPoint: .bottom + ) + .frame(height: 90) + + Spacer() + } + .ignoresSafeArea(edges: .top) + .allowsHitTesting(false) + } + } + /// Tiled chat background with properly scaled tiles (200pt wide) private var tiledChatBackground: some View { Group { @@ -538,7 +572,26 @@ private extension ChatDetailView { .animation(composerAnimation, value: shouldShowSendButton) .animation(composerAnimation, value: isInputFocused) } - .background(Color.clear) + .background { + if #available(iOS 26, *) { + Color.clear + } else { + // Telegram-style: dark gradient below composer → home indicator + VStack(spacing: 0) { + Spacer() + LinearGradient( + colors: [ + Color.black.opacity(0.0), + Color.black.opacity(0.55) + ], + startPoint: .top, + endPoint: .bottom + ) + .frame(height: 34) + } + .ignoresSafeArea(edges: .bottom) + } + } } // MARK: - Bubbles / Glass @@ -575,7 +628,7 @@ private extension ChatDetailView { func glass( shape: ChatGlassShape, strokeOpacity: Double = 0.18, - strokeColor: Color = RosettaColors.Adaptive.border + strokeColor: Color = .white ) -> some View { if #available(iOS 26.0, *) { switch shape { @@ -589,14 +642,21 @@ private extension ChatDetailView { .glassEffect(.regular, in: RoundedRectangle(cornerRadius: radius, style: .continuous)) } } else { + // iOS < 26: frosted glass with stroke + shadow (Figma spec) switch shape { case .capsule: - Capsule().fill(.ultraThinMaterial) + Capsule().fill(.thinMaterial) + .overlay { Capsule().strokeBorder(strokeColor.opacity(strokeOpacity), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.12), radius: 20, y: 8) case .circle: - Circle().fill(.ultraThinMaterial) + Circle().fill(.thinMaterial) + .overlay { Circle().strokeBorder(strokeColor.opacity(strokeOpacity), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.12), radius: 20, y: 8) case let .rounded(radius): - RoundedRectangle(cornerRadius: radius, style: .continuous) - .fill(.ultraThinMaterial) + let r = RoundedRectangle(cornerRadius: radius, style: .continuous) + r.fill(.thinMaterial) + .overlay { r.strokeBorder(strokeColor.opacity(strokeOpacity), lineWidth: 0.5) } + .shadow(color: .black.opacity(0.12), radius: 20, y: 8) } } } @@ -725,6 +785,22 @@ private extension ChatDetailView { }() } +// MARK: - Nav Bar Style (ChatDetail-specific) + +/// ChatDetail uses a transparent nav bar so glass/blur pills float independently. +/// ChatListView & SettingsView keep `.applyGlassNavBar()` with `.regularMaterial`. +private struct ChatDetailNavBarStyleModifier: ViewModifier { + func body(content: Content) -> some View { + if #available(iOS 26, *) { + content + .toolbarBackground(.hidden, for: .navigationBar) + } else { + content + .toolbarBackground(.hidden, for: .navigationBar) + } + } +} + // MARK: - Button Styles private struct ChatDetailGlassPressButtonStyle: ButtonStyle { diff --git a/Rosetta/Features/MainTabView.swift b/Rosetta/Features/MainTabView.swift index 3df49ce..e519884 100644 --- a/Rosetta/Features/MainTabView.swift +++ b/Rosetta/Features/MainTabView.swift @@ -64,6 +64,7 @@ struct MainTabView: View { GeometryReader { geometry in tabPager(availableSize: geometry.size) } + .ignoresSafeArea() if !isChatSearchActive && !isAnyChatDetailPresented { RosettaTabBar( diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 0000000..d8b57e6 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,4 @@ +app_identifier("com.rosetta.messenger") + +apple_id("melissa.james2000@aol.com") +# team_id и itc_team_id не нужны для индивидуального аккаунта — Fastlane определит автоматически diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000..00bdaec --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,69 @@ +default_platform(:ios) + +platform :ios do + + # ─── Автоинкремент build number ─── + desc "Increment build number (CURRENT_PROJECT_VERSION)" + lane :bump_build do + increment_build_number( + xcodeproj: "Rosetta.xcodeproj" + ) + end + + # ─── Инкремент версии (patch/minor/major) ─── + desc "Increment version number. Usage: fastlane bump_version type:patch" + lane :bump_version do |options| + type = options[:type] || "patch" + increment_version_number( + xcodeproj: "Rosetta.xcodeproj", + bump_type: type + ) + end + + # ─── Билд для TestFlight ─── + desc "Build and upload to TestFlight" + lane :beta do + increment_build_number( + xcodeproj: "Rosetta.xcodeproj" + ) + + build_app( + project: "Rosetta.xcodeproj", + scheme: "Rosetta", + export_method: "app-store", + clean: true + ) + + upload_to_testflight( + skip_waiting_for_build_processing: true + ) + end + + # ─── Release в App Store ─── + desc "Build and upload to App Store" + lane :release do |options| + type = options[:type] || "patch" + + increment_version_number( + xcodeproj: "Rosetta.xcodeproj", + bump_type: type + ) + + increment_build_number( + xcodeproj: "Rosetta.xcodeproj" + ) + + build_app( + project: "Rosetta.xcodeproj", + scheme: "Rosetta", + export_method: "app-store", + clean: true + ) + + upload_to_app_store( + force: true, + skip_screenshots: true + ) + end + +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 0000000..0c0f728 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,56 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios bump_build + +```sh +[bundle exec] fastlane ios bump_build +``` + +Increment build number (CURRENT_PROJECT_VERSION) + +### ios bump_version + +```sh +[bundle exec] fastlane ios bump_version +``` + +Increment version number. Usage: fastlane bump_version type:patch + +### ios beta + +```sh +[bundle exec] fastlane ios beta +``` + +Build and upload to TestFlight + +### ios release + +```sh +[bundle exec] fastlane ios release +``` + +Build and upload to App Store + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).