Создал странички ленты и сотрудников.

This commit is contained in:
Konstantin Makaev 2026-02-18 16:50:16 +03:00
parent cf2ea7893a
commit 621d73257c
17 changed files with 990 additions and 57 deletions

110
.github/copilot-instructions.md vendored Normal file
View File

@ -0,0 +1,110 @@
<!-- Use this file to provide workspace-specific custom instructions to Copilot. For more details, visit https://code.visualstudio.com/docs/copilot/copilot-customization#_use-a-githubcopilotinstructionsmd-file -->
- [x] Verify that the copilot-instructions.md file in the .github directory is created.
- [x] Clarify Project Requirements
<!-- Ask for project type, language, and frameworks if not specified. Skip if already provided. -->
- [x] Scaffold the Project
<!--
Ensure that the previous step has been marked as completed.
Call project setup tool with projectType parameter.
Run scaffolding command to create project files and folders.
Use '.' as the working directory.
If no appropriate projectType is available, search documentation using available tools.
Otherwise, create the project structure manually using available file creation tools.
-->
- [ ] Customize the Project
<!--
Verify that all previous steps have been completed successfully and you have marked the step as completed.
Develop a plan to modify codebase according to user requirements.
Apply modifications using appropriate tools and user-provided references.
Skip this step for "Hello World" projects.
-->
- [ ] Install Required Extensions
<!-- ONLY install extensions provided mentioned in the get_project_setup_info. Skip this step otherwise and mark as completed. -->
- [x] Compile the Project
<!--
Verify that all previous steps have been completed.
Install any missing dependencies.
Run diagnostics and resolve any issues.
Check for markdown files in project folder for relevant instructions on how to do this.
-->
- [x] Create and Run Task
<!--
Verify that all previous steps have been completed.
Check https://code.visualstudio.com/docs/debugtest/tasks to determine if the project needs a task. If so, use the create_and_run_task to create and launch a task based on package.json, README.md, and project structure.
Skip this step otherwise.
-->
- [x] Launch the Project
<!--
Verify that all previous steps have been completed.
Prompt user for debug mode, launch only if confirmed.
-->
- [ ] Ensure Documentation is Complete
<!--
Verify that all previous steps have been completed.
Verify that README.md and the copilot-instructions.md file in the .github directory exists and contains current project information.
Clean up the copilot-instructions.md file in the .github directory by removing all HTML comments.
-->
<!--
## Execution Guidelines
PROGRESS TRACKING:
- If any tools are available to manage the above todo list, use it to track progress through this checklist.
- After completing each step, mark it complete and add a summary.
- Read current todo list status before starting each new step.
COMMUNICATION RULES:
- Avoid verbose explanations or printing full command outputs.
- If a step is skipped, state that briefly (e.g. "No extensions needed").
- Do not explain project structure unless asked.
- Keep explanations concise and focused.
DEVELOPMENT RULES:
- Use '.' as the working directory unless user specifies otherwise.
- Avoid adding media or external links unless explicitly requested.
- Use placeholders only with a note that they should be replaced.
- If the user has not specified project details, assume they want a "Hello World" project as a starting point.
- Avoid adding links of any type (URLs, files, folders, etc.) or integrations that are not explicitly required.
- Avoid generating images, videos, or any other media files unless explicitly requested.
- If you need to use any media assets as placeholders, let the user know that these are placeholders and should be replaced with the actual assets later.
- Ensure all generated components serve a clear purpose within the user's requested workflow.
- If a feature is assumed but not confirmed, prompt the user for clarification before including it.
- If you are working on a VS Code extension, use the VS Code API tool with a query to find relevant VS Code API references and samples related to that query.
FOLDER CREATION RULES:
- Always use the current directory as the project root.
- If you are running any terminal commands, use the '.' argument to ensure that the current working directory is used ALWAYS.
- Do not create a new folder unless the user explicitly requests it besides a .vscode folder for a tasks.json file.
- If any of the scaffolding commands mention that the folder name is not correct, let the user know to create a new folder with the correct name and then reopen it again in vscode.
EXTENSION INSTALLATION RULES:
- Only install extension specified by the get_project_setup_info tool. DO NOT INSTALL any other extensions.
PROJECT CONTENT RULES:
- If the user has not specified project details, assume they want a "Hello World" project as a starting point.
- Avoid adding links of any type (URLs, files, folders, etc.) or integrations that are not explicitly required.
- Avoid generating images, videos, or any other media files unless explicitly requested.
- If you need to use any media assets as placeholders, let the user know that these are placeholders and should be replaced with the actual assets later.
- Ensure all generated components serve a clear purpose within the user's requested workflow.
- If a feature is assumed but not confirmed, prompt the user for clarification before including it.
- If you are working on a VS Code extension, use the VS Code API tool with a query to find relevant VS Code API references and samples related to that query.
TASK COMPLETION RULES:
- Your task is complete when:
- Project is successfully scaffolded and compiled without errors
- copilot-instructions.md file in the .github directory exists in the project
- README.md file exists and is up to date
- User is provided with clear instructions to debug/launch the project
Before starting a new task in the above plan, update progress in the plan.
-->
- Work through each checklist item systematically.
- Keep communication concise and focused.
- Follow development best practices.

15
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "dev",
"type": "shell",
"command": "cmd",
"args": [
"/c",
"set PATH=C:\\Users\\sa\\node-portable\\nodejs;%PATH% && npm run dev"
],
"isBackground": true
}
]
}

