yourname 2 месяцев назад
Родитель
Сommit
ed4b90f535
27 измененных файлов с 675 добавлено и 107 удалено
  1. 48 0
      public/supply-chain/BasePointIcon_aquatic.svg
  2. 12 0
      public/supply-chain/BasePointIcon_freshfood.svg
  3. 48 0
      public/supply-chain/BasePointIcon_fruit.svg
  4. 12 0
      public/supply-chain/BasePointIcon_grain.svg
  5. 12 0
      public/supply-chain/BasePointIcon_livestock.svg
  6. 48 0
      public/supply-chain/BasePointIcon_oil.svg
  7. 48 0
      public/supply-chain/BasePointIcon_salt.svg
  8. 12 0
      public/supply-chain/BasePointIcon_seed.svg
  9. 33 0
      public/supply-chain/SupplyChainIcons_aquatic.svg
  10. 33 0
      public/supply-chain/SupplyChainIcons_freshfood.svg
  11. 33 0
      public/supply-chain/SupplyChainIcons_fruit.svg
  12. 33 0
      public/supply-chain/SupplyChainIcons_grain.svg
  13. 33 0
      public/supply-chain/SupplyChainIcons_livestock.svg
  14. 33 0
      public/supply-chain/SupplyChainIcons_oil.svg
  15. 48 0
      public/supply-chain/SupplyChainIcons_salt.svg
  16. 33 0
      public/supply-chain/SupplyChainIcons_seed.svg
  17. 23 8
      src/client/home/pages/SupplyChainDashboards/GrainOilDashboard.tsx
  18. 5 23
      src/client/home/pages/SupplyChainDashboards/components/KeyMetrics.tsx
  19. 9 19
      src/client/home/pages/SupplyChainDashboards/components/PopupInfoBox.tsx
  20. 0 2
      src/client/home/pages/SupplyChainDashboards/components/SupplyChainMap.tsx
  21. 20 12
      src/client/home/pages/SupplyChainDashboards/components/icons/BasePointIcon.tsx
  22. 2 0
      src/client/home/pages/SupplyChainDashboards/components/icons/Img5.tsx
  23. 4 13
      src/client/home/pages/SupplyChainDashboards/components/icons/IndustryIcon.tsx
  24. 10 8
      src/client/home/pages/SupplyChainDashboards/components/icons/PopupInfoBox.tsx
  25. 20 22
      src/client/home/pages/SupplyChainDashboards/components/icons/SupplyChainIcons.tsx
  26. 2 0
      src/client/home/pages/SupplyChainDashboards/components/icons/Union.tsx
  27. 61 0
      src/client/home/pages/SupplyChainDashboards/context/ThemeContext.tsx

+ 48 - 0
public/supply-chain/BasePointIcon_aquatic.svg

@@ -0,0 +1,48 @@
+<svg width="42" height="50" viewBox="0 0 42 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2019_57131)">
+<path d="M35.7452 22.6746C36.071 29.636 31.5637 35.599 25.2642 37.5417C23.7165 38.0274 22.386 38.9987 21.5171 40.3478L20.8383 41.4541L20.1324 40.3478C19.2906 39.0257 17.9873 38.0274 16.4939 37.5687C10.3574 35.7339 5.9043 30.0677 5.9043 23.3762C5.9043 14.9578 12.964 8.15835 21.5443 8.56308C29.2014 8.88686 35.3922 15.0657 35.7452 22.6746Z" fill="#0C7D91"/>
+<path d="M35.7452 22.6746C36.071 29.636 31.5637 35.599 25.2642 37.5417C23.7165 38.0274 22.386 38.9987 21.5171 40.3478L20.8383 41.4541L20.1324 40.3478C19.2906 39.0257 17.9873 38.0274 16.4939 37.5687C10.3574 35.7339 5.9043 30.0677 5.9043 23.3762C5.9043 14.9578 12.964 8.15835 21.5443 8.56308C29.2014 8.88686 35.3922 15.0657 35.7452 22.6746Z" fill="url(#paint0_linear_2019_57131)" style="mix-blend-mode:overlay"/>
+<path d="M35.7452 22.6746C36.071 29.636 31.5637 35.599 25.2642 37.5417C23.7165 38.0274 22.386 38.9987 21.5171 40.3478L20.8383 41.4541L20.1324 40.3478C19.2906 39.0257 17.9873 38.0274 16.4939 37.5687C10.3574 35.7339 5.9043 30.0677 5.9043 23.3762C5.9043 14.9578 12.964 8.15835 21.5443 8.56308C29.2014 8.88686 35.3922 15.0657 35.7452 22.6746Z" fill="url(#paint1_linear_2019_57131)" style="mix-blend-mode:overlay"/>
+</g>
+<path d="M6.1543 23.376C6.1544 15.101 13.0942 8.41465 21.5322 8.8125H21.5342C29.0619 9.13103 35.1481 15.2073 35.4951 22.6865C35.8153 29.5292 31.3854 35.3922 25.1904 37.3027H25.1895C23.59 37.8047 22.2094 38.8112 21.3066 40.2129L21.3037 40.2168L20.833 40.9824L20.3428 40.2129H20.3418C19.4685 38.8418 18.1177 37.8063 16.5674 37.3301L16.5654 37.3291C10.5315 35.525 6.1543 29.9536 6.1543 23.376Z" stroke="url(#paint2_linear_2019_57131)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M6.1543 23.376C6.1544 15.101 13.0942 8.41465 21.5322 8.8125H21.5342C29.0619 9.13103 35.1481 15.2073 35.4951 22.6865C35.8153 29.5292 31.3854 35.3922 25.1904 37.3027H25.1895C23.59 37.8047 22.2094 38.8112 21.3066 40.2129L21.3037 40.2168L20.833 40.9824L20.3428 40.2129H20.3418C19.4685 38.8418 18.1177 37.8063 16.5674 37.3301L16.5654 37.3291C10.5315 35.525 6.1543 29.9536 6.1543 23.376Z" stroke="url(#paint3_linear_2019_57131)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M4.10742 23.1494C4.10753 13.8491 12.0076 6.32054 21.6299 6.76855L21.6328 6.76953C30.2146 7.12798 37.1452 13.9677 37.54 22.374C37.9045 30.0649 32.8623 36.6625 25.7998 38.8135L25.7979 38.8145C23.9098 39.3996 22.2743 40.5733 21.2031 42.2158L21.1973 42.2256L20.8301 42.8154L20.4443 42.2178H20.4434C19.4081 40.6124 17.8079 39.4008 15.9717 38.8438L15.9678 38.8428L15.3281 38.6406C8.78283 36.4194 4.10742 30.3116 4.10742 23.1494Z" stroke="url(#paint4_linear_2019_57131)"/>
+<path d="M4.10742 23.1494C4.10753 13.8491 12.0076 6.32054 21.6299 6.76855L21.6328 6.76953C30.2146 7.12798 37.1452 13.9677 37.54 22.374C37.9045 30.0649 32.8623 36.6625 25.7998 38.8135L25.7979 38.8145C23.9098 39.3996 22.2743 40.5733 21.2031 42.2158L21.1973 42.2256L20.8301 42.8154L20.4443 42.2178H20.4434C19.4081 40.6124 17.8079 39.4008 15.9717 38.8438L15.9678 38.8428L15.3281 38.6406C8.78283 36.4194 4.10742 30.3116 4.10742 23.1494Z" stroke="url(#paint5_linear_2019_57131)"/>
+<path opacity="0.78" d="M22.2641 16.9459C22.2641 16.9459 21.7373 16.6533 20.8334 16.6761C19.9293 16.6533 19.4033 16.9459 19.4033 16.9459V18.0434H22.2641V16.9459L22.2641 16.9459ZM26.1859 31.8599C26.1859 31.8599 26.1859 22.5112 26.1859 21.9991C26.1859 21.487 25.8623 21.3162 25.8623 21.3162L22.278 18.4613H19.3895L15.8052 21.3162C15.8052 21.3162 15.4808 21.487 15.4808 21.9991C15.4808 22.5112 15.4808 31.8599 15.4808 31.8599C15.4808 31.8599 15.3556 33.3248 16.9523 33.3248H19.4033C20.8577 33.3248 22.2641 33.3248 22.2641 33.3248H24.7152C26.3111 33.3248 26.1859 31.8599 26.1859 31.8599ZM24.7144 28.3172C24.7144 28.4781 24.5795 28.6098 24.4136 28.6098H22.2227C22.0569 28.6098 21.9227 28.4781 21.9227 28.3172V23.4819C21.9227 23.3193 22.0569 23.1884 22.2227 23.1884H24.4136C24.5795 23.1884 24.7144 23.3193 24.7144 23.4819V28.3172L24.7144 28.3172Z" fill="white"/>
+<defs>
+<filter id="filter0_i_2019_57131" x="5.9043" y="8.5459" width="29.8574" height="32.9082" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_2019_57131"/>
+</filter>
+<linearGradient id="paint0_linear_2019_57131" x1="20.833" y1="8.5459" x2="20.833" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_2019_57131" x1="20.833" y1="8.5459" x2="20.833" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_2019_57131" x1="20.833" y1="8.5459" x2="20.833" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint3_linear_2019_57131" x1="20.833" y1="33.9923" x2="20.833" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint4_linear_2019_57131" x1="20.8329" y1="6.25" x2="20.8329" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="#0C7D91" stop-opacity="0"/>
+<stop offset="1" stop-color="#0C7D91"/>
+</linearGradient>
+<linearGradient id="paint5_linear_2019_57131" x1="20.8329" y1="36.3281" x2="20.8329" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>

