Mila-Zagrevskaya 5 jaren geleden
commit
e228e82551
80 gewijzigde bestanden met toevoegingen van 27072 en 0 verwijderingen
  1. 23 0
      .gitignore
  2. 16 0
      .idea/inspectionProfiles/Project_Default.xml
  3. 6 0
      .idea/misc.xml
  4. 8 0
      .idea/modules.xml
  5. 12 0
      .idea/our-app.iml
  6. 6 0
      .idea/vcs.xml
  7. 456 0
      .idea/workspace.xml
  8. 68 0
      README.md
  9. 632 0
      db.json
  10. BIN
      logo/ArtDentalStudio_Logo.png
  11. BIN
      logo/Royal Dental Studio.png
  12. BIN
      logo/Royal Dental-Logo.png
  13. BIN
      logo/ads-logo-2x.png
  14. BIN
      logo/favicon1.png
  15. BIN
      logo/logo.psd
  16. BIN
      logo/logo1.png
  17. BIN
      logo/logo2.png
  18. BIN
      logo/logo_normal.png
  19. BIN
      logo/logo_retina.png
  20. BIN
      logo/logotip-royal-dental-studio-stomatologicheskaya-klinika.png
  21. BIN
      logo/royallogo.png
  22. BIN
      logo/smiles-dental-art.png
  23. 13712 0
      package-lock.json
  24. 40 0
      package.json
  25. BIN
      public/images/doctors/alison.jpg
  26. BIN
      public/images/doctors/ericforman.jpg
  27. BIN
      public/images/doctors/gregoryhaus.jpg
  28. BIN
      public/images/doctors/kris_taub.jpg
  29. BIN
      public/images/doctors/lisa.jpg
  30. BIN
      public/images/doctors/lorenskatner.jpg
  31. BIN
      public/images/doctors/robert.jpg
  32. BIN
      public/images/favicon.png
  33. BIN
      public/images/fon1.jpg
  34. BIN
      public/images/fon2.jpg
  35. BIN
      public/images/fon4.jpg
  36. BIN
      public/images/fon6.jpg
  37. BIN
      public/images/fon7.jpg
  38. BIN
      public/images/fon8.jpg
  39. BIN
      public/images/fon9.jpg
  40. BIN
      public/images/loader.gif
  41. BIN
      public/images/logo.png
  42. BIN
      public/images/medical.jpeg
  43. 43 0
      public/index.html
  44. 15 0
      public/manifest.json
  45. 83 0
      src/App.js
  46. BIN
      src/assets/images/bg.jpg
  47. BIN
      src/assets/images/fon1.jpg
  48. BIN
      src/assets/images/fon2.jpg
  49. BIN
      src/assets/images/fon6.jpg
  50. BIN
      src/assets/images/fon8.jpg
  51. BIN
      src/assets/images/logo.png
  52. 93 0
      src/components/Appointment.js
  53. 54 0
      src/components/Calendar.js
  54. 11 0
      src/components/Footer.js
  55. 18 0
      src/components/Service.js
  56. 5 0
      src/components/buttons/button.js
  57. 19 0
      src/components/header/index.js
  58. 26 0
      src/components/header/navigation.js
  59. 68 0
      src/components/main/Main.js
  60. 57 0
      src/components/main/aboutUs.js
  61. 56 0
      src/components/main/myMap.js
  62. 269 0
      src/components/main/reviews.js
  63. 32 0
      src/components/main/team.js
  64. 39 0
      src/components/specialists/doctors.js
  65. 23 0
      src/db.json
  66. 25 0
      src/index.js
  67. 135 0
      src/serviceWorker.js
  68. 6 0
      src/store.js
  69. 38 0
      src/store/app/actionTypes.js
  70. 131 0
      src/store/app/actions.js
  71. 128 0
      src/store/app/reducers.js
  72. 9 0
      src/store/reducers.js
  73. 33 0
      src/style/App.css
  74. 373 0
      src/style/all.scss
  75. 13 0
      src/style/index.css
  76. 11 0
      src/style/mod.module.css
  77. 356 0
      src/style/normalize.css
  78. 100 0
      src/style/style.css
  79. 416 0
      team-app-28f4a-export.json
  80. 9408 0
      yarn.lock

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*

+ 16 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,16 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="myValues">
+        <value>
+          <list size="1">
+            <item index="0" class="java.lang.String" itemvalue="cols" />
+          </list>
+        </value>
+      </option>
+      <option name="myCustomValuesEnabled" value="true" />
+    </inspection_tool>
+  </profile>
+</component>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="JSX" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/our-app.iml" filepath="$PROJECT_DIR$/.idea/our-app.iml" />
+    </modules>
+  </component>
+</project>

+ 12 - 0
.idea/our-app.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 456 - 0
.idea/workspace.xml

@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="BookmarkManager">
+    <bookmark url="file://$PROJECT_DIR$/../../my-app/src/App.js" description="&#10;export default connect (mapStateToProps,mapDispat..." line="81" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="a8a32a88-c432-4104-a927-0d3d1c1c21be" name="Default Changelist" comment="">
+      <change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/public/favicon.ico" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/App.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/App.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/App.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/App.test.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/index.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/index.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/logo.svg" beforeDir="false" />
+    </list>
+    <ignored path="$PROJECT_DIR$/.tmp/" />
+    <ignored path="$PROJECT_DIR$/temp/" />
+    <ignored path="$PROJECT_DIR$/tmp/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf>
+      <file pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/App.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="612">
+              <caret line="36" column="1" lean-forward="true" selection-start-line="36" selection-start-column="1" selection-end-line="36" selection-end-column="1" />
+              <folding>
+                <element signature="e#0#26#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/components/Appointment.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="1156">
+              <caret line="68" column="27" lean-forward="true" selection-start-line="68" selection-start-column="27" selection-end-line="68" selection-end-column="27" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/components/Main.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="629">
+              <caret line="37" column="1" lean-forward="true" selection-start-line="37" selection-start-column="1" selection-end-line="37" selection-end-column="1" />
+              <folding>
+                <element signature="e#0#26#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>week.indexOf(week.find(el =&gt; el === 'чт'))</find>
+    </findStrings>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/src/index.css" />
+        <option value="$PROJECT_DIR$/src/App.css" />
+        <option value="$PROJECT_DIR$/src/components/Calendar.js" />
+        <option value="$PROJECT_DIR$/src/components/Footer.js" />
+        <option value="$PROJECT_DIR$/src/store.js" />
+        <option value="$PROJECT_DIR$/src/index.js" />
+        <option value="$PROJECT_DIR$/src/components/Header.js" />
+        <option value="$PROJECT_DIR$/src/store/reducers.js" />
+        <option value="$PROJECT_DIR$/../../db.json" />
+        <option value="$PROJECT_DIR$/src/store/app/actions.js" />
+        <option value="$PROJECT_DIR$/src/store/app/reducers.js" />
+        <option value="$PROJECT_DIR$/src/components/Appoitnment.js" />
+        <option value="$PROJECT_DIR$/src/components/Service.js" />
+        <option value="$PROJECT_DIR$/src/db.json" />
+        <option value="$PROJECT_DIR$/src/App.js" />
+        <option value="$PROJECT_DIR$/src/components/Appointment.js" />
+        <option value="$PROJECT_DIR$/src/components/Main.js" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectConfigurationFiles">
+    <option name="files">
+      <list>
+        <option value="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" />
+        <option value="$PROJECT_DIR$/.idea/our-app.iml" />
+        <option value="$PROJECT_DIR$/.idea/vcs.xml" />
+        <option value="$PROJECT_DIR$/.idea/misc.xml" />
+        <option value="$PROJECT_DIR$/.idea/modules.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="297" />
+    <option name="y" value="30" />
+    <option name="width" value="1175" />
+    <option name="height" value="1047" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane" />
+      <pane id="Scope">
+        <subPane subId="Scope 'Changed Files'; set:Changed Files; ALL; class com.intellij.packageDependencies.ChangeListScope">
+          <expand>
+            <path>
+              <item name="our-app" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
+              <item name="C:\React\GroupProject\our-app" type="442cc68d:ScopeViewTreeModel$RootNode" />
+            </path>
+            <path>
+              <item name="our-app" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
+              <item name="C:\React\GroupProject\our-app" type="442cc68d:ScopeViewTreeModel$RootNode" />
+              <item name="src" type="9f88c78c:ScopeViewTreeModel$FileNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../my-app/src/App.js" />
+    <property name="node.js.detected.package.eslint" value="true" />
+    <property name="node.js.path.for.package.eslint" value="project" />
+    <property name="node.js.selected.package.eslint" value="(autodetect)" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="nodejs_package_manager_path" value="npm" />
+    <property name="run.code.analysis.last.selected.profile" value="pProject Default" />
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager">
+    <configuration name="start" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
+      <package-json value="$PROJECT_DIR$/package.json" />
+      <command value="run" />
+      <scripts>
+        <script value="start" />
+      </scripts>
+      <node-interpreter value="project" />
+      <envs />
+      <method v="2" />
+    </configuration>
+    <recent_temporary>
+      <list>
+        <item itemvalue="npm.start" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="a8a32a88-c432-4104-a927-0d3d1c1c21be" name="Default Changelist" comment="" />
+      <created>1562445740358</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1562445740358</updated>
+      <workItem from="1562445741612" duration="29973000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="29973000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="297" y="30" width="1175" height="1047" extended-state="0" />
+    <layout>
+      <window_info id="npm" sideWeight="0.227446" side_tool="true" weight="0.08392435" />
+      <window_info id="Favorites" side_tool="true" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.772554" visible="true" weight="0.18733509" />
+      <window_info id="Structure" order="1" sideWeight="0.5005417" side_tool="true" weight="0.08392435" />
+      <window_info anchor="bottom" id="Docker" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Version Control" />
+      <window_info anchor="bottom" id="Terminal" weight="0.094257854" />
+      <window_info anchor="bottom" id="Event Log" side_tool="true" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" weight="0.32936078" />
+      <window_info anchor="bottom" id="Run" order="2" weight="0.14734562" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+    </layout>
+    <layout-to-restore>
+      <window_info id="npm" order="0" sideWeight="0.227446" side_tool="true" visible="true" weight="0.08392435" />
+      <window_info id="Favorites" order="1" side_tool="true" />
+      <window_info active="true" content_ui="combo" id="Project" order="2" sideWeight="0.772554" visible="true" weight="0.08392435" />
+      <window_info id="Structure" order="3" sideWeight="0.5005417" side_tool="true" weight="0.08392435" />
+      <window_info anchor="bottom" id="Docker" order="0" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Terminal" order="1" weight="0.094257854" />
+      <window_info anchor="bottom" id="Event Log" order="2" side_tool="true" />
+      <window_info anchor="bottom" id="Version Control" order="3" />
+      <window_info anchor="bottom" id="Message" order="4" />
+      <window_info anchor="bottom" id="Find" order="5" weight="0.32936078" />
+      <window_info anchor="bottom" id="Run" order="6" visible="true" weight="0.14734562" />
+      <window_info anchor="bottom" id="Debug" order="7" weight="0.4" />
+      <window_info anchor="bottom" id="Cvs" order="8" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="9" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="10" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+    </layout-to-restore>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/index.css">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="221">
+          <caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/App.test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/index.html">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/manifest.json">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Calendar.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="136">
+          <caret line="8" column="187" selection-start-line="8" selection-start-column="187" selection-end-line="8" selection-end-column="187" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/components/Auth-Reg/Auth-Reg.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-51">
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/store.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="85">
+          <caret line="5" column="70" selection-end-line="5" selection-end-column="70" />
+          <folding>
+            <element signature="e#0#53#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/index.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="306">
+          <caret line="18" lean-forward="true" selection-end-line="20" />
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/package.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="187">
+          <caret line="11" column="27" lean-forward="true" selection-start-line="11" selection-start-column="27" selection-end-line="11" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/App.css">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="187">
+          <caret line="11" column="32" lean-forward="true" selection-start-line="11" selection-start-column="32" selection-end-line="11" selection-end-column="32" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Footer.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="170">
+          <caret line="10" column="22" lean-forward="true" selection-start-line="10" selection-start-column="22" selection-end-line="10" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/store/reducers.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="85">
+          <caret line="5" selection-start-line="5" selection-end-line="5" selection-end-column="42" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/store/auth/actions.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="51">
+          <caret line="24" selection-start-line="24" selection-end-line="24" selection-end-column="54" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../db.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="297">
+          <caret line="99" column="23" lean-forward="true" selection-start-line="99" selection-start-column="23" selection-end-line="99" selection-end-column="23" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/App.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="17">
+          <caret line="1" selection-start-line="1" selection-end-line="1" selection-end-column="35" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../my-app/src/store/auth/reducers.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="459">
+          <caret line="296" column="9" lean-forward="true" selection-start-line="278" selection-start-column="8" selection-end-line="296" selection-end-column="9" />
+          <folding>
+            <element signature="e#0#354#0" expanded="true" />
+            <element signature="e#379#798#0" />
+            <element signature="e#823#2144#0" />
+            <element signature="e#2176#3416#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/store.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="85">
+          <caret line="5" column="70" lean-forward="true" selection-start-line="5" selection-start-column="70" selection-end-line="5" selection-end-column="70" />
+          <folding>
+            <element signature="e#0#53#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/store/reducers.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="85">
+          <caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
+          <folding>
+            <element signature="e#0#38#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/index.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="340">
+          <caret line="20" lean-forward="true" selection-start-line="20" selection-end-line="20" />
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/db.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="153">
+          <caret line="9" column="15" selection-start-line="9" selection-start-column="7" selection-end-line="9" selection-end-column="15" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/store/app/reducers.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="306">
+          <caret line="21" column="24" lean-forward="true" selection-start-line="21" selection-start-column="24" selection-end-line="21" selection-end-column="24" />
+          <folding>
+            <element signature="e#0#115#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/store/app/actions.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="136">
+          <caret line="8" column="43" lean-forward="true" selection-start-line="8" selection-start-column="43" selection-end-line="8" selection-end-column="43" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Header.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="9" selection-start-column="9" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Service.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="17">
+          <caret line="1" selection-start-line="1" selection-end-line="1" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Main.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="629">
+          <caret line="37" column="1" lean-forward="true" selection-start-line="37" selection-start-column="1" selection-end-line="37" selection-end-column="1" />
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/components/Appointment.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1156">
+          <caret line="68" column="27" lean-forward="true" selection-start-line="68" selection-start-column="27" selection-end-line="68" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/App.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="612">
+          <caret line="36" column="1" lean-forward="true" selection-start-line="36" selection-start-column="1" selection-end-line="36" selection-end-column="1" />
+          <folding>
+            <element signature="e#0#26#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>

