shopport 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 72 11% 95%;--foreground: 0 0% 7%;--card: 0 0% 100%;--card-foreground: 0 0% 7%;--popover: 0 0% 100%;--popover-foreground: 0 0% 7%;--border: 70 8% 86%;--muted: 70 8% 89%;--muted-foreground: 0 0% 7% / .55;--primary: 19 100% 49%;--primary-foreground: 0 0% 100%;--success: 142 71% 45%;--warning: 37 84% 55%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 100%;--radius: 8px}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-top-6{top:-1.5rem}.bottom-0{bottom:0}.bottom-\[20px\]{bottom:20px}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.top-8{top:2rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[5\]{z-index:5}.col-span-2{grid-column:span 2 / span 2}.float-right{float:right}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-ml-1{margin-left:-.25rem}.-mt-4{margin-top:-1rem}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[3px\]{margin-top:3px}.mt-px{margin-top:1px}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[13px\]{height:13px}.h-\[18px\]{height:18px}.h-\[24px\]{height:24px}.h-\[400px\]{height:400px}.h-\[40px\]{height:40px}.h-\[72px\]{height:72px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[280px\]{max-height:280px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-\[120px\]{min-height:120px}.min-h-\[320px\]{min-height:320px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[13px\]{width:13px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[220px\]{width:220px}.w-\[28px\]{width:28px}.w-\[32px\]{width:32px}.w-\[40px\]{width:40px}.w-\[50px\]{width:50px}.w-\[52px\]{width:52px}.w-\[56px\]{width:56px}.w-\[60px\]{width:60px}.w-\[72px\]{width:72px}.w-\[80px\]{width:80px}.w-\[860px\]{width:860px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[110px\]{min-width:110px}.min-w-\[155px\]{min-width:155px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.max-w-\[120px\]{max-width:120px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[240px\]{max-width:240px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[480px\]{max-width:480px}.max-w-\[560px\]{max-width:560px}.max-w-\[720px\]{max-width:720px}.max-w-\[860px\]{max-width:860px}.max-w-\[90px\]{max-width:90px}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-\[1\]{flex:1}.flex-\[2\]{flex:2}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.scroll-mt-4{scroll-margin-top:1rem}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[190px_1fr\]{grid-template-columns:190px 1fr}.grid-cols-\[1fr_auto_auto\]{grid-template-columns:1fr auto auto}.grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[2px\]{gap:2px}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--border))}.divide-border\/40>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .4)}.divide-border\/50>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .5)}.divide-border\/60>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .6)}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-clip{overflow:clip}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.rounded-b-md{border-bottom-right-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-br-xl{border-bottom-right-radius:.75rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tr-xl{border-top-right-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-t-2{border-top-width:2px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-200\/50{border-color:#fde68a80}.border-amber-200\/60{border-color:#fde68a99}.border-amber-500\/50{border-color:#f59e0b80}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-border{border-color:hsl(var(--border))}.border-border\/20{border-color:hsl(var(--border) / .2)}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-border\/60{border-color:hsl(var(--border) / .6)}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-foreground{border-color:hsl(var(--foreground))}.border-foreground\/50{border-color:hsl(var(--foreground) / .5)}.border-muted-foreground\/40{border-color:hsl(var(--muted-foreground) / .4)}.border-primary{border-color:hsl(var(--primary))}.border-primary-foreground\/20{border-color:hsl(var(--primary-foreground) / .2)}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/40{border-color:hsl(var(--primary) / .4)}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-primary\/60{border-color:hsl(var(--primary) / .6)}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-50\/50{background-color:#fffbeb80}.bg-amber-500\/60{background-color:#f59e0b99}.bg-background{background-color:hsl(var(--background))}.bg-black\/40{background-color:#0006}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-50\/50{background-color:#eff6ff80}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/60{background-color:#3b82f699}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-card\/80{background-color:hsl(var(--card) / .8)}.bg-card\/95{background-color:hsl(var(--card) / .95)}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-50\/50{background-color:#ecfdf580}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/50{background-color:#10b98180}.bg-foreground{background-color:hsl(var(--foreground))}.bg-foreground\/25{background-color:hsl(var(--foreground) / .25)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-50\/60{background-color:#f9fafb99}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground{background-color:hsl(var(--muted-foreground))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground) / .3)}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground) / .4)}.bg-muted-foreground\/50{background-color:hsl(var(--muted-foreground) / .5)}.bg-muted\/10{background-color:hsl(var(--muted) / .1)}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/5{background-color:hsl(var(--muted) / .05)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/15{background-color:#f9731626}.bg-pink-100{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/50{background-color:hsl(var(--primary) / .5)}.bg-primary\/60{background-color:hsl(var(--primary) / .6)}.bg-primary\/70{background-color:hsl(var(--primary) / .7)}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/15{background-color:#eab30826}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-4{padding:1rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[1px\],.py-px{padding-top:1px;padding-bottom:1px}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-0\.5{padding-left:.125rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-7{padding-top:1.75rem}.pt-\[15vh\]{padding-top:15vh}.pt-\[8vh\]{padding-top:8vh}.pt-px{padding-top:1px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[20px\]{font-size:20px}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/70{color:#fbbf24b3}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-background{color:hsl(var(--background))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-border{color:hsl(var(--border))}.text-destructive{color:hsl(var(--destructive))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-emerald-800{--tw-text-opacity: 1;color:rgb(6 95 70 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/40{color:hsl(var(--foreground) / .4)}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-foreground\/60{color:hsl(var(--foreground) / .6)}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/30{color:hsl(var(--muted-foreground) / .3)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-pink-700{--tw-text-opacity: 1;color:rgb(190 24 93 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/60{color:hsl(var(--primary) / .6)}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-500\/80{color:#ef4444cc}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/90{color:#ffffffe6}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.decoration-muted-foreground\/40{text-decoration-color:hsl(var(--muted-foreground) / .4)}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.accent-primary{accent-color:hsl(var(--primary))}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-amber-400\/60{--tw-ring-color: rgb(251 191 36 / .6)}.ring-primary\/50{--tw-ring-color: hsl(var(--primary) / .5)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.marker\:text-muted-foreground\/40 *::marker{color:hsl(var(--muted-foreground) / .4)}.marker\:text-muted-foreground\/40::marker{color:hsl(var(--muted-foreground) / .4)}.placeholder\:text-muted-foreground\/40::-moz-placeholder{color:hsl(var(--muted-foreground) / .4)}.placeholder\:text-muted-foreground\/40::placeholder{color:hsl(var(--muted-foreground) / .4)}.placeholder\:text-muted-foreground\/60::-moz-placeholder{color:hsl(var(--muted-foreground) / .6)}.placeholder\:text-muted-foreground\/60::placeholder{color:hsl(var(--muted-foreground) / .6)}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bottom-0:after{content:var(--tw-content);bottom:0}.after\:right-0:after{content:var(--tw-content);right:0}.after\:top-0:after{content:var(--tw-content);top:0}.after\:w-\[6px\]:after{content:var(--tw-content);width:6px}.after\:bg-gradient-to-r:after{content:var(--tw-content);background-image:linear-gradient(to right,var(--tw-gradient-stops))}.after\:from-black\/\[0\.04\]:after{content:var(--tw-content);--tw-gradient-from: rgb(0 0 0 / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.after\:to-transparent:after{content:var(--tw-content);--tw-gradient-to: transparent var(--tw-gradient-to-position)}.first\:pt-0:first-child{padding-top:0}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:pb-0:last-child{padding-bottom:0}.hover\:border-foreground\/30:hover{border-color:hsl(var(--foreground) / .3)}.hover\:border-foreground\/40:hover{border-color:hsl(var(--foreground) / .4)}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:border-primary\/70:hover{border-color:hsl(var(--primary) / .7)}.hover\:bg-blue-50\/40:hover{background-color:#eff6ff66}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/15:hover{background-color:hsl(var(--muted) / .15)}.hover\:bg-muted\/20:hover{background-color:hsl(var(--muted) / .2)}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted) / .4)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted) / .6)}.hover\:bg-muted\/70:hover{background-color:hsl(var(--muted) / .7)}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary) / .05)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.focus\:border-foreground:focus{border-color:hsl(var(--foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary\/50:focus{--tw-ring-color: hsl(var(--primary) / .5)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:text-foreground\/80{color:hsl(var(--foreground) / .8)}@media(min-width:640px){.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[140px_1fr\]{grid-template-columns:140px 1fr}.sm\:grid-cols-\[190px_1fr\]{grid-template-columns:190px 1fr}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.sm\:divide-border\/40>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .4)}}@media(min-width:768px){.md\:-mt-7{margin-top:-1.75rem}.md\:block{display:block}.md\:hidden{display:none}.md\:h-auto{height:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[200px_1fr\]{grid-template-columns:200px 1fr}.md\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.md\:pt-7{padding-top:1.75rem}}@media(min-width:1024px){.lg\:block{display:block}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1fr_2fr_1fr\]{grid-template-columns:1fr 2fr 1fr}}@media(prefers-color-scheme:dark){.dark\:border-amber-800\/40{border-color:#92400e66}.dark\:border-amber-900\/50{border-color:#78350f80}.dark\:border-amber-900\/60{border-color:#78350f99}.dark\:border-blue-900\/60{border-color:#1e3a8a99}.dark\:border-emerald-900\/60{border-color:#064e3b99}.dark\:border-red-900\/50{border-color:#7f1d1d80}.dark\:bg-amber-950\/20{background-color:#451a0333}.dark\:bg-amber-950\/30{background-color:#451a034d}.dark\:bg-amber-950\/50{background-color:#451a0380}.dark\:bg-blue-950\/20{background-color:#17255433}.dark\:bg-blue-950\/50{background-color:#17255480}.dark\:bg-card{background-color:hsl(var(--card))}.dark\:bg-emerald-950\/20{background-color:#022c2233}.dark\:bg-emerald-950\/30{background-color:#022c224d}.dark\:bg-emerald-950\/50{background-color:#022c2280}.dark\:bg-green-950\/50{background-color:#052e1680}.dark\:bg-muted\/5{background-color:hsl(var(--muted) / .05)}.dark\:bg-orange-900\/30{background-color:#7c2d124d}.dark\:bg-purple-950\/50{background-color:#3b076480}.dark\:bg-red-950\/20{background-color:#450a0a33}.dark\:bg-red-950\/50{background-color:#450a0a80}.dark\:bg-sky-950\/50{background-color:#082f4980}.dark\:bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-200{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.dark\:text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.dark\:text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.dark\:text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.dark\:text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:after\:from-white\/\[0\.06\]:after{content:var(--tw-content);--tw-gradient-from: rgb(255 255 255 / .06) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:hover\:bg-muted\/20:hover{background-color:hsl(var(--muted) / .2)}}.\[\&\>tr\:nth-child\(even\)\]\:bg-muted\/20>tr:nth-child(2n){background-color:hsl(var(--muted) / .2)}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>shopport</title>
7
- <script type="module" crossorigin src="/assets/index-Dh2-G2x8.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-DAxsfpd0.css">
7
+ <script type="module" crossorigin src="/assets/index-DhcOyWfS.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-RHH7fYHT.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: sppt-policy-ask
3
+ description: |
4
+ PG사·판매채널 정산·수수료 정책 Q&A.
5
+ Use when asked about "수수료율", "정산 주기", "지급보류", "D+", "영세 중소",
6
+ "토스페이먼츠", "카페24페이먼츠", "이니시스", "정책", "언제 정산돼".
7
+ ---
8
+
9
+ # policy-ask
10
+
11
+ PG사·판매채널 정책 DB를 검색해 수수료·정산·지급보류 질문에 답변.
12
+
13
+ ## 채널 키
14
+
15
+ | 질문 대상 | `--channel` 값 |
16
+ |---|---|
17
+ | 토스페이먼츠 | `toss-payments` |
18
+ | 카페24페이먼츠 | `cafe24-payments` |
19
+ | KG이니시스 | `kg-inicis` |
20
+ | 네이버페이 | `naver-pay` |
21
+ | 카페24 운영·결제 FAQ | `cafe24` |
22
+ | 스마트스토어 | `naver-smartstore` |
23
+ | 쿠팡 | `coupang` |
24
+
25
+ ## Steps
26
+
27
+ ### 1. 채널·키워드 결정
28
+ - 특정 PG사/채널 언급 → 해당 채널만
29
+ - "PG사별 비교", 채널 미언급 → 관련 채널 전체 순회
30
+ - 핵심 키워드 2~3단어 추출 (예: "수수료율", "정산 주기", "지급보류")
31
+
32
+ ### 2. 채널별 검색
33
+ ```bash
34
+ sppt settlement policy search "<키워드>" --channel <채널키> --limit 5
35
+ ```
36
+
37
+ 비교 질문은 채널당 limit 3으로 순회:
38
+ ```bash
39
+ sppt settlement policy search "수수료율" --channel toss-payments --limit 3
40
+ sppt settlement policy search "수수료율" --channel cafe24-payments --limit 3
41
+ sppt settlement policy search "수수료율" --channel kg-inicis --limit 3
42
+ ```
43
+
44
+ ### 3. 결과 합성
45
+ - 채널별로 구분해서 답변, 숫자(%, D+N)는 강조
46
+ - 출처 채널 명시
47
+ - DB에 없는 내용은 추측 금지
48
+
49
+ ## Notes
50
+ - **반드시 `--channel` 명시** — 미지정 시 naver FAQ(4000건)로 편향됨
51
+ - `fee_rate` 레코드는 등급별로 분리되어 있어 여러 건이 정상
52
+ - 결과 0건이면 키워드를 1~2단어로 줄여 재시도
@@ -1,36 +1,33 @@
1
1
  ---
2
2
  name: sppt-product-parse
3
3
  description: |
4
- 주문 상품명을 SKU/카테고리/제품라인으로 해체하는 파싱 워크플로우.
5
- Use when asked to "상품명 분석", "SKU별 정리", "미매핑 상품 확인".
4
+ 주문 상품명을 SKU/카테고리/제품라인으로 해체하고, 채널옵션→SKU 매핑까지 완료하는 워크플로우.
5
+ Use when asked to "상품명 분석", "SKU별 정리", "미매핑 상품 확인", "매핑 설정".
6
6
  ---
7
7
 
8
8
  # product-parse
9
9
 
10
- 주문 데이터의 상품명을 사용자 정의 규칙에 따라 SKU/카테고리/제품라인 단위로 해체.
10
+ 주문 데이터의 상품명 SKU 카탈로그 구축 채널옵션 매핑까지의 전체 워크플로우.
11
11
 
12
12
  ## When to use
13
13
 
14
- - "상품명 분석해줘", "SKU별로 정리해줘", "제품라인별 매출 보고 싶어"
15
- - 주문 데이터 임포트 상품 카탈로그를 구축하고 싶을 때
16
- - "미매핑 상품 있는지 확인해줘"
14
+ - 주문 임포트 상품 카탈로그를 구축하고 싶을
15
+ - 미매핑 상품이 있는지 확인하고 싶을 때
16
+ - 채널 옵션별 수량/세트 구성을 설정하고 싶을 때
17
17
 
18
18
  ## Prerequisites
19
19
 
20
20
  - 주문 데이터가 임포트되어 있어야 함 (`sppt import <file>` 또는 API 동기화)
21
- - 상품 분류 규칙 파일이 있으면 더 정확함 (없으면 LLM이 자체 판단)
22
21
 
23
22
  ## Steps
24
23
 
25
24
  ### 1. 상태 확인
26
25
 
27
- 먼저 현재 상태를 파악합니다.
28
-
29
26
  ```bash
30
27
  sppt product unmapped
31
28
  ```
32
29
 
33
- 미매핑 상품명이 몇 건인지 확인합니다. 이미 전부 매핑되어 있으면 완료.
30
+ 미매핑 상품명이 몇 건인지 확인. 전부 매핑되어 있으면 Step 7로 건너뜁니다.
34
31
 
35
32
  ### 2. 분류 규칙 확인
36
33
 
@@ -38,80 +35,34 @@ sppt product unmapped
38
35
  sppt product rules
39
36
  ```
40
37
 
41
- 클라우드(대시보드 DB)에서 현재 규칙을 읽어옵니다.
42
-
43
- - **규칙이 있으면**: 내용을 읽고 규칙을 이해합니다.
44
- - **규칙이 없으면**: 사용자에게 물어봅니다:
45
- - "상품 분류 규칙이 있나요? (카테고리, 제품라인 등)"
46
- - 사용자가 알려주면 아래 방법으로 저장합니다.
47
- - 없으면 상품명에서 자체 판단합니다.
48
-
49
- #### 규칙 저장/수정 방법 (AI용)
50
-
51
- 규칙을 작성하거나 수정할 때는 다음 순서로 진행합니다:
52
-
53
- 1. 현재 규칙 내용을 가져와 임시 파일로 저장:
54
-
55
- ```bash
56
- sppt product rules # 내용 확인
57
- ```
58
-
59
- 2. Write/Edit 툴로 `/tmp/product-rules.md`에 수정 내용 작성
38
+ - **규칙이 있으면**: 내용을 읽고 이해합니다.
39
+ - **규칙이 없으면**: 사용자에게 "상품 분류 규칙이 있나요?" 질문 → 없으면 상품명에서 자체 판단.
60
40
 
61
- 3. 클라우드에 반영:
41
+ 규칙 파일에 다음이 포함되면 카탈로그 + 매핑 모두 정확해집니다:
62
42
 
63
- ```bash
64
- sppt product rules set /tmp/product-rules.md
65
- ```
43
+ 1. **카테고리/라인 분류**: 키워드 → 카테고리/라인 매핑
44
+ 2. **SKU 체계**: SKU 코드 생성 규칙
45
+ 3. **세트 구성**: 세트 SKU의 단품 구성 (예: `CKRS-SET2 = CKRS-WASH × 1 + CKRS-LOTN × 1`)
46
+ 4. **수량 옵션 패턴**: 옵션명 → 수량 (예: `"2set" → ×2`)
66
47
 
67
- 오프라인 환경에서 로컬 파일만 수정할 때는 `--local` 플래그를 사용합니다.
48
+ 규칙 저장: Write 툴로 `/tmp/product-rules.md` 작성 `sppt product rules set /tmp/product-rules.md`
68
49
 
69
50
  ### 3. 상품명 해체
70
51
 
71
- `sppt product unmapped`의 결과 목록을 가져온 후, 분류 규칙을 참고하여 각 상품명을 해체합니다.
72
-
73
- #### 해체 결과 구조
74
-
75
- 각 상품명에서 다음을 추출합니다:
76
-
77
- | 필드 | 설명 | 예시 |
78
- |------|------|------|
79
- | sku | 정규 SKU 코드 | AB-MC20 |
80
- | brand | 브랜드명 | 알텐바흐 |
81
- | productLine | 제품 라인 | 316Ti |
82
- | category | 카테고리 | 냄비 |
83
- | productName | 정규 상품명 | 멀티쿠커 편수 |
84
- | option | 옵션/사이즈 | 20cm |
85
-
86
- #### 해체 원칙
87
-
88
- 1. **규칙 우선**: `product-rules.md`에 명시된 분류 규칙을 최우선으로 적용
89
- 2. **MECE**: 모든 상품이 빠짐없이 하나의 카테고리에 정확히 배정되어야 함
90
- 3. **모호한 경우 질문**: 규칙으로 판단 불가능한 경우, 자의적 분류 대신 사용자에게 질문
91
- 4. **세트 상품 분해**: 세트/번들 상품은 구성 단품 SKU로 분해 (규칙에 명시된 경우)
52
+ 미매핑 상품명을 분류 규칙에 따라 해체합니다.
92
53
 
93
- #### SKU 코드 생성 규칙
94
-
95
- 사용자가 별도 SKU 체계를 가지고 있으면 그것을 따릅니다.
96
- 없으면 다음 패턴으로 자동 생성:
97
-
98
- ```
99
- {브랜드 약어}-{제품라인 약어}-{옵션코드}
100
- 예: AB-DF-FP28 (알텐바흐-디피니티-프라이팬28cm)
101
- ```
54
+ - **규칙 우선**: `product-rules.md` 규칙을 최우선 적용
55
+ - **MECE**: 모든 상품이 하나의 카테고리에 정확히 배정
56
+ - **모호한 경우**: 자의적 분류 대신 사용자에게 질문
102
57
 
103
58
  ### 4. 결과 저장
104
59
 
105
- 해체 결과를 카탈로그에 저장합니다.
106
-
107
- 엔트리 배열을 `/tmp/product-catalog-entries.json`에 저장한 뒤 CLI로 임포트합니다:
60
+ 엔트리 배열을 `/tmp/product-catalog-entries.json`에 저장 후 임포트:
108
61
 
109
62
  ```bash
110
63
  sppt product catalog import /tmp/product-catalog-entries.json
111
64
  ```
112
65
 
113
- 파일 형식 (JSON 배열):
114
-
115
66
  ```json
116
67
  [
117
68
  {
@@ -129,26 +80,51 @@ sppt product catalog import /tmp/product-catalog-entries.json
129
80
 
130
81
  ### 5. 검증
131
82
 
83
+ `sppt product catalog`로 저장 확인 → `sppt product unmapped`로 미매핑 0건 확인.
84
+
85
+ ### 6. 채널옵션 → SKU 매핑 (enrichment)
86
+
87
+ 카탈로그 구축 후, 채널 옵션별 SKU 구성(수량, 세트 분해)을 매핑합니다.
88
+
132
89
  ```bash
133
- sppt product catalog
90
+ sppt product mapping --json # pending 매핑 목록 확인 (전부 confirmed면 완료)
134
91
  ```
135
92
 
136
- 저장된 카탈로그를 조회하여 결과를 확인합니다.
93
+ 규칙 파일의 세트 구성/수량 패턴을 참고하여 각 항목의 SKU 구성을 설정:
94
+
95
+ ```bash
96
+ sppt product mapping --edit 1 --skus "CKRS-LOTN:2" # 단품 2개
97
+ sppt product mapping --edit 2 --skus "CKRS-WASH:3:component,CKRS-LOTN:3:component" # 세트 × 3
98
+ ```
99
+
100
+ 설정 후 `sppt product mapping --json`으로 결과 검증 → 사용자 승인 → `sppt product mapping --confirm all`.
101
+ `--confirm` 시 경고가 출력되면 즉시 중단하고 사용자에게 보고.
102
+ 확정 완료 후 `sppt product mapping --confirmed`로 전체 확정 매핑 + 구성품 조회 가능.
103
+
104
+ #### 타입 선택 기준
105
+
106
+ `--skus` 형식: `SKU:수량[:타입[:정가]]` — 타입 생략 시 primary.
137
107
 
138
- 다시 `sppt product unmapped`를 실행하여 미매핑 상품이 0건인지 확인합니다.
108
+ | 타입 | 용도 | 매출 배분 |
109
+ |------|------|-----------|
110
+ | primary | 단품 (구성품 1개일 때) | 매출 100% |
111
+ | component | 세트 구성품 (2개 이상) | 정가 비율 or 균등 배분 |
112
+ | gift | 사은품 | 매출 0원, 수량만 집계 |
113
+ | packaging | 포장재 | 매출 0원, 수량만 집계 |
114
+ | sample | 샘플 | 매출 0원, 수량만 집계 |
139
115
 
140
- ### 6. 분석 활용
116
+ 세트 구성품이 2개 이상이고 정가(`listPrice`)를 설정하면 정가 비율로 매출 배분, 미설정 시 균등(1/N) 배분.
141
117
 
142
- 카탈로그가 구축되면 대시보드에서 다음 분석이 가능합니다:
118
+ #### 판단 원칙
143
119
 
144
- - SKU별 판매량/매출 집계
145
- - 제품라인별 비교 (어떤 라인이 팔리나)
146
- - 카테고리별 매출 비중
147
- - 옵션/사이즈별 선호도
120
+ 1. **수량 추출**: "2개"/"2set"/"2ea"/"2개입" → ×2. 단독 숫자는 모호 → 사용자 확인
121
+ 2. **세트 분해**: 규칙에 구성 정보가 있으면 구성품 SKU로 분해 (타입: component)
122
+ 3. **포장 옵션**: SKU 구성에 영향 없음 (포장재 SKU가 있으면 packaging 타입으로 추가)
123
+ 4. **모호한 경우**: 사용자에게 질문 (자의적 판단 금지)
124
+ 5. **대량 매핑**: 20개 이상이면 패턴별 그룹핑 후 일괄 처리
148
125
 
149
126
  ## Tips
150
127
 
151
- - 규칙 파일은 자연어로 자유롭게 작성하세요. 이 스킬이 읽고 해석합니다.
152
- - 한번 매핑된 상품명은 캐시되어 다음에는 자동 적용됩니다.
153
- - 새로운 상품이 추가되면 `sppt product unmapped`로 확인 후 추가 해체합니다.
154
- - 잘못된 매핑은 다시 해체하거나 `sppt product catalog edit <sku>`로 수정할 수 있습니다.
128
+ - 규칙 파일은 자연어로 자유롭게 작성. 이 스킬이 읽고 해석합니다.
129
+ - 매핑된 상품명은 캐시되어 다음에는 자동 적용됩니다.
130
+ - 상품 추가 `sppt product unmapped`로 확인 후 추가 해체.
@@ -92,6 +92,23 @@ smartstore 620,000 34,100 585,900 94.5%
92
92
  합계 3,620,000 294,350 3,325,650 91.9%
93
93
  ```
94
94
 
95
+ ### 6. 은행 입금 내역 임포트 (카페24 대사용)
96
+
97
+ 카페24 정산 대사를 위해 실제 통장 입금 내역을 DB에 올립니다:
98
+
99
+ ```bash
100
+ # KB·신한·우리·하나 CSV 자동 감지
101
+ sppt settlement deposit <file.csv>
102
+
103
+ # 날짜 범위 필터 + 미리보기
104
+ sppt settlement deposit <file.csv> --from 2026-04-01 --to 2026-05-01 --dry-run
105
+
106
+ # 잘못 올린 항목 삭제
107
+ sppt settlement deposit delete --date 2026-04-06 --provider 카페24페이먼
108
+ ```
109
+
110
+ 임포트 후 대시보드 정산 페이지 → 카페24 → '정산 대사' 패널에서 확인합니다.
111
+
95
112
  ## Error handling
96
113
 
97
114
  - **수수료 규칙 미설정**: 채널 기본 수수료율로 안내 후 설정 유도
@@ -31,6 +31,7 @@ sppt --help
31
31
  | `/sppt-price-monitor` | 소싱가 변동 감지 → 마진 체크 → 판매가 조정 |
32
32
  | `/sppt-weekly-analysis` | 전주 대비 매출 변화 원인 분석 + 채널 수수료 최적화 |
33
33
  | `/sppt-settlement-report` | 정산 현황 조회 + 수익 요약 |
34
+ | `/sppt-policy-ask` | PG사·판매채널 수수료·정산 정책 Q&A |
34
35
  | `/sppt-cost-calc` | 원가/마진/수수료 계산 |
35
36
  | `/sppt-trend-research` | 트렌드 키워드 리서치 |
36
37
  | `/sppt-dashboard` | 운영 대시보드 띄우기 |
@@ -43,7 +44,14 @@ sppt init # 채널 온보딩
43
44
  sppt status # 연결 상태 확인
44
45
  sppt context # AI용 스토어 브리핑
45
46
  sppt order list cafe24 # 주문 조회
47
+ sppt order exclude <id> --reason "테스트" # 매출 집계에서 제외
48
+ sppt order excluded # 제외된 주문 목록
49
+ sppt report --by category --explain # 수량 기여 분해
50
+ sppt product mapping --confirmed # 확정 SKU 매핑 조회
51
+ sppt settlement deposit <file.csv> # 은행 입금 내역 CSV 임포트 (KB·신한·우리·하나)
52
+ sppt settlement deposit delete --date YYYY-MM-DD --provider <입금처> # 입금 내역 삭제
46
53
  ```
47
54
 
48
- 판매 채널: cafe24, coupang, smartstore, shopify
49
- 소싱 채널: domemae, domeggook, specialoffer, cjdropshipping
55
+ 판매 채널: cafe24, coupang, smartstore, shopify, toss-shopping, 29cm, musinsa
56
+ 소싱 채널: domemae, domeggook, specialoffer, cjdropshipping, 1688
57
+ 물류 채널: dada-erp, ezadmin, onewms, sabangnet, boxhero, ecount-erp, douzone-wehago, playauto, argo, poomgo
@@ -32,6 +32,7 @@ sppt context # AI용 스토어 브리핑
32
32
  | `/sppt-price-monitor` | 소싱가 변동 감지 → 마진 체크 → 판매가 조정 |
33
33
  | `/sppt-weekly-analysis` | 전주 대비 매출 변화 원인 분석 + 채널 수수료 최적화 |
34
34
  | `/sppt-settlement-report` | 정산 현황 조회 + 수익 요약 |
35
+ | `/sppt-policy-ask` | PG사·판매채널 수수료·정산 정책 Q&A |
35
36
  | `/sppt-cost-calc` | 원가/마진/수수료 계산 |
36
37
  | `/sppt-trend-research` | 트렌드 키워드 리서치 |
37
38
  | `/sppt-dashboard` | 운영 대시보드 띄우기 |
@@ -40,43 +41,131 @@ sppt context # AI용 스토어 브리핑
40
41
  ## CLI 커맨드 요약
41
42
 
42
43
  ### 설정
43
- - `sppt init [channel]` — 채널 온보딩
44
- - `sppt auth <channel>` — OAuth 인증
44
+ - `sppt init [channel]` — 채널 온보딩 (`--json`, `--local`, `--terminal`)
45
+ - `sppt auth login`브라우저 OAuth 로그인
46
+ - `sppt auth logout` — 세션 초기화
47
+ - `sppt auth whoami` — 현재 로그인 계정 확인
48
+ - `sppt auth cafe24 --mall <id> --client-id <id> --client-secret <secret>` — Cafe24 토큰 재발급
45
49
  - `sppt config list|get|set|remove` — 설정 관리
50
+ - `sppt setup-skills` — Claude Code 스킬 설치 (`uninstall`로 제거)
51
+
52
+ ### 상태/모니터링
53
+ - `sppt status` / `sppt health` — 채널 연결 헬스체크 (`--suppliers`, `--check`)
54
+ - `sppt context [--json]` — AI용 스토어 브리핑
55
+ - `sppt dashboard` / `sppt dash` — 웹 대시보드 (`--local`)
56
+ - `sppt cap [channel]` — 채널별 API 기능 지원 현황
57
+ - `sppt budget [set <channel> <limit>]` — API 사용량/제한 관리
58
+ - `sppt log [--days N]` — 작업 이력
46
59
 
47
60
  ### 상품
48
- - `sppt product list|get|register|update|delete <channel>` — 상품 CRUD
49
- - `sppt product keyword|seo|image <channel>`SEO/이미지 관리
50
- - `sppt product sync-batch`배치 복사
61
+ - `sppt product list <channel> [--limit N] [--search <term>]` — 상품 목록
62
+ - `sppt product list [channel] --from-orders` 주문 기반 크로스채널 상품 조회
63
+ - `sppt product get <channel> <productId>` 상품 상세
64
+ - `sppt product register <channel> --file <path>` — 상품 등록 (`--all-channels`로 전채널 동시 등록)
65
+ - `sppt product update <channel> <productId> --file <path>` — 상품 수정
66
+ - `sppt product status <channel> <productId>` — 상품 상태 확인
67
+ - `sppt product delete <channel> <productId>` — 상품 삭제
68
+ - `sppt product sync <from> <to> <id> [--markup N]` — 단건 채널 간 복사
69
+ - `sppt product sync-batch <from> <to> [--ids ...] [--all] [--markup N]` — 배치 복사
70
+ - `sppt product keyword get|set|support` — 검색 키워드/태그 관리
71
+ - `sppt product seo get|set|support` — SEO 메타데이터 관리
72
+ - `sppt product image get|set|add|delete|support` — 이미지 관리
73
+ - `sppt product catalog [--local]` — 상품 카탈로그 브라우징
74
+ - `sppt product unmapped [--local]` — 미매핑 상품 목록
75
+ - `sppt product rules [set <file>] [--local]` — 분류 규칙 조회/설정
76
+ - `sppt product parse [--file <mapping.csv>]` — 매핑 파일에서 카탈로그 파싱
77
+ - `sppt product mapping [--edit N] [--confirm N|all] [--confirmed] [--json]` — SKU 매핑 관리
78
+ - `sppt product candidates` — 매핑 후보 조회
51
79
 
52
80
  ### 주문/송장
53
81
  - `sppt order list|get|confirm|cancel|return <channel>` — 주문 관리
54
- - `sppt invoice register <channel> <orderId> <carrier> <tracking>`송장
82
+ - `sppt order add <channel> --product "name" --price N [--qty N] [--date DATE]` 수동 주문 추가
83
+ - `sppt order remove <orderId>` — 수동 주문 삭제
84
+ - `sppt order delete [--ids ...] [--channel <ch>] [--from DATE] [--to DATE]` — 벌크 삭제
85
+ - `sppt order exclude <channelOrderId> [--reason "사유"]` — 매출 집계에서 제외
86
+ - `sppt order include <channelOrderId>` — 제외 해제
87
+ - `sppt order excluded` — 제외된 주문 목록
88
+ - `sppt invoice register <channel> <orderId> <carrier> <tracking>` — 송장 등록
89
+
90
+ ### 재고
91
+ - `sppt inventory sync <channel> <productId> <qty> [--delta] [--location <id>]` — 재고 수량 업데이트
92
+ - `sppt inventory plan <totalStock> [sku] [--buffer N] [--ratio ...]` — 채널별 재고 분배 계획
93
+ - `sppt inventory bundle add <bundleSku> <componentSku> --qty N` — 세트 구성 등록
94
+ - `sppt inventory bundle list [bundleSku]` — 세트 구성 조회
95
+ - `sppt inventory bundle remove <bundleSku> <componentSku>` — 세트 구성 삭제
55
96
 
56
97
  ### 소싱
57
- - `sppt source search|detail|categories|route|score` — 소싱 채널
98
+ - `sppt source search <channel> <keyword> [--page N]` — 소싱 상품 검색
99
+ - `sppt source search <channel> <keyword> --waterfall [--strategy first|best]` — 멀티채널 워터폴 검색
100
+ - `sppt source detail <channel> <productId> [--market-check]` — 소싱 상품 상세
101
+ - `sppt source register <channel> <productId> <sellingChannel> [--markup N] [--dry-run]` — 소싱→판매채널 등록
102
+ - `sppt source market-check <keyword> [--price N]` — 시장 경쟁도 체크
103
+ - `sppt source verify-supplier <channel> <productId>` — 공급사 신뢰도 검증
104
+ - `sppt source categories <channel>` — 소싱 채널 카테고리 탐색
105
+ - `sppt source history [--tier 🟢|🟡|🔴] [--channel C] [--limit N]` — 소싱 이력
106
+ - `sppt source route <orderId> --keyword <kw> [--qty N] [--strategy first|best]` — 최적 공급사 라우팅
107
+ - `sppt source score record <sourceChannel> --on-time [--return]` — 공급사 성과 기록
58
108
 
59
109
  ### 정산
60
- - `sppt settlement calc|list|summary` — 정산 조회
61
- - `sppt settlement fee list|set|remove` — 수수료 규칙
110
+ - `sppt settlement calc [--channel C] [--from DATE] [--to DATE]` — 정산 계산
111
+ - `sppt settlement list [channel] [--days N] [--status S]` — 정산 목록
112
+ - `sppt settlement summary [channel] [--days N] [--from DATE] [--to DATE]` — 채널별 정산 합계
113
+ - `sppt settlement fee list|set|remove` — 수수료 규칙 관리
114
+ - `sppt settlement fee-check <channel> [--annual-revenue N] [--payment METHOD]` — 적용 수수료율 확인
115
+ - `sppt settlement hints <channel>` — 정산 불일치 사유 조회
116
+ - `sppt settlement refund <channel> <orderId> --amount N --commission N --pg N` — 환불 공제 계산
117
+ - `sppt settlement schedule [--from DATE] [--to DATE]` — 예정 정산일 조회
118
+ - `sppt settlement detail [--from DATE] [--to DATE] [--provider NAME]` — 입금 상세 내역
119
+ - `sppt settlement reconcile <channel>` — 정산 대사
120
+ - `sppt settlement deposit <file> [--bank ...] [--dry-run]` — 은행 입금 CSV 임포트 (KB·신한·우리·하나)
121
+ - `sppt settlement deposit delete --date <날짜> --provider <입금처>` — 입금 내역 삭제
122
+ - `sppt settlement pg-compare <channel> --amount N [--annual-revenue N]` — PG 수수료율 비교
123
+ - `sppt settlement policy search <term> [--channel C] [--type T]` — 정산 정책 검색
124
+
125
+ ### 원가
126
+ - `sppt cost set <skuId> --purchase <N> [--shipping N] [--packaging N] [--fulfillment N]` — 원가 설정
127
+ - `sppt cost list [--channel C]` — 원가 목록
128
+ - `sppt cost show <skuId> [--channel C]` — 원가 상세
129
+ - `sppt cost remove <skuId> [--channel C]` — 원가 삭제
62
130
 
63
131
  ### 가격/쿠폰
64
- - `sppt price set|variant` — 가격 변경
65
- - `sppt coupon create|issue` — 쿠폰
66
-
67
- ### 분석
68
- - `sppt trend keyword|compare|platform`트렌드
69
- - `sppt report revenue|--by <dimension>` 매출 리포트
70
- - `sppt dashboard` — 웹 대시보드
71
-
72
- ### 데이터
73
- - `sppt context` — AI용 스토어 브리핑
74
- - `sppt status` — 헬스체크
75
- - `sppt log` — 작업 이력
132
+ - `sppt price set <channel> <productId> <price> [--sale-price N]` — 가격 변경
133
+ - `sppt price variant shopify <variantId> <price> [--compare-at N]` — Shopify 옵션가 변경
134
+ - `sppt price support` — 채널별 가격 기능 지원 현황
135
+ - `sppt coupon create <channel> --name <name> --type <type> --value <N>` — 쿠폰 생성
136
+ - `sppt coupon issue <channel> <couponId> --members <id1,id2,...>` 쿠폰 발급
137
+ - `sppt coupon support`채널별 쿠폰 기능 지원 현황
138
+
139
+ ### 분석/리포트
140
+ - `sppt trend keyword <keyword> [--volume] [--trend] [--months N]` — 검색량 + 트렌드
141
+ - `sppt trend compare <kw1> <kw2> [kw3...]` — 키워드 비교
142
+ - `sppt trend platform <platform> [--category C] [--limit N]` — 전문몰 랭킹
143
+ - `sppt trend coverage [--min-volume N]` — 카탈로그 키워드 커버리지 분석
144
+ - `sppt report revenue [--period <period>]` — 크로스채널 매출 요약
145
+ - `sppt report --by <category|productline|product|channel|sku>` — 다차원 매출 리포트
146
+ - `--explain` — SKU별 수량 기여 분해 (직접주문 vs 세트전개)
147
+ - `--include-excluded` — 제외된 주문도 포함하여 집계
148
+ - `sppt report compare --by <dim> --period <period>` — 기간 대비 비교 분석
149
+ - `sppt report daily [--period N] [--top N]` — 일간 리포트
150
+ - `sppt report weekly [--period N] [--top N]` — 주간 리포트
151
+
152
+ ### 물류
153
+ - `sppt logistics status` — 물류 채널 연결 상태
154
+ - `sppt logistics orders <channel> [--since DATE] [--status STATUS]` — 물류 주문 조회
155
+ - `sppt logistics ship <channel> <orderId> <carrierCode> <trackingNumber>` — 출고 등록
156
+ - `sppt logistics bulk <channel> --file shipments.json` — 벌크 출고 등록
157
+ - `sppt logistics stock <channel> [--sku SKU1,SKU2]` — 재고 수량 조회
158
+
159
+ ### 유틸리티
76
160
  - `sppt import <file>` — CSV/엑셀 임포트
161
+ - `sppt migrate cloud` — 로컬 데이터 → 클라우드 DB 마이그레이션
162
+ - `sppt issue "title" [--body "description"]` — GitHub Issue 버그 리포트 생성
77
163
 
78
164
  ## 판매 채널
79
- cafe24, coupang, smartstore, shopify
165
+ cafe24, coupang, smartstore, shopify, toss-shopping, 29cm, musinsa
80
166
 
81
167
  ## 소싱 채널
82
- domemae (위탁), domeggook (사입), specialoffer, cjdropshipping
168
+ domemae (위탁), domeggook (사입), specialoffer, cjdropshipping, 1688
169
+
170
+ ## 물류 채널
171
+ dada-erp, ezadmin, onewms, sabangnet, boxhero, ecount-erp, douzone-wehago, playauto, argo, poomgo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shopport",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "커머스 운영 자동화 CLI — Cafe24, Coupang, SmartStore, Shopify 통합 관리",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,6 +35,7 @@
35
35
  "dependencies": {
36
36
  "@browserbasehq/stagehand": "^2.0.0",
37
37
  "@e965/xlsx": "^0.20.3",
38
+ "@hyunbinseo/holidays-kr": "^4.2026.0",
38
39
  "@types/bcrypt": "^6.0.0",
39
40
  "axios": "^1.13.5",
40
41
  "basic-ftp": "^5.3.0",
@@ -44,6 +45,7 @@
44
45
  "zod": "^3.24.0"
45
46
  },
46
47
  "devDependencies": {
48
+ "@shopport/core": "workspace:*",
47
49
  "@shopport/types": "workspace:*",
48
50
  "@types/node": "^22.13.10",
49
51
  "javascript-obfuscator": "^5.4.1",