popsite-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/App.jsx +95 -0
  2. package/README.md +92 -0
  3. package/components/layout/PortalHeader.jsx +18 -0
  4. package/components/layout/SystemSidebar.jsx +33 -0
  5. package/components/modules/AnalyticsDashboardModule.jsx +17 -0
  6. package/components/modules/ChatMessagingModule.jsx +17 -0
  7. package/components/modules/EcommerceStoreModule.jsx +17 -0
  8. package/components/modules/EventTicketBookingModule.jsx +17 -0
  9. package/components/modules/FlightBookingModule.jsx +17 -0
  10. package/components/modules/FoodOrderingModule.jsx +17 -0
  11. package/components/modules/HospitalAppointmentModule.jsx +17 -0
  12. package/components/modules/HotelBookingModule.jsx +17 -0
  13. package/components/modules/InvoiceBillingModule.jsx +17 -0
  14. package/components/modules/LibraryManagementModule.jsx +17 -0
  15. package/components/modules/ModuleContentDeck.jsx +44 -0
  16. package/components/modules/MovieBookingModule.jsx +17 -0
  17. package/components/modules/QuizExamModule.jsx +17 -0
  18. package/components/modules/StudentRegistrationModule.jsx +17 -0
  19. package/components/modules/SystemModuleRenderer.jsx +19 -0
  20. package/components/modules/SystemModuleTemplate.jsx +62 -0
  21. package/components/modules/SystemVisualWidget.jsx +123 -0
  22. package/components/modules/moduleContentMap.js +238 -0
  23. package/components/modules/moduleEnhancementsMap.js +439 -0
  24. package/components/modules/systemModuleMap.js +31 -0
  25. package/components/system/DynamicSystemForm.jsx +154 -0
  26. package/components/system/SystemHero.jsx +21 -0
  27. package/components/system/SystemSummaryCard.jsx +53 -0
  28. package/data/systems/analyticsDashboard.js +48 -0
  29. package/data/systems/chatMessaging.js +43 -0
  30. package/data/systems/ecommerceStore.js +50 -0
  31. package/data/systems/eventTicketBooking.js +50 -0
  32. package/data/systems/flightBooking.js +38 -0
  33. package/data/systems/foodOrdering.js +48 -0
  34. package/data/systems/hospitalAppointment.js +50 -0
  35. package/data/systems/hotelBooking.js +38 -0
  36. package/data/systems/index.js +31 -0
  37. package/data/systems/invoiceBilling.js +50 -0
  38. package/data/systems/libraryManagement.js +43 -0
  39. package/data/systems/movieBooking.js +48 -0
  40. package/data/systems/quizExam.js +38 -0
  41. package/data/systems/studentRegistration.js +43 -0
  42. package/dist/popsite-ui.es.js +4368 -0
  43. package/dist/popsite-ui.umd.js +60 -0
  44. package/dist/style.css +1 -0
  45. package/index.html +13 -0
  46. package/library/index.js +20 -0
  47. package/main.jsx +15 -0
  48. package/package.json +40 -0
  49. package/src/App.jsx +12 -0
  50. package/src/components/modules/AnalyticsDashboardModule.jsx +224 -0
  51. package/src/components/modules/ChatMessagingModule.jsx +294 -0
  52. package/src/components/modules/EcommerceStoreModule.jsx +405 -0
  53. package/src/components/modules/EventTicketBookingModule.jsx +253 -0
  54. package/src/components/modules/FlightBookingModule.jsx +399 -0
  55. package/src/components/modules/FoodOrderingModule.jsx +316 -0
  56. package/src/components/modules/HospitalAppointmentModule.jsx +267 -0
  57. package/src/components/modules/HotelBookingModule.jsx +317 -0
  58. package/src/components/modules/InvoiceBillingModule.jsx +302 -0
  59. package/src/components/modules/LandingPageModule.jsx +185 -0
  60. package/src/components/modules/LibraryManagementModule.jsx +189 -0
  61. package/src/components/modules/MovieBookingModule.jsx +337 -0
  62. package/src/components/modules/QuizExamModule.jsx +255 -0
  63. package/src/components/modules/StudentRegistrationModule.jsx +292 -0
  64. package/src/components/system/SystemHero.jsx +44 -0
  65. package/src/components/system/SystemSummaryCard.jsx +29 -0
  66. package/src/components/system/Toast.jsx +69 -0
  67. package/src/data/systems/analyticsDashboard.js +32 -0
  68. package/src/data/systems/chatMessaging.js +59 -0
  69. package/src/data/systems/ecommerceStore.js +84 -0
  70. package/src/data/systems/eventBooking.js +33 -0
  71. package/src/data/systems/flightBooking.js +59 -0
  72. package/src/data/systems/foodOrdering.js +48 -0
  73. package/src/data/systems/hospitalAppointment.js +48 -0
  74. package/src/data/systems/hotelBooking.js +59 -0
  75. package/src/data/systems/invoiceBilling.js +19 -0
  76. package/src/data/systems/landingPage.js +29 -0
  77. package/src/data/systems/libraryManagement.js +17 -0
  78. package/src/data/systems/movieBooking.js +49 -0
  79. package/src/data/systems/quizExam.js +31 -0
  80. package/src/data/systems/studentRegistration.js +9 -0
  81. package/src/index.js +22 -0
  82. package/src/main.jsx +10 -0
  83. package/src/styles.css +296 -0
  84. package/styles.css +820 -0
  85. package/utils/systemEngine.js +128 -0
  86. package/vite.config.js +8 -0
  87. package/vite.lib.config.js +27 -0
