diff --git a/.deploy-manifest.json b/.deploy-manifest.json deleted file mode 100644 index 8502c33..0000000 --- a/.deploy-manifest.json +++ /dev/null @@ -1,1586 +0,0 @@ -{ - "assets/ai-platform-primo-rpa/.gitkeep": { - "mtime": 1777548036560.4653, - "size": 2 - }, - "assets/ai-platform-primo-rpa/cover.png": { - "mtime": 1779377996031.643, - "size": 159015 - }, - "assets/ai-platform-primo-rpa/cover.webp": { - "mtime": 1779377996032.6443, - "size": 30364 - }, - "assets/ai-platform-primo-rpa/dataset-editor-old.png": { - "mtime": 1777636422809.364, - "size": 888287 - }, - "assets/ai-platform-primo-rpa/dataset-editor-old.webp": { - "mtime": 1779295491001, - "size": 280160 - }, - "assets/ai-platform-primo-rpa/dataset-editor-small-screen.png": { - "mtime": 1779377996036.6465, - "size": 404244 - }, - "assets/ai-platform-primo-rpa/dataset-editor-small-screen.webp": { - "mtime": 1779377996037.6458, - "size": 88614 - }, - "assets/ai-platform-primo-rpa/dataset-editor.png": { - "mtime": 1779377996046.131, - "size": 819234 - }, - "assets/ai-platform-primo-rpa/dataset-editor.webp": { - "mtime": 1779377996048.131, - "size": 153230 - }, - "assets/ai-platform-primo-rpa/dataset-lerning.png": { - "mtime": 1778061201695.4707, - "size": 178506 - }, - "assets/ai-platform-primo-rpa/dataset-lerning.webp": { - "mtime": 1779295491358, - "size": 76082 - }, - "assets/ai-platform-primo-rpa/dataset-quality.png": { - "mtime": 1778061201699.9893, - "size": 256076 - }, - "assets/ai-platform-primo-rpa/dataset-quality.webp": { - "mtime": 1779295491507, - "size": 101230 - }, - "assets/ai-platform-primo-rpa/dataset_editor-main_toolbar.png": { - "mtime": 1779377996049.637, - "size": 15031 - }, - "assets/ai-platform-primo-rpa/dataset_editor-main_toolbar.webp": { - "mtime": 1779377996050.6484, - "size": 6034 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-default_mode.png": { - "mtime": 1779377996050.6484, - "size": 47547 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-default_mode.webp": { - "mtime": 1779377996051.6475, - "size": 38664 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-both_panels.png": { - "mtime": 1779377996053.8552, - "size": 56585 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-both_panels.webp": { - "mtime": 1779377996054.8564, - "size": 44568 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-left_panel.png": { - "mtime": 1779377996056.8555, - "size": 59824 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-left_panel.webp": { - "mtime": 1779377996057.8606, - "size": 55050 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-right_panel.png": { - "mtime": 1779377996058.8574, - "size": 60884 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode-right_panel.webp": { - "mtime": 1779377996059.86, - "size": 55078 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode.png": { - "mtime": 1779377996060.891, - "size": 64220 - }, - "assets/ai-platform-primo-rpa/dataset_editor-wireframe-zen_mode.webp": { - "mtime": 1779377996062.934, - "size": 63640 - }, - "assets/ai-platform-primo-rpa/fields-maping.mp4": { - "mtime": 1778061201754.2502, - "size": 12663587 - }, - "assets/ai-platform-primo-rpa/fields-maping.webm": { - "mtime": 1778061201761.628, - "size": 811806 - }, - "assets/ai-platform-primo-rpa/fields-maping.webp": { - "mtime": 1778061201763.6267, - "size": 86646 - }, - "assets/ai-platform-primo-rpa/full-screen-mode-with-panels.png": { - "mtime": 1778061201769.9807, - "size": 555909 - }, - "assets/ai-platform-primo-rpa/full-screen-mode-with-panels.webp": { - "mtime": 1779295492433, - "size": 110334 - }, - "assets/ai-platform-primo-rpa/full-screen-mode-zen.png": { - "mtime": 1778061201774.9817, - "size": 502027 - }, - "assets/ai-platform-primo-rpa/full-screen-mode-zen.webp": { - "mtime": 1779295492517, - "size": 94372 - }, - "assets/ai-platform-primo-rpa/fullscreen_modal-import_dataset.png": { - "mtime": 1779377996064.941, - "size": 72399 - }, - "assets/ai-platform-primo-rpa/fullscreen_modal-import_dataset.webp": { - "mtime": 1779377996066.941, - "size": 26252 - }, - "assets/ai-platform-primo-rpa/fullscreen_modal-in_project-import_dataset.png": { - "mtime": 1779377996069.4497, - "size": 130169 - }, - "assets/ai-platform-primo-rpa/fullscreen_modal-in_project-import_dataset.webp": { - "mtime": 1779377996071.4585, - "size": 30506 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-learning_process.png": { - "mtime": 1779377996073.4573, - "size": 113156 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-learning_process.webp": { - "mtime": 1779377996075.4573, - "size": 67896 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-learning_process_wireframe.png": { - "mtime": 1779377996076.4575, - "size": 8462 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-learning_process_wireframe.webp": { - "mtime": 1779377996077.4592, - "size": 4008 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-new.png": { - "mtime": 1779377996079.963, - "size": 109260 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-new.webp": { - "mtime": 1779377996081.969, - "size": 77098 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-сollapsed.png": { - "mtime": 1779377996082.9697, - "size": 6342 - }, - "assets/ai-platform-primo-rpa/in_project-learn-card-сollapsed.webp": { - "mtime": 1779377996085.1777, - "size": 4868 - }, - "assets/ai-platform-primo-rpa/in_project-learn-overview.png": { - "mtime": 1779377996088.1775, - "size": 147934 - }, - "assets/ai-platform-primo-rpa/in_project-learn-overview.webp": { - "mtime": 1779377996089.6838, - "size": 28904 - }, - "assets/ai-platform-primo-rpa/main-new.png": { - "mtime": 1779377996092.691, - "size": 191708 - }, - "assets/ai-platform-primo-rpa/main-new.webp": { - "mtime": 1779377996093.6912, - "size": 56804 - }, - "assets/ai-platform-primo-rpa/main.png": { - "mtime": 1779377996099.692, - "size": 430951 - }, - "assets/ai-platform-primo-rpa/main.webp": { - "mtime": 1779377996101.8147, - "size": 108008 - }, - "assets/ai-platform-primo-rpa/nav-project-nlp.png": { - "mtime": 1779377996103.8135, - "size": 109931 - }, - "assets/ai-platform-primo-rpa/nav-project-nlp.webp": { - "mtime": 1779377996104.8171, - "size": 18854 - }, - "assets/ai-platform-primo-rpa/nav-project-ocr.png": { - "mtime": 1779377996106.8132, - "size": 116365 - }, - "assets/ai-platform-primo-rpa/nav-project-ocr.webp": { - "mtime": 1779377996107.8135, - "size": 24166 - }, - "assets/ai-platform-primo-rpa/nav-secondary-detail_view.png": { - "mtime": 1779377996108.8142, - "size": 17770 - }, - "assets/ai-platform-primo-rpa/nav-secondary-detail_view.webp": { - "mtime": 1779377996108.8142, - "size": 5266 - }, - "assets/favicon/android-chrome-192x192.png": { - "mtime": 1780513420000, - "size": 45462 - }, - "assets/favicon/android-chrome-512x512.png": { - "mtime": 1780513420000, - "size": 259917 - }, - "assets/favicon/apple-touch-icon.png": { - "mtime": 1780513420000, - "size": 41086 - }, - "assets/favicon/favicon-16x16.png": { - "mtime": 1780513420000, - "size": 776 - }, - "assets/favicon/favicon-32x32.png": { - "mtime": 1780513420000, - "size": 2166 - }, - "assets/favicon/favicon.ico": { - "mtime": 1780513420000, - "size": 15406 - }, - "assets/favicon/favicon.png": { - "mtime": 1780520464204.617, - "size": 778312 - }, - "assets/favicon/favicon_bg.png": { - "mtime": 1780520601264.4983, - "size": 791215 - }, - "assets/favicon/site.webmanifest": { - "mtime": 1780513420000, - "size": 263 - }, - "assets/fonts/files/alice-cyrillic-400-normal.woff2": { - "mtime": 1779377996112.3274, - "size": 17784 - }, - "assets/fonts/files/alice-cyrillic-ext-400-normal.woff2": { - "mtime": 1779377996113.3308, - "size": 15748 - }, - "assets/fonts/files/alice-latin-400-normal.woff2": { - "mtime": 1779377996114.3271, - "size": 25788 - }, - "assets/fonts/files/alice-latin-ext-400-normal.woff2": { - "mtime": 1779377996115.328, - "size": 4880 - }, - "assets/fonts/files/geologica-cyrillic-ext-wght-normal.woff2": { - "mtime": 1779377996117.3262, - "size": 11488 - }, - "assets/fonts/files/geologica-cyrillic-wght-normal.woff2": { - "mtime": 1779377996118.3267, - "size": 16428 - }, - "assets/fonts/files/geologica-greek-wght-normal.woff2": { - "mtime": 1779377996118.3267, - "size": 10928 - }, - "assets/fonts/files/geologica-latin-ext-wght-normal.woff2": { - "mtime": 1779377996119.833, - "size": 22404 - }, - "assets/fonts/files/geologica-latin-wght-normal.woff2": { - "mtime": 1779377996120.8398, - "size": 24944 - }, - "assets/fonts/files/geologica-vietnamese-wght-normal.woff2": { - "mtime": 1779377996121.8386, - "size": 8328 - }, - "assets/fonts/files/merriweather-cyrillic-400-normal.woff2": { - "mtime": 1779377996122.839, - "size": 25484 - }, - "assets/fonts/files/merriweather-cyrillic-700-normal.woff2": { - "mtime": 1779377996123.8394, - "size": 25492 - }, - "assets/fonts/files/merriweather-cyrillic-ext-400-normal.woff2": { - "mtime": 1779377996124.9783, - "size": 18600 - }, - "assets/fonts/files/merriweather-cyrillic-ext-700-normal.woff2": { - "mtime": 1779377996125.9778, - "size": 18560 - }, - "assets/fonts/files/merriweather-latin-400-normal.woff2": { - "mtime": 1779377996126.9783, - "size": 49168 - }, - "assets/fonts/files/merriweather-latin-700-normal.woff2": { - "mtime": 1779377996127.9773, - "size": 48660 - }, - "assets/fonts/files/merriweather-latin-ext-400-normal.woff2": { - "mtime": 1779377996129.4827, - "size": 42952 - }, - "assets/fonts/files/merriweather-latin-ext-700-normal.woff2": { - "mtime": 1779377996130.4888, - "size": 42880 - }, - "assets/fonts/files/merriweather-vietnamese-400-normal.woff2": { - "mtime": 1779377996131.49, - "size": 6664 - }, - "assets/fonts/files/merriweather-vietnamese-700-normal.woff2": { - "mtime": 1779377996133.4978, - "size": 6660 - }, - "assets/fonts/files/pt-mono-cyrillic-400-normal.woff2": { - "mtime": 1779377996134.4993, - "size": 15356 - }, - "assets/fonts/files/pt-mono-cyrillic-ext-400-normal.woff2": { - "mtime": 1779377996135.4956, - "size": 22028 - }, - "assets/fonts/files/pt-mono-latin-400-normal.woff2": { - "mtime": 1779377996136.4954, - "size": 27436 - }, - "assets/fonts/files/pt-mono-latin-ext-400-normal.woff2": { - "mtime": 1779377996137.4963, - "size": 16072 - }, - "assets/fonts/files/pt-sans-cyrillic-400-normal.woff2": { - "mtime": 1779377996138.4968, - "size": 28548 - }, - "assets/fonts/files/pt-sans-cyrillic-700-normal.woff2": { - "mtime": 1779377996139.4963, - "size": 30164 - }, - "assets/fonts/files/pt-sans-cyrillic-ext-400-normal.woff2": { - "mtime": 1779377996140.0027, - "size": 42680 - }, - "assets/fonts/files/pt-sans-cyrillic-ext-700-normal.woff2": { - "mtime": 1779377996142.004, - "size": 39584 - }, - "assets/fonts/files/pt-sans-latin-400-normal.woff2": { - "mtime": 1779377996143.0056, - "size": 45532 - }, - "assets/fonts/files/pt-sans-latin-700-normal.woff2": { - "mtime": 1779377996144.0051, - "size": 47180 - }, - "assets/fonts/files/pt-sans-latin-ext-400-normal.woff2": { - "mtime": 1779377996145.0054, - "size": 26812 - }, - "assets/fonts/files/pt-sans-latin-ext-700-normal.woff2": { - "mtime": 1779377996147.0066, - "size": 29624 - }, - "assets/fonts/files/source-code-pro-cyrillic-400-normal.woff2": { - "mtime": 1779377996147.0066, - "size": 6788 - }, - "assets/fonts/files/source-code-pro-cyrillic-500-normal.woff2": { - "mtime": 1779377996148.0044, - "size": 6836 - }, - "assets/fonts/files/source-code-pro-cyrillic-600-normal.woff2": { - "mtime": 1779377996149.5103, - "size": 6796 - }, - "assets/fonts/files/source-code-pro-cyrillic-700-normal.woff2": { - "mtime": 1779377996150.517, - "size": 6800 - }, - "assets/fonts/files/source-code-pro-cyrillic-ext-400-normal.woff2": { - "mtime": 1779377996150.517, - "size": 4516 - }, - "assets/fonts/files/source-code-pro-cyrillic-ext-500-normal.woff2": { - "mtime": 1779377996151.5173, - "size": 4556 - }, - "assets/fonts/files/source-code-pro-cyrillic-ext-600-normal.woff2": { - "mtime": 1779377996152.5176, - "size": 4520 - }, - "assets/fonts/files/source-code-pro-cyrillic-ext-700-normal.woff2": { - "mtime": 1779377996153.5164, - "size": 4480 - }, - "assets/fonts/files/source-code-pro-greek-400-normal.woff2": { - "mtime": 1779377996154.5195, - "size": 5528 - }, - "assets/fonts/files/source-code-pro-greek-500-normal.woff2": { - "mtime": 1779377996155.5168, - "size": 5584 - }, - "assets/fonts/files/source-code-pro-greek-600-normal.woff2": { - "mtime": 1779377996155.5168, - "size": 5532 - }, - "assets/fonts/files/source-code-pro-greek-700-normal.woff2": { - "mtime": 1779377996156.5166, - "size": 5528 - }, - "assets/fonts/files/source-code-pro-greek-ext-400-normal.woff2": { - "mtime": 1779377996157.5166, - "size": 1852 - }, - "assets/fonts/files/source-code-pro-greek-ext-500-normal.woff2": { - "mtime": 1779377996158.5164, - "size": 1856 - }, - "assets/fonts/files/source-code-pro-greek-ext-600-normal.woff2": { - "mtime": 1779377996159.5183, - "size": 1868 - }, - "assets/fonts/files/source-code-pro-greek-ext-700-normal.woff2": { - "mtime": 1779377996160.6191, - "size": 1824 - }, - "assets/fonts/files/source-code-pro-latin-400-normal.woff2": { - "mtime": 1779377996160.6191, - "size": 11656 - }, - "assets/fonts/files/source-code-pro-latin-500-normal.woff2": { - "mtime": 1779377996161.619, - "size": 11604 - }, - "assets/fonts/files/source-code-pro-latin-600-normal.woff2": { - "mtime": 1779377996163.6172, - "size": 11628 - }, - "assets/fonts/files/source-code-pro-latin-700-normal.woff2": { - "mtime": 1779377996163.6172, - "size": 11540 - }, - "assets/fonts/files/source-code-pro-latin-ext-400-normal.woff2": { - "mtime": 1779377996165.6191, - "size": 17748 - }, - "assets/fonts/files/source-code-pro-latin-ext-500-normal.woff2": { - "mtime": 1779377996166.6196, - "size": 17752 - }, - "assets/fonts/files/source-code-pro-latin-ext-600-normal.woff2": { - "mtime": 1779377996167.6196, - "size": 17640 - }, - "assets/fonts/files/source-code-pro-latin-ext-700-normal.woff2": { - "mtime": 1779377996168.6196, - "size": 17644 - }, - "assets/fonts/files/source-code-pro-vietnamese-400-normal.woff2": { - "mtime": 1779377996169.619, - "size": 4752 - }, - "assets/fonts/files/source-code-pro-vietnamese-500-normal.woff2": { - "mtime": 1779377996170.1245, - "size": 4804 - }, - "assets/fonts/files/source-code-pro-vietnamese-600-normal.woff2": { - "mtime": 1779377996171.1304, - "size": 4704 - }, - "assets/fonts/files/source-code-pro-vietnamese-700-normal.woff2": { - "mtime": 1779377996172.1353, - "size": 4748 - }, - "assets/fonts/geologica.css": { - "mtime": 1779377996172.1353, - "size": 5047 - }, - "assets/fonts/merriweather.css": { - "mtime": 1779377996173.1355, - "size": 5119 - }, - "assets/fonts/mono.css": { - "mtime": 1779377996174.135, - "size": 11463 - }, - "assets/index/ava-bg-1.png": { - "mtime": 1776187876634.7048, - "size": 1279764 - }, - "assets/index/ava-bg-1.webp": { - "mtime": 1777054556943, - "size": 81378 - }, - "assets/index/me-transparentBG-1.png": { - "mtime": 1776189627628.54, - "size": 1011694 - }, - "assets/index/me-transparentBG-1.webp": { - "mtime": 1777054557058, - "size": 141834 - }, - "assets/index/me_motion.mp4": { - "mtime": 1777636422897.9202, - "size": 311169 - }, - "assets/index/me_motion.webm": { - "mtime": 1777636422899.8853, - "size": 215347 - }, - "assets/index/me_motion.webp": { - "mtime": 1777636422902.3997, - "size": 79376 - }, - "assets/index/me_static.png": { - "mtime": 1777636422916.1433, - "size": 1592317 - }, - "assets/index/me_static.webp": { - "mtime": 1777636422917.152, - "size": 141572 - }, - "assets/lunacy/.gitkeep": { - "mtime": 1779377996175.1355, - "size": 2 - }, - "assets/lunacy/blob_settings_on_canvas.png": { - "mtime": 1779377996193.6858, - "size": 185060 - }, - "assets/lunacy/blob_settings_on_canvas.webp": { - "mtime": 1779377996194.6858, - "size": 48762 - }, - "assets/lunacy/blob_settings_panel_v1.png": { - "mtime": 1779377996195.6848, - "size": 16000 - }, - "assets/lunacy/blob_settings_panel_v1.webp": { - "mtime": 1779377996196.6843, - "size": 6868 - }, - "assets/lunacy/blob_settings_panel_v2.png": { - "mtime": 1779377996196.6843, - "size": 13903 - }, - "assets/lunacy/blob_settings_panel_v2.webp": { - "mtime": 1779377996197.6863, - "size": 4308 - }, - "assets/lunacy/blob_settings_panel_v3.png": { - "mtime": 1779377996197.6863, - "size": 20852 - }, - "assets/lunacy/blob_settings_panel_v3.webp": { - "mtime": 1779377996198.6855, - "size": 9948 - }, - "assets/lunacy/blob_settings_panel_v4.png": { - "mtime": 1779377996198.6855, - "size": 15539 - }, - "assets/lunacy/blob_settings_panel_v4.webp": { - "mtime": 1779377996199.6868, - "size": 3930 - }, - "assets/lunacy/blob_settings_panel_v5.png": { - "mtime": 1779377996200.7917, - "size": 14378 - }, - "assets/lunacy/blob_settings_panel_v5.webp": { - "mtime": 1779377996200.7917, - "size": 3864 - }, - "assets/lunacy/blob_settings_panel_v6.png": { - "mtime": 1779377996201.7903, - "size": 14869 - }, - "assets/lunacy/blob_settings_panel_v6.webp": { - "mtime": 1779377996202.7896, - "size": 4080 - }, - "assets/lunacy/blob_settings_panel_v7.png": { - "mtime": 1779377996202.7896, - "size": 23381 - }, - "assets/lunacy/blob_settings_panel_v7.webp": { - "mtime": 1779377996203.7908, - "size": 7690 - }, - "assets/lunacy/blob_settings_panel_v8.png": { - "mtime": 1779377996204.7915, - "size": 15387 - }, - "assets/lunacy/blob_settings_panel_v8.webp": { - "mtime": 1779377996204.7915, - "size": 4542 - }, - "assets/lunacy/blob_settings_panel_v9.png": { - "mtime": 1779377996205.7905, - "size": 18344 - }, - "assets/lunacy/blob_settings_panel_v9.webp": { - "mtime": 1779377996206.7903, - "size": 8820 - }, - "assets/lunacy/compare_components_modal_window.png": { - "mtime": 1779377996207.7922, - "size": 103262 - }, - "assets/lunacy/compare_components_modal_window.webp": { - "mtime": 1779377996208.7913, - "size": 23548 - }, - "assets/lunacy/components_update_indicator_location_panel.png": { - "mtime": 1779377996210.2961, - "size": 75843 - }, - "assets/lunacy/components_update_indicator_location_panel.webp": { - "mtime": 1779377996211.3025, - "size": 24570 - }, - "assets/lunacy/cover.webp": { - "mtime": 1779377996212.307, - "size": 198532 - }, - "assets/lunacy/Lunacy_app_overview.png": { - "mtime": 1779377996188.6538, - "size": 1304403 - }, - "assets/lunacy/Lunacy_app_overview.webp": { - "mtime": 1779377996191.6865, - "size": 198532 - }, - "assets/lunacy/modal_window_for_prototype_create_on_canvas.png": { - "mtime": 1779377996218.308, - "size": 699587 - }, - "assets/lunacy/modal_window_for_prototype_create_on_canvas.webp": { - "mtime": 1779377996219.8125, - "size": 114986 - }, - "assets/lunacy/modal_window_for_prototype_panel_states.png": { - "mtime": 1779377996221.818, - "size": 163537 - }, - "assets/lunacy/modal_window_for_prototype_panel_states.webp": { - "mtime": 1779377996222.8186, - "size": 67292 - }, - "assets/lunacy/shadow_pro_settings_ideas.png": { - "mtime": 1779377996224.3208, - "size": 150278 - }, - "assets/lunacy/shadow_pro_settings_ideas.webp": { - "mtime": 1779377996225.3252, - "size": 41824 - }, - "assets/lunacy/shadow_pro_settings_modal_auto-off.png": { - "mtime": 1779377996227.3298, - "size": 149676 - }, - "assets/lunacy/shadow_pro_settings_modal_auto-off.webp": { - "mtime": 1779377996228.329, - "size": 20878 - }, - "assets/lunacy/shadow_pro_settings_modal_auto_on.png": { - "mtime": 1779377996229.8337, - "size": 133884 - }, - "assets/lunacy/shadow_pro_settings_modal_auto_on.webp": { - "mtime": 1779377996230.84, - "size": 20552 - }, - "assets/lunacy/shadow_pro_settings_panel.png": { - "mtime": 1779377996232.8403, - "size": 175508 - }, - "assets/lunacy/shadow_pro_settings_panel.webp": { - "mtime": 1779377996233.8416, - "size": 64304 - }, - "assets/lunacy/sliders_all_set.png": { - "mtime": 1779377996260.5515, - "size": 653520 - }, - "assets/lunacy/sliders_all_set.webp": { - "mtime": 1779377996261.5532, - "size": 82004 - }, - "assets/lunacy/slider_14.png": { - "mtime": 1779377996233.8416, - "size": 15296 - }, - "assets/lunacy/slider_14.webp": { - "mtime": 1779377996234.8418, - "size": 6104 - }, - "assets/lunacy/slider_v1.png": { - "mtime": 1779377996235.8403, - "size": 11997 - }, - "assets/lunacy/slider_v1.webp": { - "mtime": 1779377996235.8403, - "size": 4894 - }, - "assets/lunacy/slider_v10.png": { - "mtime": 1779377996236.8413, - "size": 16438 - }, - "assets/lunacy/slider_v10.webp": { - "mtime": 1779377996237.8428, - "size": 5316 - }, - "assets/lunacy/slider_v11.png": { - "mtime": 1779377996237.8428, - "size": 15713 - }, - "assets/lunacy/slider_v11.webp": { - "mtime": 1779377996238.8408, - "size": 5264 - }, - "assets/lunacy/slider_v12.png": { - "mtime": 1779377996239.8408, - "size": 16355 - }, - "assets/lunacy/slider_v12.webp": { - "mtime": 1779377996239.8408, - "size": 5236 - }, - "assets/lunacy/slider_v13.png": { - "mtime": 1779377996240.93, - "size": 16412 - }, - "assets/lunacy/slider_v13.webp": { - "mtime": 1779377996240.93, - "size": 4780 - }, - "assets/lunacy/slider_v15.png": { - "mtime": 1779377996241.9312, - "size": 16438 - }, - "assets/lunacy/slider_v15.webp": { - "mtime": 1779377996241.9312, - "size": 5316 - }, - "assets/lunacy/slider_v16.png": { - "mtime": 1779377996242.932, - "size": 16992 - }, - "assets/lunacy/slider_v16.webp": { - "mtime": 1779377996242.932, - "size": 5042 - }, - "assets/lunacy/slider_v17.png": { - "mtime": 1779377996243.93, - "size": 14273 - }, - "assets/lunacy/slider_v17.webp": { - "mtime": 1779377996244.9321, - "size": 4370 - }, - "assets/lunacy/slider_v18.png": { - "mtime": 1779377996244.9321, - "size": 15153 - }, - "assets/lunacy/slider_v18.webp": { - "mtime": 1779377996245.9304, - "size": 5138 - }, - "assets/lunacy/slider_v2.png": { - "mtime": 1779377996245.9304, - "size": 12918 - }, - "assets/lunacy/slider_v2.webp": { - "mtime": 1779377996246.9302, - "size": 5676 - }, - "assets/lunacy/slider_v3.png": { - "mtime": 1779377996247.9326, - "size": 24683 - }, - "assets/lunacy/slider_v3.webp": { - "mtime": 1779377996247.9326, - "size": 6056 - }, - "assets/lunacy/slider_v4.png": { - "mtime": 1779377996249.4392, - "size": 21075 - }, - "assets/lunacy/slider_v4.webp": { - "mtime": 1779377996250.448, - "size": 5806 - }, - "assets/lunacy/slider_v5.png": { - "mtime": 1779377996251.4482, - "size": 13119 - }, - "assets/lunacy/slider_v5.webp": { - "mtime": 1779377996251.4482, - "size": 5512 - }, - "assets/lunacy/slider_v6.png": { - "mtime": 1779377996252.4485, - "size": 15467 - }, - "assets/lunacy/slider_v6.webp": { - "mtime": 1779377996252.4485, - "size": 4526 - }, - "assets/lunacy/slider_v7.png": { - "mtime": 1779377996253.4475, - "size": 15261 - }, - "assets/lunacy/slider_v7.webp": { - "mtime": 1779377996254.446, - "size": 5300 - }, - "assets/lunacy/slider_v8.png": { - "mtime": 1779377996254.446, - "size": 15432 - }, - "assets/lunacy/slider_v8.webp": { - "mtime": 1779377996255.4485, - "size": 4910 - }, - "assets/lunacy/slider_v9.png": { - "mtime": 1779377996256.447, - "size": 17093 - }, - "assets/lunacy/slider_v9.webp": { - "mtime": 1779377996256.447, - "size": 5676 - }, - "assets/mamadaevv_resume.pdf": { - "mtime": 1780575571973.1184, - "size": 160205 - }, - "assets/manu-game-maker/.gitkeep": { - "mtime": 1779377996263.5508, - "size": 2 - }, - "assets/manu-game-maker/cover.png": { - "mtime": 1779377996266.5527, - "size": 483251 - }, - "assets/manu-game-maker/cover.webp": { - "mtime": 1779377996268.5513, - "size": 94600 - }, - "assets/misc/dribbble_logo.png": { - "mtime": 1780407662552.718, - "size": 794904 - }, - "assets/misc/dribbble_logo.webp": { - "mtime": 1780407662555.7188, - "size": 16768 - }, - "assets/misc/figma_logo.jpg": { - "mtime": 1780407662557.7192, - "size": 10883 - }, - "assets/misc/figma_logo.webp": { - "mtime": 1780407662559.719, - "size": 5108 - }, - "assets/misc/tg-channel-logo-design_not_pizza.jpg": { - "mtime": 1780407662562.7192, - "size": 48308 - }, - "assets/misc/tg-channel-logo-design_not_pizza.webp": { - "mtime": 1780407662564.7183, - "size": 23598 - }, - "assets/mobile-clinic-app/.gitkeep": { - "mtime": 1779377996270.7036, - "size": 2 - }, - "assets/mobile-clinic-app/cover.png": { - "mtime": 1779377996275.6907, - "size": 626518 - }, - "assets/mobile-clinic-app/cover.webp": { - "mtime": 1779377996277.6917, - "size": 121088 - }, - "assets/obsidian-plugin-columns-view/filter use.mp4": { - "mtime": 1782054448519.579, - "size": 36000629 - }, - "assets/obsidian-plugin-columns-view/filter use.webm": { - "mtime": 1782054874042.0066, - "size": 4117727 - }, - "assets/obsidian-plugin-columns-view/filter use.webp": { - "mtime": 1782054874401.6035, - "size": 82876 - }, - "assets/obsidian-plugin-columns-view/overview.png": { - "mtime": 1782055820170.6465, - "size": 358265 - }, - "assets/obsidian-plugin-columns-view/overview.webp": { - "mtime": 1782057055802, - "size": 199104 - }, - "assets/obsidian-plugin-columns-view/view configure.mp4": { - "mtime": 1782054318526.4917, - "size": 41097403 - }, - "assets/obsidian-plugin-columns-view/view configure.webm": { - "mtime": 1782054960161.7544, - "size": 2104173 - }, - "assets/obsidian-plugin-columns-view/view configure.webp": { - "mtime": 1782054960408.1843, - "size": 69110 - }, - "assets/orc-primo-rpa/cover.webp": { - "mtime": 1780407662568.7195, - "size": 42848 - }, - "assets/orc-primo-rpa/projects--table-new.png": { - "mtime": 1780407662571.719, - "size": 86822 - }, - "assets/orc-primo-rpa/projects--table-new.webp": { - "mtime": 1780407662572.718, - "size": 42848 - }, - "assets/orc-primo-rpa/projects--table-old.png": { - "mtime": 1780407662575.226, - "size": 139826 - }, - "assets/orc-primo-rpa/projects--table-old.webp": { - "mtime": 1780407662577.2327, - "size": 78910 - }, - "assets/README.md": { - "mtime": 1779377996027.13, - "size": 843 - }, - "assets/shared/icons/arrow_upright.svg": { - "mtime": 1776362143026.8838, - "size": 1215 - }, - "assets/shared/icons/chat_start.svg": { - "mtime": 1776193642521.755, - "size": 3485 - }, - "assets/shared/icons/checkmark.svg": { - "mtime": 1776422601550.154, - "size": 767 - }, - "assets/shared/icons/close.svg": { - "mtime": 1776857552773.9846, - "size": 407 - }, - "assets/shared/icons/copy.svg": { - "mtime": 1776352846992.719, - "size": 1418 - }, - "assets/shared/icons/cv.svg": { - "mtime": 1776514945920.6653, - "size": 2492 - }, - "assets/shared/icons/delete.svg": { - "mtime": 1779377996278.6897, - "size": 1486 - }, - "assets/shared/icons/design_edit.svg": { - "mtime": 1776193642520.2417, - "size": 5473 - }, - "assets/shared/icons/email.svg": { - "mtime": 1776362122606.4749, - "size": 1589 - }, - "assets/shared/icons/link_url.svg": { - "mtime": 1780407662580.2358, - "size": 1525 - }, - "assets/shared/icons/moon.svg": { - "mtime": 1776193642519.029, - "size": 1090 - }, - "assets/shared/icons/original_size.svg": { - "mtime": 1776857547534.4807, - "size": 2382 - }, - "assets/shared/icons/portfolio.svg": { - "mtime": 1776515141309.182, - "size": 1352 - }, - "assets/shared/icons/shevron-down.svg": { - "mtime": 1777636422918.6008, - "size": 1222 - }, - "assets/shared/icons/shevron-left.svg": { - "mtime": 1777636422919.6145, - "size": 1207 - }, - "assets/shared/icons/shevron-right.svg": { - "mtime": 1777636422919.6145, - "size": 1209 - }, - "assets/shared/icons/shevron-up.svg": { - "mtime": 1777636422921.079, - "size": 1208 - }, - "assets/shared/icons/sun.svg": { - "mtime": 1776193642517.9954, - "size": 4326 - }, - "assets/shared/icons/system.svg": { - "mtime": 1776193642519.029, - "size": 2249 - }, - "assets/shared/icons/tg.svg": { - "mtime": 1776362122602.7698, - "size": 1373 - }, - "assets/shared/icons/vk.svg": { - "mtime": 1776362122605.4763, - "size": 615 - }, - "assets/shared/icons/write_me.svg": { - "mtime": 1777030666208.4812, - "size": 3077 - }, - "assets/shared/icons/yandex_telemost.svg": { - "mtime": 1776362122604.4692, - "size": 572 - }, - "assets/shared/icons/zoom_in.svg": { - "mtime": 1776856548780.6626, - "size": 1953 - }, - "assets/shared/icons/zoom_out.svg": { - "mtime": 1776856548780.6626, - "size": 1592 - }, - "assets/shared/icons/zoom_to_fit.svg": { - "mtime": 1779377996280.203, - "size": 1248 - }, - "assets/shared/icons/сookie.svg": { - "mtime": 1776607984487.0112, - "size": 3508 - }, - "assets/shared/placeholder.jpg": { - "mtime": 1777053044955.2012, - "size": 34829 - }, - "assets/shared/placeholder.webp": { - "mtime": 1780407662581.2354, - "size": 240 - }, - "assets/task-distribution-concept/.gitkeep": { - "mtime": 1779377996281.21, - "size": 2 - }, - "assets/task-distribution-concept/cover.png": { - "mtime": 1779377996284.209, - "size": 197021 - }, - "assets/task-distribution-concept/cover.webp": { - "mtime": 1779377996286.2097, - "size": 81646 - }, - "assets/task-tracker/actions_for_page.png": { - "mtime": 1724892346000, - "size": 25027 - }, - "assets/task-tracker/actions_for_page.webp": { - "mtime": 1777119492700, - "size": 23404 - }, - "assets/task-tracker/cover.webp": { - "mtime": 1779377996288.2092, - "size": 151720 - }, - "assets/task-tracker/dark_theme.png": { - "mtime": 1724892366000, - "size": 291518 - }, - "assets/task-tracker/dark_theme.webp": { - "mtime": 1777119492957, - "size": 147348 - }, - "assets/task-tracker/drag-drop-action_example.mp4": { - "mtime": 1776793076285.7869, - "size": 2095990 - }, - "assets/task-tracker/drag-drop-action_example.webm": { - "mtime": 1777118933364.2495, - "size": 147445 - }, - "assets/task-tracker/drag-drop-action_example.webp": { - "mtime": 1777118933542.3682, - "size": 3604 - }, - "assets/task-tracker/drag-drop-item_board-view.mp4": { - "mtime": 1724892358000, - "size": 1784143 - }, - "assets/task-tracker/drag-drop-item_board-view.webm": { - "mtime": 1777118939415.8855, - "size": 232186 - }, - "assets/task-tracker/drag-drop-item_board-view.webp": { - "mtime": 1777118939601.6213, - "size": 27548 - }, - "assets/task-tracker/drag-drop-item_list-view.mp4": { - "mtime": 1724892360000, - "size": 2886192 - }, - "assets/task-tracker/drag-drop-item_list-view.webm": { - "mtime": 1777118960260.8003, - "size": 331393 - }, - "assets/task-tracker/drag-drop-item_list-view.webp": { - "mtime": 1777118960514.3586, - "size": 27766 - }, - "assets/task-tracker/dropdown_menu_for_views.png": { - "mtime": 1724892346000, - "size": 75360 - }, - "assets/task-tracker/dropdown_menu_for_views.webp": { - "mtime": 1777119493007, - "size": 64398 - }, - "assets/task-tracker/expand-collapse_group.mp4": { - "mtime": 1724892356000, - "size": 1663390 - }, - "assets/task-tracker/expand-collapse_group.webm": { - "mtime": 1777118977581.77, - "size": 196247 - }, - "assets/task-tracker/expand-collapse_group.webp": { - "mtime": 1777118977813.5178, - "size": 27750 - }, - "assets/task-tracker/full_preview.mp4": { - "mtime": 1776877975221.4644, - "size": 2480939 - }, - "assets/task-tracker/full_preview.webm": { - "mtime": 1777119206780.3667, - "size": 1852963 - }, - "assets/task-tracker/full_preview.webp": { - "mtime": 1777119207226.3965, - "size": 31316 - }, - "assets/task-tracker/light_theme_color.png": { - "mtime": 1724892364000, - "size": 555991 - }, - "assets/task-tracker/light_theme_color.webp": { - "mtime": 1777119493297, - "size": 164962 - }, - "assets/task-tracker/refs.png": { - "mtime": 1776792419154.0342, - "size": 1779282 - }, - "assets/task-tracker/refs.webp": { - "mtime": 1777119493506, - "size": 225610 - }, - "assets/task-tracker/tabs.mp4": { - "mtime": 1776792488669.555, - "size": 4908318 - }, - "assets/task-tracker/tabs.webm": { - "mtime": 1777119316281.4424, - "size": 804022 - }, - "assets/task-tracker/tabs.webp": { - "mtime": 1777119316704.9702, - "size": 31082 - }, - "assets/task-tracker/tab_all-tasks.png": { - "mtime": 1724892344000, - "size": 285868 - }, - "assets/task-tracker/tab_all-tasks.webp": { - "mtime": 1777119493851, - "size": 151720 - }, - "assets/task-tracker/tab_my-tasks.png": { - "mtime": 1724892344000, - "size": 232690 - }, - "assets/task-tracker/tab_my-tasks.webp": { - "mtime": 1777119494176, - "size": 118694 - }, - "assets/task-tracker/tab_tasks-by-assign.png": { - "mtime": 1724892344000, - "size": 283151 - }, - "assets/task-tracker/tab_tasks-by-assign.webp": { - "mtime": 1777119494494, - "size": 147370 - }, - "assets/task-tracker/views.mp4": { - "mtime": 1776792546358.3933, - "size": 3655835 - }, - "assets/task-tracker/views.webm": { - "mtime": 1777119348131.017, - "size": 588868 - }, - "assets/task-tracker/views.webp": { - "mtime": 1777119348524.0642, - "size": 30412 - }, - "assets/task-tracker/view_board.png": { - "mtime": 1724892346000, - "size": 285868 - }, - "assets/task-tracker/view_board.webp": { - "mtime": 1777119494790, - "size": 151720 - }, - "assets/task-tracker/view_list.png": { - "mtime": 1724892350000, - "size": 281726 - }, - "assets/task-tracker/view_list.webp": { - "mtime": 1777119495084, - "size": 153030 - }, - "assets/task-tracker/view_table.png": { - "mtime": 1724892354000, - "size": 306629 - }, - "assets/task-tracker/view_table.webp": { - "mtime": 1777119495385, - "size": 159062 - }, - "assets/template-elements-demo/hello.gif": { - "mtime": 1713970676235.8618, - "size": 1445905 - }, - "assets/template-elements-demo/img-long.png": { - "mtime": 1779377996303.2358, - "size": 1430322 - }, - "assets/template-elements-demo/img-long.webp": { - "mtime": 1779377996305.2405, - "size": 134456 - }, - "assets/template-elements-demo/small-image-1.png": { - "mtime": 1779377996307.2373, - "size": 127198 - }, - "assets/template-elements-demo/small-image-1.webp": { - "mtime": 1779377996307.2373, - "size": 6676 - }, - "assets/template-elements-demo/small-image-2.png": { - "mtime": 1779377996309.7412, - "size": 220181 - }, - "assets/template-elements-demo/small-image-2.webp": { - "mtime": 1779377996309.7412, - "size": 9214 - }, - "assets/template-elements-demo/small-image-3.png": { - "mtime": 1779377996312.7493, - "size": 330973 - }, - "assets/template-elements-demo/small-image-3.webp": { - "mtime": 1779377996313.7478, - "size": 19430 - }, - "assets/template-elements-demo/small-image-4.png": { - "mtime": 1779377996314.7488, - "size": 211288 - }, - "assets/template-elements-demo/small-image-4.webp": { - "mtime": 1779377996315.7507, - "size": 11306 - }, - "assets/template-elements-demo/small-image-5.png": { - "mtime": 1779377996317.748, - "size": 249941 - }, - "assets/template-elements-demo/small-image-5.webp": { - "mtime": 1779377996318.7485, - "size": 15056 - }, - "assets/template-elements-demo/small-image-6.png": { - "mtime": 1779377996319.7495, - "size": 161762 - }, - "assets/template-elements-demo/small-image-6.webp": { - "mtime": 1779377996320.861, - "size": 8470 - }, - "assets/template-elements-demo/small-image-7.png": { - "mtime": 1779377996322.8584, - "size": 196080 - }, - "assets/template-elements-demo/small-image-7.webp": { - "mtime": 1779377996323.8606, - "size": 7832 - }, - "assets/template-elements-demo/video-1.mp4": { - "mtime": 1774365295973.9094, - "size": 3676034 - }, - "assets/template-elements-demo/video-1.webm": { - "mtime": 1777119460084.1753, - "size": 3490147 - }, - "assets/template-elements-demo/video-1.webp": { - "mtime": 1777119460340.927, - "size": 112702 - }, - "assets/template-elements-demo/wallpaper-1.jpg": { - "mtime": 1770206903718.8467, - "size": 1011262 - }, - "assets/template-elements-demo/wallpaper-1.webp": { - "mtime": 1777119432828, - "size": 795944 - }, - "cases/ai-platform-primo-rpa-2.html": { - "mtime": 1782245252136.977, - "size": 56010 - }, - "cases/ai-platform-primo-rpa.html": { - "mtime": 1782245252138.9834, - "size": 65300 - }, - "cases/design-system.html": { - "mtime": 1782245252140.9756, - "size": 51499 - }, - "cases/lunacy.html": { - "mtime": 1782245252140.9756, - "size": 51520 - }, - "cases/manu-game-maker.html": { - "mtime": 1782245252142.1548, - "size": 33426 - }, - "cases/mini-projects-showcase.html": { - "mtime": 1782245252144.1592, - "size": 45596 - }, - "cases/mobile-clinic-app.html": { - "mtime": 1782245252145.1597, - "size": 33340 - }, - "cases/obsidian-plugin-columns-view.html": { - "mtime": 1782245252145.1597, - "size": 34314 - }, - "cases/orc-automation-panel.html": { - "mtime": 1782245252146.161, - "size": 48044 - }, - "cases/task-distribution-concept.html": { - "mtime": 1782245252147.1592, - "size": 33330 - }, - "cases/task-tracker.html": { - "mtime": 1782245252149.1597, - "size": 66746 - }, - "cases/template-elements-demo.html": { - "mtime": 1782245252150.16, - "size": 47480 - }, - "cookie-policy.html": { - "mtime": 1782245252151.1606, - "size": 20265 - }, - "css/main.css": { - "mtime": 1782122516629.0486, - "size": 129130 - }, - "index.html": { - "mtime": 1782245252151.1606, - "size": 69045 - }, - "js/main.js": { - "mtime": 1780407662602.799, - "size": 2804 - }, - "js/modules/cases/image-viewer.js": { - "mtime": 1780407662603.8, - "size": 13683 - }, - "js/modules/cases/natural-image-size.js": { - "mtime": 1777287125125.0857, - "size": 625 - }, - "js/modules/cases/sequential-images.js": { - "mtime": 1779377996345.018, - "size": 1224 - }, - "js/modules/cases/tall-media-expand.js": { - "mtime": 1779377996345.018, - "size": 1861 - }, - "js/modules/cases/video-player.js": { - "mtime": 1779377996347.0156, - "size": 1095 - }, - "js/modules/experience/expand.js": { - "mtime": 1777287125125.0857, - "size": 3993 - }, - "js/modules/experience/hover-glow.js": { - "mtime": 1777636422925.3562, - "size": 912 - }, - "js/modules/experience/masonry.js": { - "mtime": 1780407662605.8008, - "size": 2916 - }, - "js/modules/header/header-scroll.js": { - "mtime": 1779377996348.017, - "size": 4328 - }, - "js/modules/header/nav-overflow.js": { - "mtime": 1777287125117.0547, - "size": 5621 - }, - "js/modules/mini-projects/expand.js": { - "mtime": 1780407662607.4187, - "size": 4418 - }, - "js/modules/mini-projects/masonry.js": { - "mtime": 1782122516632.0474, - "size": 5036 - }, - "js/modules/shared/dom.js": { - "mtime": 1777287125128.091, - "size": 221 - }, - "js/modules/shared/image-src.js": { - "mtime": 1780407662612.4294, - "size": 214 - }, - "js/modules/shared/math.js": { - "mtime": 1777287125125.0857, - "size": 161 - }, - "js/modules/shared/media.js": { - "mtime": 1777287125117.0547, - "size": 645 - }, - "js/modules/shared/schedule-idle.js": { - "mtime": 1779377996348.017, - "size": 457 - }, - "js/modules/theme/theme-controls.js": { - "mtime": 1779377996349.5276, - "size": 6205 - }, - "js/modules/theme/theme-core.js": { - "mtime": 1782122516625.0393, - "size": 4885 - }, - "js/modules/theme/theme-fonts.js": { - "mtime": 1779377996352.5422, - "size": 1147 - }, - "js/modules/ui/contact-copy.js": { - "mtime": 1777287125128.091, - "size": 1793 - }, - "js/modules/ui/content-edit/content-edit-dock.js": { - "mtime": 1779377996353.5432, - "size": 9560 - }, - "js/modules/ui/content-edit/content-edit-mode.js": { - "mtime": 1779377996355.5415, - "size": 11767 - }, - "js/modules/ui/content-edit/content-edit-storage.js": { - "mtime": 1779377996355.5415, - "size": 868 - }, - "js/modules/ui/content-edit/content-edit-target.js": { - "mtime": 1779377996357.5415, - "size": 9573 - }, - "js/modules/ui/cookie-notice.js": { - "mtime": 1779377996357.5415, - "size": 923 - }, - "js/modules/ui/deferred-media.js": { - "mtime": 1779377996358.5417, - "size": 470 - }, - "js/modules/ui/hero-motion-video.js": { - "mtime": 1782244713466.1138, - "size": 1004 - }, - "js/modules/ui/hero-word-slot.js": { - "mtime": 1777287125117.0547, - "size": 3717 - }, - "js/modules/ui/image-load-placeholder.js": { - "mtime": 1780407662613.426, - "size": 2435 - }, - "js/modules/ui/mesh-panel.js": { - "mtime": 1779377996360.0525, - "size": 859 - }, - "js/modules/ui/page-mesh-bg.js": { - "mtime": 1779377996361.0547, - "size": 3216 - }, - "js/modules/ui/primary-button-shine.js": { - "mtime": 1777287125118.0613, - "size": 952 - }, - "js/modules/ui/projects-carousel.js": { - "mtime": 1779377996362.0613, - "size": 6390 - }, - "js/modules/ui/skills-accordion.js": { - "mtime": 1778061201791.5735, - "size": 5099 - }, - "js/modules/ui/skills-intro.js": { - "mtime": 1780407662615.4253, - "size": 1983 - }, - "js/skill-connectors.js": { - "mtime": 1776439133838.0786, - "size": 12132 - }, - "README.md": { - "mtime": 1777051804851.6003, - "size": 1363 - }, - "vendor/plyr/plyr.css": { - "mtime": 1779377996364.0625, - "size": 32455 - }, - "vendor/plyr/plyr.min.mjs": { - "mtime": 1779377996366.0618, - "size": 121675 - } -} \ No newline at end of file diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 8236a53..0000000 --- a/.dockerignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules -.git -.gitignore -Dockerfile -Dockerfile.dev -.dockerignore -*.log -.cache -.deploy-manifest.json -.cursor diff --git a/.gitignore b/.gitignore index 784bae0..98c2777 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ coverage/ !.cursor/commands/ !.cursor/commands/** .vscode/ +.zed/ gitverse/ # Logs diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +22 diff --git a/AGENTS.md b/AGENTS.md index 170afb3..d99309d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,27 +1,18 @@ # Подсказки для агента (Cursor) -## GitVerse / деплой статики +## Сборка и деплой -Полный чеклист: **`docs/gitverse-sync.md`** → раздел **«Инструкция для агента (Cursor)»**. +Деплой автоматический: пуш в git → автодеплой на хостинг. -Деплой на VPS: **`docs/vps-deploy.md`**. +По запросу пользователя «собрать», «билд»: -Кратко по запросу пользователя «выложить на GitVerse», «синк gitverse», «задеплоить»: +1. При правках `src/pages/**` или `src/partials/**` — `npm run build:pages`. +2. При смене шрифтов/Plyr или `package.json` — `npm run build` (включает `vendor:copy`). +3. Для деплоя — сделать git commit + push. -1. При правках `src/pages/**` или `src/partials/**` — `npm run build:pages`; при смене шрифтов/Plyr или `package.json` — `npm run build` (включает `vendor:copy`). -2. Затем `npm run sync-gitverse` (разрешения **network** и **git_write**). -3. Не запускать синк без явного запроса пользователя. +## Git -По запросу «задеплой в Coolify», «задеплой на VPS»: - -1. При правках в `public/` — `npm run deploy:vps` (разрешения **all**). -2. По запросу «задеплой везде» — `npm run deploy` (VPS + GitVerse). - -Не запускать деплой на VPS без явного запроса: скрипт перезаписывает `/data/static-site` на сервере. - -## Git: корневой репозиторий - -Этот репозиторий в корне проекта **только локальный** (рабочая копия, история коммитов для себя). **Не добавлять `origin` и не пушить** в удалённый репозиторий из агента, если пользователь явно не попросил настроить remote и не дал URL. Выгрузка наружу — отдельный сценарий через **`npm run sync-gitverse`** в папку `gitverse` (см. выше), а не `git push` из корня. +Репозиторий: `http://x1qnvk08zec2u5cx6yh5iexh.155.212.186.39.sslip.io/admin/site-portfolio.git` ### Влить в `master`, оставаясь на текущей ветке @@ -33,9 +24,14 @@ ## Design System -Страница-каталог: **`src/pages/cases/design-system.html`** → после сборки `public/cases/design-system.html`. +Перед работой с UI **прочитай `DESIGN.md`** в корне проекта — там описаны токены, типографика, компоненты и правила их применения. -При **глобальных** правках стилей (токены в `public/css/main.css`, компоненты главной, блоки лонгрида кейса) **обновляй Design System**: живой пример и краткое описание в соответствующей секции, при необходимости — `docs/case-page-blocks.md`. +Страницы-каталоги (живые примеры): +- **`src/pages/cases/design-system.html`** → токены, типографика, кнопки, карточки, секции +- **`src/pages/cases/template-elements-demo.html`** → элементы лонгрида: медиа, галереи, видео, callout +- **`src/pages/cases/mini-projects-showcase.html`** → карточки активности (mp-card) + +При **глобальных** правках стилей (токены в `public/css/main.css`, компоненты главной, блоки лонгрида кейса) **обновляй соответствующий каталог**: живой пример и краткое описание в секции, при необходимости — `docs/case-page-blocks.md`. ## Контент кейса в public (по запросу) @@ -49,6 +45,18 @@ Режим на странице при `npm run serve` → очередь в **`texts/content-edits/pending.json`**. Apply по запросу **«примени правки»**: читать этот файл, править **`src/pages/`**, **humanizer-ru**, **`npm run build:pages`**; **`pending.json` не очищать** (пользователь удаляет пункты сам). Подробности: **`docs/content-edit-mode.md`**, **`.cursor/rules/content-edit-apply.mdc`**. +## PDF резюме (по запросу) + +По запросу «обнови PDF», «перегенерируй PDF»: + +1. Убедиться, что dev-сервер запущен (`localhost:4175`). +2. Запустить `npm run generate:resume-pdf`. +3. Файл обновится в `public/assets/resume/Mamadaev_Nik__CV__Product_Designer_UX-UI.pdf`. + +Подробнее: **`docs/resume-pdf.md`**. + +Скрипт требует запущенный сервер — нельзя встроить в обычный `build`. + ## Vendor (шрифты, Plyr) Локально в `public/`, без CDN. Обновление: **`docs/vendor-assets.md`**, команда `npm run vendor:copy`. @@ -60,3 +68,15 @@ ## Остальное Правила и таблица доков: **`.cursor/rules/read-docs-before-feature-dev.mdc`** (локально; папка `.cursor/` может быть в `.gitignore`). + +### Ключевые файлы + +| Файл | Назначение | +|---|---| +| `DESIGN.md` | Описание дизайн-системы для AI-агентов | +| `public/css/main.css` | Единый CSS: токены + все компоненты | +| `src/pages/cases/design-system.html` | Живой каталог токенов, типографики, кнопок, карточек | +| `src/pages/cases/template-elements-demo.html` | Элементы лонгрида: медиа, галереи, видео, callout | +| `src/pages/cases/mini-projects-showcase.html` | Карточки активности (mp-card) | +| `docs/case-page-blocks.md` | Инструкция по блокам лонгридов | +| `docs/resume-pdf.md` | Генерация PDF резюме (Puppeteer) | diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..50209c3 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,245 @@ +# DESIGN.md + +Портфолио-сайт продуктового дизайнера. Лонгриды кейсов, резюме, блог. Визуал — минимализм с акцентом на типографику и контент. + +--- + +## Продукт + +Одностраничный сайт-портфолио с внутренними страницами (кейсы, резюме, блог). Основной контент — лонгриды с описанием проектов. Навигация через главную страницу с секциями: навыки, портфолио, контакты. + +**Характер:** Сдержанный, профессиональный. Без визуального шума. Контент — главный элемент интерфейса. + +--- + +## Цвета + +### Токены темы + +| Токен | Назначение | +|---|---| +| `--theme-h` | Оттенок акцента (0–360°) | +| `--theme-s` | Насыщенность акцента | +| `--theme-l` | Светлота акцента | +| `--accent` | Основной акцентный цвет | +| `--accent-text` | Цвет текста на акцентном фоне | +| `--accent-soft` | Мягкий акцент для фона | +| `--bg` | Фон страницы | +| `--bg-elevated` | Поверхность второго уровня | +| `--surface` | Фон карточек и секций | +| `--text` | Основной текст | +| `--text-muted` | Приглушённый текст | +| `--line` | Рамки и разделители | + +### Правила + +- Акцент меняется через `--theme-h/s/l` на ``. Все производные пересчитываются автоматически. +- Светлая/тёмная тема — `data-theme="light|dark"` на ``. +- Нейтральные фоны (`--bg`, `--surface`) слегка подмешивают оттенок акцента через `--neutral-accent-tint`. +- Не используйте хардкод hex-значений. Всегда обращайтесь к токенам. + +--- + +## Типографика + +### Семейства + +| `data-font` | Стек | Назначение | +|---|---|---| +| `merriweather` | Merriweather + Alice | По умолчанию. Alice — проза, Merriweather — заголовки | +| `geologica` | Geologica + PT Sans | Гротеск + нейтральная проза | +| `mono` | Source Code Pro + PT Mono | Моноширинный | + +### Шкала + +| Класс | Размер | Вес | Назначение | +|---|---|---|---| +| `.hero__eyebrow` | `0.78rem` | 700 | Подзаголовок секции, ввод кейса. Uppercase, letter-spacing 0.14em | +| `.hero__title` | `clamp(3.1rem, 7.2vw, 4.85rem)` | 700 | H1 главной страницы | +| `.case-page__h1` | `clamp(2rem, 3.9vw, 2.9rem)` | 700 | H1 кейса / внутренней страницы | +| `.case-page__sub` | `clamp(1.5rem, 2vw, 1.65rem)` | 500 | Подзаголовок под H1 | +| `.section__title` | `clamp(0.95rem, 1.35vw, 1.1rem)` | 600 | Заголовки секций («Навыки», «Портфолио») | +| `.section__prose` | наследует | — | Основной текст абзацев | +| `h2` в `.case-article` | `clamp(1.5rem, 2vw, 1.65rem)` | 500 | Разделы лонгрида | +| `h3` в `.case-article` | наследует | — | Подразделы внутри H2 | + +### Правила + +- Заголовки используют `clamp()` — размер масштабируется от вьюпорта. +- Не задавайте `font-size` в пикселях. Используйте `rem` или `clamp()`. +- `line-height` для прозы: `1.55` (базовый), для заголовков: `1.2`. +- `max-width` текстовой колонки: `42rem` (`.section__prose`). + +--- + +## Отступы и сетка + +### Токены + +| Токен | Значение | Назначение | +|---|---|---| +| `--space` | `clamp(1rem, 4vw, 2.75rem)` | Горизонтальные поля + safe-area | +| `--max` | `none` | Ширина контента = вьюпорт минус padding | +| `--radius-sm` | Зависит от `data-radius` | Малые скругления | +| `--radius-md` | Зависит от `data-radius` | Средние скругления | +| `--radius-card` | Зависит от `data-radius` | Карточки | + +### Секции + +| Класс | Назначение | +|---|---| +| `.section` | Вертикальные отступы через `clamp()` | +| `.section--tight` | Компактные отступы (кейсы, внутренние страницы) | +| `.section--surface` | Прозрачный фон (для mesh на главной) | +| `.section__inner` | Центрированная обёртка с `max-width: var(--max)` | +| `.case-article` | Контентная колонка лонгрида: `max-width: 48rem` | + +### Брейкпоинты + +| Ширина | Что меняется | +|---|---| +| `860px` | Hero → 2 колонки (`1.15fr 0.85fr`) | +| `760px` / `1180px` | Карусель портфолио: 1 → 2 → 3 карточки | +| `720px` | Сетка навыков → 2 колонки | +| `1024px` | Навыки: 6-колоночная мозаика | +| `560px` / `1024px` | Контакты → 2 → 4 колонки | +| `640px` | Wide-блоки схлопываются в ширину колонки | + +### Правила + +- Отдельной 12-колоночной сетки нет. Используйте CSS Grid внутри секций. +- Горизонтальные отступы — `--space` + `safe-area-inset`. +- Wide-блоки (`.case-media--wide`, `.case-callout`) шире колонки: `min(100vw - 2*padding, content + 8rem)`. + +--- + +## Компоненты + +### Кнопки + +| Класс | Назначение | +|---|---| +| `.btn` | Базовый класс кнопки | +| `.btn--primary` | Основная кнопка (акцентный фон, стекло) | +| `.btn--secondary` | Вторичная кнопка (нейтральное стекло) | +| `.btn--ghost` | Текстовая кнопка без фона | +| `.btn--flat` | Плоский вариант (без «объёма») | +| `.btn--raised` | Приподнятый вариант (с тенью) | +| `.btn__icon` | Иконка внутри кнопки | + +### FAB-кнопки + +| Класс | Назначение | +|---|---| +| `.fab` | Базовый класс плавающей кнопки (круглая, `position: fixed`) | +| `.fab--primary` | Акцентная FAB (градиент, стекло, `--on-accent` для текста/иконки) | +| `.fab--secondary` | Вторичная FAB (нейтральная, для настроек) | +| `.fab--label` | Модификатор: снимает фиксированную ширину, добавляет текст рядом с иконкой | +| `.fab-primary__ico` | Иконка внутри primary FAB (маска через `mask-image`) | +| `.fab__label` | Текстовая подпись внутри FAB | + +Правило: `--on-accent` вычисляется в синхронном `theme-init-script` (в ``) по luminance акцента. Не задавайте `color` вручную — наследуется от `.fab--primary`. + +### Теги + +| Класс | Назначение | +|---|---| +| `.hero__tags` | Контейнер тегов в Hero | +| `.hero__tag` | Тег (пилл с рамкой). Используйте для ключевых слов | +| `.portfolio-card__tag` | Тег внутри карточки портфолио | + +### Карточки + +| Класс | Назначение | +|---|---| +| `.portfolio-card` | Карточка проекта в портфолио | +| `.portfolio-card__body` | Текстовая часть | +| `.portfolio-card__cover` | Обложка | +| `.skill-task-card` | Карточка навыка (задача + решения) | +| `.contact-card` | Контактная карточка (ссылка или действие) | + +### Блоки лонгрида + +| Класс | Назначение | +|---|---| +| `.hero__eyebrow` | Подзаголовок перед H1 | +| `.case-page__h1` | Заголовок страницы | +| `.case-page__sub` | Подзаголовок | +| `.section__prose` | Абзац текста | +| `.section__title` | Заголовок секции | +| `.case-callout` | Акцентный блок (важная мысль) | +| `.case-media` | Обёртка для изображения/видео | +| `.case-media--natural` | Изображение в натуральном масштабе | +| `.case-media--content` | По ширине текстовой колонки | +| `.case-media--wide` | Шире колонки статьи | + +--- + +## Поведение + +### Изображения + +- Формат: **WebP** для всех изображений. +- Видео: **WebM** (MP4 как fallback). +- Lazy loading: `loading="lazy"`, `decoding="async"`. +- Просмотр по клику: `data-image-viewer` на ``. +- Заглушка при загрузке: `.is-img-loading` / `.has-img-loading`. + +### Секции + +- Порядок на странице кейса: `header-case` → `fab-stack` → `main.case-article` → `projects-section` → `contact-section` → `footer`. +- Порядок на внутренних страницах: `header-minimal` → `fab-stack-home-contact` → `main.section` → `footer`. + +### Навигация + +- Главная: горизонтальная навигация по секциям. +- Внутренние страницы: ссылка «на главную» в шапке. +- Плавающие кнопки (FAB): тема, контакты. + +--- + +## Do's and Don'ts + +### Do's + +- Используйте токены цвета (`--accent`, `--text`, `--surface`), не хардкодьте. +- Используйте `clamp()` для типографики — не фиксированные px/rem. +- Используйте `.section__prose` для основного текста — он задаёт `max-width` и `color`. +- Используйте `.hero__eyebrow` для подзаголовков перед заголовками. +- Используйте WebP для изображений, WebM для видео. +- Для лонгридов внутри `.case-article` — заголовки `h2`/`h3` стилизуются автоматически. + +### Don'ts + +- Не создавайте новые классы для типографики, если есть готовые в таблице шкалы. +- Не используйте `font-size` в пикселях. +- Не смешивайте стили из разных `data-font` на одной странице. +- Не используйте `.hero__tag` для навыков в резюме — используйте `.skill-card` или простой список. +- Не создавайте wide-блоки без необходимости — они выходят за колонку и ломают ритм. +- Не используйте декоративные градиенты на функциональных поверхностях. + +--- + +## Страницы + +| Страница | Шаблон | Ключевые компоненты | +|---|---|---| +| Главная | `src/pages/index.html` | Hero, Skills, Projects, Contact | +| Кейс | `src/pages/cases/*.html` | `.case-article`, `.hero__eyebrow`, `.case-page__h1`, `.case-media` | +| Резюме | `src/pages/resume*.html` | `.doc`, `.profile-header`, `.meta-grid`, `.timeline`, `.skill-grid` | +| Design System | `src/pages/cases/design-system.html` | Живой каталог компонентов и токенов | +| Demo elements | `src/pages/cases/template-elements-demo.html` | Элементы лонгрида: медиа, галереи, видео, callout | +| Mini projects | `src/pages/cases/mini-projects-showcase.html` | Карточки активности (mp-card) | + +--- + +## Файлы + +| Файл | Назначение | +|---|---| +| `public/css/main.css` | Единый CSS: токены + все компоненты | +| `src/pages/cases/design-system.html` | Живой каталог токенов, типографики, кнопок, карточек | +| `src/pages/cases/template-elements-demo.html` | Элементы лонгрида: медиа, галереи, видео, callout | +| `src/pages/cases/mini-projects-showcase.html` | Карточки активности (mp-card) | +| `docs/case-page-blocks.md` | Инструкция по блокам лонгридов | +| `DESIGN.md` | Этот файл — описание для AI-агентов | diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index b0cda7b..0000000 --- a/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# Build the static site and serve it with nginx -FROM node:20-alpine AS build -WORKDIR /app -COPY package*.json ./ -RUN npm install -COPY . . -RUN npm run build:pages - -FROM nginx:alpine -# Fix mjs MIME type — without this plyr.min.mjs fails to load as ES module -RUN sed -i 's|application/javascript *js;|application/javascript js mjs;|' /etc/nginx/mime.types -COPY --from=build /app/public /usr/share/nginx/html -EXPOSE 80 diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index fab3e9a..0000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,9 +0,0 @@ -# Dev environment: serves public/ with BrowserSync + content-edits API (port 4175) -FROM node:22-slim -WORKDIR /app -COPY package*.json ./ -RUN npm install -COPY . . -RUN npm run build:pages -EXPOSE 4175 -CMD ["npm", "run", "serve"] diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 8d0edb5..0000000 --- a/deploy.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash -set -e - -HOST="root@155.212.186.39" -SSH_KEY="$HOME/.ssh/beget" -SRC_DIR="$(cd "$(dirname "$0")" && pwd)/public/" - -echo "📦 Deploy mamadaevv.site..." -echo "Src: $SRC_DIR" - -REMOTE_INFO=$(ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$HOST" ' - CONTAINER=$(docker ps --format "{{.Names}}" | grep "s9mrcps8xw02r1dak0fsznix" | head -1) - VOLUME_PATH=$(docker inspect "$CONTAINER" 2>/dev/null | python3 -c " -import sys,json -mounts=json.load(sys.stdin)[0].get(\"Mounts\",[]) -print([m[\"Source\"] for m in mounts if m[\"Destination\"]==\"/usr/share/nginx/html\"][0]) -") - echo "$CONTAINER|$VOLUME_PATH" -') - -IFS='|' read -r CONTAINER VOLUME_PATH <<< "$REMOTE_INFO" -echo "Container: $CONTAINER" -echo "Volume: $VOLUME_PATH" - -# Копируем файлы -cd "$SRC_DIR" -tar cf - . | ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$HOST" \ - "tar xf - -C $VOLUME_PATH" - -# Фикс MIME для .mjs (plyr.min.mjs модуль) -ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$HOST" \ - "docker exec $CONTAINER sh -c \" - if ! grep -q 'application/javascript mjs' /etc/nginx/mime.types 2>/dev/null; then - sed -i 's|application/wasm|application/javascript mjs;\\n application/wasm|' /etc/nginx/mime.types - nginx -s reload && echo 'MIME fix applied' - fi - \"" 2>/dev/null || true - -echo "" -echo "✅ Done! https://mamadaevv.site" diff --git a/docs/gitverse-sync.md b/docs/gitverse-sync.md deleted file mode 100644 index 06c21ad..0000000 --- a/docs/gitverse-sync.md +++ /dev/null @@ -1,57 +0,0 @@ -# Синхронизация `public` -> `gitverse` - -## Назначение - -Скрипт `sync-gitverse` копирует содержимое `public` в папку `gitverse`, затем выполняет коммит и пуш в репозиторий внутри `gitverse`. - -## Запуск - -- Через npm: - - `npm run sync-gitverse` -- Напрямую: - - `node scripts/sync-gitverse.mjs` -- С явными путями: - - `node scripts/sync-gitverse.mjs ` - -По умолчанию: - -- `sourceDir = public` -- `targetDir = gitverse` - -## Что делает скрипт - -1. Проверяет, что исходная папка существует. -2. В целевой папке удаляет всё, кроме: - - `.git` - - `.gitverse` -3. Копирует содержимое `public` в `gitverse` (файлы `.png` пропускаются — в деплое используются WebP и остальные форматы). -4. В репозитории `gitverse` выполняет: - - `git add .` - - `git commit -m "sync public YYYY-MM-DD HH:mm"` (только если есть изменения) - - `git push` -5. После успешного пуша открывает в системном браузере по умолчанию: `https://mamadaevv.gitverse.site/me/` - -Если изменений после копирования нет, коммит и пуш не делаются. - -## Инструкция для агента (Cursor) - -Когда пользователь просит **выложить на GitVerse**, **собрать/задеплоить gitverse**, **синхронизировать с gitverse** или аналогично: - -1. **Сборка `public/`:** если менялись `src/pages/**` или `src/partials/**` — `npm run build:pages`; если шрифты/Plyr/`package.json` или `scripts/copy-vendor.mjs` — `npm run build` (сначала `vendor:copy`, затем страницы). См. [`docs/vendor-assets.md`](vendor-assets.md). -2. **Синк и пуш:** выполни `npm run sync-gitverse` из корня. Нужны разрешения **network** и **git_write** (SSH на GitVerse, пуш из папки `gitverse`). -3. **Ожидания:** скрипт не копирует файлы `.png` в `gitverse`. После **успешного** `git push` открывается системный браузер с `https://mamadaevv.gitverse.site/me/`. Если изменений в `gitverse` после копирования нет — коммит/пуш не выполняются, браузер не открывается. -4. **Не вызывай** `sync-gitverse` без запроса пользователя: скрипт очищает целевую папку (кроме `.git` и `.gitverse`) и пушит в remote. -5. **Корневой git репозиторий** этого проекта считается **только локальным**: не пушь из корня в `origin` и не настраивай remote без явной просьбы пользователя с URL. Внешняя выкладка — через `gitverse`, не через `git push` в корне. -6. Деплой на VPS — отдельный сценарий, см. **`docs/vps-deploy.md`**. - -Подробности и ограничения — в разделах выше. - -## Требования - -- В `gitverse` уже должен быть инициализирован git-репозиторий (папка `.git`). -- Должен быть настроен доступ на push (SSH-ключ/права). - -## Важно - -- Скрипт удаляет в `gitverse` все файлы и папки, кроме `.git` и `.gitverse`. -- Не запускай скрипт, если в `gitverse` есть локальные несохраненные изменения, которые нужно оставить. \ No newline at end of file diff --git a/docs/local-server.md b/docs/local-server.md index 81f78af..29733a5 100644 --- a/docs/local-server.md +++ b/docs/local-server.md @@ -1,10 +1,11 @@ # Локальный просмотр сайта -Сайт в режиме разработки обслуживается из папки `**public/**` через [BrowserSync](https://browsersync.io/): при изменении файлов страница в браузере обновляется сама. +Сайт в режиме разработки обслуживается из папки `**public/**` через нативный HTTP-сервер (Node.js `http` модуль): статика + API правок контента. ## Требования -- Установлены **Node.js** и **npm** (идут вместе с Node). +- **Node.js 22** (см. `.node-version` в корне проекта). fnm/fvm переключают автоматически. +- **npm** (идёт вместе с Node). ## Первый раз в проекте @@ -23,18 +24,11 @@ npm run vendor:copy npm run serve ``` -Скрипт [`scripts/serve-dev.mjs`](../scripts/serve-dev.mjs): статика из `public/`, API правок контента, перезагрузка **только** при изменениях в `public/**` (запись в `texts/content-edits/` вкладку не перезагружает). - -Без API: `npm run serve:static`. +Скрипт [`scripts/serve-dev.mjs`](../scripts/serve-dev.mjs): статика из `public/`, API правок контента. Нет авто-релиоада — после правок в `public/` обновляй страницу вручную. ## Куда смотреть - **Сайт:** [http://localhost:4175](http://localhost:4175) — откроется `public/index.html` и остальные пути относительно `public/`. -- **Панель BrowserSync UI:** [http://localhost:4176](http://localhost:4176) (опционально, для синхронизации и настроек). - -## Что отслеживается - -Любые изменения в `**public/**`**: HTML, CSS, JS, картинки. Папка `texts/content-edits/` **не** в watch — autosave правок не сбрасывает режим редактирования. ## API правок контента @@ -48,4 +42,4 @@ npm run serve ## Остановка -В терминале: **Ctrl+C**. \ No newline at end of file +В терминале: **Ctrl+C**. diff --git a/docs/resume-pdf.md b/docs/resume-pdf.md new file mode 100644 index 0000000..a54d05c --- /dev/null +++ b/docs/resume-pdf.md @@ -0,0 +1,52 @@ +# PDF резюме + +## Генерация PDF + +Скрипт `scripts/generate-resume-pdf.mjs` открывает `resume-5.html` через Puppeteer, применяет шрифт geologica (PT Sans), убирает подложку/обводку блока `.resume-doc` и сохраняет PDF. + +**Важно**: скрипт требует запущенный dev-сервер (`npm run serve` → `localhost:4175`). + +### Запуск + +```bash +npm run generate:resume-pdf +``` + +или вручную: + +```bash +node scripts/generate-resume-pdf.mjs http://localhost:4175/resume-5.html geologica +``` + +Параметры: +- `[url]` — URL страницы (по умолчанию `http://localhost:4175/resume-5.html`) +- `[font]` — ID шрифта: `geologica`, `merriweather`, `mono` (по умолчанию `geologica`) + +### Выходной файл + +`public/assets/resume/Mamadaev_Nik__CV__Product_Designer_UX-UI.pdf` + +Кнопка «Скачать в PDF» на странице `resume-5.html` — это `` ссылка на этот файл. + +### Когда перегенерировать + +- После правок в `src/pages/resume-5.html` (контент, стили) +- После правок в `src/css/resume-5.css` (инлайн-стили в ` + + + + +
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+

Product Design · AI

+

Упростил настройку Primo RPA AI Server: клиенты настраивают ИИ-сервис без команды внедрения

+

+ Платформа интеллектуальной обработки документов
+ и оркестрации ИИ-агентов. Обращения к команде внедрения упали на 40%, настройка первого проекта ужалась с ~3 дней до ~4 часов. +

+ +
+ Обновлённый редактор разметки датасета — главный экран сервиса после редизайна +
+ +
+
Продукт
+
AI Server. Нейросети во внутреннем контуре компании, настраивается через веб-интерфейс
+
Роль
+
UX/UI-дизайнер (единственный на проекте)
+
Задача
+
Снизить порог входа, чтобы клиент настраивал сервис сам
+
Стек
+
Ant Design + React, стилизация Hope UI
+
Формат
+
Редизайн живого продукта, релизы не останавливались
+
+ +
+

С настройкой справлялись только эксперты. Это тормозило продажи

+

+ AI Server разворачивается на внутренних серверах клиентов. Продукт активно тестировали, и обратная связь показала неприятное: настроить его могли только эксперты и команда внедрения Primo RPA. Каждый новый клиент съедал часы техподдержки. Продукт терял привлекательность и плохо масштабировался. +

+ +

+ Начал со знакомства с командой и экспертами по настройке. Разделил сценарии на главные и вспомогательные, собрал визуализацию того, как ведёт себя пользователь, и вместе с разработкой искал, где интерфейс можно упростить. Я уже работал с ИИ и похожими веб-платформами, поэтому быстро разобрался в домене и говорил с разработкой на одном языке. +

+
+ +
+

Ограничения

+
    +
  • Продуктом уже пользовались клиенты. Остановить разработку и пересобрать интерфейс целиком было нельзя.
  • +
  • Изменения приходилось вписывать в план релизов, отдельного «редизайн-спринта» никто не выделял.
  • +
  • Жёсткий стек: Ant Design под React со стилизацией под Hope UI. Новые компоненты рисовать только в крайнем случае, сначала выжимаем всё из готовой библиотеки.
  • +
+
+ + + +
+

Редактор датасета: экран, где пользователи живут

+

+ Здесь проводят больше всего времени. Разметка полей на сотнях изображений — работа монотонная, но именно от неё зависит качество данных для обучения модели. Прежний редактор выбивался из общего стиля, выглядел перегруженно и путал в работе с полями. +

+

+ Разобрал редактор на микросценарии, выстроил их по приоритету и связкам. Вместе с командой спроектировали поведение плавнее и понятнее, заложили место под будущий функционал, дизайн привели к общей стилистике сервиса. +

+
+ Редактор разметки датасета — размечаемый документ в центре, панели полей и инструментов по бокам +
Редактор разметки датасета — размечаемый документ в центре, панели полей и инструментов по бокам
+
+

+ Страница стала симметричной. Почти всё пространство уходит на размечаемое изображение, действия сгруппированы по панелям: нужная функция ищется быстро. +

+
+ Схематичный каркас редактора — центральная рабочая область и боковые панели +
Схематичный каркас редактора — центральная рабочая область и боковые панели, режим по умолчанию
+
+

+ Для продвинутых пользователей добавил режим «Во весь экран». Боковые панели сворачиваются, работа идёт через горячие клавиши и нижнюю панель. На небольших мониторах это спасает. +

+
+ Полноэкранный режим редактора с раскрытыми боковыми панелями +
Полноэкранный режим редактора с раскрытыми боковыми панелями
+
+
+ Полноэкранный режим без панелей — только размечаемый документ и нижняя панель +
Полноэкранный режим без панелей — на экране только размечаемый документ и нижняя панель инструментов
+
+
+ Четыре варианта каркаса полноэкранного режима +
Четыре варианта каркаса полноэкранного режима — обе панели, без панелей, только левая, только правая
+
+
+ Нижняя панель инструментов — переключение между изображениями и быстрые действия разметки +
Нижняя панель инструментов — переключение между изображениями и быстрые действия разметки
+
+
+ +
+

Десятки полей на одном скане, и место под документ не страдает

+

+ Смежная задача: настроить уникальные параметры полей датасета. Большая область нужна под скан документа, полей десятки, у каждого свои типы и зависимые параметры. +

+
+
+ +
+
Прототип сопоставления полей — пользователь выбирает поле на скане документа и настраивает его параметры в компактной панели
+
+

+ Интерфейс вышел компактным. Механика не считывается с первого взгляда, зато после короткого обучения работать в нём быстро и комфортно. +

+
+ +
+

Карточки обучения: паттерн, который разошёлся по всему продукту

+

+ После разметки датасета модель дообучают (fine-tuning). Разобрали все действия пользователя, перебрали несколько компоновок страницы. Остановились на ленте из карточек. +

+
+ Раздел обучения моделей — вертикальная лента карточек +
Раздел обучения моделей — вертикальная лента карточек, сверху карточка настройки нового обучения
+
+

+ В начале ленты карточка настройки: результат разметки активного датасета, параметры, запуск fine-tuning. +

+
+ Карточка настройки обучения — матрица качества датасета и блок параметров запуска +
Карточка настройки обучения — матрица качества датасета и блок параметров запуска
+
+ +

+ Под каждый запущенный процесс появляется своя карточка. Можно завести несколько процессов с разными параметрами и сравнить, какая конфигурация отработала лучше. +

+
+ Карточка запущенного процесса обучения — статус, прогресс и метрики +
Карточка запущенного процесса обучения — статус, прогресс и метрики, разнесённые по логическим блокам
+
+
+ Каркас карточки процесса обучения +
Каркас карточки процесса обучения — схема расположения информационных блоков и действий
+
+

+ Карточки сворачиваются, в шапке остаются название и статус. +

+
+ Свёрнутая карточка обучения — одна строка с названием и статусом процесса +
Свёрнутая карточка обучения — одна строка с названием и статусом процесса
+
+

+ Паттерны из этих карточек потом разошлись по другим разделам продукта. Единый стиль стало проще держать. +

+
+ +
+

Долгие процессы — в соседнюю вкладку

+

+ Часть задач идёт параллельно с остальной работой. Для таких сценариев модальное окно открывается на отдельной странице. +

+ +
+ Импорт датасета в модальном окне на отдельной странице +
Импорт датасета в модальном окне на отдельной странице — форма загрузки на весь экран
+
+

+ На странице проекта в это время висит заглушка с кнопкой перехода к процессу. +

+
+ Заглушка активного импорта внутри проекта +
Заглушка активного импорта внутри проекта — индикатор процесса и кнопка перехода
+
+
+ +
+

Что я решил не делать, и почему

+
    +
  • Не стал блокировать кнопки на отдельных страницах во время активных процессов. Модалка на отдельной странице технически проще, а прогресс виден в соседней вкладке.
  • +
  • Не рисовал новые компоненты, кроме крайних случаев. Готовая библиотека Ant Design ускоряла разработку и держала интерфейс консистентным.
  • +
  • Не убрал боковые панели редактора совсем, а сделал сворачиваемыми. Новичкам нужны подсказки на экране, продвинутым — максимум места под документ.
  • +
  • Не заводил отдельную дизайн-систему. В продукте уже был фреймворк, в разработку передавал ссылки на готовые юзерфлоу в Figma.
  • +
+

Передача в разработку

+

+ Раз в неделю обсуждали дизайн с командой: список задач, приоритеты, сроки под планы релизов. С верстальщиком уточнял детали макетов тет-а-тет и давал фидбэк после вёрстки, чтобы результат не разошёлся с задуманным поведением. +

+
+ +
+

Результат

+ +
    +
  • Обращения к команде внедрения на этапе настройки сократились на 40%. Базовую настройку клиенты проходят сами.
  • +
  • 7 из 10 новых клиентов настроили первый проект без техподдержки. До редизайна — 1 из 10.
  • +
  • Настройка первого проекта: с ~3 дней до ~4 часов.
  • +
  • Переработано 30+ экранов: навигация, редактор датасета, обучение моделей, импорт данных.
  • +
  • Заложены паттерны, на которых функционал наращивается без больших переделок.
  • +
  • В компанию наняли второго дизайнера. Я ввёл её в курс дела и курировал результат, после адаптации проект целиком перешёл под её ответственность.
  • +
+
+ +
+

Выводы

+
    +
  • Жёсткий фреймворк оказался не ограничением, а ускорителем: готовая библиотека компонентов позволила думать о сценариях, а не о пикселях.
  • +
  • Самые ценные инсайты дали эксперты по настройке. В следующий раз вовлёк бы команду внедрения ещё раньше.
  • +
  • Передача проекта новому дизайнеру подтвердила: заложенные паттерны работают, их можно объяснить и поддерживать без автора.
  • +
+
+
+
+ +
+
+

Портфолио

+
    +
  1. + + +
    +

    Платформа для работы с AI

    +
      +
    • UX/UI
    • +
    • Web App
    • +
    +

    Интерфейс для обучения и использования AI‑моделей в бизнес‑процессах: работа с данными, сценариями автоматизации и Smart OCR.

    +
    +
    +
  2. +
  3. + + +
    +

    Графический редактор Lunacy

    +
      +
    • UX/UI
    • +
    • Desktop App
    • +
    +

    Работа над интерфейсом Lunacy в команде Icons8: user flow, сложные прототипы, улучшение функциональности и интерфейсной логики.

    +
    +
    +
  4. +
  5. + + +
    +

    Игровой движок MANU

    +
      +
    • Product Design
    • +
    • Desktop App
    • +
    +

    Редизайн и развитие интерфейса игрового движка: новая концепция работы, обновлённая визуальная система и проработка сотен сложных пользовательских сценариев.

    +
    +
    +
  6. +
  7. + + +
    +

    Мобильное приложение для сети клиник

    +
      +
    • UX/UI
    • +
    • Mobile App
    • +
    +

    Дизайн мобильного приложения для записи к врачам и работы с медицинскими услугами. Фокус на простом пользовательском пути, понятной навигации и быстром доступе к нужным действиям.

    +
    +
    +
  8. +
  9. + +
    +

    Веб-панель для оркестрации автоматизаций

    +
      +
    • UX/UI
    • +
    • Web App
    • +
    +

    Веб-кабинет оркестратора Primo RPA: проекты, запуск и контроль RPA-роботов. Редизайн ключевых экранов под продакшен без остановки релизов.

    +
    +
    +
  10. +
  11. + +
    +

    Концепт сервиса распределения задач

    +
      +
    • UX/UI
    • +
    • Analytics
    • +
    +

    Продуктовый концепт сервиса для постановки, распределения и отслеживания задач, с акцентом на прозрачность процессов и удобство командной работы.

    +
    +
    +
  12. +
  13. + +
    +

    Таск-трекер для бек-офис системы

    +
      +
    • Product Design
    • +
    • Web App
    • +
    +

    Интерфейс для планирования и распределения задач в операционном отделе: общий пул, личный ToDo, обзор по исполнителям; вкладки, фильтры, доска / список / таблица, Drag&Drop.

    +
    +
    +
  14. +
+
+
+ + + + + + + + + + + + + diff --git a/public/cases/ai-platform-primo-rpa.html b/public/cases/ai-platform-primo-rpa.html index 1e9c811..fb58776 100644 --- a/public/cases/ai-platform-primo-rpa.html +++ b/public/cases/ai-platform-primo-rpa.html @@ -36,6 +36,30 @@ var L = Number(l); if (Number.isFinite(L)) d.style.setProperty("--theme-l", String(Math.min(70, Math.max(20, L)))); } + var hVal = h !== null ? h : 210; + var sVal = s !== null ? s : 90; + var lVal = l !== null ? Math.min(70, Math.max(20, Number(l))) : 40; + var H = (((hVal % 360) + 360) % 360) / 360; + var S = Math.min(100, Math.max(0, sVal)) / 100; + var Lv = Math.min(100, Math.max(0, lVal)) / 100; + var r, g, b; + if (S === 0) { r = g = b = Lv; } + else { + var q = Lv < 0.5 ? Lv * (1 + S) : Lv + S - Lv * S; + var p = 2 * Lv - q; + var hue2rgb = function(p, q, t) { + if (t < 0) t += 1; if (t > 1) t -= 1; + if (t < 1/6) return p + (q - p) * 6 * t; + if (t < 1/2) return q; + if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + }; + r = hue2rgb(p, q, H + 1/3); + g = hue2rgb(p, q, H); + b = hue2rgb(p, q, H - 1/3); + } + var lum = 0.2126 * r + 0.7152 * g + 0.0722 * b; + d.style.setProperty("--on-accent", lum > 0.58 ? "hsl(220 14% 12%)" : "hsl(0 0% 98%)"); var rad = t.radius; if (rad === "soft" || rad === "medium" || rad === "strong") { d.dataset.radius = rad; @@ -741,140 +765,140 @@ -
-
-

Портфолио

-
    -
  1. - - -
    -

    Платформа для работы с AI

    -
      -
    • UX/UI
    • -
    • Web App
    • -
    -

    Интерфейс для обучения и использования AI‑моделей в бизнес‑процессах: работа с данными, сценариями автоматизации и Smart OCR.

    -
    -
    -
  2. -
  3. - - -
    -

    Графический редактор Lunacy

    -
      -
    • UX/UI
    • -
    • Desktop App
    • -
    -

    Работа над интерфейсом Lunacy в команде Icons8: user flow, сложные прототипы, улучшение функциональности и интерфейсной логики.

    -
    -
    -
  4. -
  5. - - -
    -

    Игровой движок MANU

    -
      -
    • Product Design
    • -
    • Desktop App
    • -
    -

    Редизайн и развитие интерфейса игрового движка: новая концепция работы, обновлённая визуальная система и проработка сотен сложных пользовательских сценариев.

    -
    -
    -
  6. -
  7. - - -
    -

    Мобильное приложение для сети клиник

    -
      -
    • UX/UI
    • -
    • Mobile App
    • -
    -

    Дизайн мобильного приложения для записи к врачам и работы с медицинскими услугами. Фокус на простом пользовательском пути, понятной навигации и быстром доступе к нужным действиям.

    -
    -
    -
  8. -
  9. - -
    -

    Веб-панель для оркестрации автоматизаций

    -
      -
    • UX/UI
    • -
    • Web App
    • -
    -

    Веб-кабинет оркестратора Primo RPA: проекты, запуск и контроль RPA-роботов. Редизайн ключевых экранов под продакшен без остановки релизов.

    -
    -
    -
  10. -
  11. - -
    -

    Концепт сервиса распределения задач

    -
      -
    • UX/UI
    • -
    • Analytics
    • -
    -

    Продуктовый концепт сервиса для постановки, распределения и отслеживания задач, с акцентом на прозрачность процессов и удобство командной работы.

    -
    -
    -
  12. -
  13. - -
    -

    Таск-трекер для бек-офис системы

    -
      -
    • Product Design
    • -
    • Web App
    • -
    -

    Интерфейс для планирования и распределения задач в операционном отделе: общий пул, личный ToDo, обзор по исполнителям; вкладки, фильтры, доска / список / таблица, Drag&Drop.

    -
    -
    -
  14. -
-
+
+
+

Портфолио

+
    +
  1. + + +
    +

    Платформа для работы с AI

    +
      +
    • UX/UI
    • +
    • Web App
    • +
    +

    Интерфейс для обучения и использования AI‑моделей в бизнес‑процессах: работа с данными, сценариями автоматизации и Smart OCR.

    +
    +
    +
  2. +
  3. + + +
    +

    Графический редактор Lunacy

    +
      +
    • UX/UI
    • +
    • Desktop App
    • +
    +

    Работа над интерфейсом Lunacy в команде Icons8: user flow, сложные прототипы, улучшение функциональности и интерфейсной логики.

    +
    +
    +
  4. +
  5. + + +
    +

    Игровой движок MANU

    +
      +
    • Product Design
    • +
    • Desktop App
    • +
    +

    Редизайн и развитие интерфейса игрового движка: новая концепция работы, обновлённая визуальная система и проработка сотен сложных пользовательских сценариев.

    +
    +
    +
  6. +
  7. + + +
    +

    Мобильное приложение для сети клиник

    +
      +
    • UX/UI
    • +
    • Mobile App
    • +
    +

    Дизайн мобильного приложения для записи к врачам и работы с медицинскими услугами. Фокус на простом пользовательском пути, понятной навигации и быстром доступе к нужным действиям.

    +
    +
    +
  8. +
  9. + +
    +

    Веб-панель для оркестрации автоматизаций

    +
      +
    • UX/UI
    • +
    • Web App
    • +
    +

    Веб-кабинет оркестратора Primo RPA: проекты, запуск и контроль RPA-роботов. Редизайн ключевых экранов под продакшен без остановки релизов.

    +
    +
    +
  10. +
  11. + +
    +

    Концепт сервиса распределения задач

    +
      +
    • UX/UI
    • +
    • Analytics
    • +
    +

    Продуктовый концепт сервиса для постановки, распределения и отслеживания задач, с акцентом на прозрачность процессов и удобство командной работы.

    +
    +
    +
  12. +
  13. + +
    +

    Таск-трекер для бек-офис системы

    +
      +
    • Product Design
    • +
    • Web App
    • +
    +

    Интерфейс для планирования и распределения задач в операционном отделе: общий пул, личный ToDo, обзор по исполнителям; вкладки, фильтры, доска / список / таблица, Drag&Drop.

    +
    +
    +
  14. +
+
-