Merge branch 'dev' into dev-yj

This commit is contained in:
yjnoh 2024-09-10 17:21:32 +09:00
commit b6e0ad4053
111 changed files with 2773 additions and 67 deletions

View File

@ -1,6 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
reactStrictMode: false,
swcMinify: true,
webpack: (config) => {
config.resolve.fallback = { fs: false }

View File

@ -26,6 +26,7 @@
"react-datepicker": "^7.3.0",
"react-dom": "^18",
"react-hook-form": "^7.53.0",
"react-draggable": "^4.4.6",
"react-icons": "^5.3.0",
"react-responsive-modal": "^6.4.2",
"react-toastify": "^10.0.5",

12
public/assets/img/doc.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>doc-document</title>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon" fill="#000000" transform="translate(71.778133, 42.666667)">
<path d="M28.864,383.082667 L34.368,383.082667 C47.5093333,383.082667 57.2373333,380.928 63.5733333,376.661333 C69.12,372.970667 73.1306667,367.296 75.584,359.573333 C77.3973333,353.856 78.3146667,347.776 78.3146667,341.312 C78.3146667,334.378667 77.2693333,327.957333 75.1573333,322.048 C73.024,316.138667 70.144,311.530667 66.4746667,308.202667 C62.976,305.088 58.9866667,302.954667 54.528,301.845333 C50.0693333,300.736 43.3493333,300.16 34.368,300.16 L28.864,300.16 L28.864,383.082667 Z M-1.42108547e-14,405.696 L-1.42108547e-14,277.568 L35.456,277.568 C50.5386667,277.568 62.5706667,279.018667 71.616,281.92 C83.4346667,285.717333 92.4586667,292.757333 98.7306667,303.018667 C105.002667,313.301333 108.16,326.186667 108.16,341.674667 C108.16,357.589333 105.002667,370.581333 98.7306667,380.650667 C90.9013333,393.344 78.8053333,401.088 62.4,403.797333 C54.8693333,405.056 45.2266667,405.696 33.472,405.696 L-1.42108547e-14,405.696 Z M186.389333,297.915733 C175.957333,297.915733 167.914667,302.2464 162.24,310.929067 C157.12,318.779733 154.56,328.827733 154.56,341.115733 C154.56,355.345067 157.589333,366.395733 163.690667,374.225067 C169.408,381.649067 177.024,385.339733 186.474667,385.339733 C196.842667,385.339733 204.928,380.987733 210.709333,372.219733 C215.829333,364.5184 218.389333,354.3424 218.389333,341.6704 C218.389333,327.739733 215.338667,316.881067 209.258667,309.0304 C203.541333,301.627733 195.904,297.915733 186.389333,297.915733 M186.474667,275.3024 C206.613333,275.3024 222.037333,281.681067 232.768,294.481067 C243.072,306.705067 248.213333,322.427733 248.213333,341.6704 C248.213333,362.705067 242.133333,379.4304 229.973333,391.8464 C219.477333,402.577067 204.970667,407.931733 186.474667,407.931733 C166.357333,407.931733 150.912,401.553067 140.181333,388.7744 C129.877333,376.5504 124.714667,360.571733 124.714667,340.859733 C124.714667,320.251733 130.816,303.7184 142.997333,291.3024 C153.536,280.635733 168.042667,275.3024 186.474667,275.3024 M362.7456,375.477333 L371.172267,398.538667 C363.556267,402.229333 356.942933,404.704 351.268267,406.005333 C345.5936,407.285333 338.596267,407.925333 330.2976,407.925333 C317.7536,407.925333 307.3856,406.133333 299.1936,402.528 C287.716267,397.450667 279.076267,389.472 273.252267,378.570667 C268.004267,368.8 265.380267,356.853333 265.380267,342.752 C265.380267,318.965333 272.6336,300.917333 287.1616,288.693333 C297.700267,279.776 311.6096,275.317333 328.846933,275.317333 C336.206933,275.317333 342.884267,275.978667 348.9216,277.322667 C354.9376,278.688 361.7856,281.077333 369.422933,284.512 L359.758933,306.229333 C349.582933,300.682667 339.812267,297.909333 330.468267,297.909333 C319.204267,297.909333 310.5856,301.770667 304.612267,309.472 C298.340267,317.557333 295.204267,328.224 295.204267,341.493333 C295.204267,355.232 298.4896,365.984 305.060267,373.728 C311.630933,381.472 320.6976,385.333333 332.2816,385.333333 C337.508267,385.333333 342.350933,384.650667 346.7456,383.221333 C351.140267,381.813333 356.4736,379.232 362.7456,375.477333 M248.221867,7.10542736e-15 L13.5552,7.10542736e-15 L13.5552,234.666667 L56.2218667,234.666667 L56.2218667,192 L56.2218667,169.6 L56.2218667,42.6666667 L230.5152,42.6666667 L312.221867,124.373333 L312.221867,169.6 L312.221867,192 L312.221867,234.666667 L354.888533,234.666667 L354.888533,106.666667 L248.221867,7.10542736e-15 L248.221867,7.10542736e-15 Z" id="DOC">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.29289 1.29289C9.48043 1.10536 9.73478 1 10 1H18C19.6569 1 21 2.34315 21 4V9C21 9.55228 20.5523 10 20 10C19.4477 10 19 9.55228 19 9V4C19 3.44772 18.5523 3 18 3H11V8C11 8.55228 10.5523 9 10 9H5V20C5 20.5523 5.44772 21 6 21H7C7.55228 21 8 21.4477 8 22C8 22.5523 7.55228 23 7 23H6C4.34315 23 3 21.6569 3 20V8C3 7.73478 3.10536 7.48043 3.29289 7.29289L9.29289 1.29289ZM6.41421 7H9V4.41421L6.41421 7ZM19 12C19.5523 12 20 12.4477 20 13V19H23C23.5523 19 24 19.4477 24 20C24 20.5523 23.5523 21 23 21H19C18.4477 21 18 20.5523 18 20V13C18 12.4477 18.4477 12 19 12ZM11.8137 12.4188C11.4927 11.9693 10.8682 11.8653 10.4188 12.1863C9.96935 12.5073 9.86526 13.1318 10.1863 13.5812L12.2711 16.5L10.1863 19.4188C9.86526 19.8682 9.96935 20.4927 10.4188 20.8137C10.8682 21.1347 11.4927 21.0307 11.8137 20.5812L13.5 18.2205L15.1863 20.5812C15.5073 21.0307 16.1318 21.1347 16.5812 20.8137C17.0307 20.4927 17.1347 19.8682 16.8137 19.4188L14.7289 16.5L16.8137 13.5812C17.1347 13.1318 17.0307 12.5073 16.5812 12.1863C16.1318 11.8653 15.5073 11.9693 15.1863 12.4188L13.5 14.7795L11.8137 12.4188Z" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19 9V17.8C19 18.9201 19 19.4802 18.782 19.908C18.5903 20.2843 18.2843 20.5903 17.908 20.782C17.4802 21 16.9201 21 15.8 21H8.2C7.07989 21 6.51984 21 6.09202 20.782C5.71569 20.5903 5.40973 20.2843 5.21799 19.908C5 19.4802 5 18.9201 5 17.8V6.2C5 5.07989 5 4.51984 5.21799 4.09202C5.40973 3.71569 5.71569 3.40973 6.09202 3.21799C6.51984 3 7.0799 3 8.2 3H13M19 9L13 3M19 9H14C13.4477 9 13 8.55228 13 8V3" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 720 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.02693 18.329C4.18385 19.277 5.0075 20 6 20H18C19.1046 20 20 19.1046 20 18V14.1901M4.02693 18.329C4.00922 18.222 4 18.1121 4 18V6C4 4.89543 4.89543 4 6 4H18C19.1046 4 20 4.89543 20 6V14.1901M4.02693 18.329L7.84762 14.5083C8.52765 13.9133 9.52219 13.8482 10.274 14.3494L10.7832 14.6888C11.5078 15.1719 12.4619 15.1305 13.142 14.5865L15.7901 12.4679C16.4651 11.9279 17.4053 11.8856 18.1228 12.3484C18.2023 12.3997 18.2731 12.4632 18.34 12.5302L20 14.1901M11 9C11 10.1046 10.1046 11 9 11C7.89543 11 7 10.1046 7 9C7 7.89543 7.89543 7 9 7C10.1046 7 11 7.89543 11 9Z" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 885 B

26
public/assets/img/ppt.svg Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#000000" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="800px" height="800px" viewBox="0 0 585.918 585.918"
xml:space="preserve">
<g>
<path d="M357.396,535.33c0.776,0.042,1.542,0.109,2.329,0.109h177.39c20.75,0,37.627-16.883,37.627-37.627V86.597
c0-20.743-16.877-37.628-37.627-37.628h-177.39c-0.781,0-1.553,0.077-2.329,0.113V0L11.176,46.206v492.311l346.22,47.401V535.33z
M359.726,70.476h177.39c8.893,0,16.125,7.236,16.125,16.126v411.22c0,8.888-7.232,16.127-16.125,16.127h-177.39
c-0.792,0-1.563-0.127-2.329-0.243V319.212c9.92,37.738,44.168,65.606,85.018,65.606c48.611,0,88.013-39.401,88.013-88.007h-88.013
v-88.017c-40.854,0-75.103,27.872-85.018,65.612V70.711C358.162,70.599,358.929,70.476,359.726,70.476z M116.427,297.106
c-8.17,8.126-20.147,11.705-33.982,11.596c-3.055-0.026-5.795-0.21-7.918-0.551v39.438l-22.657-0.571V239.328
c7.003-1.467,16.906-2.708,31.021-3.081c14.475-0.381,24.903,2.338,31.956,8.166c6.806,5.532,11.401,14.833,11.401,25.888
C126.253,281.363,122.76,290.754,116.427,297.106z M212.05,297.273c-8.89,8.489-21.942,12.211-36.998,12.1
c-3.318-0.021-6.302-0.214-8.601-0.572v41.136l-24.651-0.631V237.053c7.622-1.542,18.384-2.838,33.741-3.245
c15.75-0.409,27.108,2.402,34.796,8.475c7.401,5.774,12.422,15.483,12.422,27.021C222.759,280.848,218.938,290.659,212.05,297.273z
M324.891,254.173l-34.302,0.56v98.364l-27.779-0.709v-97.209l-32.043,0.527V233.22l94.124-2.441V254.173z"/>
<path d="M84.122,255.121c-4.738,0.086-7.93,0.63-9.596,1.155v32.57c1.963,0.488,4.396,0.65,7.756,0.64
c12.438-0.023,20.191-6.833,20.191-18.266C102.474,260.938,95.817,254.916,84.122,255.121z"/>
<path d="M176.879,253.491c-5.145,0.087-8.622,0.662-10.422,1.205v33.966c2.139,0.512,4.779,0.672,8.428,0.672
c13.546-0.022,21.984-7.126,21.984-19.066C196.869,259.539,189.604,253.266,176.879,253.491z"/>
<path d="M454.362,282.922v0.026h88.018c0-24.753-10.269-47.092-26.725-63.08L454.362,282.922z"/>
<path d="M453.428,267.457l62.228-62.231c-17.501-17.512-39.339-26.047-62.29-25.72l0.042,87.93L453.428,267.457z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,3 @@
<svg width="5" height="8" viewBox="0 0 5 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 6.5L3.5 4L1 1.5" stroke="#898989" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 166 B

View File

@ -0,0 +1,3 @@
<svg width="5" height="8" viewBox="0 0 5 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 6.5L3.5 4L1 1.5" stroke="#101010" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 166 B

View File

@ -0,0 +1,3 @@
<svg width="11" height="9" viewBox="0 0 11 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3.18182L4.5 7L10 1" stroke="#101010" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 171 B

View File

@ -0,0 +1,3 @@
<svg width="11" height="9" viewBox="0 0 11 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3.18182L4.5 7L10 1" stroke="#898989" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 171 B

View File

@ -0,0 +1,3 @@
<svg width="5" height="8" viewBox="0 0 5 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 6.5L3.5 4L1 1.5" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 164 B

View File

@ -0,0 +1,8 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="elements">
<path id="Rectangle 2056" d="M9.4 1.8H8.6C5.01733 1.8 3.22599 1.8 2.11299 2.913C1 4.02599 1 5.81733 1 9.4C1 12.9827 1 14.774 2.11299 15.887C3.22599 17 5.01733 17 8.6 17C12.1827 17 13.974 17 15.087 15.887C16.2 14.774 16.2 12.9827 16.2 9.4V8.6" stroke="#AAAAAA" stroke-width="1.5" stroke-linecap="round"/>
<path id="Ellipse 40" d="M17 3.8C17 5.3464 15.7464 6.6 14.2 6.6C12.6536 6.6 11.4 5.3464 11.4 3.8C11.4 2.2536 12.6536 1 14.2 1C15.7464 1 17 2.2536 17 3.8Z" stroke="#AAAAAA" stroke-width="1.5"/>
<path id="Vector 4052" d="M5 8.2H8.2" stroke="#AAAAAA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector 4053" d="M5 12.2H11.4" stroke="#AAAAAA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 871 B

View File

@ -0,0 +1,7 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.4 2V6.80001M2 4.4H6.80001" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.4004 14.7999L16.4004 5.9999M6.00039 16.3999H14.8004M14.8004 4.3999H10.0004M4.40039 9.99991V14.7999" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.7998 4.39981C14.7998 3.64556 14.7998 3.26843 15.0341 3.03412C15.2684 2.7998 15.6456 2.7998 16.3998 2.7998C17.1541 2.7998 17.5312 2.7998 17.7655 3.03412C17.9998 3.26843 17.9998 3.64556 17.9998 4.39981C17.9998 5.15405 17.9998 5.53118 17.7655 5.76549C17.5312 5.99981 17.1541 5.99981 16.3998 5.99981C15.6456 5.99981 15.2684 5.99981 15.0341 5.76549C14.7998 5.53118 14.7998 5.15405 14.7998 4.39981Z" stroke="white" stroke-width="1.5"/>
<path d="M14.7998 16.4003C14.7998 15.646 14.7998 15.2689 15.0341 15.0346C15.2684 14.8003 15.6456 14.8003 16.3998 14.8003C17.1541 14.8003 17.5312 14.8003 17.7655 15.0346C17.9998 15.2689 17.9998 15.646 17.9998 16.4003C17.9998 17.1545 17.9998 17.5317 17.7655 17.766C17.5312 18.0003 17.1541 18.0003 16.3998 18.0003C15.6456 18.0003 15.2684 18.0003 15.0341 17.766C14.7998 17.5317 14.7998 17.1545 14.7998 16.4003Z" stroke="white" stroke-width="1.5"/>
<path d="M2.7998 16.4003C2.7998 15.646 2.7998 15.2689 3.03412 15.0346C3.26843 14.8003 3.64556 14.8003 4.39981 14.8003C5.15405 14.8003 5.53118 14.8003 5.76549 15.0346C5.99981 15.2689 5.99981 15.646 5.99981 16.4003C5.99981 17.1545 5.99981 17.5317 5.76549 17.766C5.53118 18.0003 5.15405 18.0003 4.39981 18.0003C3.64556 18.0003 3.26843 18.0003 3.03412 17.766C2.7998 17.5317 2.7998 17.1545 2.7998 16.4003Z" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.8 10.8C16.3085 10.8 17.0627 10.8 17.5314 11.2686C18 11.7373 18 12.4915 18 14V14.8C18 16.3085 18 17.0627 17.5314 17.5314C17.0627 18 16.3085 18 14.8 18H6.8C4.53726 18 3.40589 18 2.70294 17.2971C2 16.5941 2 15.4627 2 13.2L2 5.2C2 3.69151 2 2.93726 2.46863 2.46863C2.93726 2 3.69151 2 5.2 2L6 2C7.50849 2 8.26274 2 8.73137 2.46863C9.2 2.93726 9.2 3.69151 9.2 5.2" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.3996 10.0001C12.3996 11.3256 11.3251 12.4001 9.99961 12.4001C8.67413 12.4001 7.59961 11.3256 7.59961 10.0001C7.59961 8.67461 8.67413 7.6001 9.99961 7.6001C11.3251 7.6001 12.3996 8.67461 12.3996 10.0001Z" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 812 B

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.62197 10.7968C7.67129 9.79223 7.81092 9.14577 8.20615 8.65018C8.33692 8.48619 8.4857 8.33741 8.64969 8.20663C9.14528 7.81141 9.79175 7.67178 10.7964 7.62245M13.9977 7.6001C15.479 7.61895 16.3285 7.7152 16.9447 8.20663C17.1087 8.33741 17.2575 8.48619 17.3882 8.65018C17.9994 9.41651 17.9994 10.5436 17.9994 12.7977C17.9994 15.0518 17.9994 16.1789 17.3882 16.9452C17.2575 17.1092 17.1087 17.258 16.9447 17.3887C16.1784 17.9999 15.0513 17.9999 12.7972 17.9999C10.5431 17.9999 9.41602 17.9999 8.64969 17.3887C8.4857 17.258 8.33692 17.1092 8.20615 16.9452C7.71471 16.3289 7.61846 15.4794 7.59961 13.9982" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
<path d="M12.378 9.20316C12.3287 10.2078 12.1891 10.8542 11.7939 11.3498C11.6631 11.5138 11.5143 11.6626 11.3503 11.7934C10.8547 12.1886 10.2083 12.3282 9.20364 12.3775M6.00231 12.3999C4.52105 12.3811 3.67154 12.2848 3.0553 11.7934C2.89131 11.6626 2.74253 11.5138 2.61176 11.3498C2.00063 10.5835 2.00063 9.45644 2.00063 7.20232C2.00063 4.9482 2.00063 3.82114 2.61176 3.05481C2.74253 2.89083 2.89131 2.74205 3.0553 2.61127C3.82163 2.00014 4.94869 2.00014 7.20281 2.00014C9.45692 2.00014 10.584 2.00014 11.3503 2.61127C11.5143 2.74205 11.6631 2.89083 11.7939 3.05481C12.2853 3.67105 12.3815 4.52056 12.4004 6.00182" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,6 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.0004 6.7998V9.9998M10.0004 9.9998H7.60039C6.0919 9.9998 5.33765 9.9998 4.86902 10.4684C4.40039 10.9371 4.40039 11.6913 4.40039 13.1998M10.0004 9.9998H12.4004C13.9089 9.9998 14.6631 9.9998 15.1318 10.4684C15.6004 10.9371 15.6004 11.6913 15.6004 13.1998" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2 15.6002C2 14.4688 2 13.9031 2.35147 13.5517C2.70294 13.2002 3.26863 13.2002 4.4 13.2002C5.53137 13.2002 6.09706 13.2002 6.44853 13.5517C6.8 13.9031 6.8 14.4688 6.8 15.6002C6.8 16.7316 6.8 17.2973 6.44853 17.6487C6.09706 18.0002 5.53137 18.0002 4.4 18.0002C3.26863 18.0002 2.70294 18.0002 2.35147 17.6487C2 17.2973 2 16.7316 2 15.6002Z" stroke="white" stroke-width="1.5"/>
<path d="M13.2002 15.6002C13.2002 14.4688 13.2002 13.9031 13.5517 13.5517C13.9031 13.2002 14.4688 13.2002 15.6002 13.2002C16.7316 13.2002 17.2973 13.2002 17.6487 13.5517C18.0002 13.9031 18.0002 14.4688 18.0002 15.6002C18.0002 16.7316 18.0002 17.2973 17.6487 17.6487C17.2973 18.0002 16.7316 18.0002 15.6002 18.0002C14.4688 18.0002 13.9031 18.0002 13.5517 17.6487C13.2002 17.2973 13.2002 16.7316 13.2002 15.6002Z" stroke="white" stroke-width="1.5"/>
<path d="M8.62838 2H11.3712C13.0308 2 13.1998 2.88794 13.1998 4.4C13.1998 5.91206 13.0308 6.8 11.3712 6.8H8.62838C6.96876 6.8 6.7998 5.91206 6.7998 4.4C6.7998 2.88794 6.96876 2 8.62838 2Z" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.7005 7.2C18.2242 5.38686 18.0772 3.81293 17.1321 2.86787C15.1328 0.86853 10.3188 2.44091 6.37987 6.37987C5.95908 6.80066 5.5653 7.23143 5.2 7.66769M14.8 12.3323C14.4347 12.7686 14.0409 13.1993 13.6201 13.6201C9.68116 17.5591 4.86721 19.1315 2.86787 17.1321C1.85395 16.1182 1.7586 14.3804 2.42464 12.4" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.5998 7.6001L9.04328 9.44041C8.85327 9.68678 8.75827 9.80997 8.81713 9.90503C8.87598 10.0001 9.04725 10.0001 9.38978 10.0001H10.6098C10.9524 10.0001 11.1236 10.0001 11.1825 10.0952C11.2413 10.1902 11.1463 10.3134 10.9563 10.5598L9.38978 12.4001" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8 15.0719C7.45018 14.6323 6.90718 14.1474 6.37987 13.6201C2.44091 9.68116 0.868529 4.86721 2.86787 2.86787C3.88179 1.85395 5.61957 1.7586 7.6 2.42464M12 17.4317C14.145 18.25 16.0505 18.2138 17.1321 17.1321C19.1315 15.1328 17.5591 10.3188 13.6201 6.37987C13.0928 5.85256 12.5498 5.36766 12 4.92806" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.45 14C4.45 14.4142 4.78579 14.75 5.2 14.75C5.61421 14.75 5.95 14.4142 5.95 14H4.45ZM17.2971 2.70294L17.8274 2.17261V2.17261L17.2971 2.70294ZM13.3618 15.5877L14.0933 15.4222L13.3618 15.5877ZM2.13811 15.5877L1.4066 15.7532L2.13811 15.5877ZM2.15558 14.3005L2.74092 14.7694H2.74092L2.15558 14.3005ZM10 2.75H13.2V1.25H10V2.75ZM17.25 6.8V14.8H18.75V6.8H17.25ZM5.95 14V6.8H4.45V14H5.95ZM10 1.25C8.88983 1.25 7.98176 1.24841 7.26661 1.34456C6.52989 1.44361 5.88666 1.65857 5.37261 2.17261L6.43327 3.23327C6.62217 3.04438 6.8961 2.90787 7.46648 2.83118C8.05845 2.75159 8.84743 2.75 10 2.75V1.25ZM5.95 6.8C5.95 5.64743 5.95159 4.85845 6.03118 4.26648C6.10787 3.6961 6.24438 3.42217 6.43327 3.23327L5.37261 2.17261C4.85857 2.68666 4.64361 3.32989 4.54456 4.06661C4.44841 4.78176 4.45 5.68983 4.45 6.8H5.95ZM13.2 2.75C14.3526 2.75 15.1416 2.75159 15.7335 2.83118C16.3039 2.90787 16.5778 3.04438 16.7667 3.23327L17.8274 2.17261C17.3133 1.65857 16.6701 1.44361 15.9334 1.34456C15.2182 1.24841 14.3102 1.25 13.2 1.25V2.75ZM18.75 6.8C18.75 5.68983 18.7516 4.78176 18.6554 4.06661C18.5564 3.32989 18.3414 2.68666 17.8274 2.17261L16.7667 3.23327C16.9556 3.42217 17.0921 3.6961 17.1688 4.26648C17.2484 4.85845 17.25 5.64743 17.25 6.8H18.75ZM17.25 14.8C17.25 15.6146 17.1004 16.2461 16.8345 16.6514C16.6005 17.0081 16.2412 17.25 15.5949 17.25V18.75C16.7197 18.75 17.563 18.2756 18.0887 17.4741C18.5826 16.7212 18.75 15.7527 18.75 14.8H17.25ZM15.5949 17.25C15.2245 17.25 14.9402 17.0971 14.6944 16.799C14.4311 16.4796 14.2241 16.0005 14.0933 15.4222L12.6302 15.7532C12.7903 16.4608 13.071 17.1878 13.537 17.7532C14.0207 18.3398 14.7075 18.75 15.5949 18.75V17.25ZM4.37128 17.25C4.00083 17.25 3.71651 17.0971 3.47076 16.799C3.20748 16.4796 3.00046 16.0005 2.86962 15.4222L1.4066 15.7532C1.56669 16.4608 1.8473 17.1878 2.31339 17.7532C2.79701 18.3398 3.48381 18.75 4.37128 18.75V17.25ZM4.37128 18.75H15.5949V17.25H4.37128V18.75ZM3.5696 14.75H11.5865V13.25H3.5696V14.75ZM2.86962 15.4222C2.83154 15.2539 2.80233 15.1243 2.78122 15.0123C2.76011 14.9004 2.75195 14.8303 2.7503 14.7837C2.74879 14.7406 2.75365 14.7347 2.74983 14.7477C2.74486 14.7646 2.73725 14.774 2.74092 14.7694L1.57024 13.8316C1.31616 14.1487 1.23912 14.4926 1.25123 14.8365C1.26141 15.1253 1.33849 15.4521 1.4066 15.7532L2.86962 15.4222ZM3.5696 13.25C3.20461 13.25 2.8377 13.2476 2.53638 13.2977C2.19443 13.3547 1.8419 13.4924 1.57024 13.8316L2.74092 14.7694C2.70995 14.808 2.67333 14.7956 2.78267 14.7774C2.93262 14.7524 3.15237 14.75 3.5696 14.75V13.25ZM14.0933 15.4222C14.0033 15.0244 13.925 14.6747 13.8377 14.406C13.7543 14.1493 13.6206 13.8207 13.33 13.5888L12.3946 14.7614C12.3235 14.7047 12.3462 14.6699 12.411 14.8694C12.4719 15.0569 12.5336 15.326 12.6302 15.7532L14.0933 15.4222ZM11.5865 14.75C11.9556 14.75 12.172 14.751 12.3259 14.7676C12.4721 14.7833 12.4478 14.8039 12.3946 14.7614L13.33 13.5888C13.0572 13.3712 12.7471 13.3042 12.4863 13.2762C12.2333 13.249 11.9215 13.25 11.5865 13.25V14.75Z" fill="white"/>
<path d="M8.7998 6H14.3998" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
<path d="M8.7998 9.2002H11.5998" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,4 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.40015 6.99998L4.60015 6.99998" stroke="#A8A8A8" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 7.00002C13 3.68631 10.3137 1.00001 7 1.00001C3.68629 1.00001 1 3.68631 1 7.00002C1 10.3137 3.68629 13 7 13C10.3137 13 13 10.3137 13 7.00002Z" stroke="#A8A8A8"/>
</svg>

After

Width:  |  Height:  |  Size: 386 B

View File

@ -0,0 +1,10 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_55_91)">
<path d="M8.99915 9L1 1M1.00085 9L9 1" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_55_91">
<rect width="10" height="10" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 361 B

