*,: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}.grid{display:grid}.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))}.resize{resize:both}:root{--bg-0: #0A0C12;--bg-1: #11141B;--bg-2: #161A23;--surface: rgba(22, 26, 35, .72);--surface-solid: #161A23;--surface-hover: rgba(31, 36, 48, .85);--border: rgba(255, 255, 255, .08);--border-strong: rgba(255, 255, 255, .14);--text: #ECEEF3;--text-muted: #8A93A6;--text-dim: #5B6478;--accent: #5B8DEF;--accent-2: #8B5CF6;--accent-3: #EC4899;--accent-hover: #6B9AFC;--accent-fg: #FFFFFF;--accent-glow: rgba(91, 141, 239, .35);--green: #34D399;--green-bg: rgba(52, 211, 153, .12);--green-border: rgba(52, 211, 153, .28);--orange: #FBBF24;--orange-bg: rgba(251, 191, 36, .12);--orange-border: rgba(251, 191, 36, .28);--red: #F87171;--red-bg: rgba(248, 113, 113, .12);--red-border: rgba(248, 113, 113, .32);--radius-sm: 8px;--radius: 14px;--radius-lg: 20px;--radius-pill: 999px;--shadow-sm: 0 1px 2px rgba(0,0,0,.25);--shadow: 0 4px 16px rgba(0,0,0,.35), 0 1px 2px rgba(0,0,0,.25);--shadow-lg: 0 24px 48px -12px rgba(0,0,0,.55), 0 4px 12px rgba(0,0,0,.3);--font: "Pretendard Variable", "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;--ease: cubic-bezier(.2, .8, .2, 1);--ease-out: cubic-bezier(.16, 1, .3, 1);--gradient-accent: linear-gradient(135deg, #5B8DEF 0%, #8B5CF6 50%, #EC4899 100%);--gradient-accent-soft: linear-gradient(135deg, rgba(91,141,239,.16), rgba(139,92,246,.14) 50%, rgba(236,72,153,.12))}[data-theme=light]{--bg-0: #F4F6FA;--bg-1: #ECEFF5;--bg-2: #FFFFFF;--surface: rgba(255, 255, 255, .85);--surface-solid: #FFFFFF;--surface-hover: rgba(248, 250, 253, .95);--border: rgba(15, 23, 42, .08);--border-strong: rgba(15, 23, 42, .14);--text: #0F172A;--text-muted: #5C6478;--text-dim: #94A3B8;--accent: #2563EB;--accent-2: #7C3AED;--accent-3: #DB2777;--accent-hover: #1D4ED8;--accent-glow: rgba(37, 99, 235, .22);--green: #16A34A;--green-bg: rgba(22, 163, 74, .1);--green-border: rgba(22, 163, 74, .25);--orange: #D97706;--orange-bg: rgba(217, 119, 6, .1);--orange-border: rgba(217, 119, 6, .25);--red: #DC2626;--red-bg: rgba(220, 38, 38, .1);--red-border: rgba(220, 38, 38, .25);--shadow: 0 4px 16px rgba(15,23,42,.08), 0 1px 2px rgba(15,23,42,.06);--shadow-lg: 0 24px 48px -12px rgba(15,23,42,.18), 0 4px 12px rgba(15,23,42,.08)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:15px;-webkit-text-size-adjust:100%;background:var(--bg-0)}body{font-family:var(--font);color:var(--text);line-height:1.5;min-height:100dvh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"ss01","cv11"}a{color:inherit;text-decoration:none}button{font-family:inherit}#dot-field{position:fixed;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none}.bg-orb{position:fixed;z-index:-1;pointer-events:none;border-radius:50%;filter:blur(110px);will-change:transform}.bg-orb-a{top:0;left:0;width:58vw;height:52vw;background:radial-gradient(circle,rgba(139,92,246,.4),transparent 82%)}.bg-orb-b{top:0;left:0;width:54vw;height:58vw;background:radial-gradient(circle,rgba(91,141,239,.38),transparent 82%)}[data-theme=light] .bg-orb-a{background:radial-gradient(circle,rgba(124,58,237,.26),transparent 82%)}[data-theme=light] .bg-orb-b{background:radial-gradient(circle,rgba(37,99,235,.24),transparent 82%)}@media(max-width:768px){.bg-orb{filter:blur(64px)}.bg-orb-a{width:96vw;height:88vw}.bg-orb-b{width:92vw;height:98vw}}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}::-moz-selection{background:var(--accent-glow);color:var(--text)}::selection{background:var(--accent-glow);color:var(--text)}.gradient-text{background:var(--gradient-accent);-webkit-background-clip:text;background-clip:text;color:transparent}.glass{background:var(--surface);border:1px solid var(--border);backdrop-filter:blur(24px) saturate(140%);-webkit-backdrop-filter:blur(24px) saturate(140%);box-shadow:var(--shadow)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-thumb:hover{background:var(--text-dim);background-clip:content-box}@keyframes fadeUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes slideInRight{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 16px;height:38px;border:1px solid transparent;border-radius:var(--radius-sm);font:500 13.5px var(--font);color:var(--text);cursor:pointer;transition:background .18s var(--ease),color .18s var(--ease),border-color .18s var(--ease),transform .12s var(--ease),box-shadow .18s var(--ease),opacity .18s var(--ease);white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;overflow:hidden;isolation:isolate}.btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:not(:disabled):active{transform:translateY(1px) scale(.98)}.btn-primary{background:var(--gradient-accent);background-size:200% 100%;background-repeat:no-repeat;background-clip:padding-box;color:var(--accent-fg);box-shadow:0 1px #ffffff2e inset,0 6px 16px -4px var(--accent-glow)}.btn-primary:hover:not(:disabled){filter:brightness(1.08);background-position:100% 50%;box-shadow:0 1px #ffffff38 inset,0 10px 22px -4px var(--accent-glow)}.btn-primary:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(120deg,transparent 30%,rgba(255,255,255,.28) 50%,transparent 70%);transform:translate(-100%);transition:transform .6s var(--ease);pointer-events:none;z-index:-1}.btn-primary:hover:not(:disabled):after{transform:translate(100%)}.btn-ghost{background:var(--surface);color:var(--text);border-color:var(--border);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.btn-ghost:hover:not(:disabled){background:var(--surface-hover);border-color:var(--border-strong)}.btn-danger{background:var(--red-bg);color:var(--red);border-color:var(--red-border)}.btn-danger:hover:not(:disabled){background:#f8717133;border-color:var(--red)}[data-theme=light] .btn-danger:hover:not(:disabled){background:#dc262629}.btn-sm{height:32px;padding:0 12px;font-size:12.5px;gap:5px}.btn[data-loading=true]{pointer-events:none;color:transparent!important}.btn[data-loading=true]:before{content:"";position:absolute;width:16px;height:16px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;color:var(--text);animation:spin .7s linear infinite}.btn-primary[data-loading=true]:before{color:#fff}.card{position:relative;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);backdrop-filter:blur(24px) saturate(140%);-webkit-backdrop-filter:blur(24px) saturate(140%);transition:border-color .2s var(--ease),box-shadow .2s var(--ease),transform .2s var(--ease);animation:fadeUp .5s var(--ease-out) backwards}.auth-view{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;min-height:100dvh;padding:24px}.login-card{width:100%;max-width:400px;box-shadow:var(--shadow-lg);animation:scaleIn .5s var(--ease-out);overflow:hidden}.login-logo{display:flex;flex-direction:column;align-items:center;gap:10px;padding:36px 24px 28px;border-bottom:1px solid var(--border);position:relative}.login-logo:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(circle at 50% 0%,var(--accent-glow),transparent 60%);pointer-events:none;opacity:.8}.login-logo-icon{position:relative;width:72px;height:72px;display:flex;align-items:center;justify-content:center}.login-logo-icon .logo-mark{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;display:block}[data-theme=dark] .login-logo-icon .logo-mark--on-light,[data-theme=light] .login-logo-icon .logo-mark--on-dark{display:none}.login-logo-title{position:relative;font-size:24px;font-weight:800;letter-spacing:-.5px}.login-logo-sub{position:relative;font-size:13px;color:var(--text-muted)}.login-form{padding:28px 24px 24px;display:flex;flex-direction:column;gap:18px}.auth-heading{font-size:16px;font-weight:700;letter-spacing:-.01em}.form-group{display:flex;flex-direction:column;gap:7px}.form-group label{font-size:12.5px;font-weight:500;color:var(--text-muted);letter-spacing:.01em}.input-wrap{position:relative;display:flex;align-items:center}.input-icon{position:absolute;left:13px;color:var(--text-dim);pointer-events:none}.form-input{width:100%;height:44px;padding:0 14px;border:1px solid var(--border);border-radius:var(--radius-sm);font:14px var(--font);color:var(--text);background:var(--bg-1);transition:border-color .15s var(--ease),box-shadow .15s var(--ease),background .15s var(--ease)}@media(pointer:coarse){.form-input{font-size:16px}}.form-input.has-icon{padding-left:40px}.form-input::-moz-placeholder{color:var(--text-dim)}.form-input::placeholder{color:var(--text-dim)}.form-input:hover{border-color:var(--border-strong)}.form-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-glow);background:var(--bg-2)}.login-error{font-size:13px;color:var(--red);background:var(--red-bg);border:1px solid var(--red-border);border-radius:var(--radius-sm);padding:10px 14px;animation:fadeUp .25s var(--ease-out)}.btn-login{width:100%;height:46px;font-size:14.5px;margin-top:4px}.auth-alt{text-align:center;font-size:13px;color:var(--text-muted);padding:0 24px 26px}.auth-alt a{color:var(--accent);font-weight:600}.auth-alt a:hover{text-decoration:underline}.dashboard{position:relative;z-index:1;display:flex;flex-direction:column;min-height:100dvh}.app-bar{background:var(--surface);border-bottom:1px solid var(--border);height:60px;display:flex;align-items:center;padding:0 24px;gap:16px;position:sticky;top:0;z-index:10;backdrop-filter:blur(24px) saturate(140%);-webkit-backdrop-filter:blur(24px) saturate(140%)}.app-bar-logo{display:flex;align-items:center;gap:12px;flex:1;min-width:0}.app-bar-logo-icon{width:36px;height:36px;background:var(--gradient-accent);border-radius:10px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:16px;flex-shrink:0;box-shadow:0 4px 12px -2px var(--accent-glow),inset 0 1px #fff3}.app-bar-name{font-size:15.5px;font-weight:800;letter-spacing:-.3px;white-space:nowrap}.app-bar-actions{display:flex;align-items:center;gap:8px}.app-bar-user{font-size:13px;color:var(--text-muted);font-weight:500}.theme-toggle{width:38px;height:38px;border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color .18s var(--ease),border-color .18s var(--ease),background .18s var(--ease)}.theme-toggle:hover{color:var(--text);border-color:var(--border-strong);background:var(--surface-hover)}.theme-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.main-content{flex:1;width:100%;max-width:1100px;margin:0 auto;padding:44px 24px 56px;display:flex;flex-direction:column;gap:28px}@media(max-width:720px){.main-content{padding:28px 16px 40px}}.greeting-title{font-size:28px;font-weight:800;letter-spacing:-.02em}.greeting-sub{margin-top:8px;font-size:14.5px;color:var(--text-muted)}.dash-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px}.project-card{display:flex;flex-direction:column;gap:16px;padding:22px;text-decoration:none;color:var(--text)}.project-card:hover{border-color:var(--border-strong);box-shadow:var(--shadow-lg);transform:translateY(-3px)}.bento .card:nth-child(1){animation-delay:.06s}.bento .card:nth-child(2){animation-delay:.12s}.bento .card:nth-child(3){animation-delay:.18s}.bento .card:nth-child(4){animation-delay:.24s}.project-card-top{display:flex;align-items:flex-start;justify-content:space-between}.project-icon{width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:18px;box-shadow:inset 0 1px #ffffff38}.project-ext{color:var(--text-dim);transition:color .18s var(--ease),transform .18s var(--ease)}.project-card:hover .project-ext{color:var(--accent);transform:translate(2px,-2px)}.project-name{font-size:15.5px;font-weight:700;letter-spacing:-.01em}.project-desc{margin-top:4px;font-size:13px;color:var(--text-muted)}.skeleton{background:linear-gradient(90deg,var(--bg-1) 25%,var(--surface-hover) 37%,var(--bg-1) 63%);background-size:200% 100%;animation:shimmer 1.4s ease-in-out infinite;border-radius:var(--radius-sm)}.dash-footer{text-align:center;padding:24px;font-size:12px;color:var(--text-dim)}.app-loading{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;min-height:100dvh}.app-spinner{width:34px;height:34px;border:3px solid var(--border-strong);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}
