:root{--font-sans: "IBM Plex Sans", sans-serif;--bg-gray-200: #e5e7eb;--bg-white: #ffffff;--text-gray-800: #1f2937;--border-black: #000;--color-primary: #2563eb;--color-primary-hover: #1d4ed8}body{font-family:var(--font-sans);background-color:var(--bg-gray-200);color:var(--text-gray-800);margin:0;min-height:100vh}.flex{display:flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:.5rem}.gap-4{gap:1rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.m-4{margin:1rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.w-full{width:100%}.h-full{height:100%}.text-center{text-align:center}.text-right{text-align:right}.text-sm{font-size:.875rem}.text-xs{font-size:.75rem}.font-bold{font-weight:700}.font-serif{font-family:serif}.font-mono{font-family:monospace}.relative{position:relative}.absolute{position:absolute}.cursor-pointer{cursor:pointer}.hidden{display:none}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.shadow-md{box-shadow:0 4px 6px -1px #0000001a}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.whitespace-nowrap{white-space:nowrap}.control-bar{position:sticky;top:0;z-index:50;background-color:var(--bg-white);box-shadow:0 4px 6px -1px #0000001a;border-radius:.25rem;padding:.5rem;margin-bottom:1rem;margin:1rem}.zoom-group{display:flex;background-color:#f3f4f6;border-radius:.25rem;overflow:hidden;border:1px solid #d1d5db}.zoom-btn{padding:.25rem .75rem;border:none;background:transparent;cursor:pointer}.zoom-btn:hover{background-color:#e5e7eb}.zoom-display{padding:.25rem .5rem;font-size:.875rem;min-width:3rem;text-align:center;background-color:#fff;display:flex;align-items:center;justify-content:center}.search-input{width:100%;border:1px solid #d1d5db;border-radius:.25rem;padding:.375rem .75rem;outline:none}.search-input:focus{border-color:#60a5fa;box-shadow:0 0 0 2px #60a5fa80}.btn{padding:.375rem 1rem;border-radius:9999px;font-weight:700;font-size:.875rem;cursor:pointer;transition:all .2s;border:1px solid #d1d5db;background-color:#f3f4f6;color:var(--text-gray-800)}.btn:hover{background-color:#e5e7eb}.btn-primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.btn-primary:hover{background-color:var(--color-primary-hover)}.btn-danger{background-color:transparent;color:#dc2626;border:none}.btn-danger:hover{background-color:#fef2f2}.chart-container-outer{padding-bottom:5rem;padding-left:1rem;padding-right:1rem;overflow:auto}.chart-transform-layer{margin:0 auto;transform-origin:top left;transition:transform .2s ease-out;background-color:#fff}.app-header{background-color:#fff;padding:1.5rem;border-radius:.5rem;box-shadow:0 4px 6px -1px #0000001a;border-top:4px solid #99CC99;margin-bottom:1.5rem}.app-title{font-size:1.875rem;font-weight:700;text-align:center;text-transform:uppercase;letter-spacing:.1em;margin-bottom:.5rem}.legend-box{background-color:#fff;padding:1rem;border-radius:.25rem;box-shadow:0 1px 2px #0000000d;border:1px solid #d1d5db;display:flex;flex-wrap:wrap;gap:1rem;align-items:center;font-size:.875rem;margin-bottom:1rem}.color-swatch{width:1rem;height:1rem;border:1px solid black;display:inline-block}table{border-collapse:collapse;width:100%}th,td{border:1px solid var(--border-black)}.sticky-header thead{position:sticky;top:0;z-index:20}.sticky-header-row{background-color:#e8e8c8}.vertical-text-cell{position:relative;padding:0;overflow:hidden;width:2rem}.vertical-text-inner{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.rotate-text{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);white-space:nowrap}.age-cell{border-top:none;border-bottom:none;border-left:1px solid black;border-right:1px solid black}.age-label-container{position:absolute;bottom:0;left:0;right:0;display:flex;justify-content:flex-end;padding-right:.5rem;transform:translateY(50%);z-index:10}.age-label{padding:0 .25rem;font-weight:700;font-size:11px;line-height:1}.event-cell{background-color:#fff;padding:.5rem;position:relative;vertical-align:top}.event-cell:hover{background-color:#eff6ff}.event-cell-geo:hover{background-color:#f0fdf4}.event-item{position:relative;margin-bottom:.5rem;padding-bottom:.5rem;border-bottom:1px dashed #e5e7eb}.event-item:last-child{margin-bottom:0;padding-bottom:0;border-bottom:none}.event-img{width:4rem;height:4rem;-o-object-fit:cover;object-fit:cover;float:left;margin-right:.5rem;margin-bottom:.25rem;border-radius:.25rem;border:1px solid #e5e7eb}.edit-badge-btn{position:absolute;top:-2px;right:-2px;background-color:#dbeafe;color:#1e40af;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:10px;cursor:pointer;border:1px solid #93c5fd;opacity:.6}.event-item:hover .edit-badge-btn{opacity:1}.add-small-btn{display:block;margin:.5rem auto 0;background-color:#f3f4f6;border:1px solid #d1d5db;color:#6b7280;font-size:10px;padding:2px 8px;border-radius:99px;cursor:pointer}.add-small-btn:hover{background-color:#e5e7eb;color:#000}.add-placeholder{width:100%;height:100%;min-height:20px;display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:1.125rem;opacity:0}.event-cell:hover .add-placeholder{opacity:.5}.modal-overlay{position:fixed;inset:0;z-index:100;background-color:#00000080;display:flex;align-items:center;justify-content:center;padding:1rem}.modal-content{background-color:#fff;border-radius:.5rem;box-shadow:0 25px 50px -12px #00000040;width:100%;max-width:28rem;padding:1.5rem}.form-input{width:100%;border:1px solid #d1d5db;border-radius:.25rem;padding:.5rem;outline:none;box-sizing:border-box}.form-input:focus{box-shadow:0 0 0 2px #3b82f6;border-color:#3b82f6}.form-label{display:block;font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-duration:.2s}
