@project-sunbird/collection-editor-react 1.0.0 → 1.0.2

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.
Files changed (109) hide show
  1. package/README.md +55 -0
  2. package/dist/api/content.d.ts +1 -1
  3. package/dist/api/framework.d.ts +0 -1
  4. package/dist/api/hierarchy.d.ts +7 -1
  5. package/dist/collection-editor-react.css +1 -0
  6. package/dist/collection-editor.umd.js +144 -104
  7. package/dist/components/AssetBrowser/AssetBrowser.d.ts +0 -1
  8. package/dist/components/AssignPageNumber/AssignPageNumber.d.ts +0 -1
  9. package/dist/components/BulkUpload/CsvUpload.d.ts +0 -1
  10. package/dist/components/Collaborators/ManageCollaborators.d.ts +0 -1
  11. package/dist/components/CollectionEditor/CollectionEditor.d.ts +0 -1
  12. package/dist/components/ContentPlayer/ContentPlayer.d.ts +0 -1
  13. package/dist/components/ContextualEditor/AssessmentDetailPanel.d.ts +7 -0
  14. package/dist/components/ContextualEditor/Breadcrumb.d.ts +0 -1
  15. package/dist/components/ContextualEditor/ContentEditForm.d.ts +0 -1
  16. package/dist/components/ContextualEditor/ContextualEditor.d.ts +0 -1
  17. package/dist/components/ContextualEditor/TabBar.d.ts +0 -1
  18. package/dist/components/ContextualEditor/TitleAppIcon.d.ts +0 -1
  19. package/dist/components/Dialcode/DialcodePanel.d.ts +0 -1
  20. package/dist/components/LibraryDock/FilterChips.d.ts +0 -1
  21. package/dist/components/LibraryDock/LibraryCard.d.ts +0 -1
  22. package/dist/components/LibraryDock/LibraryDock.d.ts +0 -1
  23. package/dist/components/LibraryDock/LibraryFilterPanel.d.ts +0 -1
  24. package/dist/components/LibraryDock/LibraryPreviewPanel.d.ts +0 -1
  25. package/dist/components/OutlineTree/OutlineTree.d.ts +0 -1
  26. package/dist/components/OutlineTree/TreeNode.d.ts +0 -1
  27. package/dist/components/ProgressStatus/ProgressStatus.d.ts +0 -1
  28. package/dist/components/ResourceReorder/ResourceReorderDialog.d.ts +0 -1
  29. package/dist/components/SparkMetaForm/FormSection.d.ts +0 -1
  30. package/dist/components/SparkMetaForm/SparkMetaForm.d.ts +0 -1
  31. package/dist/components/SparkMetaForm/fields/AppIconField.d.ts +0 -1
  32. package/dist/components/SparkMetaForm/fields/AppIconPickerModal.d.ts +0 -1
  33. package/dist/components/SparkMetaForm/fields/ChipGroupField.d.ts +0 -1
  34. package/dist/components/SparkMetaForm/fields/DateTimeField.d.ts +0 -1
  35. package/dist/components/SparkMetaForm/fields/DialcodeInputField.d.ts +0 -1
  36. package/dist/components/SparkMetaForm/fields/KeywordSuggestField.d.ts +0 -1
  37. package/dist/components/SparkMetaForm/fields/LicenseSelectField.d.ts +0 -1
  38. package/dist/components/SparkMetaForm/fields/MultiSelectField.d.ts +0 -1
  39. package/dist/components/SparkMetaForm/fields/NestedSelectField.d.ts +0 -1
  40. package/dist/components/SparkMetaForm/fields/PolicyCardField.d.ts +9 -0
  41. package/dist/components/SparkMetaForm/fields/RadioField.d.ts +0 -1
  42. package/dist/components/SparkMetaForm/fields/SelectField.d.ts +0 -1
  43. package/dist/components/SparkMetaForm/fields/TextField.d.ts +0 -1
  44. package/dist/components/SparkMetaForm/hooks/useCascade.d.ts +0 -1
  45. package/dist/components/SparkMetaForm/hooks/useFieldPrepare.d.ts +9 -1
  46. package/dist/components/SparkMetaForm/hooks/useFieldPrepare.learningPath.test.d.ts +1 -0
  47. package/dist/components/SplitBuilderShell/SplitBuilderShell.d.ts +0 -1
  48. package/dist/components/Topbar/Topbar.d.ts +0 -1
  49. package/dist/components/UnitContentList/AssessmentSlotItem.d.ts +7 -0
  50. package/dist/components/UnitContentList/ContentRow.d.ts +0 -1
  51. package/dist/components/UnitContentList/SkillPicker.d.ts +15 -0
  52. package/dist/components/UnitContentList/UnitContentList.d.ts +1 -1
  53. package/dist/components/modals/ConfirmDialog.d.ts +0 -1
  54. package/dist/components/modals/PublishChecklist.d.ts +0 -1
  55. package/dist/components/modals/QualityParamsModal.d.ts +0 -1
  56. package/dist/components/modals/UnsavedChangesModal.d.ts +0 -1
  57. package/dist/components/shared/Button.d.ts +0 -1
  58. package/dist/components/shared/Card.d.ts +0 -1
  59. package/dist/components/shared/Chip.d.ts +0 -1
  60. package/dist/components/shared/CourseDetailsPanel.d.ts +11 -0
  61. package/dist/components/shared/DropZone.d.ts +0 -1
  62. package/dist/components/shared/LanguageSelector/LanguageSelector.d.ts +0 -1
  63. package/dist/components/shared/LearningPathIcon.d.ts +6 -0
  64. package/dist/components/shared/Spinner.d.ts +0 -1
  65. package/dist/components/shared/index.d.ts +2 -0
  66. package/dist/dev-mock-api.d.ts +1 -0
  67. package/dist/hooks/useAssessmentSlots.d.ts +16 -0
  68. package/dist/hooks/useChannelData.d.ts +0 -1
  69. package/dist/hooks/useContentType.d.ts +0 -1
  70. package/dist/hooks/useEditorInit.d.ts +0 -1
  71. package/dist/hooks/useFramework.d.ts +0 -1
  72. package/dist/hooks/useLabels.d.ts +0 -1
  73. package/dist/hooks/useLibrary.d.ts +30 -1
  74. package/dist/hooks/useLibrary.test.d.ts +1 -0
  75. package/dist/hooks/useLibraryTargetLabel.d.ts +1 -0
  76. package/dist/hooks/useQumlContent.d.ts +0 -1
  77. package/dist/hooks/useSaveHierarchy.d.ts +6 -0
  78. package/dist/hooks/useSaveHierarchy.test.d.ts +1 -0
  79. package/dist/hooks/useSkillCategory.d.ts +24 -0
  80. package/dist/hooks/useSkillCategory.test.d.ts +1 -0
  81. package/dist/hooks/useSkillScope.d.ts +14 -0
  82. package/dist/hooks/useSkillScope.test.d.ts +1 -0
  83. package/dist/hooks/useToolbarActions.d.ts +0 -1
  84. package/dist/hooks/useTree.d.ts +0 -1
  85. package/dist/i18n/index.d.ts +0 -1
  86. package/dist/i18n/locales/ar.json.d.ts +92 -0
  87. package/dist/i18n/locales/en.json.d.ts +92 -0
  88. package/dist/i18n/locales/fr.json.d.ts +92 -0
  89. package/dist/i18n/locales/pt.json.d.ts +92 -0
  90. package/dist/index.cjs +144 -104
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.js +10861 -11055
  93. package/dist/services/quml/QumlPlayerService.d.ts +0 -1
  94. package/dist/store/editor.store.d.ts +3 -1
  95. package/dist/store/i18n.store.d.ts +0 -1
  96. package/dist/store/library.store.d.ts +0 -1
  97. package/dist/store/tree.store.d.ts +8 -3
  98. package/dist/store/tree.store.learningPath.test.d.ts +1 -0
  99. package/dist/store/ui.store.d.ts +2 -0
  100. package/dist/types/content.d.ts +2 -0
  101. package/dist/types/framework.d.ts +4 -0
  102. package/dist/types/profile.d.ts +30 -0
  103. package/dist/types/profile.test.d.ts +1 -0
  104. package/dist/utils/lpStructure.d.ts +151 -0
  105. package/dist/utils/lpStructure.test.d.ts +1 -0
  106. package/dist/utils/validateRequiredFields.d.ts +0 -1
  107. package/dist/web-component/configRoundTrip.test.d.ts +1 -0
  108. package/package.json +13 -4
  109. package/dist/style.css +0 -1
@@ -1,5 +1,4 @@
1
1
  import { IContext } from '../../types/editor';