9
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "corp.front",
"version": "0.1.0",
"dependencies": {
"lucide-react": "^0.574.0",
"next": "16.1.6",
"react": "19.2.3",
"react-dom": "19.2.3"
@ -4535,6 +4536,14 @@
"yallist": "^3.0.2"
}
},
"node_modules/lucide-react": {
"version": "0.574.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.574.0.tgz",
"integrity": "sha512-dJ8xb5juiZVIbdSn3HTyHsjjIwUwZ4FNwV0RtYDScOyySOeie1oXZTymST6YPJ4Qwt3Po8g4quhYl4OxtACiuQ==",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",

View File

@ -9,6 +9,7 @@
"lint": "eslint"
},
"dependencies": {
"lucide-react": "^0.574.0",
"next": "16.1.6",
"react": "19.2.3",
"react-dom": "19.2.3"

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
public/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

195
public/logo1.svg Normal file
View File

@ -0,0 +1,195 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M963 4786 c-81 -26 -170 -92 -220 -162 -49 -71 -53 -101 -55 -468 -1
-188 2 -348 6 -355 5 -7 5 -28 1 -48 -3 -19 -1 -93 6 -164 12 -125 12 -130 -8
-157 -15 -19 -29 -27 -49 -26 -175 8 -266 14 -274 19 -14 8 -120 -12 -137 -27
-11 -9 -16 -9 -23 2 -6 10 -14 9 -38 -8 -37 -27 -54 -53 -75 -116 -19 -56 -20
-59 -10 -53 11 7 15 -882 5 -1103 -9 -194 -3 -249 32 -302 24 -37 94 -81 118
-74 12 2 45 0 75 -5 37 -7 100 -7 195 0 148 11 171 7 183 -30 4 -11 2 -109 -4
-217 -7 -128 -8 -320 -3 -547 l7 -350 29 -58 c51 -99 162 -180 284 -206 70
-15 2994 -16 3073 -1 111 21 206 84 266 177 58 91 62 127 63 501 0 185 0 339
0 342 0 3 -2 71 -4 151 -2 81 -6 151 -9 156 -7 12 21 70 37 76 7 3 51 1 97 -4
152 -17 269 -16 326 4 61 22 126 82 144 135 17 49 18 194 1 200 -7 2 -12 22
-12 50 0 26 -7 74 -15 107 -8 33 -15 76 -15 95 0 19 -10 55 -21 80 -34 75 -36
162 -5 249 70 200 32 422 -98 559 -27 29 -63 61 -80 71 -46 28 -207 81 -273
89 -50 6 -60 11 -80 41 -12 18 -21 37 -18 41 19 30 33 917 16 1025 -20 134
-90 228 -211 288 l-65 32 -1560 2 c-1271 1 -1568 -1 -1602 -11z m3140 -165
c13 -5 49 -34 80 -64 l57 -55 0 -605 c0 -393 -4 -608 -10 -612 -6 -3 -10 -12
-10 -19 0 -10 29 -16 108 -21 253 -17 377 -77 446 -218 20 -42 27 -75 32 -153
6 -101 -7 -216 -26 -222 -6 -2 -10 -12 -10 -23 0 -11 -11 -31 -24 -43 -33 -34
-38 -54 -18 -74 9 -10 30 -42 46 -72 27 -52 29 -63 34 -205 4 -121 8 -157 23
-185 32 -59 22 -138 -19 -158 -37 -17 -397 -17 -432 1 -42 21 -52 58 -57 210
-2 78 -9 154 -15 170 -10 26 -12 27 -89 27 l-79 0 0 -192 c0 -106 -3 -203 -6
-214 -5 -20 -2 -22 37 -22 29 -1 48 -7 56 -18 10 -14 13 -148 13 -626 0 -606
0 -608 -21 -626 -12 -9 -39 -35 -61 -57 l-40 -40 -1566 -5 -1567 -5 -32 28
c-18 16 -31 34 -30 40 1 6 -5 12 -13 12 -8 0 -14 7 -12 15 2 8 0 12 -4 8 -4
-4 -13 -3 -20 3 -11 9 -14 125 -14 614 l0 602 26 28 c25 28 27 28 116 21 50
-3 113 -6 139 -6 81 0 79 16 79 -552 l0 -488 1335 0 1335 0 0 504 c0 435 2
507 15 520 25 25 17 36 -25 36 l-40 0 0 -99 c0 -147 -6 -151 -251 -151 l-170
0 3 -72 3 -73 133 -5 c184 -7 172 13 172 -287 0 -230 0 -236 -22 -259 l-23
-24 -1142 0 -1142 0 -21 22 c-19 21 -20 34 -20 263 0 191 3 245 14 260 12 17
30 20 120 23 l106 4 0 74 0 74 -134 0 c-130 0 -173 7 -199 31 -8 8 -11 44 -9
124 l4 112 -63 6 c-34 4 -94 7 -133 7 -68 0 -72 1 -89 29 -9 16 -17 37 -17 46
0 9 -4 14 -9 10 -14 -8 -24 93 -19 204 2 65 0 99 -7 98 -5 -1 -9 6 -7 16 3 15
-6 17 -68 17 l-70 0 0 -183 c0 -215 -5 -233 -65 -242 -22 -4 -122 -5 -222 -3
-168 3 -183 5 -198 23 l-15 20 6 -20 c6 -20 5 -20 -10 -1 -14 18 -16 91 -16
662 l0 642 25 16 c21 14 63 16 302 16 l278 0 -2 627 c-2 344 0 624 3 620 7 -7
64 49 64 64 0 6 4 8 9 5 4 -3 17 4 27 15 11 12 28 25 39 30 28 11 3068 11
3098 0z"/>
<path d="M1017 4479 l-37 -40 0 -537 c0 -295 4 -543 9 -550 5 -9 24 -12 57
-10 l49 3 3 524 c1 367 6 528 13 538 10 11 257 13 1436 13 963 0 1431 -3 1444
-10 18 -10 19 -27 19 -530 l0 -520 60 0 60 0 0 541 0 541 -40 39 -40 39 -1498
0 -1497 -1 -38 -40z"/>
<path d="M1220 3805 c0 -461 -1 -497 -18 -527 -21 -37 -19 -58 6 -58 31 -1
142 -78 142 -99 0 -6 9 -11 20 -11 15 0 20 7 20 29 0 100 151 181 338 181 64
0 81 3 86 16 13 35 0 274 -15 274 -5 0 -9 -24 -9 -53 0 -83 -21 -101 -121
-106 -179 -8 -182 -3 -177 288 2 158 6 212 17 224 11 14 34 17 132 17 110 0
119 -1 133 -22 9 -12 16 -39 16 -60 0 -20 5 -40 10 -43 11 -7 12 12 19 213 1
12 9 26 19 29 9 4 20 11 23 15 3 5 37 15 75 21 38 7 74 15 79 19 14 9 123 28
161 28 18 0 34 4 36 9 2 5 80 14 174 21 132 9 209 9 340 0 93 -6 178 -15 189
-20 11 -4 61 -14 110 -20 50 -7 92 -16 95 -19 3 -4 37 -12 77 -18 39 -6 83
-19 97 -29 27 -20 30 -42 28 -189 0 -33 2 -49 4 -35 18 99 20 100 157 100 62
0 117 -4 122 -8 30 -22 35 -56 35 -253 0 -268 -1 -269 -164 -269 -39 0 -80 3
-91 6 -31 8 -49 42 -55 104 -4 37 -7 11 -8 -80 0 -74 1 -143 4 -152 4 -14 16
-18 52 -18 118 -1 215 -28 273 -77 14 -11 18 -11 29 2 11 13 34 16 122 14 60
-1 111 1 114 4 4 3 -1 16 -10 29 -14 20 -16 80 -16 520 l0 498 -1335 0 -1335
0 0 -495z m2505 335 c12 -13 15 -27 11 -45 -8 -32 -26 -32 -64 0 -17 14 -39
25 -50 25 -11 0 -25 7 -32 15 -11 14 -10 14 12 6 14 -5 29 -6 34 -1 9 8 36 16
60 19 6 0 19 -8 29 -19z m-2242 1 c18 -2 4 -23 -31 -46 -32 -21 -44 -24 -65
-16 -32 12 -34 24 -7 51 14 14 29 18 57 15 21 -2 41 -4 46 -4z m-86 -749 c-5
-37 -34 -53 -53 -27 -13 17 -11 73 3 98 10 17 53 -45 50 -71z m2351 31 c-5
-23 -23 -20 -26 4 -3 18 0 21 13 17 9 -4 15 -13 13 -21z"/>
<path d="M2285 4088 c-49 -5 -97 -13 -106 -18 -9 -4 -51 -13 -95 -20 -43 -7
-83 -16 -89 -20 -5 -4 -21 -10 -35 -12 -25 -3 -25 -3 -28 -127 -2 -93 -6 -127
-18 -138 -13 -14 -13 -18 1 -39 12 -19 15 -63 15 -252 0 -164 -3 -231 -12
-240 -8 -8 -57 -12 -153 -12 -78 0 -145 -4 -151 -9 -5 -5 -26 -14 -47 -21 -62
-20 -67 -42 -67 -304 0 -139 -4 -227 -10 -231 -6 -4 -10 -134 -10 -356 l0
-349 -27 -11 c-15 -6 -35 -8 -45 -6 -38 10 -49 -14 -46 -98 l3 -80 167 -3
c132 -2 167 -5 171 -17 8 -19 11 -334 4 -341 -3 -3 -56 -7 -119 -7 l-113 -2
-3 -173 -2 -172 485 0 485 0 0 163 c0 89 -4 167 -8 174 -5 8 -43 13 -107 15
l-100 3 -3 163 c-1 101 2 170 8 182 10 19 22 20 285 20 150 0 276 -3 278 -7 3
-5 7 -87 8 -183 l4 -175 -105 -5 -105 -5 -3 -173 -2 -172 510 0 510 0 -2 172
-3 173 -145 5 -145 5 -2 164 c-1 107 2 170 9 178 8 10 57 13 204 13 l194 0 0
84 c0 91 -3 97 -54 103 -58 6 -55 -22 -58 597 l-3 573 -28 36 c-19 25 -40 40
-70 47 -23 7 -58 16 -78 21 -20 5 -72 9 -116 9 -48 0 -84 5 -91 12 -17 17 -17
448 1 496 10 28 10 36 0 39 -10 4 -13 38 -13 128 0 130 -2 135 -51 135 -10 0
-19 4 -19 9 0 4 -41 14 -91 20 -49 6 -98 16 -107 20 -51 27 -461 39 -657 19z
m50 -138 c11 -5 31 -11 45 -14 42 -9 110 -78 125 -128 14 -48 12 -139 -5 -183
-12 -33 -84 -105 -104 -105 -8 0 -16 -6 -19 -12 -6 -20 -207 -18 -231 2 -48
39 -108 105 -117 127 -5 13 -9 54 -9 90 0 52 5 75 24 107 45 75 69 90 211 131
13 4 54 -4 80 -15z m630 -10 c22 -6 45 -17 50 -23 6 -7 19 -17 30 -23 11 -6
30 -30 42 -54 28 -52 32 -160 8 -218 -16 -37 -80 -102 -102 -102 -6 0 -13 -6
-16 -12 -3 -9 -34 -13 -109 -13 -86 0 -108 3 -122 18 -10 9 -21 17 -25 17 -15
0 -65 52 -85 89 -27 49 -29 170 -3 198 9 11 17 24 17 29 0 6 17 26 38 45 32
31 89 56 167 73 10 3 40 -4 110 -24z m-308 -445 c80 -53 165 -78 238 -70 32 3
75 13 93 21 38 15 90 18 110 5 15 -9 42 -93 42 -131 0 -42 46 -123 85 -148 19
-12 56 -27 82 -33 164 -40 179 -48 215 -127 17 -38 19 -66 18 -280 0 -130 0
-250 -1 -267 -2 -85 20 -505 29 -536 12 -47 -7 -96 -40 -103 -13 -3 -54 -13
-92 -21 -127 -28 -169 -72 -186 -196 -12 -85 -1 -188 24 -237 21 -41 69 -76
133 -97 104 -33 126 -120 41 -156 -26 -11 -105 -14 -371 -14 l-339 0 -30 34
c-49 54 -28 105 70 173 55 38 81 90 88 180 13 163 -30 269 -121 300 -68 23
-386 25 -461 3 -98 -29 -134 -98 -134 -259 0 -120 18 -168 76 -212 120 -91
140 -135 83 -190 l-30 -29 -211 -3 c-234 -3 -423 9 -457 29 -26 17 -37 53 -25
85 5 13 40 45 79 71 89 61 108 103 107 241 -1 171 -37 235 -154 276 -29 11
-63 28 -76 40 -21 18 -23 27 -18 71 4 27 10 214 15 415 15 620 18 665 41 710
27 52 78 78 182 91 153 19 205 67 229 209 20 121 40 134 154 101 40 -11 89
-21 107 -21 50 0 136 28 188 60 114 71 131 72 217 15z"/>
<path d="M2220 3843 c-8 -3 -23 -14 -34 -25 -11 -10 -23 -18 -28 -18 -4 0 -12
-18 -18 -41 -19 -70 11 -124 87 -154 40 -16 45 -16 87 0 31 12 53 30 70 56 38
56 34 91 -14 140 -35 36 -48 42 -88 45 -26 2 -54 1 -62 -3z"/>
<path d="M2788 3823 c-87 -66 -74 -164 29 -217 37 -19 56 -20 81 -6 9 5 28 14
42 19 16 5 35 27 49 55 24 45 24 46 6 85 -26 58 -61 84 -120 89 -43 3 -55 0
-87 -25z"/>
<path d="M2358 2866 c-26 -7 -62 -25 -80 -40 -103 -83 -144 -96 -318 -96 -167
0 -248 -33 -271 -109 -9 -29 -9 -47 1 -75 22 -69 61 -92 285 -173 82 -29 159
-58 170 -63 26 -11 162 -59 343 -121 213 -73 282 -68 372 26 66 68 104 85 197
85 238 1 337 28 376 102 34 68 -2 132 -104 184 -97 49 -789 273 -889 287 -19
3 -56 0 -82 -7z m111 -63 c3 -6 34 -16 69 -23 34 -7 62 -16 62 -20 0 -4 27
-13 60 -19 33 -7 60 -15 60 -20 0 -4 29 -13 65 -20 36 -7 65 -16 65 -20 0 -3
26 -12 58 -20 31 -7 62 -16 67 -21 6 -4 35 -13 65 -20 30 -7 57 -16 60 -20 3
-3 31 -12 63 -19 31 -7 57 -16 57 -20 0 -4 29 -13 65 -20 36 -7 65 -17 65 -21
0 -4 11 -11 25 -14 37 -9 45 -69 14 -102 l-22 -24 -273 0 -273 0 -3 -77 -3
-77 -38 -20 c-24 -13 -41 -16 -45 -10 -4 5 -34 15 -66 22 -33 6 -62 15 -65 20
-3 4 -32 14 -63 22 -32 7 -58 16 -58 20 0 4 -25 12 -55 19 -30 7 -55 16 -55
20 0 4 -27 13 -60 20 -33 8 -60 17 -60 21 0 4 -27 13 -60 20 -33 7 -60 16 -60
20 0 4 -25 12 -55 19 -30 7 -55 16 -55 20 0 4 -27 13 -60 20 -33 8 -60 17 -60
21 0 4 -15 10 -34 13 -18 3 -54 15 -79 26 -35 16 -47 28 -52 50 -6 30 7 69 29
83 6 4 90 8 186 9 96 0 213 4 260 7 l85 7 7 52 c4 29 16 62 25 74 16 18 26 20
77 16 32 -3 62 -9 65 -14z"/>
<path d="M2418 2693 c-3 -4 -11 -28 -18 -53 -20 -65 -26 -70 -89 -70 -31 0
-63 -4 -71 -10 -9 -5 -19 -5 -27 2 -9 7 -13 7 -13 -1 0 -14 -57 -15 -62 -1 -2
7 -12 6 -29 -2 -24 -11 -24 -13 -8 -29 9 -9 35 -20 56 -24 22 -3 51 -12 65
-19 14 -7 48 -19 77 -26 28 -6 51 -15 51 -19 0 -4 27 -13 60 -20 33 -8 60 -17
60 -21 0 -4 17 -11 38 -15 20 -4 51 -13 67 -20 29 -13 102 -35 118 -35 4 0 7
29 7 63 0 93 7 97 157 97 146 0 166 5 126 31 -15 11 -39 19 -53 19 -14 0 -37
6 -52 14 -15 8 -52 20 -83 27 -30 7 -55 16 -55 20 0 4 -19 10 -42 14 -24 4
-56 13 -73 20 -16 8 -50 19 -75 25 -25 7 -49 15 -55 20 -16 12 -73 22 -77 13z
m157 -177 c0 -47 -66 -45 -73 3 -3 20 0 22 35 19 29 -2 38 -7 38 -22z"/>
<path d="M1604 3867 c-2 -7 -3 -78 -2 -157 l3 -145 29 -3 c36 -4 46 10 46 72
0 27 6 65 13 84 10 28 10 36 0 39 -8 3 -13 22 -13 48 0 24 -3 50 -6 59 -7 19
-62 22 -70 3z"/>
<path d="M3450 3820 c0 -33 -4 -60 -10 -60 -5 0 -10 -11 -10 -25 0 -14 5 -25
10 -25 6 0 10 -30 10 -70 0 -65 1 -70 24 -76 14 -3 30 -3 35 1 7 4 11 63 11
161 l0 154 -35 0 -35 0 0 -60z"/>
<path d="M390 2586 l0 -576 140 0 c127 0 140 2 140 18 0 14 -2 15 -10 2 -6
-10 -9 49 -9 175 1 105 4 179 9 165 6 -22 8 -21 11 15 l4 40 145 0 c141 0 147
-1 176 -25 45 -37 64 -100 64 -216 0 -55 3 -116 6 -136 l7 -38 132 0 132 0 1
33 c2 55 -9 177 -16 173 -4 -2 -5 20 -4 50 3 33 -1 60 -8 69 -7 8 -10 22 -6
30 15 40 -49 118 -113 135 -36 9 -41 14 -41 40 0 20 7 33 22 41 35 19 83 61
115 102 25 31 34 164 20 271 -8 58 -59 126 -109 147 -18 7 -35 16 -38 20 -14
20 -162 32 -452 36 l-318 5 0 -576z m211 444 c18 0 8 -46 -20 -97 -37 -66 -49
-165 -27 -208 9 -17 16 -37 16 -46 0 -9 16 -37 36 -63 53 -70 54 -100 6 -161
-51 -65 -63 -88 -83 -155 l-17 -55 -17 40 c-14 32 -18 73 -19 215 -2 281 4
471 15 492 12 22 68 50 87 43 8 -3 18 -5 23 -5z m551 -46 c40 -39 51 -60 59
-119 7 -55 -7 -97 -41 -115 -16 -8 -22 -6 -35 13 -8 13 -18 39 -21 58 -8 39
-33 91 -69 145 -13 20 -22 41 -19 46 13 20 94 2 126 -28z m-164 -60 c4 -6 17
-14 30 -18 12 -4 22 -13 22 -21 0 -7 5 -15 11 -17 6 -2 13 -33 16 -68 6 -88
-16 -131 -75 -144 -23 -6 -42 -13 -42 -18 0 -4 -60 -8 -134 -8 -147 0 -145 -1
-147 63 l-2 32 -7 -35 c-5 -22 -7 14 -8 95 0 79 3 120 8 105 8 -24 8 -24 9 6
1 17 4 34 9 38 12 12 302 3 310 -10z m76 -376 c7 -13 17 -39 20 -59 4 -22 19
-48 42 -70 64 -60 94 -116 94 -174 0 -62 -25 -94 -58 -76 -15 8 -27 39 -47
126 -27 112 -29 116 -67 143 -22 15 -54 39 -72 55 l-31 27 28 25 c35 31 72 32
91 3z"/>
<path d="M663 2790 c0 -30 2 -43 4 -27 2 15 2 39 0 55 -2 15 -4 2 -4 -28z"/>
<path d="M780 2785 l0 -45 73 0 c39 0 77 4 83 8 6 4 10 21 10 37 -1 36 -16 43
-103 44 l-63 1 0 -45z"/>
<path d="M3765 3128 c-3 -7 -4 -265 -3 -573 l3 -560 138 -3 137 -3 0 195 c0
107 3 201 6 210 10 26 246 23 301 -4 45 -21 73 -68 73 -120 0 -18 4 -29 10
-25 6 3 10 2 10 -4 0 -5 -4 -13 -10 -16 -13 -8 -13 -139 -1 -163 6 -9 12 -29
16 -44 l5 -28 136 0 136 0 -7 23 c-3 12 -11 91 -15 176 -8 125 -13 161 -31 195
-29 56 -46 74 -80 81 -16 4 -29 10 -29 15 0 4 -9 10 -20 13 -41 11 -9 74 45 91
11 3 38 32 60 64 l40 57 0 125 c0 120 -1 127 -28 168 -34 52 -95 98 -144 107
-21 4 -44 12 -52 18 -22 19 -689 23 -696 5z m260 -100 c30 -13 32 -40 6 -76
-51 -73 -69 -183 -43 -273 8 -25 33 -72 58 -105 24 -32 44 -64 44 -71 0 -6 -18
-33 -40 -58 -57 -66 -68 -91 -80 -191 -9 -70 -16 -94 -34 -112 -28 -29 -68
-22 -85 15 -15 33 -26 437 -16 636 6 137 10 161 29 189 36 55 102 73 161 46z
m505 -77 c32 -32 46 -72 35 -98 -5 -10 -7 -24 -6 -30 4 -26 -9 -12 -54 57 -48
76 -52 86 -32 93 22 10 28 7 57 -22z m-174 -50 c40 -11 74 -40 67 -57 -3 -8 0
-14 6 -14 14 0 15 -126 1 -135 -6 -4 -8 -10 -6 -14 11 -17 -48 -53 -102 -62
-77 -12 -239 -11 -263 1 -17 10 -19 22 -19 144 0 73 3 136 7 139 10 10 273 8
309 -2z m82 -391 c7 -12 10 -25 7 -30 -10 -15 -41 -12 -56 6 -11 14 -10 18 6
30 25 18 28 18 43 -6z"/>
<path d="M4147 2803 c-14 -14 -7 -81 9 -87 30 -11 111 -6 142 10 34 16 43 49
20 72 -13 13 -159 17 -171 5z"/>
<path d="M664 2235 c0 -49 1 -71 3 -48 2 23 2 64 0 90 -2 26 -3 8 -3 -42z"/>
<path d="M943 2140 c0 -47 2 -66 4 -42 2 23 2 61 0 85 -2 23 -4 4 -4 -43z"/>
<path d="M4010 1259 c0 -333 -4 -517 -10 -530 -11 -19 -37 -19 -1445 -19
-1408 0 -1434 0 -1445 19 -6 13 -10 196 -10 526 l0 506 -57 -3 -58 -3 -3 -533
c-2 -584 -6 -550 59 -598 l33 -24 1482 0 1483 0 45 37 45 38 0 548 1 547 -60
0 -60 0 0 -511z"/>
<path d="M2340 1561 l0 -79 88 -4 c48 -2 126 -2 175 0 l87 4 0 79 0 79 -175 0
-175 0 0 -79z"/>
<path d="M956 537 c3 -10 9 -15 12 -12 3 3 0 11 -7 18 -10 9 -11 8 -5 -6z"/>
<path d="M4481 3697 c1 -21 3 -25 6 -12 3 11 10 23 15 26 5 3 3 9 -6 12 -13 5
-16 0 -15 -26z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,10 @@
export default function DepartmentsPage() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<div className="mx-auto max-w-4xl px-4 py-10 sm:px-8">
<h1 className="text-2xl font-bold text-gray-900">Отделы</h1>
<p className="mt-2 text-sm text-gray-600">Раздел в разработке. Здесь будут списки отделов и контакты.</p>
</div>
</div>
);
}

