astrogators-shared-ui 0.8.0 → 0.10.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%}.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)}}._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)}}._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}._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)}._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)}._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}}._card_b4471_1{background-color:var(--card-background);border-radius:var(--radius-lg);transition:transform var(--transition-base), box-shadow var(--transition-base)}._card_b4471_1._chamfered_b4471_8{border-radius:0}._default_b4471_13{background-color:var(--card-background)}._elevated_b4471_17{background-color:var(--card-background);box-shadow:var(--shadow-md)}._outline_b4471_22{border:1px solid var(--card-border);background-color:#0000}._padding-none_b4471_28{padding:0}._padding-sm_b4471_32{padding:var(--spacing-sm)}._padding-md_b4471_36{padding:var(--card-padding)}._padding-lg_b4471_40{padding:var(--spacing-xl)}._hoverable_b4471_45{cursor:pointer;will-change:transform;backface-visibility:hidden;transform:translateZ(0)}._hoverable_b4471_45:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)translateZ(0)}._hoverable_b4471_45:active{box-shadow:var(--shadow-md);transform:translateY(-1px)translateZ(0)}._card_b4471_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%}.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_1maq7_1{background-color:var(--card-background);border-radius:var(--radius-lg);transition:transform var(--transition-base), box-shadow var(--transition-base)}._card_1maq7_1._chamfered_1maq7_8{border-radius:0}._default_1maq7_13{background-color:var(--card-background)}._elevated_1maq7_17{background-color:var(--card-background);box-shadow:var(--shadow-md)}._outline_1maq7_22{border:1px solid var(--card-edge-color,var(--card-border));background-color:#0000}._padding-none_1maq7_28{padding:0}._padding-sm_1maq7_32{padding:var(--spacing-sm)}._padding-md_1maq7_36{padding:var(--card-padding)}._padding-lg_1maq7_40{padding:var(--spacing-xl)}._hoverable_1maq7_45{cursor:pointer;will-change:transform;backface-visibility:hidden;transform:translateZ(0)}._hoverable_1maq7_45:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)translateZ(0)}._hoverable_1maq7_45:active{box-shadow:var(--shadow-md);transform:translateY(-1px)translateZ(0)}._card_1maq7_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
@@ -34,31 +34,6 @@ var l = {
34
34
  })]
35
35
  })