+ 68 - 0
README.md

@@ -0,0 +1,68 @@
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `npm start`
+
+Runs the app in the development mode.<br>
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.<br>
+You will also see any lint errors in the console.
+
+### `npm test`
+
+Launches the test runner in the interactive watch mode.<br>
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `npm run build`
+
+Builds the app for production to the `build` folder.<br>
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.<br>
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `npm run eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
+
+If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
+
+You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
+
+### Code Splitting
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
+
+### Analyzing the Bundle Size
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
+
+### Making a Progressive Web App
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
+
+### Advanced Configuration
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
+
+### Deployment
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
+
+### `npm run build` fails to minify
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify

+ 632 - 0
db.json

@@ -0,0 +1,632 @@
+
+{
+  "doctors": [
+          {
+              "name": "Грегори Хаус",
+              "photo": "./images/doctors/gregoryhaus.jpg",
+              "experience": 30,
+              "rank": "Стоматолог-хирург",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 1
+          },
+          {
+              "name": "Лиза Кадди",
+              "photo": "./images/doctors/lisa.jpg",
+              "experience": 15,
+              "rank": "Стоматолог-ортодонт",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 2
+          },
+          {
+              "name": "Эллисон Кэмерон",
+              "photo": "./images/doctors/alison.jpg",
+              "experience": 6,
+              "rank": "Стоматолог-терапевт",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 3
+          },
+          {
+              "name": "Лоренс Катнер",
+              "photo": "./images/doctors/lorenskatner.jpg",
+              "experience": 4,
+              "rank": "Стоматолог-терапевт",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 4
+          },
+          {
+              "name": "Эрик Форман",
+              "photo": "./images/doctors/ericforman.jpg",
+              "experience": 10,
+              "rank": "Стоматолог-терапевт",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 5
+          },
+          {
+              "name": "Крис Тауб",
+              "photo":  "./images/doctors/kris_taub.jpg",
+              "experience": 20,
+              "rank": "Стоматолог-терапевт",
+              "speciality": ["service1","service2","service3","service4","service5"],
+              "schedule": {
+                  "08": {
+                    "09": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "10": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "11": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "12": {
+                      "08:00": true,
+                      "09:00": true,
+                      "10:00": true,
+                      "11:00": true,
+                      "12:00": true,
+                      "13:00": true,
+                      "14:00": true,
+                      "15:00": true,
+                      "16:00": true,
+                      "17:00": true
+                    },
+                    "13": false,
+                    "14": false
+                  }
+                },
+              "skillsDescription": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+              "id": 6
+          }
+],
+
+"services": [
+  {
+    "description": "Первичное эндодонтическое лечение зуба",
+    "duration": 1,
+    "name": "Эндодонтическое лечение с помощью микроскопа",
+    "price": 3560
+  },
+  {
+    "description": "Удаление штифта из корневого канала",
+    "duration": 1,
+    "name":  "Эндодонтическое лечение с помощью микроскопа",
+    "price": 596
+  },
+  {
+    "description": "Удаление чужеродного инструмента из корневого канала",
+    "duration": 2,
+    "name":  "Эндодонтическое лечение с помощью микроскопа",
+    "price": 1490
+  },
+  {
+    "description": "Повторное эндодонтическое лечение зуба",
+    "duration": 2,
+    "name":  "Эндодонтическое лечение с помощью микроскопа",
+    "price": 3960
+  },
+  {
+    "description": "Поиск и прохождение 1 корневого канала",
+    "duration": "1",
+    "name":  "Эндодонтическое лечение с помощью микроскопа",
+    "price": 1600
+  },
+
+
+  {
+    "description": "Комплексная чистка зубов",
+    "duration": 2,
+    "name": "Лечение пародонтита",
+    "price": 945
+  },
+  {
+    "description": "Вектор-терапия (полный курс)",
+    "duration": 3,
+    "name": "Лечение пародонтита",
+    "price": 3300
+  },
+  {
+    "description": "Плазмолифтинг",
+    "duration": 1,
+    "name": "Лечение пародонтита",
+    "price": 1970
+  },
+  {
+    "description": "Закрытый кюретаж зубов",
+    "duration": 2,
+    "name": "Лечение пародонтита",
+    "price": 396
+  },
+
+
+  {
+    "description": "Коронка пластмассовая",
+    "duration": 1,
+    "name": "Протезирование",
+    "price": 590
+  },
+  {
+    "description": "Коронка металлокерамическая",
+    "duration": 1,
+    "name": "Протезирование",
+    "price":  4960
+  },
+  {
+    "description": "Коронка керамическая, безметалловая",
+    "duration": 2,
+    "name": "Протезирование",
+    "price": 6650
+  },
+  {
+    "description": "Винир керамический",
+    "duration": 2,
+    "name": "Протезирование",
+    "price": 7400
+  },
+  {
+    "description": "Люминиры",
+    "duration": 2,
+    "name": "Протезирование",
+    "price": 15500
+  },
+  {
+    "description": "Изготовление протеза",
+    "duration": 1,
+    "name": "Протезирование",
+    "price": 6750
+  },
+  {
+    "description": "Бюгельный протез",
+    "duration": 3,
+    "name": "Протезирование",
+    "price": 12600
+  },
+
+
+  {
+    "description": "Брекет-система (1 челюсть)",
+    "duration": 1,
+    "name": "Ортодонтия",
+    "price": 11800
+  },
+  {
+    "description": "Пластинка ортодонтическая на одну челюсть",
+    "duration": 1,
+    "name": "Ортодонтия",
+    "price": 4200
+  },
+  {
+    "description": "Елайнер-капа - 1 челюсть (10 кап)",
+    "duration": 2,
+    "name": "Ортодонтия",
+    "price": 19800
+  },
+
+
+  {
+    "description": "Удаление зуба",
+    "duration": 1,
+    "name": "Хирургия",
+    "price": 490
+  },
+  {
+    "description": "Удаление кисты",
+    "duration": 2,
+    "name": "Хирургия",
+    "price": 2800
+  },
+  {
+    "description": "Закрытие рецессии десны",
+    "duration": 2,
+    "name": "Хирургия",
+    "price": 2350
+  },
+
+
+  {
+    "description": "Пластика десны (в области 1-3 зубов)",
+    "duration": 2,
+    "name": "Хирургическая пародонтология",
+    "price": 970
+  },
+  {
+    "description": "Подрезание уздечки с помощью лазера",
+    "duration": 1,
+    "name": "Хирургическая пародонтология",
+    "price": 1700
+  },
+  {
+    "description": "Открытый кюретаж в области 1 зуба",
+    "duration": 2,
+    "name": "Хирургическая пародонтология",
+    "price": 980
+  },
+
+
+  {
+    "description": "Установка импланта",
+    "duration": 2,
+    "name": "Имплантация",
+    "price": 7656
+  },
+  {
+    "description": "Синус-лифтинг",
+    "duration": 2,
+    "name": "Имплантация",
+    "price": 3500
+  },
+
+
+  {
+    "description": "Консультация (осмотр, рекомендации) с составлением плана лчения",
+    "duration": 2,
+    "name": "Детская стоматология",
+    "price": 396
+  },
+  {
+    "description": "Психологическая адаптация (от 30 мн)",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 190
+  },
+  {
+    "description": "Цифровая рентгенография (в обл. 1-3 зубов)",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 145
+  },
+  {
+    "description": "Оказание помощи при острой боли",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 670
+  },
+  {
+    "description": "Медикаментозная обработка корневого канала",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 322
+  },
+  {
+    "description": "Пломбировка одного корневого канала молочного, постоянного зуба",
+    "duration": 2,
+    "name": "Детская стоматология",
+    "price": 320
+  },
+  {
+    "description": "Временная пломба",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 230
+  },
+  {
+    "description": "Пломба",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 965
+  },
+  {
+    "description": "Гигиеническая чистка ультразвуком (1 челюсть)",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 520
+  },
+  {
+    "description": "Удаление зуба",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 345
+  },
+  {
+    "description": "Общая анестезия – седация (медикаментозный сон ) (1 час)",
+    "duration": 1,
+    "name": "Детская стоматология",
+    "price": 1950
+  }
+]
+
+
+
+}
+   

BIN
logo/ArtDentalStudio_Logo.png


BIN
logo/Royal Dental Studio.png


BIN
logo/Royal Dental-Logo.png


BIN
logo/ads-logo-2x.png


BIN
logo/favicon1.png


BIN
logo/logo.psd


BIN
logo/logo1.png


BIN
logo/logo2.png


BIN
logo/logo_normal.png


BIN
logo/logo_retina.png


BIN
logo/logotip-royal-dental-studio-stomatologicheskaya-klinika.png


BIN
logo/royallogo.png


BIN
logo/smiles-dental-art.png


File diff suppressed because it is too large
+ 13712 - 0
package-lock.json


+ 40 - 0
package.json

@@ -0,0 +1,40 @@
+{
+  "name": "fe12",
+  "version": "0.1.0",
+  "private": true,
+  "dependencies": {
+    "axios": "^0.19.0",
+    "gsap": "^2.1.3",
+    "history": "^4.9.0",
+    "node-sass": "^4.12.0",
+    "react": "^16.8.6",
+    "react-dom": "^16.8.6",
+    "react-google-maps": "^9.4.5",
+    "react-redux": "^7.1.0",
+    "react-router-dom": "^5.0.0",
+    "react-scripts": "3.0.1",
+    "redux": "^4.0.3",
+    "redux-thunk": "^2.3.0"
+  },
+  "scripts": {
+    "start": "react-scripts start",
+    "build": "react-scripts build",
+    "test": "react-scripts test",
+    "eject": "react-scripts eject"
+  },
+  "eslintConfig": {
+    "extends": "react-app"
+  },
+  "browserslist": {
+    "production": [
+      ">0.2%",
+      "not dead",
+      "not op_mini all"
+    ],
+    "development": [
+      "last 1 chrome version",
+      "last 1 firefox version",
+      "last 1 safari version"
+    ]
+  }
+}

BIN
public/images/doctors/alison.jpg


BIN
public/images/doctors/ericforman.jpg


BIN
public/images/doctors/gregoryhaus.jpg


BIN
public/images/doctors/kris_taub.jpg


BIN
public/images/doctors/lisa.jpg


BIN
public/images/doctors/lorenskatner.jpg


BIN
public/images/doctors/robert.jpg


BIN
public/images/favicon.png


BIN
public/images/fon1.jpg


BIN
public/images/fon2.jpg


BIN
public/images/fon4.jpg


BIN
public/images/fon6.jpg


BIN
public/images/fon7.jpg


BIN
public/images/fon8.jpg


BIN
public/images/fon9.jpg


BIN
public/images/loader.gif


BIN
public/images/logo.png


BIN
public/images/medical.jpeg


+ 43 - 0
public/index.html

@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="ru">
+  <head>
+    <meta charset="utf-8" />
+    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+    <meta  name="viewport"   content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no" />
+   
+    <meta name="theme-color" content="#000000" />
+    <!--
+      manifest.json provides metadata used when your web app is installed on a
+      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
+    -->
+    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
+    <link rel="shortcut icon" href="./images/favicon.png" />
+    <link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i&display=swap" rel="stylesheet">
+    <link href="https://fonts.googleapis.com/css?family=Montserrat:400,400i,700&display=swap" rel="stylesheet">
+    <!--
+      Notice the use of %PUBLIC_URL% in the tags above.
+      It will be replaced with the URL of the `public` folder during the build.
+      Only files inside the `public` folder can be referenced from the HTML.
+
+      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
+      work correctly both with client-side routing and a non-root public URL.
+      Learn how to configure a non-root public URL by running `npm run build`.
+    -->
+    <title>Art Dental studio</title>
+  </head>
+  <body>
+    <noscript>You need to enable JavaScript to run this app.</noscript>
+    <div id="root"></div>
+    <!--
+      This HTML file is a template.
+      If you open it directly in the browser, you will see an empty page.
+
+      You can add webfonts, meta tags, or analytics to this file.
+      The build step will place the bundled scripts into the <body> tag.
+
+      To begin the development, run `npm start` or `yarn start`.
+      To create a production bundle, use `npm run build` or `yarn build`.
+    -->
+  </body>
+</html>

+ 15 - 0
public/manifest.json

@@ -0,0 +1,15 @@
+{
+  "short_name": "React App",
+  "name": "Create React App Sample",
+  "icons": [
+    {
+      "src": "favicon.ico",
+      "sizes": "64x64 32x32 24x24 16x16",
+      "type": "image/x-icon"
+    }
+  ],
+  "start_url": ".",
+  "display": "standalone",
+  "theme_color": "#000000",
+  "background_color": "#ffffff"
+}

+ 83 - 0
src/App.js

@@ -0,0 +1,83 @@
+import React from 'react';
+import {connect} from 'react-redux'
+import {Switch, Route} from "react-router-dom";
+// import axios from "axios";
+
+import {getDoctors,getServices, postServices} from "./store/app/actions";
+
+import Header from "./components/header/index"
+import Footer from "./components/Footer";
+import Main from "./components/main/Main";
+import Doctors from "./components/specialists/doctors";
+import Service from "./components/Service";
+import Appointment from "./components/Appointment";
+
+
+export class App extends React.Component {
+
+    componentDidMount() {
+        this.props.getDoctors();
+        this.props.getServices( );
+        // this.props.postServices()
+     
+        // fetch("https://api-clinics.herokuapp.com/api/v1/doctors", {
+        //     method: "GET",
+        //     credentials: "include"
+        // })
+        //     .then(res => res.json())
+        //     .then(res => console.log (res))
+
+        fetch("https://api-clinics.herokuapp.com/api/v1/services", {
+            method: "GET",
+            credentials: "include"
+        })
+            .then(res => res.json())
+            .then(res => console.log (res))
+
+        // fetch ("https://api-clinics.herokuapp.com/api/v1/auth/login", { 
+        //     method : "POST",
+        //     credentials: "include",
+        //     headers: {
+        //         "Content-Type":   "aplication/json"
+        //     },
+        //     body: JSON.stringify ({
+        //         email: "test@test.com",
+        //         password: "qwerty"
+        //     })
+        // })
+        //     .then (res => res.json ())
+        //     .then (res => console.log (res))
+}
+
+
+    render() {
+
+        return (
+            <div className="App">
+                <Header/>
+                    <Switch>
+                        <Route exact path="/" component={Main} />
+                        <Route exact path="/doctors" render={() => <Doctors data={this.props.app.doctors} flag={'doctors'}/> } />
+                        <Route exact path="/services" render={() => <Doctors data={Array.from(Object.values(this.props.app.services))} flag={'services'}/>} />
+                        <Route exact path="/services/:service" render={(props) => <Service his={props} data={this.props.app.services}/>} />
+                        <Route  path="/appointment/:doctor" render={(props) => <Appointment his={props} dataDoctors={this.props.app.doctors} dataServices={this.props.app.services}/>} />
+                    </Switch>
+                <Footer/>
+            </div>
+        );
+    }
+}
+
+const mapStateToProps = state => {
+    return {
+        app:state.app,
+    }
+};
+
+const mapDispatchToProps = {
+    getDoctors,
+    getServices,
+    postServices
+};
+
+export default connect (mapStateToProps,mapDispatchToProps)(App)

BIN
src/assets/images/bg.jpg


BIN
src/assets/images/fon1.jpg


BIN
src/assets/images/fon2.jpg


BIN
src/assets/images/fon6.jpg


BIN
src/assets/images/fon8.jpg


BIN
src/assets/images/logo.png


+ 93 - 0
src/components/Appointment.js

@@ -0,0 +1,93 @@
+import React from 'react';
+
+
+export default class Appointment extends React.Component {
+    state={
+        date:{
+            year:0,
+            month:0,
+            day:0
+        },
+        spec:null,
+        time:null
+    };
+
+
+    changeDate =(e) => {
+        const date = e.target.value.split('-');
+        this.setState({
+            date:{
+                year:date[0],
+                month:date[1],
+                day:date[2]
+            }
+        })
+    };
+
+    chooseSpeciality = (e) => {
+        this.setState({spec:e.target.value})
+    }
+
+    chooseTime =(e) => {
+        this.setState({time:e.target.value})
+    }
+
+    render() {
+        let schedule
+        const {his,dataDoctors,dataServices} = this.props;
+        const path = his.match.params.doctor;
+        const doctor = dataDoctors.find(el => el.id === +path);
+        if(doctor){
+            schedule = doctor.schedule
+
+
+        }
+
+
+        // if (doctor){
+        //     schedule = doctor.schedule[`${this.state.date.month<10 ? '0'+this.state.date.month : this.state.date.month}`][`${this.state.date.day<10 ? '0'+this.state.date.day : this.state.date.day}`]
+        //     console.log(doctor.schedule[`${this.state.date.month<10 ? '0'+this.state.date.month : this.state.date.month}`][`${this.state.date.day<10 ? '0'+this.state.date.day : this.state.date.day}`])
+        // }
+        if (this.state.time){
+        console.log(this.state.time)
+        console.log(this.state.time.split(':'))
+        console.log(dataServices[this.state.spec].duration)
+            console.log(+this.state.time.split(':')[0] + dataServices[this.state.spec].duration)
+        }
+
+        return (
+            <>
+                {doctor && <div style={{display:'flex',flexDirection:'column',width:'400px'}}>
+                    <p>{doctor.photo}</p>
+                    <p>{doctor.name}</p>
+                    <p>{doctor.lastName}</p>
+                    <p>{doctor.skillsDescription}</p>
+                    <select onChange={this.chooseSpeciality} defaultValue='choose spec'>
+                        <option disabled >choose spec</option>
+                        {doctor.speciality.map(el=> (
+                            <option key={el}>{el}</option>
+                        ))}
+
+                    </select>
+                    {this.state.spec && <input type="date" onChange={this.changeDate}/>}
+                    {this.state.date.year !== 0 &&
+                    <div>
+                        {Object.values(schedule)[0][this.state.date.day] ?
+                            <div>
+                            <select onChange={this.chooseTime}>
+                                {Object.values(schedule)[0][this.state.date.day].map(el=> (
+                                    <option key={el}>{el}</option>
+                                ))}
+                                
+                            </select>
+                                <input type="time" readOnly placeholder="Time will be calculated" value={this.state.time ? +this.state.time.split(':')[0] + dataServices[this.state.spec].duration + ':00' : ''}/>
+                            </div>
+                            : <p>No work today</p>}
+                    </div>
+                    }
+            </div>}
+                </>
+        );
+    }
+}
+

+ 54 - 0
src/components/Calendar.js

@@ -0,0 +1,54 @@
+import React, {Component} from 'react';
+
+class Calendar extends Component {
+
+    componentDidMount() {
+
+    }
+    setDate = (e) => {
+        console.log(`${new Date().getFullYear()}-${new Date().getMonth() < 10 ? '0' + new Date().getMonth() : new Date().getMonth()}-${e.target.id < 10 ? '0' + e.target.id : e.target.id}`)
+        document.getElementById('inp_date').value=`${new Date().getFullYear()}-${new Date().getMonth() < 10 ? '0' + new Date().getMonth() : new Date().getMonth()}-${e.target.id < 10 ? '0' + e.target.id : e.target.id}`
+    }
+
+    render() {
+        const date = new Date();
+        const start = new Date(2019, 6, 1);
+        const month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+        const currentMonth = [];
+        const week = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс'];
+        for (let x = 1; x <= month[date.getMonth()]; x++) currentMonth.push(x);
+        const startOfMonth = week.indexOf(week.find(el => el === 'чт'));
+        console.log(date.getDate());
+
+        return (
+            <div>
+                <table cols={7}>
+                    <caption><button>{'<'}</button>{start.toLocaleString('ru', {month: 'short'})}<button>{'>'}</button></caption>
+                    <tbody>
+                    <tr>
+                        {week.map(el => (<th key={el}>{el}</th>))}
+                    </tr>
+                    <tr >
+                        {currentMonth.map(el=> (el >startOfMonth && el<=7) ? <td key={el} className='cal__td'><button id={el -  startOfMonth} onClick={this.setDate}>{el -  startOfMonth}</button></td> : el <=7 ? <td key={el}><button id={el} disabled>none</button></td> : null) }
+                    </tr>
+                    <tr >
+                        {currentMonth.map(el=> (el > 7-startOfMonth && el <= 14-startOfMonth)?(<td key={el} className='cal__td'><button id={el} onClick={this.setDate}>{el}</button></td>):null)}
+                    </tr>
+                    <tr >
+                        {currentMonth.map(el=> (el > 14-startOfMonth && el <= 21-startOfMonth)?(<td key={el} className='cal__td' ><button id={el} onClick={this.setDate}>{el}</button></td>):null)}
+                    </tr>
+                    <tr >
+                        {currentMonth.map(el=> (el > 21-startOfMonth && el <= 28-startOfMonth)?(<td key={el} className='cal__td'><button id={el}  onClick={this.setDate}>{el}</button></td>):null)}
+                    </tr>
+                    <tr >
+                        {currentMonth.map(el=> el > 28-startOfMonth?(<td key={el} className='cal__td'><button id={el} onClick={this.setDate}>{el}</button></td>):null)}
+                    </tr>
+                    </tbody>
+                </table>
+                <input type="date" id='inp_date'/>
+            </div>
+        );
+    }
+}
+
+export default Calendar

+ 11 - 0
src/components/Footer.js

@@ -0,0 +1,11 @@
+import React from 'react';
+
+const Footer = () => {
+    return (
+        <div>
+            <h1>Footer</h1>
+        </div>
+    );
+};
+
+export default Footer;

+ 18 - 0
src/components/Service.js

@@ -0,0 +1,18 @@
+import React from 'react';
+
+
+export default class Service extends React.Component {
+
+
+    render() {
+        const {his,data} = this.props;
+        const path = his.match.params.service;
+        return (
+            <div >
+                {data[path].name}
+                {data[path].description}
+                {data[path].price}
+            </div>
+        );
+    }
+}

+ 5 - 0
src/components/buttons/button.js

@@ -0,0 +1,5 @@
+import React from "react";
+
+
+export default ({ text, ...rest }) => 
+<button {...rest}>{text}</button>;

+ 19 - 0
src/components/header/index.js

@@ -0,0 +1,19 @@
+import React from "react";
+// import Scrollchor from 'react-scrollchor';
+import {Link}  from "react-router-dom"
+import logo from "../../assets/images/logo.png";
+import Navigation from "./navigation"
+
+
+
+export default () => (
+	<header className="header">
+		<div className="logo-box">
+				<Link to = "/">
+					<img src= {logo} className = "logo" alt="logo"/>
+				</Link>
+			</div>
+			<Navigation></Navigation>
+	</header>
+);
+

+ 26 - 0
src/components/header/navigation.js

@@ -0,0 +1,26 @@
+import React from "react";
+// import Scrollchor from 'react-scrollchor';
+import {Link} from 'react-router-dom'
+
+
+
+const liArr = [
+	{ path: "/", id: 1, text: "Главная" },
+	{ path: "/doctors",  id: 2,  text: "Специалисты"  },
+	{ path: "/services", id: 3,  text: "Услуги" },
+	{ path: "/reviews", id: 4, text: "Отзывы"  },
+	{ path: "/authorization", id: 5, text: "Войти" },
+];
+
+export default ( props ) => (
+    <nav className=" nav">
+		<ul className=" list">
+			{liArr.map(el => (
+				<li className="item" key={el.id}> 
+					<Link to={el.path}>{el.text}</Link>  
+				</li>
+			) ) }
+		</ul>
+	</nav>
+);
+

+ 68 - 0
src/components/main/Main.js

@@ -0,0 +1,68 @@
+import React from 'react';
+// import {Link} from 'react-router-dom';
+
+
+import {postDoctors, postServices} from "../../store/app/actions";
+
+import Button from "../buttons/button";
+import About from "./aboutUs";
+import Team from "./team";
+// import MyMap from "./myMap";
+import Reviews from "./reviews";
+
+import {connect} from 'react-redux'
+
+    
+export class Main extends React.Component {
+ render() {
+
+        return (
+            <main className = "main">
+                <div className="container">
+                    <div className="wrapper">
+                                <div className="title-box">
+                                    <img className = "logotype" src="./images/logo.png" alt=""/>
+                                    <h1>Стоматология для всей семьи</h1>
+                                    <Button className = "btn" text = "Записаться на приём" 
+                                        onClick = { ( ) => {  } } 
+                                        />
+                                </div>
+                        </div>
+                </div>
+                 <div className="wrapper">
+                    <About/>
+                 </div>
+                <div className=" case">
+                        <img className = "banner" src="./images/medical.jpeg" alt="medical"/>
+                        <div className="button-box">
+                            <Button className = "btn" text = "Записаться на приём" onClick = { ( ) => { } }/>
+                        </div>     
+                 </div>
+                 <div className="wrapper">
+                    <Team doctorsArr = {this.props.app.doctors}/>
+                 </div>
+                <div className="case">
+                  {/* <MyMap /> */}
+                </div>
+                <div className="wrapper">
+                    <Reviews services = {this.props.app.services} postServices = {this.props.postServices}/>
+                </div>
+            </main> 
+        )
+    }
+}
+
+    const mapStateToProps = state => {
+        return {
+            app:state.app
+        }
+    };
+    
+    const mapDispatchToProps = {
+        postDoctors,
+        postServices
+    };
+    
+    export default connect (mapStateToProps,mapDispatchToProps)(Main)
+
+

+ 57 - 0
src/components/main/aboutUs.js

@@ -0,0 +1,57 @@
+import React from 'react';
+
+
+export default class AboutSection extends React.Component {
+
+
+    render() {
+        return (
+            <>
+                <div className="wrapper">
+                    <div className="aboutsection">
+                        <h2>О клинике</h2>
+                        <p>Стоматологическая клиника «Art Dental studio» – это современное медучреждение, 
+                            которое оказывает полный спектр стоматологических услуг и использует при этом новейшее 
+                            оборудование ведущих мировых производителей. 
+                        </p>
+                        <p> Нашими постоянными пациентами являются не только взрослые, но и дети. 
+                            Специально для них у нас есть услуги серебрения зубов, удаления молочных зубов, 
+                            стеклоиономерное пломбирование и аппаратное ортодонтическое исправление прикуса
+                            (до 16 лет). Также в нашей клинике Вы можете получить консультацию профессионального 
+                            ортодонта и пародонтолога. Или решить любую проблему, связанную с зубами – наши врачи могут 
+                            поставить хоть фотополимерную пломбу, хоть установить имплант. Дабы Вы не испытывали страха и не 
+                            чувствовали боли, мы используем только эффективную высококачественную анестезию. У нас Вы 
+                            сможете сделать как профессиональную чистку зубов, так и украсить ваши зубки модными украшениями. Если зубной 
+                            ряд нуждается в отбеливании или реставрации, с ними мы тоже справимся без проблем. Стоматологи клиники
+                            «Art Dental studio» поставят коронку, подберут протез, микропротез, проведут шинирование, 
+                            пломбирование и сделают все, чтобы Вы гордились своей улыбкой. У Вас проблемы с прикусом или 
+                            неровные зубы? Обратитесь к нам и убедитесь, что всё реально исправить с помощью грамотно 
+                            подобранной брекет-системы. Вас гарантированно перестанет беспокоить даже чувствительность 
+                            зубов, если с ними поработает наш высококвалифицированный стоматолог.
+                        </p> 
+                        <p>  И это далеко еще не весь спектр наших стоматологических услуг. С полным списком, 
+                            а заодно и расценками, можно ознакомиться в разделе «Услуги». 
+                            Стоматологическая клиника «Art Dental studio» работает со всеми 
+                            страховыми компаниями. Мы любим и ценим наших пациентов, поэтому всегда настоятельно 
+                            рекомендуем им посещать стоматолога не реже двух раз в год. Профилактический осмотр очень 
+                            важен, так что зря многие им пренебрегают. Только так можно предупредить развитие заболеваний 
+                            пародонта и принять своевременные меры по устранению неприятных симптомов и дискомфорта в 
+                            ротовой полости.
+                        </p>
+                        <p>«Art Dental studio» работает на рынке стоматологических услуг не первый год, поэтому мы 
+                            применяем только новейшие технологии и находим индивидуальные решения для каждого 
+                            пациента. Благодаря всему этому Вам будет комфортно с нами сотрудничать. Улыбайтесь на 
+                            здоровье!
+                        </p>
+                    </div>
+                </div>
+            </>
+        )
+    }
+}
+
+
+
+
+
+

+ 56 - 0
src/components/main/myMap.js

@@ -0,0 +1,56 @@
+import React from "react"
+import { compose, withProps } from "recompose"
+import { withScriptjs, withGoogleMap, GoogleMap, Marker, InfoWindow } from "react-google-maps"
+// import InfoBox from "react-google-maps/lib/components/addons/InfoBox";
+
+// const { InfoBox } = require("react-google-maps/lib/components/addons/InfoBox");
+ const MyMapComponent = compose(
+  withProps({
+    googleMapURL: "https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places",
+    loadingElement: <div style={{ height: `100%` }} />,
+    containerElement: <div style={{ height: `500px` }} />,
+    mapElement: <div style={{ height: `100%` }} />,
+    mapTypeId: 'hybrid'
+  }),
+  withScriptjs,
+  withGoogleMap
+)((props) =>
+  <GoogleMap
+    defaultZoom={15}
+    defaultCenter={{ lat: 49.987462, lng: 36.2305745 }}
+    defaultType = {"hybrid"}
+  >
+    {props.isMarkerShown && <Marker position={{ lat: 49.987462, lng: 36.2305745 }} onClick={props.onMarkerClick} />}
+    
+  </GoogleMap>
+)
+
+export default class MyFancyComponent extends React.PureComponent {
+  state = {
+    isMarkerShown: false,
+  }
+
+  componentDidMount() {
+    this.delayedShowMarker()
+  }
+
+  delayedShowMarker = () => {
+    setTimeout(() => {
+      this.setState({ isMarkerShown: true })
+    }, 3000)
+  }
+
+  handleMarkerClick = () => {
+    this.setState({ isMarkerShown: false })
+    this.delayedShowMarker()
+  }
+
+  render() {
+    return (
+      <MyMapComponent
+        isMarkerShown={this.state.isMarkerShown}
+        onMarkerClick={this.handleMarkerClick}
+      />
+    )
+  }
+}

+ 269 - 0
src/components/main/reviews.js

@@ -0,0 +1,269 @@
+import React from 'react';
+// import {Link} from 'react-router-dom';
+import Button from "../buttons/button";
+// import { postServices} from "../../store/app/actions";
+
+
+const services =  [
+    {
+      description: "Первичное эндодонтическое лечение зуба",
+        duration: 1,
+     name: "Эндодонтическое лечение с помощью микроскопа",
+      price: 3560
+    },
+    {
+      description: "Удаление штифта из корневого канала",
+      duration: 1,
+     name:  "Эндодонтическое лечение с помощью микроскопа",
+      price: 596
+    },
+    {
+      description: "Удаление чужеродного инструмента из корневого канала",
+      duration: 2,
+     name:  "Эндодонтическое лечение с помощью микроскопа",
+      price: 1490
+    },
+    {
+      description: "Повторное эндодонтическое лечение зуба",
+      duration: 2,
+     name:  "Эндодонтическое лечение с помощью микроскопа",
+      price: 3960
+    },
+    {
+      description: "Поиск и прохождение 1 корневого канала",
+      duration: 1,
+     name:  "Эндодонтическое лечение с помощью микроскопа",
+      price: 1600
+    },
+  
+  
+    {
+      description: "Комплексная чистка зубов",
+      duration: 2,
+     name: "Лечение пародонтита",
+      price: 945
+    },
+    {
+      description: "Вектор-терапия (полный курс)",
+      duration: 3,
+     name: "Лечение пародонтита",
+      price: 3300
+    },
+    {
+      description: "Плазмолифтинг",
+      duration: 1,
+     name: "Лечение пародонтита",
+      price: 1970
+    },
+    {
+      description: "Закрытый кюретаж зубов",
+      duration: 2,
+     name: "Лечение пародонтита",
+      price: 396
+    },
+  
+  
+    {
+      description: "Коронка пластмассовая",
+      duration: 1,
+     name: "Протезирование",
+      price: 590
+    },
+    {
+      description: "Коронка металлокерамическая",
+      duration: 1,
+     name: "Протезирование",
+      price:  4960
+    },
+    {
+      description: "Коронка керамическая, безметалловая",
+      duration: 2,
+     name: "Протезирование",
+      price: 6650
+    },
+    {
+      description: "Винир керамический",
+      duration: 2,
+     name: "Протезирование",
+      price: 7400
+    },
+    {
+      description: "Люминиры",
+      duration: 2,
+     name: "Протезирование",
+      price: 15500
+    },
+    {
+      description: "Изготовление протеза",
+      duration: 1,
+     name: "Протезирование",
+      price: 6750
+    },
+    {
+      description: "Бюгельный протез",
+      duration: 3,
+     name: "Протезирование",
+      price: 12600
+    },
+  
+  
+    {
+      description: "Брекет-система (1 челюсть)",
+      duration: 1,
+     name: "Ортодонтия",
+      price: 11800
+    },
+    {
+      description: "Пластинка ортодонтическая на одну челюсть",
+      duration: 1,
+     name: "Ортодонтия",
+      price: 4200
+    },
+    {
+      description: "Елайнер-капа - 1 челюсть (10 кап)",
+      duration: 2,
+     name: "Ортодонтия",
+      price: 19800
+    },
+  
+  
+    {
+      description: "Удаление зуба",
+      duration: 1,
+     name: "Хирургия",
+      price: 490
+    },
+    {
+      description: "Удаление кисты",
+      duration: 2,
+     name: "Хирургия",
+      price: 2800
+    },
+    {
+      description: "Закрытие рецессии десны",
+      duration: 2,
+     name: "Хирургия",
+      price: 2350
+    },
+  
+  
+    {
+      description: "Пластика десны (в области 1-3 зубов)",
+      duration: 2,
+     name: "Хирургическая пародонтология",
+      price: 970
+    },
+    {
+      description: "Подрезание уздечки с помощью лазера",
+      duration: 1,
+     name: "Хирургическая пародонтология",
+      price: 1700
+    },
+    {
+      description: "Открытый кюретаж в области 1 зуба",
+      duration: 2,
+     name: "Хирургическая пародонтология",
+      price: 980
+    },
+  
+  
+    {
+      description: "Установка импланта",
+      duration: 2,
+     name: "Имплантация",
+      price: 7656
+    },
+    {
+      description: "Синус-лифтинг",
+      duration: 2,
+     name: "Имплантация",
+      price: 3500
+    },
+  
+  
+    {
+      description: "Консультация (осмотр, рекомендации) с составлением плана лчения",
+      duration: 2,
+     name: "Детская стоматология",
+      price: 396
+    },
+    {
+      description: "Психологическая адаптация (от 30 мн)",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 190
+    },
+    {
+      description: "Цифровая рентгенография (в обл. 1-3 зубов)",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 145
+    },
+    {
+      description: "Оказание помощи при острой боли",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 670
+    },
+    {
+      description: "Медикаментозная обработка корневого канала",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 322
+    },
+    {
+      description: "Пломбировка одного корневого канала молочного, постоянного зуба",
+      duration: 2,
+     name: "Детская стоматология",
+      price: 320
+    },
+    {
+      description: "Временная пломба",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 230
+    },
+    {
+      description: "Пломба",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 965
+    },
+    {
+      description: "Гигиеническая чистка ультразвуком (1 челюсть)",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 520
+    },
+    {
+      description: "Удаление зуба",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 345
+    },
+    {
+      description: "Общая анестезия – седация (медикаментозный сон ) (1 час)",
+      duration: 1,
+     name: "Детская стоматология",
+      price: 1950
+    }
+  ]
+  
+
+
+export default class Reviews extends React.Component {
+    render( ) {
+        const {postServices } = this.props
+        
+        return (
+            <>
+                <h2>Отзывы</h2>
+                <div className = "reviews-container">
+                    <Button className = "btn" text = "POST to servises" onClick = { ( ) => { 
+                        console.log ( "hello" )
+                        services.map  ( el => postServices ( el )  ) } } />
+                 </div>
+            </>
+        ) 
+    }
+}        

+ 32 - 0
src/components/main/team.js

@@ -0,0 +1,32 @@
+import React from 'react';
+import {Link} from 'react-router-dom';
+// import Button from "../buttons/button";
+
+
+
+export default class Team extends React.Component {
+    render( ) {
+        const {doctorsArr } = this.props
+        return (
+            <>
+                <h2>Наши врачи</h2>
+                <div className = "team-container">
+                    {doctorsArr.map  ( el => 
+                         <div className="item"  key = {el.id} >
+                             <div className="photo"><img src= {el.photo} alt= {el.name}/></div>
+                            <h3>{el.name}</h3>
+                            <div className="desc">
+                                <p className="experience">Опыт работы {el.experience} лет</p>
+                                <p className="rank">{el.rank}</p>
+                            </div>
+                             <div className="link-box">
+                                <Link to = "/doctors" className = "btn link more">Подробнее ...</Link>
+                                <Link to = "/doctors" className = "btn link ">Записаться на приём</Link>
+                            </div>
+                        </div>
+                    )}
+                 </div>
+            </>
+        ) 
+    }
+}        

+ 39 - 0
src/components/specialists/doctors.js

@@ -0,0 +1,39 @@
+import React from 'react';
+import {Link} from 'react-router-dom'
+
+export default class Doctors extends React.Component {
+
+
+    render() {
+        const {data, flag} = this.props
+        return (
+           
+            <div style={{display:'flex', justifyContent:'center', flexWrap:'wrap'}}>
+                {(flag==='doctors') ? data.map(el=>(
+                        <div key={el.id} style={{display:'flex',flexDirection:'column', width:'300px', margin:'10px 20px'}}>
+                            <Link to={`/doctors/${el.id}`} >
+                                <p>{el.photo}</p>
+                                <p>{el.name}</p>
+                                <p>{el.lastName}</p>
+                                <p>{el.age}</p>
+                                <p>{el.skillsDescription}</p>
+                            </Link>
+                            {el.speciality.map(el=>(
+                                <Link to={`/services/${el}`} key={el}>{el}</Link>
+                            ))}
+                            <Link to={`/appointment/${el.id}`}>Make an appointment</Link>
+                        </div>
+                    )) : (flag==='services') ?
+                data.map(el => (
+                   <div key={el.id} style={{width:'300px', margin:'10px 20px'}}>
+                       <p>{el.name}</p>
+                       <p>{el.description}</p>
+                       <p>Price:{el.price}$</p>
+                   </div>
+                )) : <p>null</p>
+                }
+
+            </div>
+        );
+    }
+}

+ 23 - 0
src/db.json

@@ -0,0 +1,23 @@
+{
+  "doctors": [
+    {
+      "age":30,
+      "id":1,
+      "lastName":"Sidorov",
+      "name":"Ivan",
+      "photo":"some photo here",
+      "skillsDescription":"Lorem ipsum dolor sit amet, consectetur adipisi...",
+      "schedule": {
+        "07": {
+          "09": ["8:00","09:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00"],
+          "10": ["8:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00"],
+          "11": ["8:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00"],
+          "12": ["8:00","09:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00"],
+          "13": false,
+          "14": false
+        }
+      }
+
+    }
+  ]
+}

+ 25 - 0
src/index.js

@@ -0,0 +1,25 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App'
+import * as serviceWorker from './serviceWorker';
+
+import {BrowserRouter} from "react-router-dom";
+import {store} from './store'
+import {Provider} from "react-redux";
+
+
+import "./style/normalize.css"
+// import "./style/style.css"
+import "./style/all.scss";
+
+ReactDOM.render(
+    <Provider store={store}>
+        <BrowserRouter>
+            <App/>
+        </BrowserRouter>
+    </Provider>,
+    document.getElementById('root')
+);
+
+
+serviceWorker.unregister();

+ 135 - 0
src/serviceWorker.js

@@ -0,0 +1,135 @@
+// This optional code is used to register a service worker.
+// register() is not called by default.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on subsequent visits to a page, after all the
+// existing tabs open on the page have been closed, since previously cached
+// resources are updated in the background.
+
+// To learn more about the benefits of this model and instructions on how to
+// opt-in, read https://bit.ly/CRA-PWA
+
+const isLocalhost = Boolean(
+  window.location.hostname === 'localhost' ||
+    // [::1] is the IPv6 localhost address.
+    window.location.hostname === '[::1]' ||
+    // 127.0.0.1/8 is considered localhost for IPv4.
+    window.location.hostname.match(
+      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
+    )
+);
+
+export function register(config) {
+  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+    // The URL constructor is available in all browsers that support SW.
+    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
+    if (publicUrl.origin !== window.location.origin) {
+      // Our service worker won't work if PUBLIC_URL is on a different origin
+      // from what our page is served on. This might happen if a CDN is used to
+      // serve assets; see https://github.com/facebook/create-react-app/issues/2374
+      return;
+    }
+
+    window.addEventListener('load', () => {
+      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+
+      if (isLocalhost) {
+        // This is running on localhost. Let's check if a service worker still exists or not.
+        checkValidServiceWorker(swUrl, config);
+
+        // Add some additional logging to localhost, pointing developers to the
+        // service worker/PWA documentation.
+        navigator.serviceWorker.ready.then(() => {
+          console.log(
+            'This web app is being served cache-first by a service ' +
+              'worker. To learn more, visit https://bit.ly/CRA-PWA'
+          );
+        });
+      } else {
+        // Is not localhost. Just register service worker
+        registerValidSW(swUrl, config);
+      }
+    });
+  }
+}
+
+function registerValidSW(swUrl, config) {
+  navigator.serviceWorker
+    .register(swUrl)
+    .then(registration => {
+      registration.onupdatefound = () => {
+        const installingWorker = registration.installing;
+        if (installingWorker == null) {
+          return;
+        }
+        installingWorker.onstatechange = () => {
+          if (installingWorker.state === 'installed') {
+            if (navigator.serviceWorker.controller) {
+              // At this point, the updated precached content has been fetched,
+              // but the previous service worker will still serve the older
+              // content until all client tabs are closed.
+              console.log(
+                'New content is available and will be used when all ' +
+                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
+              );
+
+              // Execute callback
+              if (config && config.onUpdate) {
+                config.onUpdate(registration);
+              }
+            } else {
+              // At this point, everything has been precached.
+              // It's the perfect time to display a
+              // "Content is cached for offline use." message.
+              console.log('Content is cached for offline use.');
+
+              // Execute callback
+              if (config && config.onSuccess) {
+                config.onSuccess(registration);
+              }
+            }
+          }
+        };
+      };
+    })
+    .catch(error => {
+      console.error('Error during service worker registration:', error);
+    });
+}
+
+function checkValidServiceWorker(swUrl, config) {
+  // Check if the service worker can be found. If it can't reload the page.
+  fetch(swUrl)
+    .then(response => {
+      // Ensure service worker exists, and that we really are getting a JS file.
+      const contentType = response.headers.get('content-type');
+      if (
+        response.status === 404 ||
+        (contentType != null && contentType.indexOf('javascript') === -1)
+      ) {
+        // No service worker found. Probably a different app. Reload the page.
+        navigator.serviceWorker.ready.then(registration => {
+          registration.unregister().then(() => {
+            window.location.reload();
+          });
+        });
+      } else {
+        // Service worker found. Proceed as normal.
+        registerValidSW(swUrl, config);
+      }
+    })
+    .catch(() => {
+      console.log(
+        'No internet connection found. App is running in offline mode.'
+      );
+    });
+}
+
+export function unregister() {
+  if ('serviceWorker' in navigator) {
+    navigator.serviceWorker.ready.then(registration => {
+      registration.unregister();
+    });
+  }
+}

+ 6 - 0
src/store.js

@@ -0,0 +1,6 @@
+import { createStore, applyMiddleware } from "redux";
+import thunk from "redux-thunk";
+
+import rootReducer from './store/reducers'
+
+export const store = createStore(rootReducer, applyMiddleware(thunk));

+ 38 - 0
src/store/app/actionTypes.js

@@ -0,0 +1,38 @@
+export const GET_DOCTORS_REQUEST = "GET_DOCTORS_REQUEST";
+export const GET_DOCTORS_REQUEST_SUCCESS = "GET_DOCTORS_REQUEST_SUCCESS";
+export const GET_DOCTORS_REQUEST_FAIL = "GET_DOCTORS_REQUEST_FAIL";
+
+export const GET_SERVICES_REQUEST = "GET_SERVICES_REQUEST";
+export const GET_SERVICES_REQUEST_SUCCESS = "GET_SERVICES_REQUEST_SUCCESS";
+export const GET_SERVICES_REQUEST_FAIL = "GET_SERVICES_REQUEST_FAIL";
+
+export const GET_ALL_REQUEST = "GET_ALL_REQUEST";
+export const GET_ALL_REQUEST_SUCCESS = "GET_ALL_REQUEST_SUCCESS";
+export const GET_ALL_REQUEST_FAIL = "GET_ALL_REQUEST_FAIL";
+
+export const PUT_ORDERS_REQUEST = "PUT_ORDERS_REQUEST";
+export const PUT_ORDERS_REQUEST_SUCCESS = "PUT_ORDERS_REQUEST_SUCCESS";
+export const PUT_ORDERS_REQUEST_FAIL = "PUT_ORDERS_REQUEST_FAIL";
+
+export const CHANGE_APPOINTMENT_DATE= "CHANGE_APPOINTMENT_DATE";
+export const CHANGE_APPOINTMENT_DOCTOR= "CHANGE_APPOINTMENT_DOCTOR";
+export const CHANGE_APPOINTMENT_TIME= "CHANGE_APPOINTMENT_TIME";
+export const CHANGE_APPOINTMENT_SPEC= "CHANGE_APPOINTMENT_SPEC";
+export const CHANGE_APPOINTMENT_COMMENT= "CHANGE_APPOINTMENT_COMMENT";
+export const CLEAR_APPOINTMENT= "CLEAR_APPOINTMENT";
+
+export const AUTH_REQUEST = "GET_AUTH_REQUEST";
+export const AUTH_REQUEST_SUCCESS = "AUTH_REQUEST_SUCCESS";
+export const AUTH_REQUEST_FAIL = "AUTH_REQUEST_FAIL";
+
+export const REGISTRATION_REQUEST = "REQISTRATION_REQUEST";
+export const REGISTRATION_REQUEST_SUCCESS = "REGISTRATION_REQUEST_SUCCESS";
+export const REGISTRATION_REQUEST_FAIL = "REGISTRATION_REQUEST_FAIL";
+
+export const POST_DOCTORS_REQUEST = "POST_DOCTORS_REQUEST";
+export const POST_DOCTORS_REQUEST_SUCCESS = "POST_DOCTORS_REQUEST_SUCCESS";
+export const POST_DOCTORS_REQUEST_FAIL = "POST_DOCTORS_REQUEST_FAIL";
+
+export const POST_SERVICES_REQUEST = "POST_SERVICES_REQUEST";
+export const POST_SERVICES_REQUEST_SUCCESS = "POST_SERVICES_REQUEST_SUCCESS";
+export const POST_SERVICES_REQUEST_FAIL = "POST_SERVICES_REQUEST_FAIL";

+ 131 - 0
src/store/app/actions.js

@@ -0,0 +1,131 @@
+// import axios from "axios";
+import * as types from "./actionTypes";
+
+
+
+const URL = "https://team-app-28f4a.firebaseio.com/";
+// https://api-clinics.herokuapp.com/api/v1/services"
+
+// -----------------------------------------------------------------------------------------------------------------
+
+export const getDoctorsRequest = payload => ({
+    type: types.GET_DOCTORS_REQUEST,
+    payload
+});
+
+const getDoctorsRequestSuccess = payload => ({
+    type: types.GET_DOCTORS_REQUEST_SUCCESS,
+    payload
+});
+
+const getDoctorsRequestFail = payload => ({
+    type: types.GET_DOCTORS_REQUEST_FAIL,
+    payload
+});
+
+export const getDoctors = () => dispatch => {
+    dispatch(getDoctorsRequest());
+    return fetch(`${URL}doctors.json`, {
+        method: "GET",
+        // credentials: "include"
+    })
+        .then(res => res.json())
+        .then(res => dispatch(getDoctorsRequestSuccess(res)))
+        .catch(err => dispatch(getDoctorsRequestFail(err)));
+};
+// _____________________________________________________________________________________
+
+const getServicesRequest = payload => ({
+    type: types.GET_SERVICES_REQUEST,
+    payload
+});
+
+const getServicesRequestSuccess = payload => ({
+    type: types.GET_SERVICES_REQUEST_SUCCESS,
+    payload
+});
+
+const getServicesRequestFail = payload => ({
+    type: types.GET_SERVICES_REQUEST_FAIL,
+    payload
+});
+
+export const getServices = () => dispatch => {
+    dispatch(getServicesRequest());
+    return fetch(`${URL}services.json`, {
+        method: "GET",
+        // credentials: "include"
+    })
+        .then(res => res.json())
+        .then(res => dispatch(getServicesRequestSuccess(res)))
+        .catch(err => dispatch(getServicesRequestFail(err)));
+};
+
+
+// _____________________________________________________________________________________
+export const postDoctorsRequest = payload => ({
+    type: types.POST_DOCTORS_REQUEST,
+    payload
+});
+
+const postDoctorsRequestSuccess = payload => ({
+    type: types.POST_DOCTORS_REQUEST_SUCCESS,
+    payload
+});
+
+const postDoctorsRequestFail = payload => ({
+    type: types.POST_DOCTORS_REQUEST_FAIL,
+    payload
+});
+
+export const postDoctors = (payload) => dispatch => {
+    console.log(payload)
+    dispatch(postDoctorsRequest());
+    return fetch("https://api-clinics.herokuapp.com/api/v1/doctors", {
+        method: "POST",
+        credentials: "include",
+        headers: {
+            "Content-Type": "application/json"
+        },
+        body: JSON.stringify(payload)
+    })
+        .then(res => res.json())
+        .then(res => dispatch(postDoctorsRequestSuccess(res)))
+        .catch(err => dispatch(postDoctorsRequestFail(err)));
+};
+
+// -----------------------------------------------------------------------------------------------------------------
+
+export const postServicesRequest = payload => ({
+    type: types.POST_SERVICES_REQUEST,
+    payload
+});
+
+const postServicesRequestSuccess = payload => ({
+    type: types.POST_SERVICES_REQUEST_SUCCESS,
+    payload
+});
+
+const postServicesRequestFail = payload => ({
+    type: types.POST_SERVICES_REQUEST_FAIL,
+    payload
+});
+
+export const postServices = (payload) => dispatch => {
+    // console.log(payload)
+    dispatch(postServicesRequest());
+    return fetch("https://api-clinics.herokuapp.com/api/v1/services", {
+        method: "POST",
+        credentials: "include",
+        headers: {
+            "Content-Type": "application/json"
+        },
+        body: JSON.stringify(payload)
+    })
+        .then(res => res.json())
+        .then(res =>  dispatch(postServicesRequestSuccess(res)))
+        .catch(err => dispatch(postServicesRequestFail(err)))
+};
+
+// _____________________________________________________________
+

+ 128 - 0
src/store/app/reducers.js

@@ -0,0 +1,128 @@
+import * as types from './actionTypes'
+
+const defaultState = {
+    doctors:[  ],
+    services:{
+        service1:{id:1},
+        service2:{id:2},
+        service3:{id:3},
+        service4:{id:4},
+        service5:{id:5},
+        service6:{id:6},
+        service7:{id:7},
+        service8:{id:8},
+        service9:{id:9},
+    },
+    isFetching:false,
+    error: null,
+
+};
+
+// -----------------------------------------------------------------------------------------------------------------
+
+export const appReducer = (state = defaultState,action) => {
+
+    switch (action.type) {
+// -----------------------------------------------------------------------------------------------------------------
+
+        case types.GET_DOCTORS_REQUEST : {
+            return {
+                ...state,
+                isFetching: true
+            };
+        }
+
+        case types.GET_DOCTORS_REQUEST_SUCCESS : {
+            return {
+                ...state,
+                doctors:action.payload,
+                isFetching: false
+            }
+        }
+
+        case types.GET_DOCTORS_REQUEST_FAIL : {
+            return {
+                ...state,
+                error:action.payload,
+                isFetching: false
+            }
+        }
+
+// -----------------------------------------------------------------------------------------------------------------
+
+        case types.GET_SERVICES_REQUEST : {
+            return {
+                ...state,
+                isFetching: true
+            };
+        }
+
+        case types.GET_SERVICES_REQUEST_SUCCESS : {
+            return {
+                ...state,
+                services:action.payload,
+                isFetching: false
+            }
+        }
+
+        case types.GET_SERVICES_REQUEST_FAIL : {
+            return {
+                ...state,
+                error:action.payload,
+                isFetching: false
+            }
+        }
+
+// -----------------------------------------------------------------------------------------------------------------
+        case types.POST_DOCTORS_REQUEST : {
+            return {
+                ...state,
+                isFetching: true
+            };
+        }
+
+        case types.POST_DOCTORS_REQUEST_SUCCESS : {
+            return {
+                ...state,
+                isFetching: false
+            }
+        }
+
+        case types.POST_DOCTORS_REQUEST_FAIL : {
+            return {
+                ...state,
+                error: action.payload,
+                isFetching: false
+            }
+        }
+
+// _______________________________________________________________________________
+
+        case types.POST_SERVICES_REQUEST : {
+            return {
+                ...state,
+                isFetching: true
+            };
+        }
+
+        case types.POST_SERVICES_REQUEST_SUCCESS : {
+            return {
+                ...state,
+                isFetching: false
+            }
+        }
+
+        case types.POST_SERVICES_REQUEST_FAIL : {
+            return {
+                ...state,
+                error: action.payload,
+                isFetching: false
+            }
+        }
+
+// _______________________________________________________________________________
+
+        default:
+            return state
+    }
+};

+ 9 - 0
src/store/reducers.js

@@ -0,0 +1,9 @@
+import {combineReducers} from "redux";
+
+import {appReducer} from "./app/reducers";
+
+
+
+export default combineReducers({
+    app:appReducer
+})

+ 33 - 0
src/style/App.css

@@ -0,0 +1,33 @@
+.App {
+  text-align: center;
+}
+
+.App-logo {
+  animation: App-logo-spin infinite 20s linear;
+  height: 40vmin;
+  pointer-events: none;
+}
+
+.App-header {
+  background-color: #282c34;
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  font-size: calc(10px + 2vmin);
+  color: white;
+}
+
+.App-link {
+  color: #61dafb;
+}
+
+@keyframes App-logo-spin {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}

+ 373 - 0
src/style/all.scss

@@ -0,0 +1,373 @@
+$header-color: #d4d5d7;
+$main-title-color: #3b3b3b;
+$main-text-color: #101010;
+$main-color:   #789084;
+$hover-color: #b1e8ca;
+$opacity-color: rgba(17,17,17,0.7);
+
+//
+
+body {
+	font-family: 'Lato', sans-serif;
+	font-size: 16px;
+
+}
+
+.main {
+	background-image: url(../assets/images/fon6.jpg);
+	background-size: cover;
+	background-attachment: fixed;
+	min-height: 100vh;
+}
+
+.container {
+	background-image: url(../assets/images/fon1.jpg);
+	background-size: cover;
+}
+.wrapper {
+	max-width: 1180px;
+	margin: 0 auto;
+}
+
+// header +  navigation
+.header {
+	width: 100%;
+	padding: 10px;
+	display: flex;
+	justify-content: space-around;
+	flex-wrap: wrap;
+   	margin: 0 auto;
+    vertical-align: middle;
+	font-weight: 700;
+	background-color: $opacity-color;
+	position: fixed;
+	top: 0;
+	z-index: 99999;
+
+	& .nav {
+		margin-top: 25px;
+		font-size: 14px;
+		line-height: 24px;
+		font-weight: bold;
+		letter-spacing: 0.075em;
+		@media (max-width: 768px) {
+			margin-top: 10px;	
+		}
+	}
+	& .list {
+		list-style: none;
+		padding: 2px;
+		margin: 0;
+        display: flex;
+		justify-content: space-between;
+		flex-wrap: wrap;
+		text-transform: uppercase;
+	}
+	& .item {
+		padding: 0;
+		&:not(:last-child) {
+			margin-right: 25px;
+			@media (max-width: 768px) {
+				// margin-right: 10px;	
+			}
+		}
+		&:last-child a {
+			color: $hover-color;
+			&:hover {
+				color: $main-title-color;
+			}
+		}
+		a {
+			text-decoration: none;
+			color: $header-color;
+			&:hover {
+				color: $hover-color;
+			}
+		}
+	}
+	.logo-box {
+		margin-right: 50px;
+		@media (max-width: 768px) {
+			margin-right: 0;	
+		}
+	}
+	.logo-box  img {
+		width: 100px;
+		@media (max-width: 768px) {
+			// width: 150px;	
+		}
+	}	
+}
+	
+// banner + title
+.title-box {
+	color: $header-color;
+	margin: 0px 40px;
+	padding-bottom: 45px;
+	display: flex;
+	flex-direction: column;
+	text-align: center;
+	@media (max-width: 768px) {
+	width: 100%;
+	margin: 0;
+	}
+	img {
+		margin: 150px auto 30px;
+		@media (max-width: 768px) {
+			max-width: 200px;	
+		}
+	}
+	h1{
+		text-transform: uppercase;
+		background-color: $opacity-color;
+		font-size: 52px;
+		padding: 35px;
+		line-height: 50px;
+		font-weight: bold;
+		margin: 70px auto 0;
+		text-align: center;
+		@media (max-width: 768px) {
+			font-size: 30px;
+			padding: 15px;	
+		}
+	}
+}
+
+// button
+.btn {
+	min-height: 50px;
+	width: 70%;
+	margin: 20px auto;
+	color: $main-color;
+	text-transform: uppercase;
+	text-decoration: none;
+	letter-spacing: 0.05em;
+	font-size: 15px;
+	font-weight: bold;
+	line-height: 35px;
+	border: none;
+	border-radius: 3px;
+	background-color:  $hover-color;
+	transition-duration: 0.4s;
+	&:hover {
+		box-shadow: none;
+		background-color: $opacity-color;
+		color: $header-color;
+	}
+	&:focus {
+		outline: none;
+	}
+	@media (max-width: 768px) {
+		width: 100%;
+		margin: 25px auto;	
+	}
+}
+
+//  section About Us
+.aboutsection, 
+.team-container,
+h2  {
+	background-color: $opacity-color;
+	box-shadow: 0px 0px 10px 20px  $opacity-color;
+	font-size: 20px;
+	line-height: 1.5em;
+	font-family: 'Montserrat', sans-serif;
+	color: $header-color;
+	text-align: justify;
+	
+	padding: 15px 15px 50px;
+	@media (max-width: 768px) {
+		padding: 3px;
+		margin: 25px 10px;	
+	}
+}
+h2 {
+	// border: none;
+	font-size: 36px;
+	padding: 2px;
+	background: none;
+	box-shadow: none;
+	color: $main-color;
+	border-bottom: 1px solid $opacity-color;
+}
+
+// second banner 
+.case {
+	position: relative;
+	.banner {
+		display: block;
+		width: 100%;
+		margin: 15px auto;
+		padding: 15px 0;
+	}
+	.button-box {
+		position: absolute; 
+		top: 70%;
+		right: 0%;
+		height: 90px;
+		width: 100%;
+		background-color: rgba(255,255,255,0.4);
+		margin: 20px 0;
+		text-align: right;
+		.btn {
+			width: 35%;
+			margin: 20px 10px;
+			@media (max-width: 768px) {
+				width: 100%;
+			}
+		}
+		@media (max-width: 768px) {
+			top: 50%;
+		}
+	}
+}
+
+// shortly about doctors 
+.team-container {
+	color: $header-color;
+	display: flex;
+	flex-wrap: wrap;
+	justify-content: space-around;
+	padding: 15px 5px 50px;
+
+	.item {
+		width: 27%;
+		margin: 10px; 
+		text-align: center;
+		display: flex;
+		flex-direction: column;
+		border-radius: 5px;
+		box-shadow: 0px 2px 8px 1px $main-color;
+		.photo {
+			overflow: hidden;
+			height: 45%;
+			border-radius: 5px;
+			img {
+				border-radius: 5px;
+			}
+		}
+		.link-box {
+			margin-top: 20px;
+		}
+		.link {
+			width: 100%;
+			display: block;
+			padding: 15px 2px;
+		}
+		.more {
+			background-color: $opacity-color;
+			&:hover {
+				background-color: $main-color;
+			}
+		}
+		@media (max-width: 768px) {
+			width: 45%;
+		}
+		@media (max-width: 630px) {
+			width: 100%;
+		}
+	}
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// _____________________
+
+// footer {
+// 	background-color: $footer-color;
+// 	padding: 60px 25px;
+// 	color: $header-color;
+// 	.wrapper {
+// 		display: flex;
+// 		justify-content: space-between;
+// 		@media (max-width: 768px) {
+// 			flex-direction: column;	
+// 			align-items: center;
+// 			.logo-box {
+// 				display: none;
+// 			}
+// 		}
+// 		.contacts {
+// 			position: relative;
+// 		}
+// 	}
+// 	.nav {
+// 		font-family: 'PT Serif', serif;
+// 		margin-top: 25px;
+// 		font-size: 13px;
+// 		line-height: 21px;
+// 		letter-spacing: 0.075em;
+// 		@media (max-width: 768px) {
+// 			margin-top: 10px;	
+// 		}
+// 		.list {
+// 			list-style: none;
+// 			padding: 2px;
+// 			margin: 0;
+// 			display: flex;
+// 			flex-direction: column;
+// 			justify-content: space-between;
+// 			flex-wrap: wrap;
+// 			text-transform: uppercase;
+// 		}
+// 	}
+// 	.item {
+// 		padding: 0;
+// 		&:not(:last-child) {
+// 			// margin-right: 25px;
+// 			@media (max-width: 768px) {
+// 				// margin-right: 10px;	
+// 			}
+// 		}
+// 		a {
+// 			text-decoration: none;
+// 			color: $header-color;
+// 			&:hover {
+// 				color: $hover-color;
+// 			}
+// 		}
+// 	}
+// }
+
+// h5 {
+// 	font-size: 16px;
+// 	line-height: 24px;
+// 	font-weight: bold;
+// 	text-transform: uppercase;
+// // }
+// footer  {
+// 	.logo-box,
+// 	.footer-nav,
+// 	.contacts {
+// 		width: 25%;
+// 		@media (max-width: 768px) {
+// 			align-self: center;
+// 			width: 50%;
+// 		}
+// 	}
+// 	span {
+// 		color:  $header-color;
+// 		&:hover {
+// 			color: $hover-color;
+// 		}
+// 	}
+// }
+

+ 13 - 0
src/style/index.css

@@ -0,0 +1,13 @@
+body {
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
+    "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
+    sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+  font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
+    monospace;
+}

+ 11 - 0
src/style/mod.module.css

@@ -0,0 +1,11 @@
+.dude {
+	color: blue;
+}
+
+.success {
+	background-color: green;
+}
+
+.fail {
+	background-color: red;
+}

+ 356 - 0
src/style/normalize.css

@@ -0,0 +1,356 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+   ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+  line-height: 1.15; /* 1 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+   ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+  margin: 0;
+  padding: 0;
+}
+
+/**
+ * Render the `main` element consistently in IE.
+ */
+
+main {
+  display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+  box-sizing: content-box; /* 1 */
+  height: 0; /* 1 */
+  overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+  background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+  border-bottom: none; /* 1 */
+  text-decoration: underline; /* 2 */
+  text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+  border-style: none;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: inherit; /* 1 */
+  font-size: 100%; /* 1 */
+  line-height: 1.15; /* 1 */
+  margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+  overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+  text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+  padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+  outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+  padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ *    `fieldset` elements in all browsers.
+ */
+
+legend {
+  box-sizing: border-box; /* 1 */
+  color: inherit; /* 2 */
+  display: table; /* 1 */
+  max-width: 100%; /* 1 */
+  padding: 0; /* 3 */
+  white-space: normal; /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+  vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button; /* 1 */
+  font: inherit; /* 2 */
+}
+
+/* Interactive
+   ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+  display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+  display: list-item;
+}
+
+/* Misc
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+  display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+  display: none;
+}
+
+* {
+  -webkit-box-sizing: border-box;
+-moz-box-sizing: border-box;
+box-sizing: border-box;
+}

+ 100 - 0
src/style/style.css

@@ -0,0 +1,100 @@
+@font-face {
+  font-family: 'icomoon';
+  src:  url('../assets/fonts/icomoon.eot?fc5bra');
+  src:  url('../assets/fonts/icomoon.eot?fc5bra#iefix') format('embedded-opentype'),
+    url('../assets/fonts/icomoon.ttf?fc5bra') format('truetype'),
+    url('../assets/fonts/icomoon.woff?fc5bra') format('woff'),
+    url('../assets/fonts/icomoon.svg?fc5bra#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon' !important;
+  /* speak: none; */
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+
+.icon-angle-double-down:after {
+  content: "\f103";
+  font-size: 20px;
+  top: 100%;
+  right: 45%;
+  margin-top: 15px;
+  color: #fff;
+}
+.icon-angle-double-down:hover:after {
+  color: #ff6633;
+}
+
+.icon-calendar:before {
+  content: "\f073";
+  top: 30%;
+  right: 20px;
+
+}
+.icon-tripadvisor:before {
+  content: "\f262";
+  left: 150px;
+  
+
+}
+.icon-clock:before {
+  content: "\e94e";
+
+}
+.icon-user:before {
+  content: "\e971";
+}
+.icon-users:before {
+  content: "\e972";
+}
+.icon-facebook:before {
+  content: "\ea90";
+  left: 0;
+}
+.icon-instagram:before {
+  content: "\ea92";
+  left: 100px;
+}
+.icon-twitter:before {
+  content: "\ea96";
+  left: 50px;
+}
+
+
+
+.icon-angle-double-down:after,
+.icon-user:before,
+.icon-calendar:before,
+.icon-clock:before,
+.icon-users:before, 
+.icon-tripadvisor:before,
+.icon-facebook:before,
+.icon-instagram:before,
+.icon-twitter:before {
+    position: absolute;
+}
+
+.icon-calendar:before,
+.icon-clock:before {
+    color: #222222;
+    font-size: 12px;
+    font-weight: bold;
+    width: 20px;
+    height: 20px;
+    top: 2px;
+    left: 0;
+}
+
+

+ 416 - 0
team-app-28f4a-export.json

@@ -0,0 +1,416 @@
+{
+  "doctors" : [ {
+    "experience" : "2002-08-22",
+    "id" : 1,
+    "name" : "Ivan Sidorov",
+    "photo" : "some photo here",
+    "profession" : "therapist",
+    "schedule" : {
+      "07" : [ null, null, null, null, null, null, null, null, null, null, null, null, null, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      } ]
+    },
+    "skillsDescription" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+    "speciality" : [ "service1", "service2", "service3", "service4", "service5" ]
+  }, {
+    "experience" : "2007-04-15",
+    "id" : 2,
+    "name " : "Sidor Ivanov",
+    "photo" : "some photo here",
+    "profession" : "surgeon",
+    "schedule" : {
+      "07" : [ null, null, null, null, null, null, null, null, null, null, null, null, null, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, false, false, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      }, {
+        "08:00" : true,
+        "09:00" : true,
+        "10:00" : true,
+        "11:00" : true,
+        "12:00" : true,
+        "13:00" : true,
+        "14:00" : true,
+        "15:00" : true,
+        "16:00" : true,
+        "17:00" : true
+      } ]
+    },
+    "skillsDescription" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, magnam. Maxime nisi dolorum consectetur dolor impedit veniam placeat nobis repudiandae quibusdam aperiam!",
+    "speciality" : [ "service8", "service2", "service3", "service9", "service5" ]
+  } ],
+  "orders" : [ null, {
+    "comment" : "www",
+    "date" : {
+      "day" : "12",
+      "month" : "07",
+      "year" : "2019"
+    },
+    "doctorId" : 1,
+    "id" : 2,
+    "spec" : "service2",
+    "time" : "10:00"
+  }, {
+    "comment" : "aaa",
+    "date" : {
+      "day" : "12",
+      "month" : "07",
+      "year" : "2019"
+    },
+    "doctorId" : 1,
+    "id" : 3,
+    "spec" : "service2",
+    "time" : "10:00"
+  }, {
+    "comment" : "fffff",
+    "date" : {
+      "day" : "12",
+      "month" : "07",
+      "year" : "2019"
+    },
+    "doctorId" : 1,
+    "id" : 4,
+    "spec" : "service3",
+    "time" : "15:00"
+  }, {
+    "comment" : "xxxx",
+    "date" : {
+      "day" : "13",
+      "month" : "07",
+      "year" : "2019"
+    },
+    "doctorId" : 1,
+    "id" : 5,
+    "price" : 200,
+    "spec" : "service2",
+    "time" : "12:00"
+  }, {
+    "comment" : "bbbb",
+    "date" : {
+      "day" : "13",
+      "month" : "07",
+      "year" : "2019"
+    },
+    "doctorId" : 1,
+    "id" : 6,
+    "price" : 300,
+    "spec" : "service3",
+    "time" : "13:00"
+  } ],
+  "reviews" : [ {
+    "group" : "doctors",
+    "id" : 1,
+    "text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit."
+  }, {
+    "group" : "services",
+    "id" : 2,
+    "text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit."
+  } ],
+  "services" : {
+    "service1" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 1,
+      "id" : 1,
+      "name" : "Operation1",
+      "price" : 100
+    },
+    "service2" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 2,
+      "id" : 2,
+      "name" : "Operation2",
+      "price" : 200
+    },
+    "service3" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 3,
+      "id" : 3,
+      "name" : "Operation3",
+      "price" : 300
+    },
+    "service4" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 1,
+      "id" : 4,
+      "name" : "Operation4",
+      "price" : 400
+    },
+    "service5" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 1,
+      "id" : 5,
+      "name" : "Operation5",
+      "price" : 500
+    },
+    "service6" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 4,
+      "id" : 6,
+      "name" : "Operation6",
+      "price" : 600
+    },
+    "service7" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 3,
+      "id" : 7,
+      "name" : "Operation7",
+      "price" : 700
+    },
+    "service8" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 1,
+      "id" : 8,
+      "name" : "Operation8",
+      "price" : 800
+    },
+    "service9" : {
+      "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+      "duration" : 2,
+      "id" : 9,
+      "name" : "Operation9",
+      "price" : 900
+    }
+  },
+  "users" : [ {
+    "email" : "dead1990bb@gmail.com",
+    "id" : 1,
+    "lastName" : "Kozhin",
+    "name" : "Boris",
+    "password" : "123456",
+    "phone" : "380938807183",
+    "root" : true
+  }, {
+    "email" : "fff@fff",
+    "id" : 2,
+    "lastName" : "fff",
+    "name" : "Doris",
+    "password" : "123456",
+    "phone" : "380938807185",
+    "root" : false
+  } ]
+}

File diff suppressed because it is too large
+ 9408 - 0
yarn.lock