View File

@ -0,0 +1,10 @@
export default function DocumentsPage() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<div className="mx-auto max-w-4xl px-4 py-10 sm:px-8">
<h1 className="text-2xl font-bold text-gray-900">Документы</h1>
<p className="mt-2 text-sm text-gray-600">Раздел в разработке. Здесь будут договоры, отчёты и файлы.</p>
</div>
</div>
);
}

192
src/app/employees/page.tsx Normal file
View File

@ -0,0 +1,192 @@
"use client";
import { Bell, Building2, FileSignature, FileText, Home as HomeIcon, MessageSquare, Search, Users, Wallet } from "lucide-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
const employees = [
{ id: 1, name: "Константин Макаев", role: "Руководитель проектов", status: "Онлайн", department: "ИТ" },
{ id: 2, name: "Виктория Зацарина", role: "Дизайнер", status: "Недавно", department: "Маркетинг" },
{ id: 3, name: "Алексей Пономарёв", role: "Разработчик", status: "Оффлайн", department: "ИТ" },
{ id: 4, name: "Эдуард Иванов", role: "Директор", status: "Онлайн", department: "Финансы" },
];
const weekdays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"];
const calendarWeeks = [
["", "", "", "", "1", "2", "3"],
["4", "5", "6", "7", "8", "9", "10"],
["11", "12", "13", "14", "15", "16", "17"],
["18", "19", "20", "21", "22", "23", "24"],
["25", "26", "27", "28", "", "", ""],
];
export default function EmployeesPage() {
const pathname = usePathname();
const sortedEmployees = [...employees].sort((a, b) => a.name.localeCompare(b.name, "ru"));
const navLinkClass = (href: string) =>
`flex items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-50 ${
pathname === href ? "bg-sky-50 text-sky-700 ring-1 ring-sky-100" : "text-gray-700"
}`;
const navIconClass = (href: string) => (pathname === href ? "text-sky-700" : "text-gray-400");
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<header className="sticky top-0 z-30 border-b border-slate-100 bg-white/90 backdrop-blur">
<div className="mx-auto flex h-14 max-w-6xl items-center gap-4 px-4 sm:px-8">
<div className="flex items-center gap-2">
<img src="/logo.png" alt="Логотип" className="h-11 w-auto" />
</div>
<div className="hidden flex-1 items-center justify-center md:flex">
<div className="relative w-full max-w-xl">
<Search size={16} className="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400" />
<input
type="text"
className="w-full rounded-full border border-gray-200 bg-gray-50 py-2.5 pl-11 pr-4 text-sm text-gray-800 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="Поиск"
/>
</div>
</div>
<div className="ml-auto flex items-center gap-1 sm:gap-2">
<button className="flex h-10 w-10 items-center justify-center rounded-full hover:bg-slate-100">
<Bell size={18} className="text-gray-600" />
</button>
<div className="ml-1 flex h-10 w-10 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">КМ</div>
</div>
</div>
</header>
<div className="mx-auto flex min-h-screen max-w-6xl gap-6 px-4 py-8 sm:px-8">
<aside className="hidden w-64 flex-shrink-0 lg:block">
<div className="sticky top-8 space-y-4">
<div className="rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="mb-4 flex items-center gap-3">
<div className="flex h-11 w-11 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">КМ</div>
<div>
<p className="text-sm font-semibold text-gray-900">Константин Макаев</p>
<p className="text-xs text-gray-500">Онлайн</p>
</div>
</div>
<div className="space-y-2 text-sm text-gray-700">
<Link href="/" className={navLinkClass("/")}>
<HomeIcon size={18} className={pathname === "/" ? "text-sky-700" : "text-sky-600"} />
Лента
</Link>
<Link href="/messages" className={navLinkClass("/messages")}>
<MessageSquare size={18} className={navIconClass("/messages")} />
Сообщения
</Link>
<Link href="/employees" className={navLinkClass("/employees")}>
<Users size={18} className={navIconClass("/employees")} />
Сотрудники
</Link>
<Link href="/departments" className={navLinkClass("/departments")}>
<Building2 size={18} className={navIconClass("/departments")} />
Отделы
</Link>
<Link href="/requests" className={navLinkClass("/requests")}>
<FileSignature size={18} className={navIconClass("/requests")} />
Заявления
</Link>
<Link href="/documents" className={navLinkClass("/documents")}>
<FileText size={18} className={navIconClass("/documents")} />
Документы
</Link>
<Link href="/finances" className={navLinkClass("/finances")}>
<Wallet size={18} className={navIconClass("/finances")} />
Финансы
</Link>
</div>
</div>
</div>
</aside>
<main className="flex-1 space-y-6">
<div className="flex flex-col gap-3 rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="flex items-center justify-between gap-3">
<div>
<p className="text-sm font-semibold text-sky-600">Команда</p>
<h1 className="text-2xl font-bold text-gray-900">Сотрудники</h1>
</div>
<div className="rounded-full bg-sky-50 px-4 py-2 text-xs font-medium text-sky-700 ring-1 ring-sky-100">Всего: {employees.length}</div>
</div>
</div>
<div className="space-y-3">
{sortedEmployees.map((employee) => {
const isOnline = employee.status === "Онлайн";
const statusColor = isOnline ? "text-green-600" : employee.status === "Недавно" ? "text-amber-600" : "text-gray-500";
const dotColor = isOnline ? "bg-green-500" : employee.status === "Недавно" ? "bg-amber-500" : "bg-gray-400";
return (
<article
key={employee.id}
className="flex items-center gap-4 rounded-2xl bg-white p-4 shadow-sm ring-1 ring-gray-100"
>
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">
{employee.name
.split(" ")
.slice(0, 2)
.map((part) => part[0])
.join("")}
</div>
<div className="flex-1">
<p className="text-sm font-semibold text-gray-900">{employee.name}</p>
<p className="text-xs text-gray-500">{employee.role}</p>
<div className="mt-2 flex items-center gap-2 text-xs text-gray-500">
<span className={`h-2 w-2 rounded-full ${dotColor}`} />
<span className={statusColor}>{employee.status}</span>
<span className="mx-1 text-gray-300">•</span>
<span className="text-gray-500">{employee.department}</span>
</div>
</div>
</article>
);
})}
</div>
</main>
<aside className="hidden w-72 flex-shrink-0 space-y-4 lg:block">
<div className="sticky top-8 space-y-4">
<div className="rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="flex items-center justify-between text-sm font-semibold text-gray-900">
<span>Календарь</span>
<span className="text-xs font-normal text-gray-500">Февраль 2026</span>
</div>
<div className="mt-4 grid grid-cols-7 gap-1 text-center text-xs text-gray-500">
{weekdays.map((day) => (
<div key={day} className="py-1 font-medium">
{day}
</div>
))}
</div>
<div className="mt-1 grid grid-cols-7 gap-1 text-sm text-gray-800">
{calendarWeeks.map((week, wi) =>
week.map((day, di) => {
const isToday = day === "18";
return (
<div
key={`${wi}-${di}`}
className={`flex h-9 items-center justify-center rounded-full ${
day
? isToday
? "bg-sky-100 text-sky-800 font-semibold ring-1 ring-sky-200"
: "hover:bg-sky-50"
: ""
}`}
>
{day}
</div>
);
})
)}
</div>
</div>
</div>
</aside>
</div>
</div>
);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 15 KiB

