@mathwiz/ui-components 0.1.4 → 0.1.6
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/README.md +35 -1
- package/dist/components/MathWizHeader/MathWizHeader.d.ts.map +1 -1
- package/dist/components/MathWizHeader/MathWizHeader.types.d.ts +15 -0
- package/dist/components/MathWizHeader/MathWizHeader.types.d.ts.map +1 -1
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/types.d.ts +117 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/utils.d.ts +72 -0
- package/dist/config/utils.d.ts.map +1 -0
- package/dist/data-sources/api-data-source.d.ts +35 -0
- package/dist/data-sources/api-data-source.d.ts.map +1 -0
- package/dist/data-sources/custom-data-source.d.ts +59 -0
- package/dist/data-sources/custom-data-source.d.ts.map +1 -0
- package/dist/data-sources/factory.d.ts +61 -0
- package/dist/data-sources/factory.d.ts.map +1 -0
- package/dist/data-sources/index.d.ts +7 -0
- package/dist/data-sources/index.d.ts.map +1 -0
- package/dist/data-sources/mock-data-source.d.ts +44 -0
- package/dist/data-sources/mock-data-source.d.ts.map +1 -0
- package/dist/data-sources/types.d.ts +119 -0
- package/dist/data-sources/types.d.ts.map +1 -0
- package/dist/demo/configurable-demo.d.ts +4 -0
- package/dist/demo/configurable-demo.d.ts.map +1 -0
- package/dist/index.cjs +22 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +2051 -1564
- package/dist/index.mjs.map +1 -1
- package/dist/mocks/handlers.d.ts.map +1 -1
- package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.d.ts +2 -4
- package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.d.ts.map +1 -1
- package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserPage.d.ts.map +1 -1
- package/dist/pages/GradeUnitBrowserPage/types.d.ts +10 -0
- package/dist/pages/GradeUnitBrowserPage/types.d.ts.map +1 -1
- package/dist/services/courseService.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/ui-components.css +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
(function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports,require("react"),require("@heroui/progress"),require("@heroui/card"),require("@heroui/react")):typeof define=="function"&&define.amd?define(["exports","react","@heroui/progress","@heroui/card","@heroui/react"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.MathwizUIComponents={},v.React,v.progress,v.card,v.react))})(this,(function(v,R,Jn,Ke,ye){"use strict";var Oe={exports:{}},xe={};/**
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(':root{--primary-color: #3b82f6;--primary-hover: #2563eb;--primary-active: #1d4ed8;--bg-primary: #ffffff;--bg-secondary: #f8fafc;--bg-tertiary: #f1f5f9;--text-primary: #1e293b;--text-secondary: #64748b;--text-tertiary: #94a3b8;--border-light: #e2e8f0;--border-medium: #cbd5e1;--border-dark: #94a3b8;--success-color: #10b981;--warning-color: #f59e0b;--error-color: #ef4444;--info-color: #3b82f6;--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--radius-sm: .25rem;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 1.5rem;--spacing-xl: 2rem;--spacing-2xl: 3rem;--text-xs: .75rem;--text-sm: .875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 1.875rem;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--font-bold: 700;--header-bg: linear-gradient(to right, #8b5cf6, #ec4899, #ef4444);--sidebar-bg: linear-gradient(180deg, #f8fafc 0%, #e2e8f0 100%)}*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:var(--text-primary);background-color:var(--bg-primary)}a{color:inherit;text-decoration:none}a:hover{text-decoration:underline}button{border:none;background:none;cursor:pointer;font-family:inherit}button:disabled{cursor:not-allowed;opacity:.6}input,textarea,select{font-family:inherit;border:1px solid var(--border-medium);border-radius:var(--radius-md);padding:var(--spacing-sm) var(--spacing-md);background-color:var(--bg-primary)}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #3b82f61a}ul,ol{list-style:none}img{max-width:100%;height:auto;display:block}.button{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;border:1px solid transparent;font-weight:500;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;transition:all .2s ease-in-out;line-height:1.5;text-decoration:none;-webkit-user-select:none;user-select:none;white-space:nowrap;vertical-align:middle;position:relative;overflow:hidden}.button--sm{padding:.375rem .75rem;font-size:.75rem;min-height:1.75rem}.button--md{padding:.5rem 1rem;font-size:.875rem;min-height:2.25rem}.button--lg{padding:.75rem 1.5rem;font-size:1rem;min-height:2.75rem}.button--radius-sm{border-radius:.25rem}.button--radius-md{border-radius:.375rem}.button--radius-lg{border-radius:.5rem}.button--primary{background-color:#3b82f6;color:#fff;border-color:#3b82f6}.button--primary:hover{background-color:#2563eb;border-color:#2563eb}.button--primary:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.button--secondary{background-color:#6b7280;color:#fff;border-color:#6b7280}.button--secondary:hover{background-color:#4b5563;border-color:#4b5563}.button--secondary:focus-visible{outline:2px solid #6b7280;outline-offset:2px}.button--success{background-color:#10b981;color:#fff;border-color:#10b981}.button--success:hover{background-color:#059669;border-color:#059669}.button--success:focus-visible{outline:2px solid #10b981;outline-offset:2px}.button--bordered.button--primary{background-color:transparent;color:#3b82f6;border-color:#3b82f6}.button--bordered.button--primary:hover{background-color:#3b82f6;color:#fff}.button--bordered.button--secondary{background-color:transparent;color:#6b7280;border-color:#6b7280}.button--bordered.button--secondary:hover{background-color:#6b7280;color:#fff}.button--bordered.button--success{background-color:transparent;color:#10b981;border-color:#10b981}.button--bordered.button--success:hover{background-color:#10b981;color:#fff}.button--light.button--primary{background-color:#dbeafe;color:#1e40af;border-color:transparent}.button--light.button--primary:hover{background-color:#bfdbfe}.button--light.button--secondary{background-color:#f3f4f6;color:#374151;border-color:transparent}.button--light.button--secondary:hover{background-color:#e5e7eb}.button--light.button--success{background-color:#d1fae5;color:#065f46;border-color:transparent}.button--light.button--success:hover{background-color:#a7f3d0}.button:disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.button:focus{outline:none}.button:focus-visible{box-shadow:0 0 0 3px #3b82f680}.button--loading{pointer-events:none;opacity:.8}@media (max-width: 768px){.button--sm{padding:.25rem .5rem;font-size:.6875rem;min-height:1.5rem}.button--md{padding:.375rem .75rem;font-size:.8125rem;min-height:2rem}.button--lg{padding:.5rem 1rem;font-size:.875rem;min-height:2.25rem}}.content-accordion{--accordion-spacing: 1rem;--accordion-border-radius: 8px;--accordion-shadow: 0 1px 3px 0 rgba(0, 0, 0, .1);--accordion-border: 1px solid #e5e7eb;--accordion-transition: all .2s ease-in-out;width:100%;max-width:100%;min-width:0;margin:0;box-sizing:border-box;overflow-wrap:break-word;word-wrap:break-word}.content-accordion--loading{display:flex;justify-content:center;align-items:center;min-height:200px}.content-accordion__loading{color:#6b7280;font-size:.875rem}.content-accordion--empty{display:flex;justify-content:center;align-items:center;min-height:200px;color:#6b7280}.content-accordion__empty{text-align:center}.content-accordion__header{padding:var(--accordion-spacing);background:#f8fafc;border-radius:var(--accordion-border-radius);margin-bottom:var(--accordion-spacing);border:var(--accordion-border)}.content-accordion__unit-title{font-size:1.5rem;font-weight:600;color:#1f2937;margin:0 0 .5rem}.content-accordion__unit-description{color:#6b7280;margin:0 0 .75rem;line-height:1.5}.content-accordion__unit-meta{display:flex;gap:.5rem;align-items:center;color:#9ca3af;font-size:.875rem}.content-accordion__lessons{display:flex;flex-direction:column;gap:.5rem}.content-accordion__lesson-item{border:var(--accordion-border);border-radius:var(--accordion-border-radius);background:#fff;overflow:hidden;transition:var(--accordion-transition)}.content-accordion__lesson-item--expanded{box-shadow:var(--accordion-shadow)}.content-accordion__lesson-header{display:flex;justify-content:space-between;align-items:center;padding:1rem var(--accordion-spacing);cursor:pointer;background:#fff;transition:var(--accordion-transition);-webkit-user-select:none;user-select:none}.content-accordion__lesson-header:hover{background:#f9fafb}.content-accordion__lesson-header:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.content-accordion__lesson-header-content{flex:1}.content-accordion__lesson-title{font-size:1rem;font-weight:500;color:#1f2937;margin:0 0 .25rem}.content-accordion__lesson-duration{font-size:.875rem;color:#6b7280}.content-accordion__lesson-actions{display:flex;align-items:center;gap:.75rem}.content-accordion__lesson-progress{font-size:.875rem;font-weight:500;color:#3b82f6;min-width:3rem;text-align:right}.content-accordion__lesson-icon{width:1.25rem;height:1.25rem;color:#6b7280;transition:var(--accordion-transition)}.content-accordion__knowledge-list{padding:0 var(--accordion-spacing) var(--accordion-spacing);display:flex;flex-direction:column;gap:.75rem;background:#fafafa;border-top:var(--accordion-border)}.content-accordion__knowledge-card{margin:0;box-shadow:none;border:var(--accordion-border)}.content-accordion__knowledge-title{font-size:.875rem;font-weight:500;color:#1f2937;margin:0 0 .5rem}.content-accordion__knowledge-description{font-size:.75rem;color:#6b7280;line-height:1.4;margin:0}.content-accordion__knowledge-actions{display:flex;justify-content:space-between;align-items:center;gap:.75rem;padding-top:.75rem;border-top:1px solid #f3f4f6}.content-accordion__progress-container{display:flex;align-items:center;gap:.5rem;flex:1}.content-accordion__progress-bar{flex:1;max-width:120px}.content-accordion__progress-text{font-size:.75rem;color:#6b7280;min-width:2.5rem;text-align:right}.content-accordion__learn-button{white-space:nowrap;min-width:6rem;justify-content:center}@media (max-width: 768px){.content-accordion{--accordion-spacing: .75rem}.content-accordion__header{padding:.75rem}.content-accordion__unit-title{font-size:1.25rem}.content-accordion__lesson-header{padding:.75rem}.content-accordion__knowledge-list{padding:0 .75rem .75rem}.content-accordion__knowledge-actions{flex-direction:column;align-items:stretch;gap:.5rem}.content-accordion__progress-container{justify-content:space-between}}@media (prefers-reduced-motion: reduce){.content-accordion,.content-accordion__lesson-header,.content-accordion__lesson-icon{transition:none}}@media (prefers-contrast: high){.content-accordion__lesson-header,.content-accordion__knowledge-card{border:2px solid currentColor}}.sidebar{display:flex;flex-direction:column;width:280px;height:100vh;background-color:var(--sidebar-bg-color, #ffffff);border-right:1px solid var(--sidebar-border-color, #e0e0e0);transition:width var(--transition-normal, .25s ease-in-out),transform var(--transition-normal, .25s ease-in-out);overflow-y:auto;position:relative}.sidebar--collapsed{width:64px}.sidebar--loading .sidebar__unit-list,.sidebar--loading .sidebar__header{opacity:.3;pointer-events:none}.sidebar__header{display:flex;align-items:center;padding:var(--spacing-lg, 24px) var(--spacing-md, 16px) var(--spacing-md, 16px);border-bottom:1px solid var(--sidebar-border-color, #e0e0e0);margin-bottom:var(--spacing-md, 16px)}.sidebar__toggle-btn{width:32px;height:32px;border:none;background:none;cursor:pointer;border-radius:var(--border-radius-sm, 4px);display:flex;align-items:center;justify-content:center;color:var(--sidebar-text-color, #333333);margin-right:var(--spacing-sm, 8px)}.sidebar__toggle-btn:hover{background-color:var(--sidebar-hover-bg, rgba(0, 0, 0, .05))}.sidebar__course-info{flex:1}.sidebar__course-title{font-size:var(--font-size-lg, 16px);font-weight:var(--font-weight-bold, 600);color:var(--sidebar-text-color, #333333);margin:0 0 var(--spacing-xs, 4px) 0}.sidebar__course-level{font-size:var(--font-size-sm, 12px);color:var(--sidebar-text-secondary, #666666)}.sidebar__content{flex:1;padding:0 var(--spacing-md, 16px)}.sidebar__unit-list{list-style:none;padding:0;margin:0}.sidebar__unit-item{margin-bottom:var(--spacing-xs, 4px);border-radius:var(--border-radius-sm, 4px);cursor:pointer;transition:background-color var(--transition-fast, .15s ease-in-out);padding:var(--spacing-sm, 8px) var(--spacing-md, 16px)}.sidebar__unit-item:hover{background-color:var(--sidebar-hover-bg, rgba(0, 0, 0, .03))}.sidebar__unit-item--active{background-color:var(--sidebar-active-bg, #e3f2fd);border-left:3px solid var(--sidebar-active-border, #1865f2);font-weight:var(--font-weight-medium, 500)}.sidebar__unit-item--completed{opacity:.8}.sidebar__unit-item--in-progress{font-weight:var(--font-weight-medium, 500)}.sidebar__unit-item--not-started{opacity:.6}.sidebar__unit-item__content{display:flex;align-items:center;margin-bottom:var(--spacing-xs, 4px)}.sidebar__unit-item__icon{width:20px;height:20px;margin-right:var(--spacing-sm, 8px);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-md, 14px)}.sidebar__unit-item__title{flex:1;font-size:var(--font-size-md, 14px);color:var(--sidebar-text-color, #333333);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sidebar__unit-item__progress{display:flex;align-items:center;gap:var(--spacing-sm, 8px);margin-top:var(--spacing-xs, 4px)}.progress-percentage{font-size:var(--font-size-sm, 12px);color:var(--sidebar-text-secondary, #666666);min-width:30px;text-align:right}.sidebar__loading,.sidebar__error,.sidebar__empty{padding:var(--spacing-xl, 32px) var(--spacing-md, 16px);text-align:center;color:var(--sidebar-text-secondary, #666666);font-size:var(--font-size-md, 14px)}.sidebar__error{color:var(--sidebar-error-color, #dc3545)}@media (max-width: 600px){.sidebar{position:fixed;top:0;left:0;height:100vh;z-index:1000;transform:translate(-100%)}.sidebar--expanded{transform:translate(0)}}.sidebar--collapsed .sidebar__course-info,.sidebar--collapsed .sidebar__unit-item__title,.sidebar--collapsed .sidebar__unit-item__progress{display:none}.sidebar--collapsed .sidebar__header{justify-content:center;padding:var(--spacing-md, 16px)}.sidebar--collapsed .sidebar__toggle-btn{margin-right:0}.sidebar--collapsed .sidebar__unit-item{display:flex;justify-content:center;padding:var(--spacing-sm, 8px)}.sidebar--collapsed .sidebar__unit-item__content{margin-bottom:0}.submenu-container{position:relative;display:inline-block}.submenu-trigger{cursor:pointer}.submenu-panel{position:absolute;z-index:1000;background-color:var(--submenu-background-color, #fff);border:var(--submenu-border, 1px solid #ddd);border-radius:var(--submenu-border-radius, 4px);box-shadow:var(--submenu-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:var(--submenu-padding, 8px 0);min-width:var(--submenu-min-width, 160px);opacity:0;visibility:hidden;transform:translateY(var(--submenu-transform-y, -10px));transition:opacity var(--submenu-transition-duration, .2s) ease-out,transform var(--submenu-transition-duration, .2s) ease-out,visibility var(--submenu-transition-duration, .2s) ease-out;display:flex;flex-direction:column;gap:var(--submenu-item-gap, 4px)}.submenu-panel.is-open{opacity:1;visibility:visible;transform:translateY(0)}.submenu-panel.position-bottom{top:100%;left:0;transform:translateY(var(--submenu-transform-y-bottom, 10px))}.submenu-panel.position-bottom.alignment-end{left:auto;right:0}.submenu-panel.position-top{bottom:100%;left:0;transform:translateY(var(--submenu-transform-y-top, -10px))}.submenu-item{display:flex;align-items:center;padding:var(--submenu-item-padding, 8px 16px);color:var(--submenu-item-color, #333);font-size:var(--submenu-item-font-size, 14px);cursor:pointer;text-decoration:none;white-space:nowrap;transition:background-color var(--submenu-item-transition-duration, .15s) ease-in-out,color var(--submenu-item-transition-duration, .15s) ease-in-out}.submenu-item:hover,.submenu-item.is-active{background-color:var(--submenu-item-hover-bg-color, #f0f0f0);color:var(--submenu-item-hover-color, #000)}.submenu-item.is-disabled{color:var(--submenu-item-disabled-color, #999);cursor:not-allowed;opacity:.6}.submenu-item-icon{margin-right:var(--submenu-item-icon-margin-right, 8px)}.user-profile-container{display:inline-flex;align-items:center;cursor:pointer;position:relative}.user-profile-trigger{display:flex;align-items:center;gap:var(--spacing-sm, 8px);padding:var(--spacing-xs, 4px) var(--spacing-sm, 8px);border-radius:var(--border-radius-md, 6px);transition:background-color var(--transition-duration-fast, .2s) ease}.user-profile-trigger:hover{background-color:var(--color-background-hover, #f5f5f5)}.user-name{font-weight:var(--font-weight-medium, 500);color:var(--color-text-primary, #333);font-size:var(--font-size-md, 14px);line-height:1.4}.user-profile-container.is-loading .user-profile-trigger{opacity:.7;pointer-events:none}.user-profile-container.has-error .user-profile-trigger{border:1px solid var(--color-error, #dc3545)}.user-profile-loading,.user-profile-error{padding:var(--spacing-sm, 8px) var(--spacing-md, 12px);border-radius:var(--border-radius-md, 6px);font-size:var(--font-size-sm, 12px);line-height:1.4;text-align:center}.user-profile-loading{background-color:var(--color-background-muted, #f8f9fa);color:var(--color-text-muted, #6c757d);min-width:80px}.user-profile-error{background-color:var(--color-error-bg, #f8d7da);color:var(--color-error, #721c24);border:1px solid var(--color-error-border, #f5c6cb);min-width:120px}@media (max-width: 768px){.user-profile-trigger{padding:var(--spacing-xs, 4px);gap:var(--spacing-xs, 4px)}.user-name{font-size:var(--font-size-sm, 12px);display:none}.user-profile-loading,.user-profile-error{font-size:var(--font-size-xs, 10px);padding:var(--spacing-xs, 4px) var(--spacing-sm, 8px)}}@media (min-width: 769px){.user-name{display:inline}}[data-theme=dark] .user-profile-trigger:hover{background-color:var(--color-background-hover-dark, #2d2d2d)}[data-theme=dark] .user-name{color:var(--color-text-primary-dark, #ffffff)}[data-theme=dark] .user-profile-loading{background-color:var(--color-background-muted-dark, #2d2d2d);color:var(--color-text-muted-dark, #a0a0a0)}@media (prefers-contrast: high){.user-profile-trigger:hover{background-color:var(--color-background-hover-high-contrast, #000000);outline:2px solid var(--color-border-high-contrast, #ffffff)}.user-name{font-weight:var(--font-weight-bold, 700)}}@media (prefers-reduced-motion: reduce){.user-profile-trigger,.submenu-panel{transition:none}}.user-profile-trigger:focus-visible{outline:2px solid var(--color-focus-ring, #007bff);outline-offset:2px}.user-profile-container:has(.submenu-item.is-disabled){cursor:not-allowed}.user-profile-container:has(.submenu-item.is-disabled) .user-profile-trigger:hover{background-color:transparent}.mathwiz-header{--header-height: 64px;--header-bg: linear-gradient(to right, #8b5cf6, #ec4899, #ef4444);--header-color: white;--header-shadow: 0 2px 4px rgba(0, 0, 0, .1);height:var(--header-height);background:var(--header-bg);color:var(--header-color);box-shadow:var(--header-shadow);position:sticky;top:0;z-index:1000;width:100%}.mathwiz-header--primary{--header-bg: linear-gradient(to right, #006FEE, #005BC4)}.mathwiz-header--secondary{--header-bg: linear-gradient(to right, #7828C8, #5B21B6)}.mathwiz-header--gradient{--header-bg: linear-gradient(to right, #8b5cf6, #ec4899, #ef4444)}.mathwiz-header--solid{--header-bg: var(--custom-bg, #f4f4f5);--header-color: var(--custom-color, #18181b)}.mathwiz-header--bordered{--header-bg: transparent;--header-color: #18181b;border-bottom:1px solid #e4e4e7;box-shadow:none}.mathwiz-header--color-primary{--header-bg: #006FEE;--header-color: white}.mathwiz-header--color-success{--header-bg: #17C964;--header-color: white}.mathwiz-header--color-warning{--header-bg: #F5A524;--header-color: white}.mathwiz-header--color-danger{--header-bg: #F31260;--header-color: white}.mathwiz-header .header-content{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 1.5rem;max-width:1280px;margin:0 auto;width:100%}.mathwiz-header .header-section{flex:1;display:flex;align-items:center}.mathwiz-header .header-section.left{justify-content:flex-start}.mathwiz-header .header-section.center{justify-content:center;text-align:center}.mathwiz-header .header-section.right{justify-content:flex-end}.mathwiz-header .logo{font-size:var(--logo-font-size, 1.5rem);font-weight:var(--logo-font-weight, bold);text-decoration:none;transition:opacity .2s ease;color:var(--logo-color, var(--header-color))!important}.mathwiz-header .logo:hover{opacity:.8}.mathwiz-header .logo--sm{--logo-font-size: 1.25rem}.mathwiz-header .logo--md{--logo-font-size: 1.5rem}.mathwiz-header .logo--lg{--logo-font-size: 1.75rem}.mathwiz-header .logo--xl{--logo-font-size: 2rem}.explore-button{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:6px;font-size:.875rem;font-weight:500;transition:all .2s ease;background:var(--explore-bg, transparent);border:var(--explore-border, none);color:var(--explore-color, var(--header-color))!important;cursor:pointer}.explore-button--solid{--explore-bg: var(--explore-color, #006FEE);--explore-color: white}.explore-button--bordered{--explore-bg: transparent;--explore-border: 1px solid var(--explore-color, #006FEE);--explore-color: var(--explore-color, #006FEE)}.explore-button--light{--explore-bg: var(--explore-color-light, rgba(0, 111, 238, .1));--explore-color: var(--explore-color, #006FEE)}.explore-button--flat{--explore-bg: transparent;--explore-color: var(--explore-color, #006FEE)}.explore-button--faded{--explore-bg: var(--explore-color-faded, rgba(0, 111, 238, .05));--explore-color: var(--explore-color, #006FEE)}.explore-button--shadow{--explore-bg: var(--explore-color, #006FEE);--explore-color: white;box-shadow:0 2px 4px #006fee4d}.explore-button--color-primary{--explore-color: #006FEE;--explore-color-light: rgba(0, 111, 238, .1);--explore-color-faded: rgba(0, 111, 238, .05)}.explore-button--color-success{--explore-color: #17C964;--explore-color-light: rgba(23, 201, 100, .1);--explore-color-faded: rgba(23, 201, 100, .05)}.explore-button--color-warning{--explore-color: #F5A524;--explore-color-light: rgba(245, 165, 36, .1);--explore-color-faded: rgba(245, 165, 36, .05)}.explore-button--color-danger{--explore-color: #F31260;--explore-color-light: rgba(243, 18, 96, .1);--explore-color-faded: rgba(243, 18, 96, .05)}.explore-button:hover{background-color:var(--explore-bg-hover, rgba(255, 255, 255, .1));color:var(--explore-color-hover, var(--explore-color))}.explore-icon{font-size:1.25rem}.explore-text{font-weight:500}.explore-menu-item{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;cursor:pointer;transition:background-color .15s ease,color .15s ease;min-width:200px}.explore-menu-item:hover{background-color:var(--hover-bg, #e9ecef);color:var(--accent-color, #4361ee)}.explore-item-label{font-weight:500;flex:1}.explore-item-status{font-size:.75rem;font-weight:500;padding:.25rem .5rem;border-radius:9999px;margin-left:.5rem}.status-new{background-color:var(--success-color, #10b981);color:#fff}.status-progress{color:var(--accent-color, #4361ee)}.status-进行中{background-color:var(--warning-color, #f59e0b);color:#fff}.status-2{background-color:var(--accent-light, #e6f2ff);color:var(--accent-color, #4361ee)}@media (max-width: 768px){.mathwiz-header .header-content{padding:0 1rem}.explore-text{display:none}.explore-button{padding:.5rem}.mathwiz-header .logo{font-size:1.25rem}}@media (max-width: 480px){.mathwiz-header .header-content{padding:0 .75rem}.explore-button{min-width:auto}}.mathwiz-header:focus-within{outline:2px solid var(--accent-color, #4361ee);outline-offset:2px}.explore-button:focus{outline:2px solid var(--accent-color, #4361ee);outline-offset:2px}@media (prefers-contrast: high){.mathwiz-header{border-bottom:2px solid white}.explore-button{border:1px solid currentColor}}.mathwiz-header .user-name{color:#fff!important}.mathwiz-header .user-profile-trigger:hover{background-color:#ffffff1a!important;opacity:.8}@media (prefers-reduced-motion: reduce){.mathwiz-header .logo,.explore-button,.explore-menu-item{transition:none}}._dashboardLayout_10wqn_5{display:flex;flex-direction:column;gap:24px;height:100%}._upperSection_10wqn_19{flex:3;display:grid;grid-template-columns:1fr 1fr;gap:24px}._lowerSection_10wqn_33{flex:2;display:flex;flex-direction:column;gap:16px;padding-top:24px;border-top:1px solid #e2e8f0}._radarChartArea_10wqn_51{position:relative;height:320px;display:flex;align-items:center;justify-content:center}@media (max-width: 768px){._upperSection_10wqn_19{grid-template-columns:1fr;gap:16px}._dashboardLayout_10wqn_5{gap:16px}}._animate-fade-in_10wqn_93{animation:_fadeIn_10wqn_1 .6s ease-out}@keyframes _fadeIn_10wqn_1{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.grade-unit-browser-page{display:grid;grid-template-areas:"header header" "sidebar content";grid-template-rows:auto 1fr;grid-template-columns:300px 1fr;min-height:100vh;background-color:var(--page-background, #f8fafc);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.grade-unit-browser-page--sidebar-collapsed{grid-template-columns:60px 1fr}.header-area{grid-area:header;position:sticky;top:0;z-index:100;background:#fff;box-shadow:0 1px 3px #0000001a;width:100%}.sidebar-area{grid-area:sidebar;background:#fff;border-right:1px solid var(--border-color, #e2e8f0);overflow-y:auto;height:100vh;position:sticky;top:0}.content-area{grid-area:content;padding:24px;overflow-y:auto;overflow-x:hidden;background:#fff;min-height:calc(100vh - 80px);width:100%;min-width:0;max-width:100%;box-sizing:border-box}.content-area h1,.content-area h2,.content-area h3,.content-area h4,.content-area h5,.content-area h6,.content-area p,.content-area div,.content-area span{max-width:100%;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;white-space:normal;box-sizing:border-box}.loading-spinner{display:flex;justify-content:center;align-items:center;height:200px;color:var(--text-secondary, #64748b);font-size:16px}.loading-spinner:before{content:"";width:20px;height:20px;border:2px solid var(--border-color, #e2e8f0);border-top:2px solid var(--primary-color, #3b82f6);border-radius:50%;animation:spin 1s linear infinite;margin-right:12px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.error-message{text-align:center;padding:40px 20px;color:var(--error-color, #dc2626);background:var(--error-bg, #fef2f2);border:1px solid var(--error-border, #fecaca);border-radius:8px;margin:20px}.retry-button{display:block;margin:20px auto;padding:10px 20px;background:var(--primary-color, #3b82f6);color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:14px;transition:background-color .2s}.retry-button:hover{background:var(--primary-hover, #2563eb)}.empty-state{text-align:center;padding:60px 20px;color:var(--text-secondary, #64748b)}.empty-state h3{margin:0 0 8px;font-size:18px;font-weight:600}.empty-state p{margin:0;font-size:14px}@media (max-width: 768px){.grade-unit-browser-page{grid-template-areas:"header" "content";grid-template-columns:1fr}.sidebar-area{display:none}.content-area{padding:16px;min-height:calc(100vh - 60px)}.grade-unit-browser-page.sidebar-open{grid-template-areas:"header" "sidebar" "content"}.grade-unit-browser-page.sidebar-open .sidebar-area{display:block;height:auto;position:relative;border-right:none;border-bottom:1px solid var(--border-color, #e2e8f0)}}@media (max-width: 480px){.content-area{padding:12px}.error-message{margin:10px;padding:20px 16px}.retry-button{margin:10px auto;padding:8px 16px;font-size:13px}}@media (prefers-color-scheme: dark){.grade-unit-browser-page{background-color:var(--page-background-dark, #0f172a);color:var(--text-primary-dark, #f1f5f9)}.header-area,.sidebar-area,.content-area{background:var(--surface-dark, #1e293b)}.sidebar-area{border-right-color:var(--border-color-dark, #334155)}.error-message{color:var(--error-color-dark, #f87171);background:var(--error-bg-dark, #7f1d1d);border-color:var(--error-border-dark, #b91c1c)}}.grade-unit-browser-page:focus{outline:2px solid var(--focus-ring, #3b82f6);outline-offset:2px}.retry-button:focus{outline:2px solid var(--focus-ring, #3b82f6);outline-offset:2px}@media (prefers-contrast: high){.grade-unit-browser-page{border:1px solid black}.sidebar-area{border-right:2px solid black}.retry-button{border:2px solid black}}')),document.head.appendChild(e)}}catch(r){console.error("vite-plugin-css-injected-by-js",r)}})();
|
|
2
|
+
(function(E,A){typeof exports=="object"&&typeof module<"u"?A(exports,require("react"),require("@heroui/progress"),require("@heroui/card"),require("@heroui/react")):typeof define=="function"&&define.amd?define(["exports","react","@heroui/progress","@heroui/card","@heroui/react"],A):(E=typeof globalThis<"u"?globalThis:E||self,A(E.MathwizUIComponents={},E.React,E.progress,E.card,E.react))})(this,(function(E,A,Wn,Xe,Se){"use strict";var je={exports:{}},xe={};/**
|
|
2
3
|
* @license React
|
|
3
4
|
* react-jsx-runtime.production.min.js
|
|
4
5
|
*
|
|
@@ -6,7 +7,7 @@
|
|
|
6
7
|
*
|
|
7
8
|
* This source code is licensed under the MIT license found in the
|
|
8
9
|
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var
|
|
10
|
+
*/var Et;function Jn(){if(Et)return xe;Et=1;var e=A,t=Symbol.for("react.element"),n=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,s=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};function o(l,m,f){var u,h={},w=null,k=null;f!==void 0&&(w=""+f),m.key!==void 0&&(w=""+m.key),m.ref!==void 0&&(k=m.ref);for(u in m)r.call(m,u)&&!i.hasOwnProperty(u)&&(h[u]=m[u]);if(l&&l.defaultProps)for(u in m=l.defaultProps,m)h[u]===void 0&&(h[u]=m[u]);return{$$typeof:t,type:l,key:w,ref:k,props:h,_owner:s.current}}return xe.Fragment=n,xe.jsx=o,xe.jsxs=o,xe}var ve={};/**
|
|
10
11
|
* @license React
|
|
11
12
|
* react-jsx-runtime.development.js
|
|
12
13
|
*
|
|
@@ -14,58 +15,58 @@
|
|
|
14
15
|
*
|
|
15
16
|
* This source code is licensed under the MIT license found in the
|
|
16
17
|
* LICENSE file in the root directory of this source tree.
|
|
17
|
-
*/var
|
|
18
|
-
`+
|
|
19
|
-
`),
|
|
20
|
-
`)
|
|
21
|
-
`+
|
|
18
|
+
*/var St;function Kn(){return St||(St=1,process.env.NODE_ENV!=="production"&&(function(){var e=A,t=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),l=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),u=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),k=Symbol.for("react.offscreen"),p=Symbol.iterator,y="@@iterator";function g(a){if(a===null||typeof a!="object")return null;var _=p&&a[p]||a[y];return typeof _=="function"?_:null}var S=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function R(a){{for(var _=arguments.length,b=new Array(_>1?_-1:0),v=1;v<_;v++)b[v-1]=arguments[v];N("error",a,b)}}function N(a,_,b){{var v=S.ReactDebugCurrentFrame,P=v.getStackAddendum();P!==""&&(_+="%s",b=b.concat([P]));var $=b.map(function(j){return String(j)});$.unshift("Warning: "+_),Function.prototype.apply.call(console[a],console,$)}}var L=!1,T=!1,G=!1,x=!1,ee=!1,I;I=Symbol.for("react.module.reference");function F(a){return!!(typeof a=="string"||typeof a=="function"||a===r||a===i||ee||a===s||a===f||a===u||x||a===k||L||T||G||typeof a=="object"&&a!==null&&(a.$$typeof===w||a.$$typeof===h||a.$$typeof===o||a.$$typeof===l||a.$$typeof===m||a.$$typeof===I||a.getModuleId!==void 0))}function W(a,_,b){var v=a.displayName;if(v)return v;var P=_.displayName||_.name||"";return P!==""?b+"("+P+")":b}function M(a){return a.displayName||"Context"}function O(a){if(a==null)return null;if(typeof a.tag=="number"&&R("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof a=="function")return a.displayName||a.name||null;if(typeof a=="string")return a;switch(a){case r:return"Fragment";case n:return"Portal";case i:return"Profiler";case s:return"StrictMode";case f:return"Suspense";case u:return"SuspenseList"}if(typeof a=="object")switch(a.$$typeof){case l:var _=a;return M(_)+".Consumer";case o:var b=a;return M(b._context)+".Provider";case m:return W(a,a.render,"ForwardRef");case h:var v=a.displayName||null;return v!==null?v:O(a.type)||"Memo";case w:{var P=a,$=P._payload,j=P._init;try{return O(j($))}catch{return null}}}return null}var U=Object.assign,q=0,J,fe,te,me,be,ne,ie;function le(){}le.__reactDisabledLog=!0;function ye(){{if(q===0){J=console.log,fe=console.info,te=console.warn,me=console.error,be=console.group,ne=console.groupCollapsed,ie=console.groupEnd;var a={configurable:!0,enumerable:!0,value:le,writable:!0};Object.defineProperties(console,{info:a,log:a,warn:a,error:a,group:a,groupCollapsed:a,groupEnd:a})}q++}}function Ve(){{if(q--,q===0){var a={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:U({},a,{value:J}),info:U({},a,{value:fe}),warn:U({},a,{value:te}),error:U({},a,{value:me}),group:U({},a,{value:be}),groupCollapsed:U({},a,{value:ne}),groupEnd:U({},a,{value:ie})})}q<0&&R("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var mt=S.ReactCurrentDispatcher,ht;function We(a,_,b){{if(ht===void 0)try{throw Error()}catch(P){var v=P.stack.trim().match(/\n( *(at )?)/);ht=v&&v[1]||""}return`
|
|
19
|
+
`+ht+a}}var pt=!1,Je;{var Eo=typeof WeakMap=="function"?WeakMap:Map;Je=new Eo}function Un(a,_){if(!a||pt)return"";{var b=Je.get(a);if(b!==void 0)return b}var v;pt=!0;var P=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var $;$=mt.current,mt.current=null,ye();try{if(_){var j=function(){throw Error()};if(Object.defineProperty(j.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(j,[])}catch(Q){v=Q}Reflect.construct(a,[],j)}else{try{j.call()}catch(Q){v=Q}a.call(j.prototype)}}else{try{throw Error()}catch(Q){v=Q}a()}}catch(Q){if(Q&&v&&typeof Q.stack=="string"){for(var D=Q.stack.split(`
|
|
20
|
+
`),Y=v.stack.split(`
|
|
21
|
+
`),H=D.length-1,V=Y.length-1;H>=1&&V>=0&&D[H]!==Y[V];)V--;for(;H>=1&&V>=0;H--,V--)if(D[H]!==Y[V]){if(H!==1||V!==1)do if(H--,V--,V<0||D[H]!==Y[V]){var re=`
|
|
22
|
+
`+D[H].replace(" at new "," at ");return a.displayName&&re.includes("<anonymous>")&&(re=re.replace("<anonymous>",a.displayName)),typeof a=="function"&&Je.set(a,re),re}while(H>=1&&V>=0);break}}}finally{pt=!1,mt.current=$,Ve(),Error.prepareStackTrace=P}var Ee=a?a.displayName||a.name:"",he=Ee?We(Ee):"";return typeof a=="function"&&Je.set(a,he),he}function So(a,_,b){return Un(a,!1)}function xo(a){var _=a.prototype;return!!(_&&_.isReactComponent)}function Ke(a,_,b){if(a==null)return"";if(typeof a=="function")return Un(a,xo(a));if(typeof a=="string")return We(a);switch(a){case f:return We("Suspense");case u:return We("SuspenseList")}if(typeof a=="object")switch(a.$$typeof){case m:return So(a.render);case h:return Ke(a.type,_,b);case w:{var v=a,P=v._payload,$=v._init;try{return Ke($(P),_,b)}catch{}}}return""}var Oe=Object.prototype.hasOwnProperty,On={},jn=S.ReactDebugCurrentFrame;function Ye(a){if(a){var _=a._owner,b=Ke(a.type,a._source,_?_.type:null);jn.setExtraStackFrame(b)}else jn.setExtraStackFrame(null)}function vo(a,_,b,v,P){{var $=Function.call.bind(Oe);for(var j in a)if($(a,j)){var D=void 0;try{if(typeof a[j]!="function"){var Y=Error((v||"React class")+": "+b+" type `"+j+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof a[j]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw Y.name="Invariant Violation",Y}D=a[j](_,j,v,b,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(H){D=H}D&&!(D instanceof Error)&&(Ye(P),R("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",v||"React class",b,j,typeof D),Ye(null)),D instanceof Error&&!(D.message in On)&&(On[D.message]=!0,Ye(P),R("Failed %s type: %s",b,D.message),Ye(null))}}}var Ao=Array.isArray;function gt(a){return Ao(a)}function Co(a){{var _=typeof Symbol=="function"&&Symbol.toStringTag,b=_&&a[Symbol.toStringTag]||a.constructor.name||"Object";return b}}function Ro(a){try{return Tn(a),!1}catch{return!0}}function Tn(a){return""+a}function Pn(a){if(Ro(a))return R("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Co(a)),Tn(a)}var Ln=S.ReactCurrentOwner,ko={key:!0,ref:!0,__self:!0,__source:!0},In,Mn;function No(a){if(Oe.call(a,"ref")){var _=Object.getOwnPropertyDescriptor(a,"ref").get;if(_&&_.isReactWarning)return!1}return a.ref!==void 0}function Do(a){if(Oe.call(a,"key")){var _=Object.getOwnPropertyDescriptor(a,"key").get;if(_&&_.isReactWarning)return!1}return a.key!==void 0}function Uo(a,_){typeof a.ref=="string"&&Ln.current}function Oo(a,_){{var b=function(){In||(In=!0,R("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",_))};b.isReactWarning=!0,Object.defineProperty(a,"key",{get:b,configurable:!0})}}function jo(a,_){{var b=function(){Mn||(Mn=!0,R("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",_))};b.isReactWarning=!0,Object.defineProperty(a,"ref",{get:b,configurable:!0})}}var To=function(a,_,b,v,P,$,j){var D={$$typeof:t,type:a,key:_,ref:b,props:j,_owner:$};return D._store={},Object.defineProperty(D._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(D,"_self",{configurable:!1,enumerable:!1,writable:!1,value:v}),Object.defineProperty(D,"_source",{configurable:!1,enumerable:!1,writable:!1,value:P}),Object.freeze&&(Object.freeze(D.props),Object.freeze(D)),D};function Po(a,_,b,v,P){{var $,j={},D=null,Y=null;b!==void 0&&(Pn(b),D=""+b),Do(_)&&(Pn(_.key),D=""+_.key),No(_)&&(Y=_.ref,Uo(_,P));for($ in _)Oe.call(_,$)&&!ko.hasOwnProperty($)&&(j[$]=_[$]);if(a&&a.defaultProps){var H=a.defaultProps;for($ in H)j[$]===void 0&&(j[$]=H[$])}if(D||Y){var V=typeof a=="function"?a.displayName||a.name||"Unknown":a;D&&Oo(j,V),Y&&jo(j,V)}return To(a,D,Y,P,v,Ln.current,j)}}var _t=S.ReactCurrentOwner,$n=S.ReactDebugCurrentFrame;function we(a){if(a){var _=a._owner,b=Ke(a.type,a._source,_?_.type:null);$n.setExtraStackFrame(b)}else $n.setExtraStackFrame(null)}var bt;bt=!1;function yt(a){return typeof a=="object"&&a!==null&&a.$$typeof===t}function Fn(){{if(_t.current){var a=O(_t.current.type);if(a)return`
|
|
22
23
|
|
|
23
|
-
Check the render method of \``+a+"`."}return""}}function
|
|
24
|
+
Check the render method of \``+a+"`."}return""}}function Lo(a){return""}var Bn={};function Io(a){{var _=Fn();if(!_){var b=typeof a=="string"?a:a.displayName||a.name;b&&(_=`
|
|
24
25
|
|
|
25
|
-
Check the top-level render call using <`+b+">.")}return _}}function
|
|
26
|
+
Check the top-level render call using <`+b+">.")}return _}}function qn(a,_){{if(!a._store||a._store.validated||a.key!=null)return;a._store.validated=!0;var b=Io(_);if(Bn[b])return;Bn[b]=!0;var v="";a&&a._owner&&a._owner!==_t.current&&(v=" It was passed a child from "+O(a._owner.type)+"."),we(a),R('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',b,v),we(null)}}function zn(a,_){{if(typeof a!="object")return;if(gt(a))for(var b=0;b<a.length;b++){var v=a[b];yt(v)&&qn(v,_)}else if(yt(a))a._store&&(a._store.validated=!0);else if(a){var P=g(a);if(typeof P=="function"&&P!==a.entries)for(var $=P.call(a),j;!(j=$.next()).done;)yt(j.value)&&qn(j.value,_)}}}function Mo(a){{var _=a.type;if(_==null||typeof _=="string")return;var b;if(typeof _=="function")b=_.propTypes;else if(typeof _=="object"&&(_.$$typeof===m||_.$$typeof===h))b=_.propTypes;else return;if(b){var v=O(_);vo(b,a.props,"prop",v,a)}else if(_.PropTypes!==void 0&&!bt){bt=!0;var P=O(_);R("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",P||"Unknown")}typeof _.getDefaultProps=="function"&&!_.getDefaultProps.isReactClassApproved&&R("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function $o(a){{for(var _=Object.keys(a.props),b=0;b<_.length;b++){var v=_[b];if(v!=="children"&&v!=="key"){we(a),R("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",v),we(null);break}}a.ref!==null&&(we(a),R("Invalid attribute `ref` supplied to `React.Fragment`."),we(null))}}var Gn={};function Hn(a,_,b,v,P,$){{var j=F(a);if(!j){var D="";(a===void 0||typeof a=="object"&&a!==null&&Object.keys(a).length===0)&&(D+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var Y=Lo();Y?D+=Y:D+=Fn();var H;a===null?H="null":gt(a)?H="array":a!==void 0&&a.$$typeof===t?(H="<"+(O(a.type)||"Unknown")+" />",D=" Did you accidentally export a JSX literal instead of a component?"):H=typeof a,R("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",H,D)}var V=Po(a,_,b,P,$);if(V==null)return V;if(j){var re=_.children;if(re!==void 0)if(v)if(gt(re)){for(var Ee=0;Ee<re.length;Ee++)zn(re[Ee],a);Object.freeze&&Object.freeze(re)}else R("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else zn(re,a)}if(Oe.call(_,"key")){var he=O(a),Q=Object.keys(_).filter(function(Ho){return Ho!=="key"}),wt=Q.length>0?"{key: someKey, "+Q.join(": ..., ")+": ...}":"{key: someKey}";if(!Gn[he+wt]){var Go=Q.length>0?"{"+Q.join(": ..., ")+": ...}":"{}";R(`A props object containing a "key" prop is being spread into JSX:
|
|
26
27
|
let props = %s;
|
|
27
28
|
<%s {...props} />
|
|
28
29
|
React keys must be passed directly to JSX without using spread:
|
|
29
30
|
let props = %s;
|
|
30
|
-
<%s key={someKey} {...props} />`,
|
|
31
|
+
<%s key={someKey} {...props} />`,wt,he,Go,he),Gn[he+wt]=!0}}return a===r?$o(V):Mo(V),V}}function Fo(a,_,b){return Hn(a,_,b,!0)}function Bo(a,_,b){return Hn(a,_,b,!1)}var qo=Bo,zo=Fo;ve.Fragment=r,ve.jsx=qo,ve.jsxs=zo})()),ve}var xt;function Yn(){return xt||(xt=1,process.env.NODE_ENV==="production"?je.exports=Jn():je.exports=Kn()),je.exports}var c=Yn();const vt=({progress:e,variant:t="solid",size:n="md",radius:r="md",children:s,className:i="",loading:o,...l})=>{const f=e!==void 0?(h=>h===0?"button--primary":h===100?"button--success":"button--secondary")(e):"button--primary",u=["button",`button--${n}`,`button--${t}`,`button--radius-${r}`,f,o&&"button--loading",i].filter(Boolean).join(" ");return c.jsx("button",{type:"button",className:u,"data-progress":e,disabled:o||l.disabled,...l,children:o?"加载中...":s})};/**
|
|
31
32
|
* @license lucide-react v0.541.0 - ISC
|
|
32
33
|
*
|
|
33
34
|
* This source code is licensed under the ISC license.
|
|
34
35
|
* See the LICENSE file in the root directory of this source tree.
|
|
35
|
-
*/const
|
|
36
|
+
*/const Xn=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Zn=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase()),At=e=>{const t=Zn(e);return t.charAt(0).toUpperCase()+t.slice(1)},Ct=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim(),Qn=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0};/**
|
|
36
37
|
* @license lucide-react v0.541.0 - ISC
|
|
37
38
|
*
|
|
38
39
|
* This source code is licensed under the ISC license.
|
|
39
40
|
* See the LICENSE file in the root directory of this source tree.
|
|
40
|
-
*/var
|
|
41
|
+
*/var er={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
|
41
42
|
* @license lucide-react v0.541.0 - ISC
|
|
42
43
|
*
|
|
43
44
|
* This source code is licensed under the ISC license.
|
|
44
45
|
* See the LICENSE file in the root directory of this source tree.
|
|
45
|
-
*/const
|
|
46
|
+
*/const tr=A.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:s="",children:i,iconNode:o,...l},m)=>A.createElement("svg",{ref:m,...er,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:Ct("lucide",s),...!i&&!Qn(l)&&{"aria-hidden":"true"},...l},[...o.map(([f,u])=>A.createElement(f,u)),...Array.isArray(i)?i:[i]]));/**
|
|
46
47
|
* @license lucide-react v0.541.0 - ISC
|
|
47
48
|
*
|
|
48
49
|
* This source code is licensed under the ISC license.
|
|
49
50
|
* See the LICENSE file in the root directory of this source tree.
|
|
50
|
-
*/const
|
|
51
|
+
*/const Ze=(e,t)=>{const n=A.forwardRef(({className:r,...s},i)=>A.createElement(tr,{ref:i,iconNode:t,className:Ct(`lucide-${Xn(At(e))}`,`lucide-${e}`,r),...s}));return n.displayName=At(e),n};/**
|
|
51
52
|
* @license lucide-react v0.541.0 - ISC
|
|
52
53
|
*
|
|
53
54
|
* This source code is licensed under the ISC license.
|
|
54
55
|
* See the LICENSE file in the root directory of this source tree.
|
|
55
|
-
*/const
|
|
56
|
+
*/const nr=Ze("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/**
|
|
56
57
|
* @license lucide-react v0.541.0 - ISC
|
|
57
58
|
*
|
|
58
59
|
* This source code is licensed under the ISC license.
|
|
59
60
|
* See the LICENSE file in the root directory of this source tree.
|
|
60
|
-
*/const
|
|
61
|
+
*/const rr=Ze("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/**
|
|
61
62
|
* @license lucide-react v0.541.0 - ISC
|
|
62
63
|
*
|
|
63
64
|
* This source code is licensed under the ISC license.
|
|
64
65
|
* See the LICENSE file in the root directory of this source tree.
|
|
65
|
-
*/const ss=Ye("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),Rt=e=>e===0?"开始学习":e===100?"复习":"继续学习",rs=e=>{if(e.length===0)return 0;const t=e.reduce((n,s)=>n+s.progress,0);return Math.round(t/e.length)},os=({knowledgeItem:e,onLearnAction:t})=>{const n=()=>{t(e)};return console.log("KnowledgeCard render:",{progress:e.progress,text:Rt(e.progress)}),c.jsxs(Ke.Card,{className:"content-accordion__knowledge-card",children:[c.jsxs(Ke.CardBody,{children:[c.jsx("h3",{className:"content-accordion__knowledge-title",children:e.title}),c.jsx("p",{className:"content-accordion__knowledge-description",children:e.description})]}),c.jsxs(Ke.CardFooter,{className:"content-accordion__knowledge-actions",children:[c.jsxs("div",{className:"content-accordion__progress-container",children:[c.jsx(Jn.Progress,{value:e.progress,size:"sm","aria-label":`${e.title} 进度`,className:"content-accordion__progress-bar"}),c.jsxs("span",{className:"content-accordion__progress-text",children:[e.progress,"%"]})]}),c.jsx(St,{size:"sm",radius:"md",onClick:n,progress:e.progress,variant:e.progress===100?"light":e.progress===0?"solid":"bordered",className:"content-accordion__learn-button",children:Rt(e.progress)})]})]})},is=({lesson:e,isExpanded:t,onToggle:n,onLearnAction:s})=>{const r=()=>{n(e.id)},i=rs(e.knowledgeItems);return c.jsxs("div",{className:`content-accordion__lesson-item ${t?"content-accordion__lesson-item--expanded":""}`,children:[c.jsxs("div",{className:"content-accordion__lesson-header",onClick:r,role:"button",tabIndex:0,"aria-expanded":t,"aria-label":`${e.title},点击${t?"收起":"展开"}`,children:[c.jsxs("div",{className:"content-accordion__lesson-header-content",children:[c.jsx("h2",{className:"content-accordion__lesson-title",children:e.title}),c.jsxs("span",{className:"content-accordion__lesson-duration",children:["约 ",e.duration," 分钟"]})]}),c.jsxs("div",{className:"content-accordion__lesson-actions",children:[c.jsxs("span",{className:"content-accordion__lesson-progress",children:[i,"%"]}),t?c.jsx(ns,{className:"content-accordion__lesson-icon"}):c.jsx(ss,{className:"content-accordion__lesson-icon"})]})]}),t&&c.jsx("div",{className:"content-accordion__knowledge-list",children:e.knowledgeItems.map(o=>c.jsx(os,{knowledgeItem:o,onLearnAction:s},o.id))})]})},kt=({unit:e,activeLessonIds:t,onToggleLesson:n,onLearnAction:s,loading:r=!1,className:i="",emptyState:o})=>r?c.jsx("div",{className:"content-accordion content-accordion--loading",children:c.jsx("div",{className:"content-accordion__loading",children:"加载中..."})}):e?c.jsxs("div",{className:`content-accordion ${i}`,children:[c.jsxs("header",{className:"content-accordion__header",children:[c.jsx("h1",{className:"content-accordion__unit-title",children:e.title}),c.jsx("p",{className:"content-accordion__unit-description",children:e.description}),c.jsxs("div",{className:"content-accordion__unit-meta",children:[c.jsxs("span",{children:["总共 ",e.totalLessons," 节课"]}),c.jsx("span",{children:"•"}),c.jsxs("span",{children:["预计学习 ",e.estimatedDuration]})]})]}),c.jsx("div",{className:"content-accordion__lessons",children:e.lessons.map(l=>c.jsx(is,{lesson:l,isExpanded:t.includes(l.id),onToggle:n,onLearnAction:s},l.id))})]}):c.jsx("div",{className:"content-accordion content-accordion--empty",children:o||c.jsx("div",{className:"content-accordion__empty",children:"暂无学习内容"})}),as=e=>{switch(e){case"completed":return"success";case"in-progress":return"primary";case"not-started":default:return"default"}},Nt=({data:e,loading:t=!1,error:n=null,collapsed:s=!1,onToggleCollapse:r,activeUnitId:i=null,onUnitSelect:o,renderUnitItem:l,className:m="",unitItemClassName:f="",style:u={},unitItemStyle:h={}})=>{const x=(g,E)=>{E.preventDefault(),o?.(g)},O=()=>{r?.()},p=g=>c.jsxs("div",{className:`sidebar__unit-item ${f} ${i===g.unitId?"sidebar__unit-item--active":""} ${g.status?`sidebar__unit-item--${g.status}`:""}`,style:h,onClick:E=>x(g.unitId,E),role:"button",tabIndex:0,"aria-label":`${g.title},进度 ${g.progressPercentage}%`,children:[c.jsxs("div",{className:"sidebar__unit-item__content",children:[g.icon&&c.jsx("span",{className:"sidebar__unit-item__icon",children:g.icon}),!s&&c.jsx("span",{className:"sidebar__unit-item__title",children:g.title})]}),!s&&g.progressPercentage!==void 0&&c.jsxs("div",{className:"sidebar__unit-item__progress",children:[c.jsx(ye.Progress,{value:g.progressPercentage,size:"sm",color:as(g.status),"aria-label":`${g.title} 进度`}),c.jsxs("span",{className:"progress-percentage",children:[g.progressPercentage,"%"]})]})]},g.unitId),y=()=>t?c.jsx("div",{className:"sidebar__loading",children:"加载中..."}):n?c.jsxs("div",{className:"sidebar__error",children:["加载失败: ",n.message]}):e?c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"sidebar__header",children:[c.jsx("button",{className:"sidebar__toggle-btn",onClick:O,"aria-label":"切换侧边栏折叠状态",children:s?"→":"←"}),!s&&c.jsxs("div",{className:"sidebar__course-info",children:[c.jsx("h3",{className:"sidebar__course-title",children:e.courseTitle}),c.jsxs("span",{className:"sidebar__course-level",children:[e.courseLevel,"年级"]})]})]}),c.jsx("nav",{className:"sidebar__content",children:c.jsx("ul",{className:"sidebar__unit-list",children:e.units&&e.units.length>0?e.units.map(g=>c.jsx("li",{children:l?l(g,g):p(g)},g.unitId)):c.jsx("div",{className:"sidebar__empty",children:"暂无单元数据"})})})]}):c.jsx("div",{className:"sidebar__empty",children:"暂无课程数据"});return c.jsx("aside",{className:`sidebar ${m} ${s?"sidebar--collapsed":""} ${t?"sidebar--loading":""} ${n?"sidebar--error":""}`,style:u,"aria-label":"课程导航侧边栏",role:"complementary",children:y()})},Xe=({trigger:e,items:t,position:n="bottom",alignment:s="start",openDelay:r=300,closeDelay:i=100,onOpen:o,onClose:l,renderItem:m,itemConfig:f={},className:u,menuClassName:h,itemClassName:x})=>{const[O,p]=R.useState(!1),y=R.useRef(null),g=R.useRef(null),E=()=>{y.current&&clearTimeout(y.current),g.current&&clearTimeout(g.current)},k=()=>{E(),y.current=setTimeout(()=>{p(!0),o?.()},r)},N=()=>{E(),g.current=setTimeout(()=>{p(!1),l?.()},i)},P=w=>{!w.disabled&&w.onClick&&w.onClick(w)};R.useEffect(()=>()=>E(),[]);const A=w=>c.jsxs("div",{className:`submenu-item ${w.disabled?"is-disabled":""} ${x||""}`,onClick:()=>P(w),children:[w.icon&&c.jsx("span",{className:"submenu-item-icon",children:w.icon}),c.jsx("span",{children:w.label})]},w.id),I=()=>{const w=["submenu-panel"];return h&&w.push(h),w.push(`position-${n}`),s!=="start"&&w.push(`alignment-${s}`),O&&w.push("is-open"),w.join(" ")};return c.jsxs("div",{className:`submenu-container ${u||""}`,onMouseEnter:k,onMouseLeave:N,children:[c.jsx("div",{className:"submenu-trigger",children:e}),c.jsx("div",{className:I(),children:t.map(w=>m?m(w,f):A(w))})]})};function jt(e,t){return function(){return e.apply(t,arguments)}}const{toString:ls}=Object.prototype,{getPrototypeOf:Ze}=Object,{iterator:Ue,toStringTag:Ot}=Symbol,Te=(e=>t=>{const n=ls.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),ee=e=>(e=e.toLowerCase(),t=>Te(t)===e),Pe=e=>t=>typeof t===e,{isArray:fe}=Array,me=Pe("undefined");function ve(e){return e!==null&&!me(e)&&e.constructor!==null&&!me(e.constructor)&&K(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Ut=ee("ArrayBuffer");function cs(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Ut(e.buffer),t}const us=Pe("string"),K=Pe("function"),Tt=Pe("number"),Ee=e=>e!==null&&typeof e=="object",ds=e=>e===!0||e===!1,Ie=e=>{if(Te(e)!=="object")return!1;const t=Ze(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Ot in e)&&!(Ue in e)},fs=e=>{if(!Ee(e)||ve(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},ms=ee("Date"),ps=ee("File"),hs=ee("Blob"),gs=ee("FileList"),_s=e=>Ee(e)&&K(e.pipe),bs=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||K(e.append)&&((t=Te(e))==="formdata"||t==="object"&&K(e.toString)&&e.toString()==="[object FormData]"))},ys=ee("URLSearchParams"),[xs,ws,vs,Es]=["ReadableStream","Request","Response","Headers"].map(ee),Ss=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Se(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,r;if(typeof e!="object"&&(e=[e]),fe(e))for(s=0,r=e.length;s<r;s++)t.call(null,e[s],s,e);else{if(ve(e))return;const i=n?Object.getOwnPropertyNames(e):Object.keys(e),o=i.length;let l;for(s=0;s<o;s++)l=i[s],t.call(null,e[l],l,e)}}function Pt(e,t){if(ve(e))return null;t=t.toLowerCase();const n=Object.keys(e);let s=n.length,r;for(;s-- >0;)if(r=n[s],t===r.toLowerCase())return r;return null}const le=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,It=e=>!me(e)&&e!==le;function Qe(){const{caseless:e,skipUndefined:t}=It(this)&&this||{},n={},s=(r,i)=>{const o=e&&Pt(n,i)||i;Ie(n[o])&&Ie(r)?n[o]=Qe(n[o],r):Ie(r)?n[o]=Qe({},r):fe(r)?n[o]=r.slice():(!t||!me(r))&&(n[o]=r)};for(let r=0,i=arguments.length;r<i;r++)arguments[r]&&Se(arguments[r],s);return n}const As=(e,t,n,{allOwnKeys:s}={})=>(Se(t,(r,i)=>{n&&K(r)?e[i]=jt(r,n):e[i]=r},{allOwnKeys:s}),e),Cs=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),Rs=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},ks=(e,t,n,s)=>{let r,i,o;const l={};if(t=t||{},e==null)return t;do{for(r=Object.getOwnPropertyNames(e),i=r.length;i-- >0;)o=r[i],(!s||s(o,e,t))&&!l[o]&&(t[o]=e[o],l[o]=!0);e=n!==!1&&Ze(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Ns=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},js=e=>{if(!e)return null;if(fe(e))return e;let t=e.length;if(!Tt(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Os=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Ze(Uint8Array)),Us=(e,t)=>{const s=(e&&e[Ue]).call(e);let r;for(;(r=s.next())&&!r.done;){const i=r.value;t.call(e,i[0],i[1])}},Ts=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},Ps=ee("HTMLFormElement"),Is=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,r){return s.toUpperCase()+r}),Lt=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Ls=ee("RegExp"),Dt=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Se(n,(r,i)=>{let o;(o=t(r,i,e))!==!1&&(s[i]=o||r)}),Object.defineProperties(e,s)},Ds=e=>{Dt(e,(t,n)=>{if(K(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(K(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Ms=(e,t)=>{const n={},s=r=>{r.forEach(i=>{n[i]=!0})};return fe(e)?s(e):s(String(e).split(t)),n},Fs=()=>{},$s=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Bs(e){return!!(e&&K(e.append)&&e[Ot]==="FormData"&&e[Ue])}const qs=e=>{const t=new Array(10),n=(s,r)=>{if(Ee(s)){if(t.indexOf(s)>=0)return;if(ve(s))return s;if(!("toJSON"in s)){t[r]=s;const i=fe(s)?[]:{};return Se(s,(o,l)=>{const m=n(o,r+1);!me(m)&&(i[l]=m)}),t[r]=void 0,i}}return s};return n(e,0)},Hs=ee("AsyncFunction"),Ws=e=>e&&(Ee(e)||K(e))&&K(e.then)&&K(e.catch),Mt=((e,t)=>e?setImmediate:t?((n,s)=>(le.addEventListener("message",({source:r,data:i})=>{r===le&&i===n&&s.length&&s.shift()()},!1),r=>{s.push(r),le.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",K(le.postMessage)),zs=typeof queueMicrotask<"u"?queueMicrotask.bind(le):typeof process<"u"&&process.nextTick||Mt,d={isArray:fe,isArrayBuffer:Ut,isBuffer:ve,isFormData:bs,isArrayBufferView:cs,isString:us,isNumber:Tt,isBoolean:ds,isObject:Ee,isPlainObject:Ie,isEmptyObject:fs,isReadableStream:xs,isRequest:ws,isResponse:vs,isHeaders:Es,isUndefined:me,isDate:ms,isFile:ps,isBlob:hs,isRegExp:Ls,isFunction:K,isStream:_s,isURLSearchParams:ys,isTypedArray:Os,isFileList:gs,forEach:Se,merge:Qe,extend:As,trim:Ss,stripBOM:Cs,inherits:Rs,toFlatObject:ks,kindOf:Te,kindOfTest:ee,endsWith:Ns,toArray:js,forEachEntry:Us,matchAll:Ts,isHTMLForm:Ps,hasOwnProperty:Lt,hasOwnProp:Lt,reduceDescriptors:Dt,freezeMethods:Ds,toObjectSet:Ms,toCamelCase:Is,noop:Fs,toFiniteNumber:$s,findKey:Pt,global:le,isContextDefined:It,isSpecCompliantForm:Bs,toJSONObject:qs,isAsyncFn:Hs,isThenable:Ws,setImmediate:Mt,asap:zs,isIterable:e=>e!=null&&K(e[Ue])};function C(e,t,n,s,r){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),s&&(this.request=s),r&&(this.response=r,this.status=r.status?r.status:null)}d.inherits(C,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:d.toJSONObject(this.config),code:this.code,status:this.status}}});const Ft=C.prototype,$t={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{$t[e]={value:e}}),Object.defineProperties(C,$t),Object.defineProperty(Ft,"isAxiosError",{value:!0}),C.from=(e,t,n,s,r,i)=>{const o=Object.create(Ft);d.toFlatObject(e,o,function(u){return u!==Error.prototype},f=>f!=="isAxiosError");const l=e&&e.message?e.message:"Error",m=t==null&&e?e.code:t;return C.call(o,l,m,n,s,r),e&&o.cause==null&&Object.defineProperty(o,"cause",{value:e,configurable:!0}),o.name=e&&e.name||"Error",i&&Object.assign(o,i),o};const Js=null;function et(e){return d.isPlainObject(e)||d.isArray(e)}function Bt(e){return d.endsWith(e,"[]")?e.slice(0,-2):e}function qt(e,t,n){return e?e.concat(t).map(function(r,i){return r=Bt(r),!n&&i?"["+r+"]":r}).join(n?".":""):t}function Gs(e){return d.isArray(e)&&!e.some(et)}const Vs=d.toFlatObject(d,{},null,function(t){return/^is[A-Z]/.test(t)});function Le(e,t,n){if(!d.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=d.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,g){return!d.isUndefined(g[y])});const s=n.metaTokens,r=n.visitor||u,i=n.dots,o=n.indexes,m=(n.Blob||typeof Blob<"u"&&Blob)&&d.isSpecCompliantForm(t);if(!d.isFunction(r))throw new TypeError("visitor must be a function");function f(p){if(p===null)return"";if(d.isDate(p))return p.toISOString();if(d.isBoolean(p))return p.toString();if(!m&&d.isBlob(p))throw new C("Blob is not supported. Use a Buffer instead.");return d.isArrayBuffer(p)||d.isTypedArray(p)?m&&typeof Blob=="function"?new Blob([p]):Buffer.from(p):p}function u(p,y,g){let E=p;if(p&&!g&&typeof p=="object"){if(d.endsWith(y,"{}"))y=s?y:y.slice(0,-2),p=JSON.stringify(p);else if(d.isArray(p)&&Gs(p)||(d.isFileList(p)||d.endsWith(y,"[]"))&&(E=d.toArray(p)))return y=Bt(y),E.forEach(function(N,P){!(d.isUndefined(N)||N===null)&&t.append(o===!0?qt([y],P,i):o===null?y:y+"[]",f(N))}),!1}return et(p)?!0:(t.append(qt(g,y,i),f(p)),!1)}const h=[],x=Object.assign(Vs,{defaultVisitor:u,convertValue:f,isVisitable:et});function O(p,y){if(!d.isUndefined(p)){if(h.indexOf(p)!==-1)throw Error("Circular reference detected in "+y.join("."));h.push(p),d.forEach(p,function(E,k){(!(d.isUndefined(E)||E===null)&&r.call(t,E,d.isString(k)?k.trim():k,y,x))===!0&&O(E,y?y.concat(k):[k])}),h.pop()}}if(!d.isObject(e))throw new TypeError("data must be an object");return O(e),t}function Ht(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function tt(e,t){this._pairs=[],e&&Le(e,this,t)}const Wt=tt.prototype;Wt.append=function(t,n){this._pairs.push([t,n])},Wt.toString=function(t){const n=t?function(s){return t.call(this,s,Ht)}:Ht;return this._pairs.map(function(r){return n(r[0])+"="+n(r[1])},"").join("&")};function Ks(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function zt(e,t,n){if(!t)return e;const s=n&&n.encode||Ks;d.isFunction(n)&&(n={serialize:n});const r=n&&n.serialize;let i;if(r?i=r(t,n):i=d.isURLSearchParams(t)?t.toString():new tt(t,n).toString(s),i){const o=e.indexOf("#");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Jt{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){d.forEach(this.handlers,function(s){s!==null&&t(s)})}}const Gt={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ys={isBrowser:!0,classes:{URLSearchParams:typeof URLSearchParams<"u"?URLSearchParams:tt,FormData:typeof FormData<"u"?FormData:null,Blob:typeof Blob<"u"?Blob:null},protocols:["http","https","file","blob","url","data"]},nt=typeof window<"u"&&typeof document<"u",st=typeof navigator=="object"&&navigator||void 0,Xs=nt&&(!st||["ReactNative","NativeScript","NS"].indexOf(st.product)<0),Zs=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Qs=nt&&window.location.href||"http://localhost",W={...Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:nt,hasStandardBrowserEnv:Xs,hasStandardBrowserWebWorkerEnv:Zs,navigator:st,origin:Qs},Symbol.toStringTag,{value:"Module"})),...Ys};function er(e,t){return Le(e,new W.classes.URLSearchParams,{visitor:function(n,s,r,i){return W.isNode&&d.isBuffer(n)?(this.append(s,n.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function tr(e){return d.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function nr(e){const t={},n=Object.keys(e);let s;const r=n.length;let i;for(s=0;s<r;s++)i=n[s],t[i]=e[i];return t}function Vt(e){function t(n,s,r,i){let o=n[i++];if(o==="__proto__")return!0;const l=Number.isFinite(+o),m=i>=n.length;return o=!o&&d.isArray(r)?r.length:o,m?(d.hasOwnProp(r,o)?r[o]=[r[o],s]:r[o]=s,!l):((!r[o]||!d.isObject(r[o]))&&(r[o]=[]),t(n,s,r[o],i)&&d.isArray(r[o])&&(r[o]=nr(r[o])),!l)}if(d.isFormData(e)&&d.isFunction(e.entries)){const n={};return d.forEachEntry(e,(s,r)=>{t(tr(s),r,n,0)}),n}return null}function sr(e,t,n){if(d.isString(e))try{return(t||JSON.parse)(e),d.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Ae={transitional:Gt,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",r=s.indexOf("application/json")>-1,i=d.isObject(t);if(i&&d.isHTMLForm(t)&&(t=new FormData(t)),d.isFormData(t))return r?JSON.stringify(Vt(t)):t;if(d.isArrayBuffer(t)||d.isBuffer(t)||d.isStream(t)||d.isFile(t)||d.isBlob(t)||d.isReadableStream(t))return t;if(d.isArrayBufferView(t))return t.buffer;if(d.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(i){if(s.indexOf("application/x-www-form-urlencoded")>-1)return er(t,this.formSerializer).toString();if((l=d.isFileList(t))||s.indexOf("multipart/form-data")>-1){const m=this.env&&this.env.FormData;return Le(l?{"files[]":t}:t,m&&new m,this.formSerializer)}}return i||r?(n.setContentType("application/json",!1),sr(t)):t}],transformResponse:[function(t){const n=this.transitional||Ae.transitional,s=n&&n.forcedJSONParsing,r=this.responseType==="json";if(d.isResponse(t)||d.isReadableStream(t))return t;if(t&&d.isString(t)&&(s&&!this.responseType||r)){const o=!(n&&n.silentJSONParsing)&&r;try{return JSON.parse(t,this.parseReviver)}catch(l){if(o)throw l.name==="SyntaxError"?C.from(l,C.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:W.classes.FormData,Blob:W.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};d.forEach(["delete","get","head","post","put","patch"],e=>{Ae.headers[e]={}});const rr=d.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),or=e=>{const t={};let n,s,r;return e&&e.split(`
|
|
66
|
-
`).forEach(function(o){
|
|
67
|
-
`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(r=>s.set(r)),s}static accessor(t){const s=(this[Kt]=this[Kt]={accessors:{}}).accessors,r=this.prototype;function i(o){const l=Ce(o);s[l]||(cr(r,o),s[l]=!0)}return d.isArray(t)?t.forEach(i):i(t),this}};Y.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),d.reduceDescriptors(Y.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}}),d.freezeMethods(Y);function ot(e,t){const n=this||Ae,s=t||n,r=Y.from(s.headers);let i=s.data;return d.forEach(e,function(l){i=l.call(n,i,r.normalize(),t?t.status:void 0)}),r.normalize(),i}function Yt(e){return!!(e&&e.__CANCEL__)}function pe(e,t,n){C.call(this,e??"canceled",C.ERR_CANCELED,t,n),this.name="CanceledError"}d.inherits(pe,C,{__CANCEL__:!0});function Xt(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new C("Request failed with status code "+n.status,[C.ERR_BAD_REQUEST,C.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function ur(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function dr(e,t){e=e||10;const n=new Array(e),s=new Array(e);let r=0,i=0,o;return t=t!==void 0?t:1e3,function(m){const f=Date.now(),u=s[i];o||(o=f),n[r]=m,s[r]=f;let h=i,x=0;for(;h!==r;)x+=n[h++],h=h%e;if(r=(r+1)%e,r===i&&(i=(i+1)%e),f-o<t)return;const O=u&&f-u;return O?Math.round(x*1e3/O):void 0}}function fr(e,t){let n=0,s=1e3/t,r,i;const o=(f,u=Date.now())=>{n=u,r=null,i&&(clearTimeout(i),i=null),e(...f)};return[(...f)=>{const u=Date.now(),h=u-n;h>=s?o(f,u):(r=f,i||(i=setTimeout(()=>{i=null,o(r)},s-h)))},()=>r&&o(r)]}const Me=(e,t,n=3)=>{let s=0;const r=dr(50,250);return fr(i=>{const o=i.loaded,l=i.lengthComputable?i.total:void 0,m=o-s,f=r(m),u=o<=l;s=o;const h={loaded:o,total:l,progress:l?o/l:void 0,bytes:m,rate:f||void 0,estimated:f&&l&&u?(l-o)/f:void 0,event:i,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(h)},n)},Zt=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Qt=e=>(...t)=>d.asap(()=>e(...t)),mr=W.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,W.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(W.origin),W.navigator&&/(msie|trident)/i.test(W.navigator.userAgent)):()=>!0,pr=W.hasStandardBrowserEnv?{write(e,t,n,s,r,i){const o=[e+"="+encodeURIComponent(t)];d.isNumber(n)&&o.push("expires="+new Date(n).toGMTString()),d.isString(s)&&o.push("path="+s),d.isString(r)&&o.push("domain="+r),i===!0&&o.push("secure"),document.cookie=o.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function hr(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function gr(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function en(e,t,n){let s=!hr(t);return e&&(s||n==!1)?gr(e,t):t}const tn=e=>e instanceof Y?{...e}:e;function ce(e,t){t=t||{};const n={};function s(f,u,h,x){return d.isPlainObject(f)&&d.isPlainObject(u)?d.merge.call({caseless:x},f,u):d.isPlainObject(u)?d.merge({},u):d.isArray(u)?u.slice():u}function r(f,u,h,x){if(d.isUndefined(u)){if(!d.isUndefined(f))return s(void 0,f,h,x)}else return s(f,u,h,x)}function i(f,u){if(!d.isUndefined(u))return s(void 0,u)}function o(f,u){if(d.isUndefined(u)){if(!d.isUndefined(f))return s(void 0,f)}else return s(void 0,u)}function l(f,u,h){if(h in t)return s(f,u);if(h in e)return s(void 0,f)}const m={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:l,headers:(f,u,h)=>r(tn(f),tn(u),h,!0)};return d.forEach(Object.keys({...e,...t}),function(u){const h=m[u]||r,x=h(e[u],t[u],u);d.isUndefined(x)&&h!==l||(n[u]=x)}),n}const nn=e=>{const t=ce({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:r,xsrfCookieName:i,headers:o,auth:l}=t;if(t.headers=o=Y.from(o),t.url=zt(en(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&o.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),d.isFormData(n)){if(W.hasStandardBrowserEnv||W.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(d.isFunction(n.getHeaders)){const m=n.getHeaders(),f=["content-type","content-length"];Object.entries(m).forEach(([u,h])=>{f.includes(u.toLowerCase())&&o.set(u,h)})}}if(W.hasStandardBrowserEnv&&(s&&d.isFunction(s)&&(s=s(t)),s||s!==!1&&mr(t.url))){const m=r&&i&&pr.read(i);m&&o.set(r,m)}return t},_r=typeof XMLHttpRequest<"u"&&function(e){return new Promise(function(n,s){const r=nn(e);let i=r.data;const o=Y.from(r.headers).normalize();let{responseType:l,onUploadProgress:m,onDownloadProgress:f}=r,u,h,x,O,p;function y(){O&&O(),p&&p(),r.cancelToken&&r.cancelToken.unsubscribe(u),r.signal&&r.signal.removeEventListener("abort",u)}let g=new XMLHttpRequest;g.open(r.method.toUpperCase(),r.url,!0),g.timeout=r.timeout;function E(){if(!g)return;const N=Y.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),A={data:!l||l==="text"||l==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:N,config:e,request:g};Xt(function(w){n(w),y()},function(w){s(w),y()},A),g=null}"onloadend"in g?g.onloadend=E:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(E)},g.onabort=function(){g&&(s(new C("Request aborted",C.ECONNABORTED,e,g)),g=null)},g.onerror=function(P){const A=P&&P.message?P.message:"Network Error",I=new C(A,C.ERR_NETWORK,e,g);I.event=P||null,s(I),g=null},g.ontimeout=function(){let P=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const A=r.transitional||Gt;r.timeoutErrorMessage&&(P=r.timeoutErrorMessage),s(new C(P,A.clarifyTimeoutError?C.ETIMEDOUT:C.ECONNABORTED,e,g)),g=null},i===void 0&&o.setContentType(null),"setRequestHeader"in g&&d.forEach(o.toJSON(),function(P,A){g.setRequestHeader(A,P)}),d.isUndefined(r.withCredentials)||(g.withCredentials=!!r.withCredentials),l&&l!=="json"&&(g.responseType=r.responseType),f&&([x,p]=Me(f,!0),g.addEventListener("progress",x)),m&&g.upload&&([h,O]=Me(m),g.upload.addEventListener("progress",h),g.upload.addEventListener("loadend",O)),(r.cancelToken||r.signal)&&(u=N=>{g&&(s(!N||N.type?new pe(null,e,g):N),g.abort(),g=null)},r.cancelToken&&r.cancelToken.subscribe(u),r.signal&&(r.signal.aborted?u():r.signal.addEventListener("abort",u)));const k=ur(r.url);if(k&&W.protocols.indexOf(k)===-1){s(new C("Unsupported protocol "+k+":",C.ERR_BAD_REQUEST,e));return}g.send(i||null)})},br=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,r;const i=function(f){if(!r){r=!0,l();const u=f instanceof Error?f:this.reason;s.abort(u instanceof C?u:new pe(u instanceof Error?u.message:u))}};let o=t&&setTimeout(()=>{o=null,i(new C(`timeout ${t} of ms exceeded`,C.ETIMEDOUT))},t);const l=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(f=>{f.unsubscribe?f.unsubscribe(i):f.removeEventListener("abort",i)}),e=null)};e.forEach(f=>f.addEventListener("abort",i));const{signal:m}=s;return m.unsubscribe=()=>d.asap(l),m}},yr=function*(e,t){let n=e.byteLength;if(n<t){yield e;return}let s=0,r;for(;s<n;)r=s+t,yield e.slice(s,r),s=r},xr=async function*(e,t){for await(const n of wr(e))yield*yr(n,t)},wr=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:n,value:s}=await t.read();if(n)break;yield s}}finally{await t.cancel()}},sn=(e,t,n,s)=>{const r=xr(e,t);let i=0,o,l=m=>{o||(o=!0,s&&s(m))};return new ReadableStream({async pull(m){try{const{done:f,value:u}=await r.next();if(f){l(),m.close();return}let h=u.byteLength;if(n){let x=i+=h;n(x)}m.enqueue(new Uint8Array(u))}catch(f){throw l(f),f}},cancel(m){return l(m),r.return()}},{highWaterMark:2})},rn=64*1024,{isFunction:Fe}=d,vr=(({Request:e,Response:t})=>({Request:e,Response:t}))(d.global),{ReadableStream:on,TextEncoder:an}=d.global,ln=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Er=e=>{e=d.merge.call({skipUndefined:!0},vr,e);const{fetch:t,Request:n,Response:s}=e,r=t?Fe(t):typeof fetch=="function",i=Fe(n),o=Fe(s);if(!r)return!1;const l=r&&Fe(on),m=r&&(typeof an=="function"?(p=>y=>p.encode(y))(new an):async p=>new Uint8Array(await new n(p).arrayBuffer())),f=i&&l&&ln(()=>{let p=!1;const y=new n(W.origin,{body:new on,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return p&&!y}),u=o&&l&&ln(()=>d.isReadableStream(new s("").body)),h={stream:u&&(p=>p.body)};r&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!h[p]&&(h[p]=(y,g)=>{let E=y&&y[p];if(E)return E.call(y);throw new C(`Response type '${p}' is not supported`,C.ERR_NOT_SUPPORT,g)})});const x=async p=>{if(p==null)return 0;if(d.isBlob(p))return p.size;if(d.isSpecCompliantForm(p))return(await new n(W.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(d.isArrayBufferView(p)||d.isArrayBuffer(p))return p.byteLength;if(d.isURLSearchParams(p)&&(p=p+""),d.isString(p))return(await m(p)).byteLength},O=async(p,y)=>{const g=d.toFiniteNumber(p.getContentLength());return g??x(y)};return async p=>{let{url:y,method:g,data:E,signal:k,cancelToken:N,timeout:P,onDownloadProgress:A,onUploadProgress:I,responseType:w,headers:F,withCredentials:q="same-origin",fetchOptions:ne}=nn(p),z=t||fetch;w=w?(w+"").toLowerCase():"text";let D=br([k,N&&N.toAbortSignal()],P),J=null;const G=D&&D.unsubscribe&&(()=>{D.unsubscribe()});let ae;try{if(I&&f&&g!=="get"&&g!=="head"&&(ae=await O(F,E))!==0){let re=new n(y,{method:"POST",body:E,duplex:"half"}),ie;if(d.isFormData(E)&&(ie=re.headers.get("content-type"))&&F.setContentType(ie),re.body){const[he,ge]=Zt(ae,Me(Qt(I)));E=sn(re.body,rn,he,ge)}}d.isString(q)||(q=q?"include":"omit");const Z=i&&"credentials"in n.prototype,ke={...ne,signal:D,method:g.toUpperCase(),headers:F.normalize().toJSON(),body:E,duplex:"half",credentials:Z?q:void 0};J=i&&new n(y,ke);let se=await(i?z(J,ne):z(y,ke));const Ne=u&&(w==="stream"||w==="response");if(u&&(A||Ne&&G)){const re={};["status","statusText","headers"].forEach(We=>{re[We]=se[We]});const ie=d.toFiniteNumber(se.headers.get("content-length")),[he,ge]=A&&Zt(ie,Me(Qt(A),!0))||[];se=new s(sn(se.body,rn,he,()=>{ge&&ge(),G&&G()}),re)}w=w||"text";let He=await h[d.findKey(h,w)||"text"](se,p);return!Ne&&G&&G(),await new Promise((re,ie)=>{Xt(re,ie,{data:He,headers:Y.from(se.headers),status:se.status,statusText:se.statusText,config:p,request:J})})}catch(Z){throw G&&G(),Z&&Z.name==="TypeError"&&/Load failed|fetch/i.test(Z.message)?Object.assign(new C("Network Error",C.ERR_NETWORK,p,J),{cause:Z.cause||Z}):C.from(Z,Z&&Z.code,p,J)}}},Sr=new Map,cn=e=>{let t=e?e.env:{};const{fetch:n,Request:s,Response:r}=t,i=[s,r,n];let o=i.length,l=o,m,f,u=Sr;for(;l--;)m=i[l],f=u.get(m),f===void 0&&u.set(m,f=l?new Map:Er(t)),u=f;return f};cn();const it={http:Js,xhr:_r,fetch:{get:cn}};d.forEach(it,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const un=e=>`- ${e}`,Ar=e=>d.isFunction(e)||e===null||e===!1,dn={getAdapter:(e,t)=>{e=d.isArray(e)?e:[e];const{length:n}=e;let s,r;const i={};for(let o=0;o<n;o++){s=e[o];let l;if(r=s,!Ar(s)&&(r=it[(l=String(s)).toLowerCase()],r===void 0))throw new C(`Unknown adapter '${l}'`);if(r&&(d.isFunction(r)||(r=r.get(t))))break;i[l||"#"+o]=r}if(!r){const o=Object.entries(i).map(([m,f])=>`adapter ${m} `+(f===!1?"is not supported by the environment":"is not available in the build"));let l=n?o.length>1?`since :
|
|
66
|
+
*/const sr=Ze("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),Rt=e=>e===0?"开始学习":e===100?"复习":"继续学习",or=e=>{if(e.length===0)return 0;const t=e.reduce((n,r)=>n+r.progress,0);return Math.round(t/e.length)},ir=({knowledgeItem:e,onLearnAction:t})=>{const n=()=>{t(e)};return console.log("KnowledgeCard render:",{progress:e.progress,text:Rt(e.progress)}),c.jsxs(Xe.Card,{className:"content-accordion__knowledge-card",children:[c.jsxs(Xe.CardBody,{children:[c.jsx("h3",{className:"content-accordion__knowledge-title",children:e.title}),c.jsx("p",{className:"content-accordion__knowledge-description",children:e.description})]}),c.jsxs(Xe.CardFooter,{className:"content-accordion__knowledge-actions",children:[c.jsxs("div",{className:"content-accordion__progress-container",children:[c.jsx(Wn.Progress,{value:e.progress,size:"sm","aria-label":`${e.title} 进度`,className:"content-accordion__progress-bar"}),c.jsxs("span",{className:"content-accordion__progress-text",children:[e.progress,"%"]})]}),c.jsx(vt,{size:"sm",radius:"md",onClick:n,progress:e.progress,variant:e.progress===100?"light":e.progress===0?"solid":"bordered",className:"content-accordion__learn-button",children:Rt(e.progress)})]})]})},ar=({lesson:e,isExpanded:t,onToggle:n,onLearnAction:r})=>{const s=()=>{n(e.id)},i=or(e.knowledgeItems);return c.jsxs("div",{className:`content-accordion__lesson-item ${t?"content-accordion__lesson-item--expanded":""}`,children:[c.jsxs("div",{className:"content-accordion__lesson-header",onClick:s,role:"button",tabIndex:0,"aria-expanded":t,"aria-label":`${e.title},点击${t?"收起":"展开"}`,children:[c.jsxs("div",{className:"content-accordion__lesson-header-content",children:[c.jsx("h2",{className:"content-accordion__lesson-title",children:e.title}),c.jsxs("span",{className:"content-accordion__lesson-duration",children:["约 ",e.duration," 分钟"]})]}),c.jsxs("div",{className:"content-accordion__lesson-actions",children:[c.jsxs("span",{className:"content-accordion__lesson-progress",children:[i,"%"]}),t?c.jsx(rr,{className:"content-accordion__lesson-icon"}):c.jsx(sr,{className:"content-accordion__lesson-icon"})]})]}),t&&c.jsx("div",{className:"content-accordion__knowledge-list",children:e.knowledgeItems.map(o=>c.jsx(ir,{knowledgeItem:o,onLearnAction:r},o.id))})]})},kt=({unit:e,activeLessonIds:t,onToggleLesson:n,onLearnAction:r,loading:s=!1,className:i="",emptyState:o})=>s?c.jsx("div",{className:"content-accordion content-accordion--loading",children:c.jsx("div",{className:"content-accordion__loading",children:"加载中..."})}):e?c.jsxs("div",{className:`content-accordion ${i}`,children:[c.jsxs("header",{className:"content-accordion__header",children:[c.jsx("h1",{className:"content-accordion__unit-title",children:e.title}),c.jsx("p",{className:"content-accordion__unit-description",children:e.description}),c.jsxs("div",{className:"content-accordion__unit-meta",children:[c.jsxs("span",{children:["总共 ",e.totalLessons," 节课"]}),c.jsx("span",{children:"•"}),c.jsxs("span",{children:["预计学习 ",e.estimatedDuration]})]})]}),c.jsx("div",{className:"content-accordion__lessons",children:e.lessons.map(l=>c.jsx(ar,{lesson:l,isExpanded:t.includes(l.id),onToggle:n,onLearnAction:r},l.id))})]}):c.jsx("div",{className:"content-accordion content-accordion--empty",children:o||c.jsx("div",{className:"content-accordion__empty",children:"暂无学习内容"})}),lr=e=>{switch(e){case"completed":return"success";case"in-progress":return"primary";case"not-started":default:return"default"}},Nt=({data:e,loading:t=!1,error:n=null,collapsed:r=!1,onToggleCollapse:s,activeUnitId:i=null,onUnitSelect:o,renderUnitItem:l,className:m="",unitItemClassName:f="",style:u={},unitItemStyle:h={}})=>{const w=(g,S)=>{S.preventDefault(),o?.(g)},k=()=>{s?.()},p=g=>c.jsxs("div",{className:`sidebar__unit-item ${f} ${i===g.unitId?"sidebar__unit-item--active":""} ${g.status?`sidebar__unit-item--${g.status}`:""}`,style:h,onClick:S=>w(g.unitId,S),role:"button",tabIndex:0,"aria-label":`${g.title},进度 ${g.progressPercentage}%`,children:[c.jsxs("div",{className:"sidebar__unit-item__content",children:[g.icon&&c.jsx("span",{className:"sidebar__unit-item__icon",children:g.icon}),!r&&c.jsx("span",{className:"sidebar__unit-item__title",children:g.title})]}),!r&&g.progressPercentage!==void 0&&c.jsxs("div",{className:"sidebar__unit-item__progress",children:[c.jsx(Se.Progress,{value:g.progressPercentage,size:"sm",color:lr(g.status),"aria-label":`${g.title} 进度`}),c.jsxs("span",{className:"progress-percentage",children:[g.progressPercentage,"%"]})]})]},g.unitId),y=()=>t?c.jsx("div",{className:"sidebar__loading",children:"加载中..."}):n?c.jsxs("div",{className:"sidebar__error",children:["加载失败: ",n.message]}):e?c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"sidebar__header",children:[c.jsx("button",{className:"sidebar__toggle-btn",onClick:k,"aria-label":"切换侧边栏折叠状态",children:r?"→":"←"}),!r&&c.jsxs("div",{className:"sidebar__course-info",children:[c.jsx("h3",{className:"sidebar__course-title",children:e.courseTitle}),c.jsxs("span",{className:"sidebar__course-level",children:[e.courseLevel,"年级"]})]})]}),c.jsx("nav",{className:"sidebar__content",children:c.jsx("ul",{className:"sidebar__unit-list",children:e.units&&e.units.length>0?e.units.map(g=>c.jsx("li",{children:l?l(g,g):p(g)},g.unitId)):c.jsx("div",{className:"sidebar__empty",children:"暂无单元数据"})})})]}):c.jsx("div",{className:"sidebar__empty",children:"暂无课程数据"});return c.jsx("aside",{className:`sidebar ${m} ${r?"sidebar--collapsed":""} ${t?"sidebar--loading":""} ${n?"sidebar--error":""}`,style:u,"aria-label":"课程导航侧边栏",role:"complementary",children:y()})},Qe=({trigger:e,items:t,position:n="bottom",alignment:r="start",openDelay:s=300,closeDelay:i=100,onOpen:o,onClose:l,renderItem:m,itemConfig:f={},className:u,menuClassName:h,itemClassName:w})=>{const[k,p]=A.useState(!1),y=A.useRef(null),g=A.useRef(null),S=()=>{y.current&&clearTimeout(y.current),g.current&&clearTimeout(g.current)},R=()=>{S(),y.current=setTimeout(()=>{p(!0),o?.()},s)},N=()=>{S(),g.current=setTimeout(()=>{p(!1),l?.()},i)},L=x=>{!x.disabled&&x.onClick&&x.onClick(x)};A.useEffect(()=>()=>S(),[]);const T=x=>c.jsxs("div",{className:`submenu-item ${x.disabled?"is-disabled":""} ${w||""}`,onClick:()=>L(x),children:[x.icon&&c.jsx("span",{className:"submenu-item-icon",children:x.icon}),c.jsx("span",{children:x.label})]},x.id),G=()=>{const x=["submenu-panel"];return h&&x.push(h),x.push(`position-${n}`),r!=="start"&&x.push(`alignment-${r}`),k&&x.push("is-open"),x.join(" ")};return c.jsxs("div",{className:`submenu-container ${u||""}`,onMouseEnter:R,onMouseLeave:N,children:[c.jsx("div",{className:"submenu-trigger",children:e}),c.jsx("div",{className:G(),children:t.map(x=>m?m(x,f):T(x))})]})};function Dt(e,t){return function(){return e.apply(t,arguments)}}const{toString:cr}=Object.prototype,{getPrototypeOf:et}=Object,{iterator:Te,toStringTag:Ut}=Symbol,Pe=(e=>t=>{const n=cr.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),se=e=>(e=e.toLowerCase(),t=>Pe(t)===e),Le=e=>t=>typeof t===e,{isArray:pe}=Array,ge=Le("undefined");function Ae(e){return e!==null&&!ge(e)&&e.constructor!==null&&!ge(e.constructor)&&X(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Ot=se("ArrayBuffer");function ur(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Ot(e.buffer),t}const dr=Le("string"),X=Le("function"),jt=Le("number"),Ce=e=>e!==null&&typeof e=="object",fr=e=>e===!0||e===!1,Ie=e=>{if(Pe(e)!=="object")return!1;const t=et(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Ut in e)&&!(Te in e)},mr=e=>{if(!Ce(e)||Ae(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},hr=se("Date"),pr=se("File"),gr=se("Blob"),_r=se("FileList"),br=e=>Ce(e)&&X(e.pipe),yr=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||X(e.append)&&((t=Pe(e))==="formdata"||t==="object"&&X(e.toString)&&e.toString()==="[object FormData]"))},wr=se("URLSearchParams"),[Er,Sr,xr,vr]=["ReadableStream","Request","Response","Headers"].map(se),Ar=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Re(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),pe(e))for(r=0,s=e.length;r<s;r++)t.call(null,e[r],r,e);else{if(Ae(e))return;const i=n?Object.getOwnPropertyNames(e):Object.keys(e),o=i.length;let l;for(r=0;r<o;r++)l=i[r],t.call(null,e[l],l,e)}}function Tt(e,t){if(Ae(e))return null;t=t.toLowerCase();const n=Object.keys(e);let r=n.length,s;for(;r-- >0;)if(s=n[r],t===s.toLowerCase())return s;return null}const ce=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Pt=e=>!ge(e)&&e!==ce;function tt(){const{caseless:e,skipUndefined:t}=Pt(this)&&this||{},n={},r=(s,i)=>{const o=e&&Tt(n,i)||i;Ie(n[o])&&Ie(s)?n[o]=tt(n[o],s):Ie(s)?n[o]=tt({},s):pe(s)?n[o]=s.slice():(!t||!ge(s))&&(n[o]=s)};for(let s=0,i=arguments.length;s<i;s++)arguments[s]&&Re(arguments[s],r);return n}const Cr=(e,t,n,{allOwnKeys:r}={})=>(Re(t,(s,i)=>{n&&X(s)?e[i]=Dt(s,n):e[i]=s},{allOwnKeys:r}),e),Rr=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),kr=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Nr=(e,t,n,r)=>{let s,i,o;const l={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)o=s[i],(!r||r(o,e,t))&&!l[o]&&(t[o]=e[o],l[o]=!0);e=n!==!1&&et(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Dr=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Ur=e=>{if(!e)return null;if(pe(e))return e;let t=e.length;if(!jt(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Or=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&et(Uint8Array)),jr=(e,t)=>{const r=(e&&e[Te]).call(e);let s;for(;(s=r.next())&&!s.done;){const i=s.value;t.call(e,i[0],i[1])}},Tr=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Pr=se("HTMLFormElement"),Lr=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),Lt=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Ir=se("RegExp"),It=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Re(n,(s,i)=>{let o;(o=t(s,i,e))!==!1&&(r[i]=o||s)}),Object.defineProperties(e,r)},Mr=e=>{It(e,(t,n)=>{if(X(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(X(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},$r=(e,t)=>{const n={},r=s=>{s.forEach(i=>{n[i]=!0})};return pe(e)?r(e):r(String(e).split(t)),n},Fr=()=>{},Br=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function qr(e){return!!(e&&X(e.append)&&e[Ut]==="FormData"&&e[Te])}const zr=e=>{const t=new Array(10),n=(r,s)=>{if(Ce(r)){if(t.indexOf(r)>=0)return;if(Ae(r))return r;if(!("toJSON"in r)){t[s]=r;const i=pe(r)?[]:{};return Re(r,(o,l)=>{const m=n(o,s+1);!ge(m)&&(i[l]=m)}),t[s]=void 0,i}}return r};return n(e,0)},Gr=se("AsyncFunction"),Hr=e=>e&&(Ce(e)||X(e))&&X(e.then)&&X(e.catch),Mt=((e,t)=>e?setImmediate:t?((n,r)=>(ce.addEventListener("message",({source:s,data:i})=>{s===ce&&i===n&&r.length&&r.shift()()},!1),s=>{r.push(s),ce.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",X(ce.postMessage)),Vr=typeof queueMicrotask<"u"?queueMicrotask.bind(ce):typeof process<"u"&&process.nextTick||Mt,d={isArray:pe,isArrayBuffer:Ot,isBuffer:Ae,isFormData:yr,isArrayBufferView:ur,isString:dr,isNumber:jt,isBoolean:fr,isObject:Ce,isPlainObject:Ie,isEmptyObject:mr,isReadableStream:Er,isRequest:Sr,isResponse:xr,isHeaders:vr,isUndefined:ge,isDate:hr,isFile:pr,isBlob:gr,isRegExp:Ir,isFunction:X,isStream:br,isURLSearchParams:wr,isTypedArray:Or,isFileList:_r,forEach:Re,merge:tt,extend:Cr,trim:Ar,stripBOM:Rr,inherits:kr,toFlatObject:Nr,kindOf:Pe,kindOfTest:se,endsWith:Dr,toArray:Ur,forEachEntry:jr,matchAll:Tr,isHTMLForm:Pr,hasOwnProperty:Lt,hasOwnProp:Lt,reduceDescriptors:It,freezeMethods:Mr,toObjectSet:$r,toCamelCase:Lr,noop:Fr,toFiniteNumber:Br,findKey:Tt,global:ce,isContextDefined:Pt,isSpecCompliantForm:qr,toJSONObject:zr,isAsyncFn:Gr,isThenable:Hr,setImmediate:Mt,asap:Vr,isIterable:e=>e!=null&&X(e[Te])};function C(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s,this.status=s.status?s.status:null)}d.inherits(C,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:d.toJSONObject(this.config),code:this.code,status:this.status}}});const $t=C.prototype,Ft={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{Ft[e]={value:e}}),Object.defineProperties(C,Ft),Object.defineProperty($t,"isAxiosError",{value:!0}),C.from=(e,t,n,r,s,i)=>{const o=Object.create($t);d.toFlatObject(e,o,function(u){return u!==Error.prototype},f=>f!=="isAxiosError");const l=e&&e.message?e.message:"Error",m=t==null&&e?e.code:t;return C.call(o,l,m,n,r,s),e&&o.cause==null&&Object.defineProperty(o,"cause",{value:e,configurable:!0}),o.name=e&&e.name||"Error",i&&Object.assign(o,i),o};const Wr=null;function nt(e){return d.isPlainObject(e)||d.isArray(e)}function Bt(e){return d.endsWith(e,"[]")?e.slice(0,-2):e}function qt(e,t,n){return e?e.concat(t).map(function(s,i){return s=Bt(s),!n&&i?"["+s+"]":s}).join(n?".":""):t}function Jr(e){return d.isArray(e)&&!e.some(nt)}const Kr=d.toFlatObject(d,{},null,function(t){return/^is[A-Z]/.test(t)});function Me(e,t,n){if(!d.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=d.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,g){return!d.isUndefined(g[y])});const r=n.metaTokens,s=n.visitor||u,i=n.dots,o=n.indexes,m=(n.Blob||typeof Blob<"u"&&Blob)&&d.isSpecCompliantForm(t);if(!d.isFunction(s))throw new TypeError("visitor must be a function");function f(p){if(p===null)return"";if(d.isDate(p))return p.toISOString();if(d.isBoolean(p))return p.toString();if(!m&&d.isBlob(p))throw new C("Blob is not supported. Use a Buffer instead.");return d.isArrayBuffer(p)||d.isTypedArray(p)?m&&typeof Blob=="function"?new Blob([p]):Buffer.from(p):p}function u(p,y,g){let S=p;if(p&&!g&&typeof p=="object"){if(d.endsWith(y,"{}"))y=r?y:y.slice(0,-2),p=JSON.stringify(p);else if(d.isArray(p)&&Jr(p)||(d.isFileList(p)||d.endsWith(y,"[]"))&&(S=d.toArray(p)))return y=Bt(y),S.forEach(function(N,L){!(d.isUndefined(N)||N===null)&&t.append(o===!0?qt([y],L,i):o===null?y:y+"[]",f(N))}),!1}return nt(p)?!0:(t.append(qt(g,y,i),f(p)),!1)}const h=[],w=Object.assign(Kr,{defaultVisitor:u,convertValue:f,isVisitable:nt});function k(p,y){if(!d.isUndefined(p)){if(h.indexOf(p)!==-1)throw Error("Circular reference detected in "+y.join("."));h.push(p),d.forEach(p,function(S,R){(!(d.isUndefined(S)||S===null)&&s.call(t,S,d.isString(R)?R.trim():R,y,w))===!0&&k(S,y?y.concat(R):[R])}),h.pop()}}if(!d.isObject(e))throw new TypeError("data must be an object");return k(e),t}function zt(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function rt(e,t){this._pairs=[],e&&Me(e,this,t)}const Gt=rt.prototype;Gt.append=function(t,n){this._pairs.push([t,n])},Gt.toString=function(t){const n=t?function(r){return t.call(this,r,zt)}:zt;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function Yr(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ht(e,t,n){if(!t)return e;const r=n&&n.encode||Yr;d.isFunction(n)&&(n={serialize:n});const s=n&&n.serialize;let i;if(s?i=s(t,n):i=d.isURLSearchParams(t)?t.toString():new rt(t,n).toString(r),i){const o=e.indexOf("#");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Vt{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){d.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Wt={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Xr={isBrowser:!0,classes:{URLSearchParams:typeof URLSearchParams<"u"?URLSearchParams:rt,FormData:typeof FormData<"u"?FormData:null,Blob:typeof Blob<"u"?Blob:null},protocols:["http","https","file","blob","url","data"]},st=typeof window<"u"&&typeof document<"u",ot=typeof navigator=="object"&&navigator||void 0,Zr=st&&(!ot||["ReactNative","NativeScript","NS"].indexOf(ot.product)<0),Qr=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",es=st&&window.location.href||"http://localhost",K={...Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:st,hasStandardBrowserEnv:Zr,hasStandardBrowserWebWorkerEnv:Qr,navigator:ot,origin:es},Symbol.toStringTag,{value:"Module"})),...Xr};function ts(e,t){return Me(e,new K.classes.URLSearchParams,{visitor:function(n,r,s,i){return K.isNode&&d.isBuffer(n)?(this.append(r,n.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function ns(e){return d.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function rs(e){const t={},n=Object.keys(e);let r;const s=n.length;let i;for(r=0;r<s;r++)i=n[r],t[i]=e[i];return t}function Jt(e){function t(n,r,s,i){let o=n[i++];if(o==="__proto__")return!0;const l=Number.isFinite(+o),m=i>=n.length;return o=!o&&d.isArray(s)?s.length:o,m?(d.hasOwnProp(s,o)?s[o]=[s[o],r]:s[o]=r,!l):((!s[o]||!d.isObject(s[o]))&&(s[o]=[]),t(n,r,s[o],i)&&d.isArray(s[o])&&(s[o]=rs(s[o])),!l)}if(d.isFormData(e)&&d.isFunction(e.entries)){const n={};return d.forEachEntry(e,(r,s)=>{t(ns(r),s,n,0)}),n}return null}function ss(e,t,n){if(d.isString(e))try{return(t||JSON.parse)(e),d.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const ke={transitional:Wt,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,i=d.isObject(t);if(i&&d.isHTMLForm(t)&&(t=new FormData(t)),d.isFormData(t))return s?JSON.stringify(Jt(t)):t;if(d.isArrayBuffer(t)||d.isBuffer(t)||d.isStream(t)||d.isFile(t)||d.isBlob(t)||d.isReadableStream(t))return t;if(d.isArrayBufferView(t))return t.buffer;if(d.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return ts(t,this.formSerializer).toString();if((l=d.isFileList(t))||r.indexOf("multipart/form-data")>-1){const m=this.env&&this.env.FormData;return Me(l?{"files[]":t}:t,m&&new m,this.formSerializer)}}return i||s?(n.setContentType("application/json",!1),ss(t)):t}],transformResponse:[function(t){const n=this.transitional||ke.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(d.isResponse(t)||d.isReadableStream(t))return t;if(t&&d.isString(t)&&(r&&!this.responseType||s)){const o=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t,this.parseReviver)}catch(l){if(o)throw l.name==="SyntaxError"?C.from(l,C.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:K.classes.FormData,Blob:K.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};d.forEach(["delete","get","head","post","put","patch"],e=>{ke.headers[e]={}});const os=d.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),is=e=>{const t={};let n,r,s;return e&&e.split(`
|
|
67
|
+
`).forEach(function(o){s=o.indexOf(":"),n=o.substring(0,s).trim().toLowerCase(),r=o.substring(s+1).trim(),!(!n||t[n]&&os[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},Kt=Symbol("internals");function Ne(e){return e&&String(e).trim().toLowerCase()}function $e(e){return e===!1||e==null?e:d.isArray(e)?e.map($e):String(e)}function as(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const ls=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function it(e,t,n,r,s){if(d.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!d.isString(t)){if(d.isString(r))return t.indexOf(r)!==-1;if(d.isRegExp(r))return r.test(t)}}function cs(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function us(e,t){const n=d.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,i,o){return this[r].call(this,t,s,i,o)},configurable:!0})})}let Z=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function i(l,m,f){const u=Ne(m);if(!u)throw new Error("header name must be a non-empty string");const h=d.findKey(s,u);(!h||s[h]===void 0||f===!0||f===void 0&&s[h]!==!1)&&(s[h||m]=$e(l))}const o=(l,m)=>d.forEach(l,(f,u)=>i(f,u,m));if(d.isPlainObject(t)||t instanceof this.constructor)o(t,n);else if(d.isString(t)&&(t=t.trim())&&!ls(t))o(is(t),n);else if(d.isObject(t)&&d.isIterable(t)){let l={},m,f;for(const u of t){if(!d.isArray(u))throw TypeError("Object iterator must return a key-value pair");l[f=u[0]]=(m=l[f])?d.isArray(m)?[...m,u[1]]:[m,u[1]]:u[1]}o(l,n)}else t!=null&&i(n,t,r);return this}get(t,n){if(t=Ne(t),t){const r=d.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return as(s);if(d.isFunction(n))return n.call(this,s,r);if(d.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Ne(t),t){const r=d.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||it(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function i(o){if(o=Ne(o),o){const l=d.findKey(r,o);l&&(!n||it(r,r[l],l,n))&&(delete r[l],s=!0)}}return d.isArray(t)?t.forEach(i):i(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const i=n[r];(!t||it(this,this[i],i,t,!0))&&(delete this[i],s=!0)}return s}normalize(t){const n=this,r={};return d.forEach(this,(s,i)=>{const o=d.findKey(r,i);if(o){n[o]=$e(s),delete n[i];return}const l=t?cs(i):String(i).trim();l!==i&&delete n[i],n[l]=$e(s),r[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return d.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&d.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(`
|
|
68
|
+
`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[Kt]=this[Kt]={accessors:{}}).accessors,s=this.prototype;function i(o){const l=Ne(o);r[l]||(us(s,o),r[l]=!0)}return d.isArray(t)?t.forEach(i):i(t),this}};Z.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),d.reduceDescriptors(Z.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}}),d.freezeMethods(Z);function at(e,t){const n=this||ke,r=t||n,s=Z.from(r.headers);let i=r.data;return d.forEach(e,function(l){i=l.call(n,i,s.normalize(),t?t.status:void 0)}),s.normalize(),i}function Yt(e){return!!(e&&e.__CANCEL__)}function _e(e,t,n){C.call(this,e??"canceled",C.ERR_CANCELED,t,n),this.name="CanceledError"}d.inherits(_e,C,{__CANCEL__:!0});function Xt(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new C("Request failed with status code "+n.status,[C.ERR_BAD_REQUEST,C.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function ds(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function fs(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,i=0,o;return t=t!==void 0?t:1e3,function(m){const f=Date.now(),u=r[i];o||(o=f),n[s]=m,r[s]=f;let h=i,w=0;for(;h!==s;)w+=n[h++],h=h%e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),f-o<t)return;const k=u&&f-u;return k?Math.round(w*1e3/k):void 0}}function ms(e,t){let n=0,r=1e3/t,s,i;const o=(f,u=Date.now())=>{n=u,s=null,i&&(clearTimeout(i),i=null),e(...f)};return[(...f)=>{const u=Date.now(),h=u-n;h>=r?o(f,u):(s=f,i||(i=setTimeout(()=>{i=null,o(s)},r-h)))},()=>s&&o(s)]}const Fe=(e,t,n=3)=>{let r=0;const s=fs(50,250);return ms(i=>{const o=i.loaded,l=i.lengthComputable?i.total:void 0,m=o-r,f=s(m),u=o<=l;r=o;const h={loaded:o,total:l,progress:l?o/l:void 0,bytes:m,rate:f||void 0,estimated:f&&l&&u?(l-o)/f:void 0,event:i,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(h)},n)},Zt=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Qt=e=>(...t)=>d.asap(()=>e(...t)),hs=K.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,K.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(K.origin),K.navigator&&/(msie|trident)/i.test(K.navigator.userAgent)):()=>!0,ps=K.hasStandardBrowserEnv?{write(e,t,n,r,s,i){const o=[e+"="+encodeURIComponent(t)];d.isNumber(n)&&o.push("expires="+new Date(n).toGMTString()),d.isString(r)&&o.push("path="+r),d.isString(s)&&o.push("domain="+s),i===!0&&o.push("secure"),document.cookie=o.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function gs(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function _s(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function en(e,t,n){let r=!gs(t);return e&&(r||n==!1)?_s(e,t):t}const tn=e=>e instanceof Z?{...e}:e;function ue(e,t){t=t||{};const n={};function r(f,u,h,w){return d.isPlainObject(f)&&d.isPlainObject(u)?d.merge.call({caseless:w},f,u):d.isPlainObject(u)?d.merge({},u):d.isArray(u)?u.slice():u}function s(f,u,h,w){if(d.isUndefined(u)){if(!d.isUndefined(f))return r(void 0,f,h,w)}else return r(f,u,h,w)}function i(f,u){if(!d.isUndefined(u))return r(void 0,u)}function o(f,u){if(d.isUndefined(u)){if(!d.isUndefined(f))return r(void 0,f)}else return r(void 0,u)}function l(f,u,h){if(h in t)return r(f,u);if(h in e)return r(void 0,f)}const m={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:l,headers:(f,u,h)=>s(tn(f),tn(u),h,!0)};return d.forEach(Object.keys({...e,...t}),function(u){const h=m[u]||s,w=h(e[u],t[u],u);d.isUndefined(w)&&h!==l||(n[u]=w)}),n}const nn=e=>{const t=ue({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:s,xsrfCookieName:i,headers:o,auth:l}=t;if(t.headers=o=Z.from(o),t.url=Ht(en(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&o.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),d.isFormData(n)){if(K.hasStandardBrowserEnv||K.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(d.isFunction(n.getHeaders)){const m=n.getHeaders(),f=["content-type","content-length"];Object.entries(m).forEach(([u,h])=>{f.includes(u.toLowerCase())&&o.set(u,h)})}}if(K.hasStandardBrowserEnv&&(r&&d.isFunction(r)&&(r=r(t)),r||r!==!1&&hs(t.url))){const m=s&&i&&ps.read(i);m&&o.set(s,m)}return t},bs=typeof XMLHttpRequest<"u"&&function(e){return new Promise(function(n,r){const s=nn(e);let i=s.data;const o=Z.from(s.headers).normalize();let{responseType:l,onUploadProgress:m,onDownloadProgress:f}=s,u,h,w,k,p;function y(){k&&k(),p&&p(),s.cancelToken&&s.cancelToken.unsubscribe(u),s.signal&&s.signal.removeEventListener("abort",u)}let g=new XMLHttpRequest;g.open(s.method.toUpperCase(),s.url,!0),g.timeout=s.timeout;function S(){if(!g)return;const N=Z.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),T={data:!l||l==="text"||l==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:N,config:e,request:g};Xt(function(x){n(x),y()},function(x){r(x),y()},T),g=null}"onloadend"in g?g.onloadend=S:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(S)},g.onabort=function(){g&&(r(new C("Request aborted",C.ECONNABORTED,e,g)),g=null)},g.onerror=function(L){const T=L&&L.message?L.message:"Network Error",G=new C(T,C.ERR_NETWORK,e,g);G.event=L||null,r(G),g=null},g.ontimeout=function(){let L=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const T=s.transitional||Wt;s.timeoutErrorMessage&&(L=s.timeoutErrorMessage),r(new C(L,T.clarifyTimeoutError?C.ETIMEDOUT:C.ECONNABORTED,e,g)),g=null},i===void 0&&o.setContentType(null),"setRequestHeader"in g&&d.forEach(o.toJSON(),function(L,T){g.setRequestHeader(T,L)}),d.isUndefined(s.withCredentials)||(g.withCredentials=!!s.withCredentials),l&&l!=="json"&&(g.responseType=s.responseType),f&&([w,p]=Fe(f,!0),g.addEventListener("progress",w)),m&&g.upload&&([h,k]=Fe(m),g.upload.addEventListener("progress",h),g.upload.addEventListener("loadend",k)),(s.cancelToken||s.signal)&&(u=N=>{g&&(r(!N||N.type?new _e(null,e,g):N),g.abort(),g=null)},s.cancelToken&&s.cancelToken.subscribe(u),s.signal&&(s.signal.aborted?u():s.signal.addEventListener("abort",u)));const R=ds(s.url);if(R&&K.protocols.indexOf(R)===-1){r(new C("Unsupported protocol "+R+":",C.ERR_BAD_REQUEST,e));return}g.send(i||null)})},ys=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,s;const i=function(f){if(!s){s=!0,l();const u=f instanceof Error?f:this.reason;r.abort(u instanceof C?u:new _e(u instanceof Error?u.message:u))}};let o=t&&setTimeout(()=>{o=null,i(new C(`timeout ${t} of ms exceeded`,C.ETIMEDOUT))},t);const l=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(f=>{f.unsubscribe?f.unsubscribe(i):f.removeEventListener("abort",i)}),e=null)};e.forEach(f=>f.addEventListener("abort",i));const{signal:m}=r;return m.unsubscribe=()=>d.asap(l),m}},ws=function*(e,t){let n=e.byteLength;if(n<t){yield e;return}let r=0,s;for(;r<n;)s=r+t,yield e.slice(r,s),r=s},Es=async function*(e,t){for await(const n of Ss(e))yield*ws(n,t)},Ss=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:n,value:r}=await t.read();if(n)break;yield r}}finally{await t.cancel()}},rn=(e,t,n,r)=>{const s=Es(e,t);let i=0,o,l=m=>{o||(o=!0,r&&r(m))};return new ReadableStream({async pull(m){try{const{done:f,value:u}=await s.next();if(f){l(),m.close();return}let h=u.byteLength;if(n){let w=i+=h;n(w)}m.enqueue(new Uint8Array(u))}catch(f){throw l(f),f}},cancel(m){return l(m),s.return()}},{highWaterMark:2})},sn=64*1024,{isFunction:Be}=d,xs=(({Request:e,Response:t})=>({Request:e,Response:t}))(d.global),{ReadableStream:on,TextEncoder:an}=d.global,ln=(e,...t)=>{try{return!!e(...t)}catch{return!1}},vs=e=>{e=d.merge.call({skipUndefined:!0},xs,e);const{fetch:t,Request:n,Response:r}=e,s=t?Be(t):typeof fetch=="function",i=Be(n),o=Be(r);if(!s)return!1;const l=s&&Be(on),m=s&&(typeof an=="function"?(p=>y=>p.encode(y))(new an):async p=>new Uint8Array(await new n(p).arrayBuffer())),f=i&&l&&ln(()=>{let p=!1;const y=new n(K.origin,{body:new on,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return p&&!y}),u=o&&l&&ln(()=>d.isReadableStream(new r("").body)),h={stream:u&&(p=>p.body)};s&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!h[p]&&(h[p]=(y,g)=>{let S=y&&y[p];if(S)return S.call(y);throw new C(`Response type '${p}' is not supported`,C.ERR_NOT_SUPPORT,g)})});const w=async p=>{if(p==null)return 0;if(d.isBlob(p))return p.size;if(d.isSpecCompliantForm(p))return(await new n(K.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(d.isArrayBufferView(p)||d.isArrayBuffer(p))return p.byteLength;if(d.isURLSearchParams(p)&&(p=p+""),d.isString(p))return(await m(p)).byteLength},k=async(p,y)=>{const g=d.toFiniteNumber(p.getContentLength());return g??w(y)};return async p=>{let{url:y,method:g,data:S,signal:R,cancelToken:N,timeout:L,onDownloadProgress:T,onUploadProgress:G,responseType:x,headers:ee,withCredentials:I="same-origin",fetchOptions:F}=nn(p),W=t||fetch;x=x?(x+"").toLowerCase():"text";let M=ys([R,N&&N.toAbortSignal()],L),O=null;const U=M&&M.unsubscribe&&(()=>{M.unsubscribe()});let q;try{if(G&&f&&g!=="get"&&g!=="head"&&(q=await k(ee,S))!==0){let ne=new n(y,{method:"POST",body:S,duplex:"half"}),ie;if(d.isFormData(S)&&(ie=ne.headers.get("content-type"))&&ee.setContentType(ie),ne.body){const[le,ye]=Zt(q,Fe(Qt(G)));S=rn(ne.body,sn,le,ye)}}d.isString(I)||(I=I?"include":"omit");const J=i&&"credentials"in n.prototype,fe={...F,signal:M,method:g.toUpperCase(),headers:ee.normalize().toJSON(),body:S,duplex:"half",credentials:J?I:void 0};O=i&&new n(y,fe);let te=await(i?W(O,F):W(y,fe));const me=u&&(x==="stream"||x==="response");if(u&&(T||me&&U)){const ne={};["status","statusText","headers"].forEach(Ve=>{ne[Ve]=te[Ve]});const ie=d.toFiniteNumber(te.headers.get("content-length")),[le,ye]=T&&Zt(ie,Fe(Qt(T),!0))||[];te=new r(rn(te.body,sn,le,()=>{ye&&ye(),U&&U()}),ne)}x=x||"text";let be=await h[d.findKey(h,x)||"text"](te,p);return!me&&U&&U(),await new Promise((ne,ie)=>{Xt(ne,ie,{data:be,headers:Z.from(te.headers),status:te.status,statusText:te.statusText,config:p,request:O})})}catch(J){throw U&&U(),J&&J.name==="TypeError"&&/Load failed|fetch/i.test(J.message)?Object.assign(new C("Network Error",C.ERR_NETWORK,p,O),{cause:J.cause||J}):C.from(J,J&&J.code,p,O)}}},As=new Map,cn=e=>{let t=e?e.env:{};const{fetch:n,Request:r,Response:s}=t,i=[r,s,n];let o=i.length,l=o,m,f,u=As;for(;l--;)m=i[l],f=u.get(m),f===void 0&&u.set(m,f=l?new Map:vs(t)),u=f;return f};cn();const lt={http:Wr,xhr:bs,fetch:{get:cn}};d.forEach(lt,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const un=e=>`- ${e}`,Cs=e=>d.isFunction(e)||e===null||e===!1,dn={getAdapter:(e,t)=>{e=d.isArray(e)?e:[e];const{length:n}=e;let r,s;const i={};for(let o=0;o<n;o++){r=e[o];let l;if(s=r,!Cs(r)&&(s=lt[(l=String(r)).toLowerCase()],s===void 0))throw new C(`Unknown adapter '${l}'`);if(s&&(d.isFunction(s)||(s=s.get(t))))break;i[l||"#"+o]=s}if(!s){const o=Object.entries(i).map(([m,f])=>`adapter ${m} `+(f===!1?"is not supported by the environment":"is not available in the build"));let l=n?o.length>1?`since :
|
|
68
69
|
`+o.map(un).join(`
|
|
69
|
-
`):" "+un(o[0]):"as no adapter specified";throw new C("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return
|
|
70
|
-
`+i):s.stack=i}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=ce(this.defaults,n);const{transitional:s,paramsSerializer:r,headers:i}=n;s!==void 0&&Be.assertOptions(s,{silentJSONParsing:oe.transitional(oe.boolean),forcedJSONParsing:oe.transitional(oe.boolean),clarifyTimeoutError:oe.transitional(oe.boolean)},!1),r!=null&&(d.isFunction(r)?n.paramsSerializer={serialize:r}:Be.assertOptions(r,{encode:oe.function,serialize:oe.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Be.assertOptions(n,{baseUrl:oe.spelling("baseURL"),withXsrfToken:oe.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let o=i&&d.merge(i.common,i[n.method]);i&&d.forEach(["delete","get","head","post","put","patch","common"],p=>{delete i[p]}),n.headers=Y.concat(o,i);const l=[];let m=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(m=m&&y.synchronous,l.unshift(y.fulfilled,y.rejected))});const f=[];this.interceptors.response.forEach(function(y){f.push(y.fulfilled,y.rejected)});let u,h=0,x;if(!m){const p=[fn.bind(this),void 0];for(p.unshift(...l),p.push(...f),x=p.length,u=Promise.resolve(n);h<x;)u=u.then(p[h++],p[h++]);return u}x=l.length;let O=n;for(;h<x;){const p=l[h++],y=l[h++];try{O=p(O)}catch(g){y.call(this,g);break}}try{u=fn.call(this,O)}catch(p){return Promise.reject(p)}for(h=0,x=f.length;h<x;)u=u.then(f[h++],f[h++]);return u}getUri(t){t=ce(this.defaults,t);const n=en(t.baseURL,t.url,t.allowAbsoluteUrls);return zt(n,t.params,t.paramsSerializer)}};d.forEach(["delete","get","head","options"],function(t){ue.prototype[t]=function(n,s){return this.request(ce(s||{},{method:t,url:n,data:(s||{}).data}))}}),d.forEach(["post","put","patch"],function(t){function n(s){return function(i,o,l){return this.request(ce(l||{},{method:t,headers:s?{"Content-Type":"multipart/form-data"}:{},url:i,data:o}))}}ue.prototype[t]=n(),ue.prototype[t+"Form"]=n(!0)});let Rr=class zn{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let n;this.promise=new Promise(function(i){n=i});const s=this;this.promise.then(r=>{if(!s._listeners)return;let i=s._listeners.length;for(;i-- >0;)s._listeners[i](r);s._listeners=null}),this.promise.then=r=>{let i;const o=new Promise(l=>{s.subscribe(l),i=l}).then(r);return o.cancel=function(){s.unsubscribe(i)},o},t(function(i,o,l){s.reason||(s.reason=new pe(i,o,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new zn(function(r){t=r}),cancel:t}}};function kr(e){return function(n){return e.apply(null,n)}}function Nr(e){return d.isObject(e)&&e.isAxiosError===!0}const lt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(lt).forEach(([e,t])=>{lt[t]=e});function hn(e){const t=new ue(e),n=jt(ue.prototype.request,t);return d.extend(n,ue.prototype,t,{allOwnKeys:!0}),d.extend(n,t,null,{allOwnKeys:!0}),n.create=function(r){return hn(ce(e,r))},n}const M=hn(Ae);M.Axios=ue,M.CanceledError=pe,M.CancelToken=Rr,M.isCancel=Yt,M.VERSION=mn,M.toFormData=Le,M.AxiosError=C,M.Cancel=M.CanceledError,M.all=function(t){return Promise.all(t)},M.spread=kr,M.isAxiosError=Nr,M.mergeConfig=ce,M.AxiosHeaders=Y,M.formToJSON=e=>Vt(d.isHTMLForm(e)?new FormData(e):e),M.getAdapter=dn.getAdapter,M.HttpStatusCode=lt,M.default=M;const{Axios:Ko,AxiosError:Yo,CanceledError:Xo,isCancel:Zo,CancelToken:Qo,VERSION:ei,all:ti,Cancel:ni,isAxiosError:si,spread:ri,toFormData:oi,AxiosHeaders:ii,HttpStatusCode:ai,formToJSON:li,getAdapter:ci,mergeConfig:ui}=M,jr=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"👤"}),Or=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"⚙️"}),Ur=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"❓"}),Tr=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"🚪"}),Pr=[{id:"profile",label:"个人主页",icon:c.jsx(jr,{})},{id:"settings",label:"设置",icon:c.jsx(Or,{})},{id:"help",label:"帮助",icon:c.jsx(Ur,{})},{id:"logout",label:"退出",icon:c.jsx(Tr,{})}],gn=({userId:e,userName:t,userAvatar:n,apiConfig:s,menuItems:r=Pr,avatarSize:i="md",isLoading:o=!1,error:l=null,avatarClassName:m,userNameClassName:f,containerClassName:u,onMenuOpen:h,onMenuClose:x,onMenuItemClick:O,onLogout:p,renderMenuItem:y,renderUserInfo:g})=>{const[E,k]=R.useState({id:e||"",name:t||"",avatar:n||"",level:0,badges:[]}),[N,P]=R.useState(o),[A,I]=R.useState(l);R.useEffect(()=>{e&&s&&!t&&!n&&w()},[e,s,t,n]);const w=async()=>{P(!0),I(null);try{const D=s.endpoints.userProfile.replace(":userId",e),J=await M.get(`${s.baseURL}${D}`,{headers:s.headers});k(J.data)}catch(D){I(D)}finally{P(!1)}},F=D=>{O?.(D.id),D.id==="logout"&&p?.()},q=()=>{h?.()},ne=()=>{x?.()},z=()=>c.jsxs("div",{className:"user-profile-trigger",children:[c.jsx(ye.Avatar,{src:E.avatar,size:i,className:m,alt:"用户头像"}),c.jsx("span",{className:`user-name ${f||""}`,children:E.name})]});return N?c.jsx("div",{className:`user-profile-container ${u||""} is-loading`,children:c.jsx("div",{className:"user-profile-loading",children:"加载中..."})}):A?c.jsx("div",{className:`user-profile-container ${u||""} has-error`,children:c.jsxs("div",{className:"user-profile-error",children:["错误: ",A.message]})}):E.name?c.jsx("div",{className:`user-profile-container ${u||""}`,children:c.jsx(Xe,{trigger:g?g(E):z(),items:r.map(D=>({...D,onClick:()=>F(D)})),position:"bottom",alignment:"end",onOpen:q,onClose:ne,renderItem:y?D=>y(D,E):void 0})}):c.jsx("div",{className:`user-profile-container ${u||""}`,children:c.jsx("div",{className:"user-profile-loading",children:"未登录"})})},Ir=e=>c.jsxs("div",{className:"explore-menu-item",onClick:()=>e.onClick?.(e),children:[c.jsx("span",{className:"explore-item-label",children:e.label}),e.status&&c.jsx("span",{className:`explore-item-status status-${e.status.toLowerCase().replace("%","").replace(" ","-")}`,children:e.status})]},e.id),Lr=()=>c.jsxs("button",{className:"explore-button","aria-label":"探索数学课程",children:[c.jsx("span",{className:"explore-icon",children:"🌍"}),c.jsx("span",{className:"explore-text",children:"探索"})]}),Dr=({className:e="",style:t,logoHref:n="/",logoText:s="MathWiz",onLogoClick:r,exploreItems:i=[],exploreMenuOpen:o=!1,onExploreMenuToggle:l,onExploreItemClick:m,renderExploreItem:f=Ir,userData:u,userMenuItems:h,onUserMenuItemClick:x,onLogout:O,isLoading:p=!1,error:y=null,headerClassName:g="",logoClassName:E="",exploreClassName:k="",userProfileClassName:N="","aria-label":P,"aria-labelledby":A,...I})=>{const w=i.map(F=>({id:F.id,label:f(F),onClick:()=>m?.(F)}));return c.jsx("header",{className:`mathwiz-header site-header ${g} ${e}`,style:t,"aria-label":P,"aria-labelledby":A,role:"banner",...I,children:c.jsxs("div",{className:"header-content",children:[c.jsx("div",{className:"header-section left",children:c.jsx(Xe,{trigger:c.jsx(Lr,{}),items:w,position:"bottom",alignment:"start",openDelay:300,closeDelay:100,onOpen:()=>l?.(!0),onClose:()=>l?.(!1),className:`explore-submenu ${k}`,menuClassName:"explore-panel"})}),c.jsx("div",{className:"header-section center",children:c.jsx("a",{href:n,className:`logo ${E}`,onClick:r,"aria-label":"MathWiz 首页",children:s})}),c.jsx("div",{className:"header-section right",children:c.jsx(gn,{userName:u?.name,userAvatar:u?.avatar,menuItems:h,onMenuItemClick:x,onLogout:O,containerClassName:N,isLoading:p,error:y})})]})})},_n=R.memo(Dr,(e,t)=>e.logoText===t.logoText&&e.logoHref===t.logoHref&&e.className===t.className&&e.headerClassName===t.headerClassName&&e.logoClassName===t.logoClassName&&e.exploreClassName===t.exploreClassName&&e.userProfileClassName===t.userProfileClassName&&e["aria-label"]===t["aria-label"]&&e["aria-labelledby"]===t["aria-labelledby"]&&e.isLoading===t.isLoading&&e.error===t.error&&JSON.stringify(e.exploreItems)===JSON.stringify(t.exploreItems)&&JSON.stringify(e.userData)===JSON.stringify(t.userData)&&JSON.stringify(e.userMenuItems)===JSON.stringify(t.userMenuItems)),bn=({abilities:e,width:t=400,height:n=400})=>{const s=()=>e.length===0?"":e.map(o=>{if(o.svgPoint)return`${o.svgPoint.x},${o.svgPoint.y}`;const l=Math.PI*2*e.indexOf(o)/e.length,m=o.score/o.maxScore*40+10,f=50+m*Math.sin(l),u=50-m*Math.cos(l);return`${f},${u}`}).join(" "),r=o=>{const l=Math.PI*2*o/Math.max(e.length,1),m=50+40*Math.sin(l),f=50-40*Math.cos(l);return{x2:m,y2:f}},i=o=>{const l=Math.PI*2*o/Math.max(e.length,1),m=50+45*Math.sin(l),f=50-45*Math.cos(l);let u="middle";return l>Math.PI*.25&&l<Math.PI*.75&&(u="start"),l>Math.PI*1.25&&l<Math.PI*1.75&&(u="end"),{x:m,y:f,textAnchor:u}};return c.jsxs("svg",{"data-testid":"radar-chart",width:t,height:n,viewBox:"0 0 100 100",className:"w-full h-full",preserveAspectRatio:"xMidYMid meet",children:[c.jsx("circle",{"data-testid":"center-point",cx:"50",cy:"50",r:"1",fill:"#4A90E2"}),e.map((o,l)=>{const{x2:m,y2:f}=r(l);return c.jsx("line",{"data-testid":"axis-line",x1:"50",y1:"50",x2:m,y2:f,stroke:"#E2E8F0",strokeWidth:"0.5"},`axis-${l}`)}),e.length>2&&c.jsx("polygon",{"data-testid":"radar-polygon",points:s(),fill:"rgba(74, 144, 226, 0.2)",stroke:"rgb(74, 144, 226)",strokeWidth:"1",fillRule:"evenodd"}),e.map((o,l)=>{let m,f;if(o.svgPoint)m=o.svgPoint.x,f=o.svgPoint.y;else{const u=Math.PI*2*l/e.length,h=o.score/o.maxScore*40+10;m=50+h*Math.sin(u),f=50-h*Math.cos(u)}return c.jsx("circle",{"data-testid":"data-point",cx:m,cy:f,r:"2",fill:o.progressBarColor==="bg-orange-400"?"#FBBF24":"#4A90E2"},`point-${o.name}`)}),e.map((o,l)=>{const{x:m,y:f,textAnchor:u}=i(l);return c.jsx("text",{x:m,y:f,textAnchor:u,fontSize:"5",fill:"#334155",className:"text-xs",children:o.name},`label-${o.name}`)})]})},yn=e=>{let t;const n=new Set,s=(f,u)=>{const h=typeof f=="function"?f(t):f;if(!Object.is(h,t)){const x=t;t=u??(typeof h!="object"||h===null)?h:Object.assign({},t,h),n.forEach(O=>O(t,x))}},r=()=>t,l={setState:s,getState:r,getInitialState:()=>m,subscribe:f=>(n.add(f),()=>n.delete(f))},m=t=e(s,r,l);return l},Mr=(e=>e?yn(e):yn),Fr=e=>e;function $r(e,t=Fr){const n=R.useSyncExternalStore(e.subscribe,R.useCallback(()=>t(e.getState()),[e,t]),R.useCallback(()=>t(e.getInitialState()),[e,t]));return R.useDebugValue(n),n}const xn=e=>{const t=Mr(e),n=s=>$r(t,s);return Object.assign(n,t),n},Br=(e=>e?xn(e):xn),wn={overallRating:"优秀",generalRecommendation:"你的空间想象力和逻辑推理能力非常出色!若能进一步提升在复杂图形下的专注力,你将所向披靡。建议尝试我们‘专注力挑战’系列游戏。",abilities:[{name:"空间想象力",score:7.5,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:50,y:17.5},recommendation:"通过观察三维物体在不同角度的投影,或尝试构建复杂结构的游戏,能有效提升空间想象力。",recommendationLink:"#spatial-challenges"},{name:"逻辑推理",score:8,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:82,y:35},recommendation:"解决数独、迷宫或逻辑谜题,能够持续锻炼你的逻辑思维,尝试挑战更高难度的推理游戏。",recommendationLink:"#logic-puzzles"},{name:"图形辨识",score:9,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:85,y:65},recommendation:"你在这方面表现出色!可以尝试在更复杂、干扰因素更多的图形中进行辨识训练,保持敏锐。",recommendationLink:"#graphic-training"},{name:"专注力",score:7,maxScore:10,progressBarColor:"bg-orange-400",svgPoint:{x:50,y:80},recommendation:"在长时间的游戏中保持专注对你来说是一个挑战,建议尝试我们‘专注力挑战’系列游戏,逐渐延长专注时间。",recommendationLink:"#focus-challenges"},{name:"观察力",score:8.5,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:15,y:65},recommendation:"你的观察力非常敏锐,在细节发现上尤为突出。尝试在限时模式下进行观察力训练,提高反应速度。",recommendationLink:"#observation-drills"},{name:"抗压性",score:7.8,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:18,y:35},recommendation:"面对高压挑战时,保持冷静是关键。通过模拟竞赛或限时任务来提升抗压能力,逐步适应压力。",recommendationLink:"#stress-games"}]};class qr{static API_BASE_URL="/api/radar-ability";static async fetchRadarAbilityData(){try{return process.env.NODE_ENV==="test"?(await new Promise(t=>setTimeout(t,100)),wn):(await M.get(`${this.API_BASE_URL}/assessment`)).data}catch(t){if(console.error("Failed to fetch radar ability data:",t),process.env.NODE_ENV==="test")throw new Error("获取能力评估数据失败");return wn}}static async submitFeedback(t){try{await M.post(`${this.API_BASE_URL}/feedback`,t)}catch(n){throw console.error("Failed to submit feedback:",n),new Error("提交反馈失败")}}}const Hr=Br((e,t)=>({data:null,loading:!1,error:null,fetchData:async()=>{if(!t().loading){e({loading:!0,error:null});try{const n=await qr.fetchRadarAbilityData();e({data:n,loading:!1})}catch(n){const s=n instanceof Error?n.message:"获取数据失败";e({error:s,loading:!1})}}},setData:n=>{e({data:n,error:null,loading:!1})},setError:n=>{e({error:n,loading:!1})},reset:()=>{e({data:null,loading:!1,error:null})}})),vn=({ability:e})=>{const t=e.score/e.maxScore*100;return c.jsxs("div",{className:"ability-progress-bar-item","data-ability":e.name,"data-testid":"progress-bar-container",children:[c.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[c.jsx("span",{className:"text-gray-700 font-medium",children:e.name}),c.jsxs("span",{className:"text-gray-600",children:[e.score,"/",e.maxScore]})]}),c.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2.5","data-testid":"progress-bar-outer",children:c.jsx("div",{className:`${e.progressBarColor} h-2.5 rounded-full transition-all duration-300`,style:{width:`${t}%`},"data-testid":"progress-bar-inner",role:"progressbar","aria-valuenow":e.score,"aria-valuemin":0,"aria-valuemax":e.maxScore,"aria-label":`${e.name} progress: ${e.score} out of ${e.maxScore}`})})]})},En=({generalRecommendation:e})=>c.jsx("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4","data-testid":"advice-panel",role:"region","aria-label":"个性化建议",children:c.jsxs("div",{className:"flex items-start",children:[c.jsx("div",{className:"flex-shrink-0",children:c.jsx("i",{className:"material-icons text-blue-500","data-testid":"lightbulb-icon","aria-hidden":"true",children:"lightbulb"})}),c.jsxs("div",{className:"ml-3",children:[c.jsx("h3",{className:"text-md font-semibold text-blue-800","aria-level":3,children:"个性化建议"}),c.jsx("p",{className:"text-sm text-blue-700 mt-1","data-testid":"recommendation-text",children:e})]})]})}),Sn=({ability:e,customLinkTexts:t={}})=>{const n=s=>{const r={空间想象力:"探索空间挑战",逻辑推理:"深入逻辑谜题",图形辨识:"精进图形训练",专注力:"挑战专注极限",观察力:"提升观察速度",抗压性:"磨砺抗压意志"};return t[s]||r[s]||"开始挑战"};return c.jsx(ye.Card,{className:"recommendation-card w-full max-w-sm hover:shadow-lg transition-all duration-300","data-ability":e.name,"data-testid":"recommendation-card",isHoverable:!0,isPressable:!0,children:c.jsx(ye.CardBody,{className:"p-5",children:c.jsxs("div",{className:"flex flex-col gap-3",children:[c.jsxs("h4",{className:"text-lg font-semibold text-foreground","aria-level":4,children:[e.name,": 专项提高"]}),c.jsx("p",{className:"text-sm text-default-600 leading-relaxed","data-testid":"recommendation-description",children:e.recommendation}),c.jsx(ye.Button,{as:"a",href:e.recommendationLink,className:"mt-2 w-fit",size:"sm",variant:"flat",color:"primary",endContent:c.jsx(ts,{className:"w-4 h-4"}),"data-testid":"recommendation-link","aria-label":`前往${e.name}专项提高页面`,children:n(e.name)})]})})})},qe={dashboardLayout:"_dashboardLayout_10wqn_5",upperSection:"_upperSection_10wqn_19",lowerSection:"_lowerSection_10wqn_33",radarChartArea:"_radarChartArea_10wqn_51"},Wr=()=>{const{data:e,loading:t,error:n,fetchData:s}=Hr();return R.useEffect(()=>{s()},[s]),t?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 flex items-center justify-center","data-testid":"loading-spinner",children:[c.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500"}),c.jsx("span",{className:"ml-3 text-gray-600",children:"加载中..."})]}):n?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 text-center",role:"alert","aria-live":"assertive",children:[c.jsx("div",{className:"text-red-500 mb-4",children:c.jsx("i",{className:"material-icons text-4xl","aria-hidden":"true",children:"error_outline"})}),c.jsx("h3",{className:"text-lg font-semibold text-gray-800 mb-2",children:"加载失败"}),c.jsx("p",{className:"text-gray-600 mb-4",children:n}),c.jsx("button",{onClick:s,className:"bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2","aria-label":"重试加载数据",children:"重试"})]}):e?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 animate-fade-in","data-component":"AbilityAssessmentDashboard",role:"main","aria-label":"能力评估雷达图展示",children:[c.jsxs("div",{className:"flex justify-between items-center mb-6",children:[c.jsx("h2",{className:"text-xl font-bold text-gray-800",children:"能力评估雷达图"}),c.jsxs("span",{className:"bg-blue-100 text-blue-800 text-sm font-semibold px-2.5 py-0.5 rounded-full","aria-label":`综合评级: ${e.overallRating}`,children:["综合评级: ",e.overallRating]})]}),c.jsxs("div",{className:qe.dashboardLayout,children:[c.jsxs("div",{className:qe.upperSection,children:[c.jsx("div",{className:qe.radarChartArea,children:c.jsx(bn,{abilities:e.abilities})}),c.jsx("div",{className:"space-y-4 flex flex-col justify-around py-2",children:e.abilities.map(r=>c.jsx(vn,{ability:r},r.name))})]}),c.jsxs("div",{className:qe.lowerSection,children:[c.jsx(En,{generalRecommendation:e.generalRecommendation}),c.jsx("h3",{className:"text-lg font-bold text-gray-800 mb-4 mt-6",children:"专项提升建议"}),c.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:e.abilities.map(r=>c.jsx(Sn,{ability:r},r.name))})]})]})]}):c.jsx("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 text-center",role:"status","aria-live":"polite",children:c.jsx("p",{className:"text-gray-600",children:"暂无数据"})})},ct={"Arithmetic and Algebra":"🔢","Graphics and Geometry":"📐","Probability and Statistics":"📊",Default:"📚"},zr={mastered:"已掌握",proficient:"熟练",familiar:"熟悉",attempted:"已尝试","not-started":"未开始"},Jr={mastered:"#10b981",proficient:"#3b82f6",familiar:"#f59e0b",attempted:"#8b5cf6","not-started":"#6b7280"},Re={id:"user-001",name:"小明",level:5,avatar:"https://i.pravatar.cc/40?u=student1",logIn:!0,badges:["🏆","🏅","🌟"]},Gr=[{id:"g3",label:"三年级",status:"new",onClick:()=>console.log("三年级 clicked")},{id:"g4",label:"四年级",status:"2%",onClick:()=>console.log("四年级 clicked")},{id:"g5",label:"五年级",status:"进行中",onClick:()=>console.log("五年级 clicked")},{id:"g6",label:"六年级",status:"new",onClick:()=>console.log("六年级 clicked")},{id:"g7",label:"七年级",status:"new",onClick:()=>console.log("七年级 clicked")},{id:"g8",label:"八年级",status:"new",onClick:()=>console.log("八年级 clicked")},{id:"alg_topic",label:"代数专题",status:"new",onClick:()=>console.log("代数专题 clicked")},{id:"calc_topic",label:"计算专题",status:"new",onClick:()=>console.log("计算专题 clicked")},{id:"geo_topic",label:"几何专题",status:"new",onClick:()=>console.log("几何专题 clicked")},{id:"olym_topic",label:"奥数专题",status:"new",onClick:()=>console.log("奥数专题 clicked")}],Vr="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLTAwMSIsIm5hbWUiOiLlsI_mmI4iLCJsZXZlbCI6NSwiYXZhdGFyIjoiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzQwP3U9c3R1ZGVudDEiLCJiYWRnZXMiOlsi8J-SoiIsIvCfjZUiLCLwn5KbIl0sImlhdCI6MTY5MTYwMDAwMCwiZXhwIjoxNzIzMTM2MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";class Kr{baseURL;token;constructor(t="/api",n=Vr){this.baseURL=t,this.token=n}getAuthHeaders(){return{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"}}async fetchWithAuth(t,n={}){const s=await fetch(t,{...n,headers:{...this.getAuthHeaders(),...n.headers}});if(!s.ok)throw new Error(`HTTP error! status: ${s.status}`);return s}async getCourseData(t){return(await this.fetchWithAuth(`${this.baseURL}/courses/${t}`)).json()}async getUserGradeUnitsNav(t){const n=t?`${this.baseURL}/user/grade/units/nav?gradeId=${encodeURIComponent(t)}`:`${this.baseURL}/user/grade/units/nav`;return(await this.fetchWithAuth(n)).json()}async getUnitProgress(t,n){const s=n?`${this.baseURL}/courses/${t}/units/${n}/progress`:`${this.baseURL}/courses/${t}/progress`;return(await this.fetchWithAuth(s)).json()}async batchUpdateLessonProgress(t,n){return(await this.fetchWithAuth(`${this.baseURL}/user/units/${t}/progress/batch`,{method:"POST",body:JSON.stringify(n)})).json()}async updateLessonProgress(t,n,s,r){await this.fetchWithAuth(`${this.baseURL}/courses/${t}/units/${n}/lessons/${s}/progress`,{method:"POST",body:JSON.stringify({status:r})})}setToken(t){this.token=t}getToken(){return this.token}}const ut=new Kr,H={id:"g5",title:"小学数学五年级",level:5,subject:"数学",units:[{id:"unit_1",title:"小数乘法",description:"学习小数乘法的计算方法及应用",estimatedDuration:"3周",totalLessons:10,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit1_lesson1",title:"小数乘整数",duration:40,knowledgeItems:[{id:"unit1_lesson1_k1",title:"小数乘整数的意义",description:"理解小数乘整数的意义与整数乘法相同",progress:0,contentUrl:""},{id:"unit1_lesson1_k2",title:"小数乘整数的计算方法",description:"掌握小数乘整数的计算方法:先按整数乘法计算,再看因数中有几位小数,就从积的右边起数出几位点上小数点",progress:0,contentUrl:""}]},{id:"unit1_lesson2",title:"小数乘小数",duration:40,knowledgeItems:[{id:"unit1_lesson2_k1",title:"小数乘小数的计算方法",description:"掌握小数乘小数的计算方法:先按整数乘法算出积,再给积点上小数点",progress:0,contentUrl:""},{id:"unit1_lesson2_k2",title:"积的小数位数确定",description:"理解积的小数位数等于两个因数的小数位数之和",progress:0,contentUrl:""}]},{id:"unit1_lesson3",title:"积的近似数",duration:40,knowledgeItems:[{id:"unit1_lesson3_k1",title:'用"四舍五入"法求积的近似数',description:'掌握用"四舍五入"法求积的近似数的方法',progress:0,contentUrl:""}]},{id:"unit1_lesson4",title:"整数乘法运算定律推广到小数",duration:40,knowledgeItems:[{id:"unit1_lesson4_k1",title:"乘法运算定律在小数中的适用性",description:"理解整数乘法运算定律对于小数乘法同样适用",progress:0,contentUrl:""},{id:"unit1_lesson4_k2",title:"运用运算定律进行简便计算",description:"能运用乘法运算定律进行小数乘法的简便计算",progress:0,contentUrl:""}]},{id:"unit1_lesson5",title:"解决问题",duration:40,knowledgeItems:[{id:"unit1_lesson5_k1",title:"用小数乘法解决实际问题",description:"能运用小数乘法解决购物、面积计算等实际问题",progress:0,contentUrl:""}]}]},{id:"unit_2",title:"小数除法",description:"学习小数除法的计算方法及应用",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit2_lesson1",title:"小数除以整数",duration:40,knowledgeItems:[{id:"unit2_lesson1_k1",title:"小数除以整数的计算方法",description:"掌握小数除以整数的计算方法:按照整数除法的方法计算,商的小数点要与被除数的小数点对齐",progress:0,contentUrl:""}]},{id:"unit2_lesson2",title:"一个数除以小数",duration:40,knowledgeItems:[{id:"unit2_lesson2_k1",title:"除数是小数的除法计算方法",description:"掌握除数是小数的除法计算方法:利用商不变的性质,将除数转化为整数",progress:0,contentUrl:""}]},{id:"unit2_lesson3",title:"商的近似数",duration:40,knowledgeItems:[{id:"unit2_lesson3_k1",title:'用"四舍五入"法求商的近似数',description:'掌握用"四舍五入"法求商的近似数的方法',progress:0,contentUrl:""}]},{id:"unit2_lesson4",title:"循环小数",duration:40,knowledgeItems:[{id:"unit2_lesson4_k1",title:"循环小数的概念",description:"理解循环小数的概念,认识循环节",progress:0,contentUrl:""},{id:"unit2_lesson4_k2",title:"循环小数的表示方法",description:"掌握循环小数的简便表示方法",progress:0,contentUrl:""}]},{id:"unit2_lesson5",title:"用计算器探索规律",duration:40,knowledgeItems:[{id:"unit2_lesson5_k1",title:"用计算器计算小数除法",description:"会用计算器计算较复杂的小数除法",progress:0,contentUrl:""},{id:"unit2_lesson5_k2",title:"发现商的变化规律",description:"能借助计算器发现商的变化规律",progress:0,contentUrl:""}]},{id:"unit2_lesson6",title:"解决问题",duration:40,knowledgeItems:[{id:"unit2_lesson6_k1",title:"用小数除法解决实际问题",description:"能运用小数除法解决购物、分配等实际问题",progress:0,contentUrl:""}]}]},{id:"unit_3",title:"简易方程",description:"学习用字母表示数和解简易方程",estimatedDuration:"4周",totalLessons:14,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit3_lesson1",title:"用字母表示数",duration:40,knowledgeItems:[{id:"unit3_lesson1_k1",title:"用字母表示数",description:"初步理解用字母表示数的意义和作用",progress:0,contentUrl:""},{id:"unit3_lesson1_k2",title:"用字母表示运算定律和计算公式",description:"会用字母表示运算定律和计算公式",progress:0,contentUrl:""}]},{id:"unit3_lesson2",title:"方程的意义",duration:40,knowledgeItems:[{id:"unit3_lesson2_k1",title:"方程的概念",description:"理解方程的意义,知道方程与等式的区别和联系",progress:0,contentUrl:""}]},{id:"unit3_lesson3",title:"等式的性质",duration:40,knowledgeItems:[{id:"unit3_lesson3_k1",title:"等式的性质1",description:"理解等式的性质1:等式两边加上或减去同一个数,左右两边仍然相等",progress:0,contentUrl:""},{id:"unit3_lesson3_k2",title:"等式的性质2",description:"理解等式的性质2:等式两边乘同一个数,或除以同一个不为0的数,左右两边仍然相等",progress:0,contentUrl:""}]},{id:"unit3_lesson4",title:"解简易方程",duration:40,knowledgeItems:[{id:"unit3_lesson4_k1",title:"利用等式的性质解方程",description:"会利用等式的性质解形如x±a=b、ax=b、x÷a=b、a-x=b、a÷x=b的方程",progress:0,contentUrl:""}]},{id:"unit3_lesson5",title:"实际问题与方程",duration:40,knowledgeItems:[{id:"unit3_lesson5_k1",title:"列方程解决实际问题",description:"初步学会列方程解决一些简单的实际问题",progress:0,contentUrl:""}]}]},{id:"unit_4",title:"多边形的面积",description:"学习平行四边形、三角形、梯形和组合图形的面积计算",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Graphics and Geometry",lessons:[{id:"unit4_lesson1",title:"平行四边形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson1_k1",title:"平行四边形面积公式的推导",description:"通过割补法理解平行四边形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson1_k2",title:"平行四边形面积的计算",description:"掌握平行四边形面积计算公式:S=ah,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson2",title:"三角形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson2_k1",title:"三角形面积公式的推导",description:"通过拼摆法理解三角形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson2_k2",title:"三角形面积的计算",description:"掌握三角形面积计算公式:S=ah÷2,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson3",title:"梯形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson3_k1",title:"梯形面积公式的推导",description:"通过拼摆法理解梯形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson3_k2",title:"梯形面积的计算",description:"掌握梯形面积计算公式:S=(a+b)h÷2,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson4",title:"组合图形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson4_k1",title:"认识组合图形",description:"认识组合图形,会把组合图形分解成已学过的平面图形",progress:0,contentUrl:""},{id:"unit4_lesson4_k2",title:"计算组合图形的面积",description:"掌握计算组合图形面积的多种方法",progress:0,contentUrl:""}]}]},{id:"unit_5",title:"因数与倍数",description:"学习因数、倍数、质数、合数等概念",estimatedDuration:"3周",totalLessons:10,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit5_lesson1",title:"因数和倍数",duration:40,knowledgeItems:[{id:"unit5_lesson1_k1",title:"因数和倍数的意义",description:"理解因数和倍数的意义,掌握找一个数的因数和倍数的方法",progress:0,contentUrl:""},{id:"unit5_lesson1_k2",title:"因数和倍数的特征",description:"了解一个数的因数的个数是有限的,倍数的个数是无限的",progress:0,contentUrl:""}]},{id:"unit5_lesson2",title:"2、5、3的倍数的特征",duration:40,knowledgeItems:[{id:"unit5_lesson2_k1",title:"2、5的倍数的特征",description:"掌握2、5的倍数的特征,理解奇数和偶数的意义",progress:0,contentUrl:""},{id:"unit5_lesson2_k2",title:"3的倍数的特征",description:"掌握3的倍数的特征,能判断一个数是不是3的倍数",progress:0,contentUrl:""}]},{id:"unit5_lesson3",title:"质数和合数",duration:40,knowledgeItems:[{id:"unit5_lesson3_k1",title:"质数和合数的意义",description:"理解质数和合数的意义,能判断一个数是质数还是合数",progress:0,contentUrl:""},{id:"unit5_lesson3_k2",title:"制作100以内的质数表",description:"会制作100以内的质数表,熟记20以内的质数",progress:0,contentUrl:""}]}]},{id:"unit_6",title:"长方体和正方体",description:"学习长方体和正方体的特征、表面积和体积计算",estimatedDuration:"4周",totalLessons:14,moduleCategory:"Graphics and Geometry",lessons:[{id:"unit6_lesson1",title:"长方体和正方体的认识",duration:40,knowledgeItems:[{id:"unit6_lesson1_k1",title:"长方体的特征",description:"认识长方体的特征,了解长方体的长、宽、高",progress:0,contentUrl:""},{id:"unit6_lesson1_k2",title:"正方体的特征",description:"认识正方体的特征,理解正方体是特殊的长方体",progress:0,contentUrl:""}]},{id:"unit6_lesson2",title:"长方体和正方体的表面积",duration:40,knowledgeItems:[{id:"unit6_lesson2_k1",title:"表面积的意义",description:"理解表面积的意义,掌握长方体和正方体表面积的计算方法",progress:0,contentUrl:""},{id:"unit6_lesson2_k2",title:"表面积的实际应用",description:"能运用表面积知识解决一些实际问题",progress:0,contentUrl:""}]},{id:"unit6_lesson3",title:"长方体和正方体的体积",duration:40,knowledgeItems:[{id:"unit6_lesson3_k1",title:"体积和体积单位",description:"理解体积的意义,认识常用的体积单位",progress:0,contentUrl:""},{id:"unit6_lesson3_k2",title:"长方体和正方体体积的计算",description:"掌握长方体和正方体体积的计算公式",progress:0,contentUrl:""},{id:"unit6_lesson3_k3",title:"体积单位间的进率",description:"掌握体积单位之间的进率和换算",progress:0,contentUrl:""}]},{id:"unit6_lesson4",title:"容积和容积单位",duration:40,knowledgeItems:[{id:"unit6_lesson4_k1",title:"容积和容积单位",description:"理解容积的意义,认识常用的容积单位",progress:0,contentUrl:""},{id:"unit6_lesson4_k2",title:"容积和体积的关系",description:"掌握容积和体积之间的关系",progress:0,contentUrl:""}]}]},{id:"unit_7",title:"分数的意义和性质",description:"学习分数的意义、性质和约分、通分等方法",estimatedDuration:"4周",totalLessons:16,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit7_lesson1",title:"分数的意义",duration:40,knowledgeItems:[{id:"unit7_lesson1_k1",title:"分数的产生和意义",description:"理解分数的产生和意义,明确分数与除法的关系",progress:0,contentUrl:""},{id:"unit7_lesson1_k2",title:"分数单位",description:"认识分数单位,能说出一个分数中有几个这样的分数单位",progress:0,contentUrl:""}]},{id:"unit7_lesson2",title:"分数与除法",duration:40,knowledgeItems:[{id:"unit7_lesson2_k1",title:"分数与除法的关系",description:"理解分数与除法的关系,会用分数表示两个数相除的商",progress:0,contentUrl:""}]},{id:"unit7_lesson3",title:"真分数和假分数",duration:40,knowledgeItems:[{id:"unit7_lesson3_k1",title:"真分数和假分数的意义",description:"理解真分数和假分数的意义和特征",progress:0,contentUrl:""},{id:"unit7_lesson3_k2",title:"带分数",description:"认识带分数,会进行假分数与整数、带分数的互化",progress:0,contentUrl:""}]},{id:"unit7_lesson4",title:"分数的基本性质",duration:40,knowledgeItems:[{id:"unit7_lesson4_k1",title:"分数的基本性质",description:"理解分数的基本性质,能运用分数的基本性质进行分数的变形",progress:0,contentUrl:""}]},{id:"unit7_lesson5",title:"约分",duration:40,knowledgeItems:[{id:"unit7_lesson5_k1",title:"最大公因数",description:"理解公因数和最大公因数的意义,掌握求两个数的最大公因数的方法",progress:0,contentUrl:""},{id:"unit7_lesson5_k2",title:"约分的方法",description:"掌握约分的方法,能正确地进行约分",progress:0,contentUrl:""}]},{id:"unit7_lesson6",title:"通分",duration:40,knowledgeItems:[{id:"unit7_lesson6_k1",title:"最小公倍数",description:"理解公倍数和最小公倍数的意义,掌握求两个数的最小公倍数的方法",progress:0,contentUrl:""},{id:"unit7_lesson6_k2",title:"通分的方法",description:"掌握通分的方法,能正确地进行通分",progress:0,contentUrl:""}]},{id:"unit7_lesson7",title:"分数和小数的互化",duration:40,knowledgeItems:[{id:"unit7_lesson7_k1",title:"分数化成小数",description:"掌握分数化成小数的方法",progress:0,contentUrl:""},{id:"unit7_lesson7_k2",title:"小数化成分数",description:"掌握小数化成分数的方法",progress:0,contentUrl:""}]}]},{id:"unit_8",title:"分数的加法和减法",description:"学习同分母分数、异分母分数的加法和减法",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit8_lesson1",title:"同分母分数加、减法",duration:40,knowledgeItems:[{id:"unit8_lesson1_k1",title:"同分母分数加法的计算方法",description:"掌握同分母分数加法的计算方法",progress:0,contentUrl:""},{id:"unit8_lesson1_k2",title:"同分母分数减法的计算方法",description:"掌握同分母分数减法的计算方法",progress:0,contentUrl:""}]},{id:"unit8_lesson2",title:"异分母分数加、减法",duration:40,knowledgeItems:[{id:"unit8_lesson2_k1",title:"异分母分数加法的计算方法",description:"掌握异分母分数加法的计算方法:先通分,然后按照同分母分数加法进行计算",progress:0,contentUrl:""},{id:"unit8_lesson2_k2",title:"异分母分数减法的计算方法",description:"掌握异分母分数减法的计算方法:先通分,然后按照同分母分数减法进行计算",progress:0,contentUrl:""}]},{id:"unit8_lesson3",title:"分数加减混合运算",duration:40,knowledgeItems:[{id:"unit8_lesson3_k1",title:"分数加减混合运算的顺序",description:"掌握分数加减混合运算的运算顺序",progress:0,contentUrl:""},{id:"unit8_lesson3_k2",title:"整数加法运算定律推广到分数加法",description:"理解整数加法运算定律对于分数加法同样适用,能运用运算定律进行简便计算",progress:0,contentUrl:""}]}]},{id:"unit_9",title:"折线统计图",description:"学习单式折线统计图和复式折线统计图的认识和制作",estimatedDuration:"2周",totalLessons:6,moduleCategory:"Probability and Statistics",lessons:[{id:"unit9_lesson1",title:"单式折线统计图",duration:40,knowledgeItems:[{id:"unit9_lesson1_k1",title:"单式折线统计图的特点",description:"认识单式折线统计图,了解其特点和作用",progress:0,contentUrl:""},{id:"unit9_lesson1_k2",title:"绘制单式折线统计图",description:"能根据数据绘制单式折线统计图",progress:0,contentUrl:""}]},{id:"unit9_lesson2",title:"复式折线统计图",duration:40,knowledgeItems:[{id:"unit9_lesson2_k1",title:"复式折线统计图的特点",description:"认识复式折线统计图,了解其特点和作用",progress:0,contentUrl:""},{id:"unit9_lesson2_k2",title:"绘制复式折线统计图",description:"能根据数据绘制复式折线统计图",progress:0,contentUrl:""}]},{id:"unit9_lesson3",title:"数据分析",duration:40,knowledgeItems:[{id:"unit9_lesson3_k1",title:"根据统计图进行数据分析",description:"能根据折线统计图进行简单的数据分析,作出合理的判断和预测",progress:0,contentUrl:""}]}]}]},Yr=Gr,Xr=Re,An=R.createContext(null),Cn=()=>{const e=R.useContext(An);if(!e)throw new Error("useGradeUnitBrowser must be used within GradeUnitBrowserProvider");return e},Zr=({children:e})=>{const[t,n]=R.useState(null),[s,r]=R.useState([]),[i,o]=R.useState(null),[l,m]=R.useState({}),[f,u]=R.useState(!1),[h,x]=R.useState(null),[O,p]=R.useState(null),[y,g]=R.useState([]),E=R.useCallback(async(A,I)=>{u(!0),x(null);try{await new Promise(F=>setTimeout(F,100));try{console.log("Attempting to fetch units data from API..."),console.log("API URL will be:",`/api/user/grade/units/nav?gradeId=${A}`),console.log("Using token:",ut.getToken());const F=await ut.getUserGradeUnitsNav(A);console.log("API call successful, units data:",F),o(F),console.log("unitsData:",F)}catch(F){const q=F;console.error("🚨 MSW API 请求失败 - 详细调试信息:"),console.error("📡 请求 URL:",`/api/user/grade/units/nav?gradeId=${A}`),console.error("🔑 使用 Token:",ut.getToken()),console.error("❌ 错误信息:",q.message),console.error("📝 错误类型:",q.name),console.error("🔍 错误堆栈:",q.stack),x(`MSW API 请求失败: ${q.message} - 请检查浏览器控制台获取详细信息`);const ne={userId:I,courseId:"g5",courseTitle:"小学数学五年级",courseLevel:5,totalUnits:H.units.length,completedUnits:2,overallProgress:22,status:"in-progress",lastAccessed:new Date().toISOString(),units:H.units.map((z,D)=>({unitId:z.id,title:z.title,description:z.description,moduleCategory:z.moduleCategory,estimatedDuration:z.estimatedDuration,totalLessons:z.lessons.length,completedLessons:D<2?Math.floor(z.lessons.length*.5):0,progressPercentage:D<2?50:0,status:D<2?"in-progress":"not-started",lastAccessed:D<2?new Date().toISOString():void 0,isActive:D===0,route:`/math/grade-5/unit/${z.id}`,icon:ct[z.moduleCategory]||ct.Default}))};o(ne),console.log("Using courseData.ts as fallback:",ne)}const w={};H.units.forEach(F=>{w[F.id]=F.lessons.map(q=>({id:q.id,title:q.title,duration:q.duration,knowledgeItems:q.knowledgeItems.map(ne=>({...ne,progress:0}))}))}),console.log("Lessons data loaded:",w),m(w),console.log("unitsData:",i),console.log("unitsData.units:",i?.units),console.log("First unit isActive:",i?.units?.[0]?.isActive),console.log("First unit unitId:",i?.units?.[0]?.unitId),console.log("Lessons data keys:",Object.keys(w)),console.log("Lessons for unit_1:",w.unit_1),n({id:I,name:"学生用户",level:5,avatar:"https://i.pravatar.cc/40",badges:["🏆"]}),r([{id:"g5",label:"五年级",status:"进行中"},{id:"g6",label:"六年级",status:"new"}])}catch(w){x(w instanceof Error?w.message:"数据加载失败"),console.error("数据加载错误:",w),console.error("API call error details:",w),console.log("gradeId parameter:",A)}finally{u(!1)}},[]),k=R.useCallback(A=>{g(I=>I.includes(A)?I.filter(w=>w!==A):[...I,A])},[]),N=R.useCallback(A=>{p(A)},[]);R.useEffect(()=>{if(console.log("unitsData state updated:",i),i&&i.units.length>0){const A=i.units.find(I=>I.isActive)?.unitId||i.units[0].unitId;p(A),console.log("Default active unit set after state update:",A)}},[i]);const P={userInfo:t,exploreMenu:s,unitsData:i,lessons:l,loading:f,error:h,activeUnitId:O,activeLessonIds:y,setLoading:u,setError:x,setActiveUnit:N,toggleLesson:k,loadPageData:E};return c.jsx(An.Provider,{value:P,children:e})},Qr=({gradeId:e,userId:t,onLearnAction:n,className:s,userInfo:r,exploreMenu:i})=>{const{userInfo:o,exploreMenu:l,unitsData:m,lessons:f,loading:u,error:h,activeUnitId:x,activeLessonIds:O,setActiveUnit:p,toggleLesson:y,loadPageData:g}=Cn(),E=r??o,k=i??l;R.useEffect(()=>{g(e,t)},[e,t,g]),R.useEffect(()=>{console.log("activeUnitId from context:",x),console.log("lessons from context:",f);const A=m?.units?.find(w=>w.unitId===x)||null,I=A&&x&&f[x]?{id:A.unitId,title:A.title,description:A.description,estimatedDuration:A.estimatedDuration,totalLessons:A.totalLessons,moduleCategory:A.moduleCategory,lessons:f[x]}:null;console.log("activeUnit computed:",I)},[x,f,m]);const N=m?.units?.find(A=>A.unitId===x)||null,P=N&&x&&f[x]?{id:N.unitId,title:N.title,description:N.description,estimatedDuration:N.estimatedDuration,totalLessons:N.totalLessons,moduleCategory:N.moduleCategory,lessons:f[x]}:null;return u?c.jsx("div",{className:"grade-unit-browser-page loading","data-testid":"grade-unit-browser-page",children:c.jsx("div",{className:"loading-spinner","data-testid":"loading-spinner",children:"加载中..."})}):h?c.jsxs("div",{className:"grade-unit-browser-page error","data-testid":"grade-unit-browser-page",children:[c.jsx("div",{className:"error-message","data-testid":"error-message",children:h}),c.jsx("button",{onClick:()=>g(e,t),className:"retry-button",children:"重试"})]}):c.jsxs("div",{className:`grade-unit-browser-page ${s||""}`,"data-testid":"grade-unit-browser-page",children:[c.jsx("div",{className:"header-area",children:c.jsx(_n,{userData:E||void 0,exploreItems:k})}),c.jsx("div",{className:"sidebar-area",children:c.jsx(Nt,{data:m,activeUnitId:x,onUnitSelect:p,loading:u})}),c.jsx("div",{className:"content-area",children:c.jsx(kt,{unit:P,activeLessonIds:O,onToggleLesson:y,onLearnAction:n||(()=>{}),loading:u})})]})},te=(e,t,n)=>({x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}),eo=()=>{const e={x:.5,y:.1,name:"A"},t={x:.1,y:.75,name:"B"},n={x:.9,y:.75,name:"C"},s={...te(e,t,1/3),name:"D"},r={...te(e,n,1/3),name:"E"},i={...te(e,t,2/3),name:"M"},o={...te(e,n,2/3),name:"N"},l={...te(t,n,1/3),name:"P"},m={...te(t,n,2/3),name:"Q"},f={...te(s,r,1/3),name:"U"},u={...te(s,r,2/3),name:"S"},h={...te(i,o,1/3),name:"K"},x={...te(i,o,2/3),name:"L"};return{A:e,B:t,C:n,D:s,E:r,M:i,N:o,P:l,Q:m,U:f,S:u,K:h,L:x}},to=(e,t,n)=>{const s={};for(const[r,i]of Object.entries(e))s[r]={...i,x:i.x*t,y:i.y*n};return s},no=(e,t)=>{const[n,s,r]=t,{x:i,y:o}=e,l=(s.y-r.y)*(n.x-r.x)+(r.x-s.x)*(n.y-r.y);if(Math.abs(l)<1e-4)return!1;const m=((s.y-r.y)*(i-r.x)+(r.x-s.x)*(o-r.y))/l,f=((r.y-n.y)*(i-r.x)+(n.x-r.x)*(o-r.y))/l,u=1-m-f;return m>=-.001&&f>=-.001&&u>=-.001},so=(e,t)=>{if(!e||!t||e.length!==3||t.length!==3)return!1;const n=e.map(r=>r.name).sort(),s=t.map(r=>r.name).sort();return n.every((r,i)=>r===s[i])},ro=(e,t)=>{if(!e||!t||e.length!==t.length)return!1;const n=e.map(r=>r.name).sort(),s=t.map(r=>r.name).sort();return n.join("")===s.join("")},oo=()=>[{from:"A",to:"B"},{from:"A",to:"C"},{from:"B",to:"C"},{from:"D",to:"E"},{from:"M",to:"N"},{from:"P",to:"Q"},{from:"A",to:"D"},{from:"A",to:"E"},{from:"A",to:"M"},{from:"A",to:"N"},{from:"A",to:"P"},{from:"A",to:"Q"},{from:"D",to:"U"},{from:"U",to:"S"},{from:"S",to:"E"},{from:"M",to:"K"},{from:"K",to:"L"},{from:"L",to:"N"},{from:"B",to:"P"},{from:"P",to:"Q"},{from:"Q",to:"C"}],io=()=>[{id:"gem_1",vertices:["A","B","P"],points:10,category:"basic"},{id:"gem_2",vertices:["A","P","Q"],points:10,category:"basic"},{id:"gem_3",vertices:["A","Q","C"],points:10,category:"basic"},{id:"gem_4",vertices:["A","B","Q"],points:15,category:"medium"},{id:"gem_5",vertices:["A","P","C"],points:15,category:"medium"},{id:"gem_6",vertices:["A","B","C"],points:20,category:"large"},{id:"gem_7",vertices:["A","D","U"],points:12,category:"ade_small"},{id:"gem_8",vertices:["A","U","S"],points:12,category:"ade_small"},{id:"gem_9",vertices:["A","S","E"],points:12,category:"ade_small"},{id:"gem_10",vertices:["A","D","S"],points:18,category:"ade_medium"},{id:"gem_11",vertices:["A","U","E"],points:18,category:"ade_medium"},{id:"gem_12",vertices:["A","D","E"],points:25,category:"ade_large"},{id:"gem_13",vertices:["A","M","K"],points:14,category:"amn_small"},{id:"gem_14",vertices:["A","K","L"],points:14,category:"amn_small"},{id:"gem_15",vertices:["A","L","N"],points:14,category:"amn_small"},{id:"gem_16",vertices:["A","M","L"],points:20,category:"amn_medium"},{id:"gem_17",vertices:["A","K","N"],points:20,category:"amn_medium"},{id:"gem_18",vertices:["A","M","N"],points:30,category:"amn_large"}],ao={TOTAL_GEMS:18,CANVAS_RATIO:4/3,DEFAULT_VIEWBOX:{width:700,height:600},POINT_RADIUS:{default:6,selected:9},TOLERANCE:.001,MIN_TRIANGLE_AREA:.001,COORDINATE_PRECISION:1e-4,BARYCENTRIC_TOLERANCE:-.001},Rn=(e=Re.id)=>{const t=H.units.map((r,i)=>{const o=Math.min(100,Math.max(0,i*15+Math.random()*20)),l=Math.floor(r.lessons.length*o/100),m=r.lessons.map((f,u)=>{const h=Math.min(100,Math.max(0,o-u*10+Math.random()*30));return{lessonId:f.id,status:h>=100?"completed":h>0?"in-progress":"not-started",progressPercentage:Math.round(h),lastAccessed:h>0?new Date(Date.now()-Math.random()*7*24*60*60*1e3).toISOString():void 0,timeSpent:h>0?Math.floor(Math.random()*120+10):void 0,score:h>=100?Math.floor(Math.random()*21+80):void 0,attempts:h>0?Math.floor(Math.random()*3+1):void 0}});return{unitId:r.id,userId:e,totalLessons:r.lessons.length,completedLessons:l,progressPercentage:Math.round(o),status:o>=100?"completed":o>0?"in-progress":"not-started",lastAccessed:o>0?new Date(Date.now()-Math.random()*14*24*60*60*1e3).toISOString():void 0,lessons:m}}),n=t.reduce((r,i)=>r+i.progressPercentage,0)/t.length,s=t.filter(r=>r.status==="completed").length;return{courseId:H.id,userId:e,totalUnits:t.length,completedUnits:s,progressPercentage:Math.round(n),status:n>=100?"completed":n>0?"in-progress":"not-started",lastAccessed:new Date(Date.now()-Math.random()*3*24*60*60*1e3).toISOString(),units:t}},kn=Rn(),dt=(e,t)=>e===Re.id&&t===H.id?kn:null,Nn=(e,t,n)=>{const s=dt(e,t);return s&&s.units.find(r=>r.unitId===n)||null},lo=(e,t,n,s)=>{const r=Nn(e,t,n);return r&&r.lessons.find(i=>i.lessonId===s)||null},co=(e,t,n,s,r)=>(console.log("Updating lesson progress:",{userId:e,courseId:t,unitId:n,lessonId:s,progress:r}),!0),ft=(e,t)=>{const n=dt(e,t);if(!n)return null;const s=H.units.map((r,i)=>{const o=n.units.find(l=>l.unitId===r.id);return{unitId:r.id,title:r.title,description:r.description,moduleCategory:r.moduleCategory,estimatedDuration:r.estimatedDuration,totalLessons:r.lessons.length,completedLessons:o?.completedLessons||0,progressPercentage:o?.progressPercentage||0,status:o?.status||"not-started",lastAccessed:o?.lastAccessed,isActive:i===0,route:`/math/grade-${H.level}/unit/${r.id}`}});return{userId:e,courseId:H.id,courseTitle:H.title,courseLevel:H.level,totalUnits:s.length,completedUnits:s.filter(r=>r.status==="completed").length,overallProgress:n.progressPercentage,status:n.status,lastAccessed:n.lastAccessed,units:s}},uo=(e,t,n)=>{const s=ft(e,t);return s&&s.units.find(r=>r.unitId===n)||null},fo=(e,t,n,s)=>(console.log("Updating unit active status:",{userId:e,courseId:t,unitId:n,isActive:s}),!0),mo=ft(Re.id,H.id),po={userId:Re.id,courseId:H.id,courseTitle:H.title,courseLevel:H.level,totalUnits:H.units.length,completedUnits:3,overallProgress:45,status:"in-progress",lastAccessed:"2024-01-15T10:30:00Z",units:[{unitId:"unit_1",title:"小数乘法",description:"学习小数乘法的计算方法及应用",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:10,completedLessons:8,progressPercentage:80,status:"completed",lastAccessed:"2024-01-10T14:20:00Z",isActive:!1,route:"/math/grade-5/unit/unit_1",icon:"🔢"},{unitId:"unit_2",title:"小数除法",description:"学习小数除法的计算方法及应用",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:12,completedLessons:6,progressPercentage:50,status:"in-progress",lastAccessed:"2024-01-15T10:30:00Z",isActive:!0,route:"/math/grade-5/unit/unit_2",icon:"➗"},{unitId:"unit_3",title:"简易方程",description:"学习用字母表示数和解简易方程",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"4周",totalLessons:14,completedLessons:2,progressPercentage:14,status:"in-progress",lastAccessed:"2024-01-12T16:45:00Z",isActive:!1,route:"/math/grade-5/unit/unit_3",icon:"📝"},{unitId:"unit_4",title:"多边形的面积",description:"学习平行四边形、三角形、梯形和组合图形的面积计算",moduleCategory:"Graphics and Geometry",estimatedDuration:"3周",totalLessons:12,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_4",icon:"📐"},{unitId:"unit_5",title:"因数与倍数",description:"学习因数、倍数、质数、合数等概念",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:10,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_5",icon:"🔢"},{unitId:"unit_6",title:"长方体和正方体",description:"学习长方体和正方体的特征、表面积和体积计算",moduleCategory:"Graphics and Geometry",estimatedDuration:"4周",totalLessons:14,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_6",icon:"📦"},{unitId:"unit_7",title:"分数的意义和性质",description:"学习分数的意义、性质和约分、通分等方法",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"4周",totalLessons:16,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_7",icon:"½"},{unitId:"unit_8",title:"分数的加法和减法",description:"学习同分母分数、异分母分数的加法和减法",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:12,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_8",icon:"➕"},{unitId:"unit_9",title:"折线统计图",description:"学习单式折线统计图和复式折线统计图的认识和制作",moduleCategory:"Probability and Statistics",estimatedDuration:"2周",totalLessons:6,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_9",icon:"📊"}]};v.AbilityAssessmentDashboard=Wr,v.AbilityProgressBar=vn,v.Button=St,v.ContentAccordion=kt,v.GEOMETRY_CONFIG=ao,v.GradeUnitBrowserPage=Qr,v.GradeUnitBrowserProvider=Zr,v.MOCK_USER_COURSE_PROGRESS=kn,v.MOCK_USER_GRADE_UNITS_NAV=mo,v.MOCK_USER_GRADE_UNITS_PROGRESS=po,v.MathWizHeader=_n,v.PersonalizedAdvicePanel=En,v.RadarChart=bn,v.RecommendationCard=Sn,v.Sidebar=Nt,v.Submenu=Xe,v.UserProfile=gn,v.calculateGamePoints=eo,v.categoryIcons=ct,v.comparePointArrays=ro,v.courseData=H,v.exploreItems=Yr,v.generateMockUserCourseProgress=Rn,v.getBasicGemDefinitions=io,v.getBasicLineDefinitions=oo,v.getUnitNavItem=uo,v.getUserCourseProgress=dt,v.getUserGradeUnitsNav=ft,v.getUserLessonProgress=lo,v.getUserUnitProgress=Nn,v.isPointInTriangle=no,v.pointOnLine=te,v.statusColors=Jr,v.statusMapping=zr,v.toPixelCoordinates=to,v.trianglesMatch=so,v.updateUnitActiveStatus=fo,v.updateUserLessonProgress=co,v.useGradeUnitBrowser=Cn,v.userData=Xr,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})}));
|
|
70
|
+
`):" "+un(o[0]):"as no adapter specified";throw new C("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return s},adapters:lt};function ct(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new _e(null,e)}function fn(e){return ct(e),e.headers=Z.from(e.headers),e.data=at.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),dn.getAdapter(e.adapter||ke.adapter,e)(e).then(function(r){return ct(e),r.data=at.call(e,e.transformResponse,r),r.headers=Z.from(r.headers),r},function(r){return Yt(r)||(ct(e),r&&r.response&&(r.response.data=at.call(e,e.transformResponse,r.response),r.response.headers=Z.from(r.response.headers))),Promise.reject(r)})}const mn="1.12.2",qe={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{qe[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const hn={};qe.transitional=function(t,n,r){function s(i,o){return"[Axios v"+mn+"] Transitional option '"+i+"'"+o+(r?". "+r:"")}return(i,o,l)=>{if(t===!1)throw new C(s(o," has been removed"+(n?" in "+n:"")),C.ERR_DEPRECATED);return n&&!hn[o]&&(hn[o]=!0,console.warn(s(o," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(i,o,l):!0}},qe.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function Rs(e,t,n){if(typeof e!="object")throw new C("options must be an object",C.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const i=r[s],o=t[i];if(o){const l=e[i],m=l===void 0||o(l,i,e);if(m!==!0)throw new C("option "+i+" must be "+m,C.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new C("Unknown option "+i,C.ERR_BAD_OPTION)}}const ze={assertOptions:Rs,validators:qe},ae=ze.validators;let de=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Vt,response:new Vt}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const i=s.stack?s.stack.replace(/^.+\n/,""):"";try{r.stack?i&&!String(r.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(r.stack+=`
|
|
71
|
+
`+i):r.stack=i}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=ue(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:i}=n;r!==void 0&&ze.assertOptions(r,{silentJSONParsing:ae.transitional(ae.boolean),forcedJSONParsing:ae.transitional(ae.boolean),clarifyTimeoutError:ae.transitional(ae.boolean)},!1),s!=null&&(d.isFunction(s)?n.paramsSerializer={serialize:s}:ze.assertOptions(s,{encode:ae.function,serialize:ae.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),ze.assertOptions(n,{baseUrl:ae.spelling("baseURL"),withXsrfToken:ae.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let o=i&&d.merge(i.common,i[n.method]);i&&d.forEach(["delete","get","head","post","put","patch","common"],p=>{delete i[p]}),n.headers=Z.concat(o,i);const l=[];let m=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(m=m&&y.synchronous,l.unshift(y.fulfilled,y.rejected))});const f=[];this.interceptors.response.forEach(function(y){f.push(y.fulfilled,y.rejected)});let u,h=0,w;if(!m){const p=[fn.bind(this),void 0];for(p.unshift(...l),p.push(...f),w=p.length,u=Promise.resolve(n);h<w;)u=u.then(p[h++],p[h++]);return u}w=l.length;let k=n;for(;h<w;){const p=l[h++],y=l[h++];try{k=p(k)}catch(g){y.call(this,g);break}}try{u=fn.call(this,k)}catch(p){return Promise.reject(p)}for(h=0,w=f.length;h<w;)u=u.then(f[h++],f[h++]);return u}getUri(t){t=ue(this.defaults,t);const n=en(t.baseURL,t.url,t.allowAbsoluteUrls);return Ht(n,t.params,t.paramsSerializer)}};d.forEach(["delete","get","head","options"],function(t){de.prototype[t]=function(n,r){return this.request(ue(r||{},{method:t,url:n,data:(r||{}).data}))}}),d.forEach(["post","put","patch"],function(t){function n(r){return function(i,o,l){return this.request(ue(l||{},{method:t,headers:r?{"Content-Type":"multipart/form-data"}:{},url:i,data:o}))}}de.prototype[t]=n(),de.prototype[t+"Form"]=n(!0)});let ks=class Vn{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let n;this.promise=new Promise(function(i){n=i});const r=this;this.promise.then(s=>{if(!r._listeners)return;let i=r._listeners.length;for(;i-- >0;)r._listeners[i](s);r._listeners=null}),this.promise.then=s=>{let i;const o=new Promise(l=>{r.subscribe(l),i=l}).then(s);return o.cancel=function(){r.unsubscribe(i)},o},t(function(i,o,l){r.reason||(r.reason=new _e(i,o,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Vn(function(s){t=s}),cancel:t}}};function Ns(e){return function(n){return e.apply(null,n)}}function Ds(e){return d.isObject(e)&&e.isAxiosError===!0}const ut={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(ut).forEach(([e,t])=>{ut[t]=e});function pn(e){const t=new de(e),n=Dt(de.prototype.request,t);return d.extend(n,de.prototype,t,{allOwnKeys:!0}),d.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return pn(ue(e,s))},n}const B=pn(ke);B.Axios=de,B.CanceledError=_e,B.CancelToken=ks,B.isCancel=Yt,B.VERSION=mn,B.toFormData=Me,B.AxiosError=C,B.Cancel=B.CanceledError,B.all=function(t){return Promise.all(t)},B.spread=Ns,B.isAxiosError=Ds,B.mergeConfig=ue,B.AxiosHeaders=Z,B.formToJSON=e=>Jt(d.isHTMLForm(e)?new FormData(e):e),B.getAdapter=dn.getAdapter,B.HttpStatusCode=ut,B.default=B;const{Axios:ti,AxiosError:ni,CanceledError:ri,isCancel:si,CancelToken:oi,VERSION:ii,all:ai,Cancel:li,isAxiosError:ci,spread:ui,toFormData:di,AxiosHeaders:fi,HttpStatusCode:mi,formToJSON:hi,getAdapter:pi,mergeConfig:gi}=B,Us=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"👤"}),Os=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"⚙️"}),js=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"❓"}),Ts=()=>c.jsx("span",{style:{marginRight:8,fontSize:"1.2em"},children:"🚪"}),Ps=[{id:"profile",label:"个人主页",icon:c.jsx(Us,{})},{id:"settings",label:"设置",icon:c.jsx(Os,{})},{id:"help",label:"帮助",icon:c.jsx(js,{})},{id:"logout",label:"退出",icon:c.jsx(Ts,{})}],gn=({userId:e,userName:t,userAvatar:n,apiConfig:r,menuItems:s=Ps,avatarSize:i="md",isLoading:o=!1,error:l=null,avatarClassName:m,userNameClassName:f,containerClassName:u,onMenuOpen:h,onMenuClose:w,onMenuItemClick:k,onLogout:p,renderMenuItem:y,renderUserInfo:g})=>{const[S,R]=A.useState({id:e||"",name:t||"",avatar:n||"",level:0,badges:[]}),[N,L]=A.useState(o),[T,G]=A.useState(l);A.useEffect(()=>{e&&r&&!t&&!n&&x()},[e,r,t,n]);const x=async()=>{L(!0),G(null);try{const M=r.endpoints.userProfile.replace(":userId",e),O=await B.get(`${r.baseURL}${M}`,{headers:r.headers});R(O.data)}catch(M){G(M)}finally{L(!1)}},ee=M=>{k?.(M.id),M.id==="logout"&&p?.()},I=()=>{h?.()},F=()=>{w?.()},W=()=>c.jsxs("div",{className:"user-profile-trigger",children:[c.jsx(Se.Avatar,{src:S.avatar,size:i,className:m,alt:"用户头像"}),c.jsx("span",{className:`user-name ${f||""}`,children:S.name})]});return N?c.jsx("div",{className:`user-profile-container ${u||""} is-loading`,children:c.jsx("div",{className:"user-profile-loading",children:"加载中..."})}):T?c.jsx("div",{className:`user-profile-container ${u||""} has-error`,children:c.jsxs("div",{className:"user-profile-error",children:["错误: ",T.message]})}):S.name?c.jsx("div",{className:`user-profile-container ${u||""}`,children:c.jsx(Qe,{trigger:g?g(S):W(),items:s.map(M=>({...M,onClick:()=>ee(M)})),position:"bottom",alignment:"end",onOpen:I,onClose:F,renderItem:y?M=>y(M,S):void 0})}):c.jsx("div",{className:`user-profile-container ${u||""}`,children:c.jsx("div",{className:"user-profile-loading",children:"未登录"})})},Ls=e=>c.jsxs("div",{className:"explore-menu-item",onClick:()=>e.onClick?.(e),children:[c.jsx("span",{className:"explore-item-label",children:e.label}),e.status&&c.jsx("span",{className:`explore-item-status status-${e.status.toLowerCase().replace("%","").replace(" ","-")}`,children:e.status})]},e.id),Is=({className:e="",style:t,logoHref:n="/",logoText:r="MathWiz",onLogoClick:s,exploreItems:i=[],exploreMenuOpen:o=!1,onExploreMenuToggle:l,onExploreItemClick:m,renderExploreItem:f=Ls,userData:u,userMenuItems:h,onUserMenuItemClick:w,onLogout:k,isLoading:p=!1,error:y=null,headerClassName:g="",logoClassName:S="",exploreClassName:R="",userProfileClassName:N="",variant:L="gradient",color:T,background:G,height:x,gradientFrom:ee,gradientTo:I,gradientVia:F,logoColor:W,logoSize:M="md",exploreButtonVariant:O="flat",exploreButtonColor:U="primary","aria-label":q,"aria-labelledby":J,...fe})=>{const te=i.map(le=>({id:le.id,label:f(le),onClick:()=>m?.(le)})),me=["mathwiz-header",`mathwiz-header--${L}`,T&&`mathwiz-header--color-${T}`,g,e].filter(Boolean).join(" "),be=["logo",`logo--${M}`,S].filter(Boolean).join(" "),ne=["explore-button",`explore-button--${O}`,`explore-button--color-${U}`,R].filter(Boolean).join(" "),ie={...t,...x&&{height:typeof x=="number"?`${x}px`:x},...G&&{"--custom-bg":G},...W&&{"--logo-color":W},...ee&&I&&{"--header-bg":F?`linear-gradient(to right, ${ee}, ${F}, ${I})`:`linear-gradient(to right, ${ee}, ${I})`}};return c.jsx("header",{className:me,style:ie,"aria-label":q,"aria-labelledby":J,role:"banner",...fe,children:c.jsxs("div",{className:"header-content",children:[c.jsx("div",{className:"header-section left",children:c.jsx(Qe,{trigger:c.jsxs("button",{className:ne,"aria-label":"探索数学课程",children:[c.jsx("span",{className:"explore-icon",children:"🌍"}),c.jsx("span",{className:"explore-text",children:"探索"})]}),items:te,position:"bottom",alignment:"start",openDelay:300,closeDelay:100,onOpen:()=>l?.(!0),onClose:()=>l?.(!1),className:"explore-submenu",menuClassName:"explore-panel"})}),c.jsx("div",{className:"header-section center",children:c.jsx("a",{href:n,className:be,onClick:s,"aria-label":"MathWiz 首页",children:r})}),c.jsx("div",{className:"header-section right",children:c.jsx(gn,{userName:u?.name,userAvatar:u?.avatar,menuItems:h,onMenuItemClick:w,onLogout:k,containerClassName:N,isLoading:p,error:y})})]})})},_n=A.memo(Is,(e,t)=>e.logoText===t.logoText&&e.logoHref===t.logoHref&&e.className===t.className&&e.headerClassName===t.headerClassName&&e.logoClassName===t.logoClassName&&e.exploreClassName===t.exploreClassName&&e.userProfileClassName===t.userProfileClassName&&e["aria-label"]===t["aria-label"]&&e["aria-labelledby"]===t["aria-labelledby"]&&e.isLoading===t.isLoading&&e.error===t.error&&e.variant===t.variant&&e.color===t.color&&e.background===t.background&&e.height===t.height&&e.gradientFrom===t.gradientFrom&&e.gradientTo===t.gradientTo&&e.gradientVia===t.gradientVia&&e.logoColor===t.logoColor&&e.logoSize===t.logoSize&&e.exploreButtonVariant===t.exploreButtonVariant&&e.exploreButtonColor===t.exploreButtonColor&&JSON.stringify(e.exploreItems)===JSON.stringify(t.exploreItems)&&JSON.stringify(e.userData)===JSON.stringify(t.userData)&&JSON.stringify(e.userMenuItems)===JSON.stringify(t.userMenuItems)),bn=({abilities:e,width:t=400,height:n=400})=>{const r=()=>e.length===0?"":e.map(o=>{if(o.svgPoint)return`${o.svgPoint.x},${o.svgPoint.y}`;const l=Math.PI*2*e.indexOf(o)/e.length,m=o.score/o.maxScore*40+10,f=50+m*Math.sin(l),u=50-m*Math.cos(l);return`${f},${u}`}).join(" "),s=o=>{const l=Math.PI*2*o/Math.max(e.length,1),m=50+40*Math.sin(l),f=50-40*Math.cos(l);return{x2:m,y2:f}},i=o=>{const l=Math.PI*2*o/Math.max(e.length,1),m=50+45*Math.sin(l),f=50-45*Math.cos(l);let u="middle";return l>Math.PI*.25&&l<Math.PI*.75&&(u="start"),l>Math.PI*1.25&&l<Math.PI*1.75&&(u="end"),{x:m,y:f,textAnchor:u}};return c.jsxs("svg",{"data-testid":"radar-chart",width:t,height:n,viewBox:"0 0 100 100",className:"w-full h-full",preserveAspectRatio:"xMidYMid meet",children:[c.jsx("circle",{"data-testid":"center-point",cx:"50",cy:"50",r:"1",fill:"#4A90E2"}),e.map((o,l)=>{const{x2:m,y2:f}=s(l);return c.jsx("line",{"data-testid":"axis-line",x1:"50",y1:"50",x2:m,y2:f,stroke:"#E2E8F0",strokeWidth:"0.5"},`axis-${l}`)}),e.length>2&&c.jsx("polygon",{"data-testid":"radar-polygon",points:r(),fill:"rgba(74, 144, 226, 0.2)",stroke:"rgb(74, 144, 226)",strokeWidth:"1",fillRule:"evenodd"}),e.map((o,l)=>{let m,f;if(o.svgPoint)m=o.svgPoint.x,f=o.svgPoint.y;else{const u=Math.PI*2*l/e.length,h=o.score/o.maxScore*40+10;m=50+h*Math.sin(u),f=50-h*Math.cos(u)}return c.jsx("circle",{"data-testid":"data-point",cx:m,cy:f,r:"2",fill:o.progressBarColor==="bg-orange-400"?"#FBBF24":"#4A90E2"},`point-${o.name}`)}),e.map((o,l)=>{const{x:m,y:f,textAnchor:u}=i(l);return c.jsx("text",{x:m,y:f,textAnchor:u,fontSize:"5",fill:"#334155",className:"text-xs",children:o.name},`label-${o.name}`)})]})},yn=e=>{let t;const n=new Set,r=(f,u)=>{const h=typeof f=="function"?f(t):f;if(!Object.is(h,t)){const w=t;t=u??(typeof h!="object"||h===null)?h:Object.assign({},t,h),n.forEach(k=>k(t,w))}},s=()=>t,l={setState:r,getState:s,getInitialState:()=>m,subscribe:f=>(n.add(f),()=>n.delete(f))},m=t=e(r,s,l);return l},Ms=(e=>e?yn(e):yn),$s=e=>e;function Fs(e,t=$s){const n=A.useSyncExternalStore(e.subscribe,A.useCallback(()=>t(e.getState()),[e,t]),A.useCallback(()=>t(e.getInitialState()),[e,t]));return A.useDebugValue(n),n}const wn=e=>{const t=Ms(e),n=r=>Fs(t,r);return Object.assign(n,t),n},Bs=(e=>e?wn(e):wn),En={overallRating:"优秀",generalRecommendation:"你的空间想象力和逻辑推理能力非常出色!若能进一步提升在复杂图形下的专注力,你将所向披靡。建议尝试我们‘专注力挑战’系列游戏。",abilities:[{name:"空间想象力",score:7.5,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:50,y:17.5},recommendation:"通过观察三维物体在不同角度的投影,或尝试构建复杂结构的游戏,能有效提升空间想象力。",recommendationLink:"#spatial-challenges"},{name:"逻辑推理",score:8,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:82,y:35},recommendation:"解决数独、迷宫或逻辑谜题,能够持续锻炼你的逻辑思维,尝试挑战更高难度的推理游戏。",recommendationLink:"#logic-puzzles"},{name:"图形辨识",score:9,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:85,y:65},recommendation:"你在这方面表现出色!可以尝试在更复杂、干扰因素更多的图形中进行辨识训练,保持敏锐。",recommendationLink:"#graphic-training"},{name:"专注力",score:7,maxScore:10,progressBarColor:"bg-orange-400",svgPoint:{x:50,y:80},recommendation:"在长时间的游戏中保持专注对你来说是一个挑战,建议尝试我们‘专注力挑战’系列游戏,逐渐延长专注时间。",recommendationLink:"#focus-challenges"},{name:"观察力",score:8.5,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:15,y:65},recommendation:"你的观察力非常敏锐,在细节发现上尤为突出。尝试在限时模式下进行观察力训练,提高反应速度。",recommendationLink:"#observation-drills"},{name:"抗压性",score:7.8,maxScore:10,progressBarColor:"bg-blue-500",svgPoint:{x:18,y:35},recommendation:"面对高压挑战时,保持冷静是关键。通过模拟竞赛或限时任务来提升抗压能力,逐步适应压力。",recommendationLink:"#stress-games"}]};class qs{static API_BASE_URL="/api/radar-ability";static async fetchRadarAbilityData(){try{return process.env.NODE_ENV==="test"?(await new Promise(t=>setTimeout(t,100)),En):(await B.get(`${this.API_BASE_URL}/assessment`)).data}catch(t){if(console.error("Failed to fetch radar ability data:",t),process.env.NODE_ENV==="test")throw new Error("获取能力评估数据失败");return En}}static async submitFeedback(t){try{await B.post(`${this.API_BASE_URL}/feedback`,t)}catch(n){throw console.error("Failed to submit feedback:",n),new Error("提交反馈失败")}}}const zs=Bs((e,t)=>({data:null,loading:!1,error:null,fetchData:async()=>{if(!t().loading){e({loading:!0,error:null});try{const n=await qs.fetchRadarAbilityData();e({data:n,loading:!1})}catch(n){const r=n instanceof Error?n.message:"获取数据失败";e({error:r,loading:!1})}}},setData:n=>{e({data:n,error:null,loading:!1})},setError:n=>{e({error:n,loading:!1})},reset:()=>{e({data:null,loading:!1,error:null})}})),Sn=({ability:e})=>{const t=e.score/e.maxScore*100;return c.jsxs("div",{className:"ability-progress-bar-item","data-ability":e.name,"data-testid":"progress-bar-container",children:[c.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[c.jsx("span",{className:"text-gray-700 font-medium",children:e.name}),c.jsxs("span",{className:"text-gray-600",children:[e.score,"/",e.maxScore]})]}),c.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2.5","data-testid":"progress-bar-outer",children:c.jsx("div",{className:`${e.progressBarColor} h-2.5 rounded-full transition-all duration-300`,style:{width:`${t}%`},"data-testid":"progress-bar-inner",role:"progressbar","aria-valuenow":e.score,"aria-valuemin":0,"aria-valuemax":e.maxScore,"aria-label":`${e.name} progress: ${e.score} out of ${e.maxScore}`})})]})},xn=({generalRecommendation:e})=>c.jsx("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4","data-testid":"advice-panel",role:"region","aria-label":"个性化建议",children:c.jsxs("div",{className:"flex items-start",children:[c.jsx("div",{className:"flex-shrink-0",children:c.jsx("i",{className:"material-icons text-blue-500","data-testid":"lightbulb-icon","aria-hidden":"true",children:"lightbulb"})}),c.jsxs("div",{className:"ml-3",children:[c.jsx("h3",{className:"text-md font-semibold text-blue-800","aria-level":3,children:"个性化建议"}),c.jsx("p",{className:"text-sm text-blue-700 mt-1","data-testid":"recommendation-text",children:e})]})]})}),vn=({ability:e,customLinkTexts:t={}})=>{const n=r=>{const s={空间想象力:"探索空间挑战",逻辑推理:"深入逻辑谜题",图形辨识:"精进图形训练",专注力:"挑战专注极限",观察力:"提升观察速度",抗压性:"磨砺抗压意志"};return t[r]||s[r]||"开始挑战"};return c.jsx(Se.Card,{className:"recommendation-card w-full max-w-sm hover:shadow-lg transition-all duration-300","data-ability":e.name,"data-testid":"recommendation-card",isHoverable:!0,isPressable:!0,children:c.jsx(Se.CardBody,{className:"p-5",children:c.jsxs("div",{className:"flex flex-col gap-3",children:[c.jsxs("h4",{className:"text-lg font-semibold text-foreground","aria-level":4,children:[e.name,": 专项提高"]}),c.jsx("p",{className:"text-sm text-default-600 leading-relaxed","data-testid":"recommendation-description",children:e.recommendation}),c.jsx(Se.Button,{as:"a",href:e.recommendationLink,className:"mt-2 w-fit",size:"sm",variant:"flat",color:"primary",endContent:c.jsx(nr,{className:"w-4 h-4"}),"data-testid":"recommendation-link","aria-label":`前往${e.name}专项提高页面`,children:n(e.name)})]})})})},Ge={dashboardLayout:"_dashboardLayout_10wqn_5",upperSection:"_upperSection_10wqn_19",lowerSection:"_lowerSection_10wqn_33",radarChartArea:"_radarChartArea_10wqn_51"},Gs=()=>{const{data:e,loading:t,error:n,fetchData:r}=zs();return A.useEffect(()=>{r()},[r]),t?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 flex items-center justify-center","data-testid":"loading-spinner",children:[c.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500"}),c.jsx("span",{className:"ml-3 text-gray-600",children:"加载中..."})]}):n?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 text-center",role:"alert","aria-live":"assertive",children:[c.jsx("div",{className:"text-red-500 mb-4",children:c.jsx("i",{className:"material-icons text-4xl","aria-hidden":"true",children:"error_outline"})}),c.jsx("h3",{className:"text-lg font-semibold text-gray-800 mb-2",children:"加载失败"}),c.jsx("p",{className:"text-gray-600 mb-4",children:n}),c.jsx("button",{onClick:r,className:"bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2","aria-label":"重试加载数据",children:"重试"})]}):e?c.jsxs("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 animate-fade-in","data-component":"AbilityAssessmentDashboard",role:"main","aria-label":"能力评估雷达图展示",children:[c.jsxs("div",{className:"flex justify-between items-center mb-6",children:[c.jsx("h2",{className:"text-xl font-bold text-gray-800",children:"能力评估雷达图"}),c.jsxs("span",{className:"bg-blue-100 text-blue-800 text-sm font-semibold px-2.5 py-0.5 rounded-full","aria-label":`综合评级: ${e.overallRating}`,children:["综合评级: ",e.overallRating]})]}),c.jsxs("div",{className:Ge.dashboardLayout,children:[c.jsxs("div",{className:Ge.upperSection,children:[c.jsx("div",{className:Ge.radarChartArea,children:c.jsx(bn,{abilities:e.abilities})}),c.jsx("div",{className:"space-y-4 flex flex-col justify-around py-2",children:e.abilities.map(s=>c.jsx(Sn,{ability:s},s.name))})]}),c.jsxs("div",{className:Ge.lowerSection,children:[c.jsx(xn,{generalRecommendation:e.generalRecommendation}),c.jsx("h3",{className:"text-lg font-bold text-gray-800 mb-4 mt-6",children:"专项提升建议"}),c.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:e.abilities.map(s=>c.jsx(vn,{ability:s},s.name))})]})]})]}):c.jsx("div",{className:"card max-w-4xl mx-auto p-6 md:p-8 text-center",role:"status","aria-live":"polite",children:c.jsx("p",{className:"text-gray-600",children:"暂无数据"})})},De={"Arithmetic and Algebra":"🔢","Graphics and Geometry":"📐","Probability and Statistics":"📊",Default:"📚"},Hs={mastered:"已掌握",proficient:"熟练",familiar:"熟悉",attempted:"已尝试","not-started":"未开始"},Vs={mastered:"#10b981",proficient:"#3b82f6",familiar:"#f59e0b",attempted:"#8b5cf6","not-started":"#6b7280"},Ue={id:"user-001",name:"小明",level:5,avatar:"https://i.pravatar.cc/40?u=student1",logIn:!0,badges:["🏆","🏅","🌟"]},Ws=[{id:"g3",label:"三年级",status:"new",onClick:()=>console.log("三年级 clicked")},{id:"g4",label:"四年级",status:"2%",onClick:()=>console.log("四年级 clicked")},{id:"g5",label:"五年级",status:"进行中",onClick:()=>console.log("五年级 clicked")},{id:"g6",label:"六年级",status:"new",onClick:()=>console.log("六年级 clicked")},{id:"g7",label:"七年级",status:"new",onClick:()=>console.log("七年级 clicked")},{id:"g8",label:"八年级",status:"new",onClick:()=>console.log("八年级 clicked")},{id:"alg_topic",label:"代数专题",status:"new",onClick:()=>console.log("代数专题 clicked")},{id:"calc_topic",label:"计算专题",status:"new",onClick:()=>console.log("计算专题 clicked")},{id:"geo_topic",label:"几何专题",status:"new",onClick:()=>console.log("几何专题 clicked")},{id:"olym_topic",label:"奥数专题",status:"new",onClick:()=>console.log("奥数专题 clicked")}],Js="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLTAwMSIsIm5hbWUiOiLlsI_mmI4iLCJsZXZlbCI6NSwiYXZhdGFyIjoiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzQwP3U9c3R1ZGVudDEiLCJiYWRnZXMiOlsi8J-SoiIsIvCfjZUiLCLwn5KbIl0sImlhdCI6MTY5MTYwMDAwMCwiZXhwIjoxNzIzMTM2MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",z={id:"g5",title:"小学数学五年级",level:5,subject:"数学",units:[{id:"unit_1",title:"小数乘法",description:"学习小数乘法的计算方法及应用",estimatedDuration:"3周",totalLessons:10,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit1_lesson1",title:"小数乘整数",duration:40,knowledgeItems:[{id:"unit1_lesson1_k1",title:"小数乘整数的意义",description:"理解小数乘整数的意义与整数乘法相同",progress:0,contentUrl:""},{id:"unit1_lesson1_k2",title:"小数乘整数的计算方法",description:"掌握小数乘整数的计算方法:先按整数乘法计算,再看因数中有几位小数,就从积的右边起数出几位点上小数点",progress:0,contentUrl:""}]},{id:"unit1_lesson2",title:"小数乘小数",duration:40,knowledgeItems:[{id:"unit1_lesson2_k1",title:"小数乘小数的计算方法",description:"掌握小数乘小数的计算方法:先按整数乘法算出积,再给积点上小数点",progress:0,contentUrl:""},{id:"unit1_lesson2_k2",title:"积的小数位数确定",description:"理解积的小数位数等于两个因数的小数位数之和",progress:0,contentUrl:""}]},{id:"unit1_lesson3",title:"积的近似数",duration:40,knowledgeItems:[{id:"unit1_lesson3_k1",title:'用"四舍五入"法求积的近似数',description:'掌握用"四舍五入"法求积的近似数的方法',progress:0,contentUrl:""}]},{id:"unit1_lesson4",title:"整数乘法运算定律推广到小数",duration:40,knowledgeItems:[{id:"unit1_lesson4_k1",title:"乘法运算定律在小数中的适用性",description:"理解整数乘法运算定律对于小数乘法同样适用",progress:0,contentUrl:""},{id:"unit1_lesson4_k2",title:"运用运算定律进行简便计算",description:"能运用乘法运算定律进行小数乘法的简便计算",progress:0,contentUrl:""}]},{id:"unit1_lesson5",title:"解决问题",duration:40,knowledgeItems:[{id:"unit1_lesson5_k1",title:"用小数乘法解决实际问题",description:"能运用小数乘法解决购物、面积计算等实际问题",progress:0,contentUrl:""}]}]},{id:"unit_2",title:"小数除法",description:"学习小数除法的计算方法及应用",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit2_lesson1",title:"小数除以整数",duration:40,knowledgeItems:[{id:"unit2_lesson1_k1",title:"小数除以整数的计算方法",description:"掌握小数除以整数的计算方法:按照整数除法的方法计算,商的小数点要与被除数的小数点对齐",progress:0,contentUrl:""}]},{id:"unit2_lesson2",title:"一个数除以小数",duration:40,knowledgeItems:[{id:"unit2_lesson2_k1",title:"除数是小数的除法计算方法",description:"掌握除数是小数的除法计算方法:利用商不变的性质,将除数转化为整数",progress:0,contentUrl:""}]},{id:"unit2_lesson3",title:"商的近似数",duration:40,knowledgeItems:[{id:"unit2_lesson3_k1",title:'用"四舍五入"法求商的近似数',description:'掌握用"四舍五入"法求商的近似数的方法',progress:0,contentUrl:""}]},{id:"unit2_lesson4",title:"循环小数",duration:40,knowledgeItems:[{id:"unit2_lesson4_k1",title:"循环小数的概念",description:"理解循环小数的概念,认识循环节",progress:0,contentUrl:""},{id:"unit2_lesson4_k2",title:"循环小数的表示方法",description:"掌握循环小数的简便表示方法",progress:0,contentUrl:""}]},{id:"unit2_lesson5",title:"用计算器探索规律",duration:40,knowledgeItems:[{id:"unit2_lesson5_k1",title:"用计算器计算小数除法",description:"会用计算器计算较复杂的小数除法",progress:0,contentUrl:""},{id:"unit2_lesson5_k2",title:"发现商的变化规律",description:"能借助计算器发现商的变化规律",progress:0,contentUrl:""}]},{id:"unit2_lesson6",title:"解决问题",duration:40,knowledgeItems:[{id:"unit2_lesson6_k1",title:"用小数除法解决实际问题",description:"能运用小数除法解决购物、分配等实际问题",progress:0,contentUrl:""}]}]},{id:"unit_3",title:"简易方程",description:"学习用字母表示数和解简易方程",estimatedDuration:"4周",totalLessons:14,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit3_lesson1",title:"用字母表示数",duration:40,knowledgeItems:[{id:"unit3_lesson1_k1",title:"用字母表示数",description:"初步理解用字母表示数的意义和作用",progress:0,contentUrl:""},{id:"unit3_lesson1_k2",title:"用字母表示运算定律和计算公式",description:"会用字母表示运算定律和计算公式",progress:0,contentUrl:""}]},{id:"unit3_lesson2",title:"方程的意义",duration:40,knowledgeItems:[{id:"unit3_lesson2_k1",title:"方程的概念",description:"理解方程的意义,知道方程与等式的区别和联系",progress:0,contentUrl:""}]},{id:"unit3_lesson3",title:"等式的性质",duration:40,knowledgeItems:[{id:"unit3_lesson3_k1",title:"等式的性质1",description:"理解等式的性质1:等式两边加上或减去同一个数,左右两边仍然相等",progress:0,contentUrl:""},{id:"unit3_lesson3_k2",title:"等式的性质2",description:"理解等式的性质2:等式两边乘同一个数,或除以同一个不为0的数,左右两边仍然相等",progress:0,contentUrl:""}]},{id:"unit3_lesson4",title:"解简易方程",duration:40,knowledgeItems:[{id:"unit3_lesson4_k1",title:"利用等式的性质解方程",description:"会利用等式的性质解形如x±a=b、ax=b、x÷a=b、a-x=b、a÷x=b的方程",progress:0,contentUrl:""}]},{id:"unit3_lesson5",title:"实际问题与方程",duration:40,knowledgeItems:[{id:"unit3_lesson5_k1",title:"列方程解决实际问题",description:"初步学会列方程解决一些简单的实际问题",progress:0,contentUrl:""}]}]},{id:"unit_4",title:"多边形的面积",description:"学习平行四边形、三角形、梯形和组合图形的面积计算",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Graphics and Geometry",lessons:[{id:"unit4_lesson1",title:"平行四边形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson1_k1",title:"平行四边形面积公式的推导",description:"通过割补法理解平行四边形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson1_k2",title:"平行四边形面积的计算",description:"掌握平行四边形面积计算公式:S=ah,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson2",title:"三角形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson2_k1",title:"三角形面积公式的推导",description:"通过拼摆法理解三角形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson2_k2",title:"三角形面积的计算",description:"掌握三角形面积计算公式:S=ah÷2,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson3",title:"梯形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson3_k1",title:"梯形面积公式的推导",description:"通过拼摆法理解梯形面积公式的推导过程",progress:0,contentUrl:""},{id:"unit4_lesson3_k2",title:"梯形面积的计算",description:"掌握梯形面积计算公式:S=(a+b)h÷2,并能正确运用",progress:0,contentUrl:""}]},{id:"unit4_lesson4",title:"组合图形的面积",duration:40,knowledgeItems:[{id:"unit4_lesson4_k1",title:"认识组合图形",description:"认识组合图形,会把组合图形分解成已学过的平面图形",progress:0,contentUrl:""},{id:"unit4_lesson4_k2",title:"计算组合图形的面积",description:"掌握计算组合图形面积的多种方法",progress:0,contentUrl:""}]}]},{id:"unit_5",title:"因数与倍数",description:"学习因数、倍数、质数、合数等概念",estimatedDuration:"3周",totalLessons:10,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit5_lesson1",title:"因数和倍数",duration:40,knowledgeItems:[{id:"unit5_lesson1_k1",title:"因数和倍数的意义",description:"理解因数和倍数的意义,掌握找一个数的因数和倍数的方法",progress:0,contentUrl:""},{id:"unit5_lesson1_k2",title:"因数和倍数的特征",description:"了解一个数的因数的个数是有限的,倍数的个数是无限的",progress:0,contentUrl:""}]},{id:"unit5_lesson2",title:"2、5、3的倍数的特征",duration:40,knowledgeItems:[{id:"unit5_lesson2_k1",title:"2、5的倍数的特征",description:"掌握2、5的倍数的特征,理解奇数和偶数的意义",progress:0,contentUrl:""},{id:"unit5_lesson2_k2",title:"3的倍数的特征",description:"掌握3的倍数的特征,能判断一个数是不是3的倍数",progress:0,contentUrl:""}]},{id:"unit5_lesson3",title:"质数和合数",duration:40,knowledgeItems:[{id:"unit5_lesson3_k1",title:"质数和合数的意义",description:"理解质数和合数的意义,能判断一个数是质数还是合数",progress:0,contentUrl:""},{id:"unit5_lesson3_k2",title:"制作100以内的质数表",description:"会制作100以内的质数表,熟记20以内的质数",progress:0,contentUrl:""}]}]},{id:"unit_6",title:"长方体和正方体",description:"学习长方体和正方体的特征、表面积和体积计算",estimatedDuration:"4周",totalLessons:14,moduleCategory:"Graphics and Geometry",lessons:[{id:"unit6_lesson1",title:"长方体和正方体的认识",duration:40,knowledgeItems:[{id:"unit6_lesson1_k1",title:"长方体的特征",description:"认识长方体的特征,了解长方体的长、宽、高",progress:0,contentUrl:""},{id:"unit6_lesson1_k2",title:"正方体的特征",description:"认识正方体的特征,理解正方体是特殊的长方体",progress:0,contentUrl:""}]},{id:"unit6_lesson2",title:"长方体和正方体的表面积",duration:40,knowledgeItems:[{id:"unit6_lesson2_k1",title:"表面积的意义",description:"理解表面积的意义,掌握长方体和正方体表面积的计算方法",progress:0,contentUrl:""},{id:"unit6_lesson2_k2",title:"表面积的实际应用",description:"能运用表面积知识解决一些实际问题",progress:0,contentUrl:""}]},{id:"unit6_lesson3",title:"长方体和正方体的体积",duration:40,knowledgeItems:[{id:"unit6_lesson3_k1",title:"体积和体积单位",description:"理解体积的意义,认识常用的体积单位",progress:0,contentUrl:""},{id:"unit6_lesson3_k2",title:"长方体和正方体体积的计算",description:"掌握长方体和正方体体积的计算公式",progress:0,contentUrl:""},{id:"unit6_lesson3_k3",title:"体积单位间的进率",description:"掌握体积单位之间的进率和换算",progress:0,contentUrl:""}]},{id:"unit6_lesson4",title:"容积和容积单位",duration:40,knowledgeItems:[{id:"unit6_lesson4_k1",title:"容积和容积单位",description:"理解容积的意义,认识常用的容积单位",progress:0,contentUrl:""},{id:"unit6_lesson4_k2",title:"容积和体积的关系",description:"掌握容积和体积之间的关系",progress:0,contentUrl:""}]}]},{id:"unit_7",title:"分数的意义和性质",description:"学习分数的意义、性质和约分、通分等方法",estimatedDuration:"4周",totalLessons:16,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit7_lesson1",title:"分数的意义",duration:40,knowledgeItems:[{id:"unit7_lesson1_k1",title:"分数的产生和意义",description:"理解分数的产生和意义,明确分数与除法的关系",progress:0,contentUrl:""},{id:"unit7_lesson1_k2",title:"分数单位",description:"认识分数单位,能说出一个分数中有几个这样的分数单位",progress:0,contentUrl:""}]},{id:"unit7_lesson2",title:"分数与除法",duration:40,knowledgeItems:[{id:"unit7_lesson2_k1",title:"分数与除法的关系",description:"理解分数与除法的关系,会用分数表示两个数相除的商",progress:0,contentUrl:""}]},{id:"unit7_lesson3",title:"真分数和假分数",duration:40,knowledgeItems:[{id:"unit7_lesson3_k1",title:"真分数和假分数的意义",description:"理解真分数和假分数的意义和特征",progress:0,contentUrl:""},{id:"unit7_lesson3_k2",title:"带分数",description:"认识带分数,会进行假分数与整数、带分数的互化",progress:0,contentUrl:""}]},{id:"unit7_lesson4",title:"分数的基本性质",duration:40,knowledgeItems:[{id:"unit7_lesson4_k1",title:"分数的基本性质",description:"理解分数的基本性质,能运用分数的基本性质进行分数的变形",progress:0,contentUrl:""}]},{id:"unit7_lesson5",title:"约分",duration:40,knowledgeItems:[{id:"unit7_lesson5_k1",title:"最大公因数",description:"理解公因数和最大公因数的意义,掌握求两个数的最大公因数的方法",progress:0,contentUrl:""},{id:"unit7_lesson5_k2",title:"约分的方法",description:"掌握约分的方法,能正确地进行约分",progress:0,contentUrl:""}]},{id:"unit7_lesson6",title:"通分",duration:40,knowledgeItems:[{id:"unit7_lesson6_k1",title:"最小公倍数",description:"理解公倍数和最小公倍数的意义,掌握求两个数的最小公倍数的方法",progress:0,contentUrl:""},{id:"unit7_lesson6_k2",title:"通分的方法",description:"掌握通分的方法,能正确地进行通分",progress:0,contentUrl:""}]},{id:"unit7_lesson7",title:"分数和小数的互化",duration:40,knowledgeItems:[{id:"unit7_lesson7_k1",title:"分数化成小数",description:"掌握分数化成小数的方法",progress:0,contentUrl:""},{id:"unit7_lesson7_k2",title:"小数化成分数",description:"掌握小数化成分数的方法",progress:0,contentUrl:""}]}]},{id:"unit_8",title:"分数的加法和减法",description:"学习同分母分数、异分母分数的加法和减法",estimatedDuration:"3周",totalLessons:12,moduleCategory:"Arithmetic and Algebra",lessons:[{id:"unit8_lesson1",title:"同分母分数加、减法",duration:40,knowledgeItems:[{id:"unit8_lesson1_k1",title:"同分母分数加法的计算方法",description:"掌握同分母分数加法的计算方法",progress:0,contentUrl:""},{id:"unit8_lesson1_k2",title:"同分母分数减法的计算方法",description:"掌握同分母分数减法的计算方法",progress:0,contentUrl:""}]},{id:"unit8_lesson2",title:"异分母分数加、减法",duration:40,knowledgeItems:[{id:"unit8_lesson2_k1",title:"异分母分数加法的计算方法",description:"掌握异分母分数加法的计算方法:先通分,然后按照同分母分数加法进行计算",progress:0,contentUrl:""},{id:"unit8_lesson2_k2",title:"异分母分数减法的计算方法",description:"掌握异分母分数减法的计算方法:先通分,然后按照同分母分数减法进行计算",progress:0,contentUrl:""}]},{id:"unit8_lesson3",title:"分数加减混合运算",duration:40,knowledgeItems:[{id:"unit8_lesson3_k1",title:"分数加减混合运算的顺序",description:"掌握分数加减混合运算的运算顺序",progress:0,contentUrl:""},{id:"unit8_lesson3_k2",title:"整数加法运算定律推广到分数加法",description:"理解整数加法运算定律对于分数加法同样适用,能运用运算定律进行简便计算",progress:0,contentUrl:""}]}]},{id:"unit_9",title:"折线统计图",description:"学习单式折线统计图和复式折线统计图的认识和制作",estimatedDuration:"2周",totalLessons:6,moduleCategory:"Probability and Statistics",lessons:[{id:"unit9_lesson1",title:"单式折线统计图",duration:40,knowledgeItems:[{id:"unit9_lesson1_k1",title:"单式折线统计图的特点",description:"认识单式折线统计图,了解其特点和作用",progress:0,contentUrl:""},{id:"unit9_lesson1_k2",title:"绘制单式折线统计图",description:"能根据数据绘制单式折线统计图",progress:0,contentUrl:""}]},{id:"unit9_lesson2",title:"复式折线统计图",duration:40,knowledgeItems:[{id:"unit9_lesson2_k1",title:"复式折线统计图的特点",description:"认识复式折线统计图,了解其特点和作用",progress:0,contentUrl:""},{id:"unit9_lesson2_k2",title:"绘制复式折线统计图",description:"能根据数据绘制复式折线统计图",progress:0,contentUrl:""}]},{id:"unit9_lesson3",title:"数据分析",duration:40,knowledgeItems:[{id:"unit9_lesson3_k1",title:"根据统计图进行数据分析",description:"能根据折线统计图进行简单的数据分析,作出合理的判断和预测",progress:0,contentUrl:""}]}]}]},Ks=Ws,Ys=Ue;class Xs{baseURL;token;constructor(t="/api/v1",n=Js){this.baseURL=t,this.token=n}getAuthHeaders(){return{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"}}async fetchWithAuth(t,n={}){const r=await fetch(t,{...n,headers:{...this.getAuthHeaders(),...n.headers}});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return r}async getCourseData(t){return(await this.fetchWithAuth(`${this.baseURL}/content/courses/${t}`)).json()}async getUserGradeUnitsNav(t){const n=t?`${this.baseURL}/content/grades/${encodeURIComponent(t)}/units/nav`:`${this.baseURL}/content/grades/current/units/nav`;return(await this.fetchWithAuth(n)).json()}async getUnitProgress(t,n){const r=n?`${this.baseURL}/content/courses/${t}/units/${n}/progress`:`${this.baseURL}/content/courses/${t}/progress`;return(await this.fetchWithAuth(r)).json()}async batchUpdateLessonProgress(t,n){return(await this.fetchWithAuth(`${this.baseURL}/content/units/${t}/progress/batch`,{method:"POST",body:JSON.stringify(n)})).json()}async updateLessonProgress(t,n,r,s){await this.fetchWithAuth(`${this.baseURL}/content/courses/${t}/units/${n}/lessons/${r}/progress`,{method:"POST",body:JSON.stringify({status:s})})}setToken(t){this.token=t}getToken(){return this.token}}const He=new Xs;class Zs{config;constructor(t){this.config={name:"ApiDataSource",enableCaching:!1,cacheTTL:3e5,timeout:15e3,retryCount:3,retryDelay:1e3,...t},He.setToken(this.config.token)}async getUserGradeUnitsNav(t,n){try{return console.log(`[ApiDataSource] 获取年级单元导航数据: gradeId=${t}, userId=${n}`),await this.withRetry(()=>He.getUserGradeUnitsNav(t))}catch(r){throw console.error("[ApiDataSource] 获取年级单元导航数据失败:",r),new DataSourceError(`获取年级单元导航数据失败: ${r instanceof Error?r.message:"未知错误"}`,"GET_USER_GRADE_UNITS_NAV_FAILED",r instanceof Error?r:void 0)}}async getUserProfile(t){try{return console.log(`[ApiDataSource] 获取用户个人信息: userId=${t}`),{id:t,name:"学生用户",level:5,avatar:"https://i.pravatar.cc/40",badges:["🏆"]}}catch(n){throw console.error("[ApiDataSource] 获取用户个人信息失败:",n),new DataSourceError(`获取用户个人信息失败: ${n instanceof Error?n.message:"未知错误"}`,"GET_USER_PROFILE_FAILED",n instanceof Error?n:void 0)}}async getExploreMenu(){try{return console.log("[ApiDataSource] 获取探索菜单数据"),[{id:"g5",label:"五年级",status:"进行中"},{id:"g6",label:"六年级",status:"new"}]}catch(t){throw console.error("[ApiDataSource] 获取探索菜单数据失败:",t),new DataSourceError(`获取探索菜单数据失败: ${t instanceof Error?t.message:"未知错误"}`,"GET_EXPLORE_MENU_FAILED",t instanceof Error?t:void 0)}}async updateLessonProgress(t){try{console.log("[ApiDataSource] 更新课时进度:",t),await this.withRetry(()=>He.updateLessonProgress(t.courseId,t.unitId,t.lessonId,t.status))}catch(n){throw console.error("[ApiDataSource] 更新课时进度失败:",n),new DataSourceError(`更新课时进度失败: ${n instanceof Error?n.message:"未知错误"}`,"UPDATE_LESSON_PROGRESS_FAILED",n instanceof Error?n:void 0)}}async batchUpdateLessonProgress(t,n){try{return console.log(`[ApiDataSource] 批量更新课时进度: unitId=${t}`,n),await this.withRetry(()=>He.batchUpdateLessonProgress(t,n))}catch(r){throw console.error("[ApiDataSource] 批量更新课时进度失败:",r),new DataSourceError(`批量更新课时进度失败: ${r instanceof Error?r.message:"未知错误"}`,"BATCH_UPDATE_LESSON_PROGRESS_FAILED",r instanceof Error?r:void 0)}}async withRetry(t){let n;for(let r=1;r<=this.config.retryCount;r++)try{return await t()}catch(s){n=s instanceof Error?s:new Error(String(s)),r<this.config.retryCount&&(console.warn(`[ApiDataSource] 请求失败,第${r}次重试...`,n.message),await this.delay(this.config.retryDelay))}throw n}delay(t){return new Promise(n=>setTimeout(n,t))}getConfig(){return{...this.config}}}class Qs{config;constructor(t){this.config={name:"MockDataSource",delay:500,simulateError:!1,errorProbability:.1,...t}}async getUserGradeUnitsNav(t,n){if(console.log(`[MockDataSource] 开始获取年级单元导航数据: gradeId=${t}, userId=${n}`),await this.simulateDelay(),this.shouldSimulateError())throw console.log(`[MockDataSource] 模拟错误: gradeId=${t}, userId=${n}`),new DataSourceError("模拟数据源:获取年级单元导航数据失败","MOCK_GET_USER_GRADE_UNITS_NAV_FAILED");return console.log(`[MockDataSource] 成功获取年级单元导航数据: gradeId=${t}, userId=${n}`),{userId:n,courseId:t,courseTitle:"小学数学五年级",courseLevel:5,totalUnits:z.units.length,completedUnits:2,overallProgress:22,status:"in-progress",lastAccessed:new Date().toISOString(),units:z.units.map((s,i)=>({unitId:s.id,title:s.title,description:s.description,moduleCategory:s.moduleCategory,estimatedDuration:s.estimatedDuration,totalLessons:s.lessons.length,completedLessons:i<2?Math.floor(s.lessons.length*.5):0,progressPercentage:i<2?50:0,status:i<2?"in-progress":"not-started",lastAccessed:i<2?new Date().toISOString():void 0,isActive:i===0,route:`/math/grade-5/unit/${s.id}`,icon:De[s.moduleCategory]||De.Default}))}}async getUserProfile(t){if(await this.simulateDelay(),this.shouldSimulateError())throw new DataSourceError("模拟数据源:获取用户个人信息失败","MOCK_GET_USER_PROFILE_FAILED");return console.log(`[MockDataSource] 获取用户个人信息: userId=${t}`),{id:t,name:"学生用户",level:5,avatar:"https://i.pravatar.cc/40",badges:["🏆"]}}async getExploreMenu(){if(await this.simulateDelay(),this.shouldSimulateError())throw new DataSourceError("模拟数据源:获取探索菜单数据失败","MOCK_GET_EXPLORE_MENU_FAILED");return console.log("[MockDataSource] 获取探索菜单数据"),[{id:"g5",label:"五年级",status:"进行中"},{id:"g6",label:"六年级",status:"new"}]}async updateLessonProgress(t){if(await this.simulateDelay(),this.shouldSimulateError())throw new DataSourceError("模拟数据源:更新课时进度失败","MOCK_UPDATE_LESSON_PROGRESS_FAILED");console.log("[MockDataSource] 更新课时进度:",t),console.log(`课时 ${t.lessonId} 状态更新为: ${t.status}`)}async batchUpdateLessonProgress(t,n){if(await this.simulateDelay(),this.shouldSimulateError())throw new DataSourceError("模拟数据源:批量更新课时进度失败","MOCK_BATCH_UPDATE_LESSON_PROGRESS_FAILED");return console.log(`[MockDataSource] 批量更新课时进度: unitId=${t}`,n),{success:!0,results:n.map(s=>({lessonId:s.lessonId,success:!0,status:s.status}))}}async simulateDelay(){this.config.delay&&this.config.delay>0&&await new Promise(t=>setTimeout(t,this.config.delay))}shouldSimulateError(){return this.config.simulateError?Math.random()<(this.config.errorProbability||.1):!1}getConfig(){return{...this.config}}getCourseData(){return z}getLessonsData(){const t={};return z.units.forEach(n=>{t[n.id]=n.lessons.map(r=>({id:r.id,title:r.title,duration:r.duration,knowledgeItems:r.knowledgeItems.map(s=>({...s,progress:0}))}))}),t}}class eo{static instances=new Map;static createDataSource(t){const{type:n,config:r,customDataSourceClass:s}=t,i=this.getInstanceKey(n,r);if(this.instances.has(i))return this.instances.get(i);let o;switch(n){case"api":o=new Zs(r);break;case"mock":o=new Qs(r);break;case"custom":if(!s)throw new Error("自定义数据源类型需要提供 customDataSourceClass 参数");o=new s(r);break;default:throw new Error(`不支持的数据源类型: ${n}`)}return this.instances.set(i,o),console.log(`[DataSourceFactory] 创建数据源: type=${n}, name=${r.name}`),o}static createApiDataSource(t){return this.createDataSource({type:"api",config:t})}static createMockDataSource(t={}){return this.createDataSource({type:"mock",config:{name:"MockDataSource",...t}})}static createDefaultDataSource(){const t=typeof window<"u";let n=!1,r=!1,s=!1;try{typeof process<"u"&&process.env?(n=process.env.NODE_ENV==="development",r=process.env.NODE_ENV==="test",s=process.env.REACT_APP_USE_MOCK==="true"):(n=!0,s=!0)}catch(i){console.warn("无法检测环境变量,使用默认配置:",i),n=!0,s=!0}return n||r||s?this.createMockDataSource({name:"DefaultMockDataSource",delay:300}):this.createApiDataSource({name:"DefaultApiDataSource",baseURL:"/api/v1",token:t&&localStorage.getItem("authToken")||""})}static clearCache(){this.instances.clear(),console.log("[DataSourceFactory] 已清除所有数据源实例缓存")}static getCachedInstanceCount(){return this.instances.size}static getInstanceKey(t,n){return`${t}:${n.name}:${JSON.stringify(n)}`}}function to(){return eo.createDefaultDataSource()}function no(e={}){const{dataSource:t=to(),fallbackStrategy:n="mock",errorHandling:r={},performance:s={},theme:i={},debug:o=!1,enableDevTools:l=!1}=e;return{dataSource:t,fallbackStrategy:n,errorHandling:{showUserFriendlyErrors:!0,logErrors:!0,autoRetry:!0,maxRetries:3,retryDelay:1e3,...r},performance:{enableVirtualization:!0,lazyLoadImages:!0,debounceSearch:300,enableCaching:!0,cacheTTL:3e5,...s},theme:{primaryColor:"#1865f2",borderRadius:"8px",spacing:"16px",fontSize:"14px",enableDarkMode:!1,...i},debug:o,enableDevTools:l}}function ro(e,t){return{...e,...t,errorHandling:{...e.errorHandling,...t.errorHandling},performance:{...e.performance,...t.performance},theme:{...e.theme,...t.theme}}}const An=A.createContext(null),Cn=()=>{const e=A.useContext(An);if(!e)throw new Error("useGradeUnitBrowser must be used within GradeUnitBrowserProvider");return e},Rn=({children:e,config:t})=>{const[n,r]=A.useState(()=>no(t)),[s,i]=A.useState(null),[o,l]=A.useState([]),[m,f]=A.useState(null),[u,h]=A.useState({}),[w,k]=A.useState(!1),[p,y]=A.useState(null),[g,S]=A.useState(null),[R,N]=A.useState([]),L=A.useCallback(async(I,F)=>{k(!0),y(null);try{process.env.NODE_ENV!=="test"&&await new Promise(O=>setTimeout(O,100));const W=await n.dataSource.getUserGradeUnitsNav(I,F);f(W);const M={};z.units.forEach(O=>{M[O.id]=O.lessons.map(U=>({id:U.id,title:U.title,duration:U.duration,knowledgeItems:U.knowledgeItems.map(q=>({...q,progress:0}))}))}),console.log("Lessons data loaded:",M),h(M);try{const O=await n.dataSource.getUserProfile(F);i(O)}catch(O){console.warn("获取用户信息失败,使用默认数据:",O),i({id:F,name:"学生用户",level:5,avatar:"https://i.pravatar.cc/40",badges:["🏆"]})}try{const O=await n.dataSource.getExploreMenu();l(O)}catch(O){console.warn("获取探索菜单失败,使用默认数据:",O),l([{id:"g5",label:"五年级",status:"进行中"},{id:"g6",label:"六年级",status:"new"}])}}catch(W){if(console.error("数据加载错误:",W),n.fallbackStrategy==="mock"){console.log("使用mock数据作为fallback");const M={userId:F,courseId:I,courseTitle:"小学数学五年级",courseLevel:5,totalUnits:z.units.length,completedUnits:2,overallProgress:22,status:"in-progress",lastAccessed:new Date().toISOString(),units:z.units.map((U,q)=>({unitId:U.id,title:U.title,description:U.description,moduleCategory:U.moduleCategory,estimatedDuration:U.estimatedDuration,totalLessons:U.lessons.length,completedLessons:q<2?Math.floor(U.lessons.length*.5):0,progressPercentage:q<2?50:0,status:q<2?"in-progress":"not-started",lastAccessed:q<2?new Date().toISOString():void 0,isActive:q===0,route:`/math/grade-5/unit/${U.id}`,icon:De[U.moduleCategory]||De.Default}))};f(M);const O={};z.units.forEach(U=>{O[U.id]=U.lessons.map(q=>({id:q.id,title:q.title,duration:q.duration,knowledgeItems:q.knowledgeItems.map(J=>({...J,progress:0}))}))}),h(O),i({id:F,name:"学生用户",level:5,avatar:"https://i.pravatar.cc/40",badges:["🏆"]}),l([{id:"g5",label:"五年级",status:"进行中"},{id:"g6",label:"六年级",status:"new"}])}else y(W instanceof Error?W.message:"数据加载失败"),f(null)}finally{k(!1)}},[n]),T=A.useCallback(I=>{N(F=>F.includes(I)?F.filter(W=>W!==I):[...F,I])},[]),G=A.useCallback(I=>{S(I)},[]),x=A.useCallback(I=>{r(F=>ro(F,I))},[]);A.useEffect(()=>{if(console.log("unitsData state updated:",m),console.log("unitsData?.units:",m?.units),console.log("unitsData?.units?.length:",m?.units?.length),m&&m.units.length>0){console.log("Looking for active unit...");const I=m.units.find(W=>W.isActive);console.log("Found active unit:",I);const F=I?.unitId||m.units[0].unitId;console.log("Setting default active unit:",F),S(F),console.log("Default active unit set after state update:",F)}else console.log("No units data available for setting default active unit")},[m]);const ee={userInfo:s,exploreMenu:o,unitsData:m,lessons:u,loading:w,error:p,activeUnitId:g,activeLessonIds:R,config:n,theme:n.theme,enableVirtualization:n.performance?.enableVirtualization,setLoading:k,setError:y,setActiveUnit:G,toggleLesson:T,loadPageData:L,updateConfig:x};return c.jsx(An.Provider,{value:ee,children:e})},so=({gradeId:e,userId:t,onLearnAction:n,className:r,userInfo:s,exploreMenu:i})=>{const{userInfo:o,exploreMenu:l,unitsData:m,lessons:f,loading:u,error:h,activeUnitId:w,activeLessonIds:k,setActiveUnit:p,toggleLesson:y,loadPageData:g}=Cn(),S=s??o,R=i??l;A.useEffect(()=>{console.log("GradeUnitBrowserPageContent: useEffect triggered, calling loadPageData"),console.log("gradeId:",e,"userId:",t),g(e,t)},[e,t,g]),A.useEffect(()=>{console.log("activeUnitId from context:",w),console.log("lessons from context:",f);const T=m?.units?.find(x=>x.unitId===w)||null,G=T&&w&&f[w]?{id:T.unitId,title:T.title,description:T.description,estimatedDuration:T.estimatedDuration,totalLessons:T.totalLessons,moduleCategory:T.moduleCategory,lessons:f[w]}:null;console.log("activeUnit computed:",G)},[w,f,m]);const N=m?.units?.find(T=>T.unitId===w)||null,L=N&&w&&f[w]?{id:N.unitId,title:N.title,description:N.description,estimatedDuration:N.estimatedDuration,totalLessons:N.totalLessons,moduleCategory:N.moduleCategory,lessons:f[w]}:null;return u?c.jsx("div",{className:`grade-unit-browser-page loading ${r||""}`,"data-testid":"grade-unit-browser-page",children:c.jsx("div",{className:"loading-spinner","data-testid":"loading-spinner",children:"加载中..."})}):h?c.jsxs("div",{className:`grade-unit-browser-page error ${r||""}`,"data-testid":"grade-unit-browser-page",children:[c.jsx("div",{className:"error-message","data-testid":"error-message",children:h}),c.jsx("button",{onClick:()=>g(e,t),className:"retry-button",children:"重试"})]}):c.jsxs("div",{className:`grade-unit-browser-page ${r||""}`,"data-testid":"grade-unit-browser-page",children:[c.jsx("div",{className:"header-area",children:c.jsx(_n,{userData:S||void 0,exploreItems:R})}),c.jsx("div",{className:"sidebar-area",children:c.jsx(Nt,{data:m,activeUnitId:w,onUnitSelect:p,loading:u})}),c.jsx("div",{className:"content-area",children:c.jsx(kt,{unit:L,activeLessonIds:k,onToggleLesson:y,onLearnAction:n||(()=>{}),loading:u})})]})},oo=e=>c.jsx(Rn,{config:e.config,children:c.jsx(so,{...e})}),oe=(e,t,n)=>({x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}),io=()=>{const e={x:.5,y:.1,name:"A"},t={x:.1,y:.75,name:"B"},n={x:.9,y:.75,name:"C"},r={...oe(e,t,1/3),name:"D"},s={...oe(e,n,1/3),name:"E"},i={...oe(e,t,2/3),name:"M"},o={...oe(e,n,2/3),name:"N"},l={...oe(t,n,1/3),name:"P"},m={...oe(t,n,2/3),name:"Q"},f={...oe(r,s,1/3),name:"U"},u={...oe(r,s,2/3),name:"S"},h={...oe(i,o,1/3),name:"K"},w={...oe(i,o,2/3),name:"L"};return{A:e,B:t,C:n,D:r,E:s,M:i,N:o,P:l,Q:m,U:f,S:u,K:h,L:w}},ao=(e,t,n)=>{const r={};for(const[s,i]of Object.entries(e))r[s]={...i,x:i.x*t,y:i.y*n};return r},lo=(e,t)=>{const[n,r,s]=t,{x:i,y:o}=e,l=(r.y-s.y)*(n.x-s.x)+(s.x-r.x)*(n.y-s.y);if(Math.abs(l)<1e-4)return!1;const m=((r.y-s.y)*(i-s.x)+(s.x-r.x)*(o-s.y))/l,f=((s.y-n.y)*(i-s.x)+(n.x-s.x)*(o-s.y))/l,u=1-m-f;return m>=-.001&&f>=-.001&&u>=-.001},co=(e,t)=>{if(!e||!t||e.length!==3||t.length!==3)return!1;const n=e.map(s=>s.name).sort(),r=t.map(s=>s.name).sort();return n.every((s,i)=>s===r[i])},uo=(e,t)=>{if(!e||!t||e.length!==t.length)return!1;const n=e.map(s=>s.name).sort(),r=t.map(s=>s.name).sort();return n.join("")===r.join("")},fo=()=>[{from:"A",to:"B"},{from:"A",to:"C"},{from:"B",to:"C"},{from:"D",to:"E"},{from:"M",to:"N"},{from:"P",to:"Q"},{from:"A",to:"D"},{from:"A",to:"E"},{from:"A",to:"M"},{from:"A",to:"N"},{from:"A",to:"P"},{from:"A",to:"Q"},{from:"D",to:"U"},{from:"U",to:"S"},{from:"S",to:"E"},{from:"M",to:"K"},{from:"K",to:"L"},{from:"L",to:"N"},{from:"B",to:"P"},{from:"P",to:"Q"},{from:"Q",to:"C"}],mo=()=>[{id:"gem_1",vertices:["A","B","P"],points:10,category:"basic"},{id:"gem_2",vertices:["A","P","Q"],points:10,category:"basic"},{id:"gem_3",vertices:["A","Q","C"],points:10,category:"basic"},{id:"gem_4",vertices:["A","B","Q"],points:15,category:"medium"},{id:"gem_5",vertices:["A","P","C"],points:15,category:"medium"},{id:"gem_6",vertices:["A","B","C"],points:20,category:"large"},{id:"gem_7",vertices:["A","D","U"],points:12,category:"ade_small"},{id:"gem_8",vertices:["A","U","S"],points:12,category:"ade_small"},{id:"gem_9",vertices:["A","S","E"],points:12,category:"ade_small"},{id:"gem_10",vertices:["A","D","S"],points:18,category:"ade_medium"},{id:"gem_11",vertices:["A","U","E"],points:18,category:"ade_medium"},{id:"gem_12",vertices:["A","D","E"],points:25,category:"ade_large"},{id:"gem_13",vertices:["A","M","K"],points:14,category:"amn_small"},{id:"gem_14",vertices:["A","K","L"],points:14,category:"amn_small"},{id:"gem_15",vertices:["A","L","N"],points:14,category:"amn_small"},{id:"gem_16",vertices:["A","M","L"],points:20,category:"amn_medium"},{id:"gem_17",vertices:["A","K","N"],points:20,category:"amn_medium"},{id:"gem_18",vertices:["A","M","N"],points:30,category:"amn_large"}],ho={TOTAL_GEMS:18,CANVAS_RATIO:4/3,DEFAULT_VIEWBOX:{width:700,height:600},POINT_RADIUS:{default:6,selected:9},TOLERANCE:.001,MIN_TRIANGLE_AREA:.001,COORDINATE_PRECISION:1e-4,BARYCENTRIC_TOLERANCE:-.001},kn=(e=Ue.id)=>{const t=z.units.map((s,i)=>{const o=Math.min(100,Math.max(0,i*15+Math.random()*20)),l=Math.floor(s.lessons.length*o/100),m=s.lessons.map((f,u)=>{const h=Math.min(100,Math.max(0,o-u*10+Math.random()*30));return{lessonId:f.id,status:h>=100?"completed":h>0?"in-progress":"not-started",progressPercentage:Math.round(h),lastAccessed:h>0?new Date(Date.now()-Math.random()*7*24*60*60*1e3).toISOString():void 0,timeSpent:h>0?Math.floor(Math.random()*120+10):void 0,score:h>=100?Math.floor(Math.random()*21+80):void 0,attempts:h>0?Math.floor(Math.random()*3+1):void 0}});return{unitId:s.id,userId:e,totalLessons:s.lessons.length,completedLessons:l,progressPercentage:Math.round(o),status:o>=100?"completed":o>0?"in-progress":"not-started",lastAccessed:o>0?new Date(Date.now()-Math.random()*14*24*60*60*1e3).toISOString():void 0,lessons:m}}),n=t.reduce((s,i)=>s+i.progressPercentage,0)/t.length,r=t.filter(s=>s.status==="completed").length;return{courseId:z.id,userId:e,totalUnits:t.length,completedUnits:r,progressPercentage:Math.round(n),status:n>=100?"completed":n>0?"in-progress":"not-started",lastAccessed:new Date(Date.now()-Math.random()*3*24*60*60*1e3).toISOString(),units:t}},Nn=kn(),dt=(e,t)=>e===Ue.id&&t===z.id?Nn:null,Dn=(e,t,n)=>{const r=dt(e,t);return r&&r.units.find(s=>s.unitId===n)||null},po=(e,t,n,r)=>{const s=Dn(e,t,n);return s&&s.lessons.find(i=>i.lessonId===r)||null},go=(e,t,n,r,s)=>(console.log("Updating lesson progress:",{userId:e,courseId:t,unitId:n,lessonId:r,progress:s}),!0),ft=(e,t)=>{const n=dt(e,t);if(!n)return null;const r=z.units.map((s,i)=>{const o=n.units.find(l=>l.unitId===s.id);return{unitId:s.id,title:s.title,description:s.description,moduleCategory:s.moduleCategory,estimatedDuration:s.estimatedDuration,totalLessons:s.lessons.length,completedLessons:o?.completedLessons||0,progressPercentage:o?.progressPercentage||0,status:o?.status||"not-started",lastAccessed:o?.lastAccessed,isActive:i===0,route:`/math/grade-${z.level}/unit/${s.id}`}});return{userId:e,courseId:z.id,courseTitle:z.title,courseLevel:z.level,totalUnits:r.length,completedUnits:r.filter(s=>s.status==="completed").length,overallProgress:n.progressPercentage,status:n.status,lastAccessed:n.lastAccessed,units:r}},_o=(e,t,n)=>{const r=ft(e,t);return r&&r.units.find(s=>s.unitId===n)||null},bo=(e,t,n,r)=>(console.log("Updating unit active status:",{userId:e,courseId:t,unitId:n,isActive:r}),!0),yo=ft(Ue.id,z.id),wo={userId:Ue.id,courseId:z.id,courseTitle:z.title,courseLevel:z.level,totalUnits:z.units.length,completedUnits:3,overallProgress:45,status:"in-progress",lastAccessed:"2024-01-15T10:30:00Z",units:[{unitId:"unit_1",title:"小数乘法",description:"学习小数乘法的计算方法及应用",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:10,completedLessons:8,progressPercentage:80,status:"completed",lastAccessed:"2024-01-10T14:20:00Z",isActive:!1,route:"/math/grade-5/unit/unit_1",icon:"🔢"},{unitId:"unit_2",title:"小数除法",description:"学习小数除法的计算方法及应用",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:12,completedLessons:6,progressPercentage:50,status:"in-progress",lastAccessed:"2024-01-15T10:30:00Z",isActive:!0,route:"/math/grade-5/unit/unit_2",icon:"➗"},{unitId:"unit_3",title:"简易方程",description:"学习用字母表示数和解简易方程",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"4周",totalLessons:14,completedLessons:2,progressPercentage:14,status:"in-progress",lastAccessed:"2024-01-12T16:45:00Z",isActive:!1,route:"/math/grade-5/unit/unit_3",icon:"📝"},{unitId:"unit_4",title:"多边形的面积",description:"学习平行四边形、三角形、梯形和组合图形的面积计算",moduleCategory:"Graphics and Geometry",estimatedDuration:"3周",totalLessons:12,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_4",icon:"📐"},{unitId:"unit_5",title:"因数与倍数",description:"学习因数、倍数、质数、合数等概念",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:10,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_5",icon:"🔢"},{unitId:"unit_6",title:"长方体和正方体",description:"学习长方体和正方体的特征、表面积和体积计算",moduleCategory:"Graphics and Geometry",estimatedDuration:"4周",totalLessons:14,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_6",icon:"📦"},{unitId:"unit_7",title:"分数的意义和性质",description:"学习分数的意义、性质和约分、通分等方法",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"4周",totalLessons:16,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_7",icon:"½"},{unitId:"unit_8",title:"分数的加法和减法",description:"学习同分母分数、异分母分数的加法和减法",moduleCategory:"Arithmetic and Algebra",estimatedDuration:"3周",totalLessons:12,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_8",icon:"➕"},{unitId:"unit_9",title:"折线统计图",description:"学习单式折线统计图和复式折线统计图的认识和制作",moduleCategory:"Probability and Statistics",estimatedDuration:"2周",totalLessons:6,completedLessons:0,progressPercentage:0,status:"not-started",isActive:!1,route:"/math/grade-5/unit/unit_9",icon:"📊"}]};E.AbilityAssessmentDashboard=Gs,E.AbilityProgressBar=Sn,E.Button=vt,E.ContentAccordion=kt,E.GEOMETRY_CONFIG=ho,E.GradeUnitBrowserPage=oo,E.GradeUnitBrowserProvider=Rn,E.MOCK_USER_COURSE_PROGRESS=Nn,E.MOCK_USER_GRADE_UNITS_NAV=yo,E.MOCK_USER_GRADE_UNITS_PROGRESS=wo,E.MathWizHeader=_n,E.PersonalizedAdvicePanel=xn,E.RadarChart=bn,E.RecommendationCard=vn,E.Sidebar=Nt,E.Submenu=Qe,E.UserProfile=gn,E.calculateGamePoints=io,E.categoryIcons=De,E.comparePointArrays=uo,E.courseData=z,E.exploreItems=Ks,E.generateMockUserCourseProgress=kn,E.getBasicGemDefinitions=mo,E.getBasicLineDefinitions=fo,E.getUnitNavItem=_o,E.getUserCourseProgress=dt,E.getUserGradeUnitsNav=ft,E.getUserLessonProgress=po,E.getUserUnitProgress=Dn,E.isPointInTriangle=lo,E.pointOnLine=oe,E.statusColors=Vs,E.statusMapping=Hs,E.toPixelCoordinates=ao,E.trianglesMatch=co,E.updateUnitActiveStatus=bo,E.updateUserLessonProgress=go,E.useGradeUnitBrowser=Cn,E.userData=Ys,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})}));
|
|
71
72
|
//# sourceMappingURL=index.cjs.map
|