36
36
  }), p = {
37
- footer: "_footer_zjuj8_1",
38
- content: "_content_zjuj8_7",
39
- defaultContent: "_defaultContent_zjuj8_13",
40
- copyright: "_copyright_zjuj8_21",
41
- disclaimer: "_disclaimer_zjuj8_26"
42
- }, m = ({ children: e, className: t = "" }) => /* @__PURE__ */ s("footer", {
43
- className: `${p.footer} ${t}`,
44
- children: /* @__PURE__ */ s("div", {
45
- className: p.content,
46
- children: e || /* @__PURE__ */ c("div", {
47
- className: p.defaultContent,
48
- children: [/* @__PURE__ */ c("p", {
49
- className: p.copyright,
50
- children: [
51
- "© ",
52
- (/* @__PURE__ */ new Date()).getFullYear(),
53
- " The Astrogator's Table. All rights reserved."
54
- ]
55
- }), /* @__PURE__ */ s("p", {
56
- className: p.disclaimer,
57
- children: "Star Wars: Galaxy of Heroes is a trademark of Electronic Arts Inc."
58
- })]
59
- })
60
- })
61
- }), h = {
62
37
  button: "_button_159ms_1",
63
38
  sm: "_sm_159ms_22",
64
39
  md: "_md_159ms_28",
@@ -74,58 +49,18 @@ var l = {
74
49
  spinner: "_spinner_159ms_116",
75
50
  spin: "_spin_159ms_116",
76
51
  loadingText: "_loadingText_159ms_131"
77
- }, g = ({ children: e, variant: t = "primary", size: n = "md", fullWidth: r = !1, loading: i = !1, disabled: a = !1, className: o = "", ...l }) => /* @__PURE__ */ s("button", {
78
- className: `${h.button} ${h[t]} ${h[n]} ${r ? h.fullWidth : ""} ${i ? h.loading : ""} ${o}`,
52
+ }, m = ({ children: e, variant: t = "primary", size: n = "md", fullWidth: r = !1, loading: i = !1, disabled: a = !1, className: o = "", ...l }) => /* @__PURE__ */ s("button", {
53
+ className: `${p.button} ${p[t]} ${p[n]} ${r ? p.fullWidth : ""} ${i ? p.loading : ""} ${o}`,
79
54
  disabled: a || i,
80
55
  ...l,
81
56
  children: i ? /* @__PURE__ */ c("span", {
82
- className: h.loadingSpinner,
83
- children: [/* @__PURE__ */ s("span", { className: h.spinner }), /* @__PURE__ */ s("span", {
84
- className: h.loadingText,
57
+ className: p.loadingSpinner,
58
+ children: [/* @__PURE__ */ s("span", { className: p.spinner }), /* @__PURE__ */ s("span", {
59
+ className: p.loadingText,
85
60
  children: e
86
61
  })]
87
62
  }) : e
88
- }), _ = {
89
- inputWrapper: "_inputWrapper_15t4g_1",
90
- fullWidth: "_fullWidth_15t4g_7",
91
- label: "_label_15t4g_11",
92
- required: "_required_15t4g_20",
93
- input: "_input_15t4g_1",
94
- error: "_error_15t4g_55",
95
- errorText: "_errorText_15t4g_63",
96
- helperText: "_helperText_15t4g_68"
97
- }, v = e.forwardRef(({ label: e, error: t, helperText: n, fullWidth: r = !1, className: i = "", id: a, ...o }, l) => {
98
- let u = a || `input-${Math.random().toString(36).substr(2, 9)}`, d = !!t;
99
- return /* @__PURE__ */ c("div", {
100
- className: `${_.inputWrapper} ${r ? _.fullWidth : ""} ${i}`,
101
- children: [
102
- e && /* @__PURE__ */ c("label", {
103
- htmlFor: u,
104
- className: _.label,
105
- children: [e, o.required && /* @__PURE__ */ s("span", {
106
- className: _.required,
107
- children: "*"
108
- })]
109
- }),
110
- /* @__PURE__ */ s("input", {
111
- ref: l,
112
- id: u,
113
- className: `${_.input} ${d ? _.error : ""}`,
114
- ...o
115
- }),
116
- t && /* @__PURE__ */ s("span", {
117
- className: _.errorText,
118
- children: t
119
- }),
120
- n && !t && /* @__PURE__ */ s("span", {
121
- className: _.helperText,
122
- children: n
123
- })
124
- ]
125
- });
126
- });
127
- v.displayName = "Input";
128
- var y = {
63
+ }), h = {
129
64
  selectWrapper: "_selectWrapper_ir4bq_1",
130
65
  fullWidth: "_fullWidth_ir4bq_7",
131
66
  label: "_label_ir4bq_11",
@@ -136,25 +71,25 @@ var y = {
136
71
  arrow: "_arrow_ir4bq_71",
137
72
  errorText: "_errorText_ir4bq_81",
138
73
  helperText: "_helperText_ir4bq_86"
139
- }, b = e.forwardRef(({ label: e, error: t, helperText: n, options: r, placeholder: i, fullWidth: a = !1, className: o = "", id: l, ...u }, d) => {
74
+ }, g = e.forwardRef(({ label: e, error: t, helperText: n, options: r, placeholder: i, fullWidth: a = !1, className: o = "", id: l, ...u }, d) => {
140
75
  let f = l || `select-${Math.random().toString(36).substr(2, 9)}`, p = !!t;
141
76
  return /* @__PURE__ */ c("div", {
142
- className: `${y.selectWrapper} ${a ? y.fullWidth : ""} ${o}`,
77
+ className: `${h.selectWrapper} ${a ? h.fullWidth : ""} ${o}`,
143
78
  children: [
144
79
  e && /* @__PURE__ */ c("label", {
145
80
  htmlFor: f,
146
- className: y.label,
81
+ className: h.label,
147
82
  children: [e, u.required && /* @__PURE__ */ s("span", {
148
- className: y.required,
83
+ className: h.required,
149
84
  children: "*"
150
85
  })]
151
86
  }),
152
87
  /* @__PURE__ */ c("div", {
153
- className: y.selectContainer,
88
+ className: h.selectContainer,
154
89
  children: [/* @__PURE__ */ c("select", {
155
90
  ref: d,
156
91
  id: f,
157
- className: `${y.select} ${p ? y.error : ""}`,
92
+ className: `${h.select} ${p ? h.error : ""}`,
158
93
  ...u,
159
94
  children: [
160
95
  i && /* @__PURE__ */ s("option", {
@@ -170,53 +105,93 @@ var y = {
170
105
  !r && u.children
171
106
  ]
172
107
  }), /* @__PURE__ */ s("span", {
173
- className: y.arrow,
108
+ className: h.arrow,
174
109
  children: "▼"
175
110
  })]
176
111
  }),
177
112
  t && /* @__PURE__ */ s("span", {
178
- className: y.errorText,
113
+ className: h.errorText,
114
+ children: t
115
+ }),
116
+ n && !t && /* @__PURE__ */ s("span", {
117
+ className: h.helperText,
118
+ children: n
119
+ })
120
+ ]
121
+ });
122
+ });
123
+ g.displayName = "Select";
124
+ var _ = {
125
+ inputWrapper: "_inputWrapper_15t4g_1",
126
+ fullWidth: "_fullWidth_15t4g_7",
127
+ label: "_label_15t4g_11",
128
+ required: "_required_15t4g_20",
129
+ input: "_input_15t4g_1",
130
+ error: "_error_15t4g_55",
131
+ errorText: "_errorText_15t4g_63",
132
+ helperText: "_helperText_15t4g_68"
133
+ }, v = e.forwardRef(({ label: e, error: t, helperText: n, fullWidth: r = !1, className: i = "", id: a, ...o }, l) => {
134
+ let u = a || `input-${Math.random().toString(36).substr(2, 9)}`, d = !!t;
135
+ return /* @__PURE__ */ c("div", {
136
+ className: `${_.inputWrapper} ${r ? _.fullWidth : ""} ${i}`,
137
+ children: [
138
+ e && /* @__PURE__ */ c("label", {
139
+ htmlFor: u,
140
+ className: _.label,
141
+ children: [e, o.required && /* @__PURE__ */ s("span", {
142
+ className: _.required,
143
+ children: "*"
144
+ })]
145
+ }),
146
+ /* @__PURE__ */ s("input", {
147
+ ref: l,
148
+ id: u,
149
+ className: `${_.input} ${d ? _.error : ""}`,
150
+ ...o
151
+ }),
152
+ t && /* @__PURE__ */ s("span", {
153
+ className: _.errorText,
179
154
  children: t
180
155
  }),
181
156
  n && !t && /* @__PURE__ */ s("span", {
182
- className: y.helperText,
157
+ className: _.helperText,
183
158
  children: n
184
159
  })
185
160
  ]
186
161
  });
187
162
  });
188
- b.displayName = "Select";
163
+ v.displayName = "Input";
189
164
  //#endregion
190
165
  //#region src/services/auth.ts
191
- var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => localStorage.getItem(x), w = (e) => {
192
- localStorage.setItem(x, e);
193
- }, T = () => {
194
- localStorage.removeItem(x);
195
- }, E = () => localStorage.getItem(S), D = (e) => {
196
- localStorage.setItem(S, e);
166
+ var y = "astrogators_access_token", b = "astrogators_refresh_token", x = () => localStorage.getItem(y), S = (e) => {
167
+ localStorage.setItem(y, e);
168
+ }, C = () => {
169
+ localStorage.removeItem(y);
170
+ }, w = () => localStorage.getItem(b), T = (e) => {
171
+ localStorage.setItem(b, e);
172
+ }, E = () => {
173
+ localStorage.removeItem(b);
174
+ }, D = (e, t) => {
175
+ S(e), T(t);
197
176
  }, O = () => {
198
- localStorage.removeItem(S);
199
- }, k = (e, t) => {
200
- w(e), D(t);
201
- }, A = () => {
202
- T(), O();
203
- }, ee = () => !!C(), j = "", M, N = null, P = (e) => {
204
- j = e.baseURL, M = e.onUnauthorized;
205
- }, F = () => N || (N = (async () => {
206
- let e = E();
177
+ C(), E();
178
+ }, ee = () => !!x(), k = "", A, j = null, M = (e) => {
179
+ k = e.baseURL, A = e.onUnauthorized;
180
+ }, N = () => j || (j = (async () => {
181
+ let e = w();
207
182
  if (!e) throw Error("No refresh token available");
208
- let t = await fetch(`${j}/api/v1/auth/refresh`, {
183
+ let t = await fetch(`${k}/api/v1/auth/refresh`, {
209
184
  method: "POST",
210
185
  headers: { "Content-Type": "application/json" },
211
186
  body: JSON.stringify({ refresh_token: e })
212
187
  });
213
- if (!t.ok) throw A(), M?.(), Error("Token refresh failed");
188
+ if (!t.ok) throw O(), A?.(), Error("Token refresh failed");
214
189
  let n = await t.json();
215
- return k(n.access_token, n.refresh_token), n.access_token;
190
+ return D(n.access_token, n.refresh_token), n.access_token;
216
191
  })().finally(() => {
217
- N = null;
218
- }), N), I = async (e, t = {}) => {
219
- let n = C(), r = { ...t.headers };
192
+ j = null;
193
+ }), j), P = async (e, t = {}) => {
194
+ let n = x(), r = { ...t.headers };
220
195
  n && (r.Authorization = `Bearer ${n}`);
221
196
  let i = await fetch(e, {
222
197
  ...t,
@@ -224,17 +199,17 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
224
199
  });
225
200
  if (i.status !== 401 || !n) return i;
226
201
  try {
227
- return r.Authorization = `Bearer ${await F()}`, await fetch(e, {
202
+ return r.Authorization = `Bearer ${await N()}`, await fetch(e, {
228
203
  ...t,
229
204
  headers: r
230
205
  });
231
206
  } catch {
232
207
  return i;
233
208
  }
234
- }, L = class {
209
+ }, F = class {
235
210
  baseURL;
236
211
  constructor(e) {
237
- this.baseURL = e.baseURL, P({
212
+ this.baseURL = e.baseURL, M({
238
213
  baseURL: e.baseURL,
239
214
  onUnauthorized: e.onUnauthorized
240
215
  });
@@ -243,7 +218,7 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
243
218
  let n = {
244
219
  "Content-Type": "application/json",
245
220
  ...t.headers
246
- }, r = await I(`${this.baseURL}${e}`, {
221
+ }, r = await P(`${this.baseURL}${e}`, {
247
222
  ...t,
248
223
  headers: n
249
224
  });
@@ -293,55 +268,55 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
293
268
  method: "DELETE"
294
269
  });
295
270
  }
296
- }, R, z = (e) => {
297
- R = new L(e);
298
- }, B = "astrogators_ally_codes", V = "astrogators_selected_ally_code", H = () => {
271
+ }, I, te = (e) => {
272
+ I = new F(e);
273
+ }, L = "astrogators_ally_codes", R = "astrogators_selected_ally_code", z = () => {
299
274
  try {
300
- let e = localStorage.getItem(B);
275
+ let e = localStorage.getItem(L);
301
276
  return e ? JSON.parse(e) : [];
302
277
  } catch (e) {
303
278
  return console.error("Failed to read ally codes from localStorage:", e), [];
304
279
  }
305
- }, te = (e) => {
280
+ }, ne = (e) => {
306
281
  try {
307
- let t = H();
282
+ let t = z();
308
283
  if (t.some((t) => t.ally_code === e.ally_code)) return;
309
- t.push(e), localStorage.setItem(B, JSON.stringify(t));
284
+ t.push(e), localStorage.setItem(L, JSON.stringify(t));
310
285
  } catch (e) {
311
286
  console.error("Failed to save ally code to localStorage:", e);
312
287
  }
313
- }, U = (e) => {
288
+ }, re = (e) => {
314
289
  try {
315
- let t = H().filter((t) => t.ally_code !== e);
316
- localStorage.setItem(B, JSON.stringify(t));
290
+ let t = z().filter((t) => t.ally_code !== e);
291
+ localStorage.setItem(L, JSON.stringify(t));
317
292
  } catch (e) {
318
293
  console.error("Failed to remove ally code from localStorage:", e);
319
294
  }
320
- }, W = (e) => {
295
+ }, B = (e) => {
321
296
  try {
322
- let t = H().map((t) => t.ally_code === e ? {
297
+ let t = z().map((t) => t.ally_code === e ? {
323
298
  ...t,
324
299
  last_used_at: (/* @__PURE__ */ new Date()).toISOString()
325
300
  } : t);
326
- localStorage.setItem(B, JSON.stringify(t));
301
+ localStorage.setItem(L, JSON.stringify(t));
327
302
  } catch (e) {
328
303
  console.error("Failed to update ally code last used:", e);
329
304
  }
330
- }, ne = () => localStorage.getItem(V), G = (e) => {
331
- e ? localStorage.setItem(V, e) : localStorage.removeItem(V);
332
- }, re = () => {
333
- localStorage.removeItem(B), localStorage.removeItem(V);
334
- }, K = t(void 0), ie = ({ children: e, apiBaseUrl: t }) => {
305
+ }, ie = () => localStorage.getItem(R), V = (e) => {
306
+ e ? localStorage.setItem(R, e) : localStorage.removeItem(R);
307
+ }, H = () => {
308
+ localStorage.removeItem(L), localStorage.removeItem(R);
309
+ }, U = t(void 0), W = ({ children: e, apiBaseUrl: t }) => {
335
310
  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({
336
311
  show: !1,
337
312
  localStorageCodes: []
338
313
  });
339
314
  i(() => {
340
- z({ baseURL: t });
315
+ te({ baseURL: t });
341
316
  }, [t]), i(() => {
342
317
  (async () => {
343
318
  try {
344
- d((await R.get("/api/v1/config/features")).auth_enabled);
319
+ d((await I.get("/api/v1/config/features")).auth_enabled);
345
320
  } catch (e) {
346
321
  console.error("Failed to fetch features:", e), d(!0);
347
322
  } finally {
@@ -355,9 +330,9 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
355
330
  return;
356
331
  }
357
332
  try {
358
- o(await R.get("/api/v1/users/me"));
333
+ o(await I.get("/api/v1/users/me"));
359
334
  } catch (e) {
360
- console.error("Failed to fetch user:", e), o(null), A();
335
+ console.error("Failed to fetch user:", e), o(null), O();
361
336
  } finally {
362
337
  l(!1);
363
338
  }
@@ -367,39 +342,39 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
367
342
  }, [S]);
368
343
  let C = async (e) => {
369
344
  try {
370
- let t = await R.post("/api/v1/auth/login", e);
371
- k(t.access_token, t.refresh_token), o(await R.get("/api/v1/users/me"));
345
+ let t = await I.post("/api/v1/auth/login", e);
346
+ D(t.access_token, t.refresh_token), o(await I.get("/api/v1/users/me"));
372
347
  } catch (e) {
373
348
  throw console.error("Login failed:", e), e;
374
349
  }
375
350
  }, w = async (e) => {
376
351
  try {
377
- await R.post("/api/v1/auth/register", e);
352
+ await I.post("/api/v1/auth/register", e);
378
353
  } catch (e) {
379
354
  throw console.error("Registration failed:", e), e;
380
355
  }
381
356
  }, T = () => {
382
- A(), o(null), h([]), _(null), x({
357
+ O(), o(null), h([]), _(null), x({
383
358
  show: !1,
384
359
  localStorageCodes: []
385
360
  });
386
361
  }, E = async () => {
387
362
  await S();
388
- }, D = async (e) => {
363
+ }, k = async (e) => {
389
364
  try {
390
- return (await R.post("/api/v1/auth/forgot-password", e)).message;
365
+ return (await I.post("/api/v1/auth/forgot-password", e)).message;
391
366
  } catch (e) {
392
367
  throw console.error("Forgot password failed:", e), e;
393
368
  }
394
- }, O = async (e) => {
369
+ }, A = async (e) => {
395
370
  try {
396
- return (await R.post("/api/v1/auth/reset-password", e)).message;
371
+ return (await I.post("/api/v1/auth/reset-password", e)).message;
397
372
  } catch (e) {
398
373
  throw console.error("Reset password failed:", e), e;
399
374
  }
400
375
  }, j = async (e) => {
401
376
  try {
402
- return (await R.post("/api/v1/auth/resend-verification", e)).message;
377
+ return (await I.post("/api/v1/auth/resend-verification", e)).message;
403
378
  } catch (e) {
404
379
  throw console.error("Resend verification failed:", e), e;
405
380
  }
@@ -407,26 +382,26 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
407
382
  y(!0);
408
383
  try {
409
384
  if (r) {
410
- h((await R.get("/api/v1/users/me/ally-codes")).ally_codes);
411
- let e = H();
385
+ h((await I.get("/api/v1/users/me/ally-codes")).ally_codes);
386
+ let e = z();
412
387
  e.length > 0 && x({
413
388
  show: !0,
414
389
  localStorageCodes: e.map((e) => e.ally_code)
415
390
  });
416
- } else h(H());
417
- _(ne());
391
+ } else h(z());
392
+ _(ie());
418
393
  } catch (e) {
419
394
  console.error("Failed to fetch ally codes:", e), h([]);
420
395
  } finally {
421
396
  y(!1);
422
397
  }
423
398
  }, [r]), N = n(async (e) => {
424
- r && typeof e == "number" ? (await R.put(`/api/v1/users/me/ally-codes/${e}/use`, {}), await M()) : !r && typeof e == "string" && (W(e), h(H()));
399
+ r && typeof e == "number" ? (await I.put(`/api/v1/users/me/ally-codes/${e}/use`, {}), await M()) : !r && typeof e == "string" && (B(e), h(z()));
425
400
  }, [r, M]), P = n((e) => {
426
- if (_(e), G(e), e && r) {
401
+ if (_(e), V(e), e && r) {
427
402
  let t = m.find((t) => "ally_code" in t && t.ally_code === e);
428
403
  t && "id" in t && N(t.id);
429
- } else e && !r && W(e);
404
+ } else e && !r && B(e);
430
405
  }, [
431
406
  r,
432
407
  m,
@@ -434,50 +409,50 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
434
409
  ]), F = n(async (e) => {
435
410
  if (!/^\d{9}$/.test(e)) throw Error("Ally code must be exactly 9 digits");
436
411
  if (r) {
437
- let t = await R.post("/api/v1/users/me/ally-codes", { ally_code: e });
412
+ let t = await I.post("/api/v1/users/me/ally-codes", { ally_code: e });
438
413
  h((e) => [t, ...e]), m.length === 0 && P(e);
439
414
  } else {
440
- let t = await R.get(`/api/v1/player-data/player/${e}`);
415
+ let t = await I.get(`/api/v1/player-data/player/${e}`);
441
416
  if (!t) throw Error("Invalid ally code - player not found");
442
- te({
417
+ ne({
443
418
  ally_code: e,
444
419
  player_name: t.data?.name ?? null,
445
420
  last_used_at: (/* @__PURE__ */ new Date()).toISOString()
446
- }), h(H()), m.length === 0 && P(e);
421
+ }), h(z()), m.length === 0 && P(e);
447
422
  }
448
423
  }, [
449
424
  r,
450
425
  m.length,
451
426
  P
452
- ]), I = n(async (e) => {
453
- 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" && (U(e), h(H()), g === e && P(null));
427
+ ]), L = n(async (e) => {
428
+ r && typeof e == "number" ? (await I.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(z()), g === e && P(null));
454
429
  }, [
455
430
  r,
456
431
  g,
457
432
  P
458
- ]), L = n(() => {
433
+ ]), R = n(() => {
459
434
  x({
460
435
  show: !1,
461
436
  localStorageCodes: []
462
437
  });
463
- }, []), B = n(async () => {
438
+ }, []), W = n(async () => {
464
439
  if (!r) return;
465
- let e = H();
440
+ let e = z();
466
441
  for (let t of e) try {
467
442
  await F(t.ally_code);
468
443
  } catch (e) {
469
444
  console.error(`Failed to migrate ally code ${t.ally_code}:`, e);
470
445
  }
471
- re(), L();
446
+ H(), R();
472
447
  }, [
473
448
  r,
474
449
  F,
475
- L
450
+ R
476
451
  ]);
477
452
  i(() => {
478
453
  M();
479
454
  }, [M]);
480
- let V = {
455
+ let G = {
481
456
  user: r,
482
457
  isAuthenticated: !!r,
483
458
  isLoading: c,
@@ -485,8 +460,8 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
485
460
  register: w,
486
461
  logout: T,
487
462
  refreshUser: E,
488
- forgotPassword: D,
489
- resetPassword: O,
463
+ forgotPassword: k,
464
+ resetPassword: A,
490
465
  resendVerification: j,
491
466
  authEnabled: u,
492
467
  isLoadingFeatures: f,
@@ -495,22 +470,22 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
495
470
  isLoadingAllyCodes: v,
496
471
  fetchAllyCodes: M,
497
472
  addAllyCode: F,
498
- removeAllyCode: I,
473
+ removeAllyCode: L,
499
474
  selectAllyCode: P,
500
475
  updateAllyCodeLastUsed: N,
501
476
  migrationPrompt: b,
502
- dismissMigrationPrompt: L,
503
- migrateLocalStorageCodes: B
477
+ dismissMigrationPrompt: R,
478
+ migrateLocalStorageCodes: W
504
479
  };
505
- return /* @__PURE__ */ s(K.Provider, {
506
- value: V,
480
+ return /* @__PURE__ */ s(U.Provider, {
481
+ value: G,
507
482
  children: e
508
483
  });
509
- }, q = () => {
510
- let e = r(K);
484
+ }, G = () => {
485
+ let e = r(U);
511
486
  if (e === void 0) throw Error("useAuth must be used within an AuthProvider");
512
487
  return e;
513
- }, J = (e) => !e || e.length !== 9 ? e : `${e.slice(0, 3)}-${e.slice(3, 6)}-${e.slice(6, 9)}`, ae = (e) => e.replace(/-/g, ""), Y = {
488
+ }, K = (e) => !e || e.length !== 9 ? e : `${e.slice(0, 3)}-${e.slice(3, 6)}-${e.slice(6, 9)}`, ae = (e) => e.replace(/-/g, ""), q = {
514
489
  allyCodeDropdown: "_allyCodeDropdown_1m0tw_1",
515
490
  select: "_select_1m0tw_8",
516
491
  manageButton: "_manageButton_1m0tw_12",
@@ -523,9 +498,9 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
523
498
  codeItem: "_codeItem_1m0tw_71",
524
499
  doneButton: "_doneButton_1m0tw_88"
525
500
  }, oe = ({ onAllyCodeSelected: e, className: t = "" }) => {
526
- let { allyCodes: n, selectedAllyCode: r, selectAllyCode: i, removeAllyCode: o, addAllyCode: l, isLoadingAllyCodes: u } = q(), [d, f] = a(!1), [p, m] = a(""), [h, _] = a(""), [y, x] = a(""), [S, C] = a(!1), w = n.map((e) => ({
501
+ 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) => ({
527
502
  value: e.ally_code,
528
- label: e.player_name ? `${e.player_name} (${J(e.ally_code)})` : J(e.ally_code)
503
+ label: e.player_name ? `${e.player_name} (${K(e.ally_code)})` : K(e.ally_code)
529
504
  })), T = (t) => {
530
505
  let n = t.target.value || null;
531
506
  i(n), e?.(n);
@@ -534,44 +509,44 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
534
509
  t && await o("id" in t ? t.id : t.ally_code);
535
510
  };
536
511
  return n.length === 0 ? null : /* @__PURE__ */ c("div", {
537
- className: `${Y.allyCodeDropdown} ${t}`,
512
+ className: `${q.allyCodeDropdown} ${t}`,
538
513
  children: [
539
- /* @__PURE__ */ s(b, {
514
+ /* @__PURE__ */ s(g, {
540
515
  options: w,
541
516
  value: r || "",
542
517
  onChange: T,
543
518
  placeholder: "Select ally code",
544
519
  disabled: u,
545
- className: Y.select
520
+ className: q.select
546
521
  }),
547
522
  d && /* @__PURE__ */ c("div", {
548
- className: Y.managePanel,
523
+ className: q.managePanel,
549
524
  children: [
550
525
  /* @__PURE__ */ s("h4", { children: "Manage Ally Codes" }),
551
526
  /* @__PURE__ */ c("div", {
552
- className: Y.addSection,
527
+ className: q.addSection,
553
528
  children: [
554
529
  /* @__PURE__ */ c("div", {
555
- className: Y.addInputGroup,
530
+ className: q.addInputGroup,
556
531
  children: [/* @__PURE__ */ s(v, {
557
532
  type: "text",
558
533
  placeholder: "9-digit ally code",
559
534
  value: p,
560
- onChange: (e) => m(e.target.value.replace(/\D/g, "").slice(0, 9)),
535
+ onChange: (e) => h(e.target.value.replace(/\D/g, "").slice(0, 9)),
561
536
  disabled: S
562
- }), /* @__PURE__ */ s(g, {
537
+ }), /* @__PURE__ */ s(m, {
563
538
  variant: "primary",
564
539
  size: "sm",
565
540
  onClick: async () => {
566
- if (_(""), x(""), !/^\d{9}$/.test(p)) {
567
- _("Ally code must be exactly 9 digits");
541
+ if (y(""), x(""), !/^\d{9}$/.test(p)) {
542
+ y("Ally code must be exactly 9 digits");
568
543
  return;
569
544
  }
570
545
  C(!0);
571
546
  try {
572
- await l(p), x("Added successfully!"), m(""), setTimeout(() => x(""), 2e3);
547
+ await l(p), x("Added successfully!"), h(""), setTimeout(() => x(""), 2e3);
573
548
  } catch (e) {
574
- _(e.message || "Failed to add ally code");
549
+ y(e.message || "Failed to add ally code");
575
550
  } finally {
576
551
  C(!1);
577
552
  }
@@ -581,21 +556,21 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
581
556
  children: "Add"
582
557
  })]
583
558
  }),
584
- h && /* @__PURE__ */ s("div", {
585
- className: Y.error,
586
- children: h
559
+ _ && /* @__PURE__ */ s("div", {
560
+ className: q.error,
561
+ children: _
587
562
  }),
588
- y && /* @__PURE__ */ s("div", {
589
- className: Y.success,
590
- children: y
563
+ b && /* @__PURE__ */ s("div", {
564
+ className: q.success,
565
+ children: b
591
566
  })
592
567
  ]
593
568
  }),
594
569
  /* @__PURE__ */ s("div", {
595
- className: Y.codesList,
570
+ className: q.codesList,
596
571
  children: n.map((e) => /* @__PURE__ */ c("div", {
597
- className: Y.codeItem,
598
- children: [/* @__PURE__ */ s("span", { children: e.player_name ? `${e.player_name} (${J(e.ally_code)})` : J(e.ally_code) }), /* @__PURE__ */ s(g, {
572
+ className: q.codeItem,
573
+ children: [/* @__PURE__ */ s("span", { children: e.player_name ? `${e.player_name} (${K(e.ally_code)})` : K(e.ally_code) }), /* @__PURE__ */ s(m, {
599
574
  variant: "ghost",
600
575
  size: "sm",
601
576
  onClick: () => E(e.ally_code),
@@ -603,59 +578,163 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
603
578
  })]
604
579
  }, e.ally_code))
605
580
  }),
606
- /* @__PURE__ */ s(g, {
581
+ /* @__PURE__ */ s(m, {
607
582
  variant: "secondary",
608
583
  size: "sm",
609
584
  onClick: () => f(!1),
610
- className: Y.doneButton,
585
+ className: q.doneButton,
611
586
  children: "Done"
612
587
  })
613
588
  ]
614
589
  }),
615
- /* @__PURE__ */ s(g, {
590
+ /* @__PURE__ */ s(m, {
616
591
  variant: "ghost",
617
592
  size: "sm",
618
593
  onClick: () => f(!d),
619
- className: Y.manageButton,
594
+ className: q.manageButton,
620
595
  children: "Manage"
621
596
  })
622
597
  ]
623
598
  });
624
- }, X = {
625
- card: "_card_b4471_1",
626
- chamfered: "_chamfered_b4471_8",
627
- default: "_default_b4471_13",
628
- elevated: "_elevated_b4471_17",
629
- outline: "_outline_b4471_22",
630
- "padding-none": "_padding-none_b4471_28",
631
- "padding-sm": "_padding-sm_b4471_32",
632
- "padding-md": "_padding-md_b4471_36",
633
- "padding-lg": "_padding-lg_b4471_40",
634
- hoverable: "_hoverable_b4471_45"
635
- }, se = ({ children: e, variant: t = "default", chamfered: n = !1, chamferSize: r = "md", padding: i = "md", hoverable: a = !1, showDiagonalBorders: l = !1, diagonalBorderColor: u, className: d = "", onClick: f, style: p }) => {
636
- let m = n ? r === "asymmetric" ? "chamfered-box-asymmetric" : r === "sm" ? "chamfered-box-sm" : r === "lg" ? "chamfered-box-lg" : "chamfered-box" : "", h = u ? { color: u } : void 0;
599
+ }, J = {
600
+ logoLink: "_logoLink_84pn2_3",
601
+ appNav: "_appNav_84pn2_9",
602
+ appName: "_appName_84pn2_15",
603
+ tabs: "_tabs_84pn2_29",
604
+ tab: "_tab_84pn2_29",
605
+ tabActive: "_tabActive_84pn2_56",
606
+ extrasGroup: "_extrasGroup_84pn2_64",
607
+ authCluster: "_authCluster_84pn2_70",
608
+ userLink: "_userLink_84pn2_76"
609
+ }, se = ({ hubUrl: t = "/", appName: n, appHref: r = "/", navItems: i, showAllyCode: a = !1, showAuth: l = !0, rightExtras: u, className: d }) => {
610
+ let { user: p, isAuthenticated: h, logout: g, authEnabled: _ } = G(), v = () => {
611
+ g(), window.location.href = t;
612
+ }, y = !!u || a, b = !!(i && i.length > 0), x = !!n || b, S = l ? h ? /* @__PURE__ */ c("div", {
613
+ className: J.authCluster,
614
+ children: [/* @__PURE__ */ s("a", {
615
+ href: "/profile",
616
+ className: J.userLink,
617
+ children: p?.username
618
+ }), /* @__PURE__ */ s(m, {
619
+ variant: "ghost",
620
+ size: "sm",
621
+ onClick: v,
622
+ children: "Logout"
623
+ })]
624
+ }) : _ ? /* @__PURE__ */ c("div", {
625
+ className: J.authCluster,
626
+ children: [/* @__PURE__ */ s("a", {
627
+ href: "/login",
628
+ children: /* @__PURE__ */ s(m, {
629
+ variant: "ghost",
630
+ size: "sm",
631
+ children: "Login"
632
+ })
633
+ }), /* @__PURE__ */ s("a", {
634
+ href: "/register",
635
+ children: /* @__PURE__ */ s(m, {
636
+ variant: "primary",
637
+ size: "sm",
638
+ children: "Sign Up"
639
+ })
640
+ })]
641
+ }) : null : null;
642
+ return /* @__PURE__ */ s(f, {
643
+ className: d,
644
+ logo: /* @__PURE__ */ s("a", {
645
+ href: t,
646
+ className: J.logoLink,
647
+ children: "The Astrogator's Table"
648
+ }),
649
+ leftContent: x ? /* @__PURE__ */ c("div", {
650
+ className: J.appNav,
651
+ children: [n && /* @__PURE__ */ s("a", {
652
+ href: r,
653
+ className: J.appName,
654
+ children: n
655
+ }), b && /* @__PURE__ */ s("nav", {
656
+ className: J.tabs,
657
+ children: i.map((t) => {
658
+ let n = `${J.tab} ${t.active ? J.tabActive : ""}`;
659
+ return t.render ? /* @__PURE__ */ s(e.Fragment, { children: t.render({
660
+ className: n,
661
+ children: t.label
662
+ }) }, t.href) : /* @__PURE__ */ s("a", {
663
+ href: t.href,
664
+ className: n,
665
+ children: t.label
666
+ }, t.href);
667
+ })
668
+ })]
669
+ }) : void 0,
670
+ rightContent: /* @__PURE__ */ c(o, { children: [y && /* @__PURE__ */ c("div", {
671
+ className: J.extrasGroup,
672
+ children: [u, a && /* @__PURE__ */ s(oe, {})]
673
+ }), S] })
674
+ });
675
+ }, Y = {
676
+ footer: "_footer_zjuj8_1",
677
+ content: "_content_zjuj8_7",
678
+ defaultContent: "_defaultContent_zjuj8_13",
679
+ copyright: "_copyright_zjuj8_21",
680
+ disclaimer: "_disclaimer_zjuj8_26"
681
+ }, ce = ({ children: e, className: t = "" }) => /* @__PURE__ */ s("footer", {
682
+ className: `${Y.footer} ${t}`,
683
+ children: /* @__PURE__ */ s("div", {
684
+ className: Y.content,
685
+ children: e || /* @__PURE__ */ c("div", {
686
+ className: Y.defaultContent,
687
+ children: [/* @__PURE__ */ c("p", {
688
+ className: Y.copyright,
689
+ children: [
690
+ "© ",
691
+ (/* @__PURE__ */ new Date()).getFullYear(),
692
+ " The Astrogator's Table. All rights reserved."
693
+ ]
694
+ }), /* @__PURE__ */ s("p", {
695
+ className: Y.disclaimer,
696
+ children: "Star Wars: Galaxy of Heroes is a trademark of Electronic Arts Inc."
697
+ })]
698
+ })
699
+ })
700
+ }), X = {
701
+ card: "_card_1maq7_1",
702
+ chamfered: "_chamfered_1maq7_8",
703
+ default: "_default_1maq7_13",
704
+ elevated: "_elevated_1maq7_17",
705
+ outline: "_outline_1maq7_22",
706
+ "padding-none": "_padding-none_1maq7_28",
707
+ "padding-sm": "_padding-sm_1maq7_32",
708
+ "padding-md": "_padding-md_1maq7_36",
709
+ "padding-lg": "_padding-lg_1maq7_40",
710
+ hoverable: "_hoverable_1maq7_45"
711
+ }, le = ({ children: e, variant: t = "default", chamfered: n = !1, chamferSize: r = "md", padding: i = "md", hoverable: a = !1, showDiagonalBorders: l = !1, diagonalBorderColor: u, className: d = "", onClick: f, style: p }) => {
712
+ let m = n ? r === "asymmetric" ? "chamfered-box-asymmetric" : r === "sm" ? "chamfered-box-sm" : r === "lg" ? "chamfered-box-lg" : "chamfered-box" : "", h = l ? u : void 0, g = h ? { color: h } : void 0, _ = h ? {
713
+ ...p,
714
+ "--card-edge-color": h
715
+ } : p;
637
716
  return /* @__PURE__ */ c("div", {
638
717
  className: `${X.card} ${n ? X.chamfered : ""} ${X[t]} ${X[`padding-${i}`]} ${m} ${a ? X.hoverable : ""} ${d}`,
639
718
  onClick: f,
640
719
  role: f ? "button" : void 0,
641
720
  tabIndex: f ? 0 : void 0,
642
- style: p,
721
+ style: _,
643
722
  children: [l && /* @__PURE__ */ c(o, { children: [
644
723
  /* @__PURE__ */ s("div", {
645
724
  className: "chamfered-diagonal-border chamfered-diagonal-tl",
646
- style: h
725
+ style: g
647
726
  }),
648
727
  /* @__PURE__ */ s("div", {
649
728
  className: "chamfered-diagonal-border chamfered-diagonal-tr",
650
- style: h
729
+ style: g
651
730
  }),
652
731
  /* @__PURE__ */ s("div", {
653
732
  className: "chamfered-diagonal-border chamfered-diagonal-bl",
654
- style: h
733
+ style: g
655
734
  }),
656
735
  /* @__PURE__ */ s("div", {
657
736
  className: "chamfered-diagonal-border chamfered-diagonal-br",
658
- style: h
737
+ style: g
659
738
  })
660
739
  ] }), e]
661
740
  });
@@ -671,7 +750,7 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
671
750
  warning: "_warning_rk7t5_47",
672
751
  error: "_error_rk7t5_52",
673
752
  info: "_info_rk7t5_57"
674
- }, ce = ({ children: e, variant: t = "default", size: n = "md", className: r = "" }) => /* @__PURE__ */ s("span", {
753
+ }, ue = ({ children: e, variant: t = "default", size: n = "md", className: r = "" }) => /* @__PURE__ */ s("span", {
675
754
  className: `${Z.badge} ${Z[t]} ${Z[n]} ${r}`,
676
755
  children: e
677
756
  }), Q = {
@@ -687,7 +766,7 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
687
766
  title: "_title_1b3yt_53",
688
767
  closeButton: "_closeButton_1b3yt_60",
689
768
  content: "_content_1b3yt_78"
690
- }, le = ({ 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", () => {
769
+ }, de = ({ 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", () => {
691
770
  document.body.style.overflow = "unset";
692
771
  }), [e]), i(() => {
693
772
  let n = (n) => {
@@ -729,7 +808,7 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
729
808
  dot: "_dot_1uhnh_34",
730
809
  bounce: "_bounce_1uhnh_1",
731
810
  visuallyHidden: "_visuallyHidden_1uhnh_91"
732
- }, ue = ({ size: e = "md", variant: t = "spinner", className: n = "" }) => t === "dots" ? /* @__PURE__ */ c("div", {
811
+ }, fe = ({ size: e = "md", variant: t = "spinner", className: n = "" }) => t === "dots" ? /* @__PURE__ */ c("div", {
733
812
  className: `${$.dots} ${$[e]} ${n}`,
734
813
  children: [
735
814
  /* @__PURE__ */ s("span", { className: $.dot }),
@@ -745,4 +824,4 @@ var x = "astrogators_access_token", S = "astrogators_refresh_token", C = () => l
745
824
  })
746
825
  });
747
826
  //#endregion
748
- export { oe as AllyCodeDropdown, L as ApiClient, ie as AuthProvider, ce as Badge, g as Button, se as Card, u as Container, m as Footer, v as Input, ue as Loader, le as Modal, b as Select, f as TopBar, R as apiClient, I as authedFetch, re as clearAllyCodes, A as clearTokens, P as configureAuthRefresh, J as formatAllyCode, C as getAccessToken, H as getAllyCodesFromStorage, E as getRefreshToken, ne as getSelectedAllyCode, z as initializeApiClient, ee as isAuthenticated, F as refreshAccessToken, T as removeAccessToken, U as removeAllyCodeFromStorage, O as removeRefreshToken, te as saveAllyCodeToStorage, w as setAccessToken, D as setRefreshToken, G as setSelectedAllyCode, k as setTokens, ae as unformatAllyCode, W as updateAllyCodeLastUsed, q as useAuth };
827
+ export { oe as AllyCodeDropdown, F as ApiClient, W as AuthProvider, ue as Badge, m as Button, le as Card, u as Container, ce as Footer, v as Input, fe as Loader, de as Modal, se as NavBar, g as Select, f as TopBar, I as apiClient, P as authedFetch, H as clearAllyCodes, O as clearTokens, M as configureAuthRefresh, K as formatAllyCode, x as getAccessToken, z as getAllyCodesFromStorage, w as getRefreshToken, ie as getSelectedAllyCode, te as initializeApiClient, ee as isAuthenticated, N as refreshAccessToken, C as removeAccessToken, re as removeAllyCodeFromStorage, E as removeRefreshToken, ne as saveAllyCodeToStorage, S as setAccessToken, T as setRefreshToken, V as setSelectedAllyCode, D as setTokens, ae as unformatAllyCode, B as updateAllyCodeLastUsed, G as useAuth };
@@ -0,0 +1,48 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * A single top-level section link in the NavBar tab strip.
4
+ *
5
+ * NavBar is intentionally router-agnostic: shared-ui takes no react-router
6
+ * dependency. The consumer decides whether a tab is `active` (e.g. from its own
7
+ * `useLocation`) and may supply `render` to inject a router `<Link>` for soft
8
+ * client-side navigation. Without `render`, the tab is a plain `<a href>`.
9
+ */
10
+ export interface NavItem {
11
+ label: string;
12
+ href: string;
13
+ active?: boolean;
14
+ render?: (props: {
15
+ className: string;
16
+ children: React.ReactNode;
17
+ }) => React.ReactNode;
18
+ }
19
+ export interface NavBarProps {
20
+ /** Target for the ⟵ "The Astrogator's Table" logo — always the hub. Default '/'. */
21
+ hubUrl?: string;
22
+ /** This app's display name, e.g. "Mod Ledger". Omit on the hub (the logo is
23
+ * already the suite identity) for a logo-only left section. */
24
+ appName?: string;
25
+ /** Link target for the app name — the app's own root. Default '/'. */
26
+ appHref?: string;
27
+ /** Top-level section tabs. Omit (or empty) for apps with no sections. */
28
+ navItems?: NavItem[];
29
+ /** Render the shared AllyCodeDropdown in the right cluster. Default false. */
30
+ showAllyCode?: boolean;
31
+ /** Render the baked username/login/logout cluster. Default true. Set false for
32
+ * static pages (e.g. docs) that want no auth UI. */
33
+ showAuth?: boolean;
34
+ /** App-specific controls, rendered immediately left of the ally dropdown. */
35
+ rightExtras?: React.ReactNode;
36
+ className?: string;
37
+ }
38
+ /**
39
+ * NavBar — the opinionated, suite-wide top bar built on top of the dumb `TopBar`
40
+ * primitive. It bakes the blessed layout so every app's chrome is identical:
41
+ *
42
+ * [ logo → hub ] · [ appName ] [ section tabs ] ···· [ rightExtras ] [ ally ] [ auth cluster ]
43
+ *
44
+ * The username/profile/login/register/logout cluster is owned here (via useAuth);
45
+ * apps no longer hand-roll it. Auth links point at the hub origin as plain anchors
46
+ * because the auth UI lives in the hub and everything is served single-origin.
47
+ */
48
+ export declare const NavBar: React.FC<NavBarProps>;
@@ -2,5 +2,7 @@ export { Container } from './Container';
2
2
  export type { ContainerProps } from './Container';
3
3
  export { TopBar } from './TopBar';
4
4
  export type { TopBarProps } from './TopBar';
5
+ export { NavBar } from './NavBar';
6
+ export type { NavBarProps, NavItem } from './NavBar';
5
7
  export { Footer } from './Footer';
6
8
  export type { FooterProps } from './Footer';
@@ -1,5 +1,5 @@
1
- export { Container, TopBar, Footer } from './components/layout';
2
- export type { ContainerProps, TopBarProps, FooterProps } from './components/layout';
1
+ export { Container, TopBar, NavBar, Footer } from './components/layout';
2
+ export type { ContainerProps, TopBarProps, NavBarProps, NavItem, FooterProps } from './components/layout';
3
3
  export { Button, Input, Select, AllyCodeDropdown } from './components/forms';
4
4
  export type { ButtonProps, InputProps, SelectProps, SelectOption, AllyCodeDropdownProps } from './components/forms';
5
5
  export { Card, Badge, Modal } from './components/display';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astrogators-shared-ui",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Shared UI components and utilities for Astrogator's Table applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",