10
src/app/finances/page.tsx Normal file
View File

@ -0,0 +1,10 @@
export default function FinancesPage() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<div className="mx-auto max-w-4xl px-4 py-10 sm:px-8">
<h1 className="text-2xl font-bold text-gray-900">Финансы</h1>
<p className="mt-2 text-sm text-gray-600">Раздел в разработке. Здесь появится аналитика и отчётность.</p>
</div>
</div>
);
}

74
src/app/login/page.tsx Normal file
View File

@ -0,0 +1,74 @@
import Link from "next/link";
export default function Login() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 to-white text-gray-900">
<div className="mx-auto flex min-h-screen max-w-4xl flex-col justify-center px-6 py-12 sm:px-10">
<div className="mx-auto w-full max-w-xl rounded-2xl bg-white p-8 shadow-xl ring-1 ring-gray-100">
<h1 className="mb-2 text-3xl font-semibold tracking-tight text-gray-900 sm:text-4xl">
Войти в аккаунт
</h1>
<p className="mb-8 text-sm text-gray-600">
Используйте телефон или почту, чтобы продолжить.
</p>
<form className="space-y-4">
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="login">
Телефон или почта
</label>
<input
id="login"
name="login"
type="text"
autoComplete="username"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="example@mail.com"
/>
</div>
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="password">
Пароль
</label>
<input
id="password"
name="password"
type="password"
autoComplete="current-password"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="••••••••"
/>
</div>
<div className="flex items-center justify-between text-sm text-gray-600">
<label className="inline-flex items-center gap-2">
<input
type="checkbox"
className="h-4 w-4 rounded border-gray-300 text-sky-600 focus:ring-sky-500"
/>
Запомнить меня
</label>
<a className="font-medium text-sky-600 transition hover:text-sky-700" href="#">
Забыли пароль?
</a>
</div>
<button
type="submit"
className="flex w-full items-center justify-center rounded-lg bg-sky-400 px-4 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-sky-700 focus:outline-none focus:ring-2 focus:ring-sky-200"
>
Войти
</button>
<Link
href="/register"
className="flex w-full items-center justify-center rounded-lg border border-gray-200 px-4 py-3 text-sm font-semibold text-sky-700 transition hover:border-sky-200 hover:bg-sky-50 focus:outline-none focus:ring-2 focus:ring-sky-100"
>
Создать аккаунт
</Link>
</form>
<p className="mt-6 text-center text-xs text-gray-500">
Продолжая, вы соглашаетесь с условиями использования и подтверждаете ознакомление с политикой конфиденциальности.
</p>
</div>
</div>
</div>
);
}