View File

@ -0,0 +1,4 @@
<svg width="7" height="8" viewBox="0 0 7 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 1.5L1 6.5" stroke="#101010" stroke-width="1.5" stroke-linecap="round"/>
<path d="M1 1.5L6 6.5" stroke="#101010" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 267 B

View File

@ -0,0 +1,4 @@
<svg width="7" height="8" viewBox="0 0 7 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 1.5L1 6.5" stroke="#AAAAAA" stroke-width="1.5" stroke-linecap="round"/>
<path d="M1 1.5L6 6.5" stroke="#AAAAAA" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 267 B

View File

@ -0,0 +1,4 @@
<svg width="9" height="9" viewBox="0 0 9 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.50001 0.964466V8.03553" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
<path d="M0.964466 4.5H8.03553" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 285 B

View File

@ -0,0 +1,5 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.40015 6.99998L4.60015 6.99998" stroke="#A8A8A8" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.00015 4.6L7.00015 9.4" stroke="#A8A8A8" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 7.00002C13 3.68631 10.3137 1.00001 7 1.00001C3.68629 1.00001 1 3.68631 1 7.00002C1 10.3137 3.68629 13 7 13C10.3137 13 13 10.3137 13 7.00002Z" stroke="#A8A8A8"/>
</svg>

After