Разница между файлами не показана из-за своего большого размера
+ 12 - 0
public/supply-chain/BasePointIcon_freshfood.svg


+ 48 - 0
public/supply-chain/BasePointIcon_fruit.svg

@@ -0,0 +1,48 @@
+<svg width="42" height="50" viewBox="0 0 42 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2019_6829)">
+<path d="M35.7462 22.6746C36.072 29.636 31.5646 35.599 25.2652 37.5417C23.7175 38.0274 22.387 38.9987 21.5181 40.3478L20.8393 41.4541L20.1333 40.3478C19.2916 39.0257 17.9883 38.0274 16.4949 37.5687C10.3583 35.7339 5.90527 30.0677 5.90527 23.3762C5.90527 14.9578 12.965 8.15835 21.5453 8.56308C29.2024 8.88686 35.3932 15.0657 35.7462 22.6746Z" fill="#403B03"/>
+<path d="M35.7462 22.6746C36.072 29.636 31.5646 35.599 25.2652 37.5417C23.7175 38.0274 22.387 38.9987 21.5181 40.3478L20.8393 41.4541L20.1333 40.3478C19.2916 39.0257 17.9883 38.0274 16.4949 37.5687C10.3583 35.7339 5.90527 30.0677 5.90527 23.3762C5.90527 14.9578 12.965 8.15835 21.5453 8.56308C29.2024 8.88686 35.3932 15.0657 35.7462 22.6746Z" fill="url(#paint0_linear_2019_6829)" style="mix-blend-mode:overlay"/>
+<path d="M35.7462 22.6746C36.072 29.636 31.5646 35.599 25.2652 37.5417C23.7175 38.0274 22.387 38.9987 21.5181 40.3478L20.8393 41.4541L20.1333 40.3478C19.2916 39.0257 17.9883 38.0274 16.4949 37.5687C10.3583 35.7339 5.90527 30.0677 5.90527 23.3762C5.90527 14.9578 12.965 8.15835 21.5453 8.56308C29.2024 8.88686 35.3932 15.0657 35.7462 22.6746Z" fill="url(#paint1_linear_2019_6829)" style="mix-blend-mode:overlay"/>
+</g>
+<path d="M6.15527 23.376C6.15538 15.101 13.0952 8.41465 21.5332 8.8125H21.5352C29.0629 9.13103 35.1491 15.2073 35.4961 22.6865C35.8163 29.5292 31.3864 35.3922 25.1914 37.3027H25.1904C23.591 37.8047 22.2104 38.8112 21.3076 40.2129L21.3047 40.2168L20.834 40.9824L20.3438 40.2129H20.3428C19.4695 38.8418 18.1187 37.8063 16.5684 37.3301L16.5664 37.3291C10.5325 35.525 6.15527 29.9536 6.15527 23.376Z" stroke="url(#paint2_linear_2019_6829)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M6.15527 23.376C6.15538 15.101 13.0952 8.41465 21.5332 8.8125H21.5352C29.0629 9.13103 35.1491 15.2073 35.4961 22.6865C35.8163 29.5292 31.3864 35.3922 25.1914 37.3027H25.1904C23.591 37.8047 22.2104 38.8112 21.3076 40.2129L21.3047 40.2168L20.834 40.9824L20.3438 40.2129H20.3428C19.4695 38.8418 18.1187 37.8063 16.5684 37.3301L16.5664 37.3291C10.5325 35.525 6.15527 29.9536 6.15527 23.376Z" stroke="url(#paint3_linear_2019_6829)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M4.1084 23.1494C4.10851 13.8491 12.0085 6.32054 21.6309 6.76855L21.6338 6.76953C30.2156 7.12798 37.1461 13.9677 37.541 22.374C37.9054 30.0649 32.8633 36.6625 25.8008 38.8135L25.7988 38.8145C23.9108 39.3996 22.2753 40.5733 21.2041 42.2158L21.1982 42.2256L20.8311 42.8154L20.4453 42.2178H20.4443C19.409 40.6124 17.8089 39.4008 15.9727 38.8438L15.9688 38.8428L15.3291 38.6406C8.7838 36.4194 4.1084 30.3116 4.1084 23.1494Z" stroke="url(#paint4_linear_2019_6829)"/>
+<path d="M4.1084 23.1494C4.10851 13.8491 12.0085 6.32054 21.6309 6.76855L21.6338 6.76953C30.2156 7.12798 37.1461 13.9677 37.541 22.374C37.9054 30.0649 32.8633 36.6625 25.8008 38.8135L25.7988 38.8145C23.9108 39.3996 22.2753 40.5733 21.2041 42.2158L21.1982 42.2256L20.8311 42.8154L20.4453 42.2178H20.4443C19.409 40.6124 17.8089 39.4008 15.9727 38.8438L15.9688 38.8428L15.3291 38.6406C8.7838 36.4194 4.1084 30.3116 4.1084 23.1494Z" stroke="url(#paint5_linear_2019_6829)"/>
+<path opacity="0.78" d="M22.2641 16.9459C22.2641 16.9459 21.7373 16.6533 20.8334 16.6761C19.9293 16.6533 19.4033 16.9459 19.4033 16.9459V18.0434H22.2641V16.9459L22.2641 16.9459ZM26.1859 31.8599C26.1859 31.8599 26.1859 22.5112 26.1859 21.9991C26.1859 21.487 25.8623 21.3162 25.8623 21.3162L22.278 18.4613H19.3895L15.8052 21.3162C15.8052 21.3162 15.4808 21.487 15.4808 21.9991C15.4808 22.5112 15.4808 31.8599 15.4808 31.8599C15.4808 31.8599 15.3556 33.3248 16.9523 33.3248H19.4033C20.8577 33.3248 22.2641 33.3248 22.2641 33.3248H24.7152C26.3111 33.3248 26.1859 31.8599 26.1859 31.8599ZM24.7144 28.3172C24.7144 28.4781 24.5795 28.6098 24.4136 28.6098H22.2227C22.0569 28.6098 21.9227 28.4781 21.9227 28.3172V23.4819C21.9227 23.3193 22.0569 23.1884 22.2227 23.1884H24.4136C24.5795 23.1884 24.7144 23.3193 24.7144 23.4819V28.3172L24.7144 28.3172Z" fill="white"/>
+<defs>
+<filter id="filter0_i_2019_6829" x="5.90527" y="8.5459" width="29.8574" height="32.9082" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_2019_6829"/>
+</filter>
+<linearGradient id="paint0_linear_2019_6829" x1="20.834" y1="8.5459" x2="20.834" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_2019_6829" x1="20.834" y1="8.5459" x2="20.834" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_2019_6829" x1="20.834" y1="8.5459" x2="20.834" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint3_linear_2019_6829" x1="20.834" y1="33.9923" x2="20.834" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint4_linear_2019_6829" x1="20.8339" y1="6.25" x2="20.8339" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FFF586" stop-opacity="0"/>
+<stop offset="1" stop-color="#FFF586"/>
+</linearGradient>
+<linearGradient id="paint5_linear_2019_6829" x1="20.8339" y1="36.3281" x2="20.8339" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>