10
src/app/messages/page.tsx Normal file
View File

@ -0,0 +1,10 @@
export default function MessagesPage() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<div className="mx-auto max-w-4xl px-4 py-10 sm:px-8">
<h1 className="text-2xl font-bold text-gray-900">Сообщения</h1>
<p className="mt-2 text-sm text-gray-600">Раздел в разработке. Здесь появятся чаты и диалоги.</p>
</div>
</div>
);
}

View File

@ -1,65 +1,241 @@
import Image from "next/image";
"use client";
import { Bell, Bookmark, Building2, FileSignature, FileText, Heart, HeartHandshake, Home as HomeIcon, MessageSquare, Search, Star, Users, Wallet } from "lucide-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
const feedItems = [
{
id: 1,
author: "Алексей Пономарёв",
time: "2 часа назад",
text: "Обновил подборку треков для фокуса. Делюсь плейлистом, если тоже любите работать под легкий электро." ,
tags: ["Музыка", "Работа"],
actions: { likes: 42, comments: 8, saves: 5 },
},
{
id: 2,
author: "Виктория Зацарина",
time: "3 часа назад",
text: "Собрали командой фотографии с последней пробежки в парке. Город оживает, когда выходит солнце." ,
tags: ["Спорт", "Фото"],
actions: { likes: 65, comments: 12, saves: 7 },
},
{
id: 3,
author: "Unity C#",
time: "5 часов назад",
text: "Сегодня делимся лучшими гайдами по микроанимациям в интерфейсах. Собрали 7 примеров с кодом и видео." ,
tags: ["Дизайн", "Guides"],
actions: { likes: 88, comments: 16, saves: 21 },
},
];
const weekdays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"];
const calendarWeeks = [
["", "", "", "", "1", "2", "3"],
["4", "5", "6", "7", "8", "9", "10"],
["11", "12", "13", "14", "15", "16", "17"],
["18", "19", "20", "21", "22", "23", "24"],
["25", "26", "27", "28", "", "", ""],
];
export default function Home() {
const pathname = usePathname();
const navLinkClass = (href: string) =>
`flex items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-50 ${
pathname === href ? "bg-sky-50 text-sky-700 ring-1 ring-sky-100" : "text-gray-700"
}`;
const navIconClass = (href: string) => (pathname === href ? "text-sky-700" : "text-gray-400");
return (
<div className="flex min-h-screen items-center justify-center bg-zinc-50 font-sans dark:bg-black">
<main className="flex min-h-screen w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
<Image
className="dark:invert"
src="/next.svg"
alt="Next.js logo"
width={100}
height={20}
priority
/>
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
To get started, edit the page.tsx file.
</h1>
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
Looking for a starting point or more instructions? Head over to{" "}
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Templates
</a>{" "}
or the{" "}
<a
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Learning
</a>{" "}
center.
</p>
</div>
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
<a
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className="dark:invert"
src="/vercel.svg"
alt="Vercel logomark"
width={16}
height={16}
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<header className="sticky top-0 z-30 border-b border-slate-100 bg-white/90 backdrop-blur">
<div className="mx-auto flex h-14 max-w-6xl items-center gap-4 px-4 sm:px-8">
<div className="flex items-center gap-2">
<img
src="/logo.png"
alt="Логотип"
className="h-11 w-auto"
/>
Deploy Now
</a>
<a
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Documentation
</a>
</div>
<div className="hidden flex-1 items-center justify-center md:flex">
<div className="relative w-full max-w-xl">
<Search size={16} className="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400" />
<input
type="text"
className="w-full rounded-full border border-gray-200 bg-gray-50 py-2.5 pl-11 pr-4 text-sm text-gray-800 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="Поиск"
/>
</div>
</div>
<div className="ml-auto flex items-center gap-1 sm:gap-2">
<button className="flex h-10 w-10 items-center justify-center rounded-full hover:bg-slate-100">
<Bell size={18} className="text-gray-600" />
</button>
<div className="ml-1 flex h-10 w-10 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">
КМ
</div>
</div>
</div>
</main>
</header>
<div className="mx-auto flex min-h-screen max-w-6xl gap-6 px-4 py-8 sm:px-8">
<aside className="hidden w-64 flex-shrink-0 lg:block">
<div className="sticky top-8 space-y-4">
<div className="rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="mb-4 flex items-center gap-3">
<div className="flex h-11 w-11 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">
КМ
</div>
<div>
<p className="text-sm font-semibold text-gray-900">Константин Макаев</p>
<p className="text-xs text-gray-500">Онлайн</p>
</div>
</div>
<div className="space-y-2 text-sm text-gray-700">
<Link href="/" className={navLinkClass("/")}>
<HomeIcon size={18} className={pathname === "/" ? "text-sky-700" : "text-sky-600"} />
Лента
</Link>
<Link href="/messages" className={navLinkClass("/messages")}>
<MessageSquare size={18} className={navIconClass("/messages")} />
Сообщения
</Link>
<Link href="/employees" className={navLinkClass("/employees")}>
<Users size={18} className={navIconClass("/employees")} />
Сотрудники
</Link>
<Link href="/departments" className={navLinkClass("/departments")}>
<Building2 size={18} className={navIconClass("/departments")} />
Отделы
</Link>
<Link href="/requests" className={navLinkClass("/requests")}>
<FileSignature size={18} className={navIconClass("/requests")} />
Заявления
</Link>
<Link href="/documents" className={navLinkClass("/documents")}>
<FileText size={18} className={navIconClass("/documents")} />
Документы
</Link>
<Link href="/finances" className={navLinkClass("/finances")}>
<Wallet size={18} className={navIconClass("/finances")} />
Финансы
</Link>
</div>
</div>
</div>
</aside>
<main className="flex-1 space-y-6">
<div className="flex flex-col gap-3 rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="flex items-center gap-3">
<div className="flex h-11 w-13 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">
КМ
</div>
<div className="relative w-full">
<Search size={16} className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
<input
type="text"
className="w-full rounded-full border border-gray-200 bg-gray-50 py-2.5 pl-10 pr-4 text-sm text-gray-800 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="Поиск по ленте"
/>
</div>
</div>
<div className="flex flex-wrap gap-2 text-xs text-sky-700">
<span className="rounded-full bg-sky-50 px-3 py-1">Статья</span>
<span className="rounded-full bg-sky-50 px-3 py-1">Фото</span>
<span className="rounded-full bg-sky-50 px-3 py-1">Ссылка</span>
<span className="rounded-full bg-sky-50 px-3 py-1">Опрос</span>
<span className="rounded-full bg-sky-50 px-3 py-1">Событие</span>
</div>
</div>
<div className="space-y-4">
{feedItems.map((item) => (
<article
key={item.id}
className="rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100"
>
<header className="mb-3 flex items-start justify-between">
<div className="flex items-center gap-3">
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-sky-400 text-sm font-semibold text-white">
{item.author[0]}
</div>
<div>
<p className="text-sm font-semibold text-gray-900">{item.author}</p>
<p className="text-xs text-gray-500">{item.time}</p>
</div>
</div>
</header>
<p className="text-sm leading-6 text-gray-800">{item.text}</p>
<div className="mt-3 flex flex-wrap gap-2 text-xs text-sky-700">
{item.tags.map((tag) => (
<span key={tag} className="rounded-full bg-sky-50 px-3 py-1">
{tag}
</span>
))}
</div>
<div className="mt-4 flex items-center gap-4 text-sm text-gray-600">
<button className="flex items-center gap-2 rounded-lg px-3 py-2 hover:bg-gray-50">
<Heart size={16} className="text-gray-400" /> {item.actions.likes}
</button>
<button className="flex items-center gap-2 rounded-lg px-3 py-2 hover:bg-gray-50">
<MessageSquare size={16} className="text-gray-400" /> {item.actions.comments}
</button>
<button className="flex items-center gap-2 rounded-lg px-3 py-2 hover:bg-gray-50">
<Star size={16} className="text-gray-400" /> {item.actions.saves}
</button>
</div>
</article>
))}
</div>
</main>
<aside className="hidden w-72 flex-shrink-0 space-y-4 lg:block">
<div className="sticky top-8 space-y-4">
<div className="rounded-2xl bg-white p-5 shadow-sm ring-1 ring-gray-100">
<div className="flex items-center justify-between text-sm font-semibold text-gray-900">
<span>Календарь</span>
<span className="text-xs font-normal text-gray-500">Февраль 2026</span>
</div>
<div className="mt-4 grid grid-cols-7 gap-1 text-center text-xs text-gray-500">
{weekdays.map((day) => (
<div key={day} className="py-1 font-medium">
{day}
</div>
))}
</div>
<div className="mt-1 grid grid-cols-7 gap-1 text-sm text-gray-800">
{calendarWeeks.map((week, wi) =>
week.map((day, di) => {
const isToday = day === "18";
return (
<div
key={`${wi}-${di}`}
className={`flex h-9 items-center justify-center rounded-full ${
day
? isToday
? "bg-sky-100 text-sky-800 font-semibold ring-1 ring-sky-200"
: "hover:bg-sky-50"
: ""
}`}
>
{day}
</div>
);
})
)}
</div>
</div>
</div>
</aside>
</div>
</div>
);
}