Width:  |  Height:  |  Size: 487 B

View File

@ -0,0 +1,4 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.6252 7.37502L14.1252 8.87502M10.0002 10L11.5002 11.5M7.37518 12.625L8.87518 14.125" stroke="white" stroke-linecap="round"/>
<path d="M7.40165 3.00825C8.42518 1.98472 8.93695 1.47295 9.50785 1.23648C10.2691 0.921175 11.1243 0.921175 11.8855 1.23648C12.4564 1.47295 12.9682 1.98472 13.9917 3.00825C15.0153 4.03179 15.527 4.54355 15.7635 5.11446C16.0788 5.87566 16.0788 6.73094 15.7635 7.49215C15.527 8.06305 15.0153 8.57482 13.9917 9.59835L9.59835 13.9917C8.57482 15.0153 8.06305 15.527 7.49215 15.7635C6.73094 16.0788 5.87566 16.0788 5.11446 15.7635C4.54355 15.527 4.03179 15.0153 3.00825 13.9917C1.98472 12.9682 1.47295 12.4564 1.23648 11.8855C0.921175 11.1243 0.921175 10.2691 1.23648 9.50785C1.47295 8.93695 1.98472 8.42518 3.00825 7.40165L7.40165 3.00825Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 940 B

View File

@ -0,0 +1,4 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.68431 12.4474H12.4475M12.4475 12.4474V9.6842M12.4475 12.4474L9.28958 9.28946M7.71063 7.71051L4.55273 4.55262M4.55273 4.55262H7.31589M4.55273 4.55262V7.31578" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1 8.5C1 4.96447 1 3.1967 2.09835 2.09835C3.1967 1 4.96447 1 8.5 1C12.0355 1 13.8033 1 14.9017 2.09835C16 3.1967 16 4.96447 16 8.5C16 12.0355 16 13.8033 14.9017 14.9017C13.8033 16 12.0355 16 8.5 16C4.96447 16 3.1967 16 2.09835 14.9017C1 13.8033 1 12.0355 1 8.5Z" stroke="white"/>
</svg>