Разница между файлами не показана из-за своего большого размера
+ 12 - 0
public/supply-chain/BasePointIcon_grain.svg


Разница между файлами не показана из-за своего большого размера
+ 12 - 0
public/supply-chain/BasePointIcon_livestock.svg


+ 48 - 0
public/supply-chain/BasePointIcon_oil.svg

@@ -0,0 +1,48 @@
+<svg width="42" height="50" viewBox="0 0 42 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2019_4070)">
+<path d="M35.7457 22.6746C36.0715 29.636 31.5642 35.599 25.2647 37.5417C23.717 38.0274 22.3865 38.9987 21.5176 40.3478L20.8388 41.4541L20.1328 40.3478C19.2911 39.0257 17.9878 38.0274 16.4944 37.5687C10.3578 35.7339 5.90479 30.0677 5.90479 23.3762C5.90479 14.9578 12.9645 8.15835 21.5448 8.56308C29.2019 8.88686 35.3927 15.0657 35.7457 22.6746Z" fill="#5B3B01"/>
+<path d="M35.7457 22.6746C36.0715 29.636 31.5642 35.599 25.2647 37.5417C23.717 38.0274 22.3865 38.9987 21.5176 40.3478L20.8388 41.4541L20.1328 40.3478C19.2911 39.0257 17.9878 38.0274 16.4944 37.5687C10.3578 35.7339 5.90479 30.0677 5.90479 23.3762C5.90479 14.9578 12.9645 8.15835 21.5448 8.56308C29.2019 8.88686 35.3927 15.0657 35.7457 22.6746Z" fill="url(#paint0_linear_2019_4070)" style="mix-blend-mode:overlay"/>
+<path d="M35.7457 22.6746C36.0715 29.636 31.5642 35.599 25.2647 37.5417C23.717 38.0274 22.3865 38.9987 21.5176 40.3478L20.8388 41.4541L20.1328 40.3478C19.2911 39.0257 17.9878 38.0274 16.4944 37.5687C10.3578 35.7339 5.90479 30.0677 5.90479 23.3762C5.90479 14.9578 12.9645 8.15835 21.5448 8.56308C29.2019 8.88686 35.3927 15.0657 35.7457 22.6746Z" fill="url(#paint1_linear_2019_4070)" style="mix-blend-mode:overlay"/>
+</g>
+<path d="M6.15479 23.376C6.15489 15.101 13.0947 8.41465 21.5327 8.8125H21.5347C29.0624 9.13103 35.1486 15.2073 35.4956 22.6865C35.8158 29.5292 31.3859 35.3922 25.1909 37.3027H25.1899C23.5905 37.8047 22.2099 38.8112 21.3071 40.2129L21.3042 40.2168L20.8335 40.9824L20.3433 40.2129H20.3423C19.469 38.8418 18.1182 37.8063 16.5679 37.3301L16.5659 37.3291C10.532 35.525 6.15479 29.9536 6.15479 23.376Z" stroke="url(#paint2_linear_2019_4070)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M6.15479 23.376C6.15489 15.101 13.0947 8.41465 21.5327 8.8125H21.5347C29.0624 9.13103 35.1486 15.2073 35.4956 22.6865C35.8158 29.5292 31.3859 35.3922 25.1909 37.3027H25.1899C23.5905 37.8047 22.2099 38.8112 21.3071 40.2129L21.3042 40.2168L20.8335 40.9824L20.3433 40.2129H20.3423C19.469 38.8418 18.1182 37.8063 16.5679 37.3301L16.5659 37.3291C10.532 35.525 6.15479 29.9536 6.15479 23.376Z" stroke="url(#paint3_linear_2019_4070)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M4.10791 23.1494C4.10802 13.8491 12.008 6.32054 21.6304 6.76855L21.6333 6.76953C30.2151 7.12798 37.1456 13.9677 37.5405 22.374C37.9049 30.0649 32.8628 36.6625 25.8003 38.8135L25.7983 38.8145C23.9103 39.3996 22.2748 40.5733 21.2036 42.2158L21.1978 42.2256L20.8306 42.8154L20.4448 42.2178H20.4438C19.4085 40.6124 17.8084 39.4008 15.9722 38.8438L15.9683 38.8428L15.3286 38.6406C8.78332 36.4194 4.10791 30.3116 4.10791 23.1494Z" stroke="url(#paint4_linear_2019_4070)"/>
+<path d="M4.10791 23.1494C4.10802 13.8491 12.008 6.32054 21.6304 6.76855L21.6333 6.76953C30.2151 7.12798 37.1456 13.9677 37.5405 22.374C37.9049 30.0649 32.8628 36.6625 25.8003 38.8135L25.7983 38.8145C23.9103 39.3996 22.2748 40.5733 21.2036 42.2158L21.1978 42.2256L20.8306 42.8154L20.4448 42.2178H20.4438C19.4085 40.6124 17.8084 39.4008 15.9722 38.8438L15.9683 38.8428L15.3286 38.6406C8.78332 36.4194 4.10791 30.3116 4.10791 23.1494Z" stroke="url(#paint5_linear_2019_4070)"/>
+<path opacity="0.78" d="M22.2641 16.9459C22.2641 16.9459 21.7373 16.6533 20.8334 16.6761C19.9293 16.6533 19.4033 16.9459 19.4033 16.9459V18.0434H22.2641V16.9459L22.2641 16.9459ZM26.1859 31.8599C26.1859 31.8599 26.1859 22.5112 26.1859 21.9991C26.1859 21.487 25.8623 21.3162 25.8623 21.3162L22.278 18.4613H19.3895L15.8052 21.3162C15.8052 21.3162 15.4808 21.487 15.4808 21.9991C15.4808 22.5112 15.4808 31.8599 15.4808 31.8599C15.4808 31.8599 15.3556 33.3248 16.9523 33.3248H19.4033C20.8577 33.3248 22.2641 33.3248 22.2641 33.3248H24.7152C26.3111 33.3248 26.1859 31.8599 26.1859 31.8599ZM24.7144 28.3172C24.7144 28.4781 24.5795 28.6098 24.4136 28.6098H22.2227C22.0569 28.6098 21.9227 28.4781 21.9227 28.3172V23.4819C21.9227 23.3193 22.0569 23.1884 22.2227 23.1884H24.4136C24.5795 23.1884 24.7144 23.3193 24.7144 23.4819V28.3172L24.7144 28.3172Z" fill="white"/>
+<defs>
+<filter id="filter0_i_2019_4070" x="5.90479" y="8.5459" width="29.8574" height="32.9082" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_2019_4070"/>
+</filter>
+<linearGradient id="paint0_linear_2019_4070" x1="20.8335" y1="8.5459" x2="20.8335" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_2019_4070" x1="20.8335" y1="8.5459" x2="20.8335" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_2019_4070" x1="20.8335" y1="8.5459" x2="20.8335" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint3_linear_2019_4070" x1="20.8335" y1="33.9923" x2="20.8335" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint4_linear_2019_4070" x1="20.8334" y1="6.25" x2="20.8334" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="#5B3B01" stop-opacity="0"/>
+<stop offset="1" stop-color="#5B3B01"/>
+</linearGradient>
+<linearGradient id="paint5_linear_2019_4070" x1="20.8334" y1="36.3281" x2="20.8334" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>

