Hma47 commited on
Commit
b6291c9
·
verified ·
1 Parent(s): 4d83318

Upload 4 files

Browse files
Apache License.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2025 Shift Mind AI Labs
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
README.md ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: "🏛️ GovernanceFramework Pro – Advanced AI Policy & Compliance Management"
3
+ emoji: "🏛️"
4
+ colorFrom: "red"
5
+ colorTo: "yellow"
6
+ sdk: "static"
7
+ sdk_version: "0.1.0"
8
+ app_file: "index.html"
9
+ pinned: false
10
+ ---
11
+
12
+ # 🏛️ GovernanceFramework Pro – Advanced AI Policy & Compliance Management
13
+ **Developed by Shift Mind AI Labs**
14
+
15
+ GovernanceFramework Pro is an open-source, privacy-first platform for creating comprehensive, multilingual AI governance frameworks for educational institutions. This platform guides users step-by-step in designing responsible, policy-aligned, and ethical AI adoption—covering mission, structure, ethics, data privacy, compliance, and stakeholder engagement.
16
+
17
+ ---
18
+
19
+ ## 🚀 Features
20
+
21
+ - **Full Governance Framework Generation:**
22
+ Structure and draft all sections of an AI policy for schools or educational organizations.
23
+ - **Custom Scenario Input:**
24
+ Tailor every policy detail to your institution’s goals, values, and regulations.
25
+ - **Multilingual UI & Output:**
26
+ Supports 80+ languages (OpenAI API required, processed locally).
27
+ - **Compliance Focused:**
28
+ Aligned to international standards—GDPR, FERPA, and responsible AI guidelines.
29
+ - **Modern UI:**
30
+ Accessible, mobile-ready, color-coded, and RTL/LTR compatible.
31
+ - **Privacy-First:**
32
+ No login, no cloud storage—your API key and input never leave your device.
33
+
34
+ ---
35
+
36
+ ## 🛠 How to Use
37
+
38
+ 1. **Open the tool** (local HTML or Hugging Face Space).
39
+ 2. **Select your language** and enter your OpenAI API key (never leaves your browser).
40
+ 3. **Enter your institution’s name** and answer structured questions for each governance section.
41
+ 4. **Click “Generate AI Governance Framework”**.
42
+ 5. **Review and copy** your tailored policy framework, ready for editing, review, or direct adoption.
43
+ 6. **Switch languages or clear translation cache** as needed.
44
+
45
+ ---
46
+
47
+ ## 👩‍🏫 For Teachers & School Leaders
48
+
49
+ - **AI Policy Building:**
50
+ Use with school teams to collaboratively draft comprehensive, responsible AI adoption policies.
51
+ - **Professional Development:**
52
+ Train staff on governance, compliance, and ethical AI integration.
53
+ - **Digital Citizenship:**
54
+ Develop classroom-ready policy modules on privacy, equity, and responsible use.
55
+ - **Stakeholder Engagement:**
56
+ Involve parents, students, and community members in policy co-creation.
57
+
58
+ ---
59
+
60
+ ## 👨‍🎓 For Students
61
+
62
+ - **Project-Based Learning:**
63
+ Research, critique, or create school AI policy as part of STEM, civics, or digital ethics assignments.
64
+ - **Real-World Application:**
65
+ Experience how responsible technology policy is developed and implemented.
66
+ - **Group Work:**
67
+ Collaboratively analyze, debate, and draft policies for different scenarios.
68
+
69
+ ---
70
+
71
+ ## 🔐 Data Privacy
72
+
73
+ - Your API key and all content **never leave your device**.
74
+ - No data is sent to Shift Mind AI Labs, Hugging Face, or any third party.
75
+
76
+ ---
77
+
78
+ ## 📄 License
79
+
80
+ Licensed under the [Apache License 2.0](./LICENSE).
81
+
82
+ ---
83
+
84
+ ## 🧠 About Shift Mind AI Labs
85
+
86
+ Shift Mind AI Labs creates open-source, ethical AI tools for education, policy, and digital transformation.
87
+
88
+ 🌐 https://www.shiftmind.io
89
+ ✉️ info@shiftmind.io
90
+
91
+ ---
92
+
93
+ ## 🙌 Contributing
94
+
95
+ Pull requests, policy templates, and pilots welcome!
96
+ For district, ministry, or research pilots: **info@shiftmind.io**
97
+
98
+ ---
99
+
100
+ *Empowering every school and learner to build safe, transparent, and equitable AI governance—globally and locally.*
index.html ADDED
@@ -0,0 +1,1912 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="ltr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>GovernanceFramework Pro - Advanced AI Policy & Compliance</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
10
+
11
+ <style>
12
+ /* CSS Reset and Base Styles */
13
+ *, *::before, *::after {
14
+ box-sizing: border-box;
15
+ margin: 0;
16
+ padding: 0;
17
+ }
18
+
19
+ /* CSS Custom Properties */
20
+ :root {
21
+ /* Color System - Governance/Policy theme */
22
+ --color-primary: #6366f1;
23
+ --color-primary-hover: #5b21b6;
24
+ --color-secondary: #8b5cf6;
25
+ --color-accent: #a855f7;
26
+ --color-success: #10b981;
27
+ --color-warning: #f59e0b;
28
+ --color-error: #ef4444;
29
+
30
+ /* Neutral Colors - Light Mode */
31
+ --color-background: #f8fafc;
32
+ --color-surface: #ffffff;
33
+ --color-surface-elevated: #ffffff;
34
+ --color-border: #e2e8f0;
35
+ --color-border-focus: #6366f1;
36
+ --color-text-primary: #1e293b;
37
+ --color-text-secondary: #64748b;
38
+ --color-text-muted: #94a3b8;
39
+
40
+ /* Typography */
41
+ --font-family-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
42
+
43
+ /* Optimized Spacing System */
44
+ --spacing-xs: 0.25rem;
45
+ --spacing-sm: 0.5rem;
46
+ --spacing-md: 0.75rem;
47
+ --spacing-lg: 1rem;
48
+ --spacing-xl: 1.25rem;
49
+ --spacing-2xl: 1.5rem;
50
+ --spacing-3xl: 2rem;
51
+
52
+ /* Border Radius */
53
+ --radius-sm: 0.375rem;
54
+ --radius-md: 0.5rem;
55
+ --radius-lg: 0.75rem;
56
+ --radius-xl: 1rem;
57
+
58
+ /* Shadows */
59
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
60
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
61
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
62
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
63
+
64
+ /* Transitions */
65
+ --transition-fast: 150ms ease-in-out;
66
+ --transition-normal: 250ms ease-in-out;
67
+ --transition-slow: 350ms ease-in-out;
68
+
69
+ /* Layout */
70
+ --container-max-width: 1400px;
71
+ --content-max-width: 1200px;
72
+ }
73
+
74
+ /* RTL Support */
75
+ [dir="rtl"] {
76
+ text-align: right;
77
+ }
78
+
79
+ [dir="rtl"] .app-container {
80
+ direction: rtl;
81
+ }
82
+
83
+ [dir="rtl"] .api-key-compact {
84
+ left: auto;
85
+ right: var(--spacing-lg);
86
+ }
87
+
88
+ [dir="rtl"] .language-switcher {
89
+ right: auto;
90
+ left: var(--spacing-lg);
91
+ }
92
+
93
+ /* Dark Mode Support */
94
+ @media (prefers-color-scheme: dark) {
95
+ :root {
96
+ --color-background: #0f172a;
97
+ --color-surface: #1e293b;
98
+ --color-surface-elevated: #334155;
99
+ --color-border: #334155;
100
+ --color-text-primary: #f1f5f9;
101
+ --color-text-secondary: #cbd5e1;
102
+ --color-text-muted: #94a3b8;
103
+ }
104
+ }
105
+
106
+ /* Base Styles */
107
+ html {
108
+ font-size: 16px;
109
+ line-height: 1.5;
110
+ scroll-behavior: smooth;
111
+ }
112
+
113
+ body {
114
+ font-family: var(--font-family-primary);
115
+ background: linear-gradient(135deg, var(--color-background) 0%, #e2e8f0 100%);
116
+ color: var(--color-text-primary);
117
+ line-height: 1.6;
118
+ -webkit-font-smoothing: antialiased;
119
+ -moz-osx-font-smoothing: grayscale;
120
+ min-height: 100vh;
121
+ transition: all 0.3s ease;
122
+ padding: 15px;
123
+ }
124
+
125
+ /* Progress Bar */
126
+ .progress-bar {
127
+ position: fixed;
128
+ top: 0;
129
+ left: 0;
130
+ height: 4px;
131
+ background: var(--color-primary);
132
+ transition: width 0.3s ease;
133
+ z-index: 1000;
134
+ }
135
+
136
+ /* Language Selection Landing */
137
+ .language-landing {
138
+ display: block;
139
+ max-width: 600px;
140
+ margin: 50px auto;
141
+ background: var(--color-surface);
142
+ border-radius: var(--radius-xl);
143
+ box-shadow: var(--shadow-lg);
144
+ padding: 40px;
145
+ text-align: center;
146
+ }
147
+
148
+ .language-landing h1 {
149
+ font-size: 2.5rem;
150
+ font-weight: 800;
151
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
152
+ -webkit-background-clip: text;
153
+ -webkit-text-fill-color: transparent;
154
+ background-clip: text;
155
+ margin-bottom: 15px;
156
+ }
157
+
158
+ .language-landing p {
159
+ font-size: 1.1rem;
160
+ color: var(--color-text-secondary);
161
+ margin-bottom: 30px;
162
+ }
163
+
164
+ .language-selector {
165
+ margin-bottom: 25px;
166
+ }
167
+
168
+ .language-selector label {
169
+ display: block;
170
+ margin-bottom: 10px;
171
+ font-weight: 600;
172
+ color: var(--color-text-primary);
173
+ font-size: 1.1rem;
174
+ }
175
+
176
+ .language-selector select {
177
+ width: 100%;
178
+ padding: 15px 20px;
179
+ border: 2px solid var(--color-border);
180
+ border-radius: var(--radius-lg);
181
+ font-size: 1.1rem;
182
+ font-family: inherit;
183
+ background: var(--color-surface);
184
+ transition: all 0.2s ease;
185
+ margin-bottom: 20px;
186
+ }
187
+
188
+ .language-selector select:focus {
189
+ outline: none;
190
+ border-color: var(--color-border-focus);
191
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
192
+ }
193
+
194
+ .api-key-landing {
195
+ margin-bottom: 25px;
196
+ }
197
+
198
+ .api-key-landing label {
199
+ display: block;
200
+ margin-bottom: 10px;
201
+ font-weight: 600;
202
+ color: var(--color-text-primary);
203
+ font-size: 1.1rem;
204
+ }
205
+
206
+ .api-key-landing input {
207
+ width: 100%;
208
+ padding: 15px 20px;
209
+ border: 2px solid var(--color-border);
210
+ border-radius: var(--radius-lg);
211
+ font-size: 1.1rem;
212
+ background: var(--color-surface);
213
+ transition: all 0.2s ease;
214
+ font-family: 'Courier New', monospace;
215
+ }
216
+
217
+ .api-key-landing input:focus {
218
+ outline: none;
219
+ border-color: var(--color-border-focus);
220
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
221
+ }
222
+
223
+ .start-btn {
224
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
225
+ color: white;
226
+ padding: 18px 40px;
227
+ border: none;
228
+ border-radius: var(--radius-lg);
229
+ font-size: 1.2rem;
230
+ font-weight: 700;
231
+ cursor: pointer;
232
+ transition: all 0.3s ease;
233
+ width: 100%;
234
+ }
235
+
236
+ .start-btn:hover {
237
+ transform: translateY(-2px);
238
+ box-shadow: 0 12px 24px -8px rgba(99, 102, 241, 0.4);
239
+ }
240
+
241
+ .start-btn:disabled {
242
+ opacity: 0.7;
243
+ cursor: not-allowed;
244
+ transform: none;
245
+ }
246
+
247
+ /* Cache Management Section */
248
+ .cache-management {
249
+ background: rgba(99, 102, 241, 0.05);
250
+ border: 1px solid rgba(99, 102, 241, 0.1);
251
+ border-radius: var(--radius-lg);
252
+ padding: 20px;
253
+ margin-bottom: 25px;
254
+ text-align: center;
255
+ }
256
+
257
+ .cache-management h3 {
258
+ color: var(--color-primary);
259
+ margin-bottom: 15px;
260
+ font-size: 1.1rem;
261
+ font-weight: 600;
262
+ }
263
+
264
+ .cache-status-display {
265
+ background: rgba(16, 185, 129, 0.1);
266
+ border: 1px solid rgba(16, 185, 129, 0.2);
267
+ color: var(--color-success);
268
+ padding: 12px 16px;
269
+ border-radius: var(--radius-md);
270
+ margin-bottom: 15px;
271
+ font-size: 0.9rem;
272
+ font-weight: 500;
273
+ }
274
+
275
+ .cache-status-display.no-cache {
276
+ background: rgba(100, 116, 139, 0.1);
277
+ border-color: rgba(100, 116, 139, 0.2);
278
+ color: var(--color-text-secondary);
279
+ }
280
+
281
+ .clear-cache-btn {
282
+ background: linear-gradient(135deg, var(--color-warning) 0%, #f59e0b 100%);
283
+ color: white;
284
+ padding: 12px 24px;
285
+ border: none;
286
+ border-radius: var(--radius-md);
287
+ font-size: 0.9rem;
288
+ font-weight: 600;
289
+ cursor: pointer;
290
+ transition: all 0.3s ease;
291
+ }
292
+
293
+ .clear-cache-btn:hover {
294
+ transform: translateY(-1px);
295
+ box-shadow: 0 6px 12px -4px rgba(245, 158, 11, 0.4);
296
+ }
297
+
298
+ .clear-cache-btn:disabled {
299
+ opacity: 0.5;
300
+ cursor: not-allowed;
301
+ transform: none;
302
+ }
303
+
304
+ /* Cache Status Indicator */
305
+ .cache-status {
306
+ background: rgba(16, 185, 129, 0.1);
307
+ border: 1px solid rgba(16, 185, 129, 0.2);
308
+ color: var(--color-success);
309
+ padding: 8px 12px;
310
+ border-radius: var(--radius-sm);
311
+ margin-bottom: 15px;
312
+ font-size: 0.85rem;
313
+ text-align: center;
314
+ font-weight: 500;
315
+ display: none;
316
+ }
317
+
318
+ .cache-status.cached {
319
+ display: block;
320
+ }
321
+
322
+ .cache-status.translating {
323
+ background: rgba(99, 102, 241, 0.1);
324
+ border-color: rgba(99, 102, 241, 0.2);
325
+ color: var(--color-primary);
326
+ }
327
+
328
+ /* Translation Loading Overlay */
329
+ .translation-overlay {
330
+ position: fixed;
331
+ top: 0;
332
+ left: 0;
333
+ width: 100%;
334
+ height: 100%;
335
+ background: rgba(99, 102, 241, 0.9);
336
+ display: none;
337
+ justify-content: center;
338
+ align-items: center;
339
+ z-index: 10000;
340
+ color: white;
341
+ text-align: center;
342
+ }
343
+
344
+ .translation-content {
345
+ background: rgba(255, 255, 255, 0.1);
346
+ padding: 40px;
347
+ border-radius: var(--radius-xl);
348
+ backdrop-filter: blur(10px);
349
+ }
350
+
351
+ .translation-spinner {
352
+ width: 50px;
353
+ height: 50px;
354
+ border: 4px solid rgba(255, 255, 255, 0.3);
355
+ border-radius: 50%;
356
+ border-top-color: white;
357
+ animation: spin 1s ease-in-out infinite;
358
+ margin: 0 auto 20px;
359
+ }
360
+
361
+ /* Main Application (Hidden Initially) */
362
+ .main-app {
363
+ display: none;
364
+ }
365
+
366
+ /* Layout Components */
367
+ .app-container {
368
+ max-width: var(--container-max-width);
369
+ margin: 0 auto;
370
+ background: var(--color-surface);
371
+ border-radius: 16px;
372
+ box-shadow: var(--shadow-lg);
373
+ overflow: hidden;
374
+ position: relative;
375
+ }
376
+
377
+ /* Language Switcher in Main App */
378
+ .language-switcher {
379
+ position: absolute;
380
+ top: var(--spacing-lg);
381
+ right: var(--spacing-lg);
382
+ display: flex;
383
+ gap: 10px;
384
+ align-items: center;
385
+ z-index: 10;
386
+ }
387
+
388
+ .language-switch-btn {
389
+ background: rgba(99, 102, 241, 0.05);
390
+ border: 1px solid rgba(99, 102, 241, 0.1);
391
+ border-radius: var(--radius-md);
392
+ padding: 8px 12px;
393
+ font-size: 12px;
394
+ cursor: pointer;
395
+ transition: all 0.2s ease;
396
+ color: var(--color-primary);
397
+ font-weight: 500;
398
+ }
399
+
400
+ .language-switch-btn:hover {
401
+ background: rgba(99, 102, 241, 0.1);
402
+ }
403
+
404
+ .mini-clear-cache {
405
+ background: rgba(245, 158, 11, 0.1);
406
+ border: 1px solid rgba(245, 158, 11, 0.2);
407
+ color: var(--color-warning);
408
+ padding: 6px 10px;
409
+ border-radius: var(--radius-sm);
410
+ font-size: 11px;
411
+ cursor: pointer;
412
+ transition: all 0.2s ease;
413
+ font-weight: 500;
414
+ }
415
+
416
+ .mini-clear-cache:hover {
417
+ background: rgba(245, 158, 11, 0.2);
418
+ }
419
+
420
+ /* Compact API Key in Top-Left */
421
+ .api-key-compact {
422
+ position: absolute;
423
+ top: var(--spacing-lg);
424
+ left: var(--spacing-lg);
425
+ z-index: 10;
426
+ background: rgba(99, 102, 241, 0.05);
427
+ border: 1px solid rgba(99, 102, 241, 0.1);
428
+ border-radius: var(--radius-lg);
429
+ padding: var(--spacing-md) var(--spacing-lg);
430
+ transition: all var(--transition-normal);
431
+ max-width: 280px;
432
+ }
433
+
434
+ .api-key-compact:hover {
435
+ background: rgba(99, 102, 241, 0.08);
436
+ }
437
+
438
+ .api-key-compact-label {
439
+ display: block;
440
+ font-size: 0.75rem;
441
+ font-weight: 600;
442
+ color: var(--color-primary);
443
+ margin-bottom: var(--spacing-xs);
444
+ text-transform: uppercase;
445
+ letter-spacing: 0.05em;
446
+ }
447
+
448
+ .api-key-compact-input {
449
+ width: 100%;
450
+ padding: var(--spacing-sm) var(--spacing-md);
451
+ border: 1px solid var(--color-border);
452
+ border-radius: var(--radius-sm);
453
+ font-size: 0.875rem;
454
+ background: var(--color-surface);
455
+ color: var(--color-text-primary);
456
+ transition: all var(--transition-fast);
457
+ font-family: 'Courier New', monospace;
458
+ }
459
+
460
+ .api-key-compact-input:focus {
461
+ outline: none;
462
+ border-color: var(--color-border-focus);
463
+ box-shadow: 0 0 0 2px rgb(99 102 241 / 0.1);
464
+ }
465
+
466
+ .api-key-compact-input::placeholder {
467
+ color: var(--color-text-muted);
468
+ font-size: 0.75rem;
469
+ }
470
+
471
+ /* Main Content */
472
+ .main-content {
473
+ padding: 20px 30px 30px;
474
+ }
475
+
476
+ /* Header */
477
+ .header {
478
+ text-align: center;
479
+ margin-bottom: 25px;
480
+ padding-bottom: 20px;
481
+ border-bottom: 2px solid var(--color-border);
482
+ }
483
+
484
+ .header h1 {
485
+ font-size: 2.5rem;
486
+ font-weight: 800;
487
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
488
+ -webkit-background-clip: text;
489
+ -webkit-text-fill-color: transparent;
490
+ background-clip: text;
491
+ margin-bottom: 8px;
492
+ }
493
+
494
+ .header .subtitle {
495
+ font-size: 1.1rem;
496
+ color: var(--color-text-secondary);
497
+ font-weight: 500;
498
+ }
499
+
500
+ .header .description {
501
+ font-size: 1rem;
502
+ color: var(--color-text-secondary);
503
+ margin-top: 12px;
504
+ max-width: 700px;
505
+ margin-left: auto;
506
+ margin-right: auto;
507
+ }
508
+
509
+ /* School Name Input */
510
+ .school-name {
511
+ background: var(--color-surface);
512
+ border: 1px solid var(--color-border);
513
+ border-radius: 12px;
514
+ padding: 20px;
515
+ margin-bottom: 25px;
516
+ transition: all 0.3s ease;
517
+ box-shadow: var(--shadow-sm);
518
+ }
519
+
520
+ .school-name:hover {
521
+ border-color: var(--color-primary);
522
+ box-shadow: 0 8px 25px -8px rgba(99, 102, 241, 0.3);
523
+ }
524
+
525
+ .school-name label {
526
+ font-weight: 600;
527
+ color: var(--color-text-primary);
528
+ margin-bottom: 8px;
529
+ display: block;
530
+ }
531
+
532
+ .school-name input {
533
+ width: 100%;
534
+ padding: 12px 16px;
535
+ border: 2px solid var(--color-border);
536
+ border-radius: 8px;
537
+ font-size: 1rem;
538
+ font-family: inherit;
539
+ background: var(--color-surface);
540
+ transition: all 0.2s ease;
541
+ }
542
+
543
+ .school-name input:focus {
544
+ outline: none;
545
+ border-color: var(--color-primary);
546
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
547
+ }
548
+
549
+ /* Section Styling */
550
+ .section {
551
+ background: var(--color-surface);
552
+ border: 1px solid var(--color-border);
553
+ border-radius: 12px;
554
+ padding: 25px;
555
+ margin-bottom: 25px;
556
+ transition: all 0.3s ease;
557
+ box-shadow: var(--shadow-sm);
558
+ }
559
+
560
+ .section:hover {
561
+ border-color: var(--color-primary);
562
+ box-shadow: 0 8px 25px -8px rgba(99, 102, 241, 0.3);
563
+ }
564
+
565
+ .section h2 {
566
+ font-size: 1.8rem;
567
+ font-weight: 700;
568
+ color: var(--color-primary);
569
+ margin-bottom: 20px;
570
+ padding-bottom: 10px;
571
+ border-bottom: 2px solid var(--color-primary);
572
+ }
573
+
574
+ .section h3 {
575
+ font-size: 1.4rem;
576
+ font-weight: 600;
577
+ color: var(--color-text-primary);
578
+ margin: 25px 0 15px 0;
579
+ padding-bottom: 8px;
580
+ border-bottom: 1px solid var(--color-border);
581
+ }
582
+
583
+ /* Questions Grid Layout - 3 columns */
584
+ .questions-grid {
585
+ display: grid;
586
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
587
+ gap: 20px;
588
+ margin: 20px 0;
589
+ }
590
+
591
+ .question {
592
+ background: rgba(99, 102, 241, 0.02);
593
+ border: 1px solid rgba(99, 102, 241, 0.1);
594
+ border-left: 4px solid var(--color-primary);
595
+ border-radius: 8px;
596
+ padding: 20px;
597
+ transition: all 0.3s ease;
598
+ }
599
+
600
+ .question:hover {
601
+ background: rgba(99, 102, 241, 0.05);
602
+ border-color: var(--color-primary);
603
+ transform: translateY(-2px);
604
+ box-shadow: var(--shadow-sm);
605
+ }
606
+
607
+ .question p {
608
+ margin: 0 0 15px 0;
609
+ font-weight: 500;
610
+ color: var(--color-text-primary);
611
+ font-size: 0.95rem;
612
+ line-height: 1.6;
613
+ }
614
+
615
+ .question input[type="text"] {
616
+ width: 100%;
617
+ padding: 12px 16px;
618
+ border: 2px solid var(--color-border);
619
+ border-radius: 6px;
620
+ font-size: 14px;
621
+ background: var(--color-surface);
622
+ transition: all 0.2s ease;
623
+ font-family: inherit;
624
+ }
625
+
626
+ .question input[type="text"]:focus {
627
+ outline: none;
628
+ border-color: var(--color-primary);
629
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
630
+ }
631
+
632
+ /* Generate Button */
633
+ .generate-btn {
634
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
635
+ color: white;
636
+ padding: 18px 40px;
637
+ border: none;
638
+ border-radius: 12px;
639
+ font-size: 1.2rem;
640
+ font-weight: 700;
641
+ cursor: pointer;
642
+ transition: all 0.3s ease;
643
+ display: block;
644
+ margin: 40px auto;
645
+ min-width: 320px;
646
+ position: relative;
647
+ overflow: hidden;
648
+ }
649
+
650
+ .generate-btn:hover {
651
+ transform: translateY(-2px);
652
+ box-shadow: 0 12px 24px -8px rgba(99, 102, 241, 0.4);
653
+ }
654
+
655
+ .generate-btn:active {
656
+ transform: translateY(0);
657
+ }
658
+
659
+ .generate-btn:disabled {
660
+ opacity: 0.7;
661
+ cursor: not-allowed;
662
+ transform: none;
663
+ }
664
+
665
+ /* Loading Spinner */
666
+ .spinner {
667
+ display: none;
668
+ width: 20px;
669
+ height: 20px;
670
+ border: 2px solid rgba(255, 255, 255, 0.3);
671
+ border-radius: 50%;
672
+ border-top-color: white;
673
+ animation: spin 1s ease-in-out infinite;
674
+ margin-right: 8px;
675
+ }
676
+
677
+ @keyframes spin {
678
+ to { transform: rotate(360deg); }
679
+ }
680
+
681
+ /* Status Indicator */
682
+ #statusIndicator {
683
+ text-align: center;
684
+ font-weight: 600;
685
+ font-size: 1.1rem;
686
+ margin: 20px 0;
687
+ color: var(--color-primary);
688
+ padding: 15px;
689
+ background: rgba(99, 102, 241, 0.05);
690
+ border-radius: 8px;
691
+ border: 1px solid rgba(99, 102, 241, 0.1);
692
+ }
693
+
694
+ /* Output Section */
695
+ #output {
696
+ background: var(--color-surface);
697
+ border: 2px solid var(--color-border);
698
+ border-radius: 12px;
699
+ padding: 30px;
700
+ margin-top: 30px;
701
+ box-shadow: var(--shadow-sm);
702
+ font-family: 'Georgia', serif;
703
+ line-height: 1.8;
704
+ white-space: pre-wrap;
705
+ word-wrap: break-word;
706
+ }
707
+
708
+ #output:empty {
709
+ display: none;
710
+ }
711
+
712
+ #output strong {
713
+ color: var(--color-primary);
714
+ font-weight: 700;
715
+ }
716
+
717
+ /* Error Messages */
718
+ .error-message {
719
+ background: rgba(239, 68, 68, 0.1);
720
+ border: 1px solid rgba(239, 68, 68, 0.2);
721
+ color: var(--color-error);
722
+ padding: 12px 16px;
723
+ border-radius: 8px;
724
+ margin: 10px 0;
725
+ font-size: 0.9rem;
726
+ display: none;
727
+ }
728
+
729
+ /* Footer */
730
+ .footer {
731
+ text-align: center;
732
+ padding: 20px;
733
+ background: rgba(99, 102, 241, 0.05);
734
+ border-top: 1px solid var(--color-border);
735
+ color: var(--color-text-secondary);
736
+ font-size: 0.9rem;
737
+ }
738
+
739
+ /* Hidden sections */
740
+ .hidden {
741
+ display: none !important;
742
+ }
743
+
744
+ /* Responsive Design */
745
+ @media (max-width: 1200px) {
746
+ .questions-grid {
747
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
748
+ }
749
+ }
750
+
751
+ @media (max-width: 768px) {
752
+ body {
753
+ padding: 10px;
754
+ }
755
+
756
+ .language-landing {
757
+ margin: 20px auto;
758
+ padding: 30px 20px;
759
+ }
760
+
761
+ .api-key-compact {
762
+ position: static;
763
+ margin-bottom: var(--spacing-xl);
764
+ max-width: none;
765
+ }
766
+
767
+ .language-switcher {
768
+ position: relative;
769
+ top: auto;
770
+ right: auto;
771
+ margin-bottom: var(--spacing-xl);
772
+ justify-content: center;
773
+ }
774
+
775
+ .main-content {
776
+ padding: 15px 20px 20px;
777
+ }
778
+
779
+ .header h1 {
780
+ font-size: 2rem;
781
+ }
782
+
783
+ .questions-grid {
784
+ grid-template-columns: 1fr;
785
+ gap: 15px;
786
+ }
787
+
788
+ .section {
789
+ padding: 20px 15px;
790
+ }
791
+
792
+ .generate-btn {
793
+ width: 100%;
794
+ margin: 30px 0;
795
+ padding: 16px 32px;
796
+ font-size: 1.1rem;
797
+ }
798
+
799
+ #output {
800
+ padding: 20px;
801
+ }
802
+ }
803
+
804
+ @media (max-width: 480px) {
805
+ .language-landing h1 {
806
+ font-size: 2rem;
807
+ }
808
+
809
+ .header h1 {
810
+ font-size: 1.8rem;
811
+ }
812
+
813
+ .section h2 {
814
+ font-size: 1.5rem;
815
+ }
816
+
817
+ .section h3 {
818
+ font-size: 1.2rem;
819
+ }
820
+
821
+ .question {
822
+ padding: 15px;
823
+ }
824
+ }
825
+
826
+ /* Accessibility */
827
+ .sr-only {
828
+ position: absolute;
829
+ width: 1px;
830
+ height: 1px;
831
+ padding: 0;
832
+ margin: -1px;
833
+ overflow: hidden;
834
+ clip: rect(0, 0, 0, 0);
835
+ white-space: nowrap;
836
+ border: 0;
837
+ }
838
+
839
+ /* Focus styles for keyboard navigation */
840
+ .generate-btn:focus,
841
+ .api-key-compact-input:focus,
842
+ .question input[type="text"]:focus {
843
+ outline: 2px solid var(--color-primary);
844
+ outline-offset: 2px;
845
+ }
846
+
847
+ /* Reduced motion support */
848
+ @media (prefers-reduced-motion: reduce) {
849
+ *,
850
+ *::before,
851
+ *::after {
852
+ animation-duration: 0.01ms !important;
853
+ animation-iteration-count: 1 !important;
854
+ transition-duration: 0.01ms !important;
855
+ scroll-behavior: auto !important;
856
+ }
857
+ }
858
+ </style>
859
+ </head>
860
+
861
+ <body>
862
+ <!-- Progress Bar -->
863
+ <div class="progress-bar" id="progressBar"></div>
864
+
865
+ <!-- Translation Loading Overlay -->
866
+ <div class="translation-overlay" id="translationOverlay">
867
+ <div class="translation-content">
868
+ <div class="translation-spinner"></div>
869
+ <h2 id="translationTitle">Translating Interface...</h2>
870
+ <p id="translationMessage">Please wait while we translate the interface to your selected language.</p>
871
+ </div>
872
+ </div>
873
+
874
+ <!-- Language Selection Landing Page -->
875
+ <div class="language-landing" id="languageLanding">
876
+ <h1 data-translate="app_title">GovernanceFramework Pro</h1>
877
+ <p data-translate="welcome_message">Welcome! Please select your preferred language and enter your API key to get started with advanced AI governance framework creation for educational institutions.</p>
878
+
879
+ <!-- Cache Status Indicator -->
880
+ <div class="cache-status" id="cacheStatus">
881
+ 💾 Translations cached - instant loading!
882
+ </div>
883
+
884
+ <!-- Cache Management Section -->
885
+ <div class="cache-management" id="cacheManagement">
886
+ <h3 data-translate="cache_management_title">🗂️ Translation Cache Management</h3>
887
+ <div class="cache-status-display" id="cacheStatusDisplay">
888
+ <span data-translate="cache_status_checking">Checking cache status...</span>
889
+ </div>
890
+ <button class="clear-cache-btn" id="clearCacheBtn" data-translate="clear_cache_button">
891
+ 🗑️ Clear All Cached Translations
892
+ </button>
893
+ </div>
894
+
895
+ <div class="language-selector">
896
+ <label for="languageSelect" data-translate="select_language">🌐 Select Language</label>
897
+ <select id="languageSelect">
898
+ <option value="en">🇺🇸 English</option>
899
+ <option value="es">🇪🇸 Español (Spanish)</option>
900
+ <option value="fr">🇫🇷 Français (French)</option>
901
+ <option value="de">🇩🇪 Deutsch (German)</option>
902
+ <option value="zh">🇨🇳 中文 (Chinese)</option>
903
+ <option value="ja">🇯🇵 日本語 (Japanese)</option>
904
+ <option value="ko">🇰🇷 한국어 (Korean)</option>
905
+ <option value="pt">🇵🇹 Português (Portuguese)</option>
906
+ <option value="it">🇮🇹 Italiano (Italian)</option>
907
+ <option value="ar">🇸🇦 العربية (Arabic)</option>
908
+ <option value="ru">🇷🇺 Русский (Russian)</option>
909
+ <option value="hi">🇮🇳 हिन्दी (Hindi)</option>
910
+ <option value="bn">🇧🇩 বাংলা (Bengali)</option>
911
+ <option value="ur">🇵🇰 اردو (Urdu)</option>
912
+ <option value="tr">🇹🇷 Türkçe (Turkish)</option>
913
+ <option value="pl">🇵🇱 Polski (Polish)</option>
914
+ <option value="nl">🇳🇱 Nederlands (Dutch)</option>
915
+ <option value="sv">🇸🇪 Svenska (Swedish)</option>
916
+ <option value="da">🇩🇰 Dansk (Danish)</option>
917
+ <option value="no">🇳🇴 Norsk (Norwegian)</option>
918
+ <option value="fi">🇫🇮 Suomi (Finnish)</option>
919
+ <option value="is">🇮🇸 Íslenska (Icelandic)</option>
920
+ <option value="cs">🇨🇿 Čeština (Czech)</option>
921
+ <option value="sk">🇸🇰 Slovenčina (Slovak)</option>
922
+ <option value="hu">🇭🇺 Magyar (Hungarian)</option>
923
+ <option value="ro">🇷🇴 Română (Romanian)</option>
924
+ <option value="bg">🇧🇬 Български (Bulgarian)</option>
925
+ <option value="hr">🇭🇷 Hrvatski (Croatian)</option>
926
+ <option value="sr">🇷🇸 Српски (Serbian)</option>
927
+ <option value="sl">🇸🇮 Slovenščina (Slovenian)</option>
928
+ <option value="mk">🇲🇰 Македонски (Macedonian)</option>
929
+ <option value="sq">🇦🇱 Shqip (Albanian)</option>
930
+ <option value="lv">🇱🇻 Latviešu (Latvian)</option>
931
+ <option value="lt">🇱🇹 Lietuvių (Lithuanian)</option>
932
+ <option value="et">🇪🇪 Eesti (Estonian)</option>
933
+ <option value="mt">🇲🇹 Malti (Maltese)</option>
934
+ <option value="ga">🇮🇪 Gaeilge (Irish)</option>
935
+ <option value="cy">🏴󠁧󠁢󠁷󠁬󠁳󠁿 Cymraeg (Welsh)</option>
936
+ <option value="eu">🏴󠁥󠁳󠁰󠁶󠁿 Euskera (Basque)</option>
937
+ <option value="ca">🏴󠁥󠁳󠁣󠁴󠁿 Català (Catalan)</option>
938
+ <option value="gl">🏴󠁥󠁳󠁧󠁡󠁿 Galego (Galician)</option>
939
+ <option value="el">🇬🇷 Ελληνικά (Greek)</option>
940
+ <option value="he">🇮🇱 עברית (Hebrew)</option>
941
+ <option value="fa">🇮🇷 فارسی (Persian)</option>
942
+ <option value="ps">🇦🇫 پښتو (Pashto)</option>
943
+ <option value="ku">🏴󠁩󠁱󠁫󠁲󠁿 کوردی (Kurdish)</option>
944
+ <option value="az">🇦🇿 Azərbaycan (Azerbaijani)</option>
945
+ <option value="kk">🇰🇿 Қазақша (Kazakh)</option>
946
+ <option value="ky">🇰🇬 Кыргызча (Kyrgyz)</option>
947
+ <option value="uz">🇺🇿 O'zbek (Uzbek)</option>
948
+ <option value="tk">🇹🇲 Türkmen (Turkmen)</option>
949
+ <option value="tg">🇹🇯 Тоҷикӣ (Tajik)</option>
950
+ <option value="mn">🇲🇳 Монгол (Mongolian)</option>
951
+ <option value="ka">🇬🇪 ქართული (Georgian)</option>
952
+ <option value="hy">🇦🇲 Հայերեն (Armenian)</option>
953
+ <option value="th">🇹🇭 ไทย (Thai)</option>
954
+ <option value="vi">🇻🇳 Tiếng Việt (Vietnamese)</option>
955
+ <option value="lo">🇱🇦 ລາວ (Lao)</option>
956
+ <option value="km">🇰🇭 ខ្មែរ (Khmer)</option>
957
+ <option value="my">🇲🇲 မြန်မာ (Myanmar)</option>
958
+ <option value="si">🇱🇰 සිංහල (Sinhala)</option>
959
+ <option value="ta">🇱🇰 தமிழ் (Tamil)</option>
960
+ <option value="te">🇮🇳 తెలుగు (Telugu)</option>
961
+ <option value="kn">🇮🇳 ಕನ್ನಡ (Kannada)</option>
962
+ <option value="ml">🇮🇳 മലയാളം (Malayalam)</option>
963
+ <option value="gu">🇮🇳 ગુજરાતી (Gujarati)</option>
964
+ <option value="pa">🇮🇳 ਪੰਜਾਬੀ (Punjabi)</option>
965
+ <option value="or">🇮🇳 ଓଡ଼ିଆ (Odia)</option>
966
+ <option value="as">🇮🇳 অসমীয়া (Assamese)</option>
967
+ <option value="ne">🇳🇵 नेपाली (Nepali)</option>
968
+ <option value="dz">🇧🇹 རྫོང་ཁ (Dzongkha)</option>
969
+ <option value="bo">🏔️ བོད་ཡིག (Tibetan)</option>
970
+ <option value="id">🇮🇩 Bahasa Indonesia</option>
971
+ <option value="ms">🇲🇾 Bahasa Melayu (Malay)</option>
972
+ <option value="tl">🇵🇭 Filipino (Tagalog)</option>
973
+ <option value="ceb">🇵🇭 Cebuano</option>
974
+ <option value="haw">🏝️ ʻŌlelo Hawaiʻi (Hawaiian)</option>
975
+ <option value="mi">🇳🇿 Te Reo Māori (Maori)</option>
976
+ <option value="sm">🇼🇸 Gagana Samoa (Samoan)</option>
977
+ <option value="to">🇹🇴 Lea Fakatonga (Tongan)</option>
978
+ <option value="fj">🇫🇯 Na Vosa Vakaviti (Fijian)</option>
979
+ <option value="mg">🇲🇬 Malagasy</option>
980
+ <option value="sw">🇰🇪 Kiswahili (Swahili)</option>
981
+ <option value="zu">🇿🇦 isiZulu (Zulu)</option>
982
+ <option value="xh">🇿🇦 isiXhosa (Xhosa)</option>
983
+ <option value="af">🇿🇦 Afrikaans</option>
984
+ <option value="st">🇱🇸 Sesotho (Southern Sotho)</option>
985
+ <option value="tn">🇧🇼 Setswana (Tswana)</option>
986
+ <option value="ss">🇸🇿 siSwati (Swati)</option>
987
+ <option value="ve">🇿🇦 Tshivenḓa (Venda)</option>
988
+ <option value="ts">🇿🇦 Xitsonga (Tsonga)</option>
989
+ <option value="nr">🇿🇦 isiNdebele (Southern Ndebele)</option>
990
+ <option value="am">🇪🇹 አማርኛ (Amharic)</option>
991
+ <option value="ti">🇪🇷 ትግርኛ (Tigrinya)</option>
992
+ <option value="om">🇪🇹 Afaan Oromoo (Oromo)</option>
993
+ <option value="so">🇸🇴 Soomaali (Somali)</option>
994
+ <option value="ha">🇳🇬 Hausa</option>
995
+ <option value="yo">🇳🇬 Yorùbá (Yoruba)</option>
996
+ <option value="ig">🇳🇬 Igbo</option>
997
+ <option value="ff">🇸🇳 Fulfulde (Fulani)</option>
998
+ <option value="wo">🇸🇳 Wolof</option>
999
+ <option value="bm">🇲🇱 Bamanankan (Bambara)</option>
1000
+ <option value="rn">🇧🇮 Kirundi (Rundi)</option>
1001
+ <option value="rw">🇷🇼 Kinyarwanda (Rwanda)</option>
1002
+ <option value="lg">🇺🇬 Luganda</option>
1003
+ <option value="ny">🇲🇼 Chichewa (Nyanja)</option>
1004
+ <option value="sn">🇿🇼 chiShona (Shona)</option>
1005
+ <option value="nd">🇿🇼 isiNdebele (Northern Ndebele)</option>
1006
+ </select>
1007
+ </div>
1008
+
1009
+ <div class="api-key-landing">
1010
+ <label for="apiKeyLanding" data-translate="api_key_label">🔑 OpenAI API Key</label>
1011
+ <input type="password" id="apiKeyLanding" placeholder="Enter your OpenAI API key" data-translate-placeholder="api_key_placeholder">
1012
+ </div>
1013
+
1014
+ <button class="start-btn" id="startBtn" data-translate="start_button">🚀 Start Governance Framework Creation</button>
1015
+ </div>
1016
+
1017
+ <!-- Main Application -->
1018
+ <div class="main-app" id="mainApp">
1019
+ <div class="app-container">
1020
+ <!-- Language Switcher -->
1021
+ <div class="language-switcher" id="languageSwitcher">
1022
+ <div class="language-switch-btn" onclick="showLanguageLanding()">
1023
+ <span data-translate="change_language">🌐 Change Language</span>
1024
+ </div>
1025
+ <div class="mini-clear-cache" onclick="clearAllTranslationCache()" title="Clear translation cache">
1026
+ <span data-translate="clear_cache_mini">🗑️ Clear Cache</span>
1027
+ </div>
1028
+ </div>
1029
+
1030
+ <!-- Compact API Key in Top-Left -->
1031
+ <div class="api-key-compact">
1032
+ <label for="apiKey" class="api-key-compact-label" data-translate="api_key_short">API Key</label>
1033
+ <input
1034
+ type="password"
1035
+ id="apiKey"
1036
+ class="api-key-compact-input"
1037
+ data-translate-placeholder="api_key_placeholder"
1038
+ autocomplete="off"
1039
+ >
1040
+ </div>
1041
+
1042
+ <div class="main-content">
1043
+ <!-- Header -->
1044
+ <div class="header">
1045
+ <h1 data-translate="app_title">GovernanceFramework Pro</h1>
1046
+ <p class="subtitle" data-translate="app_subtitle">Advanced AI Policy & Compliance Management</p>
1047
+ <p class="description" data-translate="app_description">Create comprehensive AI governance frameworks tailored to your educational institution's specific needs and regulatory requirements</p>
1048
+ </div>
1049
+
1050
+ <!-- School Name Input Section -->
1051
+ <div class="school-name">
1052
+ <label for="schoolName" data-translate="school_name_label">🏫 Enter the Name of Your Educational Institution:</label>
1053
+ <input type="text" id="schoolName" data-translate-placeholder="school_name_placeholder" required>
1054
+ </div>
1055
+
1056
+ <!-- Error Message -->
1057
+ <div class="error-message" id="errorMessage"></div>
1058
+
1059
+ <!-- Form Start -->
1060
+ <form id="governanceForm" novalidate>
1061
+ <!-- 1. Introduction -->
1062
+ <div class="section">
1063
+ <h2 data-translate="section_1_title">1. Introduction</h2>
1064
+ <h3 data-translate="section_1_1_title">1.1 Purpose</h3>
1065
+ <div class="questions-grid">
1066
+ <div class="question">
1067
+ <p data-translate="question_1"><strong>Q1.</strong> What is the primary goal for AI integration in the school?<br>
1068
+ A. Enhancing learning experiences with AI-powered tools<br>
1069
+ B. Automating administrative processes (e.g., grading, scheduling)<br>
1070
+ C. Supporting students with disabilities through assistive AI<br>
1071
+ D. Preparing students for future careers in AI-related fields</p>
1072
+ <input type="text" required>
1073
+ </div>
1074
+ <div class="question">
1075
+ <p data-translate="question_2"><strong>Q2.</strong> How will AI align with the school's broader educational mission?<br>
1076
+ A. Supporting personalized and adaptive learning<br>
1077
+ B. Promoting digital literacy and ethical AI usage<br>
1078
+ C. Reducing teacher workload to improve efficiency<br>
1079
+ D. Ensuring equity by providing AI access to all students</p>
1080
+ <input type="text" required>
1081
+ </div>
1082
+ <div class="question">
1083
+ <p data-translate="question_3"><strong>Q3.</strong> What does "success" look like for AI integration?<br>
1084
+ A. Improved student engagement and participation<br>
1085
+ B. Teachers spending less time on repetitive tasks<br>
1086
+ C. AI adoption in all classrooms with positive feedback<br>
1087
+ D. Ethical AI use with clear policies on data privacy</p>
1088
+ <input type="text" required>
1089
+ </div>
1090
+ <div class="question">
1091
+ <p data-translate="question_4"><strong>Q4.</strong> How will AI tools be chosen?<br>
1092
+ A. Based on compliance with educational standards<br>
1093
+ B. Preference for AI tools with proven effectiveness in schools<br>
1094
+ C. AI tools must integrate with the school's existing LMS<br>
1095
+ D. Priority given to free/open-source AI tools with no vendor lock-in</p>
1096
+ <input type="text" required>
1097
+ </div>
1098
+ <div class="question">
1099
+ <p data-translate="question_5"><strong>Q5.</strong> How will AI support teachers rather than replace them?<br>
1100
+ A. AI as a support tool for teachers, not a decision-maker<br>
1101
+ B. AI-generated content must be teacher-reviewed<br>
1102
+ C. AI cannot fully automate grading or assessments<br>
1103
+ D. AI must only be used in formative (not summative) assessments</p>
1104
+ <input type="text" required>
1105
+ </div>
1106
+ <div class="question">
1107
+ <p data-translate="question_6"><strong>Q6.</strong> How will AI enhance student engagement?<br>
1108
+ A. AI-powered chatbots for 24/7 learning support<br>
1109
+ B. Gamification with AI-driven adaptive learning tools<br>
1110
+ C. AI-powered visualizations to simplify complex concepts<br>
1111
+ D. AI-generated personalized feedback and study recommendations</p>
1112
+ <input type="text" required>
1113
+ </div>
1114
+ </div>
1115
+
1116
+ <h3 data-translate="section_1_2_title">1.2 Scope</h3>
1117
+ <div class="questions-grid">
1118
+ <div class="question">
1119
+ <p data-translate="question_7"><strong>Q7.</strong> How will AI ensure equal opportunities for all students?<br>
1120
+ A. AI tools must be accessible for students with disabilities<br>
1121
+ B. AI should support non-native language speakers<br>
1122
+ C. AI-driven learning analytics must not reinforce biases<br>
1123
+ D. Students must have equal access to AI tools, regardless of background</p>
1124
+ <input type="text" required>
1125
+ </div>
1126
+ <div class="question">
1127
+ <p data-translate="question_8"><strong>Q8.</strong> What AI literacy skills should students acquire?<br>
1128
+ A. Understanding AI bias and ethical implications<br>
1129
+ B. Recognizing limitations of AI-generated information<br>
1130
+ C. Basic proficiency in using AI-driven research tools<br>
1131
+ D. Digital responsibility in interacting with AI systems</p>
1132
+ <input type="text" required>
1133
+ </div>
1134
+ <div class="question">
1135
+ <p data-translate="question_9"><strong>Q9.</strong> Which AI-powered tools will be implemented?<br>
1136
+ A. AI-assisted grading and feedback systems<br>
1137
+ B. AI-powered chatbots for student inquiries<br>
1138
+ C. AI-driven personalized learning platforms<br>
1139
+ D. AI-enhanced text-to-speech or translation tools</p>
1140
+ <input type="text" required>
1141
+ </div>
1142
+ <div class="question">
1143
+ <p data-translate="question_10"><strong>Q10.</strong> How will AI be integrated into lesson planning?<br>
1144
+ A. AI-generated lesson suggestions for teachers<br>
1145
+ B. AI-assisted research tools for curriculum design<br>
1146
+ C. AI-powered student feedback loops for lesson adjustments<br>
1147
+ D. AI-enhanced content curation for interactive learning</p>
1148
+ <input type="text" required>
1149
+ </div>
1150
+ <div class="question">
1151
+ <p data-translate="question_11"><strong>Q11.</strong> What are the limits on AI-driven assessments?<br>
1152
+ A. AI can assist but not finalize student grades<br>
1153
+ B. AI grading must be reviewed by teachers<br>
1154
+ C. AI can suggest, but not determine, student placements<br>
1155
+ D. AI-driven feedback should be supplemented with teacher insights</p>
1156
+ <input type="text" required>
1157
+ </div>
1158
+ <div class="question">
1159
+ <p data-translate="question_12"><strong>Q12.</strong> What are the key benefits of AI APIs in education?<br>
1160
+ A. AI customization while maintaining control over student data<br>
1161
+ B. Ability to integrate AI functionalities into existing LMS systems<br>
1162
+ C. Improved accessibility through AI-enhanced content adaptations<br>
1163
+ D. Increased efficiency in administrative tasks (e.g., attendance tracking)</p>
1164
+ <input type="text" required>
1165
+ </div>
1166
+ </div>
1167
+ </div>
1168
+
1169
+ <!-- 2. Governance Structure -->
1170
+ <div class="section">
1171
+ <h2 data-translate="section_2_title">2. Governance Structure</h2>
1172
+ <h3 data-translate="section_2_1_title">2.1 AI Governance Board</h3>
1173
+ <div class="questions-grid">
1174
+ <div class="question">
1175
+ <p data-translate="question_13"><strong>Q13.</strong> Who should be part of the AI Governance Board?<br>
1176
+ A. School leadership (e.g., principal, administrators)<br>
1177
+ B. IT specialists with cybersecurity expertise<br>
1178
+ C. Teachers representing various subjects/departments<br>
1179
+ D. Student representatives, ensuring student perspectives<br>
1180
+ E. Parent or community stakeholders for broader insight</p>
1181
+ <input type="text" required>
1182
+ </div>
1183
+ <div class="question">
1184
+ <p data-translate="question_14"><strong>Q14.</strong> Which committees or groups need to be created for comprehensive AI oversight?<br>
1185
+ A. AI Ethics & Compliance Committee<br>
1186
+ B. Data Security & Privacy Team<br>
1187
+ C. AI Pedagogy & Innovation Workgroup<br>
1188
+ D. Professional Development & Training Board<br>
1189
+ E. AI Incident Response Team (optional, for large-scale deployments)</p>
1190
+ <input type="text" required>
1191
+ </div>
1192
+ <div class="question">
1193
+ <p data-translate="question_15"><strong>Q15.</strong> How will teachers be involved in AI decision-making?<br>
1194
+ A. AI implementation committees including teacher input<br>
1195
+ B. Pilot programs before full AI adoption<br>
1196
+ C. Regular teacher surveys on AI tool effectiveness<br>
1197
+ D. AI adoption based on teacher classroom needs</p>
1198
+ <input type="text" required>
1199
+ </div>
1200
+ <div class="question">
1201
+ <p data-translate="question_16"><strong>Q16.</strong> What guidelines will ensure AI enhances critical thinking?<br>
1202
+ A. AI outputs must be reviewed for accuracy<br>
1203
+ B. Students must verify AI-generated content using credible sources<br>
1204
+ C. AI recommendations should not replace independent thinking<br>
1205
+ D. AI should support inquiry-based learning, not dictate answers</p>
1206
+ <input type="text" required>
1207
+ </div>
1208
+ <div class="question">
1209
+ <p data-translate="question_17"><strong>Q17.</strong> How will AI-generated content be monitored?<br>
1210
+ A. AI must not produce unsupervised educational materials<br>
1211
+ B. Teachers must approve AI-generated quizzes and assignments<br>
1212
+ C. AI content must be fact-checked before use<br>
1213
+ D. AI-generated resources should be clearly labeled for students</p>
1214
+ <input type="text" required>
1215
+ </div>
1216
+ <div class="question">
1217
+ <p data-translate="question_18"><strong>Q18.</strong> How will API-based AI tools be managed?<br>
1218
+ A. Only pre-approved API providers will be used<br>
1219
+ B. API integrations must comply with privacy and security regulations<br>
1220
+ C. AI-generated recommendations must be transparent and explainable<br>
1221
+ D. Regular security audits for API-connected AI services</p>
1222
+ <input type="text" required>
1223
+ </div>
1224
+ </div>
1225
+
1226
+ <h3 data-translate="section_2_2_title">2.2 AI Ethics & Compliance Committee</h3>
1227
+ <div class="questions-grid">
1228
+ <div class="question">
1229
+ <p data-translate="question_19"><strong>Q19.</strong> What ethical considerations will be enforced for AI use?<br>
1230
+ A. AI tools must be free from bias and discrimination<br>
1231
+ B. AI should not collect unnecessary student data<br>
1232
+ C. AI decisions must always allow human override<br>
1233
+ D. AI tools must provide explanations for their recommendations</p>
1234
+ <input type="text" required>
1235
+ </div>
1236
+ <div class="question">
1237
+ <p data-translate="question_20"><strong>Q20.</strong> How will bias in AI tools be minimized?<br>
1238
+ A. Periodic fairness audits of AI algorithms<br>
1239
+ B. AI training data must be diverse and inclusive<br>
1240
+ C. AI-generated decisions must be manually reviewed for bias<br>
1241
+ D. Schools must use only reputable AI vendors with ethical AI policies</p>
1242
+ <input type="text" required>
1243
+ </div>
1244
+ <div class="question">
1245
+ <p data-translate="question_21"><strong>Q21.</strong> How will students be protected from AI misinformation?<br>
1246
+ A. AI-generated content must be reviewed by educators<br>
1247
+ B. Critical thinking training for students in AI-related topics<br>
1248
+ C. AI tools must be programmed to avoid generating unreliable sources<br>
1249
+ D. AI-based assessments must include alternative verification methods</p>
1250
+ <input type="text" required>
1251
+ </div>
1252
+ <div class="question">
1253
+ <p data-translate="question_22"><strong>Q22.</strong> How will parental concerns about AI be addressed?<br>
1254
+ A. AI policy transparency through parent meetings<br>
1255
+ B. AI opt-out options for parents concerned about data use<br>
1256
+ C. AI literacy sessions for parents to understand school AI policies<br>
1257
+ D. Regular updates on AI effectiveness and safety measures</p>
1258
+ <input type="text" required>
1259
+ </div>
1260
+ <div class="question">
1261
+ <p data-translate="question_23"><strong>Q23.</strong> How will compliance with data privacy laws be ensured?<br>
1262
+ A. AI tools must align with GDPR, FERPA, or equivalent laws<br>
1263
+ B. AI tools must include data anonymization features<br>
1264
+ C. Student data should not be stored indefinitely by AI vendors<br>
1265
+ D. Parental consent must be obtained before AI data collection</p>
1266
+ <input type="text" required>
1267
+ </div>
1268
+ <div class="question">
1269
+ <p data-translate="question_24"><strong>Q24.</strong> How will AI-related ethical concerns be reported?<br>
1270
+ A. A dedicated AI ethics committee will review complaints<br>
1271
+ B. Students and teachers can report concerns anonymously<br>
1272
+ C. AI-related concerns must be addressed within a set timeframe<br>
1273
+ D. External AI ethics audits will be conducted annually</p>
1274
+ <input type="text" required>
1275
+ </div>
1276
+ </div>
1277
+ </div>
1278
+
1279
+ <!-- 3. Ethical Oversight -->
1280
+ <div class="section">
1281
+ <h2 data-translate="section_3_title">3. Ethical Oversight</h2>
1282
+ <h3 data-translate="section_3_1_title">3.1 AI Ethics Principles</h3>
1283
+ <div class="questions-grid">
1284
+ <div class="question">
1285
+ <p data-translate="question_25"><strong>Q25.</strong> What disciplinary measures will be taken for AI misuse?<br>
1286
+ A. Suspension of AI tools violating school policies<br>
1287
+ B. Investigation of AI-related ethical violations<br>
1288
+ C. Teacher intervention for student misuse of AI tools<br>
1289
+ D. Vendor accountability for unethical AI behavior</p>
1290
+ <input type="text" required>
1291
+ </div>
1292
+ <div class="question">
1293
+ <p data-translate="question_26"><strong>Q26.</strong> How will students be trained in responsible AI use?<br>
1294
+ A. AI literacy modules will be included in digital citizenship courses<br>
1295
+ B. Teachers will provide guidance on responsible AI interactions<br>
1296
+ C. AI will be used as a case study in ethics discussions<br>
1297
+ D. AI tools will have built-in warnings about over-reliance</p>
1298
+ <input type="text" required>
1299
+ </div>
1300
+ <div class="question">
1301
+ <p data-translate="question_27"><strong>Q27.</strong> What student data will AI tools process?<br>
1302
+ A. Anonymized performance and behavioral data<br>
1303
+ B. AI-driven insights on student learning patterns<br>
1304
+ C. Limited personal data (e.g., name and grade level)<br>
1305
+ D. Only metadata for improving AI functionality</p>
1306
+ <input type="text" required>
1307
+ </div>
1308
+ </div>
1309
+ </div>
1310
+
1311
+ <!-- Generate Button -->
1312
+ <button type="submit" class="generate-btn" id="generateBtn">
1313
+ <span class="spinner" id="spinner"></span>
1314
+ <span id="buttonText" data-translate="generate_button">🚀 Generate AI Governance Framework</span>
1315
+ </button>
1316
+ </form>
1317
+
1318
+ <!-- Status Indicator & Output Area -->
1319
+ <div id="statusIndicator"></div>
1320
+ <div id="output"></div>
1321
+ </div>
1322
+
1323
+ <!-- Footer -->
1324
+ <div class="footer">
1325
+ Created by Shift Mind AI Labs
1326
+ </div>
1327
+ </div>
1328
+ </div>
1329
+
1330
+ <script>
1331
+ // RTL languages list
1332
+ const rtlLanguages = ['ar', 'he', 'fa', 'ur', 'ps', 'ku'];
1333
+
1334
+ // Current language and API key
1335
+ let currentLanguage = 'en';
1336
+ let currentApiKey = '';
1337
+
1338
+ // Language names mapping
1339
+ const languageNames = {
1340
+ en: 'English', es: 'Spanish', fr: 'French', de: 'German', zh: 'Chinese',
1341
+ ja: 'Japanese', ko: 'Korean', pt: 'Portuguese', it: 'Italian', ar: 'Arabic',
1342
+ ru: 'Russian', hi: 'Hindi', bn: 'Bengali', ur: 'Urdu', tr: 'Turkish',
1343
+ pl: 'Polish', nl: 'Dutch', sv: 'Swedish', da: 'Danish', no: 'Norwegian',
1344
+ fi: 'Finnish', is: 'Icelandic', cs: 'Czech', sk: 'Slovak', hu: 'Hungarian',
1345
+ ro: 'Romanian', bg: 'Bulgarian', hr: 'Croatian', sr: 'Serbian', sl: 'Slovenian',
1346
+ mk: 'Macedonian', sq: 'Albanian', lv: 'Latvian', lt: 'Lithuanian', et: 'Estonian',
1347
+ mt: 'Maltese', ga: 'Irish', cy: 'Welsh', eu: 'Basque', ca: 'Catalan',
1348
+ gl: 'Galician', el: 'Greek', he: 'Hebrew', fa: 'Persian', ps: 'Pashto',
1349
+ ku: 'Kurdish', az: 'Azerbaijani', kk: 'Kazakh', ky: 'Kyrgyz', uz: 'Uzbek',
1350
+ tk: 'Turkmen', tg: 'Tajik', mn: 'Mongolian', ka: 'Georgian', hy: 'Armenian',
1351
+ th: 'Thai', vi: 'Vietnamese', lo: 'Lao', km: 'Khmer', my: 'Myanmar',
1352
+ si: 'Sinhala', ta: 'Tamil', te: 'Telugu', kn: 'Kannada', ml: 'Malayalam',
1353
+ gu: 'Gujarati', pa: 'Punjabi', or: 'Odia', as: 'Assamese', ne: 'Nepali',
1354
+ dz: 'Dzongkha', bo: 'Tibetan', id: 'Indonesian', ms: 'Malay', tl: 'Filipino',
1355
+ ceb: 'Cebuano', haw: 'Hawaiian', mi: 'Maori', sm: 'Samoan', to: 'Tongan',
1356
+ fj: 'Fijian', mg: 'Malagasy', sw: 'Swahili', zu: 'Zulu', xh: 'Xhosa',
1357
+ af: 'Afrikaans', st: 'Southern Sotho', tn: 'Tswana', ss: 'Swati', ve: 'Venda',
1358
+ ts: 'Tsonga', nr: 'Southern Ndebele', am: 'Amharic', ti: 'Tigrinya', om: 'Oromo',
1359
+ so: 'Somali', ha: 'Hausa', yo: 'Yoruba', ig: 'Igbo', ff: 'Fulani',
1360
+ wo: 'Wolof', bm: 'Bambara', rn: 'Rundi', rw: 'Rwanda', lg: 'Luganda',
1361
+ ny: 'Chichewa', sn: 'Shona', nd: 'Northern Ndebele'
1362
+ };
1363
+
1364
+ // Translation cache management
1365
+ const CACHE_PREFIX = 'governance_framework_translations_';
1366
+ const CACHE_VERSION = '1.0';
1367
+
1368
+ // Check if translations are cached for a language
1369
+ function isLanguageCached(language) {
1370
+ const cacheKey = CACHE_PREFIX + language;
1371
+ const cached = localStorage.getItem(cacheKey);
1372
+ return cached !== null;
1373
+ }
1374
+
1375
+ // Save translations to cache
1376
+ function saveTranslationsToCache(language, translations) {
1377
+ const cacheKey = CACHE_PREFIX + language;
1378
+ const cacheData = {
1379
+ version: CACHE_VERSION,
1380
+ timestamp: Date.now(),
1381
+ translations: translations
1382
+ };
1383
+ localStorage.setItem(cacheKey, JSON.stringify(cacheData));
1384
+ console.log(`Translations cached for ${language}`);
1385
+ }
1386
+
1387
+ // Load translations from cache
1388
+ function loadTranslationsFromCache(language) {
1389
+ const cacheKey = CACHE_PREFIX + language;
1390
+ const cached = localStorage.getItem(cacheKey);
1391
+
1392
+ if (cached) {
1393
+ try {
1394
+ const cacheData = JSON.parse(cached);
1395
+ if (cacheData.version === CACHE_VERSION) {
1396
+ console.log(`Translations loaded from cache for ${language}`);
1397
+ return cacheData.translations;
1398
+ }
1399
+ } catch (error) {
1400
+ console.error('Error parsing cached translations:', error);
1401
+ }
1402
+ }
1403
+ return null;
1404
+ }
1405
+
1406
+ // Get all cached languages
1407
+ function getCachedLanguages() {
1408
+ const cachedLanguages = [];
1409
+ for (let i = 0; i < localStorage.length; i++) {
1410
+ const key = localStorage.key(i);
1411
+ if (key && key.startsWith(CACHE_PREFIX)) {
1412
+ const language = key.replace(CACHE_PREFIX, '');
1413
+ cachedLanguages.push(language);
1414
+ }
1415
+ }
1416
+ return cachedLanguages;
1417
+ }
1418
+
1419
+ // Clear all translation cache
1420
+ function clearAllTranslationCache() {
1421
+ const cachedLanguages = getCachedLanguages();
1422
+
1423
+ if (cachedLanguages.length === 0) {
1424
+ alert('No cached translations to clear.');
1425
+ return;
1426
+ }
1427
+
1428
+ const languageList = cachedLanguages.map(lang => languageNames[lang] || lang).join(', ');
1429
+ const confirmMessage = `Are you sure you want to clear all cached translations?\n\nCached languages: ${languageList}\n\nThis will require re-downloading translations when switching languages.`;
1430
+
1431
+ if (confirm(confirmMessage)) {
1432
+ // Clear all translation caches
1433
+ cachedLanguages.forEach(language => {
1434
+ const cacheKey = CACHE_PREFIX + language;
1435
+ localStorage.removeItem(cacheKey);
1436
+ });
1437
+
1438
+ // Update cache status
1439
+ updateCacheStatus(currentLanguage);
1440
+ updateCacheStatusDisplay();
1441
+
1442
+ alert(`Cache cleared successfully!\n\n${cachedLanguages.length} language(s) removed from cache.`);
1443
+
1444
+ // Ask if user wants to reload current language translations
1445
+ if (currentLanguage !== 'en' && cachedLanguages.includes(currentLanguage)) {
1446
+ if (confirm('Would you like to reload the current language translations?')) {
1447
+ applyLanguage(currentLanguage);
1448
+ }
1449
+ }
1450
+ }
1451
+ }
1452
+
1453
+ // Update cache status indicator
1454
+ function updateCacheStatus(language) {
1455
+ const cacheStatus = document.getElementById('cacheStatus');
1456
+ const isCached = isLanguageCached(language);
1457
+
1458
+ if (language === 'en') {
1459
+ cacheStatus.classList.remove('cached', 'translating');
1460
+ return;
1461
+ }
1462
+
1463
+ if (isCached) {
1464
+ cacheStatus.textContent = '💾 Translations cached - instant loading!';
1465
+ cacheStatus.classList.add('cached');
1466
+ cacheStatus.classList.remove('translating');
1467
+ } else {
1468
+ cacheStatus.textContent = '🔄 First time translation - will be cached for future use';
1469
+ cacheStatus.classList.add('translating');
1470
+ cacheStatus.classList.remove('cached');
1471
+ }
1472
+ }
1473
+
1474
+ // Update cache status display in management section
1475
+ function updateCacheStatusDisplay() {
1476
+ const cacheStatusDisplay = document.getElementById('cacheStatusDisplay');
1477
+ const clearCacheBtn = document.getElementById('clearCacheBtn');
1478
+ const cachedLanguages = getCachedLanguages();
1479
+
1480
+ if (cachedLanguages.length === 0) {
1481
+ cacheStatusDisplay.textContent = '📭 No cached translations';
1482
+ cacheStatusDisplay.className = 'cache-status-display no-cache';
1483
+ clearCacheBtn.disabled = true;
1484
+ } else {
1485
+ const languageList = cachedLanguages.map(lang => languageNames[lang] || lang).join(', ');
1486
+ cacheStatusDisplay.textContent = `💾 ${cachedLanguages.length} language(s) cached: ${languageList}`;
1487
+ cacheStatusDisplay.className = 'cache-status-display';
1488
+ clearCacheBtn.disabled = false;
1489
+ }
1490
+ }
1491
+
1492
+ // Initialize the application
1493
+ function initializeApp() {
1494
+ // Load saved language and API key
1495
+ const savedLanguage = localStorage.getItem('governance_framework_language') || 'en';
1496
+ const savedApiKey = localStorage.getItem('governance_framework_api_key') || '';
1497
+
1498
+ currentLanguage = savedLanguage;
1499
+ currentApiKey = savedApiKey;
1500
+
1501
+ // Set language selector
1502
+ document.getElementById('languageSelect').value = currentLanguage;
1503
+ document.getElementById('apiKeyLanding').value = currentApiKey;
1504
+
1505
+ // Apply direction for current language
1506
+ applyDirection(currentLanguage);
1507
+
1508
+ // Update cache status
1509
+ updateCacheStatus(currentLanguage);
1510
+ updateCacheStatusDisplay();
1511
+
1512
+ // Show appropriate screen
1513
+ if (currentApiKey && currentLanguage) {
1514
+ showMainApp();
1515
+ } else {
1516
+ showLanguageLanding();
1517
+ }
1518
+ }
1519
+
1520
+ // Apply language direction
1521
+ function applyDirection(language) {
1522
+ currentLanguage = language;
1523
+
1524
+ // Set document language and direction
1525
+ document.documentElement.lang = language;
1526
+ document.documentElement.dir = rtlLanguages.includes(language) ? 'rtl' : 'ltr';
1527
+
1528
+ // Save language preference
1529
+ localStorage.setItem('governance_framework_language', language);
1530
+
1531
+ // Update cache status
1532
+ updateCacheStatus(language);
1533
+ }
1534
+
1535
+ // API call function for translation
1536
+ async function translateText(text, targetLanguage) {
1537
+ if (!currentApiKey) {
1538
+ throw new Error('API key is required for translation');
1539
+ }
1540
+
1541
+ const languageName = languageNames[targetLanguage] || 'English';
1542
+
1543
+ const prompt = `Translate the following text to ${languageName}. Provide ONLY the exact translation without any explanations, additional information, or formatting:
1544
+
1545
+ "${text}"`;
1546
+
1547
+ const payload = {
1548
+ model: "gpt-4o-mini",
1549
+ messages: [{ role: "user", content: prompt }],
1550
+ max_tokens: 500,
1551
+ temperature: 0.1
1552
+ };
1553
+
1554
+ const response = await fetch("https://api.openai.com/v1/chat/completions", {
1555
+ method: "POST",
1556
+ headers: {
1557
+ "Content-Type": "application/json",
1558
+ "Authorization": `Bearer ${currentApiKey}`
1559
+ },
1560
+ body: JSON.stringify(payload)
1561
+ });
1562
+
1563
+ if (!response.ok) {
1564
+ const errorData = await response.json();
1565
+ throw new Error(errorData.error?.message || "Translation API request failed");
1566
+ }
1567
+
1568
+ const data = await response.json();
1569
+ return data.choices[0].message.content.trim();
1570
+ }
1571
+
1572
+ // Apply cached translations to UI
1573
+ function applyCachedTranslations(translations) {
1574
+ // Apply text translations
1575
+ Object.keys(translations.texts).forEach(originalText => {
1576
+ const translation = translations.texts[originalText];
1577
+ const elements = document.querySelectorAll(`[data-translate]`);
1578
+
1579
+ elements.forEach(element => {
1580
+ const originalElementText = element.getAttribute('data-original-text') || element.textContent;
1581
+ if (originalElementText === originalText) {
1582
+ element.textContent = translation;
1583
+ }
1584
+ });
1585
+ });
1586
+
1587
+ // Apply placeholder translations
1588
+ Object.keys(translations.placeholders).forEach(originalPlaceholder => {
1589
+ const translation = translations.placeholders[originalPlaceholder];
1590
+ const elements = document.querySelectorAll(`[data-translate-placeholder]`);
1591
+
1592
+ elements.forEach(element => {
1593
+ const originalElementPlaceholder = element.getAttribute('data-original-placeholder') || element.placeholder;
1594
+ if (originalElementPlaceholder === originalPlaceholder) {
1595
+ element.placeholder = translation;
1596
+ }
1597
+ });
1598
+ });
1599
+ }
1600
+
1601
+ // Translate all UI elements
1602
+ async function translateInterface(targetLanguage) {
1603
+ if (targetLanguage === 'en') {
1604
+ // No translation needed for English
1605
+ return;
1606
+ }
1607
+
1608
+ // Check if translations are cached
1609
+ const cachedTranslations = loadTranslationsFromCache(targetLanguage);
1610
+ if (cachedTranslations) {
1611
+ // Use cached translations
1612
+ console.log('Using cached translations for', targetLanguage);
1613
+ applyCachedTranslations(cachedTranslations);
1614
+ return;
1615
+ }
1616
+
1617
+ // Need to translate via API
1618
+ showTranslationOverlay();
1619
+
1620
+ try {
1621
+ // Get all elements with data-translate attribute
1622
+ const elements = document.querySelectorAll('[data-translate]');
1623
+ const placeholderElements = document.querySelectorAll('[data-translate-placeholder]');
1624
+
1625
+ // Collect all texts to translate
1626
+ const textsToTranslate = [];
1627
+ const placeholdersToTranslate = [];
1628
+ const elementMap = new Map();
1629
+
1630
+ elements.forEach(element => {
1631
+ const originalText = element.getAttribute('data-original-text') || element.textContent;
1632
+ if (!element.getAttribute('data-original-text')) {
1633
+ element.setAttribute('data-original-text', originalText);
1634
+ }
1635
+ textsToTranslate.push(originalText);
1636
+ elementMap.set(originalText, element);
1637
+ });
1638
+
1639
+ placeholderElements.forEach(element => {
1640
+ const originalPlaceholder = element.getAttribute('data-original-placeholder') || element.placeholder;
1641
+ if (!element.getAttribute('data-original-placeholder')) {
1642
+ element.setAttribute('data-original-placeholder', originalPlaceholder);
1643
+ }
1644
+ placeholdersToTranslate.push(originalPlaceholder);
1645
+ elementMap.set(originalPlaceholder, element);
1646
+ });
1647
+
1648
+ // Prepare cache structure
1649
+ const translationsCache = {
1650
+ texts: {},
1651
+ placeholders: {}
1652
+ };
1653
+
1654
+ // Translate texts in batches
1655
+ const batchSize = 10;
1656
+ const allTexts = [...textsToTranslate, ...placeholdersToTranslate];
1657
+
1658
+ for (let i = 0; i < allTexts.length; i += batchSize) {
1659
+ const batch = allTexts.slice(i, i + batchSize);
1660
+
1661
+ // Update progress
1662
+ updateTranslationProgress(i, allTexts.length);
1663
+
1664
+ // Translate batch
1665
+ const translations = await Promise.all(
1666
+ batch.map(text => translateText(text, targetLanguage))
1667
+ );
1668
+
1669
+ // Apply translations and cache them
1670
+ batch.forEach((originalText, index) => {
1671
+ const element = elementMap.get(originalText);
1672
+ const translation = translations[index];
1673
+
1674
+ if (element.hasAttribute('data-translate')) {
1675
+ element.textContent = translation;
1676
+ translationsCache.texts[originalText] = translation;
1677
+ } else if (element.hasAttribute('data-translate-placeholder')) {
1678
+ element.placeholder = translation;
1679
+ translationsCache.placeholders[originalText] = translation;
1680
+ }
1681
+ });
1682
+ }
1683
+
1684
+ // Save translations to cache
1685
+ saveTranslationsToCache(targetLanguage, translationsCache);
1686
+
1687
+ // Update cache status
1688
+ updateCacheStatus(targetLanguage);
1689
+ updateCacheStatusDisplay();
1690
+
1691
+ } catch (error) {
1692
+ console.error('Translation error:', error);
1693
+ showError('Translation failed: ' + error.message);
1694
+ } finally {
1695
+ hideTranslationOverlay();
1696
+ }
1697
+ }
1698
+
1699
+ // Show translation overlay
1700
+ function showTranslationOverlay() {
1701
+ document.getElementById('translationOverlay').style.display = 'flex';
1702
+ }
1703
+
1704
+ // Hide translation overlay
1705
+ function hideTranslationOverlay() {
1706
+ document.getElementById('translationOverlay').style.display = 'none';
1707
+ }
1708
+
1709
+ // Update translation progress
1710
+ function updateTranslationProgress(current, total) {
1711
+ const percentage = Math.round((current / total) * 100);
1712
+ document.getElementById('translationMessage').textContent =
1713
+ `Translating interface... ${percentage}% complete (will be cached for future use)`;
1714
+ }
1715
+
1716
+ // Apply language with API translation or cache
1717
+ async function applyLanguage(language) {
1718
+ applyDirection(language);
1719
+
1720
+ if (language !== 'en') {
1721
+ await translateInterface(language);
1722
+ }
1723
+ }
1724
+
1725
+ // Show language landing page
1726
+ function showLanguageLanding() {
1727
+ document.getElementById('languageLanding').style.display = 'block';
1728
+ document.getElementById('mainApp').style.display = 'none';
1729
+ }
1730
+
1731
+ // Show main application
1732
+ function showMainApp() {
1733
+ document.getElementById('languageLanding').style.display = 'none';
1734
+ document.getElementById('mainApp').style.display = 'block';
1735
+
1736
+ // Set API key in main app
1737
+ document.getElementById('apiKey').value = currentApiKey;
1738
+ }
1739
+
1740
+ // Start button click handler
1741
+ document.getElementById('startBtn').addEventListener('click', async function() {
1742
+ const selectedLanguage = document.getElementById('languageSelect').value;
1743
+ const apiKey = document.getElementById('apiKeyLanding').value.trim();
1744
+
1745
+ if (!apiKey) {
1746
+ alert('Please enter your OpenAI API key');
1747
+ return;
1748
+ }
1749
+
1750
+ currentLanguage = selectedLanguage;
1751
+ currentApiKey = apiKey;
1752
+
1753
+ // Save API key
1754
+ localStorage.setItem('governance_framework_api_key', apiKey);
1755
+
1756
+ // Apply language with translation (cached or API)
1757
+ await applyLanguage(selectedLanguage);
1758
+
1759
+ // Show main app
1760
+ showMainApp();
1761
+ });
1762
+
1763
+ // Language selector change handler
1764
+ document.getElementById('languageSelect').addEventListener('change', async function() {
1765
+ const selectedLanguage = this.value;
1766
+ updateCacheStatus(selectedLanguage);
1767
+
1768
+ if (currentApiKey) {
1769
+ await applyLanguage(selectedLanguage);
1770
+ } else {
1771
+ applyDirection(selectedLanguage);
1772
+ }
1773
+ });
1774
+
1775
+ // Clear cache button handler
1776
+ document.getElementById('clearCacheBtn').addEventListener('click', clearAllTranslationCache);
1777
+
1778
+ // API key sync between landing and main app
1779
+ document.getElementById('apiKeyLanding').addEventListener('input', function() {
1780
+ currentApiKey = this.value;
1781
+ localStorage.setItem('governance_framework_api_key', this.value);
1782
+ document.getElementById('apiKey').value = this.value;
1783
+ });
1784
+
1785
+ document.getElementById('apiKey').addEventListener('input', function() {
1786
+ currentApiKey = this.value;
1787
+ localStorage.setItem('governance_framework_api_key', this.value);
1788
+ document.getElementById('apiKeyLanding').value = this.value;
1789
+ });
1790
+
1791
+ // Scroll-based progress bar
1792
+ window.addEventListener('scroll', () => {
1793
+ const { scrollTop, scrollHeight } = document.documentElement;
1794
+ const scrolled = (scrollTop / (scrollHeight - window.innerHeight)) * 100;
1795
+ document.getElementById('progressBar').style.width = `${scrolled}%`;
1796
+ });
1797
+
1798
+ // Error handling
1799
+ function showError(message) {
1800
+ const errorDiv = document.getElementById('errorMessage');
1801
+ errorDiv.textContent = message;
1802
+ errorDiv.style.display = 'block';
1803
+ setTimeout(() => {
1804
+ errorDiv.style.display = 'none';
1805
+ }, 5000);
1806
+ }
1807
+
1808
+ // API call function - Updated to use current language
1809
+ async function callAPI(prompt) {
1810
+ const apiKey = document.getElementById('apiKey').value.trim();
1811
+
1812
+ if (!apiKey) {
1813
+ throw new Error('Please enter your OpenAI API key');
1814
+ }
1815
+
1816
+ const payload = {
1817
+ model: "gpt-4o-mini",
1818
+ messages: [{ role: "user", content: prompt }],
1819
+ max_tokens: 12000,
1820
+ temperature: 0.2
1821
+ };
1822
+
1823
+ const response = await fetch("https://api.openai.com/v1/chat/completions", {
1824
+ method: "POST",
1825
+ headers: {
1826
+ "Content-Type": "application/json",
1827
+ "Authorization": `Bearer ${apiKey}`
1828
+ },
1829
+ body: JSON.stringify(payload)
1830
+ });
1831
+
1832
+ if (!response.ok) {
1833
+ const errorData = await response.json();
1834
+ throw new Error(errorData.error?.message || "API request failed");
1835
+ }
1836
+
1837
+ const data = await response.json();
1838
+ return data.choices[0].message.content;
1839
+ }
1840
+
1841
+ // Handle Form Submission - Updated to use current language dynamically
1842
+ document.getElementById('governanceForm').addEventListener('submit', async (event) => {
1843
+ event.preventDefault();
1844
+
1845
+ const statusIndicator = document.getElementById('statusIndicator');
1846
+ const outputDiv = document.getElementById('output');
1847
+ const button = document.getElementById('generateBtn');
1848
+ const buttonText = document.getElementById('buttonText');
1849
+ const spinner = document.getElementById('spinner');
1850
+
1851
+ try {
1852
+ // Validate school name
1853
+ const schoolName = document.getElementById('schoolName').value.trim();
1854
+ if (!schoolName) {
1855
+ throw new Error("Please enter the school name.");
1856
+ }
1857
+
1858
+ // Update button state
1859
+ button.disabled = true;
1860
+ spinner.style.display = 'inline-block';
1861
+ buttonText.textContent = 'Generating Framework...';
1862
+ statusIndicator.textContent = "Generating AI Governance Framework...";
1863
+ outputDiv.innerHTML = "";
1864
+
1865
+ // Collect all answer inputs
1866
+ const answers = Array.from(document.querySelectorAll('#governanceForm input[type="text"]'))
1867
+ .map((input, index) => ({ number: index + 1, text: input.value.trim() }));
1868
+
1869
+ // Create responses block
1870
+ const responsesBlock = answers.map(answer => `Q${answer.number}: ${answer.text}`).join('\n');
1871
+
1872
+ // Get current language name
1873
+ const languageName = languageNames[currentLanguage] || 'English';
1874
+
1875
+ // Build the prompt with dynamic language
1876
+ const prompt = `Create a comprehensive AI Governance Framework document for ${schoolName}, ensuring it aligns with the specific user responses outlined in ${responsesBlock}. This document should include an introduction to AI governance principles, a detailed analysis of stakeholder roles and responsibilities, a framework for ethical AI usage, compliance guidelines, and mechanisms for accountability and transparency. Conclude with recommendations for ongoing evaluation and adaptation of the framework to meet evolving needs and challenges.
1877
+
1878
+ **Important: Generate the entire response in ${languageName}. All content, headings, explanations, and recommendations must be written in ${languageName}.**`;
1879
+
1880
+ // Call API
1881
+ const result = await callAPI(prompt);
1882
+
1883
+ // Convert Markdown **bold** to <strong> for HTML display
1884
+ let content = result.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
1885
+
1886
+ // Convert newlines to <br> for HTML display
1887
+ content = content.replace(/\n/g, '<br>');
1888
+
1889
+ outputDiv.innerHTML = content;
1890
+ statusIndicator.textContent = "Framework generated successfully!";
1891
+
1892
+ } catch (error) {
1893
+ console.error('Error:', error);
1894
+ showError(error.message);
1895
+ outputDiv.innerHTML = `<strong>Error:</strong> ${error.message}`;
1896
+ statusIndicator.textContent = "Error generating framework";
1897
+ } finally {
1898
+ // Reset button state
1899
+ button.disabled = false;
1900
+ spinner.style.display = 'none';
1901
+ buttonText.textContent = '🚀 Generate AI Governance Framework';
1902
+ }
1903
+ });
1904
+
1905
+ // Initialize app when DOM is loaded
1906
+ document.addEventListener('DOMContentLoaded', function() {
1907
+ initializeApp();
1908
+ });
1909
+ </script>
1910
+ </body>
1911
+ </html>
1912
+
📘 Teacher & Student Guide Governan.txt ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 📘 Teacher & Student Guide: GovernanceFramework Pro
2
+ 1. Purpose & Educational Value
3
+ GovernanceFramework Pro enables educators, school leaders, and students to co-create robust AI governance frameworks—addressing policy, ethics, compliance, privacy, and stakeholder voices. It is ideal for building digital citizenship, responsible AI practice, and real-world policy literacy.
4
+
5
+ 2. How Teachers Can Use the Tool
6
+ A. Staff & Policy Committees
7
+ Use during school/district AI policy meetings or professional development.
8
+
9
+ Guide teams through each section—mission, governance board, ethics, compliance, parental engagement.
10
+
11
+ Export output as a draft for board approval, audit, or legal review.
12
+
13
+ B. Classroom Integration
14
+ Assign as a capstone in digital citizenship, STEM, or civics courses.
15
+
16
+ Scaffold group projects—each group drafts or critiques a section (e.g., ethics, board composition).
17
+
18
+ Analyze current school policies and propose AI updates using the tool as a model.
19
+
20
+ C. Parent & Community Engagement
21
+ Share drafts with parents for input, transparency, and community trust.
22
+
23
+ Use multilingual output for accessible communication with diverse families.
24
+
25
+ 3. How Students Can Use the Tool
26
+ A. Project-Based Learning
27
+ Take on the role of policy makers—create governance frameworks for simulated or real school scenarios.
28
+
29
+ Practice collaboration: Assign roles (principal, teacher, student, parent, IT, etc.).
30
+
31
+ Research and discuss best practices, then input answers into the tool for immediate draft policy.
32
+
33
+ B. Critical Analysis
34
+ Analyze the sample questions and policy outputs—identify strengths, gaps, or ethical dilemmas.
35
+
36
+ Debate different approaches to data privacy, ethics, or stakeholder inclusion.
37
+
38
+ C. Multilingual/Global Projects
39
+ Translate policy drafts to other languages—compare global governance strategies.
40
+
41
+ Research local/regional AI laws and discuss how policies must adapt.
42
+
43
+ 4. Best Practices & Tips
44
+ Be specific and realistic: Use local context and actual school values for best results.
45
+
46
+ Encourage debate: Use outputs as starting points for classroom or staff discussion.
47
+
48
+ Iterate and adapt: Update frameworks as technology, laws, or community needs change.
49
+
50
+ Maintain privacy: All data and keys remain on device—safe for school settings.
51
+
52
+ 5. Troubleshooting & Support
53
+ If output is generic, provide more detailed or specific answers to each question.
54
+
55
+ If translation fails, check your API key or clear cache and reload.
56
+
57
+ For technical or policy questions: info@shiftmind.io | www.shiftmind.io
58
+
59
+ GovernanceFramework Pro empowers every school, educator, and learner to build safe, ethical, and future-ready AI governance—together.