After

Width:  |  Height:  |  Size: 626 B

View File

@ -0,0 +1,8 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.4996 13L14.4996 4.00001M3.99963 14.5H12.9996M12.9996 2.50001H3.99963M2.49963 4.00001V13" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.6785 5.74828L10.7919 5.26131L10.7919 5.26131L10.6785 5.74828ZM6.32116 5.74828L6.43458 6.23525L6.32116 5.74828ZM5.71277 5.98036L6.05306 6.3467H6.05306L5.71277 5.98036ZM4.99982 6.83332C4.99982 7.10946 5.22367 7.33332 5.49982 7.33332C5.77596 7.33332 5.99982 7.10946 5.99982 6.83332H4.99982ZM5.58784 6.13773L5.15386 5.88942L5.15386 5.88942L5.58784 6.13773ZM11.2869 5.98036L11.6271 5.61402L11.6271 5.61402L11.2869 5.98036ZM10.9998 6.83332C10.9998 7.10946 11.2237 7.33332 11.4998 7.33332C11.776 7.33332 11.9998 7.10946 11.9998 6.83332H10.9998ZM11.4118 6.13773L10.9778 6.38604L10.9778 6.38605L11.4118 6.13773ZM7.99982 11.5C7.99982 11.7761 8.22367 12 8.49982 12C8.77596 12 8.99982 11.7761 8.99982 11.5H7.99982ZM9.49982 12C9.77596 12 9.99982 11.7761 9.99982 11.5C9.99982 11.2238 9.77596 11 9.49982 11V12ZM7.49982 11C7.22367 11 6.99982 11.2238 6.99982 11.5C6.99982 11.7761 7.22367 12 7.49982 12V11ZM8.49982 5.99998C9.2144 5.99998 9.90651 6.08187 10.5651 6.23525L10.7919 5.26131C10.0591 5.09064 9.29089 4.99998 8.49982 4.99998V5.99998ZM6.43458 6.23525C7.09313 6.08187 7.78523 5.99998 8.49982 5.99998V4.99998C7.70874 4.99998 6.94053 5.09064 6.20775 5.26131L6.43458 6.23525ZM6.20775 5.26131C5.9342 5.32503 5.62067 5.38349 5.37249 5.61402L6.05306 6.3467C6.0545 6.34537 6.06111 6.33644 6.11146 6.31879C6.17602 6.29615 6.26506 6.27473 6.43458 6.23525L6.20775 5.26131ZM5.99982 6.83332C5.99982 6.64293 6.0004 6.5366 6.00832 6.45776C6.01183 6.42276 6.01592 6.40432 6.01843 6.39535C6.02048 6.38805 6.02163 6.38639 6.02182 6.38605L5.15386 5.88942C5.06358 6.04719 5.02861 6.20563 5.01332 6.3578C4.99924 6.498 4.99982 6.66255 4.99982 6.83332H5.99982ZM5.37249 5.61402C5.28951 5.6911 5.21011 5.79112 5.15386 5.88942L6.02182 6.38605C6.02789 6.37545 6.04411 6.35502 6.05306 6.3467L5.37249 5.61402ZM10.5651 6.23525C10.7346 6.27473 10.8236 6.29615 10.8882 6.31879C10.9385 6.33644 10.9451 6.34537 10.9466 6.3467L11.6271 5.61402C11.379 5.38349 11.0654 5.32503 10.7919 5.26131L10.5651 6.23525ZM11.9998 6.83332C11.9998 6.66255 12.0004 6.498 11.9863 6.3578C11.971 6.20563 11.936 6.04719 11.8458 5.88942L10.9778 6.38605C10.978 6.38639 10.9792 6.38805 10.9812 6.39535C10.9837 6.40432 10.9878 6.42276 10.9913 6.45776C10.9992 6.5366 10.9998 6.64293 10.9998 6.83332H11.9998ZM10.9466 6.3467C10.9555 6.35502 10.9717 6.37545 10.9778 6.38604L11.8458 5.88942C11.7895 5.79112 11.7101 5.6911 11.6271 5.61402L10.9466 6.3467ZM7.99982 5.49998V11.5H8.99982V5.49998H7.99982ZM9.49982 11H7.49982V12H9.49982V11Z" fill="white"/>
<rect x="12.9998" y="1" width="3" height="3" rx="1" stroke="white"/>
<rect x="1" y="1" width="3" height="3" rx="1" stroke="white"/>
<rect x="12.9998" y="13" width="3" height="3" rx="1" stroke="white"/>
<rect x="1" y="13" width="3" height="3" rx="1" stroke="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,4 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.1319 4.81727L14.7648 4.18031C14.4873 3.69859 14.3485 3.45773 14.1123 3.36169C13.8762 3.26564 13.6091 3.34143 13.075 3.493L12.1676 3.74857C11.8266 3.82721 11.4688 3.7826 11.1575 3.62262L10.907 3.47809C10.6399 3.30707 10.4346 3.05492 10.3209 2.75853L10.0726 2.01689C9.90929 1.52611 9.82765 1.28072 9.6333 1.14036C9.43894 1 9.18078 1 8.66447 1H7.83553C7.31922 1 7.06106 1 6.8667 1.14036C6.67235 1.28072 6.59071 1.52611 6.42744 2.01689L6.17911 2.75853C6.06543 3.05492 5.86006 3.30707 5.59304 3.47809L5.34254 3.62262C5.03117 3.7826 4.67339 3.82721 4.33238 3.74857L3.42502 3.493C2.89088 3.34143 2.62381 3.26564 2.38766 3.36169C2.15152 3.45773 2.01273 3.69859 1.73515 4.18031L1.36812 4.81727C1.10794 5.26881 0.977843 5.49458 1.00309 5.73493C1.02834 5.97527 1.2025 6.16895 1.55082 6.55631L2.31749 7.41345C2.50487 7.65068 2.63791 8.06408 2.63791 8.43576C2.63791 8.80767 2.50492 9.22097 2.31751 9.45823L1.55082 10.3154C1.2025 10.7027 1.02834 10.8964 1.00309 11.1368C0.977843 11.3771 1.10794 11.6029 1.36813 12.0544L1.73514 12.6914C2.01271 13.1731 2.15152 13.414 2.38766 13.51C2.62381 13.606 2.89089 13.5303 3.42504 13.3787L4.33234 13.1231C4.67342 13.0444 5.03126 13.0891 5.34268 13.2491L5.59314 13.3937C5.8601 13.5647 6.06543 13.8168 6.17909 14.1131L6.42744 14.8549C6.59071 15.3456 6.67235 15.591 6.8667 15.7314C7.06106 15.8718 7.31922 15.8718 7.83553 15.8718H8.66447C9.18078 15.8718 9.43894 15.8718 9.6333 15.7314C9.82765 15.591 9.90929 15.3456 10.0726 14.8549L10.3209 14.1131C10.4346 13.8168 10.6399 13.5647 10.9069 13.3937L11.1573 13.2491C11.4687 13.0891 11.8266 13.0444 12.1677 13.1231L13.075 13.3787C13.6091 13.5303 13.8762 13.606 14.1123 13.51C14.3485 13.414 14.4873 13.1731 14.7649 12.6914L15.1319 12.0544C15.3921 11.6029 15.5222 11.3771 15.4969 11.1368C15.4717 10.8964 15.2975 10.7027 14.9492 10.3154L14.1825 9.45823C13.9951 9.22097 13.8621 8.80767 13.8621 8.43576C13.8621 8.06408 13.9951 7.65068 14.1825 7.41345L14.9492 6.55631C15.2975 6.16895 15.4717 5.97527 15.4969 5.73493C15.5222 5.49458 15.3921 5.26881 15.1319 4.81727Z" stroke="white" stroke-linecap="round"/>
<path d="M10.8204 8.43006C10.8204 9.86741 9.65521 11.0326 8.21785 11.0326C6.7805 11.0326 5.6153 9.86741 5.6153 8.43006C5.6153 6.9927 6.7805 5.8275 8.21785 5.8275C9.65521 5.8275 10.8204 6.9927 10.8204 8.43006Z" stroke="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,4 @@
<svg width="12" height="10" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.33344 1H8.33344C9.99029 1 11.3334 2.34315 11.3334 4C11.3334 5.65685 9.99029 7 8.33344 7H1.33344" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.66675 9L1.37385 7.70711C1.04052 7.37377 0.873855 7.20711 0.873855 7C0.873855 6.79289 1.04052 6.62623 1.37385 6.29289L2.66675 5" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

