astrogators-shared-ui 0.4.3 → 0.4.4
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/components/display/Badge.d.ts +13 -0
- package/dist/components/display/Card.d.ts +20 -0
- package/dist/components/display/Modal.d.ts +16 -0
- package/dist/components/display/index.d.ts +6 -0
- package/dist/components/feedback/Loader.d.ts +12 -0
- package/dist/components/feedback/index.d.ts +2 -0
- package/dist/components/forms/AllyCodeDropdown.d.ts +12 -0
- package/dist/components/forms/Button.d.ts +16 -0
- package/dist/components/forms/Input.d.ts +14 -0
- package/dist/components/forms/Select.d.ts +21 -0
- package/dist/components/forms/index.d.ts +8 -0
- package/dist/components/layout/Container.d.ts +14 -0
- package/dist/components/layout/Footer.d.ts +11 -0
- package/dist/components/layout/TopBar.d.ts +13 -0
- package/dist/components/layout/index.d.ts +6 -0
- package/dist/contexts/AuthContext.d.ts +41 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +791 -0
- package/dist/services/allyCodeStorage.d.ts +16 -0
- package/dist/services/api.d.ts +24 -0
- package/dist/services/auth.d.ts +13 -0
- package/dist/style.css +1 -0
- package/dist/types/api.d.ts +20 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/mod.d.ts +64 -0
- package/dist/types/user.d.ts +85 -0
- package/dist/utils/formatAllyCode.d.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* localStorage utility for anonymous user ally codes
|
|
3
|
+
* Stores ally codes with player names for non-logged-in users
|
|
4
|
+
*/
|
|
5
|
+
export interface StoredAllyCode {
|
|
6
|
+
ally_code: string;
|
|
7
|
+
player_name: string | null;
|
|
8
|
+
last_used_at: string | null;
|
|
9
|
+
}
|
|
10
|
+
export declare const getAllyCodesFromStorage: () => StoredAllyCode[];
|
|
11
|
+
export declare const saveAllyCodeToStorage: (allyCode: StoredAllyCode) => void;
|
|
12
|
+
export declare const removeAllyCodeFromStorage: (allyCode: string) => void;
|
|
13
|
+
export declare const updateAllyCodeLastUsed: (allyCode: string) => void;
|
|
14
|
+
export declare const getSelectedAllyCode: () => string | null;
|
|
15
|
+
export declare const setSelectedAllyCode: (allyCode: string | null) => void;
|
|
16
|
+
export declare const clearAllyCodes: () => void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client
|
|
3
|
+
* HTTP client with JWT token injection and automatic refresh
|
|
4
|
+
*/
|
|
5
|
+
export interface ApiClientConfig {
|
|
6
|
+
baseURL: string;
|
|
7
|
+
onUnauthorized?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare class ApiClient {
|
|
10
|
+
private baseURL;
|
|
11
|
+
private onUnauthorized?;
|
|
12
|
+
private isRefreshing;
|
|
13
|
+
private refreshPromise;
|
|
14
|
+
constructor(config: ApiClientConfig);
|
|
15
|
+
private refreshAccessToken;
|
|
16
|
+
request<T>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
17
|
+
get<T>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
18
|
+
post<T>(endpoint: string, data?: unknown, options?: RequestInit): Promise<T>;
|
|
19
|
+
put<T>(endpoint: string, data?: unknown, options?: RequestInit): Promise<T>;
|
|
20
|
+
patch<T>(endpoint: string, data?: unknown, options?: RequestInit): Promise<T>;
|
|
21
|
+
delete<T>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
22
|
+
}
|
|
23
|
+
export declare let apiClient: ApiClient;
|
|
24
|
+
export declare const initializeApiClient: (config: ApiClientConfig) => void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication utility functions
|
|
3
|
+
* Manages JWT tokens in localStorage
|
|
4
|
+
*/
|
|
5
|
+
export declare const getAccessToken: () => string | null;
|
|
6
|
+
export declare const setAccessToken: (token: string) => void;
|
|
7
|
+
export declare const removeAccessToken: () => void;
|
|
8
|
+
export declare const getRefreshToken: () => string | null;
|
|
9
|
+
export declare const setRefreshToken: (token: string) => void;
|
|
10
|
+
export declare const removeRefreshToken: () => void;
|
|
11
|
+
export declare const setTokens: (accessToken: string, refreshToken: string) => void;
|
|
12
|
+
export declare const clearTokens: () => void;
|
|
13
|
+
export declare const isAuthenticated: () => boolean;
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
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: #ffffff;--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: #ffcc33;--tier-gold-glow: rgba(255, 204, 51, .6);--tier-purple-glow: rgba(139, 92, 246, .5);--tier-blue-glow: rgba(29, 153, 255, .5);--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 rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4), 0 2px 4px -1px rgba(0, 0, 0, .3);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .5), 0 4px 6px -2px rgba(0, 0, 0, .4);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .6), 0 10px 10px -5px rgba(0, 0, 0, .5);--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{display:block;max-width:100%}input,button,textarea,select{font:inherit;color:inherit}button{background:none;border:none;cursor:pointer}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{position:relative;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))}.chamfered-box-lg{position:relative;clip-path:polygon(var(--chamfer-size-lg) 0,calc(100% - var(--chamfer-size-lg)) 0,100% var(--chamfer-size-lg),100% calc(100% - var(--chamfer-size-lg)),calc(100% - var(--chamfer-size-lg)) 100%,var(--chamfer-size-lg) 100%,0 calc(100% - var(--chamfer-size-lg)),0 var(--chamfer-size-lg))}.chamfered-box-sm{position:relative;clip-path:polygon(var(--chamfer-size-sm) 0,calc(100% - var(--chamfer-size-sm)) 0,100% var(--chamfer-size-sm),100% calc(100% - var(--chamfer-size-sm)),calc(100% - var(--chamfer-size-sm)) 100%,var(--chamfer-size-sm) 100%,0 calc(100% - var(--chamfer-size-sm)),0 var(--chamfer-size-sm))}.chamfered-box-asymmetric{position:relative;clip-path:polygon(12px 0%,calc(100% - 12px) 0%,100% 12px,100% calc(100% - 24px),calc(100% - 24px) 100%,12px 100%,0% calc(100% - 12px),0% 12px)}.chamfered-border{position:relative;background:var(--color-surface)}.chamfered-border:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;padding:2px;background:linear-gradient(135deg,var(--color-primary),var(--color-secondary));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;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))}.chamfered-diagonal-border{position:absolute;background-color:currentColor;transition:background-color .3s ease;z-index:5;pointer-events:none}.chamfered-diagonal-tl{top:-1px;left:11px;width:16px;height:2px;transform:rotate(135deg);transform-origin:left center}.chamfered-diagonal-tr{top:10px;right:0;width:18px;height:2px;transform:rotate(45deg);transform-origin:right center}.chamfered-diagonal-bl{bottom:-2px;left:12px;width:20px;height:2px;transform:rotate(-135deg);transform-origin:left center}.chamfered-diagonal-br{bottom:11px;right:-1px;width:18px;height:2px;transform:rotate(-45deg);transform-origin:right center}.chamfered-diagonal-br-large{bottom:23px;right:-1px;width:35px;height:2px;transform:rotate(-45deg);transform-origin:right center}.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:"";position:absolute;top:-2px;left:-2px;right:-2px;bottom:-2px;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}.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:spin 1s linear infinite}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.flex-center{display:flex;align-items:center;justify-content:center}.flex-between{display:flex;align-items:center;justify-content:space-between}.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:"";position:absolute;top:0;right:0;bottom:0;left:0;background:var(--overlay-gradient, linear-gradient(135deg, rgba(15, 23, 42, .7), rgba(15, 23, 42, .5)));z-index:0}.bg-overlay>*{position:relative;z-index:1}.backdrop-image{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat}._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 (max-width: 768px){._padding_u3o0e_7{padding-left:var(--spacing-md);padding-right:var(--spacing-md)}}._topBar_10g3c_1{position:sticky;top:0;left:0;right:0;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)}._content_10g3c_13{height:100%;max-width:var(--container-max-width);margin:0 auto;padding:0 var(--container-padding);display:flex;align-items:center;justify-content:space-between}._left_10g3c_23{display:flex;align-items:center;gap:var(--spacing-xl);flex:1}._right_10g3c_30{display:flex;align-items:center;gap:var(--spacing-md)}._logo_10g3c_36{display:flex;align-items:center;font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--color-primary);font-family:var(--font-heading)}@media (max-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);margin:0 auto;padding:var(--spacing-xl) var(--container-padding)}._defaultContent_zjuj8_13{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-sm);text-align:center}._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 (max-width: 768px){._content_zjuj8_7{padding:var(--spacing-lg) var(--spacing-md)}}._button_159ms_1{display:inline-flex;align-items:center;justify-content: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);border:2px solid transparent;text-align:center;-webkit-user-select:none;user-select:none}._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{background-color:transparent;border-color:var(--color-border);color:var(--color-text-primary)}._outline_159ms_69:hover:not(:disabled){background-color:var(--color-background-hover);border-color:var(--color-primary)}._ghost_159ms_80{background-color:transparent;color:var(--color-text-primary)}._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){background-color:#c33a2e;box-shadow:var(--shadow-md)}._fullWidth_159ms_100{width:100%}._loading_159ms_105{position:relative;pointer-events:none}._loadingSpinner_159ms_110{display:flex;align-items:center;gap:var(--spacing-sm)}._spinner_159ms_116{width:16px;height:16px;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;animation:_spin_159ms_116 .6s linear infinite}@keyframes _spin_159ms_116{to{transform:rotate(360deg)}}._loadingText_159ms_131{opacity:.7}._inputWrapper_15t4g_1{display:flex;flex-direction:column;gap:var(--spacing-xs)}._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);display:flex;align-items:center;gap:var(--spacing-xs)}._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{display:flex;flex-direction:column;gap:var(--spacing-xs)}._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);display:flex;align-items:center;gap:var(--spacing-xs)}._required_ir4bq_20{color:var(--color-error)}._selectContainer_ir4bq_24{position:relative;display:inline-block;width:100%}._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);outline:none;cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance: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{position:absolute;right:var(--input-padding-x);top:50%;transform:translateY(-50%);pointer-events:none;font-size:var(--font-size-xs);color:var(--color-text-secondary)}._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{position:relative;display:flex;align-items:center;gap:.5rem}._select_1m0tw_8{min-width:200px}._manageButton_1m0tw_12{white-space:nowrap}._managePanel_1m0tw_16{position:absolute;top:100%;right:0;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:1rem;margin-top:.5rem;min-width:300px;box-shadow:0 4px 6px #0000001a;z-index:1000}._managePanel_1m0tw_16 h4{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:var(--color-text-primary)}._addSection_1m0tw_37{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--color-border)}._addInputGroup_1m0tw_43{display:flex;gap:.5rem;margin-bottom:.5rem}._addInputGroup_1m0tw_43 input{flex:1;font-family:monospace;letter-spacing:.05em}._error_1m0tw_55{font-size:.75rem;color:var(--color-error);margin-top:.25rem}._success_1m0tw_61{font-size:.75rem;color:var(--color-success);margin-top:.25rem}._codesList_1m0tw_67{margin-bottom:1rem}._codeItem_1m0tw_71{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--color-border)}._codeItem_1m0tw_71:last-of-type{border-bottom:none}._codeItem_1m0tw_71 span{font-size:.875rem;color:var(--color-text-secondary)}._doneButton_1m0tw_88{width:100%}@media (max-width: 768px){._select_1m0tw_8{min-width:150px}._managePanel_1m0tw_16{right:auto;left:0}}._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{background-color:transparent;border:1px solid var(--card-border)}._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{transform:translateY(-4px) translateZ(0);box-shadow:var(--shadow-lg)}._hoverable_b4471_45:active{transform:translateY(-1px) translateZ(0);box-shadow:var(--shadow-md)}._card_b4471_1[role=button]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._badge_rk7t5_1{display:inline-flex;align-items:center;justify-content:center;font-weight:var(--font-weight-medium);border-radius:var(--radius-full);white-space:nowrap}._sm_rk7t5_11{padding:2px 8px;font-size:var(--font-size-xs)}._md_rk7t5_16{padding:4px 12px;font-size:var(--font-size-sm)}._lg_rk7t5_21{padding:6px 16px;font-size:var(--font-size-base)}._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{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000bf;display:flex;align-items:center;justify-content:center;z-index:var(--z-modal);padding:var(--spacing-md);animation:_fadeIn_1b3yt_1 var(--transition-base)}._modal_1b3yt_13{background-color:var(--color-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);max-height:90vh;overflow:hidden;display:flex;flex-direction:column;animation:_slideUp_1b3yt_1 var(--transition-base)}._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{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-lg);border-bottom:1px solid var(--color-border)}._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{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--color-text-secondary);transition:all var(--transition-fast);font-size:var(--font-size-xl);line-height:1}._closeButton_1b3yt_60:hover{background-color:var(--color-background-hover);color:var(--color-text-primary)}._content_1b3yt_78{padding:var(--spacing-lg);overflow-y:auto;flex:1}@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 (max-width: 768px){._modal_1b3yt_13{max-height:95vh}._header_1b3yt_45,._content_1b3yt_78{padding:var(--spacing-md)}}._spinner_1uhnh_2{border:3px solid rgba(255,255,255,.1);border-top-color:var(--color-primary);border-radius:50%;animation:_spin_1uhnh_2 .8s linear infinite}._spinner_1uhnh_2._sm_1uhnh_9{width:16px;height:16px;border-width:2px}._spinner_1uhnh_2._md_1uhnh_15{width:32px;height:32px;border-width:3px}._spinner_1uhnh_2._lg_1uhnh_21{width:48px;height:48px;border-width:4px}@keyframes _spin_1uhnh_2{to{transform:rotate(360deg)}}._dots_1uhnh_34{display:inline-flex;gap:8px}._dots_1uhnh_34._sm_1uhnh_9{gap:4px}._dots_1uhnh_34._lg_1uhnh_21{gap:12px}._dot_1uhnh_34{display:inline-block;background-color:var(--color-primary);border-radius:50%;animation:_bounce_1uhnh_1 1.4s infinite ease-in-out both}._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:nth-child(1){animation-delay:-.32s}._dot_1uhnh_34:nth-child(2){animation-delay:-.16s}@keyframes _bounce_1uhnh_1{0%,80%,to{transform:scale(0);opacity:.5}40%{transform:scale(1);opacity:1}}._visuallyHidden_1uhnh_91{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic API types
|
|
3
|
+
* Common response structures
|
|
4
|
+
*/
|
|
5
|
+
export interface ApiResponse<T = unknown> {
|
|
6
|
+
data: T;
|
|
7
|
+
message?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ApiError {
|
|
10
|
+
message: string;
|
|
11
|
+
detail?: string;
|
|
12
|
+
status?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface PaginatedResponse<T> {
|
|
15
|
+
items: T[];
|
|
16
|
+
total: number;
|
|
17
|
+
page: number;
|
|
18
|
+
per_page: number;
|
|
19
|
+
pages: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { User, LoginRequest, LoginResponse, RegisterRequest, RegisterResponse, RefreshTokenRequest, RefreshTokenResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, VerifyEmailRequest, VerifyEmailResponse, ResendVerificationRequest, ResendVerificationResponse, AllyCode, AllyCodeCreate, AllyCodeListResponse, AllyCodeMigrationPrompt, } from './user';
|
|
2
|
+
export type { ApiResponse, ApiError, PaginatedResponse } from './api';
|
|
3
|
+
export type { ModStat, ParsedMod, ModListResponse, EvaluationScores, ModEvaluation, EvaluationRequest, EvaluationResponse, } from './mod';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mod-related TypeScript types
|
|
3
|
+
* Matches mod-ledger backend API responses
|
|
4
|
+
*/
|
|
5
|
+
export interface ModStat {
|
|
6
|
+
stat_id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
value: number;
|
|
9
|
+
display_value: string;
|
|
10
|
+
rolls?: number;
|
|
11
|
+
bounds_min?: number;
|
|
12
|
+
bounds_max?: number;
|
|
13
|
+
efficiency?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ParsedMod {
|
|
16
|
+
mod_id: string;
|
|
17
|
+
set: {
|
|
18
|
+
id: number;
|
|
19
|
+
name: string;
|
|
20
|
+
};
|
|
21
|
+
slot: {
|
|
22
|
+
id: number;
|
|
23
|
+
name: string;
|
|
24
|
+
shape: string;
|
|
25
|
+
};
|
|
26
|
+
tier: number;
|
|
27
|
+
level: number;
|
|
28
|
+
primary_stat: ModStat;
|
|
29
|
+
secondary_stats: ModStat[];
|
|
30
|
+
character_id?: string;
|
|
31
|
+
reroll_count?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface ModListResponse {
|
|
34
|
+
ally_code: string;
|
|
35
|
+
mods: ParsedMod[];
|
|
36
|
+
count: number;
|
|
37
|
+
cached: boolean;
|
|
38
|
+
cached_at?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface EvaluationScores {
|
|
41
|
+
synergy: number;
|
|
42
|
+
quality: number;
|
|
43
|
+
versatility: number;
|
|
44
|
+
speed_bonus: number;
|
|
45
|
+
upgrade_potential?: number;
|
|
46
|
+
slice_value?: number;
|
|
47
|
+
overall: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ModEvaluation {
|
|
50
|
+
mod_id: string;
|
|
51
|
+
scores: EvaluationScores;
|
|
52
|
+
recommendation: 'SELL' | 'KEEP' | 'UPGRADE' | 'SLICE' | 'SLICE-PRIORITY';
|
|
53
|
+
reasoning: string;
|
|
54
|
+
}
|
|
55
|
+
export interface EvaluationRequest {
|
|
56
|
+
profile_name?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface EvaluationResponse {
|
|
59
|
+
ally_code: string;
|
|
60
|
+
profile_name: string;
|
|
61
|
+
evaluations: Record<string, ModEvaluation>;
|
|
62
|
+
cached: boolean;
|
|
63
|
+
cached_at?: string;
|
|
64
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-related TypeScript types
|
|
3
|
+
* Matches astrogators-table backend API responses
|
|
4
|
+
*/
|
|
5
|
+
export interface User {
|
|
6
|
+
id: string;
|
|
7
|
+
email: string;
|
|
8
|
+
username: string;
|
|
9
|
+
is_verified: boolean;
|
|
10
|
+
is_active: boolean;
|
|
11
|
+
created_at: string;
|
|
12
|
+
updated_at: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LoginRequest {
|
|
15
|
+
email: string;
|
|
16
|
+
password: string;
|
|
17
|
+
}
|
|
18
|
+
export interface LoginResponse {
|
|
19
|
+
access_token: string;
|
|
20
|
+
refresh_token: string;
|
|
21
|
+
token_type: string;
|
|
22
|
+
expires_in: number;
|
|
23
|
+
}
|
|
24
|
+
export interface RegisterRequest {
|
|
25
|
+
email: string;
|
|
26
|
+
username: string;
|
|
27
|
+
password: string;
|
|
28
|
+
password_confirm: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RegisterResponse {
|
|
31
|
+
message: string;
|
|
32
|
+
email: string;
|
|
33
|
+
verification_required: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface RefreshTokenRequest {
|
|
36
|
+
refresh_token: string;
|
|
37
|
+
}
|
|
38
|
+
export interface RefreshTokenResponse {
|
|
39
|
+
access_token: string;
|
|
40
|
+
token_type: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ForgotPasswordRequest {
|
|
43
|
+
email: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ForgotPasswordResponse {
|
|
46
|
+
message: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ResetPasswordRequest {
|
|
49
|
+
token: string;
|
|
50
|
+
password: string;
|
|
51
|
+
password_confirm: string;
|
|
52
|
+
}
|
|
53
|
+
export interface ResetPasswordResponse {
|
|
54
|
+
message: string;
|
|
55
|
+
}
|
|
56
|
+
export interface VerifyEmailRequest {
|
|
57
|
+
token: string;
|
|
58
|
+
}
|
|
59
|
+
export interface VerifyEmailResponse {
|
|
60
|
+
message: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ResendVerificationRequest {
|
|
63
|
+
email: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ResendVerificationResponse {
|
|
66
|
+
message: string;
|
|
67
|
+
}
|
|
68
|
+
export interface AllyCode {
|
|
69
|
+
id: number;
|
|
70
|
+
ally_code: string;
|
|
71
|
+
player_name: string | null;
|
|
72
|
+
last_used_at: string | null;
|
|
73
|
+
created_at: string;
|
|
74
|
+
}
|
|
75
|
+
export interface AllyCodeCreate {
|
|
76
|
+
ally_code: string;
|
|
77
|
+
}
|
|
78
|
+
export interface AllyCodeListResponse {
|
|
79
|
+
ally_codes: AllyCode[];
|
|
80
|
+
total: number;
|
|
81
|
+
}
|
|
82
|
+
export interface AllyCodeMigrationPrompt {
|
|
83
|
+
show: boolean;
|
|
84
|
+
localStorageCodes: string[];
|
|
85
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format ally code for display as ###-###-###
|
|
3
|
+
*/
|
|
4
|
+
export declare const formatAllyCode: (allyCode: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* Remove formatting from ally code (###-###-### -> #########)
|
|
7
|
+
*/
|
|
8
|
+
export declare const unformatAllyCode: (formatted: string) => string;
|