{"id":16889,"date":"2025-03-28T17:23:27","date_gmt":"2025-03-28T17:23:27","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=16889"},"modified":"2025-04-06T11:50:32","modified_gmt":"2025-04-06T11:50:32","slug":"%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/","title":{"rendered":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"630\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image-1024x630.jpg\" alt=\"\" class=\"wp-image-17005\" style=\"width:544px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image-1024x630.jpg 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image-300x185.jpg 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image-768x473.jpg 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image-488x300.jpg 488w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image.jpg 1092w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &#171;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&#187; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &#171;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&#187; \u0438\u0437 \u0444\u043e\u0442\u043e.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430\u0445 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u0442\u0447\u0435\u0442\u043b\u0438\u0432\u043e \u0432\u0438\u0434\u0435\u043d, \u0442\u0430\u043a \u0447\u0442\u043e \u0418\u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0435\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"723\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46-1024x723.png\" alt=\"\" class=\"wp-image-16960\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46-1024x723.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46-300x212.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46-768x542.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46-425x300.png 425w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.55.46.png 1484w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u043c\u0438 \u0418\u0418 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f ChatGPT 4.o-mini, Claude 3.5 (3.7) Sonnet \u0438 Grok 3, \u043d\u0443, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, DeepSeek R1, \u043d\u043e Gemini 1.5 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0432\u0430\u043b \u0445\u043e\u0442\u044f \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439, \u043d\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u043e\u0434.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e Gemini \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0447\u0438\u0442\u0430\u043b \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 ( \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c), \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f Gemini 2.5 Pro Experimental &#8212; &nbsp;\u043c\u0443\u043b\u044c\u0442\u0438\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u0430\u044f, \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c AI, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.30.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"546\" height=\"578\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.30.18.png\" alt=\"\" class=\"wp-image-16954\" style=\"width:268px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.30.18.png 546w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-10.30.18-283x300.png 283w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0430\u043a \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0448\u0430\u043d\u0441\u044b \u043d\u0430 \u0443\u0441\u043f\u0435\u0445.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e&nbsp;<strong>Gemini 2.5 Experimental<\/strong>&nbsp;\u043f\u0440\u0435\u0432\u0437\u043e\u0448\u0435\u043b \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f: \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Figma-\u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 SwiftUI (\u0441\u0442\u0438\u043b\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b) + \u043d\u0435\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0430 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (FlexibleGridView&nbsp;\u0438 \u0434\u0440.). \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u2014 \u0431\u0430\u0437\u0430 \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (REST API). \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430<a href=\"https:\/\/github.com\/BestKora\/HotelGemini2_5\" rel=\"noreferrer noopener\" target=\"_blank\">&nbsp;Github<\/a>.<\/span><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441&nbsp;<strong>Gemini 2.5<\/strong>&nbsp;<strong>Experimental&nbsp;<\/strong>\u0432 Google AI Studio:<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0442\u0435\u043b\u044c \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u043e\u043c\u0435\u0440\u043e\u0432<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"491\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-1024x491.png\" alt=\"\" class=\"wp-image-16956\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-1024x491.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-300x144.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-768x368.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-1536x737.png 1536w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-2048x982.png 2048w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.13.54-2-500x240.png 500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"155\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46-1024x155.png\" alt=\"\" class=\"wp-image-16900\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46-1024x155.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46-300x45.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46-768x116.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46-500x75.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-15.19.46.png 1404w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Experimental<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c SwiftUI \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 \u043e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0430\u0448\u0438\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u041c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong> \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043e\u0442\u0435\u043b\u0435 \u0438 \u043d\u043e\u043c\u0435\u0440\u0435.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>HotelDetailView:<\/strong> \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0442\u0435\u043b\u0435, \u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>AmenitiesView: <\/strong><code>View<\/code>-\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u0445.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>RoomSelectionView:<\/strong> \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441 \u0438\u0445 \u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044f\u043c\u0438 \u0444\u043e\u0442\u043e \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u0445.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>RoomCardView: <\/strong>\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 <code>View<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u043e\u043c\u0435\u0440\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 View:<\/strong> \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<code> ImageCarouselView<\/code> \u0438 <code>SectionRow<\/code>.<\/span><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ MARK: - Data Models\n\nstruct Hotel: Identifiable {\n    let id = UUID()\n    let name: String\n    let rating: Double\n    let ratingName: String\n    let address: String\n    let minimalPrice: Int\n    let priceForIt: String\n    let imageUrls: [String] \/\/ Use image names from Assets or URLs\n    let description: String\n    let peculiarities: [String] \/\/ Like &quot;3-\u044f \u043b\u0438\u043d\u0438\u044f&quot;, &quot;\u041f\u043b\u0430\u0442\u043d\u044b\u0439 Wi-Fi \u0432 \u0444\u043e\u0439\u0435&quot;\n}\n\nstruct Room: Identifiable {\n    let id = UUID()\n    let name: String\n    let price: Int\n    let pricePer: String\n    let peculiarities: [String] \/\/ Like &quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, &quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;\n    let imageUrls: [String]\n}\n\n\n\/\/ MARK: - Content View (Root)\n\nstruct ContentView: View {\n    \/\/ --- MOCK DATA ---\n    \/\/ In a real app, this would come from a ViewModel\/API\n    let sampleHotel = Hotel(\n        name: &quot;Steigenberger Makadi&quot;, \/\/ Updated name based on screenshot 4\n        rating: 5.0,\n        ratingName: &quot;\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e&quot;,\n        address: &quot;Madinat Makadi, Safaga Road, Makadi Bay, \u0415\u0433\u0438\u043f\u0435\u0442&quot;,\n        minimalPrice: 134673,\n        priceForIt: &quot;\u0437\u0430 \u0442\u0443\u0440 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;,\n        imageUrls: [&quot;hotel_placeholder_1&quot;, &quot;hotel_placeholder_2&quot;, &quot;hotel_placeholder_3&quot;, &quot;hotel_placeholder_4&quot;, &quot;hotel_placeholder_5&quot;, &quot;hotel_placeholder_6&quot;, &quot;hotel_placeholder_7&quot;], \/\/ Add your image names\n        description: &quot;\u041e\u0442\u0435\u043b\u044c VIP-\u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0433\u043e\u043b\u044c\u0444 \u043f\u043e\u043b\u044f\u043c\u0438. \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043b\u044f \u0440\u0435\u0441\u043f\u0435\u043a\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u044b\u0445\u0430.&quot;,\n        peculiarities: [&quot;3-\u044f \u043b\u0438\u043d\u0438\u044f&quot;, &quot;\u041f\u043b\u0430\u0442\u043d\u044b\u0439 Wi-Fi \u0432 \u0444\u043e\u0439\u0435&quot;, &quot;30 \u043a\u043c \u0434\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430&quot;, &quot;1 \u043a\u043c \u0434\u043e \u043f\u043b\u044f\u0436\u0430&quot;]\n    )\n\n     let sampleRooms = [\n        Room(name: &quot;\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u0431\u0430\u0441\u0441\u0435\u0439\u043d \u0438\u043b\u0438 \u0441\u0430\u0434&quot;, price: 186600, pricePer: &quot;\u0437\u0430 7 \u043d\u043e\u0447\u0435\u0439 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;, peculiarities: [&quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, &quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;], imageUrls: [&quot;room1_image1&quot;, &quot;room1_image2&quot;,&quot;room1_image3&quot;,&quot;room1_image4&quot;]),\n        Room(name: &quot;\u041b\u044e\u043a\u0441 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u043c\u043e\u0440\u0435&quot;, price: 250000, pricePer: &quot;\u0437\u0430 7 \u043d\u043e\u0447\u0435\u0439 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;, peculiarities: [&quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, &quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;, &quot;\u041c\u0438\u043d\u0438-\u0431\u0430\u0440&quot;], imageUrls: [&quot;suite1_image1&quot;, &quot;suite1_image2&quot;, &quot;suite1_image3&quot;])\n        \/\/ Add more rooms\n    ]\n    \/\/ --- ---\n\n    var body: some View {\n        NavigationView {\n            HotelDetailView(hotel: sampleHotel, rooms: sampleRooms)\n        }\n        \/\/ Optional: Use .accentColor for global tint if needed\n        \/\/ .accentColor(.blue)\n    }\n}\n\n\/\/ MARK: - Hotel Detail View\n\nstruct HotelDetailView: View {\n    let hotel: Hotel\n    let rooms: [Room] \/\/ Pass rooms data for navigation\n\n    @State private var selectedImageIndex = 0\n\n    var body: some View {\n        ScrollView {\n            VStack(alignment: .leading, spacing: 8) {\n                \/\/ --- Section 1: Image Carousel, Basic Info ---\n                VStack(alignment: .leading, spacing: 16) {\n                    ImageCarouselView(imageUrls: hotel.imageUrls, \n                                      selectedIndex: $selectedImageIndex)\n                        .frame(height: 250) \/\/ Adjust height as needed\n                        .clipShape(RoundedRectangle(cornerRadius: 15)) \/\/ Rounded corners\n\n                    HStack(spacing: 4) {\n                        Image(systemName: &quot;star.fill&quot;)\n                            .foregroundColor(.orange)\n                        Text(&quot;\\(hotel.rating, specifier: &quot;%.1f&quot;) \\(hotel.ratingName)&quot;)\n                            .foregroundColor(.orange)\n                            .font(.system(size: 16, weight: .medium))\n                    }\n\n                    Text(hotel.name)\n                        .font(.system(size: 22, weight: .medium))\n\n                    Button {\n                        \/\/ Action for address tap if needed (e.g., open map)\n                        print(&quot;Address tapped&quot;)\n                    } label: {\n                        Text(hotel.address)\n                            .font(.system(size: 14, weight: .medium))\n                            .foregroundColor(.blue) \/\/ Link-like appearance\n                    }\n\n                    HStack(alignment: .bottom, spacing: 8) {\n                         Text(&quot;\u043e\u0442 \\(hotel.minimalPrice) \u20bd&quot;)\n                            .font(.system(size: 30, weight: .semibold))\n                         Text(hotel.priceForIt.lowercased())\n                            .font(.system(size: 16, weight: .regular))\n                            .foregroundColor(.secondary)\n                            .padding(.bottom, 4) \/\/ Align baseline better\n                    }\n\n                }\n                .padding(.horizontal)\n                .padding(.vertical, 8) \/\/ Add some vertical padding\n                .background(Color.white) \/\/ White background for this section\n                .cornerRadius(15) \/\/ Rounded corners for the section\n\n\n                 \/\/ --- Section 2: About the Hotel ---\n                 VStack(alignment: .leading, spacing: 16) {\n                    Text(&quot;\u041e\u0431 \u043e\u0442\u0435\u043b\u0435&quot;)\n                        .font(.system(size: 22, weight: .medium))\n\n                    \/\/ Peculiarities (Tags)\n                    FlexibleGridView(data: hotel.peculiarities) { item in\n                        Text(item)\n                            .font(.system(size: 16, weight: .medium))\n                            .foregroundColor(.gray)\n                            .padding(.horizontal, 10)\n                            .padding(.vertical, 5)\n                            .background(Color(UIColor.systemGray6)) \/\/ Tag background\n                            .cornerRadius(5)\n                    }\n\n\n                    Text(hotel.description)\n                         .font(.system(size: 16, weight: .regular))\n\n                    \/\/ --- Detail Buttons ---\n                    VStack(spacing: 0) {\n                         NavigationLink(destination: AmenitiesView()) { \/\/ Navigate to Amenities\n                             SectionRow(iconName: &quot;face.smiling&quot;,\n                                        title: &quot;\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;,\n                                        subtitle: &quot;\u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435&quot;)\n                         }\n                         Divider().padding(.leading, 45) \/\/ Indent divider\n                         SectionRow(iconName: &quot;checkmark.circle&quot;,\n                                    title: &quot;\u0427\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, \n                                    subtitle: &quot;\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438&quot;)\n                         Divider().padding(.leading, 45)\n                         SectionRow(iconName: &quot;xmark.circle&quot;, \n                                    title: &quot;\u0427\u0442\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, \n                                    subtitle: &quot;\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438&quot;)\n                    }\n                    .background(Color(UIColor.systemGray6))\n                    .cornerRadius(15)\n                    .padding(.top) \/\/ Add space before buttons\n\n\n                 }\n                 .padding(.horizontal)\n                 .padding(.vertical, 8)\n                 .background(Color.white)\n                 .cornerRadius(15)\n                 .padding(.top, 8) \/\/ Space between sections\n\n\n            } \/\/ End Main VStack\n        } \/\/ End ScrollView\n        .background(Color(UIColor.systemGray6).ignoresSafeArea()) \/\/ Background for the whole screen\n        .navigationBarTitleDisplayMode(.inline) \/\/ Keep title small\n       .toolbar { \/\/ Hide the default back button text\n            ToolbarItem(placement: .principal) {\n                 Text(hotel.name) \/\/ Or just &quot;\u041e\u0442\u0435\u043b\u044c&quot;\n                    .font(.system(size: 18, weight: .medium))\n            }\n        }\n        .safeAreaInset(edge: .bottom) {\n             \/\/ --- Bottom Button ---\n             NavigationLink(destination: \n                  RoomSelectionView(hotelName: hotel.name, rooms: rooms)) {\n                  Text(&quot;\u041a \u0432\u044b\u0431\u043e\u0440\u0443 \u043d\u043e\u043c\u0435\u0440\u0430&quot;)\n                     .font(.system(size: 16, weight: .medium))\n                     .foregroundColor(.white)\n                     .frame(maxWidth: .infinity)\n                     .padding()\n                     .background(Color.blue)\n                     .cornerRadius(15)\n             }\n             .padding(.horizontal)\n             .padding(.top, 8) \/\/ Add space above button\n             .background( \/\/ Add a white background behind the button area\n                 Color.white\n                    .ignoresSafeArea(edges: .bottom) \/\/ Extend white to screen bottom edge\n             )\n         }\n    }\n}\n\n\/\/ MARK: - Image Carousel View\n\nstruct ImageCarouselView: View {\n    let imageUrls: [String]\n    @Binding var selectedIndex: Int\n\n    var body: some View {\n        TabView(selection: $selectedIndex) {\n            ForEach(0..&lt;imageUrls.count, id: \\.self) { index in\n                Image(imageUrls[index]) \/\/ Assumes images are in Assets\n                    .resizable()\n                    .scaledToFill()\n                    \/\/ .aspectRatio(contentMode: .fill) \/\/ Alternative scaling\n                    .tag(index)\n                    \/\/ Add error handling\/placeholder if needed\n                    .overlay{\n                        VStack {\n                            Spacer()\n                            HStack {\n                                Spacer()\n                                Text(&quot;\\(index + 1) \/ \\(imageUrls.count)&quot;)\n                                    .bold()\n                                    .foregroundStyle(Color.white)\n                                    .padding(.horizontal, 45)\n                            }\n                            .padding()\n                        }\n                    }\n            }\n        }\n        .tabViewStyle(.page(indexDisplayMode: .never)) \/\/ Hide default dots\n        .overlay(\n            \/\/ Custom Pagination Dots\n            HStack(spacing: 8) {\n                ForEach(0..&lt;imageUrls.count, id: \\.self) { index in\n                    Circle()\n                        .fill(selectedIndex == index ? Color.black : Color.gray.opacity(0.7))\n                        .frame(width: 7, height: 7)\n                }\n            }\n            .padding(.horizontal, 12)\n            .padding(.vertical, 8)\n            .background(Color.white.opacity(0.9))\n            .cornerRadius(5)\n            .padding(.bottom, 10) \/\/ Position dots from bottom\n            , alignment: .bottom \/\/ Align dots at the bottom\n        )\n    }\n}\n\n\/\/ MARK: - Section Row Helper View\n\nstruct SectionRow: View {\n    let iconName: String\n    let title: String\n    let subtitle: String\n\n    var body: some View {\n        HStack(spacing: 12) {\n            Image(systemName: iconName)\n                .resizable()\n                .scaledToFit()\n                .frame(width: 24, height: 24)\n                .foregroundColor(.primary.opacity(0.9))\n\n            VStack(alignment: .leading) {\n                Text(title)\n                    .font(.system(size: 16, weight: .medium))\n                    .foregroundColor(.primary)\n                Text(subtitle)\n                    .font(.system(size: 14, weight: .regular))\n                    .foregroundColor(.secondary)\n            }\n            Spacer()\n            Image(systemName: &quot;chevron.right&quot;)\n                .foregroundColor(.secondary)\n        }\n        .padding(.horizontal)\n        .padding(.vertical, 10)\n    }\n}\n\n\n\/\/ MARK: - Amenities View (Placeholder)\n\nstruct AmenitiesView: View {\n    var body: some View {\n        ScrollView { \/\/ Make it scrollable in case content grows\n            VStack {\n                 Text(&quot;Details about \u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;)\n                     .padding()\n                 \/\/ Add actual amenity details here (Lists, Grids, etc.)\n                 Spacer()\n            }\n        }\n        .navigationTitle(&quot;\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;) \/\/ Standard navigation title\n        .navigationBarTitleDisplayMode(.inline)\n    }\n}\n\n\/\/ MARK: - Room Selection View\n\nstruct RoomSelectionView: View {\n    let hotelName: String\n    let rooms: [Room]\n\n    var body: some View {\n        ScrollView {\n            VStack(spacing: 8) {\n                ForEach(rooms) { room in\n                    RoomCardView(room: room)\n                }\n            }\n            .padding(.vertical) \/\/ Add padding top\/bottom inside scrollview\n        }\n        .navigationTitle(hotelName) \/\/ Use hotel name as title\n        .navigationBarTitleDisplayMode(.inline)\n        .background(Color(UIColor.systemGray6).ignoresSafeArea()) \/\/ Match background\n    }\n}\n\n\/\/ MARK: - Room Card View\n\nstruct RoomCardView: View {\n    let room: Room\n    @State private var selectedImageIndex = 0 \/\/ Each card manages its own carousel state\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 16) {\n            ImageCarouselView(imageUrls: room.imageUrls, \n                              selectedIndex: $selectedImageIndex)\n                 .frame(height: 200) \/\/ Adjust height\n                 .clipShape(RoundedRectangle(cornerRadius: 15))\n\n            Text(room.name)\n                 .font(.system(size: 22, weight: .medium))\n\n             \/\/ Peculiarities (Tags)\n            FlexibleGridView(data: room.peculiarities) { item in\n                Text(item)\n                    .font(.system(size: 16, weight: .medium))\n                    .foregroundColor(.gray)\n                    .padding(.horizontal, 10)\n                    .padding(.vertical, 5)\n                    .background(Color(UIColor.systemGray6))\n                    .cornerRadius(5)\n            }\n\n             \/\/ Room Price\n             HStack(alignment: .bottom, spacing: 8) {\n                  Text(&quot;\\(room.price) \u20bd&quot;)\n                     .font(.system(size: 30, weight: .semibold))\n                  Text(room.pricePer.lowercased())\n                     .font(.system(size: 16, weight: .regular))\n                     .foregroundColor(.secondary)\n                     .padding(.bottom, 4)\n             }\n\n             \/\/ Choose Room Button\n             Button {\n                 \/\/ Action for selecting THIS specific room\n                 print(&quot;Selected room: \\(room.name)&quot;)\n             } label: {\n                   Text(&quot;\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440&quot;)\n                      .font(.system(size: 16, weight: .medium))\n                      .foregroundColor(.white)\n                      .frame(maxWidth: .infinity)\n                      .padding()\n                      .background(Color.blue)\n                      .cornerRadius(15)\n             }\n\n        }\n        .padding()\n        .background(Color.white)\n        .cornerRadius(15)\n        .padding(.horizontal) \/\/ Add horizontal space between cards and screen edge\n    }\n}\n\n\n\/\/ MARK: - Flexible Grid View (Helper for Tags)\n\nstruct FlexibleGridView&lt;Data: Collection, Content: View&gt;: View where Data.Element: Hashable {\n    let data: Data\n    let spacing: CGFloat\n    let alignment: HorizontalAlignment\n    let content: (Data.Element) -&gt; Content\n    @State private var availableWidth: CGFloat = 0\n\n    init(data: Data, spacing: CGFloat = 8, alignment: HorizontalAlignment = .leading, @ViewBuilder content: @escaping (Data.Element) -&gt; Content) {\n        self.data = data\n        self.spacing = spacing\n        self.alignment = alignment\n        self.content = content\n    }\n\n    var body: some View {\n    ZStack(alignment: Alignment(horizontal: alignment, vertical: .center)) {\n            Color.clear\n                .frame(height: 1)\n                .readSize { size in\n                    availableWidth = size.width\n                }\n\n            _FlexibleGrid(\n                availableWidth: availableWidth,\n                data: data,\n                spacing: spacing,\n                alignment: alignment,\n                content: content\n            )\n        }\n    }\n}\n\nstruct _FlexibleGrid&lt;Data: Collection, Content: View&gt;: View where Data.Element: Hashable {\n    let availableWidth: CGFloat\n    let data: Data\n    let spacing: CGFloat\n    let alignment: HorizontalAlignment\n    let content: (Data.Element) -&gt; Content\n    @State var elementsSize: [Data.Element: CGSize] = [:]\n\n    var body: some View {\n        VStack(alignment: alignment, spacing: spacing) {\n            ForEach(computeRows(), id: \\.self) { rowElements in\n                HStack(spacing: spacing) {\n                    ForEach(rowElements, id: \\.self) { element in\n                        content(element)\n                            .fixedSize()\n                            .readSize { size in\n                                elementsSize[element] = size\n                            }\n                    }\n                }\n            }\n        }\n    }\n\n    func computeRows() -&gt; [[Data.Element]] {\n        var rows: [[Data.Element]] = [[]]\n        var currentRow = 0\n        var remainingWidth = availableWidth\n\n        for element in data {\n            let elementSize = elementsSize[element, default: CGSize(width: availableWidth, height: 1)]\n\n            if remainingWidth - (elementSize.width + spacing) &gt;= 0 {\n                rows[currentRow].append(element)\n            } else {\n                currentRow += 1\n                rows.append([element])\n                remainingWidth = availableWidth\n            }\n            remainingWidth -= (elementSize.width + spacing)\n        }\n        return rows\n    }\n}\n\n\/\/ Helper to read view size\nstruct SizePreferenceKey: PreferenceKey {\n    static var defaultValue: CGSize = .zero\n    static func reduce(value: inout CGSize, nextValue: () -&gt; CGSize) {}\n}\nextension View {\n    func readSize(onChange: @escaping (CGSize) -&gt; Void) -&gt; some View {\n        background(\n            GeometryReader { geometryProxy in\n                Color.clear\n                    .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n            }\n        )\n        .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n    }\n}\n\n#Preview {\n    ContentView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Data Models<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Hotel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> rating: <\/span><span style=\"color: #E5C07B\">Double<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> ratingName: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> address: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> minimalPrice: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> priceForIt: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> imageUrls: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use image names from Assets or URLs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> description: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> peculiarities: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Like &quot;3-\u044f \u043b\u0438\u043d\u0438\u044f&quot;, &quot;\u041f\u043b\u0430\u0442\u043d\u044b\u0439 Wi-Fi \u0432 \u0444\u043e\u0439\u0435&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Room<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> price: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pricePer: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> peculiarities: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Like &quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;, &quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> imageUrls: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Content View (Root)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- MOCK DATA ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ In a real app, this would come from a ViewModel\/API<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> sampleHotel = <\/span><span style=\"color: #61AFEF\">Hotel<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Steigenberger Makadi&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Updated name based on screenshot 4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">rating<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">5.0<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ratingName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">address<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Madinat Makadi, Safaga Road, Makadi Bay, \u0415\u0433\u0438\u043f\u0435\u0442&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">minimalPrice<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">134673<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">priceForIt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0437\u0430 \u0442\u0443\u0440 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">imageUrls<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_1&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_2&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_3&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_4&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_5&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_6&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;hotel_placeholder_7&quot;<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add your image names<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">description<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041e\u0442\u0435\u043b\u044c VIP-\u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0433\u043e\u043b\u044c\u0444 \u043f\u043e\u043b\u044f\u043c\u0438. \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043b\u044f \u0440\u0435\u0441\u043f\u0435\u043a\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u044b\u0445\u0430.&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">peculiarities<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;3-\u044f \u043b\u0438\u043d\u0438\u044f&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;\u041f\u043b\u0430\u0442\u043d\u044b\u0439 Wi-Fi \u0432 \u0444\u043e\u0439\u0435&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;30 \u043a\u043c \u0434\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;1 \u043a\u043c \u0434\u043e \u043f\u043b\u044f\u0436\u0430&quot;<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> sampleRooms = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">Room<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u0431\u0430\u0441\u0441\u0435\u0439\u043d \u0438\u043b\u0438 \u0441\u0430\u0434&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">186600<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">pricePer<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0437\u0430 7 \u043d\u043e\u0447\u0435\u0439 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">peculiarities<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">imageUrls<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;room1_image1&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;room1_image2&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><span style=\"color: #98C379\">&quot;room1_image3&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><span style=\"color: #98C379\">&quot;room1_image4&quot;<\/span><span style=\"color: #ABB2BF\">]),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">Room<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041b\u044e\u043a\u0441 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u043c\u043e\u0440\u0435&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">250000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">pricePer<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0437\u0430 7 \u043d\u043e\u0447\u0435\u0439 \u0441 \u043f\u0435\u0440\u0435\u043b\u0451\u0442\u043e\u043c&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">peculiarities<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;\u041c\u0438\u043d\u0438-\u0431\u0430\u0440&quot;<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">imageUrls<\/span><span style=\"color: #ABB2BF\">: [<\/span><span style=\"color: #98C379\">&quot;suite1_image1&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;suite1_image2&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #98C379\">&quot;suite1_image3&quot;<\/span><span style=\"color: #ABB2BF\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add more rooms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- ---<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HotelDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">hotel<\/span><span style=\"color: #ABB2BF\">: sampleHotel, <\/span><span style=\"color: #61AFEF\">rooms<\/span><span style=\"color: #ABB2BF\">: sampleRooms)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional: Use .accentColor for global tint if needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ .accentColor(.blue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Hotel Detail View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">HotelDetailView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotel: Hotel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> rooms: [Room] <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Pass rooms data for navigation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> selectedImageIndex = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Section 1: Image Carousel, Basic Info ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ImageCarouselView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">imageUrls<\/span><span style=\"color: #ABB2BF\">: hotel.<\/span><span style=\"color: #E06C75\">imageUrls<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                      <\/span><span style=\"color: #61AFEF\">selectedIndex<\/span><span style=\"color: #ABB2BF\">: $selectedImageIndex)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">250<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Adjust height as needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">clipShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rounded corners<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;star.fill&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">orange<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">hotel.<\/span><span style=\"color: #E06C75\">rating<\/span><span style=\"color: #ABB2BF\">, specifier<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;%.1f&quot;<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">hotel.<\/span><span style=\"color: #E06C75\">ratingName<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">orange<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(hotel.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Action for address tap if needed (e.g., open map)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Address tapped&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    } <\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(hotel.<\/span><span style=\"color: #E06C75\">address<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">14<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Link-like appearance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u043e\u0442 <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">hotel.<\/span><span style=\"color: #E06C75\">minimalPrice<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> \u20bd&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">30<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">semibold<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(hotel.<\/span><span style=\"color: #E06C75\">priceForIt<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #56B6C2\">lowercased<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Align baseline better<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add some vertical padding<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ White background for this section<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rounded corners for the section<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Section 2: About the Hotel ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u041e\u0431 \u043e\u0442\u0435\u043b\u0435&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Peculiarities (Tags)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">FlexibleGridView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">: hotel.<\/span><span style=\"color: #E06C75\">peculiarities<\/span><span style=\"color: #ABB2BF\">) { item <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(item)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Tag background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(hotel.description)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Detail Buttons ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">NavigationLink<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">destination<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">AmenitiesView<\/span><span style=\"color: #ABB2BF\">()) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Navigate to Amenities<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">SectionRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iconName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;face.smiling&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                        <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                        <\/span><span style=\"color: #61AFEF\">subtitle<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                         }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">Divider<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">45<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Indent divider<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">SectionRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iconName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;checkmark.circle&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0427\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">subtitle<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">Divider<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">45<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">SectionRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iconName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;xmark.circle&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0427\u0442\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">subtitle<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add space before buttons<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Space between sections<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ End Main VStack<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ End ScrollView<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">ignoresSafeArea<\/span><span style=\"color: #ABB2BF\">()) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Background for the whole screen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Keep title small<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       .<\/span><span style=\"color: #61AFEF\">toolbar<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Hide the default back button text<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ToolbarItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">placement<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">principal<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(hotel.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Or just &quot;\u041e\u0442\u0435\u043b\u044c&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">18<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">safeAreaInset<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edge<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Bottom Button ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #61AFEF\">NavigationLink<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">destination<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #61AFEF\">RoomSelectionView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">hotelName<\/span><span style=\"color: #ABB2BF\">: hotel.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">rooms<\/span><span style=\"color: #ABB2BF\">: rooms)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u041a \u0432\u044b\u0431\u043e\u0440\u0443 \u043d\u043e\u043c\u0435\u0440\u0430&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add space above button<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">( <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add a white background behind the button area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 Color.<\/span><span style=\"color: #E06C75\">white<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">ignoresSafeArea<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edges<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Extend white to screen bottom edge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Image Carousel View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ImageCarouselView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> imageUrls: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> selectedIndex: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">TabView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">selection<\/span><span style=\"color: #ABB2BF\">: $selectedIndex) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">..&lt;imageUrls.count, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { index <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(imageUrls[index]) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Assumes images are in Assets<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">scaledToFill<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ .aspectRatio(contentMode: .fill) \/\/ Alternative scaling<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">tag<\/span><span style=\"color: #ABB2BF\">(index)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add error handling\/placeholder if needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">overlay<\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">index + <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> \/ <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">imageUrls.count<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    .<\/span><span style=\"color: #61AFEF\">bold<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    .<\/span><span style=\"color: #61AFEF\">foregroundStyle<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">45<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">tabViewStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">page<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">indexDisplayMode<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">never<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Hide default dots<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">overlay<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Custom Pagination Dots<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">..&lt;imageUrls.count, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { index <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Circle<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">fill<\/span><span style=\"color: #ABB2BF\">(selectedIndex == index ? Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Color.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.7<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">7<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">7<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.9<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Position dots from bottom<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            , <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Align dots at the bottom<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Section Row Helper View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SectionRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iconName: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> title: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> subtitle: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: iconName)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">scaledToFit<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.9<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(title)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(subtitle)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">14<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;chevron.right&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Amenities View (Placeholder)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AmenitiesView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Make it scrollable in case content grows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Details about \u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add actual amenity details here (Lists, Grids, etc.)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430&quot;<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Standard navigation title<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Room Selection View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">RoomSelectionView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotelName: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> rooms: [Room]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(rooms) { room <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">RoomCardView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">room<\/span><span style=\"color: #ABB2BF\">: room)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add padding top\/bottom inside scrollview<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(hotelName) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use hotel name as title<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">ignoresSafeArea<\/span><span style=\"color: #ABB2BF\">()) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Match background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Room Card View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">RoomCardView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> room: Room<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> selectedImageIndex = <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Each card manages its own carousel state<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ImageCarouselView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">imageUrls<\/span><span style=\"color: #ABB2BF\">: room.<\/span><span style=\"color: #E06C75\">imageUrls<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">selectedIndex<\/span><span style=\"color: #ABB2BF\">: $selectedImageIndex)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">200<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Adjust height<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">clipShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(room.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Peculiarities (Tags)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">FlexibleGridView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">: room.<\/span><span style=\"color: #E06C75\">peculiarities<\/span><span style=\"color: #ABB2BF\">) { item <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(item)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Room Price<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">room.<\/span><span style=\"color: #E06C75\">price<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> \u20bd&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">30<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">semibold<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(room.<\/span><span style=\"color: #E06C75\">pricePer<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #56B6C2\">lowercased<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Choose Room Button<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Action for selecting THIS specific room<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Selected room: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">room.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             } <\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add horizontal space between cards and screen edge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Flexible Grid View (Helper for Tags)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">FlexibleGridView<\/span><span style=\"color: #ABB2BF\">&lt;<\/span><span style=\"color: #E5C07B\">Data<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Collection<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Content<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View<\/span><span style=\"color: #ABB2BF\">&gt;: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #C678DD\">where<\/span><span style=\"color: #ABB2BF\"> Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Hashable<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: Data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> spacing: CGFloat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> alignment: HorizontalAlignment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> content: (Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">) -&gt; Content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> availableWidth: CGFloat = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">data<\/span><span style=\"color: #ABB2BF\">: Data, <\/span><span style=\"color: #61AFEF; font-style: italic\">spacing<\/span><span style=\"color: #ABB2BF\">: CGFloat <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">alignment<\/span><span style=\"color: #ABB2BF\">: HorizontalAlignment <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, @<\/span><span style=\"color: #61AFEF\">ViewBuilder<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">content<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #C678DD\">@escaping<\/span><span style=\"color: #ABB2BF\"> (Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">) -&gt; Content) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> = data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">spacing<\/span><span style=\"color: #ABB2BF\"> = spacing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.alignment = alignment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">content<\/span><span style=\"color: #ABB2BF\"> = content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Alignment<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">horizontal<\/span><span style=\"color: #ABB2BF\">: alignment, <\/span><span style=\"color: #61AFEF\">vertical<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">center<\/span><span style=\"color: #ABB2BF\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            Color.<\/span><span style=\"color: #E06C75\">clear<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">readSize<\/span><span style=\"color: #ABB2BF\"> { size <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    availableWidth = size.<\/span><span style=\"color: #E06C75\">width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">_FlexibleGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">availableWidth<\/span><span style=\"color: #ABB2BF\">: availableWidth,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">: data,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: spacing,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: alignment,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">content<\/span><span style=\"color: #ABB2BF\">: content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">_FlexibleGrid<\/span><span style=\"color: #ABB2BF\">&lt;<\/span><span style=\"color: #E5C07B\">Data<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Collection<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Content<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View<\/span><span style=\"color: #ABB2BF\">&gt;: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #C678DD\">where<\/span><span style=\"color: #ABB2BF\"> Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Hashable<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> availableWidth: CGFloat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: Data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> spacing: CGFloat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> alignment: HorizontalAlignment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> content: (Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">) -&gt; Content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> elementsSize: [Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">: CGSize] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: alignment, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: spacing) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">computeRows<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { rowElements <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: spacing) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(rowElements, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { element <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">content<\/span><span style=\"color: #ABB2BF\">(element)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">fixedSize<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">readSize<\/span><span style=\"color: #ABB2BF\"> { size <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                elementsSize[element] = size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">computeRows<\/span><span style=\"color: #ABB2BF\">() -&gt; [[Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">]] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> rows: [[Data.<\/span><span style=\"color: #E5C07B\">Element<\/span><span style=\"color: #ABB2BF\">]] = [[]]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> currentRow = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> remainingWidth = availableWidth<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> element <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> data {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> elementSize = elementsSize[element, <\/span><span style=\"color: #61AFEF\">default<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">CGSize<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: availableWidth, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> remainingWidth - (elementSize.<\/span><span style=\"color: #E06C75\">width<\/span><span style=\"color: #ABB2BF\"> + spacing) &gt;= <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                rows[currentRow].<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(element)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                currentRow += <\/span><span style=\"color: #D19A66\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                rows.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">([element])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                remainingWidth = availableWidth<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            remainingWidth -= (elementSize.<\/span><span style=\"color: #E06C75\">width<\/span><span style=\"color: #ABB2BF\"> + spacing)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper to read view size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SizePreferenceKey<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">PreferenceKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">static<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> defaultValue: CGSize = .<\/span><span style=\"color: #E06C75\">zero<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">static<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">reduce<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #C678DD\">inout<\/span><span style=\"color: #ABB2BF\"> CGSize, <\/span><span style=\"color: #61AFEF; font-style: italic\">nextValue<\/span><span style=\"color: #ABB2BF\">: () -&gt; CGSize) {}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">extension<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">View<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">readSize<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">onChange<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #C678DD\">@escaping<\/span><span style=\"color: #ABB2BF\"> (CGSize) -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">GeometryReader<\/span><span style=\"color: #ABB2BF\"> { geometryProxy <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                Color.<\/span><span style=\"color: #E06C75\">clear<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">preference<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">key<\/span><span style=\"color: #ABB2BF\">: SizePreferenceKey.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: geometryProxy.size)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onPreferenceChange<\/span><span style=\"color: #ABB2BF\">(SizePreferenceKey.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">perform<\/span><span style=\"color: #ABB2BF\">: onChange)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">ContentView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435:                          <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">1.<strong>\u041c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (Hotel, Room): <\/strong>\u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431 \u043e\u0442\u0435\u043b\u044f\u0445 \u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u0445. Identifiable \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f ForEach. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 API \u0438\u043b\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">2. <strong>HotelApp &amp; ContentView: <\/strong>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 SwiftUI. ContentView \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 NavigationView \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 View (HotelDetailView) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">3. <strong>HotelDetailView:<\/strong><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ScrollView \u0438 VStacks \u0434\u043b\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 ImageCarouselView.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0440\u0435\u0439\u0442\u0438\u043d\u0433, \u0438\u043c\u044f, \u0430\u0434\u0440\u0435\u0441 (\u0432 \u0432\u0438\u0434\u0435 \u043a\u043d\u043e\u043f\u043a\u0438), \u0446\u0435\u043d\u0443.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u00ab\u041e\u0431 \u043e\u0442\u0435\u043b\u0435\u00bb \u0441 \u0442\u0435\u0433\u0430\u043c\u0438 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f FlexibleGridView) \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 NavigationLink, \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 SectionRow \u0434\u043b\u044f \u00ab\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u00bb, \u00ab\u0427\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e\u00bb, \u00ab\u0427\u0442\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e\u00bb.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0438\u043d\u044f\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u00ab\u041a \u0432\u044b\u0431\u043e\u0440\u0443 \u043d\u043e\u043c\u0435\u0440\u0430\u00bb \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0430 \u0432\u043d\u0438\u0437\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e .safeAreaInset(edge: .bottom), \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0438 \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u043b\u0430 \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. \u042d\u0442\u043e NavigationLink \u0434\u043b\u044f RoomSelectionView.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">.navigationBarTitleDisplayMode(.inline) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. <\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">4. <strong>ImageCarouselView:<\/strong><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 TabView \u0441 .tabViewStyle(.page).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">.page (indexDisplayMode: .never) \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 @State selectedIndex.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">5. <strong>SectionRow: <\/strong>\u041c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0435 View \u0434\u043b\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0438 (\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0442. \u0434.). \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u043a\u043e\u043d\u043a\u0443, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u043e\u0434\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0448\u0435\u0432\u0440\u043e\u043d.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">6. <strong>AmenitiesView:<\/strong> \u041f\u0440\u043e\u0441\u0442\u043e\u0435 View-\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Text \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0443\u0434\u043e\u0431\u0441\u0442\u0432.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">7. <strong>RoomSelectionView:<\/strong><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 hotelName (\u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430) \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Room.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ScrollView \u0438 VStack \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 RoomCardViews.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 .navigationTitle.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">8. <span style=\"font-weight: 400;\"><strong>RoomCardView:<\/strong><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <span style=\"font-weight: 400;\">\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 ImageCarouselView.<\/span><\/li>\n\n\n\n<li> <span style=\"font-weight: 400;\">\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043c\u044f, \u0442\u0435\u0433\u0438 (FlexibleGridView), \u0446\u0435\u043d\u0443 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440\u00bb, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0443\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u044b.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">9. <strong>FlexibleGridView \u0438 \u0434\u0440\u0443\u0433\u0438\u0435:<\/strong> \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 View \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u0433\u043e\u0432 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 <code><mark style=\"background-color:#efefef\" class=\"has-inline-color\">peculiarities<\/mark><\/code>), \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f \u0438\u0445 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code><mark style=\"background-color:#f2f2f2\" class=\"has-inline-color\">readSize<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">10. <strong>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438:<\/strong> \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u00abhotel1\u00bb, \u00abroom1\u00bb \u0438 \u0442. \u0434. \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0432\u0430\u0448\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 <code><mark style=\"background-color:#eeeeee\" class=\"has-inline-color\">Assets.xcassets<\/mark>.<\/code><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0447\u043d\u0443\u044e \u043e\u0441\u043d\u043e\u0432\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0434\u0438\u0437\u0430\u0439\u043d\u0443, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u0441\u043d\u0438\u043c\u043a\u0430\u0445 \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 <code>API <\/code>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>ViewModel<\/code>) \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 UI.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u043a\u0440\u0430\u043d \u0441 \u043e\u0442\u0435\u043b\u0435\u043c:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"982\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10-982x1024.png\" alt=\"\" class=\"wp-image-16904\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10-982x1024.png 982w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10-288x300.png 288w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10-768x801.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.32.10.png 1354w\" sizes=\"auto, (max-width: 982px) 100vw, 982px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0432\u044b\u0431\u043e\u0440\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u043e\u043c\u0435\u0440\u0430:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"994\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26-994x1024.png\" alt=\"\" class=\"wp-image-16905\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26-994x1024.png 994w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26-291x300.png 291w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26-768x791.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-17.40.26.png 1374w\" sizes=\"auto, (max-width: 994px) 100vw, 994px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u0445:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25.png\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25-989x1024.png\" alt=\"\" class=\"wp-image-16906\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25-989x1024.png 989w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25-290x300.png 290w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25-768x795.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-29-at-20.26.25.png 1372w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 &#171;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u0438&#187; \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0442\u0435\u043b\u044f, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u043e\u043c\u0435\u0440\u043e\u0432:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screen-Recording-2025-03-30-at-15.03.51.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"750\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screen-Recording-2025-03-30-at-15.03.51.gif\" alt=\"\" class=\"wp-image-16908\"\/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u0418\u0442\u043e\u0433\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Gemini 2.5 + \u043c\u0432\u043a\u0435\u0442\u044b Figma:<\/strong><ol><li><strong>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0435\u0442\u043e\u0432 Figma \u0432 SwiftUI:<\/strong><br>\u2014 \u042d\u043a\u0440\u0430\u043d \u043e\u0442\u0435\u043b\u044f \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0430 SwiftUI \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0438\u043b\u0435\u0439 \u0442\u0435\u043a\u0441\u0442\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a).<\/li><li><strong>\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong><br>\u2014 Gemini 2.5 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API.<\/li><li><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0430:<\/strong><br>\u2014 \u041b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 SwiftUI \u043a\u043e\u0434 \u0441 TabView \u0434\u043b\u044f &#171;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u0438&#187; \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438:&nbsp;SectionView,&nbsp;ImageCarouselView.<br>\u2014 \u0418\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439&nbsp;FlexibleGridView&nbsp;\u0434\u043b\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0434\u043e\u0431\u0441\u0442\u0432.<\/li><li><strong>\u0420\u0435\u0441\u0443\u0440\u0441\u044b:<\/strong><br>\u2014 \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437&nbsp;Assets.xcassets.<\/li><\/ol><strong>\u0427\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c:<\/strong><br>\u2014 \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (REST API).<br>\u2014 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 View.<br>\u2014 \u0423\u0441\u0438\u043b\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430.<strong>\u0420\u0435\u0437\u044e\u043c\u0435:<\/strong>&nbsp;\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0433\u043e\u0442\u043e\u0432 \u043a \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b Gemini 2.5 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Figma-\u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 iOS-\u043a\u043e\u0434.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0432\u0448\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u043e\u0442\u0435\u043b\u044f.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043e\u0442\u0435\u043b\u044f (\u0447\u0430\u0441\u0442\u044c 1)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044d\u043a\u0440\u0430\u043d\u0430 \u0438\u0437 Figma:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1012\" height=\"1422\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01.png\" alt=\"\" class=\"wp-image-16949\" style=\"width:503px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01.png 1012w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01-214x300.png 214w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01-729x1024.png 729w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-09.47.01-768x1079.png 768w\" sizes=\"auto, (max-width: 1012px) 100vw, 1012px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 Gemini 2.5 Experimental 03-25<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"544\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17-1024x544.png\" alt=\"\" class=\"wp-image-16915\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17-1024x544.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17-300x159.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17-768x408.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17-500x266.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.54.17.png 1494w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"319\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18-1024x319.png\" alt=\"\" class=\"wp-image-16916\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18-1024x319.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18-300x94.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18-768x239.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18-500x156.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-30-at-16.55.18.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Experimental<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c SwiftUI View \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0430 c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u044b \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>BookingInfoView:<\/strong> \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 View \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 Views:<\/strong> \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 (\u043e\u0442\u0435\u043b\u044c, \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0435).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430:<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 @State \u0438 .<strong>onReceive<\/strong>, \u044d\u0442\u043e \u043a\u043b\u044e\u0447 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0448\u0430\u0431\u043b\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b:<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 @State, .onChange \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/span><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\nimport Combine \/\/ Needed for keyboard observers if we wanted more advanced focus handling\n\n\/\/ MARK: - Data Models (Simple representations for the example)\n\nstruct HotelBookingInfo {\n    let ratingValue: Int = 5\n    let ratingName: String = &quot;\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e&quot;\n    let hotelName: String = &quot;Steigenberger Makadi&quot;\n    let hotelAddress: String = &quot;Madinat Makadi, Safaga Road, Makadi Bay, \u0415\u0433\u0438\u043f\u0435\u0442&quot;\n}\n\nstruct BookingDetails {\n    let departureCity: String = &quot;\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433&quot;\n    let countryCity: String = &quot;\u0415\u0433\u0438\u043f\u0435\u0442, \u0425\u0443\u0440\u0433\u0430\u0434\u0430&quot;\n    let dates: String = &quot;19.09.2023 - 27.09.2023&quot;\n    let nights: String = &quot;7 \u043d\u043e\u0447\u0435\u0439&quot;\n    let hotelName: String = &quot;Steigenberger Makadi&quot;\n    let roomType: String = &quot;\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u0431\u0430\u0441\u0441\u0435\u0439\u043d \u0438\u043b\u0438 \u0441\u0430\u0434&quot;\n    let mealPlan: String = &quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;\n}\n\n\/\/ MARK: - Main Booking Info View\n\nstruct BookingInfoView: View {\n    \/\/ --- State Variables ---\n    @State private var phoneNumber: String = &quot;&quot; \/\/ Stores the RAW digits (max 10)\n  \/\/  @State private var displayedPhoneNumber: String = &quot;+7 &quot; \/\/ What the user sees\/edits\n    @State private var email: String = &quot;&quot;\n    @State private var isEmailValid: Bool = true \/\/ Assume valid initially or until typed\n\n    \/\/ --- Data ---\n    let hotelInfo = HotelBookingInfo()\n    let bookingDetails = BookingDetails()\n\n    \/\/ --- Environment ---\n    @Environment(\\.presentationMode) var presentationMode\n\n    var body: some View {\n        NavigationView {\n            ScrollView {\n                VStack(spacing: 8) { \/\/ Spacing between blocks\n                    HotelInfoBlock(info: hotelInfo)\n                    BookingDetailsBlock(details: bookingDetails)\n                    BuyerInfoBlock(\n                        phoneNumber: $phoneNumber,\n                        email: $email,\n                        isEmailValid: $isEmailValid\n                    )\n\n                    Spacer() \/\/ Pushes content up if screen is tall\n                }\n                .padding(.horizontal) \/\/ Padding for the whole content stack\n                .padding(.top)      \/\/ Padding from the navigation bar\n            }\n            .background(Color(UIColor.systemGray6)) \/\/ Background for the whole screen\n            .navigationTitle(&quot;\u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot;)\n            .navigationBarTitleDisplayMode(.inline)\n            .toolbar {\n                ToolbarItem(placement: .navigationBarLeading) {\n                    Button {\n                        presentationMode.wrappedValue.dismiss()\n                    } label: {\n                        Image(systemName: &quot;chevron.left&quot;)\n                    }\n                    .tint(.primary) \/\/ Ensure back button has default color\n                }\n            }\n        }\n    }\n}\n\n\/\/ MARK: - Block Views\n\nstruct HotelInfoBlock: View {\n    let info: HotelBookingInfo\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 8) {\n            HStack(spacing: 4) {\n                Image(systemName: &quot;star.fill&quot;)\n                Text(&quot;\\(info.ratingValue) \\(info.ratingName)&quot;)\n            }\n            .font(.system(size: 16, weight: .medium))\n            .foregroundColor(.orange)\n            .padding(.horizontal, 10)\n            .padding(.vertical, 5)\n            .background(Color.orange.opacity(0.15))\n            .cornerRadius(5)\n\n            Text(info.hotelName)\n                .font(.system(size: 22, weight: .medium))\n\n            Text(info.hotelAddress)\n                .font(.system(size: 14, weight: .regular))\n                .foregroundColor(.blue) \/\/ Link-like appearance\n        }\n        .padding()\n        .frame(maxWidth: .infinity, alignment: .leading) \/\/ Take full width\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n}\n\nstruct BookingDetailsBlock: View {\n    let details: BookingDetails\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 16) { \/\/ Increased spacing between rows\n            BookingDetailRow(label: &quot;\u0412\u044b\u043b\u0435\u0442 \u0438\u0437&quot;, value: details.departureCity)\n            BookingDetailRow(label: &quot;\u0421\u0442\u0440\u0430\u043d\u0430, \u0433\u043e\u0440\u043e\u0434&quot;, value: details.countryCity)\n            BookingDetailRow(label: &quot;\u0414\u0430\u0442\u044b&quot;, value: details.dates)\n            BookingDetailRow(label: &quot;\u041a\u043e\u043b-\u0432\u043e \u043d\u043e\u0447\u0435\u0439&quot;, value: details.nights)\n            BookingDetailRow(label: &quot;\u041e\u0442\u0435\u043b\u044c&quot;, value: details.hotelName)\n            BookingDetailRow(label: &quot;\u041d\u043e\u043c\u0435\u0440&quot;, value: details.roomType)\n            BookingDetailRow(label: &quot;\u041f\u0438\u0442\u0430\u043d\u0438\u0435&quot;, value: details.mealPlan)\n        }\n        .padding()\n        .frame(maxWidth: .infinity, alignment: .leading)\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n}\n\n\/\/ Helper for Booking Details rows\nstruct BookingDetailRow: View {\n    let label: String\n    let value: String\n\n    var body: some View {\n        HStack(alignment: .top) { \/\/ Align top for potentially multi-line values\n            Text(label)\n                .font(.system(size: 16))\n                .foregroundColor(.secondary)\n                .frame(width: 110, alignment: .leading) \/\/ Fixed width for labels\n\n            Text(value)\n                .font(.system(size: 16))\n                .foregroundColor(.primary)\n                .frame(maxWidth: .infinity, alignment: .leading) \/\/ Take remaining space\n        }\n    }\n}\n\nstruct BuyerInfoBlock: View {\n    @Binding var phoneNumber: String \/\/ Raw digits\n  \/\/  @Binding var displayedPhoneNumber: String \/\/ Formatted for display\/edit\n    @Binding var email: String\n    @Binding var isEmailValid: Bool\n    \n    @State var isValid: Bool = false\n    let phoneRegex = try! NSRegularExpression(pattern: #&quot;^\\+7 \\(\\d{3}\\) \\d{3}-\\d{2}-\\d{2}$&quot;#)\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 20) { \/\/ Space between title and fields\n            Text(&quot;\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0435&quot;)\n                .font(.system(size: 22, weight: .medium))\n\n            VStack(alignment: .leading, spacing: 8) { \/\/ Space within the fields group\n                Text(&quot;\u041d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430&quot;)\n                    .font(.system(size: 12))\n                    .foregroundColor(.secondary)\n                    .padding(.leading, 12) \/\/ Indent label slightly\n\n                TextField(&quot;&quot;, text: $phoneNumber, prompt: Text(&quot;+7 (***) *** - ** - **&quot;).foregroundColor(.gray))\n                    .keyboardType(.numberPad)\n                    .onReceive(Just(phoneNumber)) { newValue in\n                        if !phoneNumber.isEmpty {\n                            phoneNumber = formatPhoneNumber(newValue)\n                            validatePhoneNumber(newValue)\n                        }\n                    }\n                    .onAppear{\n                        UITextField.appearance().clearButtonMode = .whileEditing\n                    }\n                    .padding()\n                    .background(Color(.systemGray6))\n                    .cornerRadius(8)\n                \n                if !isValid {\n                    Text(&quot;Invalid format. Example: +7 (901) 555-66-77&quot;)\n                        .foregroundColor(.red)\n                        .font(.caption)\n                }\n\n                Text(&quot;\u041f\u043e\u0447\u0442\u0430&quot;)\n                    .font(.system(size: 12))\n                    .foregroundColor(.secondary)\n                    .padding(.leading, 12)\n\n                TextField(&quot;example@mail.ru&quot;, text: $email)\n                    .keyboardType(.emailAddress)\n                    .autocapitalization(.none)\n                    .disableAutocorrection(true)\n                    .padding(.horizontal, 12)\n                    .padding(.vertical, 10)\n                    .background(isEmailValid ? Color(UIColor.systemGray6) : Color.red.opacity(0.15)) \/\/ Visual validation feedback\n                    .cornerRadius(10)\n                    .overlay( \/\/ Optional: Add border for invalid state\n                        RoundedRectangle(cornerRadius: 10)\n                            .stroke(isEmailValid ? Color.clear : Color.red, lineWidth: 1)\n                    )\n                    .onChange(of: email) { _, newValue in\n                        \/\/ Validate only if email is not empty\n                        if !newValue.isEmpty {\n                             isEmailValid = isValidEmail(newValue)\n                        } else {\n                            isEmailValid = true \/\/ Consider empty as valid or neutral\n                        }\n                    }\n            }\n\n            Text(&quot;\u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u043b\u0430\u0442\u044b \u043c\u044b \u0432\u044b\u0448\u043b\u0438 \u0447\u0435\u043a \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043d\u043e\u043c\u0435\u0440 \u0438 \u043f\u043e\u0447\u0442\u0443&quot;)\n                .font(.system(size: 14))\n                .foregroundColor(.secondary)\n\n        }\n        .padding()\n        .frame(maxWidth: .infinity, alignment: .leading)\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n\n    \/\/ MARK: Phone Masking Logic\n    \/\/ Formats the input string to the template: +7 (XXX) XXX-XX-XX.\n    private  func formatPhoneNumber(_ number: String) -&gt; String {\n            \/\/ Remove any non-digit characters.\n            let digitsOnly = number.filter { $0.isNumber }\n            var cleanedNumber = digitsOnly\n            \n            \/\/ If the first digit is 7 or 8, remove it.\n            if let first = cleanedNumber.first, first == &quot;7&quot; || first == &quot;8&quot; {\n                cleanedNumber.removeFirst()\n            }\n            \n            \/\/ Limit to 10 digits.\n            if cleanedNumber.count &gt; 10 {\n                cleanedNumber = String(cleanedNumber.prefix(10))\n            }\n            \n            \/\/ Start with the fixed +7 prefix.\n            var formatted = &quot;+7 &quot;\n            \n            \/\/ Create the area code part.\n            if !cleanedNumber.isEmpty {\n                formatted += &quot;(&quot;\n                let areaCodeEnd = min(3, cleanedNumber.count)\n                let areaCode = cleanedNumber.prefix(areaCodeEnd)\n                formatted += areaCode\n                if areaCode.count == 3 {\n                    formatted += &quot;) &quot;\n                }\n            }\n            \n            \/\/ Next 3 digits.\n            if cleanedNumber.count &gt; 3 {\n                let startIndex = cleanedNumber.index(cleanedNumber.startIndex, offsetBy: 3)\n                let endIndex = cleanedNumber.index(startIndex, offsetBy: min(3, cleanedNumber.count - 3))\n                let firstThree = cleanedNumber[startIndex..&lt;endIndex]\n                formatted += firstThree\n                if firstThree.count == 3 {\n                    formatted += &quot;-&quot;\n                }\n            }\n            \n            \/\/ Next 2 digits.\n            if cleanedNumber.count &gt; 6 {\n                let startIndex = cleanedNumber.index(cleanedNumber.startIndex, offsetBy: 6)\n                let endIndex = cleanedNumber.index(startIndex, offsetBy: min(2, cleanedNumber.count - 6))\n                let nextTwo = cleanedNumber[startIndex..&lt;endIndex]\n                formatted += nextTwo\n                if nextTwo.count == 2 {\n                    formatted += &quot;-&quot;\n                }\n            }\n            \n            \/\/ Last 2 digits.\n            if cleanedNumber.count &gt; 8 {\n                let startIndex = cleanedNumber.index(cleanedNumber.startIndex, offsetBy: 8)\n                let endIndex = cleanedNumber.index(startIndex, offsetBy: min(2, cleanedNumber.count - 8))\n                let lastTwo = cleanedNumber[startIndex..&lt;endIndex]\n                formatted += lastTwo\n            }\n            \n            return formatted\n        }\n    \n    private func validatePhoneNumber(_ number: String) {\n        let range = NSRange(location: 0, length: number.utf16.count)\n        \/\/ Check if the entire string matches the regular expression\n        isValid = phoneRegex.firstMatch(in: number, options: [], range: range) != nil\n    }\n\n     \/\/ MARK: Email Validation Logic\n     private func isValidEmail(_ email: String) -&gt; Bool {\n         \/\/ Simple regex for basic email format validation\n         let emailFormat = &quot;[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,64}&quot;\n         let emailPredicate = NSPredicate(format:&quot;SELF MATCHES %@&quot;, emailFormat)\n         return emailPredicate.evaluate(with: email)\n     }\n}\n\n\n\/\/ MARK: - Preview\n\n#Preview {\n        BookingInfoView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Combine<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Needed for keyboard observers if we wanted more advanced focus handling<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Data Models (Simple representations for the example)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">HotelBookingInfo<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> ratingValue: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> ratingName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotelName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Steigenberger Makadi&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotelAddress: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Madinat Makadi, Safaga Road, Makadi Bay, \u0415\u0433\u0438\u043f\u0435\u0442&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">BookingDetails<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> departureCity: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countryCity: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;\u0415\u0433\u0438\u043f\u0435\u0442, \u0425\u0443\u0440\u0433\u0430\u0434\u0430&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> dates: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;19.09.2023 - 27.09.2023&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> nights: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;7 \u043d\u043e\u0447\u0435\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotelName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Steigenberger Makadi&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> roomType: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441 \u0432\u0438\u0434\u043e\u043c \u043d\u0430 \u0431\u0430\u0441\u0441\u0435\u0439\u043d \u0438\u043b\u0438 \u0441\u0430\u0434&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> mealPlan: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;\u0412\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Main Booking Info View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">BookingInfoView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- State Variables ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> phoneNumber: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Stores the RAW digits (max 10)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/  @State private var displayedPhoneNumber: String = &quot;+7 &quot; \/\/ What the user sees\/edits<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> email: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isEmailValid: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Assume valid initially or until typed<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Data ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> hotelInfo = <\/span><span style=\"color: #61AFEF\">HotelBookingInfo<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> bookingDetails = <\/span><span style=\"color: #61AFEF\">BookingDetails<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Environment ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Environment<\/span><span style=\"color: #ABB2BF\">(\\.<\/span><span style=\"color: #E06C75\">presentationMode<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> presentationMode<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Spacing between blocks<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HotelInfoBlock<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">info<\/span><span style=\"color: #ABB2BF\">: hotelInfo)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">BookingDetailsBlock<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">details<\/span><span style=\"color: #ABB2BF\">: bookingDetails)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">BuyerInfoBlock<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">phoneNumber<\/span><span style=\"color: #ABB2BF\">: $phoneNumber,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">email<\/span><span style=\"color: #ABB2BF\">: $email,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">isEmailValid<\/span><span style=\"color: #ABB2BF\">: $isEmailValid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Pushes content up if screen is tall<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding for the whole content stack<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">)      <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding from the navigation bar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Background for the whole screen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">toolbar<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ToolbarItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">placement<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">navigationBarLeading<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        presentationMode.<\/span><span style=\"color: #E06C75\">wrappedValue<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dismiss<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    } <\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;chevron.left&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">tint<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensure back button has default color<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Block Views<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">HotelInfoBlock<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> info: HotelBookingInfo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;star.fill&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">info.<\/span><span style=\"color: #E06C75\">ratingValue<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">info.<\/span><span style=\"color: #E06C75\">ratingName<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">orange<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">orange<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.15<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(info.<\/span><span style=\"color: #E06C75\">hotelName<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(info.<\/span><span style=\"color: #E06C75\">hotelAddress<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">14<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Link-like appearance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Take full width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">BookingDetailsBlock<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> details: BookingDetails<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Increased spacing between rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0412\u044b\u043b\u0435\u0442 \u0438\u0437&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">departureCity<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0421\u0442\u0440\u0430\u043d\u0430, \u0433\u043e\u0440\u043e\u0434&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">countryCity<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0414\u0430\u0442\u044b&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">dates<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041a\u043e\u043b-\u0432\u043e \u043d\u043e\u0447\u0435\u0439&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">nights<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041e\u0442\u0435\u043b\u044c&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">hotelName<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041d\u043e\u043c\u0435\u0440&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">roomType<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041f\u0438\u0442\u0430\u043d\u0438\u0435&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: details.<\/span><span style=\"color: #E06C75\">mealPlan<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper for Booking Details rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">BookingDetailRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> label: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Align top for potentially multi-line values<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(label)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">110<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Fixed width for labels<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Take remaining space<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">BuyerInfoBlock<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> phoneNumber: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Raw digits<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/  @Binding var displayedPhoneNumber: String \/\/ Formatted for display\/edit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> email: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isEmailValid: <\/span><span style=\"color: #E5C07B\">Bool<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isValid: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> phoneRegex = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">! <\/span><span style=\"color: #61AFEF\">NSRegularExpression<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">pattern<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">#&quot;^\\+7 \\(\\d{3}\\) \\d{3}-\\d{2}-\\d{2}$&quot;#<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Space between title and fields<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0435&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Space within the fields group<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u041d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Indent label slightly<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">TextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $phoneNumber, <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;+7 (***) *** - ** - **&quot;<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">keyboardType<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">numberPad<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Just<\/span><span style=\"color: #ABB2BF\">(phoneNumber)) { newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !phoneNumber.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            phoneNumber = <\/span><span style=\"color: #61AFEF\">formatPhoneNumber<\/span><span style=\"color: #ABB2BF\">(newValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">validatePhoneNumber<\/span><span style=\"color: #ABB2BF\">(newValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">onAppear<\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        UITextField.<\/span><span style=\"color: #61AFEF\">appearance<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #E06C75\">clearButtonMode<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">whileEditing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !isValid {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Invalid format. Example: +7 (901) 555-66-77&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">caption<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u041f\u043e\u0447\u0442\u0430&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">TextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;example@mail.ru&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $email)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">keyboardType<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">emailAddress<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">autocapitalization<\/span><span style=\"color: #ABB2BF\">(.none)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">disableAutocorrection<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(isEmailValid ? <\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Color.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.15<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Visual validation feedback<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">overlay<\/span><span style=\"color: #ABB2BF\">( <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional: Add border for invalid state<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">stroke<\/span><span style=\"color: #ABB2BF\">(isEmailValid ? Color.<\/span><span style=\"color: #E06C75\">clear<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Color.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">lineWidth<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: email) { _, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Validate only if email is not empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !newValue.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             isEmailValid = <\/span><span style=\"color: #61AFEF\">isValidEmail<\/span><span style=\"color: #ABB2BF\">(newValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            isEmailValid = <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Consider empty as valid or neutral<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u043b\u0430\u0442\u044b \u043c\u044b \u0432\u044b\u0448\u043b\u0438 \u0447\u0435\u043a \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043d\u043e\u043c\u0435\u0440 \u0438 \u043f\u043e\u0447\u0442\u0443&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">14<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: Phone Masking Logic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Formats the input string to the template: +7 (XXX) XXX-XX-XX.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatPhoneNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Remove any non-digit characters.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> digitsOnly = number.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">isNumber<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cleanedNumber = digitsOnly<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ If the first digit is 7 or 8, remove it.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> first = cleanedNumber.first, first == <\/span><span style=\"color: #98C379\">&quot;7&quot;<\/span><span style=\"color: #ABB2BF\"> || first == <\/span><span style=\"color: #98C379\">&quot;8&quot;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                cleanedNumber.<\/span><span style=\"color: #56B6C2\">removeFirst<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Limit to 10 digits.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> cleanedNumber.count &gt; <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                cleanedNumber = <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(cleanedNumber.<\/span><span style=\"color: #56B6C2\">prefix<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Start with the fixed +7 prefix.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> formatted = <\/span><span style=\"color: #98C379\">&quot;+7 &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Create the area code part.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !cleanedNumber.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                formatted += <\/span><span style=\"color: #98C379\">&quot;(&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> areaCodeEnd = <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\">, cleanedNumber.count)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> areaCode = cleanedNumber.<\/span><span style=\"color: #56B6C2\">prefix<\/span><span style=\"color: #ABB2BF\">(areaCodeEnd)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                formatted += areaCode<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> areaCode.count == <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    formatted += <\/span><span style=\"color: #98C379\">&quot;) &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Next 3 digits.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> cleanedNumber.count &gt; <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> startIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(cleanedNumber.startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> endIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\">, cleanedNumber.count - <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> firstThree = cleanedNumber[startIndex..&lt;endIndex]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                formatted += firstThree<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> firstThree.count == <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    formatted += <\/span><span style=\"color: #98C379\">&quot;-&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Next 2 digits.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> cleanedNumber.count &gt; <\/span><span style=\"color: #D19A66\">6<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> startIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(cleanedNumber.startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">6<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> endIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\">, cleanedNumber.count - <\/span><span style=\"color: #D19A66\">6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> nextTwo = cleanedNumber[startIndex..&lt;endIndex]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                formatted += nextTwo<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> nextTwo.count == <\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    formatted += <\/span><span style=\"color: #98C379\">&quot;-&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Last 2 digits.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> cleanedNumber.count &gt; <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> startIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(cleanedNumber.startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> endIndex = cleanedNumber.<\/span><span style=\"color: #56B6C2\">index<\/span><span style=\"color: #ABB2BF\">(startIndex, <\/span><span style=\"color: #61AFEF\">offsetBy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\">, cleanedNumber.count - <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lastTwo = cleanedNumber[startIndex..&lt;endIndex]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                formatted += lastTwo<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> formatted<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">validatePhoneNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> range = <\/span><span style=\"color: #61AFEF\">NSRange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">location<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">length<\/span><span style=\"color: #ABB2BF\">: number.utf16.count)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Check if the entire string matches the regular expression<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isValid = phoneRegex.<\/span><span style=\"color: #61AFEF\">firstMatch<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: number, <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: [], <\/span><span style=\"color: #61AFEF\">range<\/span><span style=\"color: #ABB2BF\">: range) != <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: Email Validation Logic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">isValidEmail<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">email<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Simple regex for basic email format validation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> emailFormat = <\/span><span style=\"color: #98C379\">&quot;[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+<\/span><span style=\"color: #56B6C2\">\\\\<\/span><span style=\"color: #98C379\">.[A-Za-z]{2,64}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> emailPredicate = <\/span><span style=\"color: #61AFEF\">NSPredicate<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">format<\/span><span style=\"color: #ABB2BF\">:<\/span><span style=\"color: #98C379\">&quot;SELF MATCHES %@&quot;<\/span><span style=\"color: #ABB2BF\">, emailFormat)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> emailPredicate.<\/span><span style=\"color: #61AFEF\">evaluate<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: email)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Preview<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">BookingInfoView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f:<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c: \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 @State (phoneNumber, email, isEmailValid) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 BookingInfoView \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a @Bindings \u0432 BuyerInfoBlock, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 TextFields.<\/span><\/li>\n\n\n\n<li>\u041c\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430 (formatPhoneNumber):\n<ul class=\"wp-block-list\">\n<li>      \u041e\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f .onReceive(Just(phoneNumber)).<\/li>\n\n\n\n<li>.onReceive: \u044d\u0442\u043e \u043a\u043b\u044e\u0447 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. <\/li>\n\n\n\n<li>\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 onReceive \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f phoneNumber. \u0412\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 phoneNumber \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f formatPhoneNumber), \u0438 phoneNumber \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439.<\/li>\n\n\n\n<li>TextField, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u0441\u043b\u0435\u0434\u0443\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0443 +7 (XXX) XXX-XX-XX. <\/li>\n\n\n\n<li>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0446\u0438\u0444\u0440\u044b \u0431\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 7 \u0438\u043b\u0438 8, \u0438 \u043a\u043e\u0434 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0442\u0430\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u0432\u043e\u0434\u0430.<\/li>\n\n\n\n<li>       formatPhoneNumber \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c 10 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 (\u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 7 \u0438\u043b\u0438 8), \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0430\u0441\u043a\u0443.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (isValidEmail):\n<ul class=\"wp-block-list\">\n<li>        \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f isValidEmail(_ email: String) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 NSPredicate \u0441 \u043e\u0431\u0449\u0438\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b.<\/li>\n\n\n\n<li>         .onChange(of: email) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443.<\/li>\n\n\n\n<li>\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 (\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f isEmailValid, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c.<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u041c\u0430\u043a\u0435\u0442 \u0438 \u0441\u0442\u0438\u043b\u0438:\n<ul class=\"wp-block-list\">\n<li>       \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 VStack, HStack, Spacer, .padding, .background, .cornerRadius \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043c\u0430\u043a\u0435\u0442\u0430.<\/li>\n\n\n\n<li>        BookingDetailRow \u2014 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u043c\u0435\u0442\u043e\u043a-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041c\u0435\u0442\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f.<\/li>\n\n\n\n<li>        \u0426\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 (Color.white, Color(UIColor.systemGray6)) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0444\u043e\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430.<\/li>\n\n\n\n<li>         \u0428\u0440\u0438\u0444\u0442\u044b \u0438 \u0446\u0432\u0435\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043d\u0438\u043c\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u0430.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f: \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 NavigationView \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u00abBack\u00bb \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 SwiftUI View,  \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u0438\u0437 Figma \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f (HotelBookingInfo, BookingDetails) \u043d\u0430 \u0432\u0430\u0448 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 View \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screen-Recording-2025-03-31-at-10.17.40.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"750\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screen-Recording-2025-03-31-at-10.17.40.gif\" alt=\"\" class=\"wp-image-16919\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043e\u0442\u0435\u043b\u044f (\u0447\u0430\u0441\u0442\u044c 2)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044d\u043a\u0440\u0430\u043d\u0430 \u0438\u0437 Figma:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-28-at-10.19.57-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"834\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-28-at-10.19.57-1.png\" alt=\"\" class=\"wp-image-16947\" style=\"width:535px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-28-at-10.19.57-1.png 602w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-28-at-10.19.57-1-217x300.png 217w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 Gemini 2.5 Experimental 03-25<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"602\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16-1024x602.png\" alt=\"\" class=\"wp-image-16921\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16-1024x602.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16-300x176.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16-768x452.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16-500x294.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.51.16.png 1486w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"350\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39-1024x350.png\" alt=\"\" class=\"wp-image-16922\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39-1024x350.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39-300x103.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39-768x263.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39-500x171.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-03-31-at-11.56.39.png 1356w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Experimental<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c SwiftUI View \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0430\u0445 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0438 \u0446\u0435\u043d, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432.<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ MARK: - Data Models\n\nstruct Tourist: Identifiable {\n    let id = UUID() \/\/ Necessary for ForEach\n    var isExpanded: Bool = true \/\/ State for collapsing\/expanding\n\n    \/\/ Form fields\n    var firstName: String = &quot;&quot;\n    var lastName: String = &quot;&quot;\n    var dateOfBirth: String = &quot;&quot; \/\/ Could use Date type later\n    var citizenship: String = &quot;&quot;\n    var passportNumber: String = &quot;&quot;\n    var passportExpiry: String = &quot;&quot; \/\/ Could use Date type later\n}\n\nstruct PricingInfo {\n    let tourPrice: Int\n    let fuelSurcharge: Int\n    let serviceCharge: Int\n\n    var totalPrice: Int {\n        tourPrice + fuelSurcharge + serviceCharge\n    }\n}\n\n\/\/ MARK: - Main View\n\nstruct TouristInfoView: View {\n    \/\/ --- State Variables ---\n    @State private var tourists: [Tourist] = [Tourist()] \/\/ Start with one tourist\n    @State private var pricing = PricingInfo(\n        tourPrice: 186600,\n        fuelSurcharge: 9300,\n        serviceCharge: 2136\n    )\n\n    var body: some View {\n    \n        VStack {\n            ScrollView {\n                VStack(spacing: 8) { \/\/ Spacing between blocks\n\n                    \/\/ --- Tourist Information Block ---\n                    TouristListBlock(tourists: $tourists)\n\n                    \/\/ --- Add Tourist Button ---\n                    AddTouristButton {\n                        addNewTourist()\n                    }\n\n                    \/\/ --- Price Summary Block ---\n                    PriceSummaryBlock(pricing: pricing)\n                    PaymentButton(totalAmount: pricing.totalPrice) {\n                        \/\/ Action for payment\n                        print(&quot;Proceeding to pay \\(formattedPrice(pricing.totalPrice))&quot;)\n                    }\n\n                }\n                .padding(.horizontal) \/\/ Padding for the whole content stack\n                .padding(.top)\n            }\n            .background(Color(UIColor.systemGray6).ignoresSafeArea()) \/\/ Background for the whole screen\n        }\n    }\n\n    \/\/ --- Helper Functions ---\n\n    private func addNewTourist() {\n        withAnimation { \/\/ Animate the addition\n             tourists.append(Tourist())\n        }\n    }\n\n     private func formattedPrice(_ price: Int) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .decimal\n        formatter.groupingSeparator = &quot; &quot; \/\/ Use space as separator\n        return (formatter.string(from: NSNumber(value: price)) ?? &quot;\\(price)&quot;) + &quot; \u20bd&quot;\n    }\n}\n\n\/\/ MARK: - Child Views \/ Blocks\n\nstruct TouristListBlock: View {\n    @Binding var tourists: [Tourist]\n\n    var body: some View {\n        VStack(spacing: 8) { \/\/ Consistent spacing\n             ForEach($tourists) { $tourist in \/\/ Use $ for bindings\n                \/\/ Find the index for displaying the correct number\n                 if let index = tourists.firstIndex(where: { $0.id == tourist.id }) {\n                    TouristEntryView(\n                        tourist: $tourist,\n                        touristNumber: index + 1 \/\/ Pass the 1-based index\n                    )\n                 }\n            }\n        }\n        \/\/ No background\/cornerRadius here, apply it to TouristEntryView itself\n    }\n}\n\nstruct TouristEntryView: View {\n    @Binding var tourist: Tourist\n    let touristNumber: Int\n\n    \/\/ Helper to get ordinal string (&quot;\u041f\u0435\u0440\u0432\u044b\u0439&quot;, &quot;\u0412\u0442\u043e\u0440\u043e\u0439&quot;, etc.)\n    private func ordinal(number: Int) -&gt; String {\n        \/\/ Basic implementation, expand for more numbers if needed\n        switch number {\n        case 1: return &quot;\u041f\u0435\u0440\u0432\u044b\u0439&quot;\n        case 2: return &quot;\u0412\u0442\u043e\u0440\u043e\u0439&quot;\n        case 3: return &quot;\u0422\u0440\u0435\u0442\u0438\u0439&quot;\n        case 4: return &quot;\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439&quot;\n        case 5: return &quot;\u041f\u044f\u0442\u044b\u0439&quot;\n        default: return &quot;\\(number)-\u0439&quot;\n        }\n    }\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 0) { \/\/ No spacing for header\/content separation\n            \/\/ --- Header ---\n            HStack {\n                Text(&quot;\\(ordinal(number: touristNumber)) \u0442\u0443\u0440\u0438\u0441\u0442&quot;)\n                    .font(.system(size: 22, weight: .medium))\n                Spacer()\n                Button {\n                    withAnimation(.easeInOut(duration: 0.2)) { \/\/ Animate expand\/collapse\n                        tourist.isExpanded.toggle()\n                    }\n                } label: {\n                    Image(systemName: tourist.isExpanded ? &quot;chevron.up&quot; : &quot;chevron.down&quot;)\n                        .foregroundColor(.blue)\n                        .padding(8) \/\/ Increase tappable area\n                        .background(Color.blue.opacity(0.1))\n                        .clipShape(RoundedRectangle(cornerRadius: 6))\n                }\n            }\n            .padding() \/\/ Padding for the header itself\n\n            \/\/ --- Form Fields (Conditional) ---\n            if tourist.isExpanded {\n                VStack { \/\/ Spacing between fields\n                    StylizedTextField(placeholder: &quot;\u0418\u043c\u044f&quot;, \n                             text: $tourist.firstName)\n                    StylizedTextField(placeholder: &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, \n                             text: $tourist.lastName)\n                    StylizedTextField( placeholder: &quot;\u0414\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;, \n                             text: $tourist.dateOfBirth)\n                    StylizedTextField( placeholder: &quot;\u0413\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u0442\u0432\u043e&quot;, \n                             text: $tourist.citizenship)\n                    StylizedTextField(placeholder: &quot;\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0430\u043d\u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430&quot;, \n                             text: $tourist.passportNumber)\n                    StylizedTextField(\n                        placeholder: &quot;\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u0440\u0430\u043d\u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430&quot;, \n                        text: $tourist.passportExpiry)\n                }\n                .padding(.horizontal) \/\/ Padding for the form fields container\n                .padding(.bottom)    \/\/ Add padding at the bottom of the form\n                \/\/ Smooth transition for appearing fields\n                .transition(.opacity.combined(with: .move(edge: .top)))\n            }\n        }\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n}\n\n\/\/ Reusable TextField with placeholder label\nstruct StylizedTextField: View {\n    let placeholder: String\n    @Binding var text: String\n\n    var body: some View {\n            TextField(placeholder, text: $text)\n                .padding()\n                .background(Color.gray.opacity(0.1))\n                .cornerRadius(10)\n                .overlay (alignment: .top) {\n                if !text.isEmpty {\n                    Text(placeholder)\n                        .font(.system(size: 12))\n                        .foregroundColor(.gray)\n                        .padding(.leading, 12) \/\/ Indent title slightly\n                        .padding(.bottom, -2) \/\/ Pull textfield up a bit\n                        .zIndex(1) \/\/ Ensure title is above TextField background\n                }\n            }\n    }\n}\n\nstruct AddTouristButton: View {\n    let action: () -&gt; Void\n\n    var body: some View {\n        HStack {\n            Text(&quot;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0440\u0438\u0441\u0442\u0430&quot;)\n                .font(.system(size: 22, weight: .medium))\n            Spacer()\n            Button(action: action) {\n                Image(systemName: &quot;plus&quot;)\n                    .foregroundColor(.white)\n                    .padding()\n                    .background(Color.blue)\n                    .clipShape(RoundedRectangle(cornerRadius: 6))\n            }\n        }\n        .padding()\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n}\n\nstruct PriceSummaryBlock: View {\n    let pricing: PricingInfo\n\n    private func formattedPrice(_ price: Int) -&gt; String {\n        \/\/ Duplicated formatting logic for self-containment, could be centralized\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .decimal\n        formatter.groupingSeparator = &quot; &quot;\n        return (formatter.string(from: NSNumber(value: price)) ?? &quot;\\(price)&quot;) + &quot; \u20bd&quot;\n    }\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 16) {\n            PriceRow(label: &quot;\u0422\u0443\u0440&quot;, amount: pricing.tourPrice)\n            PriceRow(label: &quot;\u0422\u043e\u043f\u043b\u0438\u0432\u043d\u044b\u0439 \u0441\u0431\u043e\u0440&quot;, amount: pricing.fuelSurcharge)\n            PriceRow(label: &quot;\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0441\u0431\u043e\u0440&quot;, amount: pricing.serviceCharge)\n            PriceRow(label: &quot;\u041a \u043e\u043f\u043b\u0430\u0442\u0435&quot;, amount: pricing.totalPrice,\n                                                             isTotal: true)\n        }\n        .padding()\n        .background(Color.white)\n        .cornerRadius(12)\n    }\n}\n\n\/\/ Helper for rows in the price summary\nstruct PriceRow: View {\n    let label: String\n    let amount: Int\n    var isTotal: Bool = false\n\n    private func formattedPrice(_ price: Int) -&gt; String {\n         let formatter = NumberFormatter()\n         formatter.numberStyle = .decimal\n         formatter.groupingSeparator = &quot; &quot;\n         return (formatter.string(from: NSNumber(value: price)) ?? &quot;\\(price)&quot;) + &quot; \u20bd&quot;\n     }\n\n    var body: some View {\n        HStack {\n            Text(label)\n                .font(.system(size: 16))\n                .foregroundColor(.secondary)\n\n            Spacer()\n\n            Text(formattedPrice(amount))\n            .font(.system(size: 16, weight: isTotal ? .semibold : .regular))\n            .foregroundColor(isTotal ? .blue : .primary) \/\/ Highlight total price\n        }\n    }\n}\n\n\nstruct PaymentButton: View {\n    let totalAmount: Int\n    let action: () -&gt; Void\n\n    private func formattedPrice(_ price: Int) -&gt; String {\n         let formatter = NumberFormatter()\n         formatter.numberStyle = .decimal\n         formatter.groupingSeparator = &quot; &quot;\n         return (formatter.string(from: NSNumber(value: price)) ?? &quot;\\(price)&quot;) + &quot; \u20bd&quot;\n     }\n\n    var body: some View {\n        Button(action: action) {\n            Text(&quot;\u041e\u043f\u043b\u0430\u0442\u0438\u0442\u044c \\(formattedPrice(totalAmount))&quot;)\n                .font(.system(size: 16, weight: .medium))\n                .foregroundColor(.white)\n                .frame(maxWidth: .infinity)\n                .padding()\n                .background(Color.blue)\n                .cornerRadius(15)\n        }\n        .padding(.horizontal)\n        .padding(.vertical, 8) \/\/ Add some vertical padding\n        .background( \/\/ Add a white background behind the button area\n            Color.white\n              .ignoresSafeArea(edges: .bottom) \/\/ Extend white to screen bottom edge\n              .shadow(radius: 1) \/\/ Optional subtle shadow above button\n        )\n    }\n}\n\n\n\/\/ MARK: - Preview\n\n#Preview {\n        TouristInfoView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Data Models<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Tourist<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Necessary for ForEach<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isExpanded: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ State for collapsing\/expanding<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Form fields<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> firstName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> lastName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> dateOfBirth: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Could use Date type later<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> citizenship: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> passportNumber: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> passportExpiry: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Could use Date type later<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PricingInfo<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> tourPrice: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fuelSurcharge: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> serviceCharge: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> totalPrice: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        tourPrice + fuelSurcharge + serviceCharge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Main View<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">TouristInfoView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- State Variables ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> tourists: [Tourist] = [<\/span><span style=\"color: #61AFEF\">Tourist<\/span><span style=\"color: #ABB2BF\">()] <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Start with one tourist<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> pricing = <\/span><span style=\"color: #61AFEF\">PricingInfo<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">tourPrice<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">186600<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">fuelSurcharge<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">9300<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">serviceCharge<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">2136<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Spacing between blocks<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Tourist Information Block ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">TouristListBlock<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">tourists<\/span><span style=\"color: #ABB2BF\">: $tourists)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Add Tourist Button ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">AddTouristButton<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">addNewTourist<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Price Summary Block ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">PriceSummaryBlock<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">pricing<\/span><span style=\"color: #ABB2BF\">: pricing)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">PaymentButton<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">totalAmount<\/span><span style=\"color: #ABB2BF\">: pricing.<\/span><span style=\"color: #E06C75\">totalPrice<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Action for payment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Proceeding to pay <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(pricing.<\/span><span style=\"color: #E06C75\">totalPrice<\/span><span style=\"color: #ABB2BF\">)<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding for the whole content stack<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(UIColor.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">ignoresSafeArea<\/span><span style=\"color: #ABB2BF\">()) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Background for the whole screen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Helper Functions ---<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">addNewTourist<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">withAnimation<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Animate the addition<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             tourists.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Tourist<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">groupingSeparator<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot; &quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use space as separator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> (formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: price)) ?? <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">price<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">) + <\/span><span style=\"color: #98C379\">&quot; \u20bd&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Child Views \/ Blocks<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">TouristListBlock<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> tourists: [Tourist]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Consistent spacing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">($tourists) { $tourist <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use $ for bindings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Find the index for displaying the correct number<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = tourists.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">id<\/span><span style=\"color: #ABB2BF\"> == tourist.<\/span><span style=\"color: #E06C75\">id<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">TouristEntryView<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">tourist<\/span><span style=\"color: #ABB2BF\">: $tourist,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">touristNumber<\/span><span style=\"color: #ABB2BF\">: index + <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Pass the 1-based index<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ No background\/cornerRadius here, apply it to TouristEntryView itself<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">TouristEntryView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> tourist: Tourist<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> touristNumber: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper to get ordinal string (&quot;\u041f\u0435\u0440\u0432\u044b\u0439&quot;, &quot;\u0412\u0442\u043e\u0440\u043e\u0439&quot;, etc.)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">ordinal<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Basic implementation, expand for more numbers if needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">switch<\/span><span style=\"color: #ABB2BF\"> number {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;\u041f\u0435\u0440\u0432\u044b\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;\u0412\u0442\u043e\u0440\u043e\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">3<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;\u0422\u0440\u0435\u0442\u0438\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">5<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;\u041f\u044f\u0442\u044b\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">default:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">number<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">-\u0439&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ No spacing for header\/content separation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Header ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #61AFEF\">ordinal<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">number<\/span><span style=\"color: #ABB2BF\">: touristNumber)<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> \u0442\u0443\u0440\u0438\u0441\u0442&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">withAnimation<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">easeInOut<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">duration<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0.2<\/span><span style=\"color: #ABB2BF\">)) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Animate expand\/collapse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        tourist.<\/span><span style=\"color: #E06C75\">isExpanded<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">toggle<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: tourist.<\/span><span style=\"color: #E06C75\">isExpanded<\/span><span style=\"color: #ABB2BF\"> ? <\/span><span style=\"color: #98C379\">&quot;chevron.up&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;chevron.down&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Increase tappable area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">clipShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding for the header itself<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Form Fields (Conditional) ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> tourist.isExpanded {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Spacing between fields<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0418\u043c\u044f&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">firstName<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">lastName<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">( <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0414\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">dateOfBirth<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">( <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0413\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u0442\u0432\u043e&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">citizenship<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0430\u043d\u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">passportNumber<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u0440\u0430\u043d\u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $tourist.<\/span><span style=\"color: #E06C75\">passportExpiry<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding for the form fields container<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">)    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add padding at the bottom of the form<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Smooth transition for appearing fields<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">transition<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">opacity<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">combined<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #56B6C2\">move<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edge<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">)))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Reusable TextField with placeholder label<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">StylizedTextField<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> placeholder: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> text: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">TextField<\/span><span style=\"color: #ABB2BF\">(placeholder, <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $text)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">overlay<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">top<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !text.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(placeholder)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Indent title slightly<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">-2<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Pull textfield up a bit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">zIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensure title is above TextField background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AddTouristButton<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> action: () -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0440\u0438\u0441\u0442\u0430&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">22<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: action) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;plus&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">clipShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">6<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PriceSummaryBlock<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pricing: PricingInfo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Duplicated formatting logic for self-containment, could be centralized<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">groupingSeparator<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot; &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> (formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: price)) ?? <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">price<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">) + <\/span><span style=\"color: #98C379\">&quot; \u20bd&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">PriceRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0422\u0443\u0440&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">amount<\/span><span style=\"color: #ABB2BF\">: pricing.<\/span><span style=\"color: #E06C75\">tourPrice<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">PriceRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0422\u043e\u043f\u043b\u0438\u0432\u043d\u044b\u0439 \u0441\u0431\u043e\u0440&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">amount<\/span><span style=\"color: #ABB2BF\">: pricing.<\/span><span style=\"color: #E06C75\">fuelSurcharge<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">PriceRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0441\u0431\u043e\u0440&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">amount<\/span><span style=\"color: #ABB2BF\">: pricing.<\/span><span style=\"color: #E06C75\">serviceCharge<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">PriceRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">label<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\u041a \u043e\u043f\u043b\u0430\u0442\u0435&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">amount<\/span><span style=\"color: #ABB2BF\">: pricing.<\/span><span style=\"color: #E06C75\">totalPrice<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                             <\/span><span style=\"color: #61AFEF\">isTotal<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper for rows in the price summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PriceRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> label: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> amount: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isTotal: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         formatter.<\/span><span style=\"color: #E06C75\">groupingSeparator<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot; &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> (formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: price)) ?? <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">price<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">) + <\/span><span style=\"color: #98C379\">&quot; \u20bd&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(label)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(amount))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: isTotal ? .<\/span><span style=\"color: #E06C75\">semibold<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #E06C75\">regular<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(isTotal ? .<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Highlight total price<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PaymentButton<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> totalAmount: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> action: () -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">price<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         formatter.<\/span><span style=\"color: #E06C75\">groupingSeparator<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot; &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> (formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: price)) ?? <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">price<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">) + <\/span><span style=\"color: #98C379\">&quot; \u20bd&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: action) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u041e\u043f\u043b\u0430\u0442\u0438\u0442\u044c <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #61AFEF\">formattedPrice<\/span><span style=\"color: #ABB2BF\">(totalAmount)<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">white<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">blue<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">8<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add some vertical padding<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">( <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add a white background behind the button area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            Color.<\/span><span style=\"color: #E06C75\">white<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              .<\/span><span style=\"color: #61AFEF\">ignoresSafeArea<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edges<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Extend white to screen bottom edge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              .<\/span><span style=\"color: #61AFEF\">shadow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">radius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional subtle shadow above button<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Preview<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">TouristInfoView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u041c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (Tourist, PricingInfo):<\/strong> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. Tourist \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Identifiable \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 isExpanded. PricingInfo \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 totalPrice.<\/span><\/li>\n\n\n\n<li><strong>TouristInfoView (\u0433\u043b\u0430\u0432\u043d\u043e\u0435 View):<\/strong>\n<ul class=\"wp-block-list\">\n<li>   \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 @State \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 var: \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432 tourists: [Tourist] \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0446\u0435\u043d\u0430\u0445 pricing: PricingInfo.<\/li>\n\n\n\n<li>    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ScrollView \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430.<\/li>\n\n\n\n<li>    \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 (TouristListBlock, AddTouristButton, PriceSummaryBlock, PaymentButton) \u0432 VStack.<\/li>\n\n\n\n<li>    \u0424\u0443\u043d\u043a\u0446\u0438\u044f addNewTourist() \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0430 Tourist \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>TouristListBlock:<\/strong>\n<ul class=\"wp-block-list\">\n<li>     \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 @Binding \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432.<\/li>\n\n\n\n<li>     \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ForEach \u0434\u043b\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 $tourists ($ \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 isExpanded).<\/li>\n\n\n\n<li>     \u0421\u043e\u0437\u0434\u0430\u0435\u0442 TouristEntryView \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0438 \u043d\u043e\u043c\u0435\u0440 \u0442\u0443\u0440\u0438\u0441\u0442\u0430 (\u0438\u043d\u0434\u0435\u043a\u0441 + 1).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>TouristEntryView:<\/strong>\n<ul class=\"wp-block-list\">\n<li>    \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0430.<\/li>\n\n\n\n<li>    \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 @Binding \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0430.<\/li>\n\n\n\n<li>    \u0418\u043c\u0435\u0435\u0442 HStack \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430) \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\/\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c. \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Tourist.isExpanded \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439.<\/li>\n\n\n\n<li>    \u0423\u0441\u043b\u043e\u0432\u043d\u043e (if Tourist.isExpanded) \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 VStack, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 StylizedTextFields \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\/\u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e .transition.<\/li>\n\n\n\n<li>     \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0431\u0435\u043b\u044b\u0439 \u0444\u043e\u043d \u0438 \u0440\u0430\u0434\u0438\u0443\u0441 \u0443\u0433\u043b\u0430 \u0437\u0434\u0435\u0441\u044c.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>StylizedTextField: <\/strong>\u041c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 (\u043c\u0435\u0442\u043a\u0430 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>AddTouristButton: <\/strong>\u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438 &#171;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0440\u0438\u0441\u0442\u0430&#187; \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;+&#187;. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>PriceSummaryBlock \u0438 PriceRow: <\/strong>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0438 \u0446\u0435\u043d, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c, \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u0435\u043b. \u0412 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0436\u0438\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0441\u0438\u043d\u0438\u0439 \u0446\u0432\u0435\u0442.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>PaymentButton: <\/strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0438\u043d\u044f\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043d\u0438\u0437\u0443, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f \u043e\u0431\u0449\u0443\u044e \u0446\u0435\u043d\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (ordinal, formattedPrice):<\/strong> \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0447\u0438\u0441\u0435\u043b.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0421\u0442\u0438\u043b\u044c:<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u0441\u0442\u0443\u043f\u044b, \u0444\u043e\u043d\u044b, \u0440\u0430\u0434\u0438\u0443\u0441\u044b \u0443\u0433\u043b\u043e\u0432 \u0438 systemGray6 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u0442\u0438\u043b\u044e. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f\/\u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\/\u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 View \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-18.25.14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"548\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-18.25.14-548x1024.png\" alt=\"\" class=\"wp-image-16974\" style=\"width:360px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-18.25.14-548x1024.png 548w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-18.25.14-161x300.png 161w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Screenshot-2025-04-01-at-18.25.14.png 748w\" sizes=\"auto, (max-width: 548px) 100vw, 548px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 View \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Tourists.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"750\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Tourists.gif\" alt=\"\" class=\"wp-image-16972\" style=\"width:325px;height:auto\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 :<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Whole.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"750\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/Whole.gif\" alt=\"\" class=\"wp-image-16977\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Gemini 2.5 Experimental&nbsp;<\/strong>\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432 SwiftUI \u0441 \u043f\u043e\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0442\u0438\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u0432&nbsp;<strong>Figma<\/strong>. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 UI.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b\u0434\u0430\u0451\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 SwiftUI \u043a\u043e\u0434, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b Gemini 2.5 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Figma-\u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 iOS-\u043a\u043e\u0434.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430<a href=\"https:\/\/github.com\/BestKora\/HotelGemini2_5\" rel=\"noreferrer noopener\" target=\"_blank\">&nbsp;Github<\/a>.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &#171;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&#187; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &#171;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&#187; \u0438\u0437 \u0444\u043e\u0442\u043e.&nbsp; \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c &hellip; <a href=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/\">\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[131,138,139,14,54,132],"tags":[31,56,140,116],"class_list":["post-16889","post","type-post","status-publish","format-standard","hentry","category-ai","category-gemini","category-google-ai-studio","category-swift","category-swiftui","category-132","tag-swift","tag-swiftui","tag--gemini-2-5-pro","tag-116"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &quot;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&quot; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &quot;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&quot; \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"tatiana.kornilova@gmail.com\"\/>\n\t<meta name=\"keywords\" content=\"ios develope\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"ru_RU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &quot;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&quot; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &quot;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&quot; \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-03-28T17:23:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-04-06T11:50:32+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &quot;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&quot; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &quot;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&quot; \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#article\",\"name\":\"Google AI Studio c Gemini 2.5 \\u0434\\u043b\\u044f \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0438\\u0437 Figma | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"headline\":\"Google AI Studio c Gemini 2.5 \\u0434\\u043b\\u044f \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0438\\u0437 Figma\",\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/image.jpg\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#articleImage\",\"width\":1092,\"height\":672},\"datePublished\":\"2025-03-28T17:23:27+00:00\",\"dateModified\":\"2025-04-06T11:50:32+00:00\",\"inLanguage\":\"ru-RU\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#webpage\"},\"articleSection\":\"AI, Gemini, Google AI Studio, Swift, SwiftUI, \\u0418\\u0418, Swift, SwiftUI, \\u0418\\u0418 Gemini 2.5 Pro, \\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439 \\u0438\\u043d\\u0442\\u0435\\u043b\\u043b\\u0435\\u043a\\u0442\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"name\":\"Swift\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"position\":2,\"name\":\"Swift\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#listItem\",\"name\":\"Google AI Studio c Gemini 2.5 \\u0434\\u043b\\u044f \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0438\\u0437 Figma\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#listItem\",\"position\":3,\"name\":\"Google AI Studio c Gemini 2.5 \\u0434\\u043b\\u044f \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0438\\u0437 Figma\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"name\":\"Swift\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/\",\"name\":\"Google AI Studio c Gemini 2.5 \\u0434\\u043b\\u044f \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0438\\u0437 Figma | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u041c\\u043d\\u0435 \\u0441\\u043b\\u0443\\u0447\\u0430\\u0439\\u043d\\u043e \\u043f\\u043e\\u043f\\u0430\\u043b\\u043e\\u0441\\u044c \\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0435 \\u0441 \\u0441\\u043e\\u0431\\u0435\\u0441\\u0435\\u0434\\u043e\\u0432\\u0430\\u043d\\u0438\\u044f 2-\\u0445 \\u0433\\u043e\\u0434\\u0438\\u0447\\u043d\\u043e\\u0439 \\u0434\\u0430\\u0432\\u043d\\u043e\\u0441\\u0442\\u0438 \\u043d\\u0430 \\u043f\\u043e\\u0437\\u0438\\u0446\\u0438\\u044e \\\"iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u0447\\u0438\\u043a\\\" , \\u0432 \\u043a\\u043e\\u0442\\u043e\\u0440\\u043e\\u043c \\u0442\\u0440\\u0435\\u0431\\u043e\\u0432\\u0430\\u043b\\u043e\\u0441\\u044c \\u0441\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u0434\\u043b\\u044f \\u0431\\u0440\\u043e\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u044f \\u043d\\u043e\\u043c\\u0435\\u0440\\u0430 \\u0432 \\u041e\\u0442\\u0435\\u043b\\u0435 \\u043d\\u0430 \\u043e\\u0441\\u043d\\u043e\\u0432\\u0435 \\u043c\\u0430\\u043a\\u0435\\u0442\\u043e\\u0432 \\u044d\\u043a\\u0440\\u0430\\u043d\\u043e\\u0432 \\u0438\\u0437 Figma, \\u0432 \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0445 \\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u043b\\u0430\\u0441\\u044c \\\"\\u043a\\u0430\\u0440\\u0443\\u0441\\u0435\\u043b\\u044c\\\" \\u0438\\u0437 \\u0444\\u043e\\u0442\\u043e. \\u042f \\u0440\\u0435\\u0448\\u0438\\u043b\\u0430 \\u043f\\u043e\\u043f\\u0440\\u043e\\u0431\\u043e\\u0432\\u0430\\u0442\\u044c \\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c \\u0418\\u0418 \\u0434\\u043b\\u044f \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0438 \\u0442\\u0430\\u043a\\u043e\\u0433\\u043e iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u043f\\u043e \\u043c\\u0430\\u043a\\u0435\\u0442\\u0430\\u043c \\u0438\\u0437 Figma. \\u041f\\u0440\\u044f\\u043c\\u043e \\u0441\\u043a\\u0430\\u0436\\u0435\\u043c, \\u0447\\u0442\\u043e \\u0442\\u0435\\u043a\\u0441\\u0442\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"datePublished\":\"2025-03-28T17:23:27+00:00\",\"dateModified\":\"2025-04-06T11:50:32+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/\",\"name\":\"\\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \\u043d\\u0435\\u0430\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0441\\u043f\\u0435\\u043a\\u0442 \\u043b\\u0435\\u043a\\u0446\\u0438\\u0439 \\u0421\\u0442\\u044d\\u043d\\u0444\\u043e\\u0440\\u0434\\u0441\\u043a\\u043e\\u0433\\u043e \\u0443\\u043d\\u0438\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442\\u0430 \\\" \\u0420\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439\\\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \\u0438 2026 \\u0433\\u0433., \\u0441\\u043e\\u043f\\u0440\\u043e\\u0432\\u043e\\u0436\\u0434\\u0430\\u0435\\u043c\\u044b\\u0439 \\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438 \\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0439 \\u0438 \\u0434\\u043e\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438, \\u0441\\u0432\\u044f\\u0437\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438 \\u0441 \\u0430\\u0434\\u0430\\u043f\\u0442\\u0430\\u0446\\u0438\\u0435\\u0439 \\u043a\\u0443\\u0440\\u0441\\u043e\\u0432 \\u043a \\u043d\\u043e\\u0432\\u044b\\u043c \\u0432\\u0435\\u0440\\u0441\\u0438\\u044f\\u043c Swift, Objective-C \\u0438 iOS.\",\"inLanguage\":\"ru-RU\",\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \"iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\" , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \"\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c\" \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"ios develope","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#article","name":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","headline":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma","author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/03\/image.jpg","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#articleImage","width":1092,"height":672},"datePublished":"2025-03-28T17:23:27+00:00","dateModified":"2025-04-06T11:50:32+00:00","inLanguage":"ru-RU","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#webpage"},"articleSection":"AI, Gemini, Google AI Studio, Swift, SwiftUI, \u0418\u0418, Swift, SwiftUI, \u0418\u0418 Gemini 2.5 Pro, \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442"},{"@type":"BreadcrumbList","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","position":1,"name":"Home","item":"https:\/\/bestkora.com\/IosDeveloper","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","name":"Swift"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","position":2,"name":"Swift","item":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#listItem","name":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#listItem","position":3,"name":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma","previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","name":"Swift"}}]},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/#person","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author","url":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"WebPage","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/","name":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \"iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\" , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \"\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c\" \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/#breadcrumblist"},"author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"creator":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"datePublished":"2025-03-28T17:23:27+00:00","dateModified":"2025-04-06T11:50:32+00:00"},{"@type":"WebSite","@id":"https:\/\/bestkora.com\/IosDeveloper\/#website","url":"https:\/\/bestkora.com\/IosDeveloper\/","name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"}}]},"og:locale":"ru_RU","og:site_name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","og:type":"article","og:title":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","og:description":"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &quot;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&quot; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &quot;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&quot; \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442","og:url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/","article:published_time":"2025-03-28T17:23:27+00:00","article:modified_time":"2025-04-06T11:50:32+00:00","twitter:card":"summary","twitter:title":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","twitter:description":"\u041c\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f 2-\u0445 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e &quot;iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a&quot; , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u041e\u0442\u0435\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438\u0437 Figma, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c &quot;\u043a\u0430\u0440\u0443\u0441\u0435\u043b\u044c&quot; \u0438\u0437 \u0444\u043e\u0442\u043e. \u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0418\u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u043a\u0435\u0442\u0430\u043c \u0438\u0437 Figma. \u041f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442"},"aioseo_meta_data":{"post_id":"16889","title":null,"description":null,"keywords":[{"label":"iOS develope","value":"iOS develope"}],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2025-03-28 17:17:05","updated":"2026-02-22 20:12:56","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/\" title=\"Swift\">Swift<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tGoogle AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/bestkora.com\/IosDeveloper"},{"label":"Swift","link":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/"},{"label":"Google AI Studio c Gemini 2.5 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 Figma","link":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-google-ai-studio-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%bf%d1%80\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16889","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/comments?post=16889"}],"version-history":[{"count":5,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16889\/revisions"}],"predecessor-version":[{"id":17006,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16889\/revisions\/17006"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=16889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=16889"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=16889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}