View File

@ -0,0 +1,4 @@
<svg width="12" height="10" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.66675 1H3.66675C2.00989 1 0.666748 2.34315 0.666748 4C0.666748 5.65685 2.00989 7 3.66675 7H10.6667" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.33344 9L10.6263 7.70711C10.9597 7.37377 11.1263 7.20711 11.1263 7C11.1263 6.79289 10.9597 6.62623 10.6263 6.29289L9.33344 5" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

View File

@ -0,0 +1,3 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.99915 9L1 1M1.00085 9L9 1" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 206 B

View File

@ -0,0 +1,3 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.625 12.25V8.875C3.625 8.46079 3.96079 8.125 4.375 8.125H9.625C10.0392 8.125 10.375 8.46079 10.375 8.875V12.625M8.875 4L4.375 4C3.96079 4 3.625 3.66421 3.625 3.25L3.625 1M12.6234 3.62342L10.3766 1.37658C10.1355 1.13546 9.80844 1 9.46745 1H2.28571C1.57563 1 1 1.57563 1 2.28571V11.7143C1 12.4244 1.57563 13 2.28571 13H11.7143C12.4244 13 13 12.4244 13 11.7143V4.53255C13 4.19156 12.8645 3.86454 12.6234 3.62342Z" stroke="white" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

View File

@ -0,0 +1,4 @@
<svg width="15" height="13" viewBox="0 0 15 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.1944 2.41667C4.29699 1.92185 4.46822 1.54853 4.75399 1.24851C5.46694 0.5 6.61442 0.5 8.90938 0.5C11.2043 0.5 12.3518 0.5 13.0648 1.24851C13.7777 1.99701 13.7777 3.20171 13.7777 5.61111V6.88889C13.7777 9.29829 13.7777 10.503 13.0648 11.2515C12.3518 12 11.2043 12 8.90938 12C6.61442 12 5.46694 12 4.75399 11.2515C4.46822 10.9515 4.29699 10.5782 4.1944 10.0833" stroke="white" stroke-linecap="round"/>
<path d="M1.00026 6.23385L8.6666 6.25001M1.00026 6.23385C0.995959 6.33775 1.03309 6.44227 1.11168 6.53538C1.60052 7.11451 2.87114 8.16667 2.87114 8.16667M1.00026 6.23385C1.00412 6.14068 1.0413 6.04802 1.11179 5.96454C1.60072 5.38552 2.87114 4.33334 2.87114 4.33334" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 844 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,3 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.25 8.5L4.75 5L1.25 1.5" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 173 B

View File

@ -0,0 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="icon">
<g id="elements">
<circle id="Ellipse 1533" cx="12" cy="12" r="8.25" stroke="#BEBEBE" stroke-width="1.5"/>
<path id="Vector" d="M7.94995 16.5C10.0485 14.302 13.9289 14.1986 16.05 16.5M14.2455 9.75C14.2455 10.9926 13.2367 12 11.9923 12C10.7479 12 9.73912 10.9926 9.73912 9.75C9.73912 8.50736 10.7479 7.5 11.9923 7.5C13.2367 7.5 14.2455 8.50736 14.2455 9.75Z" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 546 B

View File

@ -0,0 +1,3 @@
<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector 4" d="M1.5 1.25L5 4.75L8.5 1.25" stroke="white" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

View File

@ -0,0 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="icon">
<g id="elements">
<path id="Rectangle 2333" d="M14.6667 17C14.6012 18.6462 13.2294 20.0439 11.3917 19.9989C10.9641 19.9885 10.4357 19.8394 9.37877 19.5413C6.83521 18.8239 4.62716 17.6181 4.09738 14.9169C4 14.4204 4 13.8617 4 12.7442L4 11.2558C4 10.1383 4 9.5796 4.09738 9.08307C4.62716 6.38191 6.83521 5.17614 9.37878 4.45869C10.4357 4.16057 10.9641 4.01151 11.3917 4.00106C13.2294 3.9561 14.6012 5.35384 14.6667 7.00001" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round"/>
<path id="Vector" d="M19.9999 12H10.2222M19.9999 12C19.9999 11.3776 18.2272 10.2147 17.7777 9.7778M19.9999 12C19.9999 12.6224 18.2272 13.7853 17.7777 14.2222" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

View File

