astrogators-shared-ui 0.13.0 → 0.14.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.
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- :root{--color-primary:#1a73e8;--color-primary-hover:#1557b0;--color-primary-active:#0d3c78;--color-secondary:#34a853;--color-secondary-hover:#2d8e47;--color-secondary-active:#1f6631;--color-background:#0a0e27;--color-background-elevated:#131729;--color-background-hover:#1a1f3a;--color-surface:#1e2139;--color-border:#2a2f4a;--color-text-primary:#fff;--color-text-secondary:#a0a5c0;--color-text-disabled:#5a5f7a;--color-success:#34a853;--color-warning:#fbbc04;--color-error:#ea4335;--color-info:#4285f4;--tier-grey:#c0eeee;--tier-green:#47c43c;--tier-blue:#1d99ff;--tier-purple:#8b5cf6;--tier-gold:#fc3;--tier-gold-glow:#fc39;--tier-purple-glow:#8b5cf680;--tier-blue-glow:#1d99ff80;--sixdot-gradient-start:#60a5fa;--sixdot-gradient-mid:#a855f7;--sixdot-gradient-end:#f59e0b;--sixdot-border-opacity:.3;--font-primary:-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-heading:"Orbitron", var(--font-primary);--font-mono:"Fira Code", "Courier New", monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-size-3xl:1.875rem;--font-size-4xl:2.25rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.75;--spacing-xs:.25rem;--spacing-sm:.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--spacing-2xl:3rem;--spacing-3xl:4rem;--radius-sm:.25rem;--radius-md:.5rem;--radius-lg:.75rem;--radius-xl:1rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 #0000004d;--shadow-md:0 4px 6px -1px #0006, 0 2px 4px -1px #0000004d;--shadow-lg:0 10px 15px -3px #00000080, 0 4px 6px -2px #0006;--shadow-xl:0 20px 25px -5px #0009, 0 10px 10px -5px #00000080;--z-base:0;--z-dropdown:100;--z-sticky:200;--z-modal:300;--z-toast:400;--z-tooltip:500;--chamfer-size:8px;--chamfer-size-lg:12px;--chamfer-size-sm:4px;--transition-fast:.15s ease-in-out;--transition-base:.2s ease-in-out;--transition-slow:.3s ease-in-out;--topbar-height:64px;--topbar-background:var(--color-background-elevated);--topbar-border:var(--color-border);--container-max-width:1280px;--container-padding:var(--spacing-md);--button-height:40px;--button-padding-x:var(--spacing-lg);--button-padding-y:var(--spacing-sm);--input-height:40px;--input-padding-x:var(--spacing-md);--input-padding-y:var(--spacing-sm);--input-border:var(--color-border);--input-background:var(--color-surface);--card-padding:var(--spacing-lg);--card-background:var(--color-surface);--card-border:var(--color-border)}*,:before,:after{box-sizing:border-box}*{margin:0;padding:0}html,body{height:100%}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{line-height:var(--line-height-normal);font-family:var(--font-primary);font-size:var(--font-size-base);color:var(--color-text-primary);background-color:var(--color-background)}img,picture,video,canvas,svg{max-width:100%;display:block}input,button,textarea,select{font:inherit;color:inherit}button{cursor:pointer;background:0 0;border:none}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}ul,ol{list-style:none}a{color:inherit;text-decoration:none}#root{isolation:isolate;min-height:100%}@property --card-edge-color{syntax:"<color>";inherits:false;initial-value:#0000}.chamfered-box{--_chamfer:var(--chamfer-size);--_chamfer-br:var(--chamfer-size)}.chamfered-box-sm{--_chamfer:var(--chamfer-size-sm);--_chamfer-br:var(--chamfer-size-sm)}.chamfered-box-lg{--_chamfer:var(--chamfer-size-lg);--_chamfer-br:var(--chamfer-size-lg)}.chamfered-box-asymmetric{--_chamfer:12px;--_chamfer-br:24px}.chamfered-box,.chamfered-box-sm,.chamfered-box-lg,.chamfered-box-asymmetric{clip-path:polygon(var(--_chamfer) 0, calc(100% - var(--_chamfer)) 0, 100% var(--_chamfer), 100% calc(100% - var(--_chamfer-br)), calc(100% - var(--_chamfer-br)) 100%, var(--_chamfer) 100%, 0 calc(100% - var(--_chamfer)), 0 var(--_chamfer));position:relative}.chamfered-border{background:var(--color-surface);position:relative}.chamfered-border:before{content:"";background:linear-gradient(135deg, var(--color-primary), var(--color-secondary));-webkit-mask-composite:xor;clip-path:polygon(var(--chamfer-size) 0, calc(100% - var(--chamfer-size)) 0, 100% var(--chamfer-size), 100% calc(100% - var(--chamfer-size)), calc(100% - var(--chamfer-size)) 100%, var(--chamfer-size) 100%, 0 calc(100% - var(--chamfer-size)), 0 var(--chamfer-size));padding:2px;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;-webkit-mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.chamfered-diagonal-border{--_chamfer-diag:calc(var(--_chamfer) * 1.41421);--_chamfer-diag-br:calc(var(--_chamfer-br) * 1.41421);z-index:5;pointer-events:none;background-color:currentColor;height:2px;transition:background-color .3s;position:absolute}.chamfered-diagonal-tl{top:-1px;left:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:0;transform:rotate(135deg)}.chamfered-diagonal-tr{top:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:100%;right:-1px;transform:rotate(45deg)}.chamfered-diagonal-bl{bottom:-1px;left:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:0;transform:rotate(-135deg)}.chamfered-diagonal-br{bottom:calc(var(--_chamfer-br) - 1px);width:var(--_chamfer-diag-br);transform-origin:100%;right:-1px;transform:rotate(-45deg)}.gradient-primary{background:linear-gradient(135deg, var(--color-primary), var(--color-primary-active))}.gradient-secondary{background:linear-gradient(135deg, var(--color-secondary), var(--color-secondary-active))}.gradient-surface{background:linear-gradient(135deg, var(--color-surface), var(--color-background-elevated))}.glow-primary{box-shadow:0 0 20px #1a73e880}.glow-secondary{box-shadow:0 0 20px #34a85380}.glow-error{box-shadow:0 0 20px #ea433580}.glow-tier-gold{box-shadow:0 0 20px var(--tier-gold-glow)}.glow-tier-purple{box-shadow:0 0 20px var(--tier-purple-glow)}.glow-tier-blue{box-shadow:0 0 20px var(--tier-blue-glow)}.sixdot-border{position:relative}.sixdot-border:before{content:"";background:linear-gradient(45deg, var(--sixdot-gradient-start), var(--sixdot-gradient-mid), var(--sixdot-gradient-end));border-radius:inherit;opacity:var(--sixdot-border-opacity);z-index:-1;position:absolute;inset:-2px}.sixdot-glow{background:linear-gradient(135deg,#4338ca33,#7c3aed33)}.hover-scale{transition:transform var(--transition-base)}.hover-scale:hover{transform:scale(1.02)}.hover-brighten{transition:filter var(--transition-base)}.hover-brighten:hover{filter:brightness(1.1)}.hover-lift{transition:transform var(--transition-base)}.hover-lift:hover{transform:translateY(-2px)}.hover-glow{transition:box-shadow var(--transition-base)}.hover-glow:hover{box-shadow:0 0 20px #1a73e866}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-fade-in{animation:fadeIn var(--transition-base)}.animate-slide-up{animation:slideUp var(--transition-base)}.animate-slide-down{animation:slideDown var(--transition-base)}.animate-spin{animation:1s linear infinite spin}.flex{display:flex}.flex-col{flex-direction:column;display:flex}.flex-center{justify-content:center;align-items:center;display:flex}.flex-between{justify-content:space-between;align-items:center;display:flex}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.grid{display:grid}.grid-cols-2{grid-template-columns:repeat(2,1fr)}.grid-cols-3{grid-template-columns:repeat(3,1fr)}.grid-cols-4{grid-template-columns:repeat(4,1fr)}.gap-sm{gap:var(--spacing-sm)}.gap-md{gap:var(--spacing-md)}.gap-lg{gap:var(--spacing-lg)}.gap-xl{gap:var(--spacing-xl)}.m-0{margin:0}.mt-sm{margin-top:var(--spacing-sm)}.mt-md{margin-top:var(--spacing-md)}.mt-lg{margin-top:var(--spacing-lg)}.mt-xl{margin-top:var(--spacing-xl)}.mb-sm{margin-bottom:var(--spacing-sm)}.mb-md{margin-bottom:var(--spacing-md)}.mb-lg{margin-bottom:var(--spacing-lg)}.mb-xl{margin-bottom:var(--spacing-xl)}.p-sm{padding:var(--spacing-sm)}.p-md{padding:var(--spacing-md)}.p-lg{padding:var(--spacing-lg)}.p-xl{padding:var(--spacing-xl)}.text-xs{font-size:var(--font-size-xs)}.text-sm{font-size:var(--font-size-sm)}.text-base{font-size:var(--font-size-base)}.text-lg{font-size:var(--font-size-lg)}.text-xl{font-size:var(--font-size-xl)}.text-2xl{font-size:var(--font-size-2xl)}.text-3xl{font-size:var(--font-size-3xl)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-normal{font-weight:var(--font-weight-normal)}.font-medium{font-weight:var(--font-weight-medium)}.font-semibold{font-weight:var(--font-weight-semibold)}.font-bold{font-weight:var(--font-weight-bold)}.text-primary{color:var(--color-text-primary)}.text-secondary{color:var(--color-text-secondary)}.text-disabled{color:var(--color-text-disabled)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-surface{background-color:var(--color-surface)}.bg-elevated{background-color:var(--color-background-elevated)}.hidden{display:none}.block{display:block}.inline-block{display:inline-block}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.w-full{width:100%}.w-auto{width:auto}.h-full{height:100%}.h-auto{height:auto}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-scroll{overflow:scroll}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-background)}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--color-text-disabled)}:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.bg-overlay{position:relative}.bg-overlay:before{content:"";background:var(--overlay-gradient,linear-gradient(135deg, #0f172ab3, #0f172a80));z-index:0;position:absolute;inset:0}.bg-overlay>*{z-index:1;position:relative}.backdrop-image{background-position:50%;background-repeat:no-repeat;background-size:cover;position:absolute;inset:0}._container_u3o0e_1{width:100%;margin-left:auto;margin-right:auto}._padding_u3o0e_7{padding-left:var(--container-padding);padding-right:var(--container-padding)}._maxWidth-sm_u3o0e_12{max-width:640px}._maxWidth-md_u3o0e_16{max-width:768px}._maxWidth-lg_u3o0e_20{max-width:1024px}._maxWidth-xl_u3o0e_24{max-width:var(--container-max-width)}._maxWidth-full_u3o0e_28{max-width:100%}@media (width<=768px){._padding_u3o0e_7{padding-left:var(--spacing-md);padding-right:var(--spacing-md)}}._topBar_10g3c_1{height:var(--topbar-height);background-color:var(--topbar-background);border-bottom:1px solid var(--topbar-border);z-index:var(--z-sticky);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);position:sticky;top:0;left:0;right:0}._content_10g3c_13{height:100%;max-width:var(--container-max-width);padding:0 var(--container-padding);justify-content:space-between;align-items:center;margin:0 auto;display:flex}._left_10g3c_23{align-items:center;gap:var(--spacing-xl);flex:1;display:flex}._right_10g3c_30{align-items:center;gap:var(--spacing-md);display:flex}._logo_10g3c_36{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--color-primary);font-family:var(--font-heading);align-items:center;display:flex}@media (width<=768px){._content_10g3c_13{padding:0 var(--spacing-md)}._left_10g3c_23{gap:var(--spacing-md)}._right_10g3c_30{gap:var(--spacing-sm)}}._button_159ms_1{justify-content:center;align-items:center;gap:var(--spacing-sm);font-family:var(--font-primary);font-weight:var(--font-weight-medium);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-base);text-align:center;-webkit-user-select:none;user-select:none;border:2px solid #0000;display:inline-flex}._button_159ms_1:disabled{opacity:.5;cursor:not-allowed}._sm_159ms_22{height:32px;padding:0 var(--spacing-md);font-size:var(--font-size-sm)}._md_159ms_28{height:var(--button-height);padding:0 var(--button-padding-x);font-size:var(--font-size-base)}._lg_159ms_34{height:48px;padding:0 var(--spacing-xl);font-size:var(--font-size-lg)}._primary_159ms_41{background-color:var(--color-primary);color:var(--color-text-primary)}._primary_159ms_41:hover:not(:disabled){background-color:var(--color-primary-hover);box-shadow:var(--shadow-md)}._primary_159ms_41:active:not(:disabled){background-color:var(--color-primary-active)}._secondary_159ms_55{background-color:var(--color-secondary);color:var(--color-text-primary)}._secondary_159ms_55:hover:not(:disabled){background-color:var(--color-secondary-hover);box-shadow:var(--shadow-md)}._secondary_159ms_55:active:not(:disabled){background-color:var(--color-secondary-active)}._outline_159ms_69{border-color:var(--color-border);color:var(--color-text-primary);background-color:#0000}._outline_159ms_69:hover:not(:disabled){background-color:var(--color-background-hover);border-color:var(--color-primary)}._ghost_159ms_80{color:var(--color-text-primary);background-color:#0000}._ghost_159ms_80:hover:not(:disabled){background-color:var(--color-background-hover)}._danger_159ms_89{background-color:var(--color-error);color:var(--color-text-primary)}._danger_159ms_89:hover:not(:disabled){box-shadow:var(--shadow-md);background-color:#c33a2e}._fullWidth_159ms_100{width:100%}._loading_159ms_105{pointer-events:none;position:relative}._loadingSpinner_159ms_110{align-items:center;gap:var(--spacing-sm);display:flex}._spinner_159ms_116{border:2px solid #0000;border-top-color:currentColor;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite _spin_159ms_116}@keyframes _spin_159ms_116{to{transform:rotate(360deg)}}._loadingText_159ms_131{opacity:.7}._selectWrapper_ir4bq_1{gap:var(--spacing-xs);flex-direction:column;display:flex}._fullWidth_ir4bq_7{width:100%}._label_ir4bq_11{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-primary);align-items:center;gap:var(--spacing-xs);display:flex}._required_ir4bq_20{color:var(--color-error)}._selectContainer_ir4bq_24{width:100%;display:inline-block;position:relative}._select_ir4bq_1{width:100%;height:var(--input-height);padding:var(--input-padding-y) var(--input-padding-x);padding-right:calc(var(--input-padding-x) + 24px);font-size:var(--font-size-base);font-family:var(--font-primary);color:var(--color-text-primary);background-color:var(--input-background);border:1px solid var(--input-border);border-radius:var(--radius-md);transition:all var(--transition-base);cursor:pointer;appearance:none;outline:none}._select_ir4bq_1:hover{border-color:var(--color-text-disabled)}._select_ir4bq_1:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #1a73e81a}._select_ir4bq_1:disabled{opacity:.5;cursor:not-allowed}._select_ir4bq_1._error_ir4bq_63{border-color:var(--color-error)}._select_ir4bq_1._error_ir4bq_63:focus{box-shadow:0 0 0 3px #ea43351a}._arrow_ir4bq_71{right:var(--input-padding-x);pointer-events:none;font-size:var(--font-size-xs);color:var(--color-text-secondary);position:absolute;top:50%;transform:translateY(-50%)}._errorText_ir4bq_81{font-size:var(--font-size-sm);color:var(--color-error)}._helperText_ir4bq_86{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._select_ir4bq_1 option{background-color:var(--color-surface);color:var(--color-text-primary)}._inputWrapper_15t4g_1{gap:var(--spacing-xs);flex-direction:column;display:flex}._fullWidth_15t4g_7{width:100%}._label_15t4g_11{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-primary);align-items:center;gap:var(--spacing-xs);display:flex}._required_15t4g_20{color:var(--color-error)}._input_15t4g_1{height:var(--input-height);padding:var(--input-padding-y) var(--input-padding-x);font-size:var(--font-size-base);font-family:var(--font-primary);color:var(--color-text-primary);background-color:var(--input-background);border:1px solid var(--input-border);border-radius:var(--radius-md);transition:all var(--transition-base);outline:none}._input_15t4g_1:hover{border-color:var(--color-text-disabled)}._input_15t4g_1:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #1a73e81a}._input_15t4g_1:disabled{opacity:.5;cursor:not-allowed}._input_15t4g_1::placeholder{color:var(--color-text-disabled)}._input_15t4g_1._error_15t4g_55{border-color:var(--color-error)}._input_15t4g_1._error_15t4g_55:focus{box-shadow:0 0 0 3px #ea43351a}._errorText_15t4g_63{font-size:var(--font-size-sm);color:var(--color-error)}._helperText_15t4g_68{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._allyCodeDropdown_1m0tw_1{align-items:center;gap:.5rem;display:flex;position:relative}._select_1m0tw_8{min-width:200px}._manageButton_1m0tw_12{white-space:nowrap}._managePanel_1m0tw_16{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);z-index:1000;min-width:300px;margin-top:.5rem;padding:1rem;position:absolute;top:100%;right:0;box-shadow:0 4px 6px #0000001a}._managePanel_1m0tw_16 h4{color:var(--color-text-primary);margin:0 0 1rem;font-size:.875rem;font-weight:600}._addSection_1m0tw_37{border-bottom:1px solid var(--color-border);margin-bottom:1rem;padding-bottom:1rem}._addInputGroup_1m0tw_43{gap:.5rem;margin-bottom:.5rem;display:flex}._addInputGroup_1m0tw_43 input{letter-spacing:.05em;flex:1;font-family:monospace}._error_1m0tw_55{color:var(--color-error);margin-top:.25rem;font-size:.75rem}._success_1m0tw_61{color:var(--color-success);margin-top:.25rem;font-size:.75rem}._codesList_1m0tw_67{margin-bottom:1rem}._codeItem_1m0tw_71{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:.5rem 0;display:flex}._codeItem_1m0tw_71:last-of-type{border-bottom:none}._codeItem_1m0tw_71 span{color:var(--color-text-secondary);font-size:.875rem}._doneButton_1m0tw_88{width:100%}@media (width<=768px){._select_1m0tw_8{min-width:150px}._managePanel_1m0tw_16{left:0;right:auto}}._logoLink_84pn2_3{color:inherit;text-decoration:none}._appNav_84pn2_9{align-items:center;gap:var(--spacing-lg,1.5rem);display:flex}._appName_84pn2_15{font-family:var(--font-heading);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);color:var(--color-text-primary);white-space:nowrap;text-decoration:none}._appName_84pn2_15:hover{color:var(--color-primary)}._tabs_84pn2_29{align-items:center;gap:var(--spacing-lg,1.5rem);height:var(--topbar-height);display:flex}._tab_84pn2_29{height:100%;padding:0 var(--spacing-xs,.25rem);color:var(--color-text-secondary);font-size:var(--font-size-base);white-space:nowrap;border-bottom:2px solid #0000;align-items:center;text-decoration:none;transition:color .15s,border-color .15s;display:flex}._tab_84pn2_29:hover{color:var(--color-text-primary)}._tabActive_84pn2_56{color:var(--color-text-primary);border-bottom-color:var(--color-primary)}._extrasGroup_84pn2_64{align-items:center;gap:.4rem;display:flex}._authCluster_84pn2_70{align-items:center;gap:var(--spacing-sm);display:flex}._userLink_84pn2_76{color:var(--color-text-secondary);text-decoration:none}._userLink_84pn2_76:hover{color:var(--color-text-primary)}._footer_zjuj8_1{background-color:var(--color-background-elevated);border-top:1px solid var(--color-border);margin-top:auto}._content_zjuj8_7{max-width:var(--container-max-width);padding:var(--spacing-xl) var(--container-padding);margin:0 auto}._defaultContent_zjuj8_13{align-items:center;gap:var(--spacing-sm);text-align:center;flex-direction:column;display:flex}._copyright_zjuj8_21{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._disclaimer_zjuj8_26{font-size:var(--font-size-xs);color:var(--color-text-disabled)}@media (width<=768px){._content_zjuj8_7{padding:var(--spacing-lg) var(--spacing-md)}}._card_1vw8g_1{background-color:var(--card-background);border-radius:var(--radius-lg);border:1px solid var(--card-edge-color,transparent);transition:transform var(--transition-base), box-shadow var(--transition-base)}._card_1vw8g_1._chamfered_1vw8g_15{border-radius:0}._default_1vw8g_20{background-color:var(--card-background)}._elevated_1vw8g_24{background-color:var(--card-background);box-shadow:var(--shadow-md)}._outline_1vw8g_29{border:1px solid var(--card-edge-color,var(--card-border));background-color:#0000}._padding-none_1vw8g_35{padding:0}._padding-sm_1vw8g_39{padding:var(--spacing-sm)}._padding-md_1vw8g_43{padding:var(--card-padding)}._padding-lg_1vw8g_47{padding:var(--spacing-xl)}._hoverable_1vw8g_52{cursor:pointer;will-change:transform;backface-visibility:hidden;transform:translateZ(0)}._hoverable_1vw8g_52:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)translateZ(0)}._hoverable_1vw8g_52:active{box-shadow:var(--shadow-md);transform:translateY(-1px)translateZ(0)}._card_1vw8g_1[role=button]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._badge_rk7t5_1{font-weight:var(--font-weight-medium);border-radius:var(--radius-full);white-space:nowrap;justify-content:center;align-items:center;display:inline-flex}._sm_rk7t5_11{font-size:var(--font-size-xs);padding:2px 8px}._md_rk7t5_16{font-size:var(--font-size-sm);padding:4px 12px}._lg_rk7t5_21{font-size:var(--font-size-base);padding:6px 16px}._default_rk7t5_27{background-color:var(--color-surface);color:var(--color-text-secondary)}._primary_rk7t5_32{background-color:var(--color-primary);color:var(--color-text-primary)}._secondary_rk7t5_37{background-color:var(--color-secondary);color:var(--color-text-primary)}._success_rk7t5_42{background-color:var(--color-success);color:var(--color-text-primary)}._warning_rk7t5_47{background-color:var(--color-warning);color:var(--color-background)}._error_rk7t5_52{background-color:var(--color-error);color:var(--color-text-primary)}._info_rk7t5_57{background-color:var(--color-info);color:var(--color-text-primary)}._overlay_1b3yt_1{z-index:var(--z-modal);padding:var(--spacing-md);animation:_fadeIn_1b3yt_1 var(--transition-base);background-color:#000000bf;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._modal_1b3yt_13{background-color:var(--color-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);max-height:90vh;animation:_slideUp_1b3yt_1 var(--transition-base);flex-direction:column;display:flex;overflow:hidden}._sm_1b3yt_25{width:100%;max-width:400px}._md_1b3yt_30{width:100%;max-width:600px}._lg_1b3yt_35{width:100%;max-width:800px}._xl_1b3yt_40{width:100%;max-width:1200px}._header_1b3yt_45{padding:var(--spacing-lg);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;display:flex}._title_1b3yt_53{font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);margin:0}._closeButton_1b3yt_60{border-radius:var(--radius-md);width:32px;height:32px;color:var(--color-text-secondary);transition:all var(--transition-fast);font-size:var(--font-size-xl);justify-content:center;align-items:center;line-height:1;display:flex}._closeButton_1b3yt_60:hover{background-color:var(--color-background-hover);color:var(--color-text-primary)}._content_1b3yt_78{padding:var(--spacing-lg);flex:1;overflow-y:auto}@keyframes _fadeIn_1b3yt_1{0%{opacity:0}to{opacity:1}}@keyframes _slideUp_1b3yt_1{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (width<=768px){._modal_1b3yt_13{max-height:95vh}._header_1b3yt_45,._content_1b3yt_78{padding:var(--spacing-md)}}._spinner_1uhnh_2{border:3px solid #ffffff1a;border-top-color:var(--color-primary);border-radius:50%;animation:.8s linear infinite _spin_1uhnh_2}._spinner_1uhnh_2._sm_1uhnh_9{border-width:2px;width:16px;height:16px}._spinner_1uhnh_2._md_1uhnh_15{border-width:3px;width:32px;height:32px}._spinner_1uhnh_2._lg_1uhnh_21{border-width:4px;width:48px;height:48px}@keyframes _spin_1uhnh_2{to{transform:rotate(360deg)}}._dots_1uhnh_34{gap:8px;display:inline-flex}._dots_1uhnh_34._sm_1uhnh_9{gap:4px}._dots_1uhnh_34._lg_1uhnh_21{gap:12px}._dot_1uhnh_34{background-color:var(--color-primary);border-radius:50%;animation:1.4s ease-in-out infinite both _bounce_1uhnh_1;display:inline-block}._dots_1uhnh_34._sm_1uhnh_9 ._dot_1uhnh_34{width:6px;height:6px}._dots_1uhnh_34._md_1uhnh_15 ._dot_1uhnh_34{width:10px;height:10px}._dots_1uhnh_34._lg_1uhnh_21 ._dot_1uhnh_34{width:14px;height:14px}._dot_1uhnh_34:first-child{animation-delay:-.32s}._dot_1uhnh_34:nth-child(2){animation-delay:-.16s}@keyframes _bounce_1uhnh_1{0%,80%,to{opacity:.5;transform:scale(0)}40%{opacity:1;transform:scale(1)}}._visuallyHidden_1uhnh_91{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
1
+ :root{--color-primary:#1a73e8;--color-primary-hover:#1557b0;--color-primary-active:#0d3c78;--color-secondary:#34a853;--color-secondary-hover:#2d8e47;--color-secondary-active:#1f6631;--color-background:#0a0e27;--color-background-elevated:#131729;--color-background-hover:#1a1f3a;--color-surface:#1e2139;--color-border:#2a2f4a;--color-text-primary:#fff;--color-text-secondary:#a0a5c0;--color-text-disabled:#5a5f7a;--color-success:#34a853;--color-warning:#fbbc04;--color-error:#ea4335;--color-info:#4285f4;--tier-grey:#c0eeee;--tier-green:#47c43c;--tier-blue:#1d99ff;--tier-purple:#8b5cf6;--tier-gold:#fc3;--tier-gold-glow:#fc39;--tier-purple-glow:#8b5cf680;--tier-blue-glow:#1d99ff80;--sixdot-gradient-start:#60a5fa;--sixdot-gradient-mid:#a855f7;--sixdot-gradient-end:#f59e0b;--sixdot-border-opacity:.3;--font-primary:-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-heading:"Orbitron", var(--font-primary);--font-mono:"Fira Code", "Courier New", monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-size-3xl:1.875rem;--font-size-4xl:2.25rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.75;--spacing-xs:.25rem;--spacing-sm:.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--spacing-2xl:3rem;--spacing-3xl:4rem;--radius-sm:.25rem;--radius-md:.5rem;--radius-lg:.75rem;--radius-xl:1rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 #0000004d;--shadow-md:0 4px 6px -1px #0006, 0 2px 4px -1px #0000004d;--shadow-lg:0 10px 15px -3px #00000080, 0 4px 6px -2px #0006;--shadow-xl:0 20px 25px -5px #0009, 0 10px 10px -5px #00000080;--z-base:0;--z-dropdown:100;--z-sticky:200;--z-modal:300;--z-toast:400;--z-tooltip:500;--chamfer-size:8px;--chamfer-size-lg:12px;--chamfer-size-sm:4px;--transition-fast:.15s ease-in-out;--transition-base:.2s ease-in-out;--transition-slow:.3s ease-in-out;--topbar-height:64px;--topbar-background:var(--color-background-elevated);--topbar-border:var(--color-border);--container-max-width:1280px;--container-padding:var(--spacing-md);--button-height:40px;--button-padding-x:var(--spacing-lg);--button-padding-y:var(--spacing-sm);--input-height:40px;--input-padding-x:var(--spacing-md);--input-padding-y:var(--spacing-sm);--input-border:var(--color-border);--input-background:var(--color-surface);--card-padding:var(--spacing-lg);--card-background:var(--color-surface);--card-border:var(--color-border)}*,:before,:after{box-sizing:border-box}*{margin:0;padding:0}html,body{height:100%}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{line-height:var(--line-height-normal);font-family:var(--font-primary);font-size:var(--font-size-base);color:var(--color-text-primary);background-color:var(--color-background)}img,picture,video,canvas,svg{max-width:100%;display:block}input,button,textarea,select{font:inherit;color:inherit}button{cursor:pointer;background:0 0;border:none}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}ul,ol{list-style:none}a{color:inherit;text-decoration:none}#root{isolation:isolate;min-height:100%}@property --card-edge-color{syntax:"<color>";inherits:false;initial-value:#0000}.chamfered-box{--_chamfer:var(--chamfer-size);--_chamfer-br:var(--chamfer-size)}.chamfered-box-sm{--_chamfer:var(--chamfer-size-sm);--_chamfer-br:var(--chamfer-size-sm)}.chamfered-box-lg{--_chamfer:var(--chamfer-size-lg);--_chamfer-br:var(--chamfer-size-lg)}.chamfered-box-asymmetric{--_chamfer:12px;--_chamfer-br:24px}.chamfered-box,.chamfered-box-sm,.chamfered-box-lg,.chamfered-box-asymmetric{clip-path:polygon(var(--_chamfer) 0, calc(100% - var(--_chamfer)) 0, 100% var(--_chamfer), 100% calc(100% - var(--_chamfer-br)), calc(100% - var(--_chamfer-br)) 100%, var(--_chamfer) 100%, 0 calc(100% - var(--_chamfer)), 0 var(--_chamfer));position:relative}.chamfered-border{background:var(--color-surface);position:relative}.chamfered-border:before{content:"";background:linear-gradient(135deg, var(--color-primary), var(--color-secondary));-webkit-mask-composite:xor;clip-path:polygon(var(--chamfer-size) 0, calc(100% - var(--chamfer-size)) 0, 100% var(--chamfer-size), 100% calc(100% - var(--chamfer-size)), calc(100% - var(--chamfer-size)) 100%, var(--chamfer-size) 100%, 0 calc(100% - var(--chamfer-size)), 0 var(--chamfer-size));padding:2px;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;-webkit-mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.chamfered-diagonal-border{--_chamfer-diag:calc(var(--_chamfer) * 1.41421);--_chamfer-diag-br:calc(var(--_chamfer-br) * 1.41421);z-index:5;pointer-events:none;background-color:currentColor;height:2px;transition:background-color .3s;position:absolute}.chamfered-diagonal-tl{top:-1px;left:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:0;transform:rotate(135deg)}.chamfered-diagonal-tr{top:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:100%;right:-1px;transform:rotate(45deg)}.chamfered-diagonal-bl{bottom:-1px;left:calc(var(--_chamfer) - 1px);width:var(--_chamfer-diag);transform-origin:0;transform:rotate(-135deg)}.chamfered-diagonal-br{bottom:calc(var(--_chamfer-br) - 1px);width:var(--_chamfer-diag-br);transform-origin:100%;right:-1px;transform:rotate(-45deg)}.gradient-primary{background:linear-gradient(135deg, var(--color-primary), var(--color-primary-active))}.gradient-secondary{background:linear-gradient(135deg, var(--color-secondary), var(--color-secondary-active))}.gradient-surface{background:linear-gradient(135deg, var(--color-surface), var(--color-background-elevated))}.glow-primary{box-shadow:0 0 20px #1a73e880}.glow-secondary{box-shadow:0 0 20px #34a85380}.glow-error{box-shadow:0 0 20px #ea433580}.glow-tier-gold{box-shadow:0 0 20px var(--tier-gold-glow)}.glow-tier-purple{box-shadow:0 0 20px var(--tier-purple-glow)}.glow-tier-blue{box-shadow:0 0 20px var(--tier-blue-glow)}.sixdot-border{position:relative}.sixdot-border:before{content:"";background:linear-gradient(45deg, var(--sixdot-gradient-start), var(--sixdot-gradient-mid), var(--sixdot-gradient-end));border-radius:inherit;opacity:var(--sixdot-border-opacity);z-index:-1;position:absolute;inset:-2px}.sixdot-glow{background:linear-gradient(135deg,#4338ca33,#7c3aed33)}.hover-scale{transition:transform var(--transition-base)}.hover-scale:hover{transform:scale(1.02)}.hover-brighten{transition:filter var(--transition-base)}.hover-brighten:hover{filter:brightness(1.1)}.hover-lift{transition:transform var(--transition-base)}.hover-lift:hover{transform:translateY(-2px)}.hover-glow{transition:box-shadow var(--transition-base)}.hover-glow:hover{box-shadow:0 0 20px #1a73e866}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-fade-in{animation:fadeIn var(--transition-base)}.animate-slide-up{animation:slideUp var(--transition-base)}.animate-slide-down{animation:slideDown var(--transition-base)}.animate-spin{animation:1s linear infinite spin}.flex{display:flex}.flex-col{flex-direction:column;display:flex}.flex-center{justify-content:center;align-items:center;display:flex}.flex-between{justify-content:space-between;align-items:center;display:flex}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.grid{display:grid}.grid-cols-2{grid-template-columns:repeat(2,1fr)}.grid-cols-3{grid-template-columns:repeat(3,1fr)}.grid-cols-4{grid-template-columns:repeat(4,1fr)}.gap-sm{gap:var(--spacing-sm)}.gap-md{gap:var(--spacing-md)}.gap-lg{gap:var(--spacing-lg)}.gap-xl{gap:var(--spacing-xl)}.m-0{margin:0}.mt-sm{margin-top:var(--spacing-sm)}.mt-md{margin-top:var(--spacing-md)}.mt-lg{margin-top:var(--spacing-lg)}.mt-xl{margin-top:var(--spacing-xl)}.mb-sm{margin-bottom:var(--spacing-sm)}.mb-md{margin-bottom:var(--spacing-md)}.mb-lg{margin-bottom:var(--spacing-lg)}.mb-xl{margin-bottom:var(--spacing-xl)}.p-sm{padding:var(--spacing-sm)}.p-md{padding:var(--spacing-md)}.p-lg{padding:var(--spacing-lg)}.p-xl{padding:var(--spacing-xl)}.text-xs{font-size:var(--font-size-xs)}.text-sm{font-size:var(--font-size-sm)}.text-base{font-size:var(--font-size-base)}.text-lg{font-size:var(--font-size-lg)}.text-xl{font-size:var(--font-size-xl)}.text-2xl{font-size:var(--font-size-2xl)}.text-3xl{font-size:var(--font-size-3xl)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-normal{font-weight:var(--font-weight-normal)}.font-medium{font-weight:var(--font-weight-medium)}.font-semibold{font-weight:var(--font-weight-semibold)}.font-bold{font-weight:var(--font-weight-bold)}.text-primary{color:var(--color-text-primary)}.text-secondary{color:var(--color-text-secondary)}.text-disabled{color:var(--color-text-disabled)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-surface{background-color:var(--color-surface)}.bg-elevated{background-color:var(--color-background-elevated)}.hidden{display:none}.block{display:block}.inline-block{display:inline-block}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.w-full{width:100%}.w-auto{width:auto}.h-full{height:100%}.h-auto{height:auto}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-scroll{overflow:scroll}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-background)}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--color-text-disabled)}:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.bg-overlay{position:relative}.bg-overlay:before{content:"";background:var(--overlay-gradient,linear-gradient(135deg, #0f172ab3, #0f172a80));z-index:0;position:absolute;inset:0}.bg-overlay>*{z-index:1;position:relative}.backdrop-image{background-position:50%;background-repeat:no-repeat;background-size:cover;position:absolute;inset:0}._container_u3o0e_1{width:100%;margin-left:auto;margin-right:auto}._padding_u3o0e_7{padding-left:var(--container-padding);padding-right:var(--container-padding)}._maxWidth-sm_u3o0e_12{max-width:640px}._maxWidth-md_u3o0e_16{max-width:768px}._maxWidth-lg_u3o0e_20{max-width:1024px}._maxWidth-xl_u3o0e_24{max-width:var(--container-max-width)}._maxWidth-full_u3o0e_28{max-width:100%}@media (width<=768px){._padding_u3o0e_7{padding-left:var(--spacing-md);padding-right:var(--spacing-md)}}._topBar_10g3c_1{height:var(--topbar-height);background-color:var(--topbar-background);border-bottom:1px solid var(--topbar-border);z-index:var(--z-sticky);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);position:sticky;top:0;left:0;right:0}._content_10g3c_13{height:100%;max-width:var(--container-max-width);padding:0 var(--container-padding);justify-content:space-between;align-items:center;margin:0 auto;display:flex}._left_10g3c_23{align-items:center;gap:var(--spacing-xl);flex:1;display:flex}._right_10g3c_30{align-items:center;gap:var(--spacing-md);display:flex}._logo_10g3c_36{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--color-primary);font-family:var(--font-heading);align-items:center;display:flex}@media (width<=768px){._content_10g3c_13{padding:0 var(--spacing-md)}._left_10g3c_23{gap:var(--spacing-md)}._right_10g3c_30{gap:var(--spacing-sm)}}._button_159ms_1{justify-content:center;align-items:center;gap:var(--spacing-sm);font-family:var(--font-primary);font-weight:var(--font-weight-medium);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-base);text-align:center;-webkit-user-select:none;user-select:none;border:2px solid #0000;display:inline-flex}._button_159ms_1:disabled{opacity:.5;cursor:not-allowed}._sm_159ms_22{height:32px;padding:0 var(--spacing-md);font-size:var(--font-size-sm)}._md_159ms_28{height:var(--button-height);padding:0 var(--button-padding-x);font-size:var(--font-size-base)}._lg_159ms_34{height:48px;padding:0 var(--spacing-xl);font-size:var(--font-size-lg)}._primary_159ms_41{background-color:var(--color-primary);color:var(--color-text-primary)}._primary_159ms_41:hover:not(:disabled){background-color:var(--color-primary-hover);box-shadow:var(--shadow-md)}._primary_159ms_41:active:not(:disabled){background-color:var(--color-primary-active)}._secondary_159ms_55{background-color:var(--color-secondary);color:var(--color-text-primary)}._secondary_159ms_55:hover:not(:disabled){background-color:var(--color-secondary-hover);box-shadow:var(--shadow-md)}._secondary_159ms_55:active:not(:disabled){background-color:var(--color-secondary-active)}._outline_159ms_69{border-color:var(--color-border);color:var(--color-text-primary);background-color:#0000}._outline_159ms_69:hover:not(:disabled){background-color:var(--color-background-hover);border-color:var(--color-primary)}._ghost_159ms_80{color:var(--color-text-primary);background-color:#0000}._ghost_159ms_80:hover:not(:disabled){background-color:var(--color-background-hover)}._danger_159ms_89{background-color:var(--color-error);color:var(--color-text-primary)}._danger_159ms_89:hover:not(:disabled){box-shadow:var(--shadow-md);background-color:#c33a2e}._fullWidth_159ms_100{width:100%}._loading_159ms_105{pointer-events:none;position:relative}._loadingSpinner_159ms_110{align-items:center;gap:var(--spacing-sm);display:flex}._spinner_159ms_116{border:2px solid #0000;border-top-color:currentColor;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite _spin_159ms_116}@keyframes _spin_159ms_116{to{transform:rotate(360deg)}}._loadingText_159ms_131{opacity:.7}._selectWrapper_ir4bq_1{gap:var(--spacing-xs);flex-direction:column;display:flex}._fullWidth_ir4bq_7{width:100%}._label_ir4bq_11{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-primary);align-items:center;gap:var(--spacing-xs);display:flex}._required_ir4bq_20{color:var(--color-error)}._selectContainer_ir4bq_24{width:100%;display:inline-block;position:relative}._select_ir4bq_1{width:100%;height:var(--input-height);padding:var(--input-padding-y) var(--input-padding-x);padding-right:calc(var(--input-padding-x) + 24px);font-size:var(--font-size-base);font-family:var(--font-primary);color:var(--color-text-primary);background-color:var(--input-background);border:1px solid var(--input-border);border-radius:var(--radius-md);transition:all var(--transition-base);cursor:pointer;appearance:none;outline:none}._select_ir4bq_1:hover{border-color:var(--color-text-disabled)}._select_ir4bq_1:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #1a73e81a}._select_ir4bq_1:disabled{opacity:.5;cursor:not-allowed}._select_ir4bq_1._error_ir4bq_63{border-color:var(--color-error)}._select_ir4bq_1._error_ir4bq_63:focus{box-shadow:0 0 0 3px #ea43351a}._arrow_ir4bq_71{right:var(--input-padding-x);pointer-events:none;font-size:var(--font-size-xs);color:var(--color-text-secondary);position:absolute;top:50%;transform:translateY(-50%)}._errorText_ir4bq_81{font-size:var(--font-size-sm);color:var(--color-error)}._helperText_ir4bq_86{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._select_ir4bq_1 option{background-color:var(--color-surface);color:var(--color-text-primary)}._inputWrapper_15t4g_1{gap:var(--spacing-xs);flex-direction:column;display:flex}._fullWidth_15t4g_7{width:100%}._label_15t4g_11{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-primary);align-items:center;gap:var(--spacing-xs);display:flex}._required_15t4g_20{color:var(--color-error)}._input_15t4g_1{height:var(--input-height);padding:var(--input-padding-y) var(--input-padding-x);font-size:var(--font-size-base);font-family:var(--font-primary);color:var(--color-text-primary);background-color:var(--input-background);border:1px solid var(--input-border);border-radius:var(--radius-md);transition:all var(--transition-base);outline:none}._input_15t4g_1:hover{border-color:var(--color-text-disabled)}._input_15t4g_1:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #1a73e81a}._input_15t4g_1:disabled{opacity:.5;cursor:not-allowed}._input_15t4g_1::placeholder{color:var(--color-text-disabled)}._input_15t4g_1._error_15t4g_55{border-color:var(--color-error)}._input_15t4g_1._error_15t4g_55:focus{box-shadow:0 0 0 3px #ea43351a}._errorText_15t4g_63{font-size:var(--font-size-sm);color:var(--color-error)}._helperText_15t4g_68{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._allyCodeDropdown_1m0tw_1{align-items:center;gap:.5rem;display:flex;position:relative}._select_1m0tw_8{min-width:200px}._manageButton_1m0tw_12{white-space:nowrap}._managePanel_1m0tw_16{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);z-index:1000;min-width:300px;margin-top:.5rem;padding:1rem;position:absolute;top:100%;right:0;box-shadow:0 4px 6px #0000001a}._managePanel_1m0tw_16 h4{color:var(--color-text-primary);margin:0 0 1rem;font-size:.875rem;font-weight:600}._addSection_1m0tw_37{border-bottom:1px solid var(--color-border);margin-bottom:1rem;padding-bottom:1rem}._addInputGroup_1m0tw_43{gap:.5rem;margin-bottom:.5rem;display:flex}._addInputGroup_1m0tw_43 input{letter-spacing:.05em;flex:1;font-family:monospace}._error_1m0tw_55{color:var(--color-error);margin-top:.25rem;font-size:.75rem}._success_1m0tw_61{color:var(--color-success);margin-top:.25rem;font-size:.75rem}._codesList_1m0tw_67{margin-bottom:1rem}._codeItem_1m0tw_71{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:.5rem 0;display:flex}._codeItem_1m0tw_71:last-of-type{border-bottom:none}._codeItem_1m0tw_71 span{color:var(--color-text-secondary);font-size:.875rem}._doneButton_1m0tw_88{width:100%}@media (width<=768px){._select_1m0tw_8{min-width:150px}._managePanel_1m0tw_16{left:0;right:auto}}._logoLink_84pn2_3{color:inherit;text-decoration:none}._appNav_84pn2_9{align-items:center;gap:var(--spacing-lg,1.5rem);display:flex}._appName_84pn2_15{font-family:var(--font-heading);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);color:var(--color-text-primary);white-space:nowrap;text-decoration:none}._appName_84pn2_15:hover{color:var(--color-primary)}._tabs_84pn2_29{align-items:center;gap:var(--spacing-lg,1.5rem);height:var(--topbar-height);display:flex}._tab_84pn2_29{height:100%;padding:0 var(--spacing-xs,.25rem);color:var(--color-text-secondary);font-size:var(--font-size-base);white-space:nowrap;border-bottom:2px solid #0000;align-items:center;text-decoration:none;transition:color .15s,border-color .15s;display:flex}._tab_84pn2_29:hover{color:var(--color-text-primary)}._tabActive_84pn2_56{color:var(--color-text-primary);border-bottom-color:var(--color-primary)}._extrasGroup_84pn2_64{align-items:center;gap:.4rem;display:flex}._authCluster_84pn2_70{align-items:center;gap:var(--spacing-sm);display:flex}._userLink_84pn2_76{color:var(--color-text-secondary);text-decoration:none}._userLink_84pn2_76:hover{color:var(--color-text-primary)}._footer_zjuj8_1{background-color:var(--color-background-elevated);border-top:1px solid var(--color-border);margin-top:auto}._content_zjuj8_7{max-width:var(--container-max-width);padding:var(--spacing-xl) var(--container-padding);margin:0 auto}._defaultContent_zjuj8_13{align-items:center;gap:var(--spacing-sm);text-align:center;flex-direction:column;display:flex}._copyright_zjuj8_21{font-size:var(--font-size-sm);color:var(--color-text-secondary)}._disclaimer_zjuj8_26{font-size:var(--font-size-xs);color:var(--color-text-disabled)}@media (width<=768px){._content_zjuj8_7{padding:var(--spacing-lg) var(--spacing-md)}}._rosterRefresh_1rbul_3{align-items:center;gap:.4rem;display:flex}._updatedLabel_1rbul_11{color:var(--color-text-secondary);white-space:nowrap;font-size:.75rem}._refreshButton_1rbul_19{aspect-ratio:1;border-radius:50%;justify-content:center;align-items:center;padding:.4rem;line-height:1;display:inline-flex}._spin_1rbul_31{animation:.8s linear infinite _spin_1rbul_31;display:inline-block}@keyframes _spin_1rbul_31{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._card_1vw8g_1{background-color:var(--card-background);border-radius:var(--radius-lg);border:1px solid var(--card-edge-color,transparent);transition:transform var(--transition-base), box-shadow var(--transition-base)}._card_1vw8g_1._chamfered_1vw8g_15{border-radius:0}._default_1vw8g_20{background-color:var(--card-background)}._elevated_1vw8g_24{background-color:var(--card-background);box-shadow:var(--shadow-md)}._outline_1vw8g_29{border:1px solid var(--card-edge-color,var(--card-border));background-color:#0000}._padding-none_1vw8g_35{padding:0}._padding-sm_1vw8g_39{padding:var(--spacing-sm)}._padding-md_1vw8g_43{padding:var(--card-padding)}._padding-lg_1vw8g_47{padding:var(--spacing-xl)}._hoverable_1vw8g_52{cursor:pointer;will-change:transform;backface-visibility:hidden;transform:translateZ(0)}._hoverable_1vw8g_52:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)translateZ(0)}._hoverable_1vw8g_52:active{box-shadow:var(--shadow-md);transform:translateY(-1px)translateZ(0)}._card_1vw8g_1[role=button]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._badge_rk7t5_1{font-weight:var(--font-weight-medium);border-radius:var(--radius-full);white-space:nowrap;justify-content:center;align-items:center;display:inline-flex}._sm_rk7t5_11{font-size:var(--font-size-xs);padding:2px 8px}._md_rk7t5_16{font-size:var(--font-size-sm);padding:4px 12px}._lg_rk7t5_21{font-size:var(--font-size-base);padding:6px 16px}._default_rk7t5_27{background-color:var(--color-surface);color:var(--color-text-secondary)}._primary_rk7t5_32{background-color:var(--color-primary);color:var(--color-text-primary)}._secondary_rk7t5_37{background-color:var(--color-secondary);color:var(--color-text-primary)}._success_rk7t5_42{background-color:var(--color-success);color:var(--color-text-primary)}._warning_rk7t5_47{background-color:var(--color-warning);color:var(--color-background)}._error_rk7t5_52{background-color:var(--color-error);color:var(--color-text-primary)}._info_rk7t5_57{background-color:var(--color-info);color:var(--color-text-primary)}._overlay_1b3yt_1{z-index:var(--z-modal);padding:var(--spacing-md);animation:_fadeIn_1b3yt_1 var(--transition-base);background-color:#000000bf;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._modal_1b3yt_13{background-color:var(--color-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);max-height:90vh;animation:_slideUp_1b3yt_1 var(--transition-base);flex-direction:column;display:flex;overflow:hidden}._sm_1b3yt_25{width:100%;max-width:400px}._md_1b3yt_30{width:100%;max-width:600px}._lg_1b3yt_35{width:100%;max-width:800px}._xl_1b3yt_40{width:100%;max-width:1200px}._header_1b3yt_45{padding:var(--spacing-lg);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;display:flex}._title_1b3yt_53{font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);margin:0}._closeButton_1b3yt_60{border-radius:var(--radius-md);width:32px;height:32px;color:var(--color-text-secondary);transition:all var(--transition-fast);font-size:var(--font-size-xl);justify-content:center;align-items:center;line-height:1;display:flex}._closeButton_1b3yt_60:hover{background-color:var(--color-background-hover);color:var(--color-text-primary)}._content_1b3yt_78{padding:var(--spacing-lg);flex:1;overflow-y:auto}@keyframes _fadeIn_1b3yt_1{0%{opacity:0}to{opacity:1}}@keyframes _slideUp_1b3yt_1{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (width<=768px){._modal_1b3yt_13{max-height:95vh}._header_1b3yt_45,._content_1b3yt_78{padding:var(--spacing-md)}}._spinner_1uhnh_2{border:3px solid #ffffff1a;border-top-color:var(--color-primary);border-radius:50%;animation:.8s linear infinite _spin_1uhnh_2}._spinner_1uhnh_2._sm_1uhnh_9{border-width:2px;width:16px;height:16px}._spinner_1uhnh_2._md_1uhnh_15{border-width:3px;width:32px;height:32px}._spinner_1uhnh_2._lg_1uhnh_21{border-width:4px;width:48px;height:48px}@keyframes _spin_1uhnh_2{to{transform:rotate(360deg)}}._dots_1uhnh_34{gap:8px;display:inline-flex}._dots_1uhnh_34._sm_1uhnh_9{gap:4px}._dots_1uhnh_34._lg_1uhnh_21{gap:12px}._dot_1uhnh_34{background-color:var(--color-primary);border-radius:50%;animation:1.4s ease-in-out infinite both _bounce_1uhnh_1;display:inline-block}._dots_1uhnh_34._sm_1uhnh_9 ._dot_1uhnh_34{width:6px;height:6px}._dots_1uhnh_34._md_1uhnh_15 ._dot_1uhnh_34{width:10px;height:10px}._dots_1uhnh_34._lg_1uhnh_21 ._dot_1uhnh_34{width:14px;height:14px}._dot_1uhnh_34:first-child{animation-delay:-.32s}._dot_1uhnh_34:nth-child(2){animation-delay:-.16s}@keyframes _bounce_1uhnh_1{0%,80%,to{opacity:.5;transform:scale(0)}40%{opacity:1;transform:scale(1)}}._visuallyHidden_1uhnh_91{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
2
2
  /*$vite$:1*/
package/dist/index.js CHANGED
@@ -298,14 +298,14 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
298
298
  } catch (e) {
299
299
  console.error("Failed to save ally code to localStorage:", e);
300
300
  }
301
- }, H = (e) => {
301
+ }, re = (e) => {
302
302
  try {
303
303
  let t = V().filter((t) => t.ally_code !== e);
304
304
  localStorage.setItem(z, JSON.stringify(t));
305
305
  } catch (e) {
306
306
  console.error("Failed to remove ally code from localStorage:", e);
307
307
  }
308
- }, U = (e) => {
308
+ }, H = (e) => {
309
309
  try {
310
310
  let t = V().map((t) => t.ally_code === e ? {
311
311
  ...t,
@@ -315,11 +315,11 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
315
315
  } catch (e) {
316
316
  console.error("Failed to update ally code last used:", e);
317
317
  }
318
- }, re = () => localStorage.getItem(B), ie = (e) => {
318
+ }, ie = () => localStorage.getItem(B), U = (e) => {
319
319
  e ? localStorage.setItem(B, e) : localStorage.removeItem(B);
320
320
  }, ae = () => {
321
321
  localStorage.removeItem(z), localStorage.removeItem(B);
322
- }, W = t(void 0), oe = ({ children: e, apiBaseUrl: t }) => {
322
+ }, oe = t(void 0), se = ({ children: e, apiBaseUrl: t }) => {
323
323
  let [r, o] = a(null), [c, l] = a(!0), [u, d] = a(!0), [f, p] = a(!0), [m, h] = a([]), [g, _] = a(null), [v, y] = a(!1), [b, x] = a({
324
324
  show: !1,
325
325
  localStorageCodes: []
@@ -365,7 +365,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
365
365
  throw console.error("Registration failed:", e), e;
366
366
  }
367
367
  }, T = () => {
368
- O(), o(null), h([]), _(null), x({
368
+ O(), o(null), h([]), _(null), U(null), x({
369
369
  show: !1,
370
370
  localStorageCodes: []
371
371
  });
@@ -392,27 +392,33 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
392
392
  }, M = n(async () => {
393
393
  y(!0);
394
394
  try {
395
+ let e = [];
395
396
  if (r) {
396
- h((await R.get("/api/v1/users/me/ally-codes")).ally_codes);
397
- let e = V();
398
- e.length > 0 && x({
397
+ let t = await R.get("/api/v1/users/me/ally-codes");
398
+ h(t.ally_codes), e = t.ally_codes.map((e) => e.ally_code);
399
+ let n = V();
400
+ n.length > 0 && x({
399
401
  show: !0,
400
- localStorageCodes: e.map((e) => e.ally_code)
402
+ localStorageCodes: n.map((e) => e.ally_code)
401
403
  });
402
- } else h(V());
403
- _(re());
404
+ } else {
405
+ let t = V();
406
+ h(t), e = t.map((e) => e.ally_code);
407
+ }
408
+ let t = ie(), n = t && e.includes(t) ? t : null;
409
+ _(n), n !== t && U(n);
404
410
  } catch (e) {
405
411
  console.error("Failed to fetch ally codes:", e), h([]);
406
412
  } finally {
407
413
  y(!1);
408
414
  }
409
415
  }, [r]), N = n(async (e) => {
410
- r && typeof e == "number" ? (await R.put(`/api/v1/users/me/ally-codes/${e}/use`, {}), await M()) : !r && typeof e == "string" && (U(e), h(V()));
416
+ r && typeof e == "number" ? (await R.put(`/api/v1/users/me/ally-codes/${e}/use`, {}), await M()) : !r && typeof e == "string" && (H(e), h(V()));
411
417
  }, [r, M]), P = n((e) => {
412
- if (_(e), ie(e), e && r) {
418
+ if (_(e), U(e), e && r) {
413
419
  let t = m.find((t) => "ally_code" in t && t.ally_code === e);
414
420
  t && "id" in t && N(t.id);
415
- } else e && !r && U(e);
421
+ } else e && !r && H(e);
416
422
  }, [
417
423
  r,
418
424
  m,
@@ -436,7 +442,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
436
442
  m.length,
437
443
  P
438
444
  ]), I = n(async (e) => {
439
- r && typeof e == "number" ? (await R.delete(`/api/v1/users/me/ally-codes/${e}`), h((t) => t.filter((t) => "id" in t && t.id !== e))) : !r && typeof e == "string" && (H(e), h(V()), g === e && P(null));
445
+ r && typeof e == "number" ? (await R.delete(`/api/v1/users/me/ally-codes/${e}`), h((t) => t.filter((t) => "id" in t && t.id !== e))) : !r && typeof e == "string" && (re(e), h(V()), g === e && P(null));
440
446
  }, [
441
447
  r,
442
448
  g,
@@ -488,15 +494,15 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
488
494
  dismissMigrationPrompt: L,
489
495
  migrateLocalStorageCodes: z
490
496
  };
491
- return /* @__PURE__ */ s(W.Provider, {
497
+ return /* @__PURE__ */ s(oe.Provider, {
492
498
  value: B,
493
499
  children: e
494
500
  });
495
- }, G = () => {
496
- let e = r(W);
501
+ }, W = () => {
502
+ let e = r(oe);
497
503
  if (e === void 0) throw Error("useAuth must be used within an AuthProvider");
498
504
  return e;
499
- }, K = (e) => !e || e.length !== 9 ? e : `${e.slice(0, 3)}-${e.slice(3, 6)}-${e.slice(6, 9)}`, se = (e) => e.replace(/-/g, ""), q = {
505
+ }, G = (e) => !e || e.length !== 9 ? e : `${e.slice(0, 3)}-${e.slice(3, 6)}-${e.slice(6, 9)}`, ce = (e) => e.replace(/-/g, ""), K = {
500
506
  allyCodeDropdown: "_allyCodeDropdown_1m0tw_1",
501
507
  select: "_select_1m0tw_8",
502
508
  manageButton: "_manageButton_1m0tw_12",
@@ -508,10 +514,10 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
508
514
  codesList: "_codesList_1m0tw_67",
509
515
  codeItem: "_codeItem_1m0tw_71",
510
516
  doneButton: "_doneButton_1m0tw_88"
511
- }, ce = ({ onAllyCodeSelected: e, className: t = "" }) => {
512
- let { allyCodes: n, selectedAllyCode: r, selectAllyCode: i, removeAllyCode: o, addAllyCode: l, isLoadingAllyCodes: u } = G(), [d, f] = a(!1), [p, h] = a(""), [_, y] = a(""), [b, x] = a(""), [S, C] = a(!1), w = n.map((e) => ({
517
+ }, le = ({ onAllyCodeSelected: e, className: t = "" }) => {
518
+ let { allyCodes: n, selectedAllyCode: r, selectAllyCode: i, removeAllyCode: o, addAllyCode: l, isLoadingAllyCodes: u } = W(), [d, f] = a(!1), [p, h] = a(""), [_, y] = a(""), [b, x] = a(""), [S, C] = a(!1), w = n.map((e) => ({
513
519
  value: e.ally_code,
514
- label: e.player_name ? `${e.player_name} (${K(e.ally_code)})` : K(e.ally_code)
520
+ label: e.player_name ? `${e.player_name} (${G(e.ally_code)})` : G(e.ally_code)
515
521
  })), T = (t) => {
516
522
  let n = t.target.value || null;
517
523
  i(n), e?.(n);
@@ -533,7 +539,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
533
539
  }
534
540
  }, O = n.length > 0;
535
541
  return /* @__PURE__ */ c("div", {
536
- className: `${q.allyCodeDropdown} ${t}`,
542
+ className: `${K.allyCodeDropdown} ${t}`,
537
543
  children: [
538
544
  O && /* @__PURE__ */ s(g, {
539
545
  options: w,
@@ -541,17 +547,17 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
541
547
  onChange: T,
542
548
  placeholder: "Select ally code",
543
549
  disabled: u,
544
- className: q.select
550
+ className: K.select
545
551
  }),
546
552
  d && /* @__PURE__ */ c("div", {
547
- className: q.managePanel,
553
+ className: K.managePanel,
548
554
  children: [
549
555
  /* @__PURE__ */ s("h4", { children: "Manage Ally Codes" }),
550
556
  /* @__PURE__ */ c("div", {
551
- className: q.addSection,
557
+ className: K.addSection,
552
558
  children: [
553
559
  /* @__PURE__ */ c("div", {
554
- className: q.addInputGroup,
560
+ className: K.addInputGroup,
555
561
  children: [/* @__PURE__ */ s(v, {
556
562
  type: "text",
557
563
  placeholder: "9-digit ally code",
@@ -568,20 +574,20 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
568
574
  })]
569
575
  }),
570
576
  _ && /* @__PURE__ */ s("div", {
571
- className: q.error,
577
+ className: K.error,
572
578
  children: _
573
579
  }),
574
580
  b && /* @__PURE__ */ s("div", {
575
- className: q.success,
581
+ className: K.success,
576
582
  children: b
577
583
  })
578
584
  ]
579
585
  }),
580
586
  /* @__PURE__ */ s("div", {
581
- className: q.codesList,
587
+ className: K.codesList,
582
588
  children: n.map((e) => /* @__PURE__ */ c("div", {
583
- className: q.codeItem,
584
- children: [/* @__PURE__ */ s("span", { children: e.player_name ? `${e.player_name} (${K(e.ally_code)})` : K(e.ally_code) }), /* @__PURE__ */ s(m, {
589
+ className: K.codeItem,
590
+ children: [/* @__PURE__ */ s("span", { children: e.player_name ? `${e.player_name} (${G(e.ally_code)})` : G(e.ally_code) }), /* @__PURE__ */ s(m, {
585
591
  variant: "ghost",
586
592
  size: "sm",
587
593
  onClick: () => E(e.ally_code),
@@ -593,7 +599,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
593
599
  variant: "secondary",
594
600
  size: "sm",
595
601
  onClick: () => f(!1),
596
- className: q.doneButton,
602
+ className: K.doneButton,
597
603
  children: "Done"
598
604
  })
599
605
  ]
@@ -602,12 +608,12 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
602
608
  variant: "ghost",
603
609
  size: "sm",
604
610
  onClick: () => f(!d),
605
- className: q.manageButton,
611
+ className: K.manageButton,
606
612
  children: O ? "Manage" : "+ Add ally code"
607
613
  })
608
614
  ]
609
615
  });
610
- }, J = {
616
+ }, q = {
611
617
  logoLink: "_logoLink_84pn2_3",
612
618
  appNav: "_appNav_84pn2_9",
613
619
  appName: "_appName_84pn2_15",
@@ -617,14 +623,14 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
617
623
  extrasGroup: "_extrasGroup_84pn2_64",
618
624
  authCluster: "_authCluster_84pn2_70",
619
625
  userLink: "_userLink_84pn2_76"
620
- }, le = ({ hubUrl: t = "/", appName: n, appHref: r = "/", navItems: i, showAllyCode: a = !1, showAuth: l = !0, rightExtras: u, className: d }) => {
621
- let { user: p, isAuthenticated: h, logout: g, authEnabled: _ } = G(), v = () => {
626
+ }, ue = ({ hubUrl: t = "/", appName: n, appHref: r = "/", navItems: i, showAllyCode: a = !1, showAuth: l = !0, rightExtras: u, className: d }) => {
627
+ let { user: p, isAuthenticated: h, logout: g, authEnabled: _ } = W(), v = () => {
622
628
  g(), window.location.href = t;
623
629
  }, y = !!u || a, b = !!(i && i.length > 0), x = !!n || b, S = l ? h ? /* @__PURE__ */ c("div", {
624
- className: J.authCluster,
630
+ className: q.authCluster,
625
631
  children: [/* @__PURE__ */ s("a", {
626
632
  href: "/profile",
627
- className: J.userLink,
633
+ className: q.userLink,
628
634
  children: p?.username
629
635
  }), /* @__PURE__ */ s(m, {
630
636
  variant: "ghost",
@@ -633,7 +639,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
633
639
  children: "Logout"
634
640
  })]
635
641
  }) : _ ? /* @__PURE__ */ c("div", {
636
- className: J.authCluster,
642
+ className: q.authCluster,
637
643
  children: [/* @__PURE__ */ s("a", {
638
644
  href: "/login",
639
645
  children: /* @__PURE__ */ s(m, {
@@ -654,19 +660,19 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
654
660
  className: d,
655
661
  logo: /* @__PURE__ */ s("a", {
656
662
  href: t,
657
- className: J.logoLink,
663
+ className: q.logoLink,
658
664
  children: "The Astrogator's Table"
659
665
  }),
660
666
  leftContent: x ? /* @__PURE__ */ c("div", {
661
- className: J.appNav,
667
+ className: q.appNav,
662
668
  children: [n && /* @__PURE__ */ s("a", {
663
669
  href: r,
664
- className: J.appName,
670
+ className: q.appName,
665
671
  children: n
666
672
  }), b && /* @__PURE__ */ s("nav", {
667
- className: J.tabs,
673
+ className: q.tabs,
668
674
  children: i.map((t) => {
669
- let n = `${J.tab} ${t.active ? J.tabActive : ""}`;
675
+ let n = `${q.tab} ${t.active ? q.tabActive : ""}`;
670
676
  return t.render ? /* @__PURE__ */ s(e.Fragment, { children: t.render({
671
677
  className: n,
672
678
  children: t.label
@@ -679,36 +685,87 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
679
685
  })]
680
686
  }) : void 0,
681
687
  rightContent: /* @__PURE__ */ c(o, { children: [y && /* @__PURE__ */ c("div", {
682
- className: J.extrasGroup,
683
- children: [u, a && /* @__PURE__ */ s(ce, {})]
688
+ className: q.extrasGroup,
689
+ children: [u, a && /* @__PURE__ */ s(le, {})]
684
690
  }), S] })
685
691
  });
686
- }, Y = {
692
+ }, J = {
687
693
  footer: "_footer_zjuj8_1",
688
694
  content: "_content_zjuj8_7",
689
695
  defaultContent: "_defaultContent_zjuj8_13",
690
696
  copyright: "_copyright_zjuj8_21",
691
697
  disclaimer: "_disclaimer_zjuj8_26"
692
- }, ue = ({ children: e, className: t = "" }) => /* @__PURE__ */ s("footer", {
693
- className: `${Y.footer} ${t}`,
698
+ }, de = ({ children: e, className: t = "" }) => /* @__PURE__ */ s("footer", {
699
+ className: `${J.footer} ${t}`,
694
700
  children: /* @__PURE__ */ s("div", {
695
- className: Y.content,
701
+ className: J.content,
696
702
  children: e || /* @__PURE__ */ c("div", {
697
- className: Y.defaultContent,
703
+ className: J.defaultContent,
698
704
  children: [/* @__PURE__ */ c("p", {
699
- className: Y.copyright,
705
+ className: J.copyright,
700
706
  children: [
701
707
  "© ",
702
708
  (/* @__PURE__ */ new Date()).getFullYear(),
703
709
  " The Astrogator's Table. All rights reserved."
704
710
  ]
705
711
  }), /* @__PURE__ */ s("p", {
706
- className: Y.disclaimer,
712
+ className: J.disclaimer,
707
713
  children: "Star Wars: Galaxy of Heroes is a trademark of Electronic Arts Inc."
708
714
  })]
709
715
  })
710
716
  })
711
- }), X = {
717
+ });
718
+ //#endregion
719
+ //#region src/utils/formatTime.ts
720
+ function fe(e) {
721
+ let t = /([zZ]|[+-]\d{2}:?\d{2})$/.test(e);
722
+ return new Date(t ? e : `${e}Z`);
723
+ }
724
+ function pe(e, t) {
725
+ let n = Math.max(0, Math.floor((t - e.getTime()) / 1e3));
726
+ if (n < 60) return `${n}s ago`;
727
+ let r = Math.floor(n / 60);
728
+ if (r < 60) return `${r}m ago`;
729
+ let i = Math.floor(r / 60);
730
+ return i < 24 ? `${i}h ago` : `${Math.floor(i / 24)}d ago`;
731
+ }
732
+ function Y(e) {
733
+ return `${Math.floor(e / 60)}:${(e % 60).toString().padStart(2, "0")}`;
734
+ }
735
+ var X = {
736
+ rosterRefresh: "_rosterRefresh_1rbul_3",
737
+ updatedLabel: "_updatedLabel_1rbul_11",
738
+ refreshButton: "_refreshButton_1rbul_19",
739
+ spin: "_spin_1rbul_31"
740
+ }, me = ({ onRefresh: e, isRefreshing: t, cachedAt: n = null, refreshAvailableAt: r = null, labelPrefix: o = "Updated", className: l = "" }) => {
741
+ let [u, d] = a(() => Date.now()), f = !!n || r != null && r > u;
742
+ i(() => {
743
+ if (!f) return;
744
+ let e = setInterval(() => d(Date.now()), 1e3);
745
+ return () => clearInterval(e);
746
+ }, [f]);
747
+ let p = r ? Math.max(0, Math.ceil((r - u) / 1e3)) : 0, h = n ? pe(fe(n), u) : null, g = t || p > 0, _ = p > 0 ? `Fresh data available in ${Y(p)}` : "Refresh roster";
748
+ return /* @__PURE__ */ c("div", {
749
+ className: `${X.rosterRefresh} ${l}`,
750
+ children: [h && /* @__PURE__ */ s("span", {
751
+ className: X.updatedLabel,
752
+ title: _,
753
+ children: p > 0 ? `${o} ${h} · fresh in ${Y(p)}` : `${o} ${h}`
754
+ }), /* @__PURE__ */ s(m, {
755
+ variant: "outline",
756
+ size: "sm",
757
+ onClick: e,
758
+ disabled: g,
759
+ title: _,
760
+ "aria-label": "Refresh roster",
761
+ className: X.refreshButton,
762
+ children: /* @__PURE__ */ s("span", {
763
+ className: t ? X.spin : void 0,
764
+ children: "⟳"
765
+ })
766
+ })]
767
+ });
768
+ }, Z = {
712
769
  card: "_card_1vw8g_1",
713
770
  chamfered: "_chamfered_1vw8g_15",
714
771
  default: "_default_1vw8g_20",
@@ -719,13 +776,13 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
719
776
  "padding-md": "_padding-md_1vw8g_43",
720
777
  "padding-lg": "_padding-lg_1vw8g_47",
721
778
  hoverable: "_hoverable_1vw8g_52"
722
- }, de = ({ children: e, variant: t = "default", chamfered: n = !1, chamferSize: r = "md", padding: i = "md", hoverable: a = !1, showDiagonalBorders: l = !0, edgeColor: u, className: d = "", onClick: f, style: p }) => {
779
+ }, he = ({ children: e, variant: t = "default", chamfered: n = !1, chamferSize: r = "md", padding: i = "md", hoverable: a = !1, showDiagonalBorders: l = !0, edgeColor: u, className: d = "", onClick: f, style: p }) => {
723
780
  let m = n ? r === "asymmetric" ? "chamfered-box-asymmetric" : r === "sm" ? "chamfered-box-sm" : r === "lg" ? "chamfered-box-lg" : "chamfered-box" : "", h = u ?? (n ? "var(--color-border)" : void 0), g = h ? { color: h } : void 0, _ = h ? {
724
781
  ...p,
725
782
  "--card-edge-color": h
726
783
  } : p;
727
784
  return /* @__PURE__ */ c("div", {
728
- className: `${X.card} ${n ? X.chamfered : ""} ${X[t]} ${X[`padding-${i}`]} ${m} ${a ? X.hoverable : ""} ${d}`,
785
+ className: `${Z.card} ${n ? Z.chamfered : ""} ${Z[t]} ${Z[`padding-${i}`]} ${m} ${a ? Z.hoverable : ""} ${d}`,
729
786
  onClick: f,
730
787
  role: f ? "button" : void 0,
731
788
  tabIndex: f ? 0 : void 0,
@@ -749,7 +806,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
749
806
  })
750
807
  ] }), e]
751
808
  });
752
- }, Z = {
809
+ }, ge = {
753
810
  badge: "_badge_rk7t5_1",
754
811
  sm: "_sm_rk7t5_11",
755
812
  md: "_md_rk7t5_16",
@@ -761,8 +818,8 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
761
818
  warning: "_warning_rk7t5_47",
762
819
  error: "_error_rk7t5_52",
763
820
  info: "_info_rk7t5_57"
764
- }, fe = ({ children: e, variant: t = "default", size: n = "md", className: r = "" }) => /* @__PURE__ */ s("span", {
765
- className: `${Z.badge} ${Z[t]} ${Z[n]} ${r}`,
821
+ }, _e = ({ children: e, variant: t = "default", size: n = "md", className: r = "" }) => /* @__PURE__ */ s("span", {
822
+ className: `${ge.badge} ${ge[t]} ${ge[n]} ${r}`,
766
823
  children: e
767
824
  }), Q = {
768
825
  overlay: "_overlay_1b3yt_1",
@@ -777,7 +834,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
777
834
  title: "_title_1b3yt_53",
778
835
  closeButton: "_closeButton_1b3yt_60",
779
836
  content: "_content_1b3yt_78"
780
- }, pe = ({ isOpen: e, onClose: t, title: n, children: r, size: a = "md", closeOnOverlayClick: o = !0, className: l = "" }) => (i(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "unset", () => {
837
+ }, ve = ({ isOpen: e, onClose: t, title: n, children: r, size: a = "md", closeOnOverlayClick: o = !0, className: l = "" }) => (i(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "unset", () => {
781
838
  document.body.style.overflow = "unset";
782
839
  }), [e]), i(() => {
783
840
  let n = (n) => {
@@ -819,7 +876,7 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
819
876
  dot: "_dot_1uhnh_34",
820
877
  bounce: "_bounce_1uhnh_1",
821
878
  visuallyHidden: "_visuallyHidden_1uhnh_91"
822
- }, me = ({ size: e = "md", variant: t = "spinner", className: n = "" }) => t === "dots" ? /* @__PURE__ */ c("div", {
879
+ }, ye = ({ size: e = "md", variant: t = "spinner", className: n = "" }) => t === "dots" ? /* @__PURE__ */ c("div", {
823
880
  className: `${$.dots} ${$[e]} ${n}`,
824
881
  children: [
825
882
  /* @__PURE__ */ s("span", { className: $.dot }),
@@ -833,10 +890,10 @@ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => l
833
890
  className: $.visuallyHidden,
834
891
  children: "Loading..."
835
892
  })
836
- }), he = async (e) => {
893
+ }), be = async (e) => {
837
894
  if (e.length === 0) return {};
838
895
  let t = [...new Set(e)], n = await R.get(`/api/v1/users/lookup?ids=${t.join(",")}`);
839
896
  return Object.fromEntries(n.users.map((e) => [e.id, e.username]));
840
897
  };
841
898
  //#endregion
842
- export { ce as AllyCodeDropdown, L as ApiClient, oe as AuthProvider, fe as Badge, m as Button, de as Card, u as Container, ue as Footer, v as Input, me as Loader, pe as Modal, le as NavBar, g as Select, f as TopBar, R as apiClient, I as authedFetch, ae as clearAllyCodes, O as clearTokens, M as configureAuthRefresh, he as fetchUsernames, K as formatAllyCode, x as getAccessToken, V as getAllyCodesFromStorage, w as getRefreshToken, re as getSelectedAllyCode, te as initializeApiClient, ee as isAuthenticated, N as refreshAccessToken, C as removeAccessToken, H as removeAllyCodeFromStorage, E as removeRefreshToken, ne as saveAllyCodeToStorage, S as setAccessToken, T as setRefreshToken, ie as setSelectedAllyCode, D as setTokens, se as unformatAllyCode, U as updateAllyCodeLastUsed, G as useAuth };
899
+ export { le as AllyCodeDropdown, L as ApiClient, se as AuthProvider, _e as Badge, m as Button, he as Card, u as Container, de as Footer, v as Input, ye as Loader, ve as Modal, ue as NavBar, me as RosterRefresh, g as Select, f as TopBar, R as apiClient, I as authedFetch, ae as clearAllyCodes, O as clearTokens, M as configureAuthRefresh, be as fetchUsernames, G as formatAllyCode, Y as formatCountdown, pe as formatRelativeTime, x as getAccessToken, V as getAllyCodesFromStorage, w as getRefreshToken, ie as getSelectedAllyCode, te as initializeApiClient, ee as isAuthenticated, fe as parseBackendTimestamp, N as refreshAccessToken, C as removeAccessToken, re as removeAllyCodeFromStorage, E as removeRefreshToken, ne as saveAllyCodeToStorage, S as setAccessToken, T as setRefreshToken, U as setSelectedAllyCode, D as setTokens, ce as unformatAllyCode, H as updateAllyCodeLastUsed, W as useAuth };
@@ -0,0 +1,27 @@
1
+ import { default as React } from 'react';
2
+ export interface RosterRefreshProps {
3
+ /** Fired when the user clicks the refresh button. The app owns the actual
4
+ * re-pull (and any cache-timing state it feeds back in via the props below). */
5
+ onRefresh: () => void;
6
+ /** True while a re-pull is in flight — spins the glyph and disables the button. */
7
+ isRefreshing: boolean;
8
+ /** Backend timestamp of the current snapshot (naive-UTC ISO tolerated). Drives
9
+ * the "Updated X ago" label; omit / null → no label, just the button. */
10
+ cachedAt?: string | null;
11
+ /** Epoch ms when the next refresh is allowed. Drives the "fresh in m:ss"
12
+ * countdown and keeps the button disabled until it elapses. */
13
+ refreshAvailableAt?: number | null;
14
+ /** Lead-in word for the label. Default `"Updated"`. */
15
+ labelPrefix?: string;
16
+ className?: string;
17
+ }
18
+ /**
19
+ * RosterRefresh — the suite-standard NavBar control for re-pulling a player's
20
+ * roster / mod inventory from the game. Compose it into `NavBar`'s `rightExtras`
21
+ * (it is not a `showAllyCode`-style flag because it needs app-specific data).
22
+ *
23
+ * Presentational only: the app performs the fetch in `onRefresh` and feeds the
24
+ * resulting cache timing back through `cachedAt` / `refreshAvailableAt`. This
25
+ * component owns just the 1s display clock for its own label — no network.
26
+ */
27
+ export declare const RosterRefresh: React.FC<RosterRefreshProps>;
@@ -6,3 +6,5 @@ export { Select } from './Select';
6
6
  export type { SelectProps, SelectOption } from './Select';
7
7
  export { AllyCodeDropdown } from './AllyCodeDropdown';
8
8
  export type { AllyCodeDropdownProps } from './AllyCodeDropdown';
9
+ export { RosterRefresh } from './RosterRefresh';
10
+ export type { RosterRefreshProps } from './RosterRefresh';
@@ -1,7 +1,7 @@
1
1
  export { Container, TopBar, NavBar, Footer } from './components/layout';
2
2
  export type { ContainerProps, TopBarProps, NavBarProps, NavItem, FooterProps } from './components/layout';
3
- export { Button, Input, Select, AllyCodeDropdown } from './components/forms';
4
- export type { ButtonProps, InputProps, SelectProps, SelectOption, AllyCodeDropdownProps } from './components/forms';
3
+ export { Button, Input, Select, AllyCodeDropdown, RosterRefresh } from './components/forms';
4
+ export type { ButtonProps, InputProps, SelectProps, SelectOption, AllyCodeDropdownProps, RosterRefreshProps } from './components/forms';
5
5
  export { Card, Badge, Modal } from './components/display';
6
6
  export type { CardProps, BadgeProps, ModalProps } from './components/display';
7
7
  export { Loader } from './components/feedback';
@@ -17,4 +17,5 @@ export { getAllyCodesFromStorage, saveAllyCodeToStorage, removeAllyCodeFromStora
17
17
  export { fetchUsernames } from './services/users';
18
18
  export type { StoredAllyCode } from './services/allyCodeStorage';
19
19
  export { formatAllyCode, unformatAllyCode } from './utils/formatAllyCode';
20
+ export { parseBackendTimestamp, formatRelativeTime, formatCountdown } from './utils/formatTime';
20
21
  export type { User, LoginRequest, LoginResponse, RegisterRequest, RegisterResponse, RefreshTokenRequest, RefreshTokenResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, VerifyEmailRequest, VerifyEmailResponse, ResendVerificationRequest, ResendVerificationResponse, AllyCode, AllyCodeCreate, AllyCodeListResponse, AllyCodeMigrationPrompt, ApiResponse, ApiError, PaginatedResponse, ModStat, ParsedMod, ModListResponse, EvaluationScores, ModEvaluation, EvaluationRequest, EvaluationResponse, } from './types';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Time formatting helpers shared by suite chrome (e.g. the NavBar's
3
+ * RosterRefresh control). All pure functions — no timers, no side effects.
4
+ */
5
+ /**
6
+ * Parse a backend timestamp into a Date.
7
+ *
8
+ * Astrogator's Table backends emit **naive UTC** ISO strings (no timezone
9
+ * suffix, e.g. `2026-09-04T12:34:56`). `new Date()` would read those as *local*
10
+ * time, so append `Z` when no offset is already present.
11
+ */
12
+ export declare function parseBackendTimestamp(iso: string): Date;
13
+ /**
14
+ * Compact "time since" label: `"12s ago"`, `"5m ago"`, `"3h ago"`, `"2d ago"`.
15
+ * `nowMs` is passed in (not read from `Date.now()`) so a caller driving a
16
+ * display clock re-renders deterministically.
17
+ */
18
+ export declare function formatRelativeTime(date: Date, nowMs: number): string;
19
+ /** `m:ss` countdown, e.g. `formatCountdown(125)` → `"2:05"`. */
20
+ export declare function formatCountdown(sec: number): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astrogators-shared-ui",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Shared UI components and utilities for Astrogator's Table applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",