111
src/app/register/page.tsx Normal file
View File

@ -0,0 +1,111 @@
import Link from "next/link";
export default function Register() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 to-white text-gray-900">
<div className="mx-auto flex min-h-screen max-w-4xl flex-col justify-center px-6 py-12 sm:px-10">
<div className="mx-auto w-full max-w-xl rounded-2xl bg-white p-8 shadow-xl ring-1 ring-gray-100">
<h1 className="mb-2 text-3xl font-semibold tracking-tight text-gray-900 sm:text-4xl">
Регистрация
</h1>
<p className="mb-8 text-sm text-gray-600">
Создайте новый аккаунт, указав имя и контактные данные.
</p>
<form className="space-y-4">
<div className="grid gap-4 sm:grid-cols-2">
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="firstName">
Имя
</label>
<input
id="firstName"
name="firstName"
type="text"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="Иван"
/>
</div>
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="lastName">
Фамилия
</label>
<input
id="lastName"
name="lastName"
type="text"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="Иванов"
/>
</div>
</div>
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="login">
Телефон или почта
</label>
<input
id="login"
name="login"
type="text"
autoComplete="username"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="example@mail.com"
/>
</div>
<div className="grid gap-4 sm:grid-cols-2">
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="password">
Пароль
</label>
<input
id="password"
name="password"
type="password"
autoComplete="new-password"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="••••••••"
/>
</div>
<div>
<label className="mb-2 block text-sm font-medium text-gray-700" htmlFor="confirmPassword">
Повторите пароль
</label>
<input
id="confirmPassword"
name="confirmPassword"
type="password"
autoComplete="new-password"
className="w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 text-sm text-gray-900 transition focus:border-sky-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-sky-100"
placeholder="••••••••"
/>
</div>
</div>
<label className="flex items-center gap-3 text-sm text-gray-700">
<input
type="checkbox"
className="h-4 w-4 rounded border-gray-300 text-sky-600 focus:ring-sky-500"
/>
Я согласен с условиями использования
</label>
<button
type="submit"
className="flex w-full items-center justify-center rounded-lg bg-sky-400 px-4 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-sky-700 focus:outline-none focus:ring-2 focus:ring-sky-200"
>
Создать аккаунт
</button>
<Link
href="/login"
className="flex w-full items-center justify-center rounded-lg border border-gray-200 px-4 py-3 text-sm font-semibold text-sky-700 transition hover:border-sky-200 hover:bg-sky-50 focus:outline-none focus:ring-2 focus:ring-sky-100"
>
Уже есть аккаунт? Войти
</Link>
</form>
<p className="mt-6 text-center text-xs text-gray-500">
Регистрируясь, вы принимаете условия использования и подтверждаете ознакомление с политикой конфиденциальности.
</p>
</div>
</div>
</div>
);
}

10
src/app/requests/page.tsx Normal file
View File

@ -0,0 +1,10 @@
export default function RequestsPage() {
return (
<div className="min-h-screen bg-gradient-to-b from-sky-50 via-white to-white text-gray-900">
<div className="mx-auto max-w-4xl px-4 py-10 sm:px-8">
<h1 className="text-2xl font-bold text-gray-900">Заявления</h1>
<p className="mt-2 text-sm text-gray-600">Раздел в разработке. Здесь появятся заявки и согласования.</p>
</div>
</div>
);
}