@ -1,5 +1,9 @@
import FloorPlan from '@/components/floor-plan/FloorPlan'
export default function floorPlanPage() {
return <FloorPlan />
export default function FloorPlanPage() {
return (
<>
<FloorPlan />
</>
)
}

View File

@ -0,0 +1,19 @@
'use client'
import { useI18n } from '@/locales/client'
export default function CompletePage() {
const t = useI18n()
return (
<>
<div className="flex min-h-full flex-1 flex-col justify-center px-6 py-12 lg:px-8">
<h1 className="text-center text-4xl font-bold mb-10">{t('join.complete.title')}</h1>
<div className="mt-10 mb-10 w-full text-center text-2xl">{t('join.complete.contents')}</div>
<div className="mt-10 w-full text-center">
{t('join.complete.email_comment')} :&nbsp;{t('join.complete.email')}
</div>
</div>
</>
)
}

View File

@ -0,0 +1,5 @@
import Join from '@/components/auth/Join'
export default function JoinPage() {
return <>{<Join />}</>
}

View File

@ -4,6 +4,7 @@ import { useCurrentLocale } from '@/locales/client'
import { LocaleProvider } from './LocaleProvider'
import ServerError from './error'
import { ErrorBoundary } from 'next/dist/client/components/error-boundary'
import '@/styles/common.scss'
export default function LocaleLayout({ children }) {
const locale = useCurrentLocale()

View File

@ -1,9 +1,16 @@
import Login from '@/components/auth/Login'
import { getCurrentLocale } from '@/locales/server'
export default function LoginPage() {
const currentLocale = getCurrentLocale()
const loginPageProps = {
currentLocale,
}
return (
<>
<Login />
<Login {...loginPageProps} />
</>
)
}

View File

@ -2,14 +2,13 @@ import { Inter } from 'next/font/google'
import RecoilRootWrapper from './RecoilWrapper'
import UIProvider from './UIProvider'
import { headers } from 'next/headers'
import Headers from '@/components/Headers'
import { ToastContainer } from 'react-toastify'
import QModal from '@/components/common/modal/QModal'
import './globals.css'
import '../styles/style.scss'
import Header from '@/components/header/Header'
const inter = Inter({ subsets: ['latin'] })
@ -19,18 +18,19 @@ export const metadata = {
}
export default function RootLayout({ children }) {
const headersList = headers()
const headerPathname = headersList.get('x-pathname') || ''
// console.log('headerPathname', headerPathname)
return (
<html lang="en">
<body className={inter.className}>
{headerPathname !== '/login' && <Headers />}
{/*{headerPathname !== '/login' && <Headers />}*/}
<RecoilRootWrapper>
<UIProvider>{children}</UIProvider>
<QModal />
<div className="wrap">
<Header />
<div className="content">
<UIProvider>{children}</UIProvider>
</div>
</div>
<ToastContainer />
<QModal />
</RecoilRootWrapper>
</body>
</html>

View File

@ -3,6 +3,7 @@
import { logout } from '@/lib/authActions'
import { useChangeLocale, useI18n } from '@/locales/client'
import { Button, Chip } from '@nextui-org/react'
import Link from 'next/link'
export default function MainPage(props) {
const { currentLocale, isLoggedIn } = props
@ -34,7 +35,28 @@ export default function MainPage(props) {
</Button>
</div>
)}
{!isLoggedIn && (
<div className="my-4">
<Link href={'/' + currentLocale + '/login'}>
<Button color="primary">로그인 페이지로 이동</Button>
</Link>
</div>
)}
<div className="font-test">font-test</div>
{/*<h3>{t('locale', { locale: <Chip color="primary">{currentLocale}</Chip> })}</h3>*/}
{/*<div>{t('hello')}</div>*/}
{/*<div>{t('welcome', { name: '효준' })}</div>*/}
{/*<div>*/}
{/* <Button onClick={handleChangeLocale}>Change Locale</Button>*/}
{/*</div>*/}
{/*{isLoggedIn && (*/}
{/* <div className="my-4">*/}
{/* <Button color="primary" onClick={handleLogout}>*/}
{/* 로그아웃*/}
{/* </Button>*/}
{/* </div>*/}
{/*)}*/}
{/*<div className="font-test">font-test</div>*/}
</>
)
}

View File

@ -0,0 +1,321 @@
'use client'
import { post } from '@/lib/Axios'
import { redirect } from 'next/navigation'
import { useI18n } from '@/locales/client'
export default function Join() {
const t = useI18n()
const joinProcess = async (formData) => {
const param = {
langCd: 'JA',
lastEditUser: formData.get('userId'),
storeQcastNm: formData.get('storeQcastNm'),
storeQcastNmKana: formData.get('storeQcastNmKana'),
postCd: formData.get('postCd'),
addr: formData.get('addr'),
telNo: formData.get('telNo'),
fax: formData.get('fax'),
payTermsCd: 'JB02',
kamId: 'E1101011',
qtCompNm: formData.get('qtCompNm'),
qtPostCd: formData.get('qtPostCd'),
qtAddr: formData.get('qtAddr'),
qtTelNo: formData.get('qtTelNo'),
qtFax: formData.get('qtFax'),
userInfo: {
userId: formData.get('userId'),
userNm: formData.get('userNm'),
userNmKana: formData.get('userNmKana'),
telNo: formData.get('userTelNo'),
fax: formData.get('userFax'),
email: formData.get('email'),
category: formData.get('category'),
},
}
await post({ url: '/api/login/v1.0/user/join', data: param }).then((res) => {
if (res) {
if (res.result.resultCode == 'S') {
redirect('/join/complete')
} else {
alert(res.result.resultMsg)
}
}
})
}
return (
<div className="flex min-h-full flex-1 flex-col justify-center px-6 py-12 lg:px-8">
<h1 className="text-center text-4xl font-bold">{t('join.title')}</h1>
<form action={joinProcess}>
<div className="mt-10">
<div>
{t('join.sub1.title')} (*{t('common.require')}) <span>{t('join.sub1.comment')}</span>
</div>
<table className="w-full">
<colgroup>
<col style={{ width: '20%' }} />
<col style={{ width: '80%' }} />
</colgroup>
<tbody>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub1.storeQcastNm')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="storeQcastNm"
name="storeQcastNm"
required
alt={t('join.sub1.storeQcastNm')}
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.storeQcastNm_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub1.storeQcastNmKana')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="storeQcastNmKana"
name="storeQcastNmKana"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.storeQcastNmKana_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>
{t('join.sub1.postCd')}/{t('join.sub1.addr')} *
</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="postCd"
name="postCd"
required
className="block border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.postCd_placeholder')}
></input>
<input
type="text"
id="addr"
name="addr"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.addr_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub1.telNo')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="telNo"
name="telNo"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.telNo_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub1.fax')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="fax"
name="fax"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.fax_placeholder')}
></input>
</td>
</tr>
</tbody>
</table>
<div className="mt-5">
{t('join.sub2.title')} (*{t('common.require')})
</div>
<table className="w-full">
<colgroup>
<col style={{ width: '20%' }} />
<col style={{ width: '80%' }} />
</colgroup>
<tbody>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.userNm')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="userNm"
name="userNm"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.userNmKana')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="userNmKana"
name="userNmKana"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.userId')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="userId"
name="userId"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.email')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="email"
id="email"
name="email"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
autoComplete="email"
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.telNo')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="userTelNo"
name="userTelNo"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub2.telNo_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.fax')} *</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="userFax"
name="userFax"
required
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub1.fax_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub2.category')}</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input id="category" name="category" className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"></input>
</td>
</tr>
</tbody>
</table>
<div className="mt-5">
{t('join.sub3.title')} (*{t('common.require')})
</div>
<table className="w-full">
<colgroup>
<col style={{ width: '20%' }} />
<col style={{ width: '80%' }} />
</colgroup>
<tbody>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub3.qtCompNm')}</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input type="text" id="qtCompNm" name="qtCompNm" className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>
{t('join.sub3.qtPostCd')}/{t('join.sub3.qtAddr')}
</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="qtPostCd"
name="qtPostCd"
className="block border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub3.qtPostCd_placeholder')}
></input>
<input
type="text"
id="qtAddr"
name="qtAddr"
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub3.qtAddr_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub3.qtEmail')}</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="email"
id="qtEmail"
name="qtEmail"
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
autoComplete="email"
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub3.qtTelNo')}</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="qtTelNo"
name="qtTelNo"
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub3.qtTelNo_placeholder')}
></input>
</td>
</tr>
<tr>
<th style={{ border: '1px solid gray', padding: '5px' }}>{t('join.sub3.qtFax')}</th>
<td style={{ border: '1px solid gray', padding: '5px' }}>
<input
type="text"
id="qtFax"
name="qtFax"
className="block w-full border-0 py-1.5 ring-1 ring-inset ring-gray-300"
placeholder={t('join.sub3.qtFax_placeholder')}
></input>
</td>
</tr>
</tbody>
</table>
</div>
<div className="mt-10 mb-10">
<button
type="submit"
className="w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
>
{t('join.btn.approval_request')}
</button>
</div>
</form>
</div>
)
}

View File

@ -1,21 +1,127 @@
'use client'
import { login } from '@/lib/authActions'
import { post, patch } from '@/lib/Axios'
import { setSession } from '@/lib/authActions'
import { redirect } from 'next/navigation'
import { useI18n } from '@/locales/client'
export default function Login() {
return (
<div className="flex flex-col align-center h-screen">
<div className="flex min-h-full flex-1 flex-col justify-center px-6 py-12 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-sm">
<img alt="Your Company" src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=600" className="mx-auto h-10 w-auto" />
<h2 className="mt-10 text-center text-2xl font-bold leading-9 tracking-tight text-gray-900">Sign in to your account</h2>
import { Button } from '@nextui-org/react'
import { useRecoilState } from 'recoil'
import { modalContent, modalState } from '@/store/modalAtom'
export default function Login(props) {
const { currentLocale } = props
const t = useI18n()
// login process
const loginProcess = async (formData) => {
const param = {
langCd: currentLocale,
lastEditUser: formData.get('id'),
loginId: formData.get('id'),
pwd: formData.get('password'),
}
await post({ url: '/api/login/v1.0/login', data: param }).then((res) => {
if (res) {
if (res.result.resultCode == 'S') {
// console.log('res.data', res.data)
//
// if (res.data.pwdInitYn != 'Y') {
// alert(' ')
// } else {
setSession(res.data)
redirect('/')
// }
} else {
alert(res.result.resultMsg)
}
}
})
}
//
const [open, setOpen] = useRecoilState(modalState)
const [contents, setContent] = useRecoilState(modalContent)
const initPasswordProcess = async (formData) => {
const param = {
langCd: currentLocale,
lastEditUser: formData.get('checkId'),
loginId: formData.get('checkId'),
email: formData.get('checkEmail'),
}
await patch({ url: '/api/login/v1.0/user/init-password', data: param }).then((res) => {
if (res) {
if (res.result.resultCode == 'S') {
alert(t('login.init_password.complete_message'))
redirect('/login')
} else {
alert(res.result.resultMsg)
}
}
})
}
const initPasswordContent = (
<div className="flex min-h-full flex-1 flex-col justify-center px-6 py-12 lg:px-8">
<form action={initPasswordProcess} className="space-y-6">
<h2 className="text-center text-2xl font-bold leading-9 tracking-tight text-gray-900">{t('login.init_password.title')}</h2>
<h2 className="text-center text-1xl font-bold leading-9 tracking-tight text-gray-900">{t('login.init_password.sub_title')}</h2>
<div>
<label htmlFor="checkId" className="block text-sm font-medium leading-6 text-gray-900">
ID
</label>
<div className="mt-2">
<input
id="checkId"
name="checkId"
type="text"
required
className="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
/>
</div>
</div>
<div>
<div className="flex items-center justify-between">
<label htmlFor="checkEmail" className="block text-sm font-medium leading-6 text-gray-900">
E-Mail
</label>
</div>
<div className="mt-2">
<input
id="checkEmail"
name="checkEmail"
type="email"
required
className="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
/>
</div>
</div>
<p className="mt-5 text-center text-sm text-gray-500">
<Button type="submit" className="font-semibold leading-6 text-indigo-600 hover:text-indigo-500">
{t('login.init_password.btn')}
</Button>
</p>
</form>
</div>
)
return (
<div className="flex flex-col align-center">
<div className="flex min-h-full flex-1 flex-col justify-center px-6 py-12 lg:px-8">
<div className="mt-10 sm:mx-auto sm:w-full sm:max-w-sm">
<form action={login} method="POST" encType="application/json" className="space-y-6">
<h1 className="text-center text-4xl font-bold leading-9 tracking-tight text-gray-900">{t('site.name')}</h1>
<h2 className="mt-5 text-center text-2xl font-bold leading-9 tracking-tight text-gray-900">{t('site.sub_name')}</h2>
</div>
<div className="mt-5 sm:mx-auto sm:w-full sm:max-w-sm">
<form action={loginProcess} className="space-y-6">
<div>
<label htmlFor="userId" className="block text-sm font-medium leading-6 text-gray-900">
User ID
ID
</label>
<div className="mt-2">
<input
@ -34,11 +140,6 @@ export default function Login() {
<label htmlFor="password" className="block text-sm font-medium leading-6 text-gray-900">
Password
</label>
<div className="text-sm">
<a href="#" className="font-semibold text-indigo-600 hover:text-indigo-500">
Forgot password?
</a>
</div>
</div>
<div className="mt-2">
<input
@ -55,18 +156,23 @@ export default function Login() {
<div>
<button
type="submit"
className="flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
className="mt-10 flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
>
Sign in
{t('login.login')}
</button>
</div>
</form>
<p className="mt-10 text-center text-sm text-gray-500">
Not a member?{' '}
<a href="#" className="font-semibold leading-6 text-indigo-600 hover:text-indigo-500">
Start a 14 day free trial
</a>
<p className="mt-5 text-center text-sm text-gray-500">
<Button
onClick={() => {
setContent(initPasswordContent)
setOpen(true)
}}
className="font-semibold leading-6 text-indigo-600 hover:text-indigo-500"
>
{t('login.init_password.btn')}
</Button>
</p>
</div>
</div>

View File

@ -0,0 +1,22 @@
'use client'
import { useState } from 'react'
import Draggable from 'react-draggable'
export default function WithDraggable({ isShow, children }) {
const [position, setPosition] = useState({ x: 0, y: 0 })
const handleOnDrag = (data) => {
setPosition({ x: data.x, y: data.y })
}
return (
<>
{isShow && (
<Draggable position={{ x: position.x, y: position.y }} onDrag={(_, data) => handleOnDrag(data)}>
{children}
</Draggable>
)}
</>
)
}

View File

@ -0,0 +1,19 @@
'use client'
import { useState } from 'react'
export default function QSelectBox({ title, option }) {
const [selectAct, setSelectAct] = useState(false)
return (
<div className={`sort-select ${selectAct ? 'active' : ''}`} onClick={() => setSelectAct(!selectAct)}>
<p>{title}</p>
<ul className="select-item-wrap">
{option.map((el, idx) => (
<li key={idx} className="select-item">
<button>{el.name}</button>
</li>
))}
</ul>
</div>
)
}

View File

@ -0,0 +1,7 @@
export default function CanvasFrame () {
return(
<div className="canvas-frame">
<canvas></canvas>
</div>
)
}

View File

@ -0,0 +1,45 @@
'use client'
import { useState } from "react"
import CanvasFrame from "./CanvasFrame";
export default function CanvasLayout () {
const [plans, setPlans] = useState([{ id: 0, name: 'Plan 1' }, { id: 1, name: 'Plan 2' }, { id: 2, name: 'Plan 3' }]);
const [idxNum, setIdxNum] = useState(null);
const onClickPlane = (num) => {
setIdxNum(num);
}
const handleDeletePlan = (e, id) => {
e.stopPropagation(); //
setPlans(plans.filter(plan => plan.id !== id)); //
}
const addNewPlan = () => {
setPlans([...plans, { id: plans.length, name: `Plan ${plans.length + 1}` }]);
}
return(
<div className="canvas-layout">
<div className="canvas-page-list">
<div className="canvas-plane-wrap">
{plans.map((plan, idx) => (
<button
key={plan.id}
className={`canvas-page-box ${idx === idxNum ? 'on' : ''}`}
onClick={() => onClickPlane(idx)}
>
<span>{plan.name}</span>
<i className="close" onClick={(e) => handleDeletePlan(e, plan.id)}></i>
</button>
))}
</div>
<button className="plane-add" onClick={addNewPlan}>
<span></span>
</button>
</div>
<CanvasFrame/>
</div>
)
}

View File

@ -0,0 +1,97 @@
'use client'
import { useState } from 'react'
import MenuDepth01 from './MenuDepth01'
import QSelectBox from '@/components/common/select/QSelectBox'
export default function CanvasMenu({ setModalOpen }) {
const [menuNumber, setMenuNumber] = useState(null)
const [vertical, setVertical] = useState(true)
const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }]
const onClickNav = (number) => {
setMenuNumber(number)
if (menuNumber === number) {
setMenuNumber(null)
}
}
return (
<div className={`canvas-menu-wrap ${menuNumber !== null ? 'active' : ''}`}>
<div className="canvas-menu-inner">
<ul className="canvas-menu-list">
<li className={`canvas-menu-item ${menuNumber === 0 ? 'active' : ''}`} onClick={() => onClickNav(0)}>
<button>
<span className="menu-icon con00"></span>配置面 初期設定
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 1 ? 'active' : ''}`} onClick={() => onClickNav(1)}>
<button>
<span className="menu-icon con01"></span>配置面 初期設定
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 2 ? 'active' : ''}`} onClick={() => onClickNav(2)}>
<button>
<span className="menu-icon con02"></span>配置面 初期設定
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 3 ? 'active' : ''}`} onClick={() => onClickNav(3)}>
<button>
<span className="menu-icon con03"></span>配置面
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 4 ? 'active' : ''}`} onClick={() => onClickNav(4)}>
<button>
<span className="menu-icon con04"></span>モジュール回路構成
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 5 ? 'active' : ''}`} onClick={() => onClickNav(5)}>
<button>
<span className="menu-icon con06"></span>見積
</button>
</li>
<li className={`canvas-menu-item ${menuNumber === 6 ? 'active' : ''}`} onClick={() => onClickNav(6)}>
<button>
<span className="menu-icon con05"></span>発展シミュレーション
</button>
</li>
</ul>
<div className="canvas-side-btn-wrap">
<div className="btn-from">
<button className="btn01 "></button>
<button className="btn02 active"></button>
<button className="btn03"></button>
</div>
<div className="vertical-horizontal">
<span>垂直水平モード</span>
<button onClick={() => setVertical(!vertical)}>{vertical ? 'ON' : 'OFF'}</button>
</div>
<div className="select-box">
<QSelectBox title={'瓦53A'} option={SelectOption} />
</div>
<div className="btn-from">
<button className="btn04" onClick={() => setModalOpen('option')}></button>
<button className="btn05"></button>
<button className="btn06"></button>
</div>
<div className="size-control">
<button className="control-btn minus"></button>
<span>100%</span>
<button className="control-btn plus"></button>
</div>
<div className="btn-from">
<button className="btn07"></button>
<button className="btn08"></button>
<button className="btn09"></button>
</div>
</div>
</div>
<div className={`canvas-depth2-wrap ${menuNumber !== null ? 'active' : ''}`}>
{menuNumber === 0 && <MenuDepth01 />}
{menuNumber === 1 && <MenuDepth01 />}
{menuNumber === 2 && <MenuDepth01 />}
{menuNumber === 3 && <MenuDepth01 />}
{menuNumber === 4 && <MenuDepth01 />}
{menuNumber === 5 && <MenuDepth01 />}
{menuNumber === 6 && <MenuDepth01 />}
</div>
</div>
)
}

View File

@ -1,7 +1,21 @@
'use client'
import CanvasMenu from '@/components/floor-plan/CanvasMenu'
import CanvasLayout from '@/components/floor-plan/CanvasLayout'
import SettingModal01 from '@/components/floor-plan/modal/settoing01/SettingModal01'
import { useState } from 'react'
export default function FloorPlan() {
const [modalOpen, setModalOpen] = useState('option')
return (
<>
<h1>도면 작성 페이지</h1>
<div className="canvas-wrap">
<CanvasMenu modalOpen={modalOpen} setModalOpen={setModalOpen} />
<div className="canvas-content">
<CanvasLayout />
{modalOpen === 'option' && <SettingModal01 modalOpen={modalOpen} setModalOpen={setModalOpen} />}
</div>
</div>
</>
)
}

View File

@ -0,0 +1,44 @@
'use client'
import { ToggleonMouse } from '@/components/header/Header'
export default function MenuDepth01() {
return (
<div className="canvas-depth2-inner">
<ul className="canvas-depth2-list">
<li className="canvas-depth2-item active">
<button>外壁線を描</button>
</li>
<li className="canvas-depth2-item">
<button>補助線を描</button>
</li>
<li className="canvas-depth2-item">
<button>屋根形状設定</button>
</li>
<li className="canvas-depth2-item">
<button>軒下変更</button>
</li>
<li className="canvas-depth2-item">
<button>外壁線の上げ下げ</button>
</li>
<li className="canvas-depth2-item">
<button>銅線移動</button>
</li>
<li className="canvas-depth2-item">
<button>特殊コーナー形状</button>
</li>
</ul>
<ul className="canvas-depth2-btn-list">
<li className="depth2-btn-box" onMouseEnter={(e) => ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}>
<button>屋根面の割り当て</button>
</li>
<li className="depth2-btn-box" onMouseEnter={(e) => ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}>
<button>屋根材の設定と変更</button>
</li>
<li className="depth2-btn-box" onMouseEnter={(e) => ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}>
<button>屋根面全体削除</button>
</li>
</ul>
</div>
)
}

View File

@ -0,0 +1,39 @@
import { useRecoilState } from 'recoil'
import { settingModalFirstOptionsState } from '@/store/settingAtom'
export default function FirstOption() {
const [settingsModalOptions, setSettingModalOptions] = useRecoilState(settingModalFirstOptionsState)
const { option1, option2 } = settingsModalOptions
const onClickOption = (option) => {
option.selected = !option.selected
setSettingModalOptions({ option1, option2 })
}
return (
<>
<div className="modal-check-btn-wrap">
<h3 className="check-wrap-title light">図面に表示する項目をクリックすると適用されます</h3>
<div className="flex-check-box for2">
{settingsModalOptions?.option1?.map((item) => (
<button key={item.id} className={`check-btn ${item.selected ? 'act' : ''}`} onClick={(e) => onClickOption(item)}>
<span className="check-area"></span>
<span className="title-area">{item.name}</span>
</button>
))}
</div>
</div>
<div className="modal-check-btn-wrap">
<h3 className="check-wrap-title">画面表示</h3>
<div className="flex-check-box for-line">
{settingsModalOptions?.option2?.map((item) => (
<button key={item.id} className={`check-btn ${item.selected ? 'act' : ''}`} onClick={(e) => onClickOption(item)}>
<span className="check-area"></span>
<span className="title-area">{item.name}</span>
</button>
))}
</div>
</div>
</>
)
}

View File

@ -0,0 +1,45 @@
import { useRecoilState } from 'recoil'
import { settingModalSecondOptionsState } from '@/store/settingAtom'
export default function SecondOption() {
const [settingsModalOptions, setSettingModalOptions] = useRecoilState(settingModalSecondOptionsState)
const { option1, option2 } = settingsModalOptions
const onClickOption = (option) => {
option.selected = !option.selected
setSettingModalOptions({ option1: option1, option2: option2 })
}
return (
<>
<div className="modal-check-btn-wrap">
<h3 className="check-wrap-title">フォントとサイズの変更</h3>
<div className="flex-check-box for2">
{settingsModalOptions.option1.map((item) => (
<button className="arr-btn">
<span>{item.name}</span>
</button>
))}
</div>
</div>
<div className="modal-check-btn-wrap">
<h3 className="check-wrap-title">吸着範囲の設定</h3>
<div className="flex-check-box for-line">
{settingsModalOptions.option2.map((item) => (
<button key={item.id} className={`check-btn ${item.selected ? 'act' : ''}`} onClick={() => onClickOption(item)}>
<span className="check-area"></span>
<span className="title-area">{item.name}</span>
</button>
))}
</div>
<div className="flex-check-box for-line">
<button className="arr-btn">
<span>寸法線の設定</span>
</button>
<button className="arr-btn">
<span>図面サイズの設定</span>
</button>
</div>
</div>
</>
)
}

View File

@ -0,0 +1,44 @@
'use client'
import { useState } from 'react'
import FirstOption from './FirstOption'
import WithDraggable from '@/components/common/draggable/withDraggable'
import SecondOption from '@/components/floor-plan/modal/settoing01/SecondOption'
export default function SettingModal01({ modalOpen, setModalOpen }) {
const [buttonAct, setButtonAct] = useState(1)
const [close, setClose] = useState(false)
const HandleClickClose = () => {
setClose(true)
setTimeout(() => {
setModalOpen('')
setClose(false)
}, 180)
}
return (
<WithDraggable isShow={true}>
<div className={`modal-pop-wrap sm ${modalOpen === 'option' && close === false ? 'mount' : ''}${close ? 'unmount' : ''} `}>
<div className="modal-head">
<h1 className="title">Canvas設定</h1>
<button className="modal-close" onClick={HandleClickClose}>
닫기
</button>
</div>
<div className="modal-body">
<div className="modal-btn-wrap">
<button className={`btn-frame modal ${buttonAct === 1 ? 'act' : ''}`} onClick={() => setButtonAct(1)}>
ディスプレイ設定
</button>
<button className={`btn-frame modal ${buttonAct === 2 ? 'act' : ''}`} onClick={() => setButtonAct(2)}>
フォントと図面サイズの設定
</button>
</div>
{buttonAct === 1 && <FirstOption />}
{buttonAct === 2 && <SecondOption />}
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,117 @@
'use client'
import Link from 'next/link'
import QSelectBox from '@/components/common/select/QSelectBox'
import { usePathname } from 'next/navigation'
export const ToggleonMouse = (e, act, target) => {
const listWrap = e.target.closest(target)
const ListItem = Array.from(listWrap.childNodes)
ListItem.forEach((el) => {
if (act === 'add') {
el.classList.add('mouse')
} else {
el.classList.remove('mouse')
}
})
if (act === 'add') {
e.target.parentElement.classList.remove('mouse')
}
}
export default function Header() {
const pathName = usePathname()
if (pathName.includes('login')) {
return null
}
const SelectOption = [{ name: 'オンライン保証シ' }, { name: 'ステム' }]
return (
<header>
<div className="header-inner">
<div className="header-right">
<h1 className="logo">
<Link href={'/'}></Link>
</h1>
<nav>
<ul className="nav-list ">
<li
className="nav-item "
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
<Link href={'#'}>ホームへ</Link>
</li>
<li
className="nav-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
<button>物品及び図面管理</button>
<ul className="nav-depth2">
<li
className="nav-depth2-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
<Link href={'#'}>新規物件登録</Link>
</li>
<li
className="nav-depth2-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
<Link href={'#'}>モノ/図面管理</Link>
</li>
</ul>
</li>
<li
className="nav-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
<button>コミュニティ</button>
<ul className="nav-depth2">
<li
className="nav-depth2-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
<Link href={'#'}>お知らせ</Link>
</li>
<li
className="nav-depth2-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
<Link href={'#'}>FAQ</Link>
</li>
<li
className="nav-depth2-item"
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
<Link href={'#'}>素材のダウンロード</Link>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div className="header-left">
<div className="profile-box">
<button className="profile">Kim Ji Young</button>
</div>
<div className="sign-out-box">
<button className="sign-out">ログアウト</button>
</div>
<div className="select-box">
<QSelectBox title={'Q.ORDER'} option={SelectOption} />
</div>
<div className="btn-wrap">
<button className="btn-frame small dark">移動</button>
</div>
</div>
</div>
</header>
)
}

View File

@ -4,7 +4,7 @@ import { fabric } from 'fabric'
import { actionHandler, anchorWrapper, polygonPositionHandler } from '@/util/canvas-util'
import { useRecoilState } from 'recoil'
import { canvasSizeState, fontSizeState } from '@/store/canvasAtom'
import { canvasSizeState, canvasState, fontSizeState } from '@/store/canvasAtom'
import { QLine } from '@/components/fabric/QLine'
import { QPolygon } from '@/components/fabric/QPolygon'
import { defineQLine } from '@/util/qline-utils'
@ -14,7 +14,7 @@ import { useCanvasEvent } from '@/hooks/useCanvasEvent'
import { post } from '@/lib/Axios'
export function useCanvas(id) {
const [canvas, setCanvas] = useState()
const [canvas, setCanvas] = useRecoilState(canvasState)
const [isLocked, setIsLocked] = useState(false)
const [history, setHistory] = useState([])
const [backImg, setBackImg] = useState()

View File

@ -14,25 +14,26 @@ import { useRecoilState, useRecoilValue } from 'recoil'
import {
canvasSizeState,
canvasState,
compassState,
drewRoofCellsState,
fontSizeState,
guideLineState,
horiGuideLinesState,
modeState,
objectPlacementModeState,
roofPolygonArrayState,
roofPolygonPatternArrayState,
roofState,
sortedPolygonArray,
templateTypeState,
wallState,
guideLineState,
horiGuideLinesState,
vertGuideLinesState,
objectPlacementModeState,
wallState,
} from '@/store/canvasAtom'
import { QLine } from '@/components/fabric/QLine'
import { fabric } from 'fabric'
import { QPolygon } from '@/components/fabric/QPolygon'
import offsetPolygon, { inPolygon } from '@/util/qpolygon-utils'
import offsetPolygon from '@/util/qpolygon-utils'
import { isObjectNotEmpty } from '@/util/common-utils'
import * as turf from '@turf/turf'
import { INPUT_TYPE, Mode } from '@/common/common'
@ -43,7 +44,7 @@ export function useMode() {
const historyPoints = useRef([])
const historyLines = useRef([])
const startPoint = useRef()
const [canvas, setCanvas] = useState(null)
const [canvas, setCanvas] = useRecoilState(canvasState)
const [zoom, setZoom] = useState(100)
const [fontSize] = useRecoilState(fontSizeState)
const [sortedArray, setSortedArray] = useRecoilState(sortedPolygonArray)
@ -83,7 +84,6 @@ export function useMode() {
// return
// }
if (!canvas) return
setCanvas(canvas)
canvas?.off('mouse:out', removeMouseLines)
canvas?.on('mouse:out', removeMouseLines)
canvas?.off('mouse:move')
@ -685,7 +685,6 @@ export function useMode() {
mouseAndkeyboardEventClear()
addCommonMouseEvent()
setMode(mode)
setCanvas(canvas)
// mode별 이벤트 변경
@ -5150,7 +5149,6 @@ export function useMode() {
mode,
setMode,
changeMode,
setCanvas,
handleClear,
zoomIn,
zoomOut,

View File

@ -27,6 +27,28 @@ export async function getSession() {
return session
}
export async function setSession(data) {
const session = await getSession()
session.userId = data.userId
session.name = data.name
session.saleStoreId = data.saleStoreId
session.mail = data.mail
session.tel = data.tel
session.storeId = data.storeId
session.userNm = data.userNm
session.userNmKana = data.userNmKana
session.category = data.category
session.telNo = data.telNo
session.fax = data.fax
session.email = data.email
session.pwdInitYn = data.pwdInitYn
session.isLoggedIn = true
// console.log('session:', session)
await session.save()
}
export async function login(formData) {
const session = await getSession()

22
src/lib/file.js Normal file
View File

@ -0,0 +1,22 @@
'use server'
import path from 'path'
import multer from 'multer'
export const upload = (files) => {
console.log(files)
const storage = multer.diskStorage({
destination: (req, file, callback) => {
const extension = path.extname(file.originalname)
const basename = path.basename(file.originalname, extension)
callback(null, `/public/upload/${basename}-${Date.now()}${extension}`)
},
filename: (req, file, callback) => {
callback(null, `${file.fieldname}-${Date.now()}${path.extname(file.originalname)}`)
}
})
const test = multer({
storage: storage
}).array(files.name, 5)
console.log(test)
}

Some files were not shown because too many files have changed in this diff Show More