.qj-exp{--exp-nav-h:4.6rem;--exp-chrome-h:5.75rem;--exp-axis-p:0;--exp-measure:1120px;--exp-continue-gap:1.15rem;overflow-x:clip}.qj-exp p,.qj-exp h1,.qj-exp h2,.qj-exp h3,.qj-exp ol,.qj-exp ul,.qj-exp li,.qj-exp dl,.qj-exp dt,.qj-exp dd{margin:0}.qj-exp .exp-shell{max-width:var(--exp-measure);padding-inline:var(--space-gutter);margin-inline:auto}.qj-exp h1,.qj-exp h2,.qj-exp h3{font-family:var(--font-display);letter-spacing:-.015em;font-weight:400;line-height:1.15}:lang(vi) .qj-exp h1,:lang(vi) .qj-exp h2,:lang(vi) .qj-exp h3,:lang(vi) .qj-exp .role,:lang(vi) .qj-exp .project,:lang(vi) .qj-exp .span{letter-spacing:0;line-height:1.28}.qj-exp .eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--foreground-soft);margin:0;font-size:.75rem;font-weight:500}.qj-exp .rule{background:var(--border);border:0;width:48px;height:1px;margin:14px 0 0;display:block}.qj-exp .lede{color:var(--foreground-soft);text-wrap:pretty;max-width:54ch;font-size:clamp(1.05rem,1.3vw,1.1875rem);line-height:1.7}.qj-exp .prose{max-width:58ch;color:var(--foreground-soft);text-wrap:pretty;line-height:1.7}.qj-exp .prose+.prose{margin-top:1rem}.qj-exp .caption{letter-spacing:.02em;color:var(--foreground-soft);font-size:.75rem;line-height:1.5}.qj-exp .note{font-family:var(--font-accent);color:color-mix(in oklab, var(--brown) 42%, var(--foreground));font-size:1.125rem;line-height:1.35}.qj-exp .mast{padding-top:clamp(8rem,16vh,11rem);padding-bottom:clamp(2.75rem,5vw,4.25rem)}.qj-exp .mast-grid{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:end;gap:clamp(1.5rem,4vw,4rem);display:grid}.qj-exp .mast h1{letter-spacing:-.02em;text-wrap:balance;max-width:18ch;margin:0;font-size:clamp(2.75rem,5vw,4rem);line-height:1.08}:lang(vi) .qj-exp .mast h1{letter-spacing:0;line-height:1.22}.qj-exp .mast .lede{margin-top:1.25rem}.qj-exp .quiet-link{letter-spacing:.02em;min-height:44px}.qj-exp .mast .quiet-link{margin-top:.15rem}.qj-exp .mast-aside{padding-bottom:.15rem}.qj-exp .mast-aside .roles{letter-spacing:.12em;text-transform:uppercase;color:var(--foreground-soft);margin:0;font-size:.8125rem}.qj-exp .mast-aside .place{color:var(--foreground-soft);margin:.55rem 0 0;font-size:.875rem}.qj-exp .mast-aside .when{margin:1.1rem 0 0}.qj-exp .span-list{border-top:1px solid var(--border);margin:1.6rem 0 0;padding:0;list-style:none}.qj-exp .span-list li{border-bottom:1px solid var(--border);color:var(--foreground-soft);grid-template-columns:10.75rem 1fr;align-items:baseline;gap:.75rem;padding:.55rem 0;font-size:.875rem;display:grid}.qj-exp .span-list time{font-variant-numeric:tabular-nums;letter-spacing:.02em;color:var(--foreground)}.qj-exp .spine{top:var(--exp-nav-h);z-index:40;background:color-mix(in srgb, var(--background) 92%, transparent);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border-bottom:1px solid var(--border);scrollbar-width:none;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;touch-action:pan-x;width:100%;margin:0;padding:8px 0;display:none;position:sticky;overflow:auto hidden}.qj-exp .spine::-webkit-scrollbar{display:none}.qj-exp .spine ol{padding:0 var(--space-gutter);flex-wrap:nowrap;gap:.2rem;width:max-content;margin:0;list-style:none;display:flex}.qj-exp .spine a{letter-spacing:.08em;text-transform:uppercase;min-height:44px;color:var(--foreground-soft);white-space:nowrap;transition:color var(--duration-micro) var(--ease-soft), border-color var(--duration-micro) var(--ease-soft);border-bottom:1px solid #0000;flex-shrink:0;align-items:center;gap:.4rem;padding:0 .7rem;font-size:.75rem;text-decoration:none;display:flex}.qj-exp .spine a:hover{color:var(--foreground);border-bottom-color:var(--border)}.qj-exp .spine a[aria-current=true]{color:var(--foreground);border-bottom-color:var(--sage)}.qj-exp .spine .n{font-variant-numeric:tabular-nums}.qj-exp .journal{max-width:var(--exp-measure);padding-inline:var(--space-gutter);grid-template-columns:10.25rem minmax(0,1fr);align-items:start;column-gap:clamp(2rem,5vw,4.5rem);margin-inline:auto;padding-bottom:clamp(3rem,6vw,5rem);display:grid}.qj-exp .index{top:calc(var(--exp-nav-h) + .85rem);padding-top:.15rem;position:sticky}.qj-exp .index p{margin:0 0 .85rem}.qj-exp .index ol{margin:0;padding:0;list-style:none}.qj-exp .index a{min-height:36px;color:var(--foreground-soft);letter-spacing:.01em;transition:color var(--duration-micro) var(--ease-soft);grid-template-columns:1.7rem 1fr;align-items:baseline;gap:.55rem;padding:.22rem 0;font-size:.875rem;text-decoration:none;display:grid}.qj-exp .index a:hover{color:var(--foreground)}.qj-exp .index .n{letter-spacing:.08em;font-variant-numeric:tabular-nums;font-size:.75rem}.qj-exp .index a[aria-current=true]{color:var(--foreground);box-shadow:inset 0 -1px 0 var(--sage)}.qj-exp .timeline{min-width:0;position:relative}.qj-exp .axis{pointer-events:none;width:1px;position:absolute;top:10px;bottom:1.5rem;left:5px}.qj-exp .axis-line{background:var(--border);position:absolute;inset:0}.qj-exp .axis-fill{background:var(--foreground);width:1px;height:100%;transform:scaleY(var(--exp-axis-p));transform-origin:top;position:absolute;top:0;left:0}.qj-exp .node{scroll-margin-top:var(--exp-chrome-h);padding:0 0 clamp(2.75rem,5.2vw,4.75rem) 2.5rem;position:relative}.qj-exp .node.cluster{padding-bottom:1.15rem}.qj-exp .node.entry{padding-bottom:clamp(2.35rem,4.2vw,3.5rem)}.qj-exp .node.entry:has(+.node.ch){padding-bottom:clamp(3.25rem,6vw,5rem)}.qj-exp .node:last-of-type{padding-bottom:0}.qj-exp .dot{box-sizing:border-box;border:1.5px solid var(--foreground);background:var(--background);z-index:1;width:13px;height:13px;transition:background-color var(--duration-micro) var(--ease-soft);border-radius:50%;position:absolute;top:.55rem;left:-1px}.qj-exp .node.ch.is-current .dot{background:var(--foreground)}.qj-exp .node.entry:before{content:"";background:var(--border);width:10px;height:1px;position:absolute;top:1.05rem;left:1px}.qj-exp .ch-row{justify-content:space-between;align-items:flex-start;gap:1.25rem;max-width:40rem;display:flex}.qj-exp .ch-copy{min-width:0}.qj-exp .ch-sketch{width:4.15rem;color:color-mix(in oklab, var(--foreground) 70%, var(--brown));flex:none;margin:.1rem 0 0;transform:rotate(-2.2deg)}.qj-exp .ch-sketch svg{width:100%;height:auto;display:block;overflow:visible}.dark .qj-exp .ch-sketch{color:color-mix(in oklab, var(--foreground-soft) 72%, var(--brown))}.qj-exp #work .ch-sketch{transform:rotate(1.8deg)translateY(4px)}.qj-exp #projects .ch-sketch{transform:rotate(-1.1deg)translateY(2px)}.qj-exp #now .ch-sketch{transform:rotate(2.4deg)translateY(-2px)}.qj-exp #cv .ch-sketch{transform:rotate(1.5deg)translateY(2px)}.qj-exp .node.ch .kicker{flex-wrap:wrap;align-items:baseline;gap:.55rem .8rem;margin:0 0 .45rem;display:flex}.qj-exp .node.ch .num{letter-spacing:.1em;text-transform:uppercase;color:var(--foreground-soft);font-variant-numeric:tabular-nums;margin:0;font-size:.75rem;font-weight:500}.qj-exp .node.ch h2{text-wrap:balance;max-width:16ch;margin:0;font-size:clamp(2rem,3.3vw,2.625rem);line-height:1.12}.qj-exp .node .span{font-family:var(--font-display);letter-spacing:-.01em;margin:.45rem 0 0;font-size:clamp(1.25rem,2vw,1.625rem);line-height:1.15}:lang(vi) .qj-exp .node .span{letter-spacing:0}.qj-exp .node .lede{margin-top:1rem}.qj-exp .node .prose{margin-top:.85rem}.qj-exp .node .note{margin-top:1.2rem;display:inline-block;transform:rotate(-2.2deg)}.qj-exp .node.entry .when{letter-spacing:.04em;font-variant-numeric:tabular-nums;color:var(--foreground-soft);margin:0;font-size:.8125rem;font-weight:500}.qj-exp .node.entry .role{font-family:var(--font-display);letter-spacing:-.01em;margin:.35rem 0 0;font-size:clamp(1.5rem,2.2vw,1.75rem);font-weight:400;line-height:1.2}:lang(vi) .qj-exp .node.entry .role{letter-spacing:0;line-height:1.28}.qj-exp .node.entry .org{color:var(--foreground-soft);margin:.2rem 0 0;font-size:.9375rem}.qj-exp .node.entry .kind{letter-spacing:.1em;text-transform:uppercase;color:var(--foreground-soft);margin:.4rem 0 0;font-size:.6875rem;font-weight:500;display:inline-block}.qj-exp .node.entry .project{font-family:var(--font-display);letter-spacing:-.01em;max-width:28ch;margin:1rem 0 0;font-size:clamp(1.25rem,1.8vw,1.45rem);font-style:italic;font-weight:400;line-height:1.28}:lang(vi) .qj-exp .node.entry .project{letter-spacing:0}.qj-exp .edu{align-items:center;gap:.9rem;margin-top:.35rem;display:flex}.qj-exp .edu-mark{box-sizing:border-box;background:var(--surface-soft);border:1px solid var(--border);border-radius:6px;flex:none;justify-content:center;align-items:center;width:3.15rem;height:2.65rem;padding:.35rem .4rem;display:flex;overflow:hidden}.qj-exp .edu-mark-img{object-fit:contain;object-position:center;max-width:100%;max-height:100%;display:block;width:100%!important;height:100%!important;position:static!important}.qj-exp .edu-copy{min-width:0}.qj-exp .edu-copy .role{margin-top:0}.qj-exp .meta-label{letter-spacing:.08em;text-transform:uppercase;color:var(--foreground-soft);margin:1.1rem 0 0;font-size:.75rem;font-weight:500}.qj-exp .contrib{max-width:54ch;margin:.3rem 0 0;padding:0;list-style:none}.qj-exp .contrib li{color:var(--foreground-soft);padding:.28rem 0 .28rem 1rem;font-size:.9375rem;line-height:1.55;position:relative}.qj-exp .contrib li:before{content:"·";color:var(--foreground-faint);position:absolute;left:0}.qj-exp .stack{background:var(--surface-soft);border:1px solid var(--border);border-radius:10px;max-width:54ch;margin-top:1.15rem;padding:.85rem 1rem 1rem}.qj-exp .stack .meta-label{margin-top:0}.qj-exp .chips{flex-wrap:wrap;gap:.4rem;margin:.45rem 0 0;padding:0;list-style:none;display:flex}.qj-exp .chips li{letter-spacing:.02em;color:var(--foreground);border:1px solid var(--border);background:var(--background);transition:background-color var(--duration-micro) var(--ease-soft), border-color var(--duration-micro) var(--ease-soft);border-radius:6px;padding:.32rem .65rem;font-size:.8125rem;font-weight:500}.qj-exp .chips li:hover{background:color-mix(in oklab, var(--paper) 72%, var(--background));border-color:var(--foreground-faint)}.qj-exp .cv-list{border-top:1px solid var(--border);max-width:58ch;margin:1.35rem 0 0}.qj-exp .cv-list div{border-bottom:1px solid var(--border);grid-template-columns:6.5rem minmax(0,1fr);align-items:start;gap:.85rem 1.25rem;padding:1rem 0;display:grid}.qj-exp .cv-list dt{letter-spacing:.08em;text-transform:uppercase;color:var(--foreground-soft);margin:0;padding-top:.2rem;font-size:.75rem;font-weight:500}.qj-exp .cv-list dd{max-width:48ch;margin:0}.qj-exp .cv-lines{margin:0;padding:0;list-style:none}.qj-exp .cv-lines li+li{border-top:1px solid var(--border);margin-top:.85rem;padding-top:.85rem}.qj-exp .cv-actions{flex-wrap:wrap;gap:.25rem 1.5rem;margin-top:1.15rem;display:flex}.qj-exp .continue{padding:clamp(2.5rem,5vw,4rem) 0 clamp(5rem,10vw,8rem)}.qj-exp .continue-grid{grid-template-columns:10.25rem minmax(0,1fr);column-gap:clamp(2rem,5vw,4.5rem);display:grid}.qj-exp .continue h2{max-width:12ch;margin:.55rem 0 0;font-size:clamp(1.85rem,3vw,2.5rem);line-height:1.12}.qj-exp .go-list{border-top:1px solid var(--border);margin:0;padding:0;list-style:none}.qj-exp .go-list a{padding:var(--exp-continue-gap) 0;border-bottom:1px solid var(--border);color:inherit;grid-template-columns:1fr auto;align-items:baseline;gap:.5rem 1.5rem;min-height:44px;text-decoration:none;display:grid}.qj-exp .go-list .ttl{font-family:var(--font-display);letter-spacing:-.01em;font-size:clamp(1.4rem,2vw,1.7rem);line-height:1.2}.qj-exp .go-list .hint{color:var(--foreground-soft);grid-column:1;font-size:.875rem}.qj-exp .go-list .arw{transition:transform var(--duration-micro) var(--ease-soft)}.qj-exp .go-list a:hover .arw{transform:translate(4px)}.qj-exp button.quiet-link{cursor:pointer;background:0 0;border:0;padding:0;font-family:inherit}@media (max-width:1024px){.qj-exp .index{display:none}.qj-exp .spine{display:block}.qj-exp .journal{padding-top:1.5rem}.qj-exp .continue h2{margin-bottom:var(--exp-continue-gap)}.qj-exp .journal,.qj-exp .continue-grid{grid-template-columns:minmax(0,1fr)}.qj-exp .mast-grid{grid-template-columns:1fr}.qj-exp .mast-aside{margin-top:.5rem}}@media (max-width:767px){.qj-exp{--exp-nav-h:3.65rem;--exp-chrome-h:6.75rem}.qj-exp h1,.qj-exp h2,.qj-exp h3,.qj-exp .role{letter-spacing:0;line-height:1.18}:lang(vi) .qj-exp h1,:lang(vi) .qj-exp h2,:lang(vi) .qj-exp h3,:lang(vi) .qj-exp .role{line-height:1.3}.qj-exp .mast{padding-top:7.5rem}.qj-exp .mast h1{max-width:14ch;font-size:2.25rem;line-height:1.14}.qj-exp .rule{width:40px;margin:20px 0 16px}.qj-exp .lede{max-width:34ch;font-size:1.0625rem}.qj-exp .prose,.qj-exp .contrib,.qj-exp .stack{max-width:34ch}.qj-exp .mast-aside .roles{letter-spacing:.1em;font-size:.75rem}.qj-exp .mast-aside .place{margin-top:.4rem}.qj-exp .span-list{margin-top:1.35rem}.qj-exp .span-list li{grid-template-columns:1fr;gap:.1rem;padding:.7rem 0}.qj-exp .span-list time{display:block}.qj-exp .spine ol{gap:.15rem;padding:0 .75rem}.qj-exp .spine a{gap:.35rem;padding:0 .65rem;font-size:.6875rem}.qj-exp .kicker .caption{display:none}.qj-exp .node{padding-bottom:2.65rem;padding-left:2.15rem}.qj-exp .node.cluster{padding-bottom:1rem}.qj-exp .node.entry{padding-bottom:2.35rem}.qj-exp .node.entry:has(+.node.ch){padding-bottom:3.15rem}.qj-exp .node.entry:before{width:9px;top:1rem}.qj-exp .ch-row{gap:.85rem}.qj-exp .ch-sketch{width:3.2rem;margin-top:.15rem;transform:rotate(-2deg)}.qj-exp #work .ch-sketch{transform:rotate(1.6deg)translateY(3px)}.qj-exp #projects .ch-sketch{transform:rotate(-1deg)}.qj-exp #now .ch-sketch{transform:rotate(2.2deg)translateY(-2px)}.qj-exp #cv .ch-sketch{transform:rotate(1.4deg)translateY(2px)}.qj-exp .kicker{margin-bottom:0}.qj-exp .node.ch h2{max-width:12ch;margin-top:.3rem;font-size:1.85rem;line-height:1.16}.qj-exp .node .span{margin-top:.35rem;font-size:1.35rem;line-height:1.2}.qj-exp .node .lede,.qj-exp .node .prose{margin-top:.9rem}.qj-exp .node .note{margin-top:1.1rem;transform:rotate(-2deg)}.qj-exp .node.entry .role{margin-top:.3rem;font-size:1.5rem;line-height:1.22}.qj-exp .node.entry .org{margin-top:.18rem}.qj-exp .node.entry .kind{margin-top:.35rem}.qj-exp .node.entry .project{max-width:22ch;margin-top:.9rem;font-size:1.2rem}.qj-exp .edu{gap:.75rem;margin-top:.3rem}.qj-exp .edu-mark{width:2.9rem;height:2.45rem;padding:.3rem .34rem}.qj-exp .meta-label{margin-top:1rem}.qj-exp .contrib{margin-top:.25rem}.qj-exp .stack{margin-top:1.05rem;padding:.8rem .9rem .9rem}.qj-exp .chips{gap:.35rem;margin-top:.4rem}.qj-exp .chips li{padding:.3rem .6rem}.qj-exp .cv-list{margin-top:1.15rem}.qj-exp .cv-list div{grid-template-columns:1fr;gap:.25rem}.qj-exp .cv-list dt{padding-top:0}.qj-exp .cv-list dd{max-width:34ch;margin-top:.3rem}.qj-exp .cv-actions{margin-top:1rem}.qj-exp .continue h2{font-size:1.85rem;line-height:1.16}.qj-exp .go-list .ttl{font-size:1.5rem;line-height:1.2}}@media (min-width:1280px){.qj-exp{--exp-measure:1280px}.qj-exp .journal,.qj-exp .continue-grid{grid-template-columns:11.5rem minmax(0,1fr);column-gap:clamp(2.25rem,5.2vw,5rem)}.qj-exp .mast h1{font-size:clamp(2.9rem,4.4vw,4.2rem)}.qj-exp .node.ch h2{font-size:clamp(2.125rem,2.65vw,2.85rem)}.qj-exp .node.entry .role{font-size:clamp(1.55rem,1.8vw,1.88rem)}.qj-exp .node.entry .project{font-size:clamp(1.3rem,1.45vw,1.55rem)}.qj-exp .continue h2{font-size:clamp(1.95rem,2.4vw,2.65rem)}.qj-exp .go-list .ttl{font-size:clamp(1.48rem,1.6vw,1.82rem)}.qj-exp .prose{max-width:62ch}}@media (min-width:1600px){.qj-exp{--exp-measure:1360px}.qj-exp .journal,.qj-exp .continue-grid{grid-template-columns:12rem minmax(0,1fr)}}@media (prefers-reduced-motion:reduce){.qj-exp .axis-fill,.qj-exp .go-list .arw,.qj-exp .dot{transition:none}.qj-exp .go-list a:hover .arw{transform:none}}@media print{.qj-exp .spine,.qj-exp .index,.qj-exp .continue,.qj-exp .mast .quiet-link,.qj-exp .cv-actions,.qj-exp .axis,.qj-exp .dot,.qj-exp .ch-sketch,.qj-exp .node.entry:before{display:none!important}.qj-exp .mast{padding-top:1.5rem}.qj-exp .journal{padding:0;display:block}.qj-exp .node{padding:0 0 1.5rem}}body.print-short .site-header,body.print-short footer,body.print-short .paper-texture,body.print-short .qj-exp .mast,body.print-short .qj-exp .spine,body.print-short .qj-exp .index,body.print-short .qj-exp .node:not(.cv-node),body.print-short .qj-exp .continue{display:none!important}body.print-short .qj-exp .journal{padding:1.5rem;display:block}body.print-short .qj-exp .cv-node{padding:0}body.print-short .qj-exp .cv-actions{display:none!important}