2
-
3
2
  export interface QumlContextProps {
4
3
  mode?: string;
5
4
  cdata?: unknown[];
@@ -1,6 +1,6 @@
1
1
  import { IEditorConfig, EditorMode, IButtonLoaders } from '../types/editor';
2
2
  import { ICategoryField, IParsedCategoryDefinition } from '../api/categoryDefinition';
3
-
3
+ import { IEditorProfile } from '../types/profile';
4
4
  interface EditorState {
5
5
  editorConfig: IEditorConfig | null;
6
6
  editorMode: EditorMode;
@@ -31,7 +31,9 @@ interface EditorState {
31
31
  formStatusMapper: Record<string, boolean>;
32
32
  contentFramework: string | null;
33
33
  contentTargetFWIds: string[] | null;
34
+ editorProfile: IEditorProfile;
34
35
  setEditorConfig: (config: IEditorConfig) => void;
36
+ setEditorProfile: (profile: IEditorProfile) => void;
35
37
  setEditorMode: (mode: EditorMode) => void;
36
38
  setButtonLoader: (key: keyof IButtonLoaders, value: boolean) => void;
37
39
  setShowPreview: (show: boolean) => void;
@@ -1,5 +1,4 @@
1
1
  import { LabelConfig } from '../i18n';
2
-
3
2
  export declare const APP_LANGUAGE_STORAGE_KEY = "app-language";
4
3
  export declare const APP_LANGUAGE_CHANGE_EVENT = "app-language-change";
5
4
  interface I18nState {
@@ -1,6 +1,5 @@
1
1
  import { IContent } from '../types/content';
2
2
  import { LibraryFilters } from '../components/LibraryDock/LibraryFilterPanel';
3
-
4
3
  interface LibraryState {
5
4
  allContent: IContent[];
6
5
  filteredContent: IContent[];
@@ -1,6 +1,5 @@
1
1
  import { INode } from '../types/editor';
2
2
  import { IContent } from '../types/content';
3
-
4
3
  interface TreeState {
5
4
  treeData: INode[];
6
5
  selectedNodeId: string | null;
@@ -12,11 +11,14 @@ interface TreeState {
12
11
  activeNodeMeta: Record<string, unknown>;
13
12
  setTreeData: (nodes: INode[]) => void;
14
13
  selectNode: (id: string) => void;
15
- updateNode: (id: string, patch: Record<string, unknown>) => void;
14
+ updateNode: (id: string, patch: Record<string, unknown>, extraMirrorKeys?: string[]) => void;
16
15
  addNode: (parentId: string, type: 'unit' | 'subunit') => string;
17
16
  deleteNode: (id: string) => void;
18
17
  reorderChildren: (parentId: string, fromIndex: number, toIndex: number) => void;
19
- addResource: (content: IContent, nodeId: string) => boolean;
18
+ addResource: (content: IContent, nodeId: string, opts?: {
19
+ isAssessmentCourse?: boolean;
20
+ slot?: 'pre' | 'post';
21
+ }) => boolean;
20
22
  markDirty: () => void;
21
23
  getNodeById: (id: string) => INode | undefined;
22
24
  getChildrenOf: (id: string) => INode[];
@@ -26,6 +28,9 @@ interface TreeState {
26
28
  }>;
27
29
  moveNode: (nodeId: string, fromParentId: string, toParentId: string) => void;
28
30
  replaceNodeIds: (identifiers: Record<string, string>) => void;
31
+ /** LP: drop linked courses tagged under a different framework than the
32
+ * root's newly-selected curriculum. Returns how many were removed. */
33
+ pruneCoursesByFramework: (frameworkId: string) => number;
29
34
  }
30
35
  export declare const useTreeStore: import('zustand').UseBoundStore<import('zustand').StoreApi<TreeState>>;
31
36
  export declare const getTreeStore: () => () => TreeState;
@@ -0,0 +1 @@
1
+ export {};
@@ -4,6 +4,8 @@ interface UiState {
4
4
  modalData: Record<string, unknown>;
5
5
  openModal: (modal: ModalType, data?: Record<string, unknown>) => void;
6
6
  closeModal: () => void;
7
+ activeAssessmentSlot: 'pre' | 'post' | null;
8
+ setActiveAssessmentSlot: (slot: 'pre' | 'post' | null) => void;
7
9
  }
8
10
  export declare const useUiStore: import('zustand').UseBoundStore<import('zustand').StoreApi<UiState>>;
9
11
  export {};
@@ -24,6 +24,7 @@ export declare const CT_COLOR_MAP: {
24
24
  readonly scorm: "#7C3AED";
25
25
  readonly audio: "#DB2777";
26
26
  readonly quiz: "#16A34A";
27
+ readonly course: "#A85236";
27
28
  readonly default: "#6B7280";
28
29
  };
29
30
  export declare const CT_ICON_MAP: {
@@ -33,6 +34,7 @@ export declare const CT_ICON_MAP: {
33
34
  readonly scorm: "Package";
34
35
  readonly audio: "Music";
35
36
  readonly quiz: "HelpCircle";
37
+ readonly course: "BookOpen";
36
38
  readonly default: "File";
37
39
  };
38
40
  export declare const LIBRARY_PRIMARY_CATEGORIES: readonly ["Course Assessment", "eTextbook", "Exam Question", "Explanation Content", "Learning Resource", "Practice Question Set", "SCORM Content", "Teacher Resource"];
@@ -16,6 +16,10 @@ export interface ICategory {
16
16
  identifier: string;
17
17
  name: string;
18
18
  code: string;
19
+ /** Category order within the framework — the LP editor resolves the
20
+ * skill-equivalent category as the one with the highest index (USF's
21
+ * `skill` category also has the highest index, so one rule covers both). */
22
+ index?: number;
19
23
  terms?: ITerm[];
20
24
  }
21
25
  export interface IFramework {
@@ -0,0 +1,30 @@
1
+ import { IConfig } from './editor';
2
+ export interface IEditorProfile {
3
+ key: 'collection' | 'learningPath';
4
+ /** primaryCategory + contentType written for new folder nodes */
5
+ unitPrimaryCategory: string;
6
+ unitContentType: string;
7
+ /** i18n key for the unit label ('unit' | 'level') */
8
+ unitLabelKey: string;
9
+ defaultUnitName: string;
10
+ maxDepth: number;
11
+ /** leaves are linked published objects (e.g. Courses), not authored content */
12
+ linkedLeavesOnly: boolean;
13
+ leafPrimaryCategories: string[];
14
+ /** structural roles derived from unit index (e.g. pre/post assessment slots) */
15
+ derivedRoles: boolean;
16
+ /** competency-scoped library search */
17
+ competencyScoped: boolean;
18
+ features: {
19
+ csvUpload: boolean;
20
+ dialcodes: boolean;
21
+ pageNumbers: boolean;
22
+ bulkUpload: boolean;
23
+ collaborators: boolean;
24
+ };
25
+ }
26
+ export declare const collectionProfile: IEditorProfile;
27
+ export declare const learningPathProfile: IEditorProfile;
28
+ export declare function resolveEditorProfile(config: {
29
+ config: Pick<IConfig, 'primaryCategory'>;
30
+ }): IEditorProfile;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,151 @@
1
+ import { INode } from '../types/editor';
2
+ export interface HierarchyLeafLike {
3
+ objectType?: string;
4
+ mimeType?: string;
5
+ children?: HierarchyLeafLike[];
6
+ }
7
+ /**
8
+ * True iff the course has at least one leaf and every leaf is a QuML
9
+ * QuestionSet — legacy ECML assessment resources
10
+ * (application/vnd.ekstep.ecml-archive) do NOT qualify even though they're
11
+ * historically labelled "assessment" content. An empty course (no leaves at
12
+ * all) is not an assessment course.
13
+ */
14
+ export declare function isAssessmentCourse(course: HierarchyLeafLike): boolean;
15
+ export interface AssessmentCourseInfo {
16
+ qualifies: boolean;
17
+ /** The course's full metadata from its own hierarchy read (children stripped).
18
+ * Needed because composite-search results only carry the LP framework's
19
+ * skill field — a course tagged under a different framework (e.g. USF)
20
+ * would otherwise land in the tree without its framework or skill tags. */
21
+ meta: Record<string, unknown>;
22
+ }
23
+ export declare function getAssessmentCourseInfo(courseId: string): Promise<AssessmentCourseInfo>;
24
+ export declare function checkAssessmentCourse(courseId: string): Promise<boolean>;
25
+ export declare function clearAssessmentCourseCache(): void;
26
+ /**
27
+ * Repairs a freshly-loaded LP tree (useEditorInit, after readHierarchy).
28
+ * The hierarchy read undoes two editor-local invariants:
29
+ * - mapToINode marks linked courses (collection mimeType) as folders and
30
+ * expands their internal children — in the LP tree courses are terminal
31
+ * leaves, so re-flatten them;
32
+ * - the isAssessmentCourse flag is local-only (stripped from saves), so
33
+ * without it no Level is recognized as a pre/post slot and "Skills
34
+ * covered"/slot rules read the path as having no assessments. Recompute
35
+ * it from the course's expanded subtree when the read included one, else
36
+ * (single-course first/last Levels only) via a checkAssessmentCourse read.
37
+ */
38
+ export declare function normalizeLearningPathTree(root: INode): Promise<INode>;
39
+ export type LevelRole = 'pre' | 'post' | 'levelAssessment' | 'content';
40
+ export declare function isAssessmentLevel(level: INode | undefined): boolean;
41
+ /**
42
+ * getLevelRole(levelIndex, levelCount, hasAssessmentCourse) → role.
43
+ * Level[0] wrapping an assessment course is Prior/diagnostic ("pre");
44
+ * Level[levelCount-1] wrapping one is Outcome/summative ("post"); an
45
+ * assessment course inside any other Level is a Level assessment; anything
46
+ * else is a regular content Level. When levelCount === 1 the sole Level is
47
+ * treated as "pre" (index-0 check wins the tie) rather than "post".
48
+ */
49
+ export declare function getLevelRole(levelIndex: number, levelCount: number, hasAssessmentCourse: boolean): LevelRole;
50
+ /**
51
+ * Display info for one of root's Level children, keyed by id — same
52
+ * numbering rule TreeNode uses for its "Level N • {name}" row (assessment
53
+ * slots excluded from the count), reused by the Course-detail page's
54
+ * "Back to {label}" button so the two stay consistent.
55
+ */
56
+ export declare function getLevelDisplayInfo(levels: INode[], levelId: string): {
57
+ role: 'pre' | 'post' | 'level';
58
+ levelNumber: number | null;
59
+ } | null;
60
+ /** Whether the pre (index 0) / post (last index) assessment slot already
61
+ * wraps an assessment course, given root's current Level children. */
62
+ export declare function isAssessmentSlotFilled(levels: INode[], slot: 'pre' | 'post'): boolean;
63
+ /** Whether `level` (a direct child of root) is genuinely the pre/post
64
+ * assessment slot — position AND shape, unlike bare `isAssessmentLevel`.
65
+ * For callers (outside this module) that hold the level object rather
66
+ * than its index. */
67
+ export declare function isPrePostSlot(levels: INode[], level: INode | undefined): boolean;
68
+ /**
69
+ * Which pre/post assessment slot (if any) is open to receive a newly-linked
70
+ * assessment course, given root's current Level children. Pre is checked
71
+ * first, so a lone empty path always fills "pre" before "post" — matching
72
+ * getLevelRole's tie-break for levelCount === 1. Returns null once both
73
+ * slots are already wrapping an assessment course.
74
+ */
75
+ export declare function resolveOpenAssessmentSlot(levels: INode[]): 'pre' | 'post' | null;
76
+ /**
77
+ * Guards reorder of root's direct Level children: the pre-assessment Level
78
+ * (if any) must stay pinned at index 0 and the post-assessment Level (if any)
79
+ * must stay pinned at the last index; reordering is only free for the
80
+ * content Levels between them. Simulates the same splice-based move
81
+ * `reorderInParent` performs and checks the pinned Levels didn't shift,
82
+ * rather than hand-deriving index-shift arithmetic.
83
+ */
84
+ export declare function canReorderLevel(levels: INode[], fromIndex: number, toIndex: number): boolean;
85
+ /**
86
+ * Guards adding a course into a Level (doc rules, Phase 2 item 4): a
87
+ * pre/post assessment slot holds exactly one course, ever; a content Level
88
+ * allows any number of regular courses plus at most one Level assessment (a
89
+ * course flagged isAssessmentCourse). `isTargetPrePostSlot` must be computed
90
+ * via `isPrePostSlot` (position-aware) — bare shape (`isAssessmentLevel`)
91
+ * alone would also match a content Level whose only current course happens
92
+ * to be its Level assessment, wrongly blocking further regular courses on
93
+ * an otherwise-open Level.
94
+ */
95
+ export declare function canAddCourseToLevel(level: INode | undefined, incomingIsAssessmentCourse: boolean, isTargetPrePostSlot: boolean): boolean;
96
+ /**
97
+ * The LP root's explicitly-chosen Curriculum (framework) — from a prior save
98
+ * or the current session's Curriculum field, checked via treeCache first
99
+ * since a live edit lands there before a save round-trips it into
100
+ * root.metadata. Deliberately NOT the same as the channel/context default
101
+ * framework (useEditorStore's contentFramework, resolved so *something*
102
+ * exists to browse/filter by before the author has chosen anything) — that
103
+ * fallback must never be mistaken for a real choice, or courses linked
104
+ * under it get pruned the moment a real Curriculum is set, and the Library
105
+ * would silently scope itself to a framework the author never picked.
106
+ */
107
+ export declare function getExplicitCurriculum(root: INode | undefined, treeCache: Record<string, Record<string, unknown>>): string | undefined;
108
+ export declare function hasExplicitCurriculum(root: INode | undefined, treeCache: Record<string, Record<string, unknown>>): boolean;
109
+ /**
110
+ * "Skills covered" (root summary, Phase 4): the union of skills tagged
111
+ * across the Prior Assessment, each Level's *selected* skills, and the
112
+ * Outcome Assessment — never skills scraped from linked courses' content.
113
+ * Both assessment Levels (their course's tags) and content Levels (their
114
+ * own selection) read the SAME resolved skillCategoryCode metadata field —
115
+ * never the reserved Sunbird `competencies` field, whose platform schema
116
+ * expects competency-ontology objects, not plain framework-term strings.
117
+ */
118
+ /**
119
+ * "Path shape" (root summary, Phase 4): level count excludes the pre/post
120
+ * assessment slots (design: "Neither counts as a level"); course count
121
+ * includes every linked course, assessment courses included.
122
+ */
123
+ export declare function computePathShape(root: INode | undefined): {
124
+ levelCount: number;
125
+ courseCount: number;
126
+ };
127
+ export declare function computeSkillsCovered(root: INode | undefined, skillCategoryCode: string | undefined): string[];
128
+ export interface LpValidationIssue {
129
+ code: string;
130
+ message: string;
131
+ nodeId?: string;
132
+ }
133
+ export declare const REQUIRES_PRIOR_POLICIES: Set<string>;
134
+ /**
135
+ * Every synchronous (no network) LP publish rule: consumption policy set;
136
+ * prior assessment required only for Diagnostic/PriorLearning (not Fixed —
137
+ * confirmed open question #1); outcome assessment required always; pre/post
138
+ * slot purity; every content Level has ≥1 course and ≥1 in-scope skill; no
139
+ * empty Levels; every linked course carries a skill tag; no duplicate course
140
+ * across the path. `skillScope` empty means "no scope constraint yet"
141
+ * (matches useSkillScope's manual-fallback catalog, not an empty scope).
142
+ */
143
+ export declare function validateLearningPathStructure(root: INode | undefined, skillCategoryCode: string | undefined, skillScope: string[]): LpValidationIssue[];
144
+ /**
145
+ * Re-verifies the pre/post assessment courses are STILL question-set-only at
146
+ * publish time (Phase 1 item 6 / Phase 5: "the course may have changed since
147
+ * it was linked"). Separate from validateLearningPathStructure because it
148
+ * requires a network read; callers should run it alongside the sync checks,
149
+ * not instead of them.
150
+ */
151
+ export declare function revalidateAssessmentSlots(root: INode | undefined): Promise<LpValidationIssue[]>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,6 @@
1
1
  import { INode } from '../types/editor';
2
2
  import { IFrameworkDetails } from '../types/framework';
3
3
  import { IPrepareContext } from '../components/SparkMetaForm/hooks/useFieldPrepare';
4
-
5
4
  export interface MissingFieldsReport {
6
5
  nodeId: string;
7
6
  nodeName: string;
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@project-sunbird/collection-editor-react",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -57,12 +57,21 @@
57
57
  "@vitejs/plugin-react": "^4.3.1",
58
58
  "sass": "^1.77.6",
59
59
  "typescript": "^5.5.3",
60
- "vite": "^5.3.4",
61
- "vite-plugin-dts": "^3.9.1",
62
- "vitest": "^2.0.3"
60
+ "vite": "^6.4.3",
61
+ "vite-plugin-dts": "^5.0.3",
62
+ "vitest": "^3.2.7"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "react": "^18.0.0 || ^19.0.0",
66
66
  "react-dom": "^18.0.0 || ^19.0.0"
67
+ },
68
+ "overrides": {
69
+ "@microsoft/api-extractor": {
70
+ "lodash": "^4.18.0",
71
+ "minimatch": "^3.1.3"
72
+ },
73
+ "@microsoft/tsdoc-config": {
74
+ "ajv": "^6.14.0"
75
+ }
67
76
  }
68
77
  }
package/dist/style.css DELETED
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap";@keyframes _spin_1ah4d_9{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._spin_1ah4d_9{animation:_spin_1ah4d_9 .8s linear infinite;display:inline-block;vertical-align:middle}._overlay_w9xez_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:1000;display:flex;align-items:center;justify-content:center}._modal_w9xez_11{background:#fff;border-radius:8px;padding:24px;min-width:400px;max-width:600px;width:100%;box-shadow:0 20px 25px #00000026,0 8px 10px #0000001a;max-height:90vh;overflow-y:auto}._modalHeader_w9xez_23{display:flex;justify-content:space-between;align-items:center;font-size:18px;font-weight:600;color:var(--sbx-gray-900, #111827);margin-bottom:16px}._modalHeaderClose_w9xez_33{background:none;border:none;cursor:pointer;padding:4px;color:var(--sbx-gray-500, #6B7280);font-size:20px;line-height:1;border-radius:4px;display:flex;align-items:center;justify-content:center}._modalHeaderClose_w9xez_33:hover{color:var(--sbx-gray-800, #1F2937);background:var(--sbx-gray-100, #F3F4F6)}._modalBody_w9xez_51{margin-bottom:24px;color:var(--sbx-gray-700, #374151);font-size:14px;line-height:1.6}._modalFooter_w9xez_58{display:flex;justify-content:flex-end;gap:8px;align-items:center}._checkRow_w9xez_65{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:14px;color:var(--sbx-gray-700, #374151)}._checkIcon_w9xez_74{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:14px}._pass_w9xez_84{color:var(--sbx-success, #16A34A)}._fail_w9xez_88{color:var(--sbx-error, #DC2626)}._divider_w9xez_92{border:none;border-top:1px solid var(--sbx-gray-200, #E5E7EB);margin:16px 0}._errorBanner_w9xez_98{background:var(--sbx-status-err-bg);border:1px solid var(--sbx-status-err-border);border-radius:6px;padding:10px 14px;font-size:13px;color:var(--sbx-error, #DC2626);margin-bottom:16px}._formGroup_w9xez_108{margin-bottom:16px}._formGroup_w9xez_108 label{display:block;font-size:13px;font-weight:600;color:var(--sbx-gray-700, #374151);margin-bottom:6px}._textarea_w9xez_119{width:100%;border:1.5px solid var(--sbx-gray-300, #D1D5DB);border-radius:6px;padding:10px 12px;font-size:14px;color:var(--sbx-gray-900, #111827);font-family:inherit;resize:vertical;min-height:90px;transition:border-color .15s}._textarea_w9xez_119:focus{outline:none;border-color:var(--sbx-primary, #2D6AE3);box-shadow:0 0 0 3px #2d6ae31f}._textarea_w9xez_119::placeholder{color:var(--sbx-gray-400, #9CA3AF)}._sliderGroup_w9xez_140{display:flex;align-items:center;gap:12px}._sliderGroup_w9xez_140 input[type=range]{flex:1;accent-color:var(--sbx-primary, #2D6AE3);height:4px;cursor:pointer}._sliderValue_w9xez_152{min-width:28px;text-align:center;font-weight:700;font-size:15px;color:var(--sbx-primary, #2D6AE3)}._sliderLabels_w9xez_160{display:flex;justify-content:space-between;font-size:11px;color:var(--sbx-gray-400, #9CA3AF);margin-top:4px}._sectionTitle_w9xez_168{font-size:13px;font-weight:600;color:var(--sbx-gray-500, #6B7280);text-transform:uppercase;letter-spacing:.05em;margin-bottom:12px}._container_r27rp_1{display:flex;flex-direction:column;background:#fff;border-radius:var(--sbx-r-lg);box-shadow:var(--sbx-shadow-3);width:520px;max-width:95vw;max-height:85vh;overflow:hidden}._header_r27rp_13{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--sbx-gray-200);flex-shrink:0}._title_r27rp_22{font-size:17px;font-weight:700;color:var(--sbx-gray-900);margin:0}._closeBtn_r27rp_29{background:none;border:none;cursor:pointer;font-size:18px;color:var(--sbx-gray-500);padding:4px 8px;border-radius:var(--sbx-r-sm);line-height:1;transition:background .15s}._closeBtn_r27rp_29:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-800)}._body_r27rp_45{flex:1;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:24px}._label_r27rp_54{display:block;font-size:13px;font-weight:600;color:var(--sbx-gray-700);margin-bottom:8px}._searchSection_r27rp_62{display:flex;flex-direction:column;position:relative}._searchRow_r27rp_68{position:relative;display:flex;align-items:center}._searchInput_r27rp_74{width:100%;height:38px;padding:0 40px 0 12px;border:1.5px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm);font-size:14px;color:var(--sbx-gray-900);transition:border-color .15s}._searchInput_r27rp_74:focus{outline:none;border-color:var(--sbx-primary)}._searchSpinner_r27rp_89{position:absolute;right:12px;width:16px;height:16px;border:2px solid var(--sbx-gray-300);border-top-color:var(--sbx-primary);border-radius:50%;animation:_spin_r27rp_1 .7s linear infinite}@keyframes _spin_r27rp_1{to{transform:rotate(360deg)}}._resultsList_r27rp_105{list-style:none;margin:4px 0 0;padding:0;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-sm);overflow:hidden;background:#fff;box-shadow:var(--sbx-shadow-2);max-height:200px;overflow-y:auto}._resultItem_r27rp_118{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;gap:12px;transition:background .1s}._resultItem_r27rp_118:not(:last-child){border-bottom:1px solid var(--sbx-gray-100)}._resultItem_r27rp_118:hover{background:var(--sbx-gray-50)}._userInfo_r27rp_133{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}._userName_r27rp_141{font-size:14px;font-weight:600;color:var(--sbx-gray-800);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._userEmail_r27rp_150{font-size:12px;color:var(--sbx-gray-500);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._userOrg_r27rp_158{font-size:11px;color:var(--sbx-gray-400);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-style:italic}._noResults_r27rp_167{font-size:13px;color:var(--sbx-gray-500);margin:8px 0 0;padding:10px 0}._collabSection_r27rp_174{display:flex;flex-direction:column}._sectionTitle_r27rp_179{font-size:14px;font-weight:600;color:var(--sbx-gray-700);margin:0 0 12px;display:flex;align-items:center;gap:8px}._badge_r27rp_189{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--sbx-primary);color:#fff;font-size:11px;font-weight:700}._emptyCollab_r27rp_203{font-size:13px;color:var(--sbx-gray-500);margin:0;padding:16px;text-align:center;background:var(--sbx-gray-50);border-radius:var(--sbx-r-sm);border:1px dashed var(--sbx-gray-300)}._collabList_r27rp_214{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}._collabItem_r27rp_223{display:flex;align-items:center;gap:12px;padding:10px 14px;border:1px solid var(--sbx-gray-200);border-radius:var(--sbx-r-sm);background:var(--sbx-gray-50);transition:background .1s}._collabItem_r27rp_223:hover{background:var(--sbx-gray-100)}._userAvatar_r27rp_237{width:36px;height:36px;border-radius:50%;background:var(--sbx-primary-light);color:var(--sbx-primary);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:15px;flex-shrink:0}._error_r27rp_251{font-size:13px;color:var(--sbx-error);margin:0}._success_r27rp_257{font-size:13px;color:var(--sbx-success);margin:0}._footer_r27rp_263{display:flex;gap:10px;justify-content:flex-end;padding:16px 24px;border-top:1px solid var(--sbx-gray-200);flex-shrink:0}._topbar_zj8wk_1{display:flex;align-items:center;justify-content:space-between;height:var(--sbx-topbar-h, 60px);padding:0 20px;background:#fff;border-bottom:1px solid var(--sbx-gray-200);box-shadow:var(--sbx-shadow-1);flex-shrink:0;gap:16px;z-index:10}._left_zj8wk_15{display:flex;align-items:center;gap:12px;min-width:0;flex:1}._right_zj8wk_23{display:flex;align-items:center;gap:8px;flex-shrink:0}._backBtn_zj8wk_30{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--sbx-r-sm);border:1.5px solid var(--sbx-gray-200);background:#fff;cursor:pointer;color:var(--sbx-gray-600);flex-shrink:0;transition:border-color .15s,color .15s}._backBtn_zj8wk_30:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._title_zj8wk_49{font-family:var(--sbx-font);font-size:16px;font-weight:600;color:var(--sbx-gray-900);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:300px}._statusChip_zj8wk_61{font-size:12px;font-family:var(--sbx-font);flex-shrink:0;padding:2px 10px;border-radius:var(--sbx-r-xl);border:1.5px solid var(--sbx-gray-300);color:var(--sbx-gray-600);background:var(--sbx-gray-50);font-weight:500}._savedIndicator_zj8wk_73{display:flex;align-items:center;gap:4px;font-family:var(--sbx-font);font-size:12px;color:var(--sbx-gray-500);white-space:nowrap}._unsaved_zj8wk_83{color:var(--sbx-error, #dc2626);font-weight:600}._iconBtn_zj8wk_88{display:flex;align-items:center;gap:5px;height:36px;padding:0 14px;border-radius:var(--sbx-r-sm);border:1.5px solid var(--sbx-gray-200);background:#fff;cursor:pointer;color:var(--sbx-gray-600);font-family:var(--sbx-font);font-size:12px;font-weight:500;white-space:nowrap;transition:border-color .15s,color .15s,background .15s}._iconBtn_zj8wk_88:hover{border-color:var(--sbx-primary);color:var(--sbx-primary);background:var(--sbx-primary-50, #EFF6FF)}._iconBtn_zj8wk_88:focus-visible{outline:2px solid var(--sbx-primary);outline-offset:2px}._iconBtnLabel_zj8wk_115{display:inline}._qrDropdown_zj8wk_119{position:relative}._qrMenu_zj8wk_123{position:absolute;top:calc(100% + 4px);right:0;background:#fff;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md, 8px);box-shadow:var(--sbx-shadow-2, 0 4px 16px rgba(0, 0, 0, .12));min-width:190px;z-index:200;overflow:hidden}._qrMenu_zj8wk_123 button{display:flex;align-items:center;gap:8px;width:100%;padding:10px 14px;border:none;background:none;font-family:var(--sbx-font);font-size:13px;color:var(--sbx-gray-700);cursor:pointer;text-align:left;transition:background .12s}._qrMenu_zj8wk_123 button:hover:not(:disabled){background:var(--sbx-gray-50)}._qrMenu_zj8wk_123 button:disabled{opacity:.45;cursor:not-allowed}._reviewBtns_zj8wk_158,._sourcingBtns_zj8wk_167{display:flex;align-items:center;gap:6px;padding-left:8px;border-left:1px solid var(--sbx-gray-200);margin-left:4px}._modalOverlay_zj8wk_176{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:1000;display:flex;align-items:center;justify-content:center}._sbOverlay_zj8wk_186{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000}._sbModal_zj8wk_196{background:#fff;border-radius:var(--sbx-r-md, 8px);box-shadow:var(--sbx-shadow-3, 0 8px 32px rgba(0, 0, 0, .18));width:480px;max-width:calc(100vw - 32px);display:flex;flex-direction:column;overflow:hidden}._sbModalHeader_zj8wk_207{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--sbx-gray-200)}._sbModalTitle_zj8wk_215{font-family:var(--sbx-font);font-size:15px;font-weight:600;color:var(--sbx-gray-900)}._sbModalClose_zj8wk_222{background:none;border:none;cursor:pointer;font-size:20px;line-height:1;color:var(--sbx-gray-500);padding:0 4px}._sbModalClose_zj8wk_222:hover{color:var(--sbx-gray-900)}._sbModalBody_zj8wk_235{padding:20px;display:flex;flex-direction:column;gap:6px}._sbLabel_zj8wk_242{font-family:var(--sbx-font);font-size:13px;font-weight:500;color:var(--sbx-gray-700)}._sbTextarea_zj8wk_249{width:100%;box-sizing:border-box;font-family:var(--sbx-font);font-size:13px;color:var(--sbx-gray-900);border:1.5px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm, 6px);padding:10px 12px;resize:vertical;outline:none;transition:border-color .15s}._sbTextarea_zj8wk_249:focus{border-color:var(--sbx-primary)}._sbError_zj8wk_266{font-family:var(--sbx-font);font-size:12px;color:var(--sbx-error, #DC2626);margin:0}._sbModalFooter_zj8wk_273{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--sbx-gray-200)}._row_i3qt2_1{display:flex;align-items:center;gap:6px;padding:0 8px;cursor:pointer;border-radius:var(--sbx-r-sm);margin:1px 4px;position:relative;transition:background .1s;height:38px}._row_i3qt2_1:hover{background:var(--sbx-gray-50)}._row_i3qt2_1:hover ._grip_i3qt2_16,._row_i3qt2_1:hover ._menuBtn_i3qt2_19{opacity:1}._selected_i3qt2_23{background:var(--sbx-primary-light);border-left:3px solid var(--sbx-primary);padding-left:5px}._selected_i3qt2_23 ._title_i3qt2_28{color:var(--sbx-primary);font-weight:600}._dropTarget_i3qt2_33{background:var(--sbx-primary-light);border:1.5px dashed var(--sbx-primary)}._grip_i3qt2_16{color:var(--sbx-gray-300);cursor:grab;display:flex;opacity:0;flex-shrink:0;transition:opacity .1s}._grip_i3qt2_16:active{cursor:grabbing}._toggle_i3qt2_50{background:none;border:none;cursor:pointer;padding:2px;color:var(--sbx-gray-500);display:flex;align-items:center;flex-shrink:0;border-radius:var(--sbx-r-xs)}._toggle_i3qt2_50:hover{background:var(--sbx-gray-200)}._ctIcon_i3qt2_65{flex-shrink:0;width:24px;height:24px;border-radius:var(--sbx-r-xs);display:flex;align-items:center;justify-content:center;color:#fff;font-size:10px}._folderIcon_i3qt2_77{background:var(--sbx-primary, #2563eb);color:#fff}._title_i3qt2_28{flex:1;min-width:0;font-size:13px;color:var(--sbx-gray-700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._renameInput_i3qt2_92{flex:1;font-size:13px;border:1.5px solid var(--sbx-primary);border-radius:var(--sbx-r-xs);padding:2px 6px;outline:none}._dropHere_i3qt2_101{font-size:11px;color:var(--sbx-primary);font-weight:600;flex-shrink:0;background:var(--sbx-primary-light);padding:2px 8px;border-radius:var(--sbx-r-xl)}._menuWrap_i3qt2_111{position:relative;flex-shrink:0}._menuBtn_i3qt2_19{background:none;border:none;cursor:pointer;padding:4px;color:var(--sbx-gray-400);display:flex;align-items:center;border-radius:var(--sbx-r-xs);opacity:0;transition:opacity .1s}._menuBtn_i3qt2_19:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-700)}._menu_i3qt2_19{position:absolute;right:0;top:100%;z-index:100;background:#fff;border:1px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md);box-shadow:var(--sbx-shadow-3);min-width:160px;padding:4px}._menu_i3qt2_19 button{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:none;cursor:pointer;font-size:13px;color:var(--sbx-gray-700);border-radius:var(--sbx-r-sm);text-align:left}._menu_i3qt2_19 button:hover{background:var(--sbx-gray-50)}._dangerItem_i3qt2_163{color:var(--sbx-error)!important}._container_jr3ij_1{display:flex;flex-direction:column;background:#fff;border-radius:var(--sbx-r-lg);box-shadow:var(--sbx-shadow-3);width:560px;max-width:95vw;max-height:90vh;overflow:hidden}._header_jr3ij_13{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--sbx-gray-200);flex-shrink:0}._title_jr3ij_22{font-size:17px;font-weight:700;color:var(--sbx-gray-900);margin:0}._closeBtn_jr3ij_29{background:none;border:none;cursor:pointer;font-size:18px;color:var(--sbx-gray-500);padding:4px 8px;border-radius:var(--sbx-r-sm);line-height:1;transition:background .15s}._closeBtn_jr3ij_29:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-800)}._body_jr3ij_45{flex:1;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:16px}._dropZone_jr3ij_54{border:2px dashed var(--sbx-gray-300);border-radius:var(--sbx-r-md);padding:32px 24px;text-align:center;cursor:pointer;transition:all .15s;background:var(--sbx-gray-50)}._dropZone_jr3ij_54:hover{border-color:var(--sbx-primary);background:var(--sbx-primary-light)}._dropZone_jr3ij_54._dragOver_jr3ij_67{border-color:var(--sbx-primary);background:var(--sbx-primary-light);transform:scale(1.01)}._dropZone_jr3ij_54._hasFile_jr3ij_72{border-style:solid;border-color:var(--sbx-primary);background:var(--sbx-primary-light)}._hiddenInput_jr3ij_78{display:none}._fileInfo_jr3ij_82{display:flex;align-items:center;justify-content:center;gap:8px}._fileIcon_jr3ij_89{font-size:24px}._fileName_jr3ij_93{font-size:14px;font-weight:600;color:var(--sbx-gray-800);word-break:break-all}._fileSize_jr3ij_100{font-size:12px;color:var(--sbx-gray-500)}._dropHint_jr3ij_105{display:flex;flex-direction:column;align-items:center;gap:6px}._dropIcon_jr3ij_112{font-size:32px;margin-bottom:4px}._dropText_jr3ij_117{font-size:14px;font-weight:600;color:var(--sbx-gray-700);margin:0}._dropSubtext_jr3ij_124{font-size:12px;color:var(--sbx-gray-500);margin:0}._sampleLink_jr3ij_130{background:none;border:none;cursor:pointer;color:var(--sbx-primary);font-size:13px;text-decoration:underline;padding:0;align-self:flex-start;transition:color .15s}._sampleLink_jr3ij_130:hover{color:var(--sbx-primary-dark)}._statusBar_jr3ij_145{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:var(--sbx-r-sm);font-size:13px;font-weight:600}._statusBar_jr3ij_145._status_uploading_jr3ij_154,._statusBar_jr3ij_145._status_processing_jr3ij_154{background:var(--sbx-status-info-bg);color:var(--sbx-primary);border:1px solid var(--sbx-status-info-border)}._statusBar_jr3ij_145._status_done_jr3ij_159{background:var(--sbx-status-ok-bg);color:var(--sbx-success);border:1px solid var(--sbx-status-ok-border)}._statusBar_jr3ij_145._status_error_jr3ij_164{background:var(--sbx-status-err-bg);color:var(--sbx-error);border:1px solid var(--sbx-status-err-border)}._successDetail_jr3ij_170{font-weight:400;color:var(--sbx-success)}._spinner_jr3ij_175{width:14px;height:14px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:_spin_jr3ij_175 .7s linear infinite;display:inline-block;flex-shrink:0}@keyframes _spin_jr3ij_175{to{transform:rotate(360deg)}}._errorMsg_jr3ij_191{font-size:13px;color:var(--sbx-error);margin:0}._failedSection_jr3ij_197{border:1px solid var(--sbx-status-err-border);border-radius:var(--sbx-r-sm);overflow:hidden}._failedTitle_jr3ij_203{font-size:13px;font-weight:600;color:var(--sbx-error);margin:0;padding:10px 14px;background:var(--sbx-status-err-bg);border-bottom:1px solid var(--sbx-status-err-border)}._tableWrap_jr3ij_213{overflow-x:auto;max-height:200px;overflow-y:auto}._failedTable_jr3ij_219{width:100%;border-collapse:collapse;font-size:13px}._failedTable_jr3ij_219 th{padding:8px 12px;text-align:left;font-weight:600;color:var(--sbx-gray-600);background:var(--sbx-gray-50);border-bottom:1px solid var(--sbx-gray-200);position:sticky;top:0}._failedTable_jr3ij_219 td{padding:8px 12px;color:var(--sbx-gray-700);border-bottom:1px solid var(--sbx-gray-100);vertical-align:top}._failedTable_jr3ij_219 tr:last-child td{border-bottom:none}._reasonCell_jr3ij_244{color:var(--sbx-error)!important}._footer_jr3ij_248{display:flex;gap:10px;justify-content:flex-end;padding:16px 24px;border-top:1px solid var(--sbx-gray-200);flex-shrink:0}._container_1y30m_1{display:flex;flex-direction:column;height:100%;overflow:hidden}._header_1y30m_8{display:flex;align-items:center;justify-content:flex-end;padding:0 6px;height:40px;border-bottom:1px solid var(--sbx-gray-200);flex-shrink:0;background:#fff}._headerActions_1y30m_19{display:flex;align-items:center;gap:2px}._iconBtn_1y30m_25{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:var(--sbx-r-sm);color:var(--sbx-gray-500);cursor:pointer;transition:background .12s,color .12s}._iconBtn_1y30m_25:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-800)}._menuWrap_1y30m_43{position:relative}._dropdownMenu_1y30m_47{position:absolute;top:calc(100% + 4px);right:0;z-index:200;min-width:220px;background:#fff;border:1px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md);box-shadow:var(--sbx-shadow-2, 0 4px 16px rgba(0, 0, 0, .12));padding:4px 0;overflow:hidden}._dropdownMenu_1y30m_47 button{display:block;width:100%;text-align:left;padding:9px 14px;font-size:13px;font-weight:400;color:var(--sbx-gray-700);background:transparent;border:none;cursor:pointer;white-space:nowrap;transition:background .1s}._dropdownMenu_1y30m_47 button:hover{background:var(--sbx-gray-50);color:var(--sbx-gray-900)}._treeWrapper_1y30m_79{flex:1;overflow:hidden;padding:4px 0}._treeWrapper_1y30m_79::-webkit-scrollbar{width:4px}._treeWrapper_1y30m_79::-webkit-scrollbar-track{background:transparent}._treeWrapper_1y30m_79::-webkit-scrollbar-thumb{background:var(--sbx-gray-300);border-radius:2px}._csvModal_1y30m_95{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:1000;display:flex;align-items:center;justify-content:center}._footer_1y30m_105{border-top:1px solid var(--sbx-gray-200);padding:10px 12px;display:flex;gap:8px;flex-shrink:0}._breadcrumb_zd1aj_1{display:flex;align-items:center;gap:4px;padding:0 0 8px;font-size:12px;color:var(--sbx-gray-500)}._crumb_zd1aj_10{background:none;border:none;cursor:pointer;color:var(--sbx-gray-500);font-size:12px;padding:2px 4px;border-radius:var(--sbx-r-xs);display:flex;align-items:center}._crumb_zd1aj_10:hover{color:var(--sbx-primary);background:var(--sbx-primary-light)}._sep_zd1aj_26{color:var(--sbx-gray-300);flex-shrink:0}._current_zd1aj_31{color:var(--sbx-gray-700);font-weight:500}._tabBar_qhks1_1{display:flex;border-bottom:1px solid var(--sbx-gray-200);margin-bottom:16px;gap:0}._tab_qhks1_1{display:flex;align-items:center;gap:6px;padding:10px 16px;border:none;background:none;cursor:pointer;font-size:13px;font-weight:500;color:var(--sbx-gray-500);border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;transition:all .15s;position:relative}._tab_qhks1_1:hover{color:var(--sbx-primary)}._active_qhks1_29{color:var(--sbx-primary);border-bottom-color:var(--sbx-primary);font-weight:600}._error_qhks1_35{color:var(--sbx-error)}._errorDot_qhks1_39{width:6px;height:6px;border-radius:50%;background:var(--sbx-error);display:inline-block}._section_ylgu8_1{background:#fff;border-radius:var(--sbx-r-md);box-shadow:var(--sbx-shadow-1);padding:24px;display:flex;flex-direction:column;gap:20px}._header_ylgu8_11{display:flex;flex-direction:column;gap:4px}._title_ylgu8_17{font-size:15px;font-weight:600;color:var(--sbx-gray-900);margin:0}._description_ylgu8_24{font-size:13px;color:var(--sbx-gray-500);margin:0}._divider_ylgu8_30{border:none;border-top:1px solid var(--sbx-gray-100);margin:0}._fields_ylgu8_36{display:grid;grid-template-columns:1fr 1fr;gap:16px 24px}@media (max-width: 700px){._fields_ylgu8_36{grid-template-columns:1fr}}._field_1s288_1{display:flex;flex-direction:column;gap:6px}._fullWidth_1s288_7{grid-column:1/-1}._label_1s288_11{font-size:12px;font-weight:600;color:var(--sbx-gray-600);text-transform:uppercase;letter-spacing:.04em}._required_1s288_19{color:var(--sbx-error);margin-left:2px}._input_1s288_24{width:100%;padding:8px 12px;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-sm);font-size:14px;color:var(--sbx-gray-900);font-family:var(--sbx-font);outline:none;transition:border-color .15s;background:#fff}._input_1s288_24:focus{border-color:var(--sbx-primary)}._input_1s288_24:disabled{background:var(--sbx-gray-50);color:var(--sbx-gray-400);cursor:not-allowed}._textarea_1s288_45{resize:vertical;min-height:80px}._inputError_1s288_50{border-color:var(--sbx-error)}._error_1s288_54{font-size:12px;color:var(--sbx-error)}._selectBtn_1s288_59{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-sm);background:#fff;cursor:pointer;font-size:14px;font-family:var(--sbx-font);color:var(--sbx-gray-900);transition:border-color .15s}._selectBtn_1s288_59:hover:not(:disabled){border-color:var(--sbx-primary)}._selectBtn_1s288_59:disabled{background:var(--sbx-gray-50);cursor:not-allowed;opacity:.7}._selectOpen_1s288_83{border-color:var(--sbx-primary)}._placeholder_1s288_87{color:var(--sbx-gray-400)}._selectedVal_1s288_91{color:var(--sbx-gray-900)}._chevronUp_1s288_95{transform:rotate(180deg);transition:transform .15s}._dropdown_1s288_100{position:absolute;top:100%;left:0;right:0;z-index:200;background:#fff;border:1px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md);box-shadow:var(--sbx-shadow-3);max-height:240px;overflow-y:auto;padding:4px;margin-top:4px}._option_1s288_116{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:none;cursor:pointer;font-size:14px;color:var(--sbx-gray-700);border-radius:var(--sbx-r-sm);text-align:left}._option_1s288_116:hover{background:var(--sbx-gray-50)}._optionSelected_1s288_134{color:var(--sbx-primary);font-weight:500}._noOpts_1s288_139{display:block;padding:8px 12px;color:var(--sbx-gray-400);font-size:13px}._chipGroup_1s288_146{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-sm);min-height:40px;background:#fff}._chipInput_1s288_158{border:1px solid var(--sbx-primary);border-radius:var(--sbx-r-xl);padding:3px 10px;font-size:13px;outline:none;width:120px}._addChipBtn_1s288_167{display:inline-flex;align-items:center;gap:4px;background:none;border:1px dashed var(--sbx-gray-300);border-radius:var(--sbx-r-xl);padding:3px 10px;font-size:12px;color:var(--sbx-gray-500);cursor:pointer}._addChipBtn_1s288_167:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._radioGroup_1s288_184{display:flex;gap:16px;flex-wrap:wrap;padding:4px 0}._radioLabel_1s288_191{display:flex;align-items:center;gap:6px;font-size:14px;cursor:pointer}._iconWrap_1s288_199{width:80px;height:80px;border-radius:var(--sbx-r-md);border:2px dashed var(--sbx-gray-300);cursor:pointer;overflow:hidden;display:flex;align-items:center;justify-content:center}._iconWrap_1s288_199:hover{border-color:var(--sbx-primary)}._iconPreview_1s288_214{width:100%;height:100%;object-fit:cover}._iconPlaceholder_1s288_220{display:flex;flex-direction:column;align-items:center;gap:4px;color:var(--sbx-gray-400);font-size:11px}._hidden_1s288_229{display:none}._removeIconBtn_1s288_233{display:flex;align-items:center;justify-content:center;gap:4px;width:80px;margin-top:4px;background:none;border:1px solid var(--sbx-error);border-radius:var(--sbx-r-sm);padding:3px 8px;font-size:12px;color:var(--sbx-error);cursor:pointer}._removeIconBtn_1s288_233:hover{background:var(--sbx-status-err-bg)}._tagChip_1s288_252{display:inline-flex;align-items:center;gap:4px;background:var(--sbx-primary-light, #e8f4fd);color:var(--sbx-primary);border-radius:var(--sbx-r-xl);padding:3px 10px;font-size:13px;font-weight:500}._tagChipRemove_1s288_264{display:inline-flex;align-items:center;background:none;border:none;padding:0 0 0 2px;cursor:pointer;color:var(--sbx-primary);line-height:1}._tagChipRemove_1s288_264:hover{color:var(--sbx-error)}._nestedSelectRow_1s288_278{display:flex;gap:12px;flex-wrap:wrap}._nestedSelectRow_1s288_278>*{min-width:140px}._dialcodeRow_1s288_287{display:flex;align-items:center;gap:8px}._validateBtn_1s288_293{flex-shrink:0;padding:8px 14px;background:var(--sbx-primary);color:#fff;border:none;border-radius:var(--sbx-r-sm);font-size:13px;font-family:var(--sbx-font);font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s}._validateBtn_1s288_293:hover:not(:disabled){background:var(--sbx-primary-dark, #0056b3)}._validateBtn_1s288_293:disabled{opacity:.6;cursor:not-allowed}._dialcodeValid_1s288_315{font-size:12px;color:var(--sbx-success, #2e7d32)}@keyframes _spin_1s288_1{to{transform:rotate(360deg)}}._dialcodeSpinner_1s288_325{animation:_spin_1s288_1 1s linear infinite}._overlay_ga6eh_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:2000;display:flex;align-items:center;justify-content:center;padding:16px}._modal_ga6eh_12{background:#fff;border-radius:8px;box-shadow:0 8px 32px #0003;width:760px;max-width:100%;max-height:90vh;display:flex;flex-direction:column;overflow:hidden}._header_ga6eh_24{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--sbx-gray-100, #f0f0f0);flex-shrink:0}._title_ga6eh_33{font-size:16px;font-weight:600;color:var(--sbx-gray-900, #111)}._closeBtn_ga6eh_39{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;color:var(--sbx-gray-500, #6b7280);cursor:pointer;border-radius:6px;transition:background .15s,color .15s}._closeBtn_ga6eh_39:hover{background:var(--sbx-gray-100, #f3f4f6);color:var(--sbx-gray-800, #1f2937)}._tabs_ga6eh_57{display:flex;gap:0;padding:0 20px;border-bottom:1px solid var(--sbx-gray-100, #f0f0f0);flex-shrink:0}._tab_ga6eh_57{display:flex;align-items:center;padding:10px 18px;font-size:13px;font-weight:500;color:var(--sbx-gray-500, #6b7280);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;margin-bottom:-1px;transition:color .15s,border-color .15s}._tab_ga6eh_57:hover{color:var(--sbx-primary, #1890ff)}._activeTab_ga6eh_83{color:var(--sbx-primary, #1890ff);border-bottom-color:var(--sbx-primary, #1890ff)}._body_ga6eh_88{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:16px 20px;gap:12px}._searchWrap_ga6eh_99{position:relative;flex-shrink:0}._searchIcon_ga6eh_104{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--sbx-gray-400, #9ca3af);pointer-events:none}._searchInput_ga6eh_113{width:100%;padding:8px 12px 8px 32px;border:1.5px solid var(--sbx-gray-200, #e5e7eb);border-radius:20px;font-size:13px;font-family:var(--sbx-font, inherit);outline:none;box-sizing:border-box;transition:border-color .15s}._searchInput_ga6eh_113:focus{border-color:var(--sbx-primary, #1890ff)}._searchInput_ga6eh_113::placeholder{color:var(--sbx-gray-400, #9ca3af)}._grid_ga6eh_132{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;overflow-y:auto;flex:1;min-height:0}._grid_ga6eh_132::-webkit-scrollbar{width:4px}._grid_ga6eh_132::-webkit-scrollbar-thumb{background:var(--sbx-gray-300, #d1d5db);border-radius:2px}._imgCell_ga6eh_148{aspect-ratio:1;border:2px solid var(--sbx-gray-200, #e5e7eb);border-radius:8px;overflow:hidden;cursor:pointer;position:relative;display:flex;align-items:center;justify-content:center;background:var(--sbx-gray-50, #f9fafb);padding:0;transition:border-color .15s}._imgCell_ga6eh_148:hover{border-color:var(--sbx-primary, #1890ff)}._imgCellSelected_ga6eh_166{border-color:var(--sbx-primary, #1890ff);box-shadow:0 0 0 1px var(--sbx-primary, #1890ff)}._thumb_ga6eh_171{width:100%;height:100%;object-fit:cover}._noThumb_ga6eh_177{font-size:10px;color:var(--sbx-gray-400, #9ca3af);font-weight:500}._checkBadge_ga6eh_183{position:absolute;top:4px;right:4px;width:20px;height:20px;background:var(--sbx-primary, #1890ff);border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff}._loadMoreBtn_ga6eh_198{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:100%;padding:8px 0;background:none;border:1px solid var(--sbx-primary, #1890ff);border-radius:4px;color:var(--sbx-primary, #1890ff);font-size:13px;font-weight:500;font-family:var(--sbx-font, inherit);cursor:pointer;transition:background .15s}._loadMoreBtn_ga6eh_198:hover{background:var(--sbx-primary-light, #e6f4ff)}._loadingRow_ga6eh_220{display:flex;align-items:center;justify-content:center;gap:8px;padding:24px;color:var(--sbx-gray-500, #6b7280);font-size:13px}._empty_ga6eh_230{text-align:center;color:var(--sbx-gray-400, #9ca3af);font-size:13px;padding:32px}._spinner_ga6eh_237{animation:_spin_ga6eh_237 1s linear infinite}@keyframes _spin_ga6eh_237{to{transform:rotate(360deg)}}._uploadArea_ga6eh_247{display:flex;flex-direction:column;align-items:center;gap:12px;flex:1;justify-content:center}._dropZone_ga6eh_256{width:100%;max-width:420px;min-height:200px;border:2px dashed var(--sbx-gray-300, #d1d5db);border-radius:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;cursor:pointer;transition:border-color .15s,background .15s;padding:20px;box-sizing:border-box}._dropZone_ga6eh_256:hover{border-color:var(--sbx-primary, #1890ff);background:var(--sbx-primary-light, #e6f4ff)}._uploadIcon_ga6eh_277{color:var(--sbx-gray-400, #9ca3af)}._dropText_ga6eh_281{margin:0;font-size:14px;font-weight:500;color:var(--sbx-gray-700, #374151)}._dropSubtext_ga6eh_288{margin:0;font-size:12px;color:var(--sbx-gray-400, #9ca3af)}._uploadPreview_ga6eh_294{max-width:100%;max-height:180px;object-fit:contain;border-radius:6px}._hiddenInput_ga6eh_301{display:none}._fileName_ga6eh_305{margin:0;font-size:12px;color:var(--sbx-gray-600, #4b5563)}._errorText_ga6eh_311{margin:0;font-size:12px;color:var(--sbx-error)}._footer_ga6eh_318{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 20px;border-top:1px solid var(--sbx-gray-100, #f0f0f0);flex-shrink:0}._cancelBtn_ga6eh_328{padding:8px 20px;background:none;border:1.5px solid var(--sbx-gray-300, #d1d5db);border-radius:6px;font-size:13px;font-weight:500;font-family:var(--sbx-font, inherit);color:var(--sbx-gray-700, #374151);cursor:pointer;transition:border-color .15s,background .15s}._cancelBtn_ga6eh_328:hover{border-color:var(--sbx-gray-500, #6b7280);background:var(--sbx-gray-50, #f9fafb)}._confirmBtn_ga6eh_345{display:flex;align-items:center;gap:6px;padding:8px 20px;background:var(--sbx-primary, #1890ff);border:none;border-radius:6px;font-size:13px;font-weight:600;font-family:var(--sbx-font, inherit);color:#fff;cursor:pointer;transition:opacity .15s}._confirmBtn_ga6eh_345:hover:not(:disabled){opacity:.9}._confirmBtn_ga6eh_345:disabled{opacity:.45;cursor:not-allowed}._form_szqex_1{display:flex;flex-direction:column;gap:20px}._ungrouped_szqex_7{display:grid;grid-template-columns:1fr 1fr;gap:16px 24px}@media (max-width: 700px){._ungrouped_szqex_7{grid-template-columns:1fr}}._noFields_szqex_18{color:var(--sbx-gray-400);font-size:13px;font-style:italic}._row_11nth_1{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:var(--sbx-r-md);border:1px solid var(--sbx-gray-200);background:#fff;transition:box-shadow .15s}._row_11nth_1:hover{box-shadow:var(--sbx-shadow-1)}._row_11nth_1:hover ._removeBtn_11nth_14,._row_11nth_1:hover ._grip_11nth_17{opacity:1}._grip_11nth_17{color:var(--sbx-gray-300);cursor:grab;display:flex;align-items:center;opacity:0;transition:opacity .1s;flex-shrink:0}._grip_11nth_17:active{cursor:grabbing}._ctIcon_11nth_34{flex-shrink:0}._info_11nth_38{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}._name_11nth_46{font-size:13px;font-weight:500;color:var(--sbx-gray-800);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._meta_11nth_55{font-size:11px;color:var(--sbx-gray-500)}._removeBtn_11nth_14{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:none;color:var(--sbx-gray-400);cursor:pointer;border-radius:var(--sbx-r-xs);opacity:0;transition:opacity .1s,color .1s}._removeBtn_11nth_14:hover{color:var(--sbx-error);background:#dc262614}._container_lzvke_1{display:flex;flex-direction:column;gap:12px}._header_lzvke_7{display:flex;align-items:center;gap:8px}._heading_lzvke_13{font-size:13px;font-weight:600;color:var(--sbx-gray-700);text-transform:uppercase;letter-spacing:.04em}._count_lzvke_21{font-size:12px;font-weight:600;background:var(--sbx-gray-100);color:var(--sbx-gray-600);padding:1px 8px;border-radius:var(--sbx-r-xl)}._list_lzvke_30{display:flex;flex-direction:column;gap:4px}._emptyState_lzvke_36{padding:16px;text-align:center;color:var(--sbx-gray-400);border:1.5px dashed var(--sbx-gray-200);border-radius:var(--sbx-r-md)}._emptyState_lzvke_36 p{margin:0 0 4px;font-size:14px;font-weight:500}._emptyState_lzvke_36 span{font-size:12px}._addRow_lzvke_52{display:flex;align-items:center;gap:8px;width:100%;padding:10px 16px;border:1.5px dashed var(--sbx-gray-300);border-radius:var(--sbx-r-md);background:none;cursor:pointer;font-size:13px;color:var(--sbx-gray-500);transition:all .15s}._addRow_lzvke_52:hover{border-color:var(--sbx-primary);color:var(--sbx-primary);background:var(--sbx-primary-light)}._dropZone_ijo5w_1{display:none;align-items:center;justify-content:center;border:2px dashed var(--sbx-gray-300);border-radius:var(--sbx-r-md);padding:24px;color:var(--sbx-gray-500);font-size:14px;font-weight:500;transition:all .2s}._active_ijo5w_14{display:flex;border-color:var(--sbx-primary);color:var(--sbx-primary);background:var(--sbx-primary-light)}._contentPlayerRoot_r6xk8_1{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}._flowLayout_r6xk8_9{flex:0 0 auto;overflow:visible}._flowLayout_r6xk8_9 ._stage_r6xk8_13{flex:0 0 auto}._flowLayout_r6xk8_9 ._aspectRatio_r6xk8_16{flex:0 0 auto;aspect-ratio:16/9;max-height:62vh}._stage_r6xk8_13{position:relative;background:#0d1117;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}._playerHeader_r6xk8_32{position:absolute;top:0;left:0;right:0;z-index:10;display:flex;align-items:center;gap:10px;padding:10px 14px 24px;background:linear-gradient(to bottom,rgba(0,0,0,.72) 0%,transparent 100%);pointer-events:none}._playerHeaderThumb_r6xk8_46{width:32px;height:32px;border-radius:6px;object-fit:cover;flex-shrink:0;opacity:.9;border:1.5px solid rgba(255,255,255,.2)}._playerHeaderTitle_r6xk8_56{flex:1;font-size:13px;font-weight:600;color:#ffffffeb;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._typeBadge_r6xk8_66{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:#fff;flex-shrink:0;pointer-events:auto}._typeBadge_r6xk8_66[data-type=video]{background:#e63946}._typeBadge_r6xk8_66[data-type=pdf]{background:#2563eb}._typeBadge_r6xk8_66[data-type=epub]{background:#7c3aed}._typeBadge_r6xk8_66[data-type=ecml]{background:#059669}._typeBadge_r6xk8_66[data-type=h5p]{background:#d97706}._typeBadge_r6xk8_66[data-type=scorm]{background:#0891b2}._typeBadge_r6xk8_66[data-type=audio]{background:#7c3aed}._typeBadge_r6xk8_66[data-type=other]{background:#64748b}._typeDot_r6xk8_105{width:6px;height:6px;border-radius:50%;background:#ffffffb3}._aspectRatio_r6xk8_16{position:relative;width:100%;flex:1 1 auto;min-height:0}._aspectRatio_r6xk8_16>*{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}._playerFrame_r6xk8_125{width:100%;height:100%;border:none;display:block;background:#000}._coverOverlay_r6xk8_133{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:#0d1117;z-index:5;transition:opacity .4s ease}._coverOverlay_r6xk8_133._coverHidden_r6xk8_145{opacity:0;pointer-events:none}._coverThumb_r6xk8_150{width:80px;height:80px;border-radius:12px;object-fit:cover;opacity:.85;border:2px solid rgba(255,255,255,.15)}._coverPlayRing_r6xk8_159{position:relative;width:60px;height:60px;border-radius:50%;border:2px solid rgba(255,255,255,.3);display:flex;align-items:center;justify-content:center;background:#ffffff14;animation:_pulse_r6xk8_1 2s ease-in-out infinite}._coverPlayIcon_r6xk8_172{width:0;height:0;border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:18px solid rgba(255,255,255,.85);margin-left:4px}._coverLabel_r6xk8_181{font-size:12px;color:#ffffff73;letter-spacing:.5px}._coverSkeleton_r6xk8_187{width:100%;height:100%;background:linear-gradient(90deg,#1a1f2e 25%,#242938,#1a1f2e 75%);background-size:200% 100%;animation:_shimmer_r6xk8_1 1.6s infinite}@keyframes _shimmer_r6xk8_1{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes _pulse_r6xk8_1{0%,to{transform:scale(1);opacity:.8}50%{transform:scale(1.1);opacity:1}}._playerWrapper_r6xk8_213{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#000;overflow:hidden}._infoStrip_r6xk8_223{display:flex;align-items:center;gap:0;padding:0 4px;background:#161b27;border-top:1px solid rgba(255,255,255,.07);overflow-x:auto;flex-shrink:0;min-height:38px;scrollbar-width:none}._infoStrip_r6xk8_223::-webkit-scrollbar{display:none}._infoChip_r6xk8_239{display:inline-flex;align-items:center;gap:5px;padding:0 12px;height:38px;flex-shrink:0;border-right:1px solid rgba(255,255,255,.07);font-size:12px;color:#fff9;transition:color .15s}._infoChip_r6xk8_239:hover{color:#ffffffe6}._infoChip_r6xk8_239:last-child{border-right:none}._infoChipLabel_r6xk8_258{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:#ffffff59;margin-right:2px}._infoChipIcon_r6xk8_267{font-size:13px;opacity:.6;flex-shrink:0}._playerError_r6xk8_273{position:absolute;top:0;right:0;bottom:0;left:0;z-index:6;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:#0d1117;padding:24px;text-align:center}._playerErrorIcon_r6xk8_287{font-size:28px;opacity:.7}._playerErrorMsg_r6xk8_292{font-size:13px;color:#ffffff80;max-width:260px;line-height:1.5}._qumlRoot_r6xk8_299{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background:#fff}._qumlRoot_r6xk8_299 ._playerWrapper_r6xk8_213{flex:1;min-height:0;background:#fff;align-items:stretch;justify-content:stretch}._qumlRoot_r6xk8_299 ._playerWrapper_r6xk8_213 sunbird-quml-player{display:block;width:100%;height:100%}._overlay_ifddx_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:1000;display:flex;align-items:center;justify-content:center}._modal_ifddx_11{background:#fff;border-radius:var(--sbx-r-md);width:440px;max-height:70vh;display:flex;flex-direction:column;box-shadow:var(--sbx-shadow-3)}._header_ifddx_21{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;font-weight:600;font-size:16px;border-bottom:1px solid var(--sbx-gray-200)}._header_ifddx_21 button{background:none;border:none;cursor:pointer}._body_ifddx_37{padding:16px;overflow-y:auto;flex:1}._hint_ifddx_43{font-size:13px;color:var(--sbx-gray-600);margin-bottom:12px}._list_ifddx_49{list-style:none;margin:0;padding:0}._item_ifddx_55{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:var(--sbx-r-sm);cursor:pointer;font-size:14px}._item_ifddx_55:hover{background:var(--sbx-primary-light)}._selected_ifddx_68{background:var(--sbx-primary-light);border:1px solid var(--sbx-status-info-border)}._empty_ifddx_73{padding:16px;color:var(--sbx-gray-500);font-size:13px}._footer_ifddx_79{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid var(--sbx-gray-200)}._cancelBtn_ifddx_87{padding:8px 16px;background:none;border:1px solid var(--sbx-gray-300);border-radius:var(--sbx-r-xs);cursor:pointer}._moveBtn_ifddx_95{padding:8px 16px;background:var(--sbx-primary);color:#fff;border:none;border-radius:var(--sbx-r-xs);cursor:pointer}._moveBtn_ifddx_95:disabled{opacity:.45;cursor:not-allowed}._overlay_16at9_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:1000;display:flex;align-items:center;justify-content:center}._modal_16at9_11{background:#fff;border-radius:var(--sbx-r-md);width:560px;max-height:80vh;display:flex;flex-direction:column;box-shadow:var(--sbx-shadow-3)}._header_16at9_21{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;font-weight:600;font-size:16px;border-bottom:1px solid var(--sbx-gray-200)}._header_16at9_21 button{background:none;border:none;cursor:pointer}._body_16at9_37{padding:16px;overflow-y:auto;flex:1}._table_16at9_43{width:100%;border-collapse:collapse}._table_16at9_43 th,._table_16at9_43 td{padding:10px 12px;border-bottom:1px solid var(--sbx-gray-100);text-align:left;font-size:14px}._table_16at9_43 th{font-weight:600;color:var(--sbx-gray-600);background:var(--sbx-gray-50)}._pageInput_16at9_61{width:80px;padding:4px 8px;border:1px solid var(--sbx-gray-300);border-radius:var(--sbx-r-xs)}._empty_16at9_68{color:var(--sbx-gray-500);text-align:center;padding:24px}._footer_16at9_74{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid var(--sbx-gray-200)}._cancelBtn_16at9_82{padding:8px 16px;background:none;border:1px solid var(--sbx-gray-300);border-radius:var(--sbx-r-xs);cursor:pointer}._saveBtn_16at9_90{display:flex;align-items:center;gap:6px;padding:8px 16px;background:var(--sbx-primary);color:#fff;border:none;border-radius:var(--sbx-r-xs);cursor:pointer}._container_1a7t2_1{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--sbx-gray-200);background:#fff;flex-shrink:0}._panelHeader_1a7t2_10{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid var(--sbx-gray-100);gap:8px}._panelHeaderLeft_1a7t2_19{display:flex;align-items:center;gap:10px;flex:1;min-width:0}._panelCollapseBtn_1a7t2_27{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex-shrink:0;border:none;background:transparent;color:var(--sbx-gray-400);border-radius:var(--sbx-r-sm);cursor:pointer;transition:background .15s,color .15s}._panelCollapseBtn_1a7t2_27:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-700)}._titleRow_1a7t2_46,._field_1a7t2_47{padding:0 16px}._container_1a7t2_1>._titleRow_1a7t2_46{padding-top:16px}._container_1a7t2_1>._field_1a7t2_47:last-of-type{padding-bottom:16px}._container_1a7t2_1>*+._titleRow_1a7t2_46,._container_1a7t2_1>*+._field_1a7t2_47{margin-top:16px}._moveBtn_1a7t2_64{font-size:12px;padding:4px 12px;border:1px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm);background:#fff;cursor:pointer;color:var(--sbx-gray-600)}._moveBtn_1a7t2_64:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._titleRow_1a7t2_46{display:flex;align-items:center;gap:12px}._icon_1a7t2_84{width:48px;height:48px;border-radius:var(--sbx-r-sm);object-fit:cover;flex-shrink:0;border:1px solid var(--sbx-gray-200)}._nameInput_1a7t2_93{flex:1;font-size:18px;font-weight:600;color:var(--sbx-gray-900);border:none;border-bottom:2px solid var(--sbx-gray-200);padding:4px 0;background:transparent;outline:none}._nameInput_1a7t2_93:focus{border-bottom-color:var(--sbx-primary)}._nameInput_1a7t2_93:disabled{color:var(--sbx-gray-700);cursor:default}._field_1a7t2_47{display:flex;flex-direction:column;gap:8px}._fieldHeader_1a7t2_118{display:flex;align-items:center;justify-content:space-between}._label_1a7t2_124{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:var(--sbx-gray-700)}._fieldCount_1a7t2_133{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--sbx-primary-light, #EFF6FF);color:var(--sbx-primary);font-size:11px;font-weight:600}._collapseBtn_1a7t2_147{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:var(--sbx-gray-500);border-radius:var(--sbx-r-sm);cursor:pointer;transition:background .15s,color .15s}._collapseBtn_1a7t2_147:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-700)}._chevronUp_1a7t2_165{transform:rotate(180deg);transition:transform .2s}._chips_1a7t2_170{display:flex;flex-wrap:wrap;gap:6px}._chip_1a7t2_170{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:var(--sbx-r-xl);background:var(--sbx-primary-light, #EFF6FF);color:var(--sbx-primary);font-size:12px;font-weight:500}._chipRemove_1a7t2_188{background:none;border:none;cursor:pointer;color:inherit;padding:0;line-height:1;font-size:14px;opacity:.7}._chipRemove_1a7t2_188:hover{opacity:1}._keywordInput_1a7t2_202{display:flex;gap:8px}._input_1a7t2_207{flex:1;height:36px;padding:0 10px;border:1.5px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm);font-size:13px;outline:none}._input_1a7t2_207:focus{border-color:var(--sbx-primary)}._addBtn_1a7t2_220{height:36px;padding:0 16px;border:1.5px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm);background:#fff;font-size:13px;cursor:pointer}._addBtn_1a7t2_220:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._radioGroup_1a7t2_234{display:flex;gap:20px}._radioLabel_1a7t2_239{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--sbx-gray-700);cursor:pointer}._radioLabel_1a7t2_239 input{cursor:pointer;accent-color:var(--sbx-primary)}._iconBtn_vl14u_1{position:relative;width:44px;height:44px;flex-shrink:0;border-radius:var(--sbx-r-sm);border:1.5px dashed var(--sbx-gray-300);overflow:visible;display:flex;align-items:center;justify-content:center;background:var(--sbx-gray-50)}._iconBtn_vl14u_1._editable_vl14u_14{cursor:pointer}._iconBtn_vl14u_1._editable_vl14u_14:hover{border-color:var(--sbx-primary);background:var(--sbx-primary-light, #eef3fd)}._iconBtn_vl14u_1._editable_vl14u_14:focus-visible{outline:2px solid var(--sbx-primary);outline-offset:2px}._iconImg_vl14u_26{width:100%;height:100%;object-fit:cover;border-radius:calc(var(--sbx-r-sm) - 1px);display:block}._placeholder_vl14u_34{display:flex;align-items:center;justify-content:center;color:var(--sbx-gray-400)}._removeBtn_vl14u_41{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border-radius:50%;background:var(--sbx-error, #dc2626);color:#fff;border:none;cursor:pointer;display:none;align-items:center;justify-content:center;padding:0}._iconBtn_vl14u_1:hover ._removeBtn_vl14u_41{display:flex}._leafContentLayout_1lchu_1{display:flex;flex-direction:column;height:100%;overflow-y:auto}._leafContentLayout_1lchu_1>*:first-child{flex:0 0 auto}._leafContentLayout_1lchu_1>*:last-child{flex:0 0 auto;background:#fff}._container_1lchu_15{padding:20px 24px;display:flex;flex-direction:column;gap:0;min-height:100%;position:relative}._emptyState_1lchu_24{display:flex;align-items:center;justify-content:center;height:100%;color:var(--sbx-gray-400);font-size:14px;font-style:italic}._titleRow_1lchu_34{display:flex;align-items:center;gap:10px;margin:8px 0 16px}._titleIcon_1lchu_41{width:40px;height:40px;border-radius:var(--sbx-r-sm);object-fit:cover;flex-shrink:0;border:1px solid var(--sbx-gray-200)}._nodeTitle_1lchu_50{font-size:22px;font-weight:700;color:var(--sbx-gray-900);margin:0;outline:none;border-radius:var(--sbx-r-sm);padding:2px 4px;min-height:1.3em}._nodeTitle_1lchu_50:focus{background:var(--sbx-gray-50);box-shadow:0 0 0 2px var(--sbx-primary)}._nodeTitle_1lchu_50:empty:before{content:attr(data-placeholder);color:var(--sbx-gray-400)}._nodeTitle_1lchu_50[contenteditable=false]{cursor:default}._formArea_1lchu_72{margin-bottom:24px}._contentListArea_1lchu_76{border-top:1px solid var(--sbx-gray-200);padding-top:20px}._dropZone_1lchu_81{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;border-radius:0}._reviewComment_1lchu_88{display:flex;gap:8px;align-items:flex-start;background:var(--sbx-warn-bg);border:1px solid var(--sbx-warn-border);border-radius:var(--sbx-r-sm, 4px);padding:10px 14px;margin-bottom:12px;font-size:13px;line-height:1.5}._reviewCommentLabel_1lchu_101{font-weight:600;color:var(--sbx-warn-text);white-space:nowrap}._reviewCommentText_1lchu_107{color:var(--sbx-warn-body)}._dialcodeSection_1lchu_111{border-top:1px solid var(--sbx-gray-200, #e8e8e8);padding-top:16px;margin-top:8px;margin-bottom:16px}._sectionTitle_1lchu_118{font-size:13px;font-weight:600;color:var(--sbx-gray-600, #555);text-transform:uppercase;letter-spacing:.4px;margin-bottom:10px}._contentToolbar_1lchu_127{display:flex;gap:8px;padding:8px 24px;border-bottom:1px solid var(--sbx-gray-200, #e8e8e8);background:var(--sbx-gray-50, #fafafa)}._moveBtn_1lchu_135{padding:4px 12px;font-size:12px;border:1px solid var(--sbx-gray-300, #d9d9d9);border-radius:4px;background:#fff;cursor:pointer}._moveBtn_1lchu_135:hover{border-color:var(--sbx-primary, #1890ff);color:var(--sbx-primary, #1890ff)}._assignPageRow_1lchu_148{border-top:1px solid var(--sbx-gray-200, #e8e8e8);padding-top:12px;margin-top:8px}._assignPageBtn_1lchu_154{font-size:13px;padding:6px 14px;border:1px solid var(--sbx-gray-300, #d9d9d9);border-radius:4px;background:#fff;cursor:pointer}._assignPageBtn_1lchu_154:hover{border-color:var(--sbx-primary, #1890ff);color:var(--sbx-primary, #1890ff)}._card_jzciw_1{display:flex;align-items:center;gap:10px;padding:10px 10px 10px 12px;border-radius:var(--sbx-r-md);border:1px solid var(--sbx-gray-200);background:#fff;cursor:grab;transition:all .15s;-webkit-user-select:none;user-select:none}._card_jzciw_1:hover{border-color:var(--sbx-primary);box-shadow:var(--sbx-shadow-1)}._card_jzciw_1:hover ._addBtn_jzciw_17{opacity:1}._card_jzciw_1:active{cursor:grabbing}._dragging_jzciw_24{opacity:.4;box-shadow:none}._ctIcon_jzciw_29{flex-shrink:0}._info_jzciw_33{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}._name_jzciw_41{font-size:13px;font-weight:500;color:var(--sbx-gray-800);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._meta_jzciw_50{font-size:11px;color:var(--sbx-gray-500);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._addBtn_jzciw_17{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:var(--sbx-primary-light);color:var(--sbx-primary);border-radius:var(--sbx-r-sm);cursor:pointer;opacity:0;transition:opacity .15s,background .15s}._addBtn_jzciw_17:hover{background:var(--sbx-primary);color:#fff}._addBtnMuted_jzciw_78{opacity:.4;cursor:default}._addBtnMuted_jzciw_78:hover{background:var(--sbx-primary-light);color:var(--sbx-primary)}._added_jzciw_87{border-color:var(--sbx-success);background:var(--sbx-status-ok-bg)}._added_jzciw_87:hover{border-color:var(--sbx-success);box-shadow:var(--sbx-shadow-1)}._addedBadge_jzciw_96{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:var(--sbx-success);color:#fff}._chips_xhhaq_1{display:flex;gap:6px;overflow-x:auto;padding-bottom:2px;scrollbar-width:none}._chips_xhhaq_1::-webkit-scrollbar{display:none}._chip_xhhaq_1{flex-shrink:0;font-size:12px;padding:3px 10px}._panel_1cl11_1{display:flex;flex-direction:column;height:100%;background:#fff;border-left:1px solid var(--sbx-gray-200);overflow:hidden}._header_1cl11_10{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--sbx-gray-100);flex-shrink:0}._headerTitle_1cl11_19{font-size:14px;font-weight:600;color:var(--sbx-gray-800)}._closeBtn_1cl11_25{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;color:var(--sbx-gray-500);border-radius:var(--sbx-r-sm);cursor:pointer;transition:background .15s,color .15s}._closeBtn_1cl11_25:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-800)}._body_1cl11_43{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:16px}._body_1cl11_43::-webkit-scrollbar{width:4px}._body_1cl11_43::-webkit-scrollbar-thumb{background:var(--sbx-gray-300);border-radius:2px}._section_1cl11_59{display:flex;flex-direction:column;gap:8px}._sectionLabel_1cl11_65{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--sbx-gray-500)}._chips_1cl11_73{display:flex;flex-wrap:wrap;gap:6px}._chip_1cl11_73{padding:4px 10px;font-size:12px;font-family:var(--sbx-font);font-weight:500;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-xl);background:#fff;color:var(--sbx-gray-700);cursor:pointer;transition:border-color .15s,background .15s,color .15s;line-height:1.4}._chip_1cl11_73:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._chip_1cl11_73._active_1cl11_96{border-color:var(--sbx-primary);background:var(--sbx-primary-light);color:var(--sbx-primary)}._footer_1cl11_102{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--sbx-gray-100);flex-shrink:0}._resetBtn_1cl11_112{padding:6px 16px;font-size:13px;font-family:var(--sbx-font);font-weight:500;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md);background:#fff;color:var(--sbx-gray-600);cursor:pointer;transition:border-color .15s,background .15s}._resetBtn_1cl11_112:hover{border-color:var(--sbx-gray-400);background:var(--sbx-gray-50)}._applyBtn_1cl11_129{padding:6px 16px;font-size:13px;font-family:var(--sbx-font);font-weight:600;border:none;border-radius:var(--sbx-r-md);background:var(--sbx-primary);color:#fff;cursor:pointer;transition:background .15s,opacity .15s}._applyBtn_1cl11_129:hover{opacity:.9}._applyBtn_1cl11_129:active{opacity:.8}._panel_6qdpu_1{display:flex;flex-direction:column;height:100%;background:#fff;border-left:1px solid var(--sbx-gray-200);overflow:hidden}._header_6qdpu_10{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px;border-bottom:1px solid var(--sbx-gray-100);flex-shrink:0}._title_6qdpu_20{font-size:14px;font-weight:600;color:var(--sbx-gray-800);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._headerActions_6qdpu_31{display:flex;align-items:center;gap:2px;flex-shrink:0}._iconBtn_6qdpu_38{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;color:var(--sbx-gray-500);border-radius:var(--sbx-r-sm);cursor:pointer;transition:background .15s,color .15s}._iconBtn_6qdpu_38:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-800)}._playerArea_6qdpu_56{flex:1;overflow:hidden;min-height:0;display:flex;flex-direction:column}._footer_6qdpu_64{display:flex;align-items:center;justify-content:flex-end;padding:12px 16px;border-top:1px solid var(--sbx-gray-100);flex-shrink:0}._addBtn_6qdpu_73{padding:8px 20px;font-size:13px;font-family:var(--sbx-font);font-weight:600;border:none;border-radius:var(--sbx-r-md);background:var(--sbx-primary);color:#fff;cursor:pointer;transition:background .15s,opacity .15s}._addBtn_6qdpu_73:hover{opacity:.9}._addBtn_6qdpu_73:active{opacity:.8}._modalOverlay_6qdpu_92{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:#0000008c;display:flex;align-items:center;justify-content:center;padding:24px}._modalPanel_6qdpu_103{display:flex;flex-direction:column;width:100%;max-width:900px;height:90vh;background:#fff;border-radius:var(--sbx-r-lg, 10px);overflow:hidden;box-shadow:0 20px 60px #00000040}._dock_1lpg0_1{display:flex;flex-direction:column;height:100%;overflow:hidden}._header_1lpg0_8{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 10px;border-bottom:1px solid var(--sbx-gray-100);flex-shrink:0}._headerLeft_1lpg0_17{display:flex;align-items:center;gap:8px;color:var(--sbx-gray-700)}._headerTitle_1lpg0_24{font-size:14px;font-weight:600;color:var(--sbx-gray-800)}._count_1lpg0_30{font-size:12px;font-weight:600;background:var(--sbx-gray-100);color:var(--sbx-gray-600);padding:2px 8px;border-radius:var(--sbx-r-xl)}._searchRow_1lpg0_39{display:flex;align-items:center;gap:6px;padding:10px 12px 6px;flex-shrink:0}._searchWrap_1lpg0_47{position:relative;flex:1;min-width:0}._searchIcon_1lpg0_53{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--sbx-gray-400);pointer-events:none}._searchInput_1lpg0_62{width:100%;padding:7px 10px 7px 32px;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-xl);font-size:13px;font-family:var(--sbx-font);outline:none;transition:border-color .15s;box-sizing:border-box}._searchInput_1lpg0_62:focus{border-color:var(--sbx-primary)}._searchInput_1lpg0_62::placeholder{color:var(--sbx-gray-400)}._filterToggleBtn_1lpg0_80{flex-shrink:0;position:relative;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1.5px solid var(--sbx-gray-200);border-radius:var(--sbx-r-md);background:#fff;color:var(--sbx-gray-600);cursor:pointer;transition:border-color .15s,background .15s,color .15s}._filterToggleBtn_1lpg0_80:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}._filterToggleBtn_1lpg0_80._filterToggleBtnActive_1lpg0_99{border-color:var(--sbx-primary);background:var(--sbx-primary-light);color:var(--sbx-primary)}._filterBadge_1lpg0_105{position:absolute;top:-5px;right:-5px;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--sbx-primary);color:#fff;font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;line-height:1;box-sizing:border-box}._filters_1lpg0_124{padding:4px 12px 8px;flex-shrink:0;overflow-x:auto;scrollbar-width:none}._filters_1lpg0_124::-webkit-scrollbar{display:none}._mainArea_1lpg0_134{flex:1;overflow:hidden;min-height:0;position:relative;display:flex;flex-direction:column}._sidePanelOverlay_1lpg0_143{position:absolute;top:0;right:0;bottom:0;left:0;z-index:20;display:flex;flex-direction:column;background:#fff}._cardList_1lpg0_152{flex:1;overflow-y:auto;padding:4px 12px 12px;display:flex;flex-direction:column;gap:6px}._cardList_1lpg0_152::-webkit-scrollbar{width:4px}._cardList_1lpg0_152::-webkit-scrollbar-thumb{background:var(--sbx-gray-300);border-radius:2px}._skeleton_1lpg0_168{display:flex;align-items:center;gap:10px;padding:10px;border-radius:var(--sbx-r-md);background:var(--sbx-gray-50);animation:_pulse_1lpg0_1 1.5s ease-in-out infinite}._skeletonIcon_1lpg0_178{width:32px;height:32px;border-radius:6px;background:var(--sbx-gray-200);flex-shrink:0}._skeletonText_1lpg0_186{flex:1;display:flex;flex-direction:column;gap:6px}._skeletonLine_1lpg0_193{height:12px;background:var(--sbx-gray-200);border-radius:4px;width:80%}._skeletonLineSm_1lpg0_200{height:10px;background:var(--sbx-gray-100);border-radius:4px;width:50%}@keyframes _pulse_1lpg0_1{0%,to{opacity:1}50%{opacity:.5}}._loadMoreBtn_1lpg0_215{display:flex;align-items:center;justify-content:center;width:100%;padding:8px 0;margin-top:4px;background:none;border:1px solid var(--sbx-primary, #1890ff);border-radius:var(--sbx-r-sm, 4px);color:var(--sbx-primary, #1890ff);font-size:13px;font-weight:500;font-family:var(--sbx-font);cursor:pointer;transition:background .15s,color .15s}._loadMoreBtn_1lpg0_215:hover{background:var(--sbx-primary-light, #e6f4ff)}._loadMoreBtn_1lpg0_215:disabled{opacity:.5;cursor:not-allowed}._emptyState_1lpg0_240{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:8px;color:var(--sbx-gray-400);padding:24px;text-align:center}._emptyState_1lpg0_240 p{margin:0;font-size:14px;font-weight:500}._emptyState_1lpg0_240 span{font-size:12px}._collapseBtn_1lpg0_260{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex-shrink:0;border:none;background:transparent;color:var(--sbx-gray-400);border-radius:var(--sbx-r-sm);cursor:pointer;transition:background .15s,color .15s}._collapseBtn_1lpg0_260:hover{background:var(--sbx-gray-100);color:var(--sbx-gray-700)}._shell_90fon_1{display:flex;flex-direction:column;height:100%;overflow:hidden}._workspace_90fon_8{display:grid;grid-template-columns:var(--sbx-tree-w, 284px) 1fr var(--sbx-dock-w, 312px);flex:1;overflow:hidden;min-height:0;position:relative}._workspace_90fon_8._sidebarCollapsed_90fon_16{grid-template-columns:0 1fr var(--sbx-dock-w, 312px)}._workspace_90fon_8._dockCollapsed_90fon_19{grid-template-columns:var(--sbx-tree-w, 284px) 1fr 0}._workspace_90fon_8._sidebarCollapsed_90fon_16._dockCollapsed_90fon_19{grid-template-columns:0 1fr 0}@media (max-width: 1200px){._workspace_90fon_8{grid-template-columns:var(--sbx-tree-w, 284px) 1fr}._workspace_90fon_8 ._dock_90fon_19{display:none}._workspace_90fon_8._sidebarCollapsed_90fon_16{grid-template-columns:0 1fr}}@media (max-width: 900px){._workspace_90fon_8{grid-template-columns:1fr}._workspace_90fon_8 ._outline_90fon_40{display:none}}._reopenTab_90fon_45{position:absolute;left:0;top:10px;z-index:20;width:20px;height:36px;border-radius:0 var(--sbx-r-sm) var(--sbx-r-sm) 0;border:1px solid var(--sbx-gray-200);border-left:none;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--sbx-gray-500);font-size:16px;font-weight:700;box-shadow:2px 0 4px #0000000f;transition:color .15s}._reopenTab_90fon_45:hover{color:var(--sbx-primary)}._outline_90fon_40{border-right:1px solid var(--sbx-gray-200);overflow:hidden;display:flex;flex-direction:column;background:#fff;transition:width .2s}._outlineHidden_90fon_79{overflow:hidden;width:0;min-width:0;border-right:none}._editor_90fon_86{overflow-y:auto;background:var(--sbx-gray-50);min-width:0}._dock_90fon_19{border-left:1px solid var(--sbx-gray-200);overflow:hidden;display:flex;flex-direction:column;background:#fff;transition:width .2s}._dockHidden_90fon_101{overflow:hidden;width:0;min-width:0;border-left:none}._dockReopenTab_90fon_108{position:absolute;right:0;top:10px;z-index:20;width:20px;height:36px;border-radius:var(--sbx-r-sm) 0 0 var(--sbx-r-sm);border:1px solid var(--sbx-gray-200);border-right:none;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--sbx-gray-500);font-size:16px;font-weight:700;box-shadow:-2px 0 4px #0000000f;transition:color .15s}._dockReopenTab_90fon_108:hover{color:var(--sbx-primary)}._dragChip_90fon_133{background:var(--sbx-primary);color:#fff;border-radius:var(--sbx-r-xl);padding:6px 14px;font-size:13px;font-weight:600;box-shadow:var(--sbx-shadow-2);pointer-events:none;white-space:nowrap;max-width:200px;display:flex;align-items:center}._dragChipLabel_90fon_148{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}._placeholder_90fon_155{flex:1;display:flex;align-items:center;justify-content:center;min-height:120px;padding:24px}._placeholderLabel_90fon_164{font-family:var(--sbx-font);font-size:13px;color:var(--sbx-gray-400);background:var(--sbx-gray-100);border:1.5px dashed var(--sbx-gray-300);border-radius:var(--sbx-r-md);padding:10px 18px}:root{--sbx-primary: hsl(var(--primary, 217 71% 46%));--sbx-primary-dark: hsl( var(--sunbird-spark-theme-primary-h, 217) var(--sunbird-spark-theme-primary-s, 71%) 32% );--sbx-primary-light: hsl( var(--sunbird-spark-theme-primary-h, 217) var(--sunbird-spark-theme-primary-s, 71%) 96% );--sbx-ai: #7A5BFF;--sbx-success: hsl(var(--sunbird-success-green, 145 63% 49%));--sbx-error: hsl(var(--destructive, 0 84% 60%));--sbx-warning: #D97706;--sbx-info: #0EA5E9;--sbx-gray-50: #F9FAFB;--sbx-gray-100: #F3F4F6;--sbx-gray-200: #E5E7EB;--sbx-gray-300: #D1D5DB;--sbx-gray-400: #9CA3AF;--sbx-gray-500: #6B7280;--sbx-gray-600: #4B5563;--sbx-gray-700: #374151;--sbx-gray-800: #1F2937;--sbx-gray-900: #111827;--sbx-r-xs: var(--r-xs, 4px);--sbx-r-sm: var(--r-sm, 6px);--sbx-r-md: var(--r-md, 10px);--sbx-r-lg: var(--r-lg, 14px);--sbx-r-xl: var(--r-xl, 20px);--sbx-shadow-1: var(--sunbird-shadow-sm, 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06));--sbx-shadow-2: var(--sunbird-shadow-md, 0 4px 6px rgba(0,0,0,.07), 0 2px 4px rgba(0,0,0,.06));--sbx-shadow-3: var(--sunbird-shadow-lg, 0 10px 15px rgba(0,0,0,.08), 0 4px 6px rgba(0,0,0,.05));--sbx-ct-video: #EA580C;--sbx-ct-pdf: #DC2626;--sbx-ct-h5p: #0D9488;--sbx-ct-scorm: #7C3AED;--sbx-ct-audio: #DB2777;--sbx-ct-quiz: #16A34A;--sbx-ct-default: #6B7280;--sbx-font: var( --app-font-family, "Plus Jakarta Sans", "Noto Sans", "Noto Sans Devanagari", "Noto Sans Tamil", sans-serif );--sbx-topbar-h: 60px;--sbx-tree-w: 284px;--sbx-dock-w: 312px;--sbx-surface: hsl(var(--surface, 0 0% 100%));--sbx-bg: hsl(var(--background, 48 23% 91%));--sbx-fg: hsl(var(--foreground, 0 0% 13%));--sbx-border: hsl(var(--border, 210 25% 80%));--sbx-muted: hsl(var(--muted, 210 20% 96%));--sbx-muted-fg: hsl(var(--muted-foreground, 210 11% 45%));--sbx-status-info-bg: hsl(var(--primary, 217 71% 46%) / .06);--sbx-status-info-border: hsl(var(--primary, 217 71% 46%) / .22);--sbx-status-ok-bg: #F0FDF4;--sbx-status-ok-border: #BBF7D0;--sbx-status-err-bg: #FEF2F2;--sbx-status-err-border: #FECACA;--sbx-warn-bg: #FFFBE6;--sbx-warn-border: #FFE58F;--sbx-warn-text: #AD6800;--sbx-warn-body: #595959}.sbx-ct-sq--video{background-color:#ea580c;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--video{background-color:#ea580c1f;color:#ea580c;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--video{color:#ea580c;font-weight:600}.sbx-ct-sq--pdf{background-color:#dc2626;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--pdf{background-color:#dc26261f;color:#dc2626;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--pdf{color:#dc2626;font-weight:600}.sbx-ct-sq--h5p{background-color:#0d9488;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--h5p{background-color:#0d94881f;color:#0d9488;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--h5p{color:#0d9488;font-weight:600}.sbx-ct-sq--scorm{background-color:#7c3aed;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--scorm{background-color:#7c3aed1f;color:#7c3aed;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--scorm{color:#7c3aed;font-weight:600}.sbx-ct-sq--audio{background-color:#db2777;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--audio{background-color:#db27771f;color:#db2777;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--audio{color:#db2777;font-weight:600}.sbx-ct-sq--quiz{background-color:#16a34a;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--quiz{background-color:#16a34a1f;color:#16a34a;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--quiz{color:#16a34a;font-weight:600}.sbx-ct-sq--default{background-color:#6b7280;color:#fff;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbx-ct-badge--default{background-color:#6b72801f;color:#6b7280;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.sbx-ct-tint--default{color:#6b7280;font-weight:600}*,*:before,*:after{box-sizing:border-box}.sb-split-builder{font-family:var(--sbx-font);color:var(--sbx-gray-900);line-height:1.5;-webkit-font-smoothing:antialiased}.sbx-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:var(--sbx-r-xl);font-size:13px;font-weight:500;cursor:pointer;transition:all .15s;-webkit-user-select:none;user-select:none}.sbx-chip.filled{border:1.5px solid var(--sbx-primary);background:var(--sbx-primary);color:#fff}.sbx-chip.outline{border:1.5px solid var(--sbx-gray-300);color:var(--sbx-gray-700);background:#fff}.sbx-chip.outline:hover,.sbx-chip.outline.active{border-color:var(--sbx-primary);color:var(--sbx-primary);background:var(--sbx-primary-light)}.sbx-chip.filled.active{background:var(--sbx-primary-dark)}.sbx-chip .sbx-chip-remove{background:none;border:none;cursor:pointer;padding:0;line-height:1;color:inherit;opacity:.7}.sbx-chip .sbx-chip-remove:hover{opacity:1}.sbx-card{background:#fff;border-radius:var(--sbx-r-md);box-shadow:var(--sbx-shadow-1)}.sbx-btn,.sbx-btn-danger,.sbx-btn-ghost,.sbx-btn-primary{display:inline-flex;align-items:center;gap:6px;height:36px;border-radius:var(--sbx-r-md);padding:0 18px;font-size:14px;font-weight:600;cursor:pointer;border:none;transition:all .15s;white-space:nowrap;box-sizing:border-box}.sbx-btn:disabled,.sbx-btn-danger:disabled,.sbx-btn-ghost:disabled,.sbx-btn-primary:disabled{opacity:.5;cursor:not-allowed}.sbx-btn-primary{background:var(--sbx-primary);color:#fff}.sbx-btn-primary:hover:not(:disabled){background:var(--sbx-primary-dark)}.sbx-btn-ghost{background:transparent;color:var(--sbx-gray-700);border:1.5px solid var(--sbx-gray-300)}.sbx-btn-ghost:hover:not(:disabled){border-color:var(--sbx-primary);color:var(--sbx-primary)}.sbx-btn-danger{background:transparent;color:var(--sbx-error);border:1.5px solid var(--sbx-error)}.sbx-btn-danger:hover:not(:disabled){background:var(--sbx-error);color:#fff}.sbx-btn-sm{height:36px;padding:0 14px;font-size:13px;border-radius:var(--sbx-r-sm)}[dir=rtl] .sbx-btn svg,[dir=rtl] .sbx-btn-primary svg,[dir=rtl] .sbx-btn-ghost svg,[dir=rtl] .sbx-btn-danger svg{margin-left:4px;margin-right:0}[dir=rtl]{text-align:right}._root_qcpw6_1{width:100%;height:100vh;display:flex;flex-direction:column;overflow:hidden;background:var(--sbx-gray-50)}._loadingState_qcpw6_10{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:16px;color:var(--sbx-gray-500);font-family:var(--sbx-font)}._loadingState_qcpw6_10 ._loadingSpinner_qcpw6_20{width:40px;height:40px;border:3px solid var(--sbx-gray-200);border-top-color:var(--sbx-primary);border-radius:50%;animation:_spin_qcpw6_1 .8s linear infinite}@keyframes _spin_qcpw6_1{to{transform:rotate(360deg)}}._errorState_qcpw6_34{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:12px;font-family:var(--sbx-font);color:var(--sbx-error)}._errorState_qcpw6_34 h3{margin:0;font-size:18px}._errorState_qcpw6_34 p{margin:0;color:var(--sbx-gray-600);font-size:14px}._errorState_qcpw6_34 button{margin-top:8px;padding:8px 20px;border:1.5px solid var(--sbx-gray-300);border-radius:var(--sbx-r-sm);background:#fff;color:var(--sbx-gray-700);font-size:14px;cursor:pointer}._errorState_qcpw6_34 button:hover{border-color:var(--sbx-primary);color:var(--sbx-primary)}