@a-company/paradigm 3.23.3 → 3.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{accept-orchestration-ORQRKKGR.js → accept-orchestration-AAYFKS74.js} +5 -5
- package/dist/chunk-4UC6AQOC.js +631 -0
- package/dist/{chunk-YOFP72IB.js → chunk-6EQRU7WC.js} +4 -4
- package/dist/{chunk-Z42FOOVT.js → chunk-GC6X3YM7.js} +6 -6
- package/dist/{chunk-C3BK3E23.js → chunk-OXG5GVDJ.js} +1 -1
- package/dist/{chunk-XKAFTZOZ.js → chunk-VHSTF72C.js} +1 -1
- package/dist/{chunk-UI3XXVJ6.js → chunk-W4VFKZVF.js} +58 -1
- package/dist/{chunk-K34C7NAN.js → chunk-XKI55IFI.js} +2 -2
- package/dist/{graph-5VSRBRKZ.js → chunk-Z7W7HNRG.js} +2 -1
- package/dist/context-audit-RI4R2WRH.js +549 -0
- package/dist/{diff-4XJZN4OB.js → diff-QC7PWIPF.js} +5 -5
- package/dist/{doctor-FINKMI66.js → doctor-RVODPMHJ.js} +1 -1
- package/dist/graph-ERNQQQ7C.js +12 -0
- package/dist/index.js +64 -30
- package/dist/mcp.js +841 -17
- package/dist/{orchestrate-6XGEA655.js → orchestrate-NNNWNELP.js} +8 -8
- package/dist/pipeline-3G2FRAKM.js +263 -0
- package/dist/{probe-T77FFIAG.js → probe-SN4BNXOC.js} +2 -1
- package/dist/{providers-VIBWDN5D.js → providers-NKGY36QF.js} +1 -1
- package/dist/{shift-SW3GSODO.js → shift-R6TQ6MBP.js} +15 -14
- package/dist/{spawn-JSV2HST3.js → spawn-52PASJJL.js} +3 -3
- package/dist/sweep-5POCF2E4.js +934 -0
- package/dist/{team-YIYA4ZLX.js → team-JZHIH7H5.js} +6 -6
- package/dist/university-content/courses/.purpose +307 -0
- package/dist/university-content/plsat/.purpose +131 -0
- package/dist/university-ui/assets/{index-BV7lKIqO.js → index-BPzqnvrg.js} +2 -2
- package/dist/university-ui/assets/{index-BV7lKIqO.js.map → index-BPzqnvrg.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/{workspace-S5Q5LVA6.js → workspace-L27RR5MF.js} +3 -2
- package/package.json +1 -1
- package/dist/chunk-ZMN3RAIT.js +0 -564
- package/dist/{chunk-XNUWLW73.js → chunk-7WTOOH23.js} +0 -0
- package/dist/{flow-UFMPVOEM.js → flow-KZKMMXJC.js} +1 -1
|
@@ -8,18 +8,18 @@ import {
|
|
|
8
8
|
teamModelsCommand,
|
|
9
9
|
teamResetCommand,
|
|
10
10
|
teamStatusCommand
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-VHSTF72C.js";
|
|
12
|
+
import "./chunk-GC6X3YM7.js";
|
|
13
13
|
import "./chunk-6QC3YGB6.js";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-XNUWLW73.js";
|
|
16
|
-
import "./chunk-PMXRGPRQ.js";
|
|
14
|
+
import "./chunk-6EQRU7WC.js";
|
|
17
15
|
import "./chunk-PBHIFAL4.js";
|
|
16
|
+
import "./chunk-7WTOOH23.js";
|
|
17
|
+
import "./chunk-PMXRGPRQ.js";
|
|
18
|
+
import "./chunk-5JGJACDU.js";
|
|
18
19
|
import "./chunk-6P4IFIK2.js";
|
|
19
20
|
import "./chunk-MRENOFTR.js";
|
|
20
21
|
import "./chunk-IRKUEJVW.js";
|
|
21
22
|
import "./chunk-MW5DMGBB.js";
|
|
22
|
-
import "./chunk-5JGJACDU.js";
|
|
23
23
|
import "./chunk-ZXMDA7VB.js";
|
|
24
24
|
export {
|
|
25
25
|
teamAcceptCommand,
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
name: university-courses
|
|
2
|
+
description: Course content for Paradigm University — 5 courses, 49 lessons. Each lesson is mapped to the Paradigm concepts it teaches so that ripple analysis can identify which lessons need updating when a concept changes.
|
|
3
|
+
|
|
4
|
+
components:
|
|
5
|
+
# PARA 101: Foundations (8 lessons)
|
|
6
|
+
|
|
7
|
+
para-101-welcome:
|
|
8
|
+
description: "Welcome to Paradigm — three pillars, why structured context matters"
|
|
9
|
+
file: para-101.json
|
|
10
|
+
tags: [course-content, para-101]
|
|
11
|
+
references: ["#symbol-system", "#purpose-files", "#mcp-tools", "#paradigm-logger"]
|
|
12
|
+
|
|
13
|
+
para-101-five-symbols:
|
|
14
|
+
description: "The Five Symbols — #component, $flow, ^gate, !signal, ~aspect"
|
|
15
|
+
file: para-101.json
|
|
16
|
+
tags: [course-content, para-101]
|
|
17
|
+
references: ["#symbol-system"]
|
|
18
|
+
|
|
19
|
+
para-101-purpose-files:
|
|
20
|
+
description: "Purpose Files — YAML format, required fields, directory-level docs"
|
|
21
|
+
file: para-101.json
|
|
22
|
+
tags: [course-content, para-101]
|
|
23
|
+
references: ["#purpose-files"]
|
|
24
|
+
|
|
25
|
+
para-101-tags-and-classification:
|
|
26
|
+
description: "Tags and Classification — tag bank, core tags, custom tags, AI suggestions"
|
|
27
|
+
file: para-101.json
|
|
28
|
+
tags: [course-content, para-101]
|
|
29
|
+
references: ["#tag-system"]
|
|
30
|
+
|
|
31
|
+
para-101-paradigm-logger:
|
|
32
|
+
description: "Paradigm Logger — symbol-typed logging, directory-to-symbol mapping"
|
|
33
|
+
file: para-101.json
|
|
34
|
+
tags: [course-content, para-101]
|
|
35
|
+
references: ["#paradigm-logger", "#symbol-system"]
|
|
36
|
+
|
|
37
|
+
para-101-project-structure:
|
|
38
|
+
description: "Project Structure — .paradigm/ directory, config.yaml, navigator.yaml"
|
|
39
|
+
file: para-101.json
|
|
40
|
+
tags: [course-content, para-101]
|
|
41
|
+
references: ["#scan-index", "#navigation"]
|
|
42
|
+
|
|
43
|
+
para-101-portal-yaml:
|
|
44
|
+
description: "Portal YAML — gates, routes, authorization topology"
|
|
45
|
+
file: para-101.json
|
|
46
|
+
tags: [course-content, para-101]
|
|
47
|
+
references: ["#portal-protocol"]
|
|
48
|
+
|
|
49
|
+
para-101-first-steps:
|
|
50
|
+
description: "First Steps — paradigm init, paradigm shift, setting up a project"
|
|
51
|
+
file: para-101.json
|
|
52
|
+
tags: [course-content, para-101]
|
|
53
|
+
references: ["#symbol-system", "#purpose-files", "#scan-index"]
|
|
54
|
+
|
|
55
|
+
# PARA 201: Architecture (11 lessons)
|
|
56
|
+
|
|
57
|
+
para-201-flows-deep-dive:
|
|
58
|
+
description: "Flows Deep Dive — $flow definitions, step types, validation"
|
|
59
|
+
file: para-201.json
|
|
60
|
+
tags: [course-content, para-201]
|
|
61
|
+
references: ["#flow-validation", "#symbol-system"]
|
|
62
|
+
|
|
63
|
+
para-201-gates-deep-dive:
|
|
64
|
+
description: "Gates Deep Dive — ^gate chaining, portal.yaml routes, enforcement"
|
|
65
|
+
file: para-201.json
|
|
66
|
+
tags: [course-content, para-201]
|
|
67
|
+
references: ["#portal-protocol", "#enforcement-hooks"]
|
|
68
|
+
|
|
69
|
+
para-201-aspects-and-anchors:
|
|
70
|
+
description: "Aspects and Anchors — ~aspect definitions, anchor format, why anchors are required"
|
|
71
|
+
file: para-201.json
|
|
72
|
+
tags: [course-content, para-201]
|
|
73
|
+
references: ["#aspect-anchoring"]
|
|
74
|
+
|
|
75
|
+
para-201-aspect-graph:
|
|
76
|
+
description: "Aspect Graph — symbol relationships, graph visualization"
|
|
77
|
+
file: para-201.json
|
|
78
|
+
tags: [course-content, para-201]
|
|
79
|
+
references: ["#symbol-graph", "#aspect-anchoring"]
|
|
80
|
+
|
|
81
|
+
para-201-portal-protocol:
|
|
82
|
+
description: "Portal Protocol — full authorization model, gate patterns, route declarations"
|
|
83
|
+
file: para-201.json
|
|
84
|
+
tags: [course-content, para-201]
|
|
85
|
+
references: ["#portal-protocol"]
|
|
86
|
+
|
|
87
|
+
para-201-disciplines:
|
|
88
|
+
description: "Disciplines — web, backend, fullstack, api, cli, ml, monorepo symbol mappings"
|
|
89
|
+
file: para-201.json
|
|
90
|
+
tags: [course-content, para-201]
|
|
91
|
+
references: ["#symbol-system"]
|
|
92
|
+
|
|
93
|
+
para-201-symbol-naming:
|
|
94
|
+
description: "Symbol Naming — kebab-case, PascalCase, conventions"
|
|
95
|
+
file: para-201.json
|
|
96
|
+
tags: [course-content, para-201]
|
|
97
|
+
references: ["#symbol-system"]
|
|
98
|
+
|
|
99
|
+
para-201-component-patterns:
|
|
100
|
+
description: "Component Patterns — service, handler, model, utility patterns"
|
|
101
|
+
file: para-201.json
|
|
102
|
+
tags: [course-content, para-201]
|
|
103
|
+
references: ["#symbol-system", "#purpose-files"]
|
|
104
|
+
|
|
105
|
+
para-201-signal-patterns:
|
|
106
|
+
description: "Signal Patterns — event naming, emitters, side effects"
|
|
107
|
+
file: para-201.json
|
|
108
|
+
tags: [course-content, para-201]
|
|
109
|
+
references: ["#symbol-system"]
|
|
110
|
+
|
|
111
|
+
para-201-cross-cutting-concerns:
|
|
112
|
+
description: "Cross-Cutting Concerns — aspects across components, enforcement strategies"
|
|
113
|
+
file: para-201.json
|
|
114
|
+
tags: [course-content, para-201]
|
|
115
|
+
references: ["#aspect-anchoring"]
|
|
116
|
+
|
|
117
|
+
para-201-architecture-review:
|
|
118
|
+
description: "Architecture Review — comprehensive review of PARA 201 concepts"
|
|
119
|
+
file: para-201.json
|
|
120
|
+
tags: [course-content, para-201]
|
|
121
|
+
references: ["#flow-validation", "#portal-protocol", "#aspect-anchoring", "#symbol-system"]
|
|
122
|
+
|
|
123
|
+
# PARA 301: Operations (11 lessons)
|
|
124
|
+
|
|
125
|
+
para-301-history-system:
|
|
126
|
+
description: "History System — implementation history, event tracking"
|
|
127
|
+
file: para-301.json
|
|
128
|
+
tags: [course-content, para-301]
|
|
129
|
+
references: ["#lore-system"]
|
|
130
|
+
|
|
131
|
+
para-301-fragility-tracking:
|
|
132
|
+
description: "Fragility Tracking — stability scores, fragility warnings"
|
|
133
|
+
file: para-301.json
|
|
134
|
+
tags: [course-content, para-301]
|
|
135
|
+
references: ["#ripple-analysis"]
|
|
136
|
+
|
|
137
|
+
para-301-wisdom-system:
|
|
138
|
+
description: "Wisdom System — antipatterns, decisions, expert guidance"
|
|
139
|
+
file: para-301.json
|
|
140
|
+
tags: [course-content, para-301]
|
|
141
|
+
references: ["#wisdom-system"]
|
|
142
|
+
|
|
143
|
+
para-301-ripple-analysis:
|
|
144
|
+
description: "Ripple Analysis — impact checking, workspace-aware ripple"
|
|
145
|
+
file: para-301.json
|
|
146
|
+
tags: [course-content, para-301]
|
|
147
|
+
references: ["#ripple-analysis"]
|
|
148
|
+
|
|
149
|
+
para-301-doctor-and-validation:
|
|
150
|
+
description: "Doctor and Validation — health checks, paradigm doctor, paradigm lint"
|
|
151
|
+
file: para-301.json
|
|
152
|
+
tags: [course-content, para-301]
|
|
153
|
+
references: ["#navigation"]
|
|
154
|
+
|
|
155
|
+
para-301-navigation-system:
|
|
156
|
+
description: "Navigation System — paradigm_navigate, find/explore/context intents"
|
|
157
|
+
file: para-301.json
|
|
158
|
+
tags: [course-content, para-301]
|
|
159
|
+
references: ["#navigation", "#scan-index"]
|
|
160
|
+
|
|
161
|
+
para-301-sentinel-observability:
|
|
162
|
+
description: "Sentinel Observability — incidents, patterns, logs, traces"
|
|
163
|
+
file: para-301.json
|
|
164
|
+
tags: [course-content, para-301]
|
|
165
|
+
references: ["#sentinel"]
|
|
166
|
+
|
|
167
|
+
para-301-sync-and-maintenance:
|
|
168
|
+
description: "Sync and Maintenance — paradigm sync, IDE adapters, cross-tool export"
|
|
169
|
+
file: para-301.json
|
|
170
|
+
tags: [course-content, para-301]
|
|
171
|
+
references: ["#paradigm-sync"]
|
|
172
|
+
|
|
173
|
+
para-301-context-management:
|
|
174
|
+
description: "Context Management — token budgets, MCP vs file reads, session stats"
|
|
175
|
+
file: para-301.json
|
|
176
|
+
tags: [course-content, para-301]
|
|
177
|
+
references: ["#session-continuity", "#mcp-tools"]
|
|
178
|
+
|
|
179
|
+
para-301-protocols:
|
|
180
|
+
description: "Protocols — repeatable patterns, protocol search/record/validate"
|
|
181
|
+
file: para-301.json
|
|
182
|
+
tags: [course-content, para-301]
|
|
183
|
+
references: ["#protocol-system"]
|
|
184
|
+
|
|
185
|
+
para-301-operations-review:
|
|
186
|
+
description: "Operations Review — comprehensive review of PARA 301 concepts"
|
|
187
|
+
file: para-301.json
|
|
188
|
+
tags: [course-content, para-301]
|
|
189
|
+
references: ["#lore-system", "#wisdom-system", "#ripple-analysis", "#navigation", "#sentinel", "#protocol-system"]
|
|
190
|
+
|
|
191
|
+
# PARA 401: Orchestration (9 lessons)
|
|
192
|
+
|
|
193
|
+
para-401-mcp-tools-overview:
|
|
194
|
+
description: "MCP Tools Overview — 95 tools, token budgets, query vs file read"
|
|
195
|
+
file: para-401.json
|
|
196
|
+
tags: [course-content, para-401]
|
|
197
|
+
references: ["#mcp-tools"]
|
|
198
|
+
|
|
199
|
+
para-401-multi-agent-coordination:
|
|
200
|
+
description: "Multi-Agent Coordination — team spawn, agent types, providers"
|
|
201
|
+
file: para-401.json
|
|
202
|
+
tags: [course-content, para-401]
|
|
203
|
+
references: ["#orchestration"]
|
|
204
|
+
|
|
205
|
+
para-401-agent-roles:
|
|
206
|
+
description: "Agent Roles — architect, builder, reviewer, tester, security"
|
|
207
|
+
file: para-401.json
|
|
208
|
+
tags: [course-content, para-401]
|
|
209
|
+
references: ["#orchestration"]
|
|
210
|
+
|
|
211
|
+
para-401-provider-cascade:
|
|
212
|
+
description: "Provider Cascade — auto, claude, claude-code, cursor-cli, manual"
|
|
213
|
+
file: para-401.json
|
|
214
|
+
tags: [course-content, para-401]
|
|
215
|
+
references: ["#orchestration"]
|
|
216
|
+
|
|
217
|
+
para-401-orchestration-workflow:
|
|
218
|
+
description: "Orchestration Workflow — orchestrate_inline, plan vs execute modes"
|
|
219
|
+
file: para-401.json
|
|
220
|
+
tags: [course-content, para-401]
|
|
221
|
+
references: ["#orchestration", "#pm-governance"]
|
|
222
|
+
|
|
223
|
+
para-401-pm-governance:
|
|
224
|
+
description: "PM Governance — preflight, postflight, compliance checks"
|
|
225
|
+
file: para-401.json
|
|
226
|
+
tags: [course-content, para-401]
|
|
227
|
+
references: ["#pm-governance"]
|
|
228
|
+
|
|
229
|
+
para-401-commit-conventions:
|
|
230
|
+
description: "Commit Conventions — symbol trailers, type(#symbol) format"
|
|
231
|
+
file: para-401.json
|
|
232
|
+
tags: [course-content, para-401]
|
|
233
|
+
references: ["#symbol-system"]
|
|
234
|
+
|
|
235
|
+
para-401-mastery-review:
|
|
236
|
+
description: "Mastery Review — comprehensive review of PARA 401 concepts"
|
|
237
|
+
file: para-401.json
|
|
238
|
+
tags: [course-content, para-401]
|
|
239
|
+
references: ["#mcp-tools", "#orchestration", "#pm-governance"]
|
|
240
|
+
|
|
241
|
+
para-401-agent-interop:
|
|
242
|
+
description: "Agent Interoperability — AGENTS.md, Skills v2, cross-tool compat"
|
|
243
|
+
file: para-401.json
|
|
244
|
+
tags: [course-content, para-401]
|
|
245
|
+
references: ["#orchestration", "#mcp-tools", "#paradigm-sync"]
|
|
246
|
+
|
|
247
|
+
# PARA 501: Advanced Systems (10 lessons)
|
|
248
|
+
|
|
249
|
+
para-501-lore-system:
|
|
250
|
+
description: "Lore System — entries, types, arcs, linked entries, timeline"
|
|
251
|
+
file: para-501.json
|
|
252
|
+
tags: [course-content, para-501]
|
|
253
|
+
references: ["#lore-system"]
|
|
254
|
+
|
|
255
|
+
para-501-sentinel-deep-dive:
|
|
256
|
+
description: "Sentinel Deep Dive — incidents, patterns, triage, services, schemas"
|
|
257
|
+
file: para-501.json
|
|
258
|
+
tags: [course-content, para-501]
|
|
259
|
+
references: ["#sentinel"]
|
|
260
|
+
|
|
261
|
+
para-501-aspect-graph-internals:
|
|
262
|
+
description: "Aspect Graph Internals — BFS traversal, aspect neighborhoods"
|
|
263
|
+
file: para-501.json
|
|
264
|
+
tags: [course-content, para-501]
|
|
265
|
+
references: ["#aspect-anchoring", "#symbol-graph"]
|
|
266
|
+
|
|
267
|
+
para-501-habits-practice:
|
|
268
|
+
description: "Habits and Practice — behavioral discipline, blocking habits, compliance"
|
|
269
|
+
file: para-501.json
|
|
270
|
+
tags: [course-content, para-501]
|
|
271
|
+
references: ["#habits-system"]
|
|
272
|
+
|
|
273
|
+
para-501-session-intelligence:
|
|
274
|
+
description: "Session Intelligence — checkpoints, recovery, handoff, context monitoring"
|
|
275
|
+
file: para-501.json
|
|
276
|
+
tags: [course-content, para-501]
|
|
277
|
+
references: ["#session-continuity"]
|
|
278
|
+
|
|
279
|
+
para-501-hook-enforcement:
|
|
280
|
+
description: "Hook Enforcement — 11 stop hook checks, pre-commit, post-write hooks"
|
|
281
|
+
file: para-501.json
|
|
282
|
+
tags: [course-content, para-501]
|
|
283
|
+
references: ["#enforcement-hooks"]
|
|
284
|
+
|
|
285
|
+
para-501-advanced-workflows:
|
|
286
|
+
description: "Advanced Workflows — flow-first development, multi-agent patterns"
|
|
287
|
+
file: para-501.json
|
|
288
|
+
tags: [course-content, para-501]
|
|
289
|
+
references: ["#flow-validation", "#orchestration"]
|
|
290
|
+
|
|
291
|
+
para-501-aspect-graph-advanced:
|
|
292
|
+
description: "Aspect Graph Advanced — graph generation, interactive visualization"
|
|
293
|
+
file: para-501.json
|
|
294
|
+
tags: [course-content, para-501]
|
|
295
|
+
references: ["#aspect-anchoring", "#symbol-graph"]
|
|
296
|
+
|
|
297
|
+
para-501-task-management:
|
|
298
|
+
description: "Task Management — paradigm_task_create, task lifecycle"
|
|
299
|
+
file: para-501.json
|
|
300
|
+
tags: [course-content, para-501]
|
|
301
|
+
references: ["#mcp-tools"]
|
|
302
|
+
|
|
303
|
+
para-501-assessment-loops:
|
|
304
|
+
description: "Lore as Unified Project Memory — arcs as tags, deprecated assessment tools"
|
|
305
|
+
file: para-501.json
|
|
306
|
+
tags: [course-content, para-501]
|
|
307
|
+
references: ["#lore-system"]
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
name: plsat-exams
|
|
2
|
+
description: PLSAT (Paradigm Licensure Standardized Assessment Test) exam content. Questions are mapped to courses and Paradigm concepts so ripple analysis can identify which questions need updating when features change.
|
|
3
|
+
|
|
4
|
+
components:
|
|
5
|
+
plsat-v3:
|
|
6
|
+
description: "PLSAT v3.0 — 99 slots with variants, 90 min, 80% pass threshold"
|
|
7
|
+
file: v3.0.json
|
|
8
|
+
tags: [plsat, certification]
|
|
9
|
+
|
|
10
|
+
plsat-v2:
|
|
11
|
+
description: "PLSAT v2.0 — 50 questions, 45 min, 80% pass threshold (legacy)"
|
|
12
|
+
file: v2.0.json
|
|
13
|
+
tags: [plsat, certification, legacy]
|
|
14
|
+
|
|
15
|
+
# PLSAT v3.0 Question Groups by Concept
|
|
16
|
+
# Each group maps a set of PLSAT slots to the Paradigm concept they test.
|
|
17
|
+
# When a concept changes, ripple shows which question groups need review.
|
|
18
|
+
|
|
19
|
+
plsat-questions-symbol-system:
|
|
20
|
+
description: "PLSAT questions testing symbol identification and usage (slots 001-009, para-101)"
|
|
21
|
+
file: v3.0.json
|
|
22
|
+
tags: [plsat, para-101]
|
|
23
|
+
references: ["#symbol-system"]
|
|
24
|
+
|
|
25
|
+
plsat-questions-purpose-files:
|
|
26
|
+
description: "PLSAT questions testing .purpose file structure and content (para-101)"
|
|
27
|
+
file: v3.0.json
|
|
28
|
+
tags: [plsat, para-101]
|
|
29
|
+
references: ["#purpose-files"]
|
|
30
|
+
|
|
31
|
+
plsat-questions-tag-system:
|
|
32
|
+
description: "PLSAT questions testing tag bank, core tags, custom tags (para-101)"
|
|
33
|
+
file: v3.0.json
|
|
34
|
+
tags: [plsat, para-101]
|
|
35
|
+
references: ["#tag-system"]
|
|
36
|
+
|
|
37
|
+
plsat-questions-logger:
|
|
38
|
+
description: "PLSAT questions testing Paradigm logger and symbol-typed logging (para-101)"
|
|
39
|
+
file: v3.0.json
|
|
40
|
+
tags: [plsat, para-101]
|
|
41
|
+
references: ["#paradigm-logger"]
|
|
42
|
+
|
|
43
|
+
plsat-questions-flows:
|
|
44
|
+
description: "PLSAT questions testing $flow definitions and validation (para-201)"
|
|
45
|
+
file: v3.0.json
|
|
46
|
+
tags: [plsat, para-201]
|
|
47
|
+
references: ["#flow-validation"]
|
|
48
|
+
|
|
49
|
+
plsat-questions-gates-portal:
|
|
50
|
+
description: "PLSAT questions testing ^gate and portal.yaml (para-201)"
|
|
51
|
+
file: v3.0.json
|
|
52
|
+
tags: [plsat, para-201]
|
|
53
|
+
references: ["#portal-protocol"]
|
|
54
|
+
|
|
55
|
+
plsat-questions-aspects:
|
|
56
|
+
description: "PLSAT questions testing ~aspect anchoring, drift, graph (para-201, para-501)"
|
|
57
|
+
file: v3.0.json
|
|
58
|
+
tags: [plsat, para-201, para-501]
|
|
59
|
+
references: ["#aspect-anchoring", "#symbol-graph"]
|
|
60
|
+
|
|
61
|
+
plsat-questions-history-wisdom:
|
|
62
|
+
description: "PLSAT questions testing history, fragility, wisdom systems (para-301)"
|
|
63
|
+
file: v3.0.json
|
|
64
|
+
tags: [plsat, para-301]
|
|
65
|
+
references: ["#wisdom-system", "#ripple-analysis"]
|
|
66
|
+
|
|
67
|
+
plsat-questions-navigation:
|
|
68
|
+
description: "PLSAT questions testing navigation, doctor, scan (para-301)"
|
|
69
|
+
file: v3.0.json
|
|
70
|
+
tags: [plsat, para-301]
|
|
71
|
+
references: ["#navigation", "#scan-index"]
|
|
72
|
+
|
|
73
|
+
plsat-questions-sentinel:
|
|
74
|
+
description: "PLSAT questions testing Sentinel observability (para-301, para-501)"
|
|
75
|
+
file: v3.0.json
|
|
76
|
+
tags: [plsat, para-301, para-501]
|
|
77
|
+
references: ["#sentinel"]
|
|
78
|
+
|
|
79
|
+
plsat-questions-protocols:
|
|
80
|
+
description: "PLSAT questions testing protocol system (para-301)"
|
|
81
|
+
file: v3.0.json
|
|
82
|
+
tags: [plsat, para-301]
|
|
83
|
+
references: ["#protocol-system"]
|
|
84
|
+
|
|
85
|
+
plsat-questions-mcp-tools:
|
|
86
|
+
description: "PLSAT questions testing MCP tools, token budgets (para-401)"
|
|
87
|
+
file: v3.0.json
|
|
88
|
+
tags: [plsat, para-401]
|
|
89
|
+
references: ["#mcp-tools"]
|
|
90
|
+
|
|
91
|
+
plsat-questions-orchestration:
|
|
92
|
+
description: "PLSAT questions testing multi-agent orchestration, agent roles (para-401)"
|
|
93
|
+
file: v3.0.json
|
|
94
|
+
tags: [plsat, para-401]
|
|
95
|
+
references: ["#orchestration"]
|
|
96
|
+
|
|
97
|
+
plsat-questions-pm-governance:
|
|
98
|
+
description: "PLSAT questions testing preflight/postflight governance (para-401)"
|
|
99
|
+
file: v3.0.json
|
|
100
|
+
tags: [plsat, para-401]
|
|
101
|
+
references: ["#pm-governance"]
|
|
102
|
+
|
|
103
|
+
plsat-questions-lore:
|
|
104
|
+
description: "PLSAT questions testing lore system, arcs, unified memory (para-501)"
|
|
105
|
+
file: v3.0.json
|
|
106
|
+
tags: [plsat, para-501]
|
|
107
|
+
references: ["#lore-system"]
|
|
108
|
+
|
|
109
|
+
plsat-questions-habits:
|
|
110
|
+
description: "PLSAT questions testing habits and practice compliance (para-501)"
|
|
111
|
+
file: v3.0.json
|
|
112
|
+
tags: [plsat, para-501]
|
|
113
|
+
references: ["#habits-system"]
|
|
114
|
+
|
|
115
|
+
plsat-questions-sessions:
|
|
116
|
+
description: "PLSAT questions testing session intelligence, checkpoints, handoff (para-501)"
|
|
117
|
+
file: v3.0.json
|
|
118
|
+
tags: [plsat, para-501]
|
|
119
|
+
references: ["#session-continuity"]
|
|
120
|
+
|
|
121
|
+
plsat-questions-hooks:
|
|
122
|
+
description: "PLSAT questions testing hook enforcement, 11 stop checks (para-501)"
|
|
123
|
+
file: v3.0.json
|
|
124
|
+
tags: [plsat, para-501]
|
|
125
|
+
references: ["#enforcement-hooks"]
|
|
126
|
+
|
|
127
|
+
plsat-questions-sync:
|
|
128
|
+
description: "PLSAT questions testing paradigm sync, IDE adapters (para-301)"
|
|
129
|
+
file: v3.0.json
|
|
130
|
+
tags: [plsat, para-301]
|
|
131
|
+
references: ["#paradigm-sync"]
|
|
@@ -83,5 +83,5 @@ Error generating stack: `+i.message+`
|
|
|
83
83
|
*/var Il=S,fm=cm;function dm(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var pm=typeof Object.is=="function"?Object.is:dm,hm=fm.useSyncExternalStore,mm=Il.useRef,vm=Il.useEffect,gm=Il.useMemo,ym=Il.useDebugValue;hf.useSyncExternalStoreWithSelector=function(e,t,n,r,l){var i=mm(null);if(i.current===null){var o={hasValue:!1,value:null};i.current=o}else o=i.current;i=gm(function(){function u(x){if(!c){if(c=!0,h=x,x=r(x),l!==void 0&&o.hasValue){var y=o.value;if(l(y,x))return m=y}return m=x}if(y=m,pm(h,x))return y;var w=r(x);return l!==void 0&&l(y,w)?(h=x,y):(h=x,m=w)}var c=!1,h,m,v=n===void 0?null:n;return[function(){return u(t())},v===null?void 0:function(){return u(v())}]},[t,n,r,l]);var s=hm(e,i[0],i[1]);return vm(function(){o.hasValue=!0,o.value=s},[s]),ym(s),s};pf.exports=hf;var xm=pf.exports;const wm=Uu(xm),gf={},{useDebugValue:Sm}=vo,{useSyncExternalStoreWithSelector:km}=wm;let Iu=!1;const Cm=e=>e;function Em(e,t=Cm,n){(gf?"production":void 0)!=="production"&&n&&!Iu&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),Iu=!0);const r=km(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return Sm(r),r}const Ou=e=>{(gf?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?em(e):e,n=(r,l)=>Em(t,r,l);return Object.assign(n,t),n},cs=e=>e?Ou(e):Ou,Ol=cs((e,t)=>({courses:[],courseCache:{},isLoading:!1,error:null,loadCourses:async()=>{e({isLoading:!0,error:null});try{const n=await fetch("/api/courses");if(!n.ok)throw new Error("Failed to load courses");const r=await n.json();e({courses:r.courses,isLoading:!1})}catch(n){e({error:n.message,isLoading:!1})}},loadCourse:async n=>{const r=t().courseCache[n];if(r)return r;try{const l=await fetch(`/api/courses/${n}`);if(!l.ok)return null;const i=await l.json();return e(o=>({courseCache:{...o.courseCache,[n]:i}})),i}catch{return null}}})),yf="paradigm-university-progress";function jm(){try{const e=localStorage.getItem(yf);return e?JSON.parse(e):{}}catch{return{}}}function pi(e){try{localStorage.setItem(yf,JSON.stringify(e))}catch{}}const Ml=cs((e,t)=>({progress:jm(),completeLesson:(n,r)=>{e(l=>{const i=l.progress[n]||{courseId:n,completedLessons:[],quizResults:{}};if(i.completedLessons.includes(r))return l;const o={...l.progress,[n]:{...i,completedLessons:[...i.completedLessons,r]}};return pi(o),{progress:o}})},recordQuiz:n=>{e(r=>{const l=r.progress[n.courseId]||{courseId:n.courseId,completedLessons:[],quizResults:{}},i={...r.progress,[n.courseId]:{...l,quizResults:{...l.quizResults,[n.lessonId]:n}}};return pi(i),{progress:i}})},getCourseProgress:n=>t().progress[n]||{courseId:n,completedLessons:[],quizResults:{}},isLessonCompleted:(n,r)=>{const l=t().progress[n];return l?l.completedLessons.includes(r):!1},getCoursePercentage:(n,r)=>{if(r===0)return 0;const l=t().progress[n];return l?Math.round(l.completedLessons.length/r*100):0},resetProgress:()=>{pi({}),e({progress:{}})}})),xf="paradigm-university-plsat";function Nm(){try{const e=localStorage.getItem(xf);return e?JSON.parse(e):{certificates:[],studentName:""}}catch{return{certificates:[],studentName:""}}}function Mu(e){try{localStorage.setItem(xf,JSON.stringify(e))}catch{}}const fs=cs((e,t)=>{const n=Nm();return{certificates:n.certificates,studentName:n.studentName,setStudentName:r=>{e({studentName:r});const l=t();Mu({certificates:l.certificates,studentName:r})},addCertificate:r=>{e(l=>{const i=[...l.certificates,r];return Mu({certificates:i,studentName:l.studentName}),{certificates:i}})},getLatestCertificate:()=>{const r=t().certificates;return r.length===0?null:r.reduce((l,i)=>new Date(i.date)>new Date(l.date)?i:l)},getCertificateForVersion:r=>t().certificates.find(l=>l.plsatVersion===r&&l.passed)||null,hasPassed:()=>t().certificates.some(r=>r.passed)}});function wf({percentage:e,size:t=48,strokeWidth:n=4}){const r=(t-n)/2,l=2*Math.PI*r,i=l-e/100*l;return a.jsxs("div",{className:"progress-ring",style:{width:t,height:t},children:[a.jsxs("svg",{width:t,height:t,children:[a.jsx("circle",{className:"ring-bg",cx:t/2,cy:t/2,r,fill:"none",strokeWidth:n}),a.jsx("circle",{className:"ring-fill",cx:t/2,cy:t/2,r,fill:"none",strokeWidth:n,strokeLinecap:"round",strokeDasharray:l,strokeDashoffset:i})]}),a.jsxs("span",{className:"ring-label",children:[e,"%"]})]})}function Pm(){const{courses:e,isLoading:t,loadCourses:n}=Ol(),r=Ml(i=>i.getCoursePercentage),l=fs(i=>i.hasPassed);return S.useEffect(()=>{n()},[n]),t?a.jsx("div",{className:"loading",children:"Opening the campus gates..."}):a.jsxs("div",{className:"home",children:[a.jsxs("div",{className:"home-hero",children:[a.jsx(pn,{size:140}),a.jsx("h1",{children:"Paradigm University"}),a.jsx("p",{className:"motto",children:"Universitas Paradigmatica — Lux in Codice"}),a.jsx("p",{className:"description",children:"Master the Paradigm framework through structured courses, hands-on quizzes, and the legendary PLSAT certification exam."})]}),a.jsx("div",{className:"gold-divider"}),a.jsxs("section",{className:"course-catalog",children:[a.jsx("h2",{children:"Course Catalog"}),e.map(i=>{const o=r(i.id,i.lessonCount);return a.jsxs(q,{to:`/course/${i.id}`,className:"course-card",children:[a.jsxs("div",{className:"course-card-header",children:[a.jsxs("div",{className:"course-card-title",children:[a.jsx("span",{className:"course-number",children:i.id.replace("para-","PARA ")}),a.jsx("h3",{children:i.title.replace(/^PARA \d+: /,"")})]}),a.jsx(wf,{percentage:o})]}),a.jsx("p",{className:"course-description",children:i.description}),a.jsx("div",{className:"course-topics",children:i.lessons.map(s=>a.jsx("span",{className:"course-topic-tag",children:s.title},s.id))}),a.jsxs("div",{className:"course-meta",children:[a.jsxs("span",{children:[i.lessonCount," lessons"]}),a.jsx("span",{className:"course-meta-cta",children:"Start course →"})]})]},i.id)})]}),a.jsx("div",{className:"gold-divider"}),a.jsxs("section",{children:[a.jsx("h2",{className:"mb-lg",children:"Quick Links"}),a.jsxs("div",{className:"quick-links",children:[a.jsx(q,{to:"/plsat",className:"quick-link",children:l()?"Retake the PLSAT":"Take the PLSAT"}),a.jsx(q,{to:"/reference",className:"quick-link",children:"Reference Library"}),a.jsx(q,{to:"/certificate",className:"quick-link",children:"View Certificates"}),a.jsx(q,{to:"/course/para-101",className:"quick-link",children:"Start Learning"})]})]})]})}function _m(){const{courses:e,isLoading:t,loadCourses:n}=Ol(),r=Ml(l=>l.getCoursePercentage);return S.useEffect(()=>{n()},[n]),t?a.jsx("div",{className:"loading",children:"Loading courses..."}):a.jsx("div",{className:"home",children:a.jsxs("section",{className:"course-catalog",children:[a.jsx("h2",{children:"Course Catalog"}),e.map(l=>{const i=r(l.id,l.lessonCount);return a.jsxs(q,{to:`/course/${l.id}`,className:"course-card",children:[a.jsx("span",{className:"course-number",children:l.id.replace("para-","PARA ")}),a.jsx("h3",{children:l.title.replace(/^PARA \d+: /,"")}),a.jsx("p",{className:"course-description",children:l.description}),a.jsxs("div",{className:"course-meta",children:[a.jsxs("span",{children:[l.lessonCount," lessons"]}),a.jsx(wf,{percentage:i})]})]},l.id)})]})})}function Du(e){return e.replace(/`([^`]+)`/g,"<code>$1</code>").replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/\*([^*]+)\*/g,"<em>$1</em>")}function Lm(e){const t=e.trim().split(`
|
|
84
84
|
`);if(t.length<2)return e;const n=o=>o.split("|").map(s=>s.trim()).filter(s=>s.length>0),r=n(t[0]),l=t.slice(2).map(n);let i="<table><thead><tr>";for(const o of r)i+=`<th>${Du(o)}</th>`;i+="</tr></thead><tbody>";for(const o of l){i+="<tr>";for(const s of o)i+=`<td>${Du(s)}</td>`;i+="</tr>"}return i+="</tbody></table>",i}function Ut(e){const t=[];let n=e.replace(/```(\w*)\n([\s\S]*?)```/g,(r,l,i)=>{const o=t.length;return t.push(`<pre><code>${i}</code></pre>`),`\0BLOCK${o}\0`});return n=n.replace(/((?:^\|.+\|\n?)+)/gm,r=>{const l=r.trim().split(`
|
|
85
85
|
`);if(l.length>=3&&/^[\s-:|]+$/.test(l[1])){const i=t.length;return t.push(Lm(r)),`\0BLOCK${i}\0`}return r}),n=n.replace(/`([^`]+)`/g,"<code>$1</code>").replace(/^#### (.+)$/gm,"<h4>$1</h4>").replace(/^### (.+)$/gm,"<h3>$1</h3>").replace(/^## (.+)$/gm,"<h2>$1</h2>").replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/\*([^*]+)\*/g,"<em>$1</em>").replace(/^> (.+)$/gm,"<blockquote>$1</blockquote>").replace(/^\d+\.\s+(.+)$/gm,"<oli>$1</oli>").replace(/((?:<oli>.*<\/oli>\n?)+)/g,r=>"<ol>"+r.replace(/<\/?oli>/g,l=>l.replace("oli","li"))+"</ol>").replace(/^- (.+)$/gm,"<li>$1</li>").replace(/((?:<li>.*<\/li>\n?)+)/g,"<ul>$1</ul>").replace(/^(?!<(?:h[1-6]|ul|ol|li|p|blockquote|pre|table|thead|tbody|tr|td|th|\x00)).+$/gm,"<p>$&</p>").replace(/\n{2,}/g,`
|
|
86
|
-
`),n=n.replace(/\x00BLOCK(\d+)\x00/g,(r,l)=>t[Number(l)]),n}function Au(){const{courseId:e,lessonId:t}=uf(),n=sf(),r=Ol(d=>d.loadCourse),[l,i]=S.useState(null),[o,s]=S.useState(null),[u,c]=S.useState(!0),{isLessonCompleted:h,completeLesson:m}=Ml();if(S.useEffect(()=>{e&&(c(!0),r(e).then(d=>{if(i(d),d&&d.lessons.length>0){const f=t?d.lessons.find(p=>p.id===t):null;f?s(f):(s(d.lessons[0]),n(`/course/${e}/${d.lessons[0].id}`,{replace:!0}))}c(!1)}))},[e,t,r,n]),u)return a.jsx("div",{className:"loading",children:"Opening the textbook..."});if(!l)return a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"Course not found"}),a.jsx("p",{children:"The requested course does not exist."}),a.jsx(q,{to:"/",className:"btn btn-primary mt-lg",children:"Return to Campus"})]});const v=o?l.lessons.findIndex(d=>d.id===o.id):0,x=()=>{o&&e&&m(e,o.id)},y=(d,f=!1)=>{s(d),n(`/course/${e}/${d.id}`),f&&window.scrollTo(0,0)},w=()=>{v<l.lessons.length-1&&y(l.lessons[v+1],!0)},N=()=>{v>0&&y(l.lessons[v-1],!0)};return a.jsxs("div",{className:"course-layout",children:[a.jsxs("aside",{className:"course-sidebar",children:[a.jsx("h2",{children:l.title}),a.jsx("nav",{className:"lesson-nav",children:l.lessons.map(d=>{const f=e?h(e,d.id):!1,p=(o==null?void 0:o.id)===d.id;let g="lesson-nav-item";return p&&(g+=" active"),f&&!p&&(g+=" completed"),a.jsx("button",{className:g,onClick:()=>y(d),children:d.title},d.id)})})]}),a.jsx("div",{className:"course-content",children:o&&a.jsxs(a.Fragment,{children:[a.jsx("h1",{children:o.title}),o.keyConcepts.length>0&&a.jsx("div",{className:"key-concepts",children:o.keyConcepts.map(d=>a.jsx("span",{className:"concept-tag",children:d},d))}),a.jsx("div",{className:"lesson-content",dangerouslySetInnerHTML:{__html:Ut(o.content)}}),a.jsxs("div",{className:"lesson-actions",children:[a.jsx("div",{children:v>0&&a.jsx("button",{className:"btn btn-secondary",onClick:N,children:"Previous"})}),a.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e&&!h(e,o.id)&&a.jsx("button",{className:"btn btn-secondary",onClick:x,children:"Mark Complete"}),o.quiz.length>0&&e&&a.jsx(q,{to:`/course/${e}/quiz/${o.id}`,className:"btn btn-gold",children:"Take Quiz"}),v<l.lessons.length-1&&a.jsx("button",{className:"btn btn-primary",onClick:w,children:"Next Lesson"})]})]})]})})]})}function co({number:e,question:t,scenario:n,choices:r,correct:l,explanation:i,selectedAnswer:o,onSelect:s,showResult:u,onAnswered:c,splitLayout:h}){const[m,v]=S.useState(null),[x,y]=S.useState(!1),w=s!==void 0,N=w?o||null:m,d=w?u:x,f=j=>{d&&!w||(w?s==null||s(j):(v(j),y(!0),c==null||c(j)))},p=N===l,g=Object.keys(r).sort(),E=a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"question-number",children:["Question ",e]}),n&&a.jsx("div",{className:"scenario",dangerouslySetInnerHTML:{__html:Ut(n)}}),a.jsx("div",{className:"question-text",dangerouslySetInnerHTML:{__html:Ut(t)}})]}),k=a.jsx("div",{className:"choices",children:g.map(j=>{let P="choice-btn";return N===j&&(P+=" selected"),d&&j===l&&(P+=" correct"),d&&N===j&&j!==l&&(P+=" incorrect"),a.jsxs("button",{className:P,onClick:()=>f(j),disabled:d&&!w,children:[a.jsxs("span",{className:"choice-letter",children:[j,"."]}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(r[j])}})]},j)})});return h?a.jsxs("div",{className:"question-card",children:[a.jsxs("div",{className:"question-split-layout",children:[a.jsx("div",{className:"question-content",children:E}),a.jsx("div",{className:"answer-choices",children:k})]}),d&&a.jsxs("div",{className:`explanation ${p?"":"wrong"}`,children:[a.jsx("strong",{children:p?"Correct!":`Incorrect. The answer is ${l}.`}),a.jsx("br",{}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(i)}})]})]}):a.jsxs("div",{className:"question-card",children:[E,k,d&&a.jsxs("div",{className:`explanation ${p?"":"wrong"}`,children:[a.jsx("strong",{children:p?"Correct!":`Incorrect. The answer is ${l}.`}),a.jsx("br",{}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(i)}})]})]})}function Tm(){const{courseId:e,lessonId:t}=uf(),n=Ol(g=>g.loadCourse),{recordQuiz:r,completeLesson:l,getCourseProgress:i}=Ml(),[o,s]=S.useState(null),[u,c]=S.useState(null),[h,m]=S.useState(!0),[v,x]=S.useState(!1),[y,w]=S.useState(0),N=e&&t?i(e).quizResults[t]:void 0;S.useEffect(()=>{e&&(m(!0),n(e).then(g=>{if(g&&t){const E=g.lessons.findIndex(k=>k.id===t);s(E>=0?g.lessons[E]:null),E>=0&&E<g.lessons.length-1&&c(g.lessons[E+1].id)}m(!1)}))},[e,t,n]);const[d,f]=S.useState({}),p=(g,E)=>{if(f(k=>({...k,[g]:E})),o){const k={...d,[g]:E};if(Object.keys(k).length===o.quiz.length){const j=o.quiz.filter(P=>k[P.id]===P.correct).length;if(w(j),x(!0),e&&t){const P={courseId:e,lessonId:t,score:j,total:o.quiz.length,answers:k,date:new Date().toISOString()};r(P),l(e,t)}}}};return h?a.jsx("div",{className:"loading",children:"Preparing your examination..."}):!o||o.quiz.length===0?a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"No quiz available"}),a.jsx("p",{children:"This lesson does not have a quiz."}),a.jsx(q,{to:`/course/${e}`,className:"btn btn-primary mt-lg",children:"Back to Course"})]}):a.jsxs("div",{className:"quiz-container",children:[a.jsxs("div",{className:"quiz-header",children:[a.jsxs("h1",{children:[o.title," — Quiz"]}),a.jsx("p",{className:"quiz-progress",children:v?`Score: ${y}/${o.quiz.length} (${Math.round(y/o.quiz.length*100)}%)`:`${Object.keys(d).length}/${o.quiz.length} answered`}),N&&!v&&a.jsxs("p",{className:"text-muted mt-sm",children:["Previous best: ",N.score,"/",N.total]})]}),o.quiz.map((g,E)=>a.jsx(co,{number:E+1,question:g.question,choices:g.choices,correct:g.correct,explanation:g.explanation,onAnswered:k=>p(g.id,k)},g.id)),v&&a.jsxs("div",{className:"text-center mt-xl",children:[a.jsx("p",{className:"mb-lg",style:{fontSize:"1.25rem",fontFamily:"var(--font-serif)"},children:y===o.quiz.length?"Perfect score! Exemplary scholarship.":y>=o.quiz.length*.8?"Well done, scholar. You have demonstrated understanding.":"Review the material and try again. Persistence is the path to mastery."}),u?a.jsx(q,{to:`/course/${e}/${u}`,className:"btn btn-primary",children:"Next Lesson"}):a.jsx(q,{to:`/course/${e}`,className:"btn btn-primary",children:"Return to Course"})]})]})}function zm({totalSeconds:e,onTimeUp:t,running:n}){const[r,l]=S.useState(e),i=S.useCallback(()=>{t()},[t]);S.useEffect(()=>{if(!n)return;const h=setInterval(()=>{l(m=>m<=1?(clearInterval(h),i(),0):m-1)},1e3);return()=>clearInterval(h)},[n,i]);const o=Math.floor(r/60),s=r%60,u=r/e*100;let c="timer-display";return u<20?c+=" critical":u<40&&(c+=" warning"),a.jsxs("span",{className:c,children:[String(o).padStart(2,"0"),":",String(s).padStart(2,"0")]})}function Fu({text:e}){const t=e.split(/(```[\s\S]*?```)/g);return a.jsx("div",{className:"passage-block",children:a.jsx("div",{className:"passage-content",children:t.map((n,r)=>{if(n.startsWith("```")){const l=n.match(/^```(\w*)\n?([\s\S]*?)```$/),i=l?l[2]:n.slice(3,-3);return a.jsx("pre",{children:a.jsx("code",{children:i})},r)}return n.split(/\n\n+/).map((l,i)=>a.jsx("p",{children:l},`${r}-${i}`))})})})}function $u(e,t,n){if(!t)return null;const r=e[n];return r.passageId?t[r.passageId]??null:null}function Rm(){const[e,t]=S.useState(null),[n,r]=S.useState("intro"),[l,i]=S.useState({}),[o,s]=S.useState(0),[u,c]=S.useState(!0),[h,m]=S.useState(null),{studentName:v,setStudentName:x,addCertificate:y}=fs(),[w,N]=S.useState(v);S.useEffect(()=>{fetch("/api/plsat/3.0").then(k=>k.json()).then(k=>{t(k),c(!1)}).catch(()=>c(!1))},[]);const d=S.useCallback(()=>{if(!e)return;const k=e.questions.filter(de=>l[de.id]===de.correct).length,j=e.questions.length,P=Math.round(k/j*100),M=P>=e.passThreshold*100,z={name:w||"Anonymous Scholar",score:k,total:j,percentage:P,passed:M,plsatVersion:e.version,frameworkVersion:e.frameworkVersion,date:new Date().toISOString()};m(z),y(z),w&&x(w),r("results")},[e,l,w,y,x]),f=S.useCallback(()=>{d()},[d]),p=()=>{d()},g=()=>{i({}),s(0),r("exam")},E=S.useMemo(()=>!e||n!=="exam"?null:$u(e.questions,e.passages,o),[e,n,o]);if(u)return a.jsx("div",{className:"loading",children:"The examination board is convening..."});if(!e)return a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"PLSAT Unavailable"}),a.jsx("p",{children:"Could not load the examination. Please try again."})]});if(n==="intro")return a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"plsat-intro",children:[a.jsx(pn,{size:100}),a.jsx("h1",{children:"The PLSAT"}),a.jsx("p",{className:"plsat-subtitle",children:"Paradigm Licensure Standardized Assessment Test"}),a.jsxs("p",{className:"text-muted",children:["Version ",e.version]})]}),a.jsxs("div",{className:"plsat-rules",children:[a.jsx("h3",{children:"Examination Rules"}),a.jsxs("ul",{children:[a.jsxs("li",{children:[a.jsxs("strong",{children:[e.questions.length," questions"]})," covering all aspects of the Paradigm framework"]}),a.jsxs("li",{children:[a.jsxs("strong",{children:[Math.floor(e.timeLimit/60)," minutes"]})," to complete the examination"]}),a.jsxs("li",{children:[a.jsxs("strong",{children:[e.passThreshold*100,"%"]})," required to pass and receive certification"]}),a.jsx("li",{children:"All questions are multiple choice (A through E)"}),a.jsx("li",{children:"Some questions reference a shared passage — read it carefully"}),a.jsx("li",{children:"You may navigate between questions freely"}),a.jsx("li",{children:"There is no penalty for guessing — answer every question"}),a.jsx("li",{children:"Your certificate will display the PLSAT version for posterity"})]})]}),a.jsxs("div",{className:"text-center",children:[a.jsx("div",{className:"mb-lg",children:a.jsx("input",{type:"text",className:"name-input",placeholder:"Enter your name, scholar",value:w,onChange:k=>N(k.target.value)})}),a.jsx("button",{className:"btn btn-primary btn-lg",onClick:g,children:"Begin Examination"})]})]});if(n==="exam"){const k=e.questions[o],j=Object.keys(l).length;return a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"plsat-timer",children:[a.jsx(zm,{totalSeconds:e.timeLimit,onTimeUp:f,running:!0}),a.jsxs("span",{className:"plsat-progress-text",children:["Question ",o+1," of ",e.questions.length," | ",j," answered"]})]}),a.jsxs("div",{style:{marginTop:"var(--space-lg)"},children:[E&&a.jsx(Fu,{text:E}),a.jsx(co,{number:o+1,question:k.question,scenario:k.scenario,choices:k.choices,correct:k.correct,explanation:k.explanation,selectedAnswer:l[k.id],onSelect:P=>i(M=>({...M,[k.id]:P})),showResult:!1,splitLayout:!0})]}),a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"var(--space-lg)"},children:[a.jsx("button",{className:"btn btn-secondary",disabled:o===0,onClick:()=>s(P=>P-1),children:"Previous"}),a.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[j===e.questions.length&&a.jsx("button",{className:"btn btn-gold",onClick:p,children:"Submit Examination"}),a.jsx("button",{className:"btn btn-primary",disabled:o===e.questions.length-1,onClick:()=>s(P=>P+1),children:"Next"})]})]}),a.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"4px",marginTop:"var(--space-xl)",justifyContent:"center"},children:e.questions.map((P,M)=>a.jsx("button",{onClick:()=>s(M),style:{width:28,height:28,borderRadius:"50%",border:M===o?"2px solid var(--burgundy)":"1px solid var(--parchment-dark)",background:l[P.id]?"var(--gold-bg)":"var(--cream)",color:"var(--ink)",fontSize:"0.6875rem",cursor:"pointer",fontWeight:M===o?600:400},children:M+1},P.id))})]})}return n==="results"&&h?a.jsx("div",{className:"plsat-container",children:a.jsxs("div",{className:"plsat-results",children:[a.jsx(pn,{size:80}),a.jsxs("div",{className:`score-display ${h.passed?"passed":"failed"}`,children:[h.percentage,"%"]}),a.jsx("p",{className:"verdict",children:h.passed?"Congratulations! You have passed the PLSAT.":"The examination board regrets to inform you that you did not pass."}),a.jsxs("p",{className:"text-muted mb-lg",children:["Score: ",h.score,"/",h.total," | PLSAT v",h.plsatVersion," | ",new Date(h.date).toLocaleDateString()]}),a.jsxs("div",{style:{display:"flex",gap:"1rem",justifyContent:"center"},children:[h.passed&&a.jsx(q,{to:"/certificate",className:"btn btn-gold btn-lg",children:"View Certificate"}),a.jsx("button",{className:"btn btn-secondary",onClick:()=>r("review"),children:"Review Answers"}),a.jsx("button",{className:"btn btn-primary",onClick:()=>r("intro"),children:h.passed?"Retake":"Try Again"})]})]})}):n==="review"?a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"quiz-header",children:[a.jsx("h1",{children:"PLSAT Review"}),a.jsx("p",{className:"quiz-progress",children:h?`Score: ${h.score}/${h.total} (${h.percentage}%)`:""})]}),e.questions.map((k,j)=>{const P=$u(e.questions,e.passages,j);return a.jsxs("div",{children:[P&&a.jsx(Fu,{text:P}),a.jsx(co,{number:j+1,question:k.question,scenario:k.scenario,choices:k.choices,correct:k.correct,explanation:k.explanation,selectedAnswer:l[k.id],onSelect:()=>{},showResult:!0,splitLayout:!0})]},k.id)}),a.jsx("div",{className:"text-center mt-xl",children:a.jsx("button",{className:"btn btn-primary",onClick:()=>r("results"),children:"Back to Results"})})]}):null}function Im(){const[e,t]=S.useState(null),[n,r]=S.useState(!0);return S.useEffect(()=>{fetch("/api/reference").then(l=>l.json()).then(l=>{t(l),r(!1)}).catch(()=>r(!1))},[]),n?a.jsx("div",{className:"loading",children:"Opening the reference library..."}):e?a.jsxs("div",{className:"reference-container",children:[a.jsx("h1",{className:"mb-lg",children:"Reference Library"}),e.sections.map(l=>a.jsxs("section",{className:"reference-section",children:[a.jsx("h2",{children:l.title}),a.jsx("div",{className:"reference-grid",children:l.cards.map(i=>a.jsxs("div",{className:"ref-card",children:[i.symbol&&a.jsx("div",{className:"ref-symbol",children:i.symbol}),a.jsx("h4",{children:i.name}),a.jsx("p",{children:i.description}),i.examples&&i.examples.length>0&&a.jsx("div",{className:"ref-examples",children:i.examples.map(o=>a.jsx("span",{className:"ref-example",children:o},o))}),i.logger&&a.jsx("p",{style:{marginTop:"0.5rem"},children:a.jsx("code",{children:i.logger})}),i.when&&a.jsx("p",{className:"text-muted",style:{fontSize:"0.8125rem",marginTop:"0.25rem"},children:a.jsx("em",{children:i.when})}),i.command&&a.jsx("p",{style:{marginTop:"0.5rem"},children:a.jsx("code",{children:i.command})}),i.steps&&i.steps.length>0&&a.jsx("ol",{style:{fontSize:"0.875rem",paddingLeft:"1.25rem",marginTop:"0.5rem"},children:i.steps.map((o,s)=>a.jsx("li",{style:{marginBottom:"0.25rem"},children:o},s))})]},i.id))})]},l.id))]}):a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"Reference library unavailable"}),a.jsx("p",{children:"Could not load reference data."})]})}function Om(){const{certificates:e}=fs(),t=e.filter(r=>r.passed),n=t.length>0?t.reduce((r,l)=>new Date(l.date)>new Date(r.date)?l:r):null;return n?a.jsxs("div",{className:"certificate-container",children:[a.jsx("div",{className:"no-print text-center mb-lg",children:a.jsx("button",{className:"btn btn-gold",onClick:()=>window.print(),children:"Print Certificate"})}),a.jsxs("div",{className:"certificate",children:[a.jsx(pn,{size:100,className:"cert-seal"}),a.jsx("h1",{children:"Paradigm University"}),a.jsx("p",{className:"cert-title",children:"Universitas Paradigmatica — Lux in Codice"}),a.jsx("div",{className:"gold-divider"}),a.jsx("p",{style:{fontSize:"0.875rem",color:"var(--ink-muted)",marginTop:"var(--space-lg)"},children:"This is to certify that"}),a.jsx("div",{className:"cert-name",children:n.name}),a.jsxs("p",{className:"cert-body",children:["has successfully completed the",a.jsx("br",{}),a.jsx("strong",{children:"Paradigm Licensure Standardized Assessment Test"}),a.jsx("br",{}),"and is hereby recognized as a certified Paradigm practitioner."]}),a.jsxs("p",{className:"cert-score",children:["Score: ",n.score,"/",n.total," (",n.percentage,"%)"]}),a.jsx("div",{className:"gold-divider"}),a.jsxs("dl",{className:"cert-meta",children:[a.jsxs("div",{children:[a.jsx("dt",{children:"PLSAT Version"}),a.jsxs("dd",{children:["v",n.plsatVersion]})]}),a.jsxs("div",{children:[a.jsx("dt",{children:"Framework Version"}),a.jsxs("dd",{children:["v",n.frameworkVersion]})]}),a.jsxs("div",{children:[a.jsx("dt",{children:"Date Issued"}),a.jsx("dd",{children:new Date(n.date).toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"})})]})]})]}),e.length>1&&a.jsxs("div",{className:"no-print mt-xl",children:[a.jsx("h3",{className:"mb-md",children:"All Attempts"}),[...e].reverse().map((r,l)=>a.jsx("div",{className:"ref-card",style:{marginBottom:"0.5rem"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("span",{children:["PLSAT v",r.plsatVersion," — ",r.score,"/",r.total," (",r.percentage,"%)",r.passed?" ✓":""]}),a.jsx("span",{className:"text-muted",children:new Date(r.date).toLocaleDateString()})]})},l))]})]}):a.jsxs("div",{className:"certificate-container",children:[a.jsxs("div",{className:"empty-state",children:[a.jsx(pn,{size:80}),a.jsx("h3",{className:"mt-lg",children:"No Certificates Yet"}),a.jsx("p",{children:"Pass the PLSAT examination to earn your Paradigm certification."}),a.jsx(q,{to:"/plsat",className:"btn btn-primary mt-lg",children:"Take the PLSAT"})]}),e.length>0&&a.jsxs("div",{className:"mt-xl",children:[a.jsx("h3",{className:"mb-md",children:"Previous Attempts"}),e.map((r,l)=>a.jsx("div",{className:"ref-card",style:{marginBottom:"0.5rem"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("span",{children:["PLSAT v",r.plsatVersion," — ",r.score,"/",r.total," (",r.percentage,"%)"]}),a.jsx("span",{className:"text-muted",children:new Date(r.date).toLocaleDateString()})]})},l))]})]})}function Mm(){return a.jsxs("div",{className:"app",children:[a.jsx(Zh,{version:"3.10.4"}),a.jsx("main",{className:"main-content",children:a.jsxs(Bh,{children:[a.jsx(We,{path:"/",element:a.jsx(Pm,{})}),a.jsx(We,{path:"/courses",element:a.jsx(_m,{})}),a.jsx(We,{path:"/course/:courseId",element:a.jsx(Au,{})}),a.jsx(We,{path:"/course/:courseId/:lessonId",element:a.jsx(Au,{})}),a.jsx(We,{path:"/course/:courseId/quiz/:lessonId",element:a.jsx(Tm,{})}),a.jsx(We,{path:"/plsat",element:a.jsx(Rm,{})}),a.jsx(We,{path:"/reference",element:a.jsx(Im,{})}),a.jsx(We,{path:"/certificate",element:a.jsx(Om,{})})]})})]})}hi.createRoot(document.getElementById("root")).render(a.jsx(vo.StrictMode,{children:a.jsx(Gh,{children:a.jsx(Mm,{})})}));
|
|
87
|
-
//# sourceMappingURL=index-
|
|
86
|
+
`),n=n.replace(/\x00BLOCK(\d+)\x00/g,(r,l)=>t[Number(l)]),n}function Au(){const{courseId:e,lessonId:t}=uf(),n=sf(),r=Ol(d=>d.loadCourse),[l,i]=S.useState(null),[o,s]=S.useState(null),[u,c]=S.useState(!0),{isLessonCompleted:h,completeLesson:m}=Ml();if(S.useEffect(()=>{e&&(c(!0),r(e).then(d=>{if(i(d),d&&d.lessons.length>0){const f=t?d.lessons.find(p=>p.id===t):null;f?s(f):(s(d.lessons[0]),n(`/course/${e}/${d.lessons[0].id}`,{replace:!0}))}c(!1)}))},[e,t,r,n]),u)return a.jsx("div",{className:"loading",children:"Opening the textbook..."});if(!l)return a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"Course not found"}),a.jsx("p",{children:"The requested course does not exist."}),a.jsx(q,{to:"/",className:"btn btn-primary mt-lg",children:"Return to Campus"})]});const v=o?l.lessons.findIndex(d=>d.id===o.id):0,x=()=>{o&&e&&m(e,o.id)},y=(d,f=!1)=>{s(d),n(`/course/${e}/${d.id}`),f&&window.scrollTo(0,0)},w=()=>{v<l.lessons.length-1&&y(l.lessons[v+1],!0)},N=()=>{v>0&&y(l.lessons[v-1],!0)};return a.jsxs("div",{className:"course-layout",children:[a.jsxs("aside",{className:"course-sidebar",children:[a.jsx("h2",{children:l.title}),a.jsx("nav",{className:"lesson-nav",children:l.lessons.map(d=>{const f=e?h(e,d.id):!1,p=(o==null?void 0:o.id)===d.id;let g="lesson-nav-item";return p&&(g+=" active"),f&&!p&&(g+=" completed"),a.jsx("button",{className:g,onClick:()=>y(d),children:d.title},d.id)})})]}),a.jsx("div",{className:"course-content",children:o&&a.jsxs(a.Fragment,{children:[a.jsx("h1",{children:o.title}),o.keyConcepts.length>0&&a.jsx("div",{className:"key-concepts",children:o.keyConcepts.map(d=>a.jsx("span",{className:"concept-tag",children:d},d))}),a.jsx("div",{className:"lesson-content",dangerouslySetInnerHTML:{__html:Ut(o.content)}}),a.jsxs("div",{className:"lesson-actions",children:[a.jsx("div",{children:v>0&&a.jsx("button",{className:"btn btn-secondary",onClick:N,children:"Previous"})}),a.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e&&!h(e,o.id)&&a.jsx("button",{className:"btn btn-secondary",onClick:x,children:"Mark Complete"}),o.quiz.length>0&&e&&a.jsx(q,{to:`/course/${e}/quiz/${o.id}`,className:"btn btn-gold",children:"Take Quiz"}),v<l.lessons.length-1&&a.jsx("button",{className:"btn btn-primary",onClick:w,children:"Next Lesson"})]})]})]})})]})}function co({number:e,question:t,scenario:n,choices:r,correct:l,explanation:i,selectedAnswer:o,onSelect:s,showResult:u,onAnswered:c,splitLayout:h}){const[m,v]=S.useState(null),[x,y]=S.useState(!1),w=s!==void 0,N=w?o||null:m,d=w?u:x,f=j=>{d&&!w||(w?s==null||s(j):(v(j),y(!0),c==null||c(j)))},p=N===l,g=Object.keys(r).sort(),E=a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"question-number",children:["Question ",e]}),n&&a.jsx("div",{className:"scenario",dangerouslySetInnerHTML:{__html:Ut(n)}}),a.jsx("div",{className:"question-text",dangerouslySetInnerHTML:{__html:Ut(t)}})]}),k=a.jsx("div",{className:"choices",children:g.map(j=>{let P="choice-btn";return N===j&&(P+=" selected"),d&&j===l&&(P+=" correct"),d&&N===j&&j!==l&&(P+=" incorrect"),a.jsxs("button",{className:P,onClick:()=>f(j),disabled:d&&!w,children:[a.jsxs("span",{className:"choice-letter",children:[j,"."]}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(r[j])}})]},j)})});return h?a.jsxs("div",{className:"question-card",children:[a.jsxs("div",{className:"question-split-layout",children:[a.jsx("div",{className:"question-content",children:E}),a.jsx("div",{className:"answer-choices",children:k})]}),d&&a.jsxs("div",{className:`explanation ${p?"":"wrong"}`,children:[a.jsx("strong",{children:p?"Correct!":`Incorrect. The answer is ${l}.`}),a.jsx("br",{}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(i)}})]})]}):a.jsxs("div",{className:"question-card",children:[E,k,d&&a.jsxs("div",{className:`explanation ${p?"":"wrong"}`,children:[a.jsx("strong",{children:p?"Correct!":`Incorrect. The answer is ${l}.`}),a.jsx("br",{}),a.jsx("span",{dangerouslySetInnerHTML:{__html:Ut(i)}})]})]})}function Tm(){const{courseId:e,lessonId:t}=uf(),n=Ol(g=>g.loadCourse),{recordQuiz:r,completeLesson:l,getCourseProgress:i}=Ml(),[o,s]=S.useState(null),[u,c]=S.useState(null),[h,m]=S.useState(!0),[v,x]=S.useState(!1),[y,w]=S.useState(0),N=e&&t?i(e).quizResults[t]:void 0;S.useEffect(()=>{e&&(m(!0),n(e).then(g=>{if(g&&t){const E=g.lessons.findIndex(k=>k.id===t);s(E>=0?g.lessons[E]:null),E>=0&&E<g.lessons.length-1&&c(g.lessons[E+1].id)}m(!1)}))},[e,t,n]);const[d,f]=S.useState({}),p=(g,E)=>{if(f(k=>({...k,[g]:E})),o){const k={...d,[g]:E};if(Object.keys(k).length===o.quiz.length){const j=o.quiz.filter(P=>k[P.id]===P.correct).length;if(w(j),x(!0),e&&t){const P={courseId:e,lessonId:t,score:j,total:o.quiz.length,answers:k,date:new Date().toISOString()};r(P),l(e,t)}}}};return h?a.jsx("div",{className:"loading",children:"Preparing your examination..."}):!o||o.quiz.length===0?a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"No quiz available"}),a.jsx("p",{children:"This lesson does not have a quiz."}),a.jsx(q,{to:`/course/${e}`,className:"btn btn-primary mt-lg",children:"Back to Course"})]}):a.jsxs("div",{className:"quiz-container",children:[a.jsxs("div",{className:"quiz-header",children:[a.jsxs("h1",{children:[o.title," — Quiz"]}),a.jsx("p",{className:"quiz-progress",children:v?`Score: ${y}/${o.quiz.length} (${Math.round(y/o.quiz.length*100)}%)`:`${Object.keys(d).length}/${o.quiz.length} answered`}),N&&!v&&a.jsxs("p",{className:"text-muted mt-sm",children:["Previous best: ",N.score,"/",N.total]})]}),o.quiz.map((g,E)=>a.jsx(co,{number:E+1,question:g.question,choices:g.choices,correct:g.correct,explanation:g.explanation,onAnswered:k=>p(g.id,k)},g.id)),v&&a.jsxs("div",{className:"text-center mt-xl",children:[a.jsx("p",{className:"mb-lg",style:{fontSize:"1.25rem",fontFamily:"var(--font-serif)"},children:y===o.quiz.length?"Perfect score! Exemplary scholarship.":y>=o.quiz.length*.8?"Well done, scholar. You have demonstrated understanding.":"Review the material and try again. Persistence is the path to mastery."}),u?a.jsx(q,{to:`/course/${e}/${u}`,className:"btn btn-primary",children:"Next Lesson"}):a.jsx(q,{to:`/course/${e}`,className:"btn btn-primary",children:"Return to Course"})]})]})}function zm({totalSeconds:e,onTimeUp:t,running:n}){const[r,l]=S.useState(e),i=S.useCallback(()=>{t()},[t]);S.useEffect(()=>{if(!n)return;const h=setInterval(()=>{l(m=>m<=1?(clearInterval(h),i(),0):m-1)},1e3);return()=>clearInterval(h)},[n,i]);const o=Math.floor(r/60),s=r%60,u=r/e*100;let c="timer-display";return u<20?c+=" critical":u<40&&(c+=" warning"),a.jsxs("span",{className:c,children:[String(o).padStart(2,"0"),":",String(s).padStart(2,"0")]})}function Fu({text:e}){const t=e.split(/(```[\s\S]*?```)/g);return a.jsx("div",{className:"passage-block",children:a.jsx("div",{className:"passage-content",children:t.map((n,r)=>{if(n.startsWith("```")){const l=n.match(/^```(\w*)\n?([\s\S]*?)```$/),i=l?l[2]:n.slice(3,-3);return a.jsx("pre",{children:a.jsx("code",{children:i})},r)}return n.split(/\n\n+/).map((l,i)=>a.jsx("p",{children:l},`${r}-${i}`))})})})}function $u(e,t,n){if(!t)return null;const r=e[n];return r.passageId?t[r.passageId]??null:null}function Rm(){const[e,t]=S.useState(null),[n,r]=S.useState("intro"),[l,i]=S.useState({}),[o,s]=S.useState(0),[u,c]=S.useState(!0),[h,m]=S.useState(null),{studentName:v,setStudentName:x,addCertificate:y}=fs(),[w,N]=S.useState(v);S.useEffect(()=>{fetch("/api/plsat/3.0").then(k=>k.json()).then(k=>{t(k),c(!1)}).catch(()=>c(!1))},[]);const d=S.useCallback(()=>{if(!e)return;const k=e.questions.filter(de=>l[de.id]===de.correct).length,j=e.questions.length,P=Math.round(k/j*100),M=P>=e.passThreshold*100,z={name:w||"Anonymous Scholar",score:k,total:j,percentage:P,passed:M,plsatVersion:e.version,frameworkVersion:e.frameworkVersion,date:new Date().toISOString()};m(z),y(z),w&&x(w),r("results")},[e,l,w,y,x]),f=S.useCallback(()=>{d()},[d]),p=()=>{d()},g=()=>{i({}),s(0),r("exam")},E=S.useMemo(()=>!e||n!=="exam"?null:$u(e.questions,e.passages,o),[e,n,o]);if(u)return a.jsx("div",{className:"loading",children:"The examination board is convening..."});if(!e)return a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"PLSAT Unavailable"}),a.jsx("p",{children:"Could not load the examination. Please try again."})]});if(n==="intro")return a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"plsat-intro",children:[a.jsx(pn,{size:100}),a.jsx("h1",{children:"The PLSAT"}),a.jsx("p",{className:"plsat-subtitle",children:"Paradigm Licensure Standardized Assessment Test"}),a.jsxs("p",{className:"text-muted",children:["Version ",e.version]})]}),a.jsxs("div",{className:"plsat-rules",children:[a.jsx("h3",{children:"Examination Rules"}),a.jsxs("ul",{children:[a.jsxs("li",{children:[a.jsxs("strong",{children:[e.questions.length," questions"]})," covering all aspects of the Paradigm framework"]}),a.jsxs("li",{children:[a.jsxs("strong",{children:[Math.floor(e.timeLimit/60)," minutes"]})," to complete the examination"]}),a.jsxs("li",{children:[a.jsxs("strong",{children:[e.passThreshold*100,"%"]})," required to pass and receive certification"]}),a.jsx("li",{children:"All questions are multiple choice (A through E)"}),a.jsx("li",{children:"Some questions reference a shared passage — read it carefully"}),a.jsx("li",{children:"You may navigate between questions freely"}),a.jsx("li",{children:"There is no penalty for guessing — answer every question"}),a.jsx("li",{children:"Your certificate will display the PLSAT version for posterity"})]})]}),a.jsxs("div",{className:"text-center",children:[a.jsx("div",{className:"mb-lg",children:a.jsx("input",{type:"text",className:"name-input",placeholder:"Enter your name, scholar",value:w,onChange:k=>N(k.target.value)})}),a.jsx("button",{className:"btn btn-primary btn-lg",onClick:g,children:"Begin Examination"})]})]});if(n==="exam"){const k=e.questions[o],j=Object.keys(l).length;return a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"plsat-timer",children:[a.jsx(zm,{totalSeconds:e.timeLimit,onTimeUp:f,running:!0}),a.jsxs("span",{className:"plsat-progress-text",children:["Question ",o+1," of ",e.questions.length," | ",j," answered"]})]}),a.jsxs("div",{style:{marginTop:"var(--space-lg)"},children:[E&&a.jsx(Fu,{text:E}),a.jsx(co,{number:o+1,question:k.question,scenario:k.scenario,choices:k.choices,correct:k.correct,explanation:k.explanation,selectedAnswer:l[k.id],onSelect:P=>i(M=>({...M,[k.id]:P})),showResult:!1,splitLayout:!0})]}),a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"var(--space-lg)"},children:[a.jsx("button",{className:"btn btn-secondary",disabled:o===0,onClick:()=>s(P=>P-1),children:"Previous"}),a.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[j===e.questions.length&&a.jsx("button",{className:"btn btn-gold",onClick:p,children:"Submit Examination"}),a.jsx("button",{className:"btn btn-primary",disabled:o===e.questions.length-1,onClick:()=>s(P=>P+1),children:"Next"})]})]}),a.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"4px",marginTop:"var(--space-xl)",justifyContent:"center"},children:e.questions.map((P,M)=>a.jsx("button",{onClick:()=>s(M),style:{width:28,height:28,borderRadius:"50%",border:M===o?"2px solid var(--burgundy)":"1px solid var(--parchment-dark)",background:l[P.id]?"var(--gold-bg)":"var(--cream)",color:"var(--ink)",fontSize:"0.6875rem",cursor:"pointer",fontWeight:M===o?600:400},children:M+1},P.id))})]})}return n==="results"&&h?a.jsx("div",{className:"plsat-container",children:a.jsxs("div",{className:"plsat-results",children:[a.jsx(pn,{size:80}),a.jsxs("div",{className:`score-display ${h.passed?"passed":"failed"}`,children:[h.percentage,"%"]}),a.jsx("p",{className:"verdict",children:h.passed?"Congratulations! You have passed the PLSAT.":"The examination board regrets to inform you that you did not pass."}),a.jsxs("p",{className:"text-muted mb-lg",children:["Score: ",h.score,"/",h.total," | PLSAT v",h.plsatVersion," | ",new Date(h.date).toLocaleDateString()]}),a.jsxs("div",{style:{display:"flex",gap:"1rem",justifyContent:"center"},children:[h.passed&&a.jsx(q,{to:"/certificate",className:"btn btn-gold btn-lg",children:"View Certificate"}),a.jsx("button",{className:"btn btn-secondary",onClick:()=>r("review"),children:"Review Answers"}),a.jsx("button",{className:"btn btn-primary",onClick:()=>r("intro"),children:h.passed?"Retake":"Try Again"})]})]})}):n==="review"?a.jsxs("div",{className:"plsat-container",children:[a.jsxs("div",{className:"quiz-header",children:[a.jsx("h1",{children:"PLSAT Review"}),a.jsx("p",{className:"quiz-progress",children:h?`Score: ${h.score}/${h.total} (${h.percentage}%)`:""})]}),e.questions.map((k,j)=>{const P=$u(e.questions,e.passages,j);return a.jsxs("div",{children:[P&&a.jsx(Fu,{text:P}),a.jsx(co,{number:j+1,question:k.question,scenario:k.scenario,choices:k.choices,correct:k.correct,explanation:k.explanation,selectedAnswer:l[k.id],onSelect:()=>{},showResult:!0,splitLayout:!0})]},k.id)}),a.jsx("div",{className:"text-center mt-xl",children:a.jsx("button",{className:"btn btn-primary",onClick:()=>r("results"),children:"Back to Results"})})]}):null}function Im(){const[e,t]=S.useState(null),[n,r]=S.useState(!0);return S.useEffect(()=>{fetch("/api/reference").then(l=>l.json()).then(l=>{t(l),r(!1)}).catch(()=>r(!1))},[]),n?a.jsx("div",{className:"loading",children:"Opening the reference library..."}):e?a.jsxs("div",{className:"reference-container",children:[a.jsx("h1",{className:"mb-lg",children:"Reference Library"}),e.sections.map(l=>a.jsxs("section",{className:"reference-section",children:[a.jsx("h2",{children:l.title}),a.jsx("div",{className:"reference-grid",children:l.cards.map(i=>a.jsxs("div",{className:"ref-card",children:[i.symbol&&a.jsx("div",{className:"ref-symbol",children:i.symbol}),a.jsx("h4",{children:i.name}),a.jsx("p",{children:i.description}),i.examples&&i.examples.length>0&&a.jsx("div",{className:"ref-examples",children:i.examples.map(o=>a.jsx("span",{className:"ref-example",children:o},o))}),i.logger&&a.jsx("p",{style:{marginTop:"0.5rem"},children:a.jsx("code",{children:i.logger})}),i.when&&a.jsx("p",{className:"text-muted",style:{fontSize:"0.8125rem",marginTop:"0.25rem"},children:a.jsx("em",{children:i.when})}),i.command&&a.jsx("p",{style:{marginTop:"0.5rem"},children:a.jsx("code",{children:i.command})}),i.steps&&i.steps.length>0&&a.jsx("ol",{style:{fontSize:"0.875rem",paddingLeft:"1.25rem",marginTop:"0.5rem"},children:i.steps.map((o,s)=>a.jsx("li",{style:{marginBottom:"0.25rem"},children:o},s))})]},i.id))})]},l.id))]}):a.jsxs("div",{className:"empty-state",children:[a.jsx("h3",{children:"Reference library unavailable"}),a.jsx("p",{children:"Could not load reference data."})]})}function Om(){const{certificates:e}=fs(),t=e.filter(r=>r.passed),n=t.length>0?t.reduce((r,l)=>new Date(l.date)>new Date(r.date)?l:r):null;return n?a.jsxs("div",{className:"certificate-container",children:[a.jsx("div",{className:"no-print text-center mb-lg",children:a.jsx("button",{className:"btn btn-gold",onClick:()=>window.print(),children:"Print Certificate"})}),a.jsxs("div",{className:"certificate",children:[a.jsx(pn,{size:100,className:"cert-seal"}),a.jsx("h1",{children:"Paradigm University"}),a.jsx("p",{className:"cert-title",children:"Universitas Paradigmatica — Lux in Codice"}),a.jsx("div",{className:"gold-divider"}),a.jsx("p",{style:{fontSize:"0.875rem",color:"var(--ink-muted)",marginTop:"var(--space-lg)"},children:"This is to certify that"}),a.jsx("div",{className:"cert-name",children:n.name}),a.jsxs("p",{className:"cert-body",children:["has successfully completed the",a.jsx("br",{}),a.jsx("strong",{children:"Paradigm Licensure Standardized Assessment Test"}),a.jsx("br",{}),"and is hereby recognized as a certified Paradigm practitioner."]}),a.jsxs("p",{className:"cert-score",children:["Score: ",n.score,"/",n.total," (",n.percentage,"%)"]}),a.jsx("div",{className:"gold-divider"}),a.jsxs("dl",{className:"cert-meta",children:[a.jsxs("div",{children:[a.jsx("dt",{children:"PLSAT Version"}),a.jsxs("dd",{children:["v",n.plsatVersion]})]}),a.jsxs("div",{children:[a.jsx("dt",{children:"Framework Version"}),a.jsxs("dd",{children:["v",n.frameworkVersion]})]}),a.jsxs("div",{children:[a.jsx("dt",{children:"Date Issued"}),a.jsx("dd",{children:new Date(n.date).toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"})})]})]})]}),e.length>1&&a.jsxs("div",{className:"no-print mt-xl",children:[a.jsx("h3",{className:"mb-md",children:"All Attempts"}),[...e].reverse().map((r,l)=>a.jsx("div",{className:"ref-card",style:{marginBottom:"0.5rem"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("span",{children:["PLSAT v",r.plsatVersion," — ",r.score,"/",r.total," (",r.percentage,"%)",r.passed?" ✓":""]}),a.jsx("span",{className:"text-muted",children:new Date(r.date).toLocaleDateString()})]})},l))]})]}):a.jsxs("div",{className:"certificate-container",children:[a.jsxs("div",{className:"empty-state",children:[a.jsx(pn,{size:80}),a.jsx("h3",{className:"mt-lg",children:"No Certificates Yet"}),a.jsx("p",{children:"Pass the PLSAT examination to earn your Paradigm certification."}),a.jsx(q,{to:"/plsat",className:"btn btn-primary mt-lg",children:"Take the PLSAT"})]}),e.length>0&&a.jsxs("div",{className:"mt-xl",children:[a.jsx("h3",{className:"mb-md",children:"Previous Attempts"}),e.map((r,l)=>a.jsx("div",{className:"ref-card",style:{marginBottom:"0.5rem"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("span",{children:["PLSAT v",r.plsatVersion," — ",r.score,"/",r.total," (",r.percentage,"%)"]}),a.jsx("span",{className:"text-muted",children:new Date(r.date).toLocaleDateString()})]})},l))]})]})}function Mm(){return a.jsxs("div",{className:"app",children:[a.jsx(Zh,{version:"3.10.5"}),a.jsx("main",{className:"main-content",children:a.jsxs(Bh,{children:[a.jsx(We,{path:"/",element:a.jsx(Pm,{})}),a.jsx(We,{path:"/courses",element:a.jsx(_m,{})}),a.jsx(We,{path:"/course/:courseId",element:a.jsx(Au,{})}),a.jsx(We,{path:"/course/:courseId/:lessonId",element:a.jsx(Au,{})}),a.jsx(We,{path:"/course/:courseId/quiz/:lessonId",element:a.jsx(Tm,{})}),a.jsx(We,{path:"/plsat",element:a.jsx(Rm,{})}),a.jsx(We,{path:"/reference",element:a.jsx(Im,{})}),a.jsx(We,{path:"/certificate",element:a.jsx(Om,{})})]})})]})}hi.createRoot(document.getElementById("root")).render(a.jsx(vo.StrictMode,{children:a.jsx(Gh,{children:a.jsx(Mm,{})})}));
|
|
87
|
+
//# sourceMappingURL=index-BPzqnvrg.js.map
|