+ 48 - 0
public/supply-chain/BasePointIcon_salt.svg

@@ -0,0 +1,48 @@
+<svg width="42" height="50" viewBox="0 0 42 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2019_11837)">
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="#151C3B"/>
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="url(#paint0_linear_2019_11837)" style="mix-blend-mode:overlay"/>
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="url(#paint1_linear_2019_11837)" style="mix-blend-mode:overlay"/>
+</g>
+<path d="M6.15625 23.376C6.15635 15.101 13.0962 8.41465 21.5342 8.8125H21.5361C29.0638 9.13103 35.1501 15.2073 35.4971 22.6865C35.8173 29.5292 31.3874 35.3922 25.1924 37.3027H25.1914C23.5919 37.8047 22.2114 38.8112 21.3086 40.2129L21.3057 40.2168L20.835 40.9824L20.3447 40.2129H20.3438C19.4704 38.8418 18.1196 37.8063 16.5693 37.3301L16.5674 37.3291C10.5335 35.525 6.15625 29.9536 6.15625 23.376Z" stroke="url(#paint2_linear_2019_11837)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M6.15625 23.376C6.15635 15.101 13.0962 8.41465 21.5342 8.8125H21.5361C29.0638 9.13103 35.1501 15.2073 35.4971 22.6865C35.8173 29.5292 31.3874 35.3922 25.1924 37.3027H25.1914C23.5919 37.8047 22.2114 38.8112 21.3086 40.2129L21.3057 40.2168L20.835 40.9824L20.3447 40.2129H20.3438C19.4704 38.8418 18.1196 37.8063 16.5693 37.3301L16.5674 37.3291C10.5335 35.525 6.15625 29.9536 6.15625 23.376Z" stroke="url(#paint3_linear_2019_11837)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M4.10938 23.1494C4.10948 13.8491 12.0095 6.32054 21.6318 6.76855L21.6348 6.76953C30.2166 7.12798 37.1471 13.9677 37.542 22.374C37.9064 30.0649 32.8643 36.6625 25.8018 38.8135L25.7998 38.8145C23.9117 39.3996 22.2763 40.5733 21.2051 42.2158L21.1992 42.2256L20.832 42.8154L20.4463 42.2178H20.4453C19.41 40.6124 17.8099 39.4008 15.9736 38.8438L15.9697 38.8428L15.3301 38.6406C8.78478 36.4194 4.10938 30.3116 4.10938 23.1494Z" stroke="url(#paint4_linear_2019_11837)"/>
+<path d="M4.10938 23.1494C4.10948 13.8491 12.0095 6.32054 21.6318 6.76855L21.6348 6.76953C30.2166 7.12798 37.1471 13.9677 37.542 22.374C37.9064 30.0649 32.8643 36.6625 25.8018 38.8135L25.7998 38.8145C23.9117 39.3996 22.2763 40.5733 21.2051 42.2158L21.1992 42.2256L20.832 42.8154L20.4463 42.2178H20.4453C19.41 40.6124 17.8099 39.4008 15.9736 38.8438L15.9697 38.8428L15.3301 38.6406C8.78478 36.4194 4.10938 30.3116 4.10938 23.1494Z" stroke="url(#paint5_linear_2019_11837)"/>
+<path opacity="0.78" d="M22.2622 16.9459C22.2622 16.9459 21.7354 16.6533 20.8314 16.6761C19.9274 16.6533 19.4014 16.9459 19.4014 16.9459V18.0434H22.2622V16.9459L22.2622 16.9459ZM26.1839 31.8599C26.1839 31.8599 26.1839 22.5112 26.1839 21.9991C26.1839 21.487 25.8604 21.3162 25.8604 21.3162L22.276 18.4613H19.3876L15.8032 21.3162C15.8032 21.3162 15.4789 21.487 15.4789 21.9991C15.4789 22.5112 15.4789 31.8599 15.4789 31.8599C15.4789 31.8599 15.3537 33.3248 16.9503 33.3248H19.4014C20.8558 33.3248 22.2622 33.3248 22.2622 33.3248H24.7133C26.3091 33.3248 26.1839 31.8599 26.1839 31.8599ZM24.7125 28.3172C24.7125 28.4781 24.5775 28.6098 24.4117 28.6098H22.2208C22.0549 28.6098 21.9208 28.4781 21.9208 28.3172V23.4819C21.9208 23.3193 22.0549 23.1884 22.2208 23.1884H24.4117C24.5775 23.1884 24.7125 23.3193 24.7125 23.4819V28.3172L24.7125 28.3172Z" fill="white"/>
+<defs>
+<filter id="filter0_i_2019_11837" x="5.90625" y="8.5459" width="29.8594" height="32.9082" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_2019_11837"/>
+</filter>
+<linearGradient id="paint0_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint3_linear_2019_11837" x1="20.835" y1="33.9923" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint4_linear_2019_11837" x1="20.8349" y1="6.25" x2="20.8349" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="#151C3B" stop-opacity="0"/>
+<stop offset="1" stop-color="#151C3B"/>
+</linearGradient>
+<linearGradient id="paint5_linear_2019_11837" x1="20.8349" y1="36.3281" x2="20.8349" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>

Разница между файлами не показана из-за своего большого размера
+ 12 - 0
public/supply-chain/BasePointIcon_seed.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_aquatic.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_freshfood.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_fruit.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_grain.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_livestock.svg


Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_oil.svg


+ 48 - 0
public/supply-chain/SupplyChainIcons_salt.svg