package/App.jsx ADDED
@@ -0,0 +1,95 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import PortalHeader from './components/layout/PortalHeader';
3
+ import SystemSidebar from './components/layout/SystemSidebar';
4
+ import SystemModuleRenderer from './components/modules/SystemModuleRenderer';
5
+ import systems from './data/systems';
6
+ import { buildSubmissionRecord } from './utils/systemEngine';
7
+ import './styles.css';
8
+
9
+ const getThemeVariables = (system) => {
10
+ if (!system) {
11
+ return {};
12
+ }
13
+
14
+ const isDarkTheme = system.appearance === 'dark';
15
+
16
+ return {
17
+ '--primary': system.primary,
18
+ '--surface': isDarkTheme ? '#121722' : '#ffffff',
19
+ '--surface-soft': isDarkTheme ? '#171f2d' : '#f8fafc',
20
+ '--surface-elevated': isDarkTheme ? '#1f2937' : '#ffffff',
21
+ '--text-main': isDarkTheme ? '#ecf2ff' : '#0f172a',
22
+ '--text-muted': isDarkTheme ? '#a9b7d0' : '#4b5563',
23
+ '--border-soft': isDarkTheme ? 'rgba(134, 156, 192, 0.25)' : 'rgba(148, 163, 184, 0.35)',
24
+ '--shadow-soft': isDarkTheme ? '0 16px 38px rgba(2, 6, 23, 0.45)' : '0 14px 34px rgba(15, 23, 42, 0.12)',
25
+ '--bg-layer': isDarkTheme
26
+ ? `radial-gradient(circle at 12% 12%, ${system.primary}33 0%, transparent 42%), linear-gradient(128deg, #06090f 0%, #101827 100%)`
27
+ : `radial-gradient(circle at 16% 8%, ${system.primary}22 0%, transparent 38%), linear-gradient(130deg, #f8fbff 0%, #eef3fb 100%)`
28
+ };
29
+ };
30
+
31
+ function App() {
32
+ const [activeSystemId, setActiveSystemId] = useState(systems[0]?.id ?? '');
33
+ const [recordsBySystem, setRecordsBySystem] = useState({});
34
+
35
+ const activeSystem = useMemo(() => {
36
+ return systems.find((system) => system.id === activeSystemId) ?? systems[0] ?? null;
37
+ }, [activeSystemId]);
38
+
39
+ const activeRecord = activeSystem ? recordsBySystem[activeSystem.id] : null;
40
+ const themeVariables = useMemo(() => getThemeVariables(activeSystem), [activeSystem]);
41
+
42
+ const handleSystemSubmit = (formData) => {
43
+ if (!activeSystem) {
44
+ return;
45
+ }
46
+
47
+ const submissionRecord = buildSubmissionRecord(activeSystem, formData);
48
+
49
+ setRecordsBySystem((previousRecords) => ({
50
+ ...previousRecords,
51
+ [activeSystem.id]: submissionRecord
52
+ }));
53
+ };
54
+
55
+ if (!activeSystem) {
56
+ return (
57
+ <div className="app-shell" style={themeVariables}>
58
+ <main className="workspace-column">
59
+ <section className="empty-state">
60
+ <h3>No systems configured</h3>
61
+ <p>Add at least one system definition inside data/systems to start rendering templates.</p>
62
+ </section>
63
+ </main>
64
+ </div>
65
+ );
66
+ }
67
+
68
+ return (
69
+ <div className="app-shell" style={themeVariables}>
70
+ <PortalHeader activeSystem={activeSystem} totalSystems={systems.length} />
71
+
72
+ <main className="app-layout">
73
+ <SystemSidebar
74
+ systems={systems}
75
+ activeSystemId={activeSystem.id}
76
+ onSelectSystem={setActiveSystemId}
77
+ />
78
+
79
+ <section className="workspace-column">
80
+ <SystemModuleRenderer
81
+ system={activeSystem}
82
+ record={activeRecord}
83
+ onSubmit={handleSystemSubmit}
84
+ />
85
+ </section>
86
+ </main>
87
+
88
+ <footer className="portal-footer-note">
89
+ <p>Designed for multi-domain demos with independent themes, forms, and summaries.</p>
90
+ </footer>
91
+ </div>
92
+ );
93
+ }
94
+
95
+ export default App;
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # Multi Domain Booking Portal
2
+
3
+ A React component library with themed booking and management workflows.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install multi-domain-booking-portal react react-dom
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```jsx
14
+ import { App } from "multi-domain-booking-portal";
15
+ import "multi-domain-booking-portal/styles.css";
16
+
17
+ function Demo() {
18
+ return <App />;
19
+ }
20
+
21
+ export default Demo;
22
+ ```
23
+
24
+ ## Exports
25
+
26
+ - `App` and `MultiDomainBookingPortal`
27
+ - `systems`
28
+ - `PortalHeader`, `SystemSidebar`
29
+ - `SystemHero`, `DynamicSystemForm`, `SystemSummaryCard`
30
+ - `SystemModuleRenderer`, `systemModuleMap`
31
+ - `ModuleContentDeck`, `moduleContentMap`
32
+ - utilities from `systemEngine`
33
+
34
+ ## Customizing Module Content
35
+
36
+ The package ships with content definitions in `components/modules/moduleContentMap.js`.
37
+
38
+ Each system key (`movie-booking`, `flight-booking`, etc.) supports:
39
+
40
+ - `overview`: short module description
41
+ - `quickStats`: array of `{ label, value }`
42
+ - `workflowSteps`: ordered list of operational steps
43
+ - `policyNotes`: list of policy/ops notes
44
+
45
+ Example shape:
46
+
47
+ ```js
48
+ {
49
+ 'movie-booking': {
50
+ overview: 'Cinema module description',
51
+ quickStats: [
52
+ { label: 'Peak Throughput', value: '2.1k bookings/hr' }
53
+ ],
54
+ workflowSteps: ['Step 1', 'Step 2'],
55
+ policyNotes: ['Policy A', 'Policy B']
56
+ }
57
+ }
58
+ ```
59
+
60
+ ## Visual Widgets and Presets
61
+
62
+ Per-system widgets and sample form presets are managed in `components/modules/moduleEnhancementsMap.js`.
63
+
64
+ Each system can define:
65
+
66
+ - `widget`: visual block config
67
+ - `presets`: sample form data buttons rendered above the form
68
+
69
+ Supported widget types:
70
+
71
+ - `seat-map`
72
+ - `route-timeline`
73
+ - `occupancy-meter`
74
+ - `kpi-spark-cards`
75
+
76
+ Each module form includes:
77
+
78
+ - Preset apply buttons
79
+ - `Reset Form` button (restores defaults)
80
+
81
+ ## Scripts
82
+
83
+ - `npm run dev` - run local demo app
84
+ - `npm run build` - build demo app output
85
+ - `npm run build:lib` - build npm library output
86
+
87
+ ## Publish
88
+
89
+ ```bash
90
+ npm login
91
+ npm publish --access public
92
+ ```
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+
3
+ function PortalHeader({ activeSystem, totalSystems }) {
4
+ return (
5
+ <header className="portal-header">
6
+ <p className="eyebrow">Scalable Product UI Collection</p>
7
+ <h1>{activeSystem.title}</h1>
8
+ <p className="header-description">{activeSystem.description}</p>
9
+ <div className="header-meta">
10
+ <span>{activeSystem.uiStyle}</span>
11
+ <span>{totalSystems} systems available</span>
12
+ <span>Primary color: {activeSystem.primary}</span>
13
+ </div>
14
+ </header>
15
+ );
16
+ }
17
+
18
+ export default PortalHeader;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+
3
+ function SystemSidebar({ systems, activeSystemId, onSelectSystem }) {
4
+ return (
5
+ <aside className="system-sidebar">
6
+ <h2>System Library</h2>
7
+ <p>Choose a product pattern to load its dedicated interface and workflow.</p>
8
+
9
+ <div className="system-list">
10
+ {systems.map((system) => {
11
+ const isActive = system.id === activeSystemId;
12
+
13
+ return (
14
+ <button
15
+ key={system.id}
16
+ type="button"
17
+ onClick={() => onSelectSystem(system.id)}
18
+ className={`system-button ${isActive ? 'active' : ''}`}
19
+ >
20
+ <span className="color-chip" style={{ backgroundColor: system.primary }} />
21
+ <span className="button-content">
22
+ <strong>{system.title}</strong>
23
+ <small>{system.uiStyle}</small>
24
+ </span>
25
+ </button>
26
+ );
27
+ })}
28
+ </div>
29
+ </aside>
30
+ );
31
+ }
32
+
33
+ export default SystemSidebar;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import analyticsDashboardSystem from '../../data/systems/analyticsDashboard';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function AnalyticsDashboardModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={analyticsDashboardSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Data-heavy analytics module for source volume, analyst seats, and refresh setup."
12
+ emptyHint="Select dashboard setup values to generate your platform usage estimate."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default AnalyticsDashboardModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import chatMessagingSystem from '../../data/systems/chatMessaging';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function ChatMessagingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={chatMessagingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="WhatsApp Web inspired module for workspace setup, seats, and support planning."
12
+ emptyHint="Configure user seats and plan tier to preview subscription totals."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default ChatMessagingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import ecommerceStoreSystem from '../../data/systems/ecommerceStore';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function EcommerceStoreModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={ecommerceStoreSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Amazon-style commerce module for category selection, quantity, and checkout plans."
12
+ emptyHint="Choose product plan and quantity to create your order total summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default EcommerceStoreModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import eventTicketBookingSystem from '../../data/systems/eventTicketBooking';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function EventTicketBookingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={eventTicketBookingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Dark event module for conferences, concerts, and access-zone ticketing."
12
+ emptyHint="Select event and access zone to build your attendee confirmation summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default EventTicketBookingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import flightBookingSystem from '../../data/systems/flightBooking';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function FlightBookingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={flightBookingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Clean travel booking module for routes, passengers, and cabin class plans."
12
+ emptyHint="Pick route and cabin class details to generate your flight quote."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default FlightBookingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import foodOrderingSystem from '../../data/systems/foodOrdering';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function FoodOrderingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={foodOrderingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Swiggy-style ordering module focused on speed, items, and delivery mode."
12
+ emptyHint="Choose restaurant, items, and delivery type to generate order pricing."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default FoodOrderingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import hospitalAppointmentSystem from '../../data/systems/hospitalAppointment';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function HospitalAppointmentModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={hospitalAppointmentSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Medical booking module for department routing, consultation mode, and appointments."
12
+ emptyHint="Enter patient and consultation details to generate appointment billing."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default HospitalAppointmentModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import hotelBookingSystem from '../../data/systems/hotelBooking';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function HotelBookingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={hotelBookingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Hospitality-first module designed for stay duration, room type, and guest details."
12
+ emptyHint="Add stay and room details to generate a complete reservation summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default HotelBookingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import invoiceBillingSystem from '../../data/systems/invoiceBilling';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function InvoiceBillingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={invoiceBillingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="FreshBooks-style billing module for client invoicing, units, and plan-tier costing."
12
+ emptyHint="Add billable units and plan type to generate an invoice-ready total."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default InvoiceBillingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import libraryManagementSystem from '../../data/systems/libraryManagement';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function LibraryManagementModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={libraryManagementSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Admin-panel style module for library issue flow, membership, and usage charges."
12
+ emptyHint="Set member and borrow details to generate the library service summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default LibraryManagementModule;
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+
3
+ function ModuleContentDeck({ overview, quickStats = [], workflowSteps = [], policyNotes = [] }) {
4
+ return (
5
+ <section className="module-content-grid">
6
+ <article className="module-panel module-overview">
7
+ <h4>Module Overview</h4>
8
+ <p>{overview}</p>
9
+ </article>
10
+
11
+ <article className="module-panel">
12
+ <h4>Quick Stats</h4>
13
+ <ul className="module-list">
14
+ {quickStats.map((item) => (
15
+ <li key={item.label}>
16
+ <span>{item.label}</span>
17
+ <strong>{item.value}</strong>
18
+ </li>
19
+ ))}
20
+ </ul>
21
+ </article>
22
+
23
+ <article className="module-panel">
24
+ <h4>Workflow Steps</h4>
25
+ <ol className="module-steps">
26
+ {workflowSteps.map((step) => (
27
+ <li key={step}>{step}</li>
28
+ ))}
29
+ </ol>
30
+ </article>
31
+
32
+ <article className="module-panel">
33
+ <h4>Policy and Notes</h4>
34
+ <ul className="module-policies">
35
+ {policyNotes.map((note) => (
36
+ <li key={note}>{note}</li>
37
+ ))}
38
+ </ul>
39
+ </article>
40
+ </section>
41
+ );
42
+ }
43
+
44
+ export default ModuleContentDeck;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import movieBookingSystem from '../../data/systems/movieBooking';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function MovieBookingModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={movieBookingSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Dark cinema-focused module with fast seat and showtime selection."
12
+ emptyHint="Choose movie, date, and seat tier to generate a booking summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default MovieBookingModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import quizExamSystem from '../../data/systems/quizExam';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function QuizExamModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={quizExamSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="Test-taking module for exam setup, candidate volume, and proctoring mode."
12
+ emptyHint="Enter assessment details to generate your exam operation summary."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default QuizExamModule;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import studentRegistrationSystem from '../../data/systems/studentRegistration';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function StudentRegistrationModule({ record, onSubmit }) {
6
+ return (
7
+ <SystemModuleTemplate
8
+ system={studentRegistrationSystem}
9
+ record={record}
10
+ onSubmit={onSubmit}
11
+ intro="University portal module for enrollment, academic track, and semester billing."
12
+ emptyHint="Fill student and enrollment type details to generate registration output."
13
+ />
14
+ );
15
+ }
16
+
17
+ export default StudentRegistrationModule;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import systemModuleMap from './systemModuleMap';
3
+ import SystemModuleTemplate from './SystemModuleTemplate';
4
+
5
+ function SystemModuleRenderer({ system, record, onSubmit }) {
6
+ if (!system) {
7
+ return null;
8
+ }
9
+
10
+ const SpecificModule = systemModuleMap[system.id];
11
+
12
+ if (SpecificModule) {
13
+ return <SpecificModule record={record} onSubmit={onSubmit} />;
14
+ }
15
+
16
+ return <SystemModuleTemplate system={system} record={record} onSubmit={onSubmit} />;
17
+ }
18
+
19
+ export default SystemModuleRenderer;
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+ import SystemHero from '../system/SystemHero';
3
+ import DynamicSystemForm from '../system/DynamicSystemForm';
4
+ import SystemSummaryCard from '../system/SystemSummaryCard';
5
+ import ModuleContentDeck from './ModuleContentDeck';
6
+ import moduleContentMap from './moduleContentMap';
7
+ import moduleEnhancementsMap from './moduleEnhancementsMap';
8
+ import SystemVisualWidget from './SystemVisualWidget';
9
+
10
+ function SystemModuleTemplate({
11
+ system,
12
+ record,
13
+ onSubmit,
14
+ intro,
15
+ emptyHint,
16
+ overview,
17
+ quickStats,
18
+ workflowSteps,
19
+ policyNotes
20
+ }) {
21
+ const safeSubmit = typeof onSubmit === 'function' ? onSubmit : () => { };
22
+ const defaultContent = moduleContentMap[system.id] || {};
23
+ const enhancements = moduleEnhancementsMap[system.id] || {};
24
+
25
+ return (
26
+ <>
27
+ <SystemHero system={system} />
28
+
29
+ {intro ? (
30
+ <section className="module-intro">
31
+ <p>{intro}</p>
32
+ </section>
33
+ ) : null}
34
+
35
+ <ModuleContentDeck
36
+ overview={overview || defaultContent.overview || system.description}
37
+ quickStats={quickStats || defaultContent.quickStats || []}
38
+ workflowSteps={workflowSteps || defaultContent.workflowSteps || []}
39
+ policyNotes={policyNotes || defaultContent.policyNotes || []}
40
+ />
41
+
42
+ <SystemVisualWidget widget={enhancements.widget} />
43
+
44
+ <DynamicSystemForm
45
+ system={system}
46
+ onSubmit={safeSubmit}
47
+ presets={enhancements.presets || []}
48
+ />
49
+
50
+ {record ? (
51
+ <SystemSummaryCard system={system} record={record} />
52
+ ) : (
53
+ <section className="empty-state">
54
+ <h3>Ready to generate</h3>
55
+ <p>{emptyHint || `Fill out the ${system.title} form to generate an output summary.`}</p>
56
+ </section>
57
+ )}
58
+ </>
59
+ );
60
+ }
61
+
62
+ export default SystemModuleTemplate;