@@ -0,0 +1,48 @@
+<svg width="42" height="50" viewBox="0 0 42 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2019_11837)">
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="#151C3B"/>
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="url(#paint0_linear_2019_11837)" style="mix-blend-mode:overlay"/>
+<path d="M35.7472 22.6746C36.073 29.636 31.5656 35.599 25.2662 37.5417C23.7185 38.0274 22.388 38.9987 21.5191 40.3478L20.8403 41.4541L20.1343 40.3478C19.2926 39.0257 17.9892 38.0274 16.4958 37.5687C10.3593 35.7339 5.90625 30.0677 5.90625 23.3762C5.90625 14.9578 12.966 8.15835 21.5462 8.56308C29.2033 8.88686 35.3942 15.0657 35.7472 22.6746Z" fill="url(#paint1_linear_2019_11837)" style="mix-blend-mode:overlay"/>
+</g>
+<path d="M6.15625 23.376C6.15635 15.101 13.0962 8.41465 21.5342 8.8125H21.5361C29.0638 9.13103 35.1501 15.2073 35.4971 22.6865C35.8173 29.5292 31.3874 35.3922 25.1924 37.3027H25.1914C23.5919 37.8047 22.2114 38.8112 21.3086 40.2129L21.3057 40.2168L20.835 40.9824L20.3447 40.2129H20.3438C19.4704 38.8418 18.1196 37.8063 16.5693 37.3301L16.5674 37.3291C10.5335 35.525 6.15625 29.9536 6.15625 23.376Z" stroke="url(#paint2_linear_2019_11837)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M6.15625 23.376C6.15635 15.101 13.0962 8.41465 21.5342 8.8125H21.5361C29.0638 9.13103 35.1501 15.2073 35.4971 22.6865C35.8173 29.5292 31.3874 35.3922 25.1924 37.3027H25.1914C23.5919 37.8047 22.2114 38.8112 21.3086 40.2129L21.3057 40.2168L20.835 40.9824L20.3447 40.2129H20.3438C19.4704 38.8418 18.1196 37.8063 16.5693 37.3301L16.5674 37.3291C10.5335 35.525 6.15625 29.9536 6.15625 23.376Z" stroke="url(#paint3_linear_2019_11837)" stroke-width="0.5" style="mix-blend-mode:overlay"/>
+<path d="M4.10938 23.1494C4.10948 13.8491 12.0095 6.32054 21.6318 6.76855L21.6348 6.76953C30.2166 7.12798 37.1471 13.9677 37.542 22.374C37.9064 30.0649 32.8643 36.6625 25.8018 38.8135L25.7998 38.8145C23.9117 39.3996 22.2763 40.5733 21.2051 42.2158L21.1992 42.2256L20.832 42.8154L20.4463 42.2178H20.4453C19.41 40.6124 17.8099 39.4008 15.9736 38.8438L15.9697 38.8428L15.3301 38.6406C8.78478 36.4194 4.10938 30.3116 4.10938 23.1494Z" stroke="url(#paint4_linear_2019_11837)"/>
+<path d="M4.10938 23.1494C4.10948 13.8491 12.0095 6.32054 21.6318 6.76855L21.6348 6.76953C30.2166 7.12798 37.1471 13.9677 37.542 22.374C37.9064 30.0649 32.8643 36.6625 25.8018 38.8135L25.7998 38.8145C23.9117 39.3996 22.2763 40.5733 21.2051 42.2158L21.1992 42.2256L20.832 42.8154L20.4463 42.2178H20.4453C19.41 40.6124 17.8099 39.4008 15.9736 38.8438L15.9697 38.8428L15.3301 38.6406C8.78478 36.4194 4.10938 30.3116 4.10938 23.1494Z" stroke="url(#paint5_linear_2019_11837)"/>
+<path opacity="0.78" d="M22.2622 16.9459C22.2622 16.9459 21.7354 16.6533 20.8314 16.6761C19.9274 16.6533 19.4014 16.9459 19.4014 16.9459V18.0434H22.2622V16.9459L22.2622 16.9459ZM26.1839 31.8599C26.1839 31.8599 26.1839 22.5112 26.1839 21.9991C26.1839 21.487 25.8604 21.3162 25.8604 21.3162L22.276 18.4613H19.3876L15.8032 21.3162C15.8032 21.3162 15.4789 21.487 15.4789 21.9991C15.4789 22.5112 15.4789 31.8599 15.4789 31.8599C15.4789 31.8599 15.3537 33.3248 16.9503 33.3248H19.4014C20.8558 33.3248 22.2622 33.3248 22.2622 33.3248H24.7133C26.3091 33.3248 26.1839 31.8599 26.1839 31.8599ZM24.7125 28.3172C24.7125 28.4781 24.5775 28.6098 24.4117 28.6098H22.2208C22.0549 28.6098 21.9208 28.4781 21.9208 28.3172V23.4819C21.9208 23.3193 22.0549 23.1884 22.2208 23.1884H24.4117C24.5775 23.1884 24.7125 23.3193 24.7125 23.4819V28.3172L24.7125 28.3172Z" fill="white"/>
+<defs>
+<filter id="filter0_i_2019_11837" x="5.90625" y="8.5459" width="29.8594" height="32.9082" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_2019_11837"/>
+</filter>
+<linearGradient id="paint0_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_2019_11837" x1="20.835" y1="8.5459" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint3_linear_2019_11837" x1="20.835" y1="33.9923" x2="20.835" y2="41.4541" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint4_linear_2019_11837" x1="20.8349" y1="6.25" x2="20.8349" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="#151C3B" stop-opacity="0"/>
+<stop offset="1" stop-color="#151C3B"/>
+</linearGradient>
+<linearGradient id="paint5_linear_2019_11837" x1="20.8349" y1="36.3281" x2="20.8349" y2="43.75" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>

Разница между файлами не показана из-за своего большого размера
+ 33 - 0
public/supply-chain/SupplyChainIcons_seed.svg


+ 23 - 8
src/client/home/pages/SupplyChainDashboards/GrainOilDashboard.tsx

@@ -11,6 +11,9 @@ import BackgroundGrid from './components/layout/BackgroundGrid';
 import HeaderBar from './components/layout/HeaderBar';
 import HeaderBar from './components/layout/HeaderBar';
 import { IndustryType } from './components/icons/IndustryIcon';
 import { IndustryType } from './components/icons/IndustryIcon';
 
 
+// 导入主题上下文
+import { ThemeProvider, useTheme } from './context/ThemeContext';
+
 // 定义组件接口
 // 定义组件接口
 interface GrainOilDashboardProps {
 interface GrainOilDashboardProps {
   // 可以添加props如果需要
   // 可以添加props如果需要
@@ -31,13 +34,20 @@ interface PopupState {
   };
   };
 }
 }
 
 
-// 主组件
-const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
+// 内部组件,使用ThemeProvider
+const DashboardContent: React.FC = () => {
   const [activeTab, setActiveTab] = useState<IndustryType>('粮食');
   const [activeTab, setActiveTab] = useState<IndustryType>('粮食');
   const [popupState, setPopupState] = useState<PopupState>({
   const [popupState, setPopupState] = useState<PopupState>({
     isVisible: false,
     isVisible: false,
     position: { x: 650, y: 250 }
     position: { x: 650, y: 250 }
   });
   });
+  const { setIndustry } = useTheme();
+
+  // 处理tab切换
+  const handleTabChange = (tab: IndustryType) => {
+    setActiveTab(tab);
+    setIndustry(tab); // 更新主题色
+  };
 
 
   // 处理定位点点击
   // 处理定位点点击
   const handlePointClick = (point: any) => {
   const handlePointClick = (point: any) => {
@@ -77,7 +87,6 @@ const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
     setPopupState(prev => ({ ...prev, isVisible: false }));
     setPopupState(prev => ({ ...prev, isVisible: false }));
   };
   };
 
 
-
   return (
   return (
     <div className="h-[1080px] w-[1920px] bg-[#0a1a3a] relative overflow-hidden">
     <div className="h-[1080px] w-[1920px] bg-[#0a1a3a] relative overflow-hidden">
       {/* 背景 */}
       {/* 背景 */}
@@ -90,7 +99,7 @@ const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
       {/* 左侧导航 */}
       {/* 左侧导航 */}
       <Navigation
       <Navigation
         activeTab={activeTab}
         activeTab={activeTab}
-        onTabChange={setActiveTab}
+        onTabChange={handleTabChange}
         availableIndustries={["粮食", "油脂"]}
         availableIndustries={["粮食", "油脂"]}
       />
       />
 
 
@@ -98,16 +107,14 @@ const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
       <SupplyChainMap
       <SupplyChainMap
         onPointClick={handlePointClick}
         onPointClick={handlePointClick}
       />
       />
-      
+
       {/* 右侧供应链合作模式 这个不用主题色*/}
       {/* 右侧供应链合作模式 这个不用主题色*/}
       <SupplyChainModel />
       <SupplyChainModel />
 
 
-
       {/* 左侧数据展示 */}
       {/* 左侧数据展示 */}
       <KeyMetrics
       <KeyMetrics
         title="优质稻米"
         title="优质稻米"
         subtitle="产业链联合体"
         subtitle="产业链联合体"
-        industry={activeTab}
       />
       />
 
 
       {/* 弹出框 */}
       {/* 弹出框 */}
@@ -116,11 +123,19 @@ const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
           data={popupState.data}
           data={popupState.data}
           position={popupState.position}
           position={popupState.position}
           onClose={handleClosePopup}
           onClose={handleClosePopup}
-          industry={activeTab}
         />
         />
       )}
       )}
     </div>
     </div>
   );
   );
 };
 };
 
 
+// 主组件
+const GrainOilDashboard: React.FC<GrainOilDashboardProps> = () => {
+  return (
+    <ThemeProvider defaultIndustry="粮食">
+      <DashboardContent />
+    </ThemeProvider>
+  );
+};
+
 export default GrainOilDashboard;
 export default GrainOilDashboard;

+ 5 - 23
src/client/home/pages/SupplyChainDashboards/components/KeyMetrics.tsx

@@ -1,5 +1,5 @@
 import React from 'react';
 import React from 'react';
-import { IndustryType } from './icons/IndustryIcon';
+import { useTheme } from './../context/ThemeContext';
 
 
 // 定义指标数据类型
 // 定义指标数据类型
 interface MetricData {
 interface MetricData {
@@ -13,30 +13,15 @@ interface KeyMetricsProps {
   metrics?: MetricData[];
   metrics?: MetricData[];
   title?: string;
   title?: string;
   subtitle?: string;
   subtitle?: string;
-  industry?: IndustryType;
 }
 }
 
 
-// 产业主题色映射
-const industryColors: Record<IndustryType, string> = {
-  "粮食": "text-[#c5ff92]",
-  "油脂": "text-[#f6b02e]",
-  "种业": "text-[#5def8b]",
-  "果蔬": "text-[#fff586]",
-  "畜牧": "text-[#f593a5]",
-  "水产": "text-[#6be9ff]",
-  "鲜食": "text-[#de7e66]",
-  "泛盐": "text-[#92a5fe]"
-};
-
 // 数据卡片组件
 // 数据卡片组件
 const DataCard: React.FC<{
 const DataCard: React.FC<{
   title: string;
   title: string;
-  value: string;
   unit: string;
   unit: string;
   digits: string[];
   digits: string[];
-  industry?: IndustryType;
-}> = ({ title, value, unit, digits, industry = "粮食" }) => {
-  const themeColor = industryColors[industry];
+}> = ({ title, unit, digits }) => {
+  const { themeColor } = useTheme();
 
 
   return (
   return (
     <div className="box-border content-stretch flex flex-col gap-[20px] items-start px-0 py-[20px] relative shrink-0 w-[278px]">
     <div className="box-border content-stretch flex flex-col gap-[20px] items-start px-0 py-[20px] relative shrink-0 w-[278px]">
@@ -50,7 +35,7 @@ const DataCard: React.FC<{
           {digits.map((digit, index) => (
           {digits.map((digit, index) => (
             <div key={index} className="h-[80px] relative shrink-0 w-[53.333px]">
             <div key={index} className="h-[80px] relative shrink-0 w-[53.333px]">
               <div className="absolute bg-gradient-to-b border-2 border-[#5e697e] border-solid from-[#474e60] inset-0 rounded-[6px] to-[#2b2f39]" />
               <div className="absolute bg-gradient-to-b border-2 border-[#5e697e] border-solid from-[#474e60] inset-0 rounded-[6px] to-[#2b2f39]" />
-              <div className={`absolute flex flex-col font-bold inset-[16.16%_13.74%] justify-center leading-[0] not-italic ${themeColor} text-[60px] text-center tracking-[6px]`}>
+              <div className="absolute flex flex-col font-bold inset-[16.16%_13.74%] justify-center leading-[0] not-italic text-[60px] text-center tracking-[6px]" style={{ color: themeColor }}>
                 <p className="leading-[normal] whitespace-pre-wrap">{digit}</p>
                 <p className="leading-[normal] whitespace-pre-wrap">{digit}</p>
               </div>
               </div>
             </div>
             </div>
@@ -69,8 +54,7 @@ const DataCard: React.FC<{
 const KeyMetrics: React.FC<KeyMetricsProps> = ({
 const KeyMetrics: React.FC<KeyMetricsProps> = ({
   metrics = [],
   metrics = [],
   title = "优质稻米",
   title = "优质稻米",
-  subtitle = "产业链联合体",
-  industry = "粮食"
+  subtitle = "产业链联合体"
 }) => {
 }) => {
   // 默认指标数据
   // 默认指标数据
   const defaultMetrics: MetricData[] = [
   const defaultMetrics: MetricData[] = [
@@ -115,10 +99,8 @@ const KeyMetrics: React.FC<KeyMetricsProps> = ({
             <DataCard
             <DataCard
               key={index}
               key={index}
               title={metric.title}
               title={metric.title}
-              value={metric.value}
               unit={metric.unit}
               unit={metric.unit}
               digits={metric.digits}
               digits={metric.digits}
-              industry={industry}
             />
             />
           ))}
           ))}
         </div>
         </div>

+ 9 - 19
src/client/home/pages/SupplyChainDashboards/components/PopupInfoBox.tsx

@@ -1,6 +1,7 @@
 import React from 'react';
 import React from 'react';
 import { IndustryType } from './icons/IndustryIcon';
 import { IndustryType } from './icons/IndustryIcon';
 import PopupInfoBoxIcon from './icons/PopupInfoBox';
 import PopupInfoBoxIcon from './icons/PopupInfoBox';
+import { useTheme } from './../context/ThemeContext';
 
 
 // 定义弹出框数据类型
 // 定义弹出框数据类型
 interface PopupData {
 interface PopupData {
@@ -20,25 +21,12 @@ interface PopupInfoBoxProps {
   industry?: IndustryType;
   industry?: IndustryType;
 }
 }
 
 
-// 产业主题色映射
-const industryColors: Record<IndustryType, string> = {
-  "粮食": "text-lime-200",
-  "油脂": "text-[#f6b02e]",
-  "种业": "text-[#5def8b]",
-  "果蔬": "text-[#fff586]",
-  "畜牧": "text-[#f593a5]",
-  "水产": "text-[#6be9ff]",
-  "鲜食": "text-[#de7e66]",
-  "泛盐": "text-[#92a5fe]"
-};
-
 const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
 const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
   data,
   data,
   position = { x: 717.28, y: 273.13 },
   position = { x: 717.28, y: 273.13 },
-  onClose,
-  industry = "粮食"
+  onClose
 }) => {
 }) => {
-  const themeColor = industryColors[industry];
+  const { themeColor } = useTheme();
   // 默认数据
   // 默认数据
   const defaultData: PopupData = {
   const defaultData: PopupData = {
     title: "源头",
     title: "源头",
@@ -66,7 +54,9 @@ const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
       <div className="h-[320px] relative shrink-0 w-[573px]">
       <div className="h-[320px] relative shrink-0 w-[573px]">
         {/* 边框背景 */}
         {/* 边框背景 */}
         <div className="absolute inset-0">
         <div className="absolute inset-0">
-          <PopupInfoBoxIcon className="size-full" />
+          <PopupInfoBoxIcon
+            className="size-full"
+          />
         </div>
         </div>
 
 
         {/* 内容区域 */}
         {/* 内容区域 */}
@@ -74,7 +64,7 @@ const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
           {/* 标题区域 */}
           {/* 标题区域 */}
           <div className="content-stretch flex flex-col gap-[12px] items-start relative shrink-0 w-full">
           <div className="content-stretch flex flex-col gap-[12px] items-start relative shrink-0 w-full">
             <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
             <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
-              <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap ${themeColor}`}>
+              <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap text-[${themeColor}]`}>
                 <p className="leading-[32px]">{displayData.title}</p>
                 <p className="leading-[32px]">{displayData.title}</p>
               </div>
               </div>
             </div>
             </div>
@@ -95,7 +85,7 @@ const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
                 </div>
                 </div>
               </div>
               </div>
               <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
               <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
-                <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap ${themeColor}`}>
+                <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap text-[${themeColor}]`}>
                   <p className="leading-[32px]">{displayData.metrics[0]?.value}</p>
                   <p className="leading-[32px]">{displayData.metrics[0]?.value}</p>
                 </div>
                 </div>
               </div>
               </div>
@@ -113,7 +103,7 @@ const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
                 </div>
                 </div>
               </div>
               </div>
               <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
               <div className="box-border content-stretch flex gap-[10px] items-center px-0 py-[4px] relative shrink-0">
-                <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap ${themeColor}`}>
+                <div className={`flex flex-col font-bold justify-center leading-[0] not-italic relative shrink-0 text-[36px] whitespace-nowrap text-[${themeColor}]`}>
                   <p className="leading-[32px]">{displayData.metrics[1]?.value}</p>
                   <p className="leading-[32px]">{displayData.metrics[1]?.value}</p>
                 </div>
                 </div>
               </div>
               </div>

+ 0 - 2
src/client/home/pages/SupplyChainDashboards/components/SupplyChainMap.tsx

@@ -1,8 +1,6 @@
 import React from 'react';
 import React from 'react';
 import BasePointIcon from './icons/BasePointIcon';
 import BasePointIcon from './icons/BasePointIcon';
 import SupplyChainIcons from './icons/SupplyChainIcons';
 import SupplyChainIcons from './icons/SupplyChainIcons';
-import Img7 from './icons/Img7';
-import SupplyChainNetwork from './icons/SupplyChainNetwork';
 
 
 // 定义定位点类型
 // 定义定位点类型
 interface LocationPoint {
 interface LocationPoint {

Разница между файлами не показана из-за своего большого размера
+ 20 - 12
src/client/home/pages/SupplyChainDashboards/components/icons/BasePointIcon.tsx


+ 2 - 0
src/client/home/pages/SupplyChainDashboards/components/icons/Img5.tsx

@@ -1,4 +1,5 @@
 import React from 'react';
 import React from 'react';
+import { useTheme } from '../../context/ThemeContext';
 
 
 interface Img5Props {
 interface Img5Props {
   className?: string;
   className?: string;
@@ -15,6 +16,7 @@ const Img5: React.FC<Img5Props> = ({
   width,
   width,
   height
   height
 }) => {
 }) => {
+  const { themeColor } = useTheme();
   return (
   return (
     <svg height="50" width="50" fill="none" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
     <svg height="50" width="50" fill="none" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
 	<path d="M28.1795 7.10254C28.1795 7.10254 27.0088 6.45224 25 6.5028C22.9911 6.45224 21.8222 7.10254 21.8222 7.10254V9.54132H28.1795V7.10254L28.1795 7.10254ZM36.8945 40.2447C36.8945 40.2447 36.8945 19.4698 36.8945 18.3318C36.8945 17.1937 36.1755 16.8143 36.1755 16.8143L28.2103 10.4699H21.7915L13.8263 16.8143C13.8263 16.8143 13.1055 17.1937 13.1055 18.3318C13.1055 19.4698 13.1055 40.2447 13.1055 40.2447C13.1055 40.2447 12.8273 43.5 16.3753 43.5H21.8222C25.0542 43.5 28.1795 43.5 28.1795 43.5H33.6263C37.1727 43.5 36.8945 40.2447 36.8945 40.2447ZM33.6245 32.372C33.6245 32.7296 33.3247 33.0223 32.9561 33.0223H28.0874C27.7189 33.0223 27.4208 32.7296 27.4208 32.372V21.6268C27.4208 21.2656 27.7189 20.9747 28.0874 20.9747H32.9562C33.3247 20.9747 33.6246 21.2656 33.6246 21.6268V32.372L33.6245 32.372Z" fill="white" fillOpacity="0.5" opacity="0.78"/>
 	<path d="M28.1795 7.10254C28.1795 7.10254 27.0088 6.45224 25 6.5028C22.9911 6.45224 21.8222 7.10254 21.8222 7.10254V9.54132H28.1795V7.10254L28.1795 7.10254ZM36.8945 40.2447C36.8945 40.2447 36.8945 19.4698 36.8945 18.3318C36.8945 17.1937 36.1755 16.8143 36.1755 16.8143L28.2103 10.4699H21.7915L13.8263 16.8143C13.8263 16.8143 13.1055 17.1937 13.1055 18.3318C13.1055 19.4698 13.1055 40.2447 13.1055 40.2447C13.1055 40.2447 12.8273 43.5 16.3753 43.5H21.8222C25.0542 43.5 28.1795 43.5 28.1795 43.5H33.6263C37.1727 43.5 36.8945 40.2447 36.8945 40.2447ZM33.6245 32.372C33.6245 32.7296 33.3247 33.0223 32.9561 33.0223H28.0874C27.7189 33.0223 27.4208 32.7296 27.4208 32.372V21.6268C27.4208 21.2656 27.7189 20.9747 28.0874 20.9747H32.9562C33.3247 20.9747 33.6246 21.2656 33.6246 21.6268V32.372L33.6245 32.372Z" fill="white" fillOpacity="0.5" opacity="0.78"/>

+ 4 - 13
src/client/home/pages/SupplyChainDashboards/components/icons/IndustryIcon.tsx

@@ -1,6 +1,7 @@
 import React from 'react';
 import React from 'react';
 import GrainIcon from './GrainIcon';
 import GrainIcon from './GrainIcon';
 import OilIcon from './OilIcon';
 import OilIcon from './OilIcon';
+import { useTheme } from '../../context/ThemeContext';
 
 
 // 定义产业类型
 // 定义产业类型
 export type IndustryType = "粮食" | "油脂" | "种业" | "果蔬" | "畜牧" | "水产" | "鲜食" | "泛盐";
 export type IndustryType = "粮食" | "油脂" | "种业" | "果蔬" | "畜牧" | "水产" | "鲜食" | "泛盐";
@@ -12,17 +13,6 @@ interface IndustryIconProps {
   isActive?: boolean;
   isActive?: boolean;
 }
 }
 
 
-// 产业主题色映射
-const industryColors: Record<IndustryType, string> = {
-  "粮食": "text-[#c5ff92]",
-  "油脂": "text-[#f6b02e]",
-  "种业": "text-[#5def8b]",
-  "果蔬": "text-[#fff586]",
-  "畜牧": "text-[#f593a5]",
-  "水产": "text-[#6be9ff]",
-  "鲜食": "text-[#de7e66]",
-  "泛盐": "text-[#92a5fe]"
-};
 
 
 // 统一的产业图标组件
 // 统一的产业图标组件
 const IndustryIcon: React.FC<IndustryIconProps> = ({
 const IndustryIcon: React.FC<IndustryIconProps> = ({
@@ -30,8 +20,9 @@ const IndustryIcon: React.FC<IndustryIconProps> = ({
   industry,
   industry,
   isActive = true
   isActive = true
 }) => {
 }) => {
-  const themeColor = industryColors[industry];
-  const iconColor = isActive ? themeColor : "text-white opacity-50";
+  const { themeColor } = useTheme();
+  const themeColorClass = `text-[${themeColor}]`;
+  const iconColor = isActive ? themeColorClass : "text-white opacity-50";
 
 
   // 根据产业类型渲染对应的图标组件
   // 根据产业类型渲染对应的图标组件
   const renderIcon = () => {
   const renderIcon = () => {

+ 10 - 8
src/client/home/pages/SupplyChainDashboards/components/icons/PopupInfoBox.tsx

@@ -1,4 +1,5 @@
 import React from 'react';
 import React from 'react';
+import { useTheme } from '../../context/ThemeContext';
 
 
 interface PopupInfoBoxProps {
 interface PopupInfoBoxProps {
   className?: string;
   className?: string;
@@ -15,17 +16,18 @@ const PopupInfoBox: React.FC<PopupInfoBoxProps> = ({
   width,
   width,
   height
   height
 }) => {
 }) => {
+  const { themeColor } = useTheme();
   return (
   return (
     <svg height="320" width="573" fill="none" viewBox="0 0 573 320" xmlns="http://www.w3.org/2000/svg">
     <svg height="320" width="573" fill="none" viewBox="0 0 573 320" xmlns="http://www.w3.org/2000/svg">
 	<g clipPath="url(#clip0_2019_16940)">
 	<g clipPath="url(#clip0_2019_16940)">
-		<path d="M556 310.5H476" stroke="#C5FF92" strokeLinecap="square" strokeWidth="2"/>
-		<path d="M570.807 311.5C570.807 308.017 567.983 305.193 564.5 305.193C561.017 305.193 558.194 308.017 558.194 311.5C558.194 314.983 561.017 317.806 564.5 317.806C567.983 317.806 570.807 314.983 570.807 311.5Z" fill="#C5FF92" fillRule="evenodd"/>
-		<path d="M572.5 311.5C572.5 307.082 568.918 303.5 564.5 303.5C560.082 303.5 556.5 307.082 556.5 311.5C556.5 315.918 560.082 319.5 564.5 319.5C568.918 319.5 572.5 315.918 572.5 311.5Z" stroke="#C5FF92"/>
-		<path d="M182.063 319.4L158.623 299.542L158.456 299.4H0.600098V0.600342H133.606L154.875 12.1892L155.009 12.2625H337.834L337.968 12.1902L359.41 0.600342H475.304V289.936L449.445 319.4H182.063Z" fill="#231F20" fillOpacity="0.5" stroke="#C5FF92" strokeWidth="1.2"/>
-		<path d="M455.724 320L475.912 297.143L476 320H455.724Z" fill="#C5FF92" fillRule="evenodd"/>
-		<path d="M475.276 7.8291V0.713871H469.196" stroke="#C5FF92" strokeLinecap="square" strokeWidth="1.8"/>
-		<path d="M0.484528 7.8291V0.713871H6.56445" stroke="#C5FF92" strokeLinecap="square" strokeWidth="1.8"/>
-		<path d="M208.979 319.286L182.08 318.929L158.835 299.286H138.571" stroke="#C5FF92" strokeLinecap="square" strokeWidth="1.8"/>
+		<path d="M556 310.5H476" stroke={themeColor} strokeLinecap="square" strokeWidth="2"/>
+		<path d="M570.807 311.5C570.807 308.017 567.983 305.193 564.5 305.193C561.017 305.193 558.194 308.017 558.194 311.5C558.194 314.983 561.017 317.806 564.5 317.806C567.983 317.806 570.807 314.983 570.807 311.5Z" fill={themeColor} fillRule="evenodd"/>
+		<path d="M572.5 311.5C572.5 307.082 568.918 303.5 564.5 303.5C560.082 303.5 556.5 307.082 556.5 311.5C556.5 315.918 560.082 319.5 564.5 319.5C568.918 319.5 572.5 315.918 572.5 311.5Z" stroke={themeColor}/>
+		<path d="M182.063 319.4L158.623 299.542L158.456 299.4H0.600098V0.600342H133.606L154.875 12.1892L155.009 12.2625H337.834L337.968 12.1902L359.41 0.600342H475.304V289.936L449.445 319.4H182.063Z" fill="#231F20" fillOpacity="0.5" stroke={themeColor} strokeWidth="1.2"/>
+		<path d="M455.724 320L475.912 297.143L476 320H455.724Z" fill={themeColor} fillRule="evenodd"/>
+		<path d="M475.276 7.8291V0.713871H469.196" stroke={themeColor} strokeLinecap="square" strokeWidth="1.8"/>
+		<path d="M0.484528 7.8291V0.713871H6.56445" stroke={themeColor} strokeLinecap="square" strokeWidth="1.8"/>
+		<path d="M208.979 319.286L182.08 318.929L158.835 299.286H138.571" stroke={themeColor} strokeLinecap="square" strokeWidth="1.8"/>
 	</g>
 	</g>
 	<defs>
 	<defs>
 		<clipPath id="clip0_2019_16940">
 		<clipPath id="clip0_2019_16940">

Разница между файлами не показана из-за своего большого размера
+ 20 - 22
src/client/home/pages/SupplyChainDashboards/components/icons/SupplyChainIcons.tsx


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
src/client/home/pages/SupplyChainDashboards/components/icons/Union.tsx


+ 61 - 0
src/client/home/pages/SupplyChainDashboards/context/ThemeContext.tsx

@@ -0,0 +1,61 @@
+import React, { createContext, useContext, useState, ReactNode } from 'react';
+
+export type IndustryType = "粮食" | "油脂" | "种业" | "果蔬" | "畜牧" | "水产" | "鲜食" | "泛盐";
+
+// 产业主题色映射
+const industryColors: Record<IndustryType, string> = {
+  "粮食": "#C5FF92",
+  "油脂": "#f6b02e",
+  "种业": "#5def8b",
+  "果蔬": "#fff586",
+  "畜牧": "#f593a5",
+  "水产": "#6be9ff",
+  "鲜食": "#de7e66",
+  "泛盐": "#92a5fe"
+};
+
+interface ThemeContextType {
+  currentIndustry: IndustryType;
+  themeColor: string;
+  setIndustry: (industry: IndustryType) => void;
+}
+
+const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
+
+interface ThemeProviderProps {
+  children: ReactNode;
+  defaultIndustry?: IndustryType;
+}
+
+export const ThemeProvider: React.FC<ThemeProviderProps> = ({
+  children,
+  defaultIndustry = "粮食"
+}) => {
+  const [currentIndustry, setCurrentIndustry] = useState<IndustryType>(defaultIndustry);
+
+  const themeColor = industryColors[currentIndustry];
+
+  const setIndustry = (industry: IndustryType) => {
+    setCurrentIndustry(industry);
+  };
+
+  return (
+    <ThemeContext.Provider value={{
+      currentIndustry,
+      themeColor,
+      setIndustry
+    }}>
+      {children}
+    </ThemeContext.Provider>
+  );
+};
+
+export const useTheme = (): ThemeContextType => {
+  const context = useContext(ThemeContext);
+  if (!context) {
+    throw new Error('useTheme must be used within a ThemeProvider');
+  }
+  return context;
+};
+
+export default ThemeContext;

Некоторые файлы не были показаны из-за большого количества измененных файлов