Spaces:
Running
Running
Upload 4 files
Browse files- Apache License.txt +17 -0
- Index.html +1715 -0
- README.md +100 -0
- 📘 Teacher & Student Guide IdeaForg.txt +42 -0
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.
|
Index.html
ADDED
|
@@ -0,0 +1,1715 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>IdeaForge Pro - Advanced Brainstorming Intelligence</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 - Innovation/Brainstorming theme */
|
| 22 |
+
--color-primary: #6366f1;
|
| 23 |
+
--color-primary-hover: #5b21b6;
|
| 24 |
+
--color-secondary: #8b5cf6;
|
| 25 |
+
--color-accent: #06b6d4;
|
| 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 |
+
/* Input Sections */
|
| 510 |
+
.input-section {
|
| 511 |
+
background: var(--color-surface);
|
| 512 |
+
border: 1px solid var(--color-border);
|
| 513 |
+
border-radius: 12px;
|
| 514 |
+
padding: 20px;
|
| 515 |
+
margin-bottom: 15px;
|
| 516 |
+
transition: all 0.3s ease;
|
| 517 |
+
box-shadow: var(--shadow-sm);
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
.input-section:hover {
|
| 521 |
+
border-color: var(--color-primary);
|
| 522 |
+
box-shadow: 0 8px 25px -8px rgba(99, 102, 241, 0.3);
|
| 523 |
+
}
|
| 524 |
+
|
| 525 |
+
.input-section h3 {
|
| 526 |
+
font-size: 1.1rem;
|
| 527 |
+
font-weight: 700;
|
| 528 |
+
color: var(--color-primary);
|
| 529 |
+
margin-bottom: 8px;
|
| 530 |
+
display: flex;
|
| 531 |
+
align-items: center;
|
| 532 |
+
gap: 8px;
|
| 533 |
+
}
|
| 534 |
+
|
| 535 |
+
.input-section .description {
|
| 536 |
+
font-size: 0.9rem;
|
| 537 |
+
color: var(--color-text-secondary);
|
| 538 |
+
margin-bottom: 12px;
|
| 539 |
+
}
|
| 540 |
+
|
| 541 |
+
/* Form Elements */
|
| 542 |
+
label {
|
| 543 |
+
display: block;
|
| 544 |
+
margin-bottom: 6px;
|
| 545 |
+
font-weight: 600;
|
| 546 |
+
color: var(--color-text-primary);
|
| 547 |
+
font-size: 0.95rem;
|
| 548 |
+
}
|
| 549 |
+
|
| 550 |
+
input[type="text"],
|
| 551 |
+
select,
|
| 552 |
+
textarea {
|
| 553 |
+
width: 100%;
|
| 554 |
+
padding: 12px 16px;
|
| 555 |
+
border: 2px solid var(--color-border);
|
| 556 |
+
border-radius: 8px;
|
| 557 |
+
font-size: 1rem;
|
| 558 |
+
font-family: inherit;
|
| 559 |
+
background: var(--color-surface);
|
| 560 |
+
transition: all 0.2s ease;
|
| 561 |
+
resize: vertical;
|
| 562 |
+
}
|
| 563 |
+
|
| 564 |
+
input[type="text"]:focus,
|
| 565 |
+
select:focus,
|
| 566 |
+
textarea:focus {
|
| 567 |
+
outline: none;
|
| 568 |
+
border-color: var(--color-primary);
|
| 569 |
+
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
|
| 570 |
+
}
|
| 571 |
+
|
| 572 |
+
select {
|
| 573 |
+
cursor: pointer;
|
| 574 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
|
| 575 |
+
background-position: right 12px center;
|
| 576 |
+
background-repeat: no-repeat;
|
| 577 |
+
background-size: 16px;
|
| 578 |
+
padding-right: 40px;
|
| 579 |
+
appearance: none;
|
| 580 |
+
}
|
| 581 |
+
|
| 582 |
+
textarea {
|
| 583 |
+
min-height: 100px;
|
| 584 |
+
font-family: inherit;
|
| 585 |
+
}
|
| 586 |
+
|
| 587 |
+
/* Generate Button */
|
| 588 |
+
.generate-btn {
|
| 589 |
+
background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
|
| 590 |
+
color: white;
|
| 591 |
+
padding: 16px 32px;
|
| 592 |
+
border: none;
|
| 593 |
+
border-radius: 12px;
|
| 594 |
+
font-size: 1.1rem;
|
| 595 |
+
font-weight: 700;
|
| 596 |
+
cursor: pointer;
|
| 597 |
+
transition: all 0.3s ease;
|
| 598 |
+
display: block;
|
| 599 |
+
margin: 25px auto;
|
| 600 |
+
min-width: 200px;
|
| 601 |
+
position: relative;
|
| 602 |
+
overflow: hidden;
|
| 603 |
+
}
|
| 604 |
+
|
| 605 |
+
.generate-btn:hover {
|
| 606 |
+
transform: translateY(-2px);
|
| 607 |
+
box-shadow: 0 12px 24px -8px rgba(99, 102, 241, 0.4);
|
| 608 |
+
}
|
| 609 |
+
|
| 610 |
+
.generate-btn:active {
|
| 611 |
+
transform: translateY(0);
|
| 612 |
+
}
|
| 613 |
+
|
| 614 |
+
.generate-btn:disabled {
|
| 615 |
+
opacity: 0.7;
|
| 616 |
+
cursor: not-allowed;
|
| 617 |
+
transform: none;
|
| 618 |
+
}
|
| 619 |
+
|
| 620 |
+
/* Loading Spinner */
|
| 621 |
+
.spinner {
|
| 622 |
+
display: none;
|
| 623 |
+
width: 20px;
|
| 624 |
+
height: 20px;
|
| 625 |
+
border: 2px solid rgba(255, 255, 255, 0.3);
|
| 626 |
+
border-radius: 50%;
|
| 627 |
+
border-top-color: white;
|
| 628 |
+
animation: spin 1s ease-in-out infinite;
|
| 629 |
+
margin-right: 8px;
|
| 630 |
+
}
|
| 631 |
+
|
| 632 |
+
@keyframes spin {
|
| 633 |
+
to { transform: rotate(360deg); }
|
| 634 |
+
}
|
| 635 |
+
|
| 636 |
+
/* Output Section */
|
| 637 |
+
.output-section {
|
| 638 |
+
margin-top: 30px;
|
| 639 |
+
}
|
| 640 |
+
|
| 641 |
+
.output-section h2 {
|
| 642 |
+
font-size: 1.5rem;
|
| 643 |
+
font-weight: 700;
|
| 644 |
+
color: var(--color-primary);
|
| 645 |
+
margin-bottom: 15px;
|
| 646 |
+
display: flex;
|
| 647 |
+
align-items: center;
|
| 648 |
+
gap: 8px;
|
| 649 |
+
}
|
| 650 |
+
|
| 651 |
+
.output-area {
|
| 652 |
+
background: var(--color-surface);
|
| 653 |
+
border: 2px solid var(--color-border);
|
| 654 |
+
border-radius: 12px;
|
| 655 |
+
padding: 20px;
|
| 656 |
+
min-height: 200px;
|
| 657 |
+
font-family: 'Inter', sans-serif;
|
| 658 |
+
font-size: 1rem;
|
| 659 |
+
line-height: 1.7;
|
| 660 |
+
white-space: pre-wrap;
|
| 661 |
+
word-wrap: break-word;
|
| 662 |
+
transition: all 0.3s ease;
|
| 663 |
+
position: relative;
|
| 664 |
+
}
|
| 665 |
+
|
| 666 |
+
.output-area:focus {
|
| 667 |
+
outline: none;
|
| 668 |
+
border-color: var(--color-primary);
|
| 669 |
+
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
|
| 670 |
+
}
|
| 671 |
+
|
| 672 |
+
.output-area:empty::before {
|
| 673 |
+
content: "Your comprehensive brainstorming analysis will appear here...";
|
| 674 |
+
color: var(--color-text-secondary);
|
| 675 |
+
font-style: italic;
|
| 676 |
+
}
|
| 677 |
+
|
| 678 |
+
/* Error Messages */
|
| 679 |
+
.error-message {
|
| 680 |
+
background: rgba(239, 68, 68, 0.1);
|
| 681 |
+
border: 1px solid rgba(239, 68, 68, 0.2);
|
| 682 |
+
color: var(--color-error);
|
| 683 |
+
padding: 12px 16px;
|
| 684 |
+
border-radius: 8px;
|
| 685 |
+
margin: 10px 0;
|
| 686 |
+
font-size: 0.9rem;
|
| 687 |
+
display: none;
|
| 688 |
+
}
|
| 689 |
+
|
| 690 |
+
/* Footer */
|
| 691 |
+
.footer {
|
| 692 |
+
text-align: center;
|
| 693 |
+
padding: 20px;
|
| 694 |
+
background: rgba(99, 102, 241, 0.05);
|
| 695 |
+
border-top: 1px solid var(--color-border);
|
| 696 |
+
color: var(--color-text-secondary);
|
| 697 |
+
font-size: 0.9rem;
|
| 698 |
+
}
|
| 699 |
+
|
| 700 |
+
/* Hidden sections */
|
| 701 |
+
.hidden {
|
| 702 |
+
display: none !important;
|
| 703 |
+
}
|
| 704 |
+
|
| 705 |
+
/* Responsive Design */
|
| 706 |
+
@media (max-width: 768px) {
|
| 707 |
+
body {
|
| 708 |
+
padding: 10px;
|
| 709 |
+
}
|
| 710 |
+
|
| 711 |
+
.language-landing {
|
| 712 |
+
margin: 20px auto;
|
| 713 |
+
padding: 30px 20px;
|
| 714 |
+
}
|
| 715 |
+
|
| 716 |
+
.api-key-compact {
|
| 717 |
+
position: static;
|
| 718 |
+
margin-bottom: var(--spacing-xl);
|
| 719 |
+
max-width: none;
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
.language-switcher {
|
| 723 |
+
position: relative;
|
| 724 |
+
top: auto;
|
| 725 |
+
right: auto;
|
| 726 |
+
margin-bottom: var(--spacing-xl);
|
| 727 |
+
justify-content: center;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
.main-content {
|
| 731 |
+
padding: 15px 20px 20px;
|
| 732 |
+
}
|
| 733 |
+
|
| 734 |
+
.header h1 {
|
| 735 |
+
font-size: 2rem;
|
| 736 |
+
}
|
| 737 |
+
|
| 738 |
+
.input-section {
|
| 739 |
+
padding: 15px;
|
| 740 |
+
}
|
| 741 |
+
|
| 742 |
+
.generate-btn {
|
| 743 |
+
width: 100%;
|
| 744 |
+
margin: 20px 0;
|
| 745 |
+
}
|
| 746 |
+
}
|
| 747 |
+
|
| 748 |
+
@media (max-width: 480px) {
|
| 749 |
+
.language-landing h1 {
|
| 750 |
+
font-size: 2rem;
|
| 751 |
+
}
|
| 752 |
+
|
| 753 |
+
.header h1 {
|
| 754 |
+
font-size: 1.8rem;
|
| 755 |
+
}
|
| 756 |
+
|
| 757 |
+
.input-section {
|
| 758 |
+
padding: 12px;
|
| 759 |
+
}
|
| 760 |
+
}
|
| 761 |
+
|
| 762 |
+
/* Accessibility */
|
| 763 |
+
.sr-only {
|
| 764 |
+
position: absolute;
|
| 765 |
+
width: 1px;
|
| 766 |
+
height: 1px;
|
| 767 |
+
padding: 0;
|
| 768 |
+
margin: -1px;
|
| 769 |
+
overflow: hidden;
|
| 770 |
+
clip: rect(0, 0, 0, 0);
|
| 771 |
+
white-space: nowrap;
|
| 772 |
+
border: 0;
|
| 773 |
+
}
|
| 774 |
+
|
| 775 |
+
/* Focus styles for keyboard navigation */
|
| 776 |
+
.generate-btn:focus,
|
| 777 |
+
.api-key-compact-input:focus,
|
| 778 |
+
input[type="text"]:focus,
|
| 779 |
+
textarea:focus {
|
| 780 |
+
outline: 2px solid var(--color-primary);
|
| 781 |
+
outline-offset: 2px;
|
| 782 |
+
}
|
| 783 |
+
|
| 784 |
+
/* Reduced motion support */
|
| 785 |
+
@media (prefers-reduced-motion: reduce) {
|
| 786 |
+
*,
|
| 787 |
+
*::before,
|
| 788 |
+
*::after {
|
| 789 |
+
animation-duration: 0.01ms !important;
|
| 790 |
+
animation-iteration-count: 1 !important;
|
| 791 |
+
transition-duration: 0.01ms !important;
|
| 792 |
+
scroll-behavior: auto !important;
|
| 793 |
+
}
|
| 794 |
+
}
|
| 795 |
+
</style>
|
| 796 |
+
</head>
|
| 797 |
+
|
| 798 |
+
<body>
|
| 799 |
+
<!-- Progress Bar -->
|
| 800 |
+
<div class="progress-bar" id="progressBar"></div>
|
| 801 |
+
|
| 802 |
+
<!-- Translation Loading Overlay -->
|
| 803 |
+
<div class="translation-overlay" id="translationOverlay">
|
| 804 |
+
<div class="translation-content">
|
| 805 |
+
<div class="translation-spinner"></div>
|
| 806 |
+
<h2 id="translationTitle">Translating Interface...</h2>
|
| 807 |
+
<p id="translationMessage">Please wait while we translate the interface to your selected language.</p>
|
| 808 |
+
</div>
|
| 809 |
+
</div>
|
| 810 |
+
|
| 811 |
+
<!-- Language Selection Landing Page -->
|
| 812 |
+
<div class="language-landing" id="languageLanding">
|
| 813 |
+
<h1 data-translate="app_title">IdeaForge Pro</h1>
|
| 814 |
+
<p data-translate="welcome_message">Welcome! Please select your preferred language and enter your API key to get started with advanced brainstorming intelligence and idea generation.</p>
|
| 815 |
+
|
| 816 |
+
<!-- Cache Status Indicator -->
|
| 817 |
+
<div class="cache-status" id="cacheStatus">
|
| 818 |
+
💾 Translations cached - instant loading!
|
| 819 |
+
</div>
|
| 820 |
+
|
| 821 |
+
<!-- Cache Management Section -->
|
| 822 |
+
<div class="cache-management" id="cacheManagement">
|
| 823 |
+
<h3 data-translate="cache_management_title">🗂️ Translation Cache Management</h3>
|
| 824 |
+
<div class="cache-status-display" id="cacheStatusDisplay">
|
| 825 |
+
<span data-translate="cache_status_checking">Checking cache status...</span>
|
| 826 |
+
</div>
|
| 827 |
+
<button class="clear-cache-btn" id="clearCacheBtn" data-translate="clear_cache_button">
|
| 828 |
+
🗑️ Clear All Cached Translations
|
| 829 |
+
</button>
|
| 830 |
+
</div>
|
| 831 |
+
|
| 832 |
+
<div class="language-selector">
|
| 833 |
+
<label for="languageSelect" data-translate="select_language">🌐 Select Language</label>
|
| 834 |
+
<select id="languageSelect">
|
| 835 |
+
<option value="en">🇺🇸 English</option>
|
| 836 |
+
<option value="es">🇪🇸 Español (Spanish)</option>
|
| 837 |
+
<option value="fr">🇫🇷 Français (French)</option>
|
| 838 |
+
<option value="de">🇩🇪 Deutsch (German)</option>
|
| 839 |
+
<option value="zh">🇨🇳 中文 (Chinese)</option>
|
| 840 |
+
<option value="ja">🇯🇵 日本語 (Japanese)</option>
|
| 841 |
+
<option value="ko">🇰🇷 한국어 (Korean)</option>
|
| 842 |
+
<option value="pt">🇵🇹 Português (Portuguese)</option>
|
| 843 |
+
<option value="it">🇮🇹 Italiano (Italian)</option>
|
| 844 |
+
<option value="ar">🇸🇦 العربية (Arabic)</option>
|
| 845 |
+
<option value="ru">🇷🇺 Русский (Russian)</option>
|
| 846 |
+
<option value="hi">🇮🇳 हिन्दी (Hindi)</option>
|
| 847 |
+
<option value="bn">🇧🇩 বাংলা (Bengali)</option>
|
| 848 |
+
<option value="ur">🇵🇰 اردو (Urdu)</option>
|
| 849 |
+
<option value="tr">🇹🇷 Türkçe (Turkish)</option>
|
| 850 |
+
<option value="pl">🇵🇱 Polski (Polish)</option>
|
| 851 |
+
<option value="nl">🇳🇱 Nederlands (Dutch)</option>
|
| 852 |
+
<option value="sv">🇸🇪 Svenska (Swedish)</option>
|
| 853 |
+
<option value="da">🇩🇰 Dansk (Danish)</option>
|
| 854 |
+
<option value="no">🇳🇴 Norsk (Norwegian)</option>
|
| 855 |
+
<option value="fi">🇫🇮 Suomi (Finnish)</option>
|
| 856 |
+
<option value="is">🇮🇸 Íslenska (Icelandic)</option>
|
| 857 |
+
<option value="cs">🇨🇿 Čeština (Czech)</option>
|
| 858 |
+
<option value="sk">🇸🇰 Slovenčina (Slovak)</option>
|
| 859 |
+
<option value="hu">🇭🇺 Magyar (Hungarian)</option>
|
| 860 |
+
<option value="ro">🇷🇴 Română (Romanian)</option>
|
| 861 |
+
<option value="bg">🇧🇬 Български (Bulgarian)</option>
|
| 862 |
+
<option value="hr">🇭🇷 Hrvatski (Croatian)</option>
|
| 863 |
+
<option value="sr">🇷🇸 Српски (Serbian)</option>
|
| 864 |
+
<option value="sl">🇸🇮 Slovenščina (Slovenian)</option>
|
| 865 |
+
<option value="mk">🇲🇰 Македонски (Macedonian)</option>
|
| 866 |
+
<option value="sq">🇦🇱 Shqip (Albanian)</option>
|
| 867 |
+
<option value="lv">🇱🇻 Latviešu (Latvian)</option>
|
| 868 |
+
<option value="lt">🇱🇹 Lietuvių (Lithuanian)</option>
|
| 869 |
+
<option value="et">🇪🇪 Eesti (Estonian)</option>
|
| 870 |
+
<option value="mt">🇲🇹 Malti (Maltese)</option>
|
| 871 |
+
<option value="ga">🇮🇪 Gaeilge (Irish)</option>
|
| 872 |
+
<option value="cy">🏴 Cymraeg (Welsh)</option>
|
| 873 |
+
<option value="eu">🏴 Euskera (Basque)</option>
|
| 874 |
+
<option value="ca">🏴 Català (Catalan)</option>
|
| 875 |
+
<option value="gl">🏴 Galego (Galician)</option>
|
| 876 |
+
<option value="el">🇬🇷 Ελληνικά (Greek)</option>
|
| 877 |
+
<option value="he">🇮🇱 עברית (Hebrew)</option>
|
| 878 |
+
<option value="fa">🇮🇷 فارسی (Persian)</option>
|
| 879 |
+
<option value="ps">🇦🇫 پښتو (Pashto)</option>
|
| 880 |
+
<option value="ku">🏴 کوردی (Kurdish)</option>
|
| 881 |
+
<option value="az">🇦🇿 Azərbaycan (Azerbaijani)</option>
|
| 882 |
+
<option value="kk">🇰🇿 Қазақша (Kazakh)</option>
|
| 883 |
+
<option value="ky">🇰🇬 Кыргызча (Kyrgyz)</option>
|
| 884 |
+
<option value="uz">🇺🇿 O'zbek (Uzbek)</option>
|
| 885 |
+
<option value="tk">🇹🇲 Türkmen (Turkmen)</option>
|
| 886 |
+
<option value="tg">🇹🇯 Тоҷикӣ (Tajik)</option>
|
| 887 |
+
<option value="mn">🇲🇳 Монгол (Mongolian)</option>
|
| 888 |
+
<option value="ka">🇬🇪 ქართული (Georgian)</option>
|
| 889 |
+
<option value="hy">🇦🇲 Հայերեն (Armenian)</option>
|
| 890 |
+
<option value="th">🇹🇭 ไทย (Thai)</option>
|
| 891 |
+
<option value="vi">🇻🇳 Tiếng Việt (Vietnamese)</option>
|
| 892 |
+
<option value="lo">🇱🇦 ລາວ (Lao)</option>
|
| 893 |
+
<option value="km">🇰🇭 ខ្មែរ (Khmer)</option>
|
| 894 |
+
<option value="my">🇲🇲 မြန်မာ (Myanmar)</option>
|
| 895 |
+
<option value="si">🇱🇰 සිංහල (Sinhala)</option>
|
| 896 |
+
<option value="ta">🇱🇰 தமிழ் (Tamil)</option>
|
| 897 |
+
<option value="te">🇮🇳 తెలుగు (Telugu)</option>
|
| 898 |
+
<option value="kn">🇮🇳 ಕನ್ನಡ (Kannada)</option>
|
| 899 |
+
<option value="ml">🇮🇳 മലയാളം (Malayalam)</option>
|
| 900 |
+
<option value="gu">🇮🇳 ગુજરાતી (Gujarati)</option>
|
| 901 |
+
<option value="pa">🇮🇳 ਪੰਜਾਬੀ (Punjabi)</option>
|
| 902 |
+
<option value="or">🇮🇳 ଓଡ଼ିଆ (Odia)</option>
|
| 903 |
+
<option value="as">🇮🇳 অসমীয়া (Assamese)</option>
|
| 904 |
+
<option value="ne">🇳🇵 नेपाली (Nepali)</option>
|
| 905 |
+
<option value="dz">🇧🇹 རྫོང་ཁ (Dzongkha)</option>
|
| 906 |
+
<option value="bo">🏔️ བོད་ཡིག (Tibetan)</option>
|
| 907 |
+
<option value="id">🇮🇩 Bahasa Indonesia</option>
|
| 908 |
+
<option value="ms">🇲🇾 Bahasa Melayu (Malay)</option>
|
| 909 |
+
<option value="tl">🇵🇭 Filipino (Tagalog)</option>
|
| 910 |
+
<option value="ceb">🇵🇭 Cebuano</option>
|
| 911 |
+
<option value="haw">🏝️ ʻŌlelo Hawaiʻi (Hawaiian)</option>
|
| 912 |
+
<option value="mi">🇳🇿 Te Reo Māori (Maori)</option>
|
| 913 |
+
<option value="sm">🇼🇸 Gagana Samoa (Samoan)</option>
|
| 914 |
+
<option value="to">🇹🇴 Lea Fakatonga (Tongan)</option>
|
| 915 |
+
<option value="fj">🇫🇯 Na Vosa Vakaviti (Fijian)</option>
|
| 916 |
+
<option value="mg">🇲🇬 Malagasy</option>
|
| 917 |
+
<option value="sw">🇰🇪 Kiswahili (Swahili)</option>
|
| 918 |
+
<option value="zu">🇿🇦 isiZulu (Zulu)</option>
|
| 919 |
+
<option value="xh">🇿🇦 isiXhosa (Xhosa)</option>
|
| 920 |
+
<option value="af">🇿🇦 Afrikaans</option>
|
| 921 |
+
<option value="st">🇱🇸 Sesotho (Southern Sotho)</option>
|
| 922 |
+
<option value="tn">🇧🇼 Setswana (Tswana)</option>
|
| 923 |
+
<option value="ss">🇸🇿 siSwati (Swati)</option>
|
| 924 |
+
<option value="ve">🇿🇦 Tshivenḓa (Venda)</option>
|
| 925 |
+
<option value="ts">🇿🇦 Xitsonga (Tsonga)</option>
|
| 926 |
+
<option value="nr">🇿🇦 isiNdebele (Southern Ndebele)</option>
|
| 927 |
+
<option value="am">🇪🇹 አማርኛ (Amharic)</option>
|
| 928 |
+
<option value="ti">🇪🇷 ትግርኛ (Tigrinya)</option>
|
| 929 |
+
<option value="om">🇪🇹 Afaan Oromoo (Oromo)</option>
|
| 930 |
+
<option value="so">🇸🇴 Soomaali (Somali)</option>
|
| 931 |
+
<option value="ha">🇳🇬 Hausa</option>
|
| 932 |
+
<option value="yo">🇳🇬 Yorùbá (Yoruba)</option>
|
| 933 |
+
<option value="ig">🇳🇬 Igbo</option>
|
| 934 |
+
<option value="ff">🇸🇳 Fulfulde (Fulani)</option>
|
| 935 |
+
<option value="wo">🇸🇳 Wolof</option>
|
| 936 |
+
<option value="bm">🇲🇱 Bamanankan (Bambara)</option>
|
| 937 |
+
<option value="rn">🇧🇮 Kirundi (Rundi)</option>
|
| 938 |
+
<option value="rw">🇷🇼 Kinyarwanda (Rwanda)</option>
|
| 939 |
+
<option value="lg">🇺🇬 Luganda</option>
|
| 940 |
+
<option value="ny">🇲🇼 Chichewa (Nyanja)</option>
|
| 941 |
+
<option value="sn">🇿🇼 chiShona (Shona)</option>
|
| 942 |
+
<option value="nd">🇿🇼 isiNdebele (Northern Ndebele)</option>
|
| 943 |
+
</select>
|
| 944 |
+
</div>
|
| 945 |
+
|
| 946 |
+
<div class="api-key-landing">
|
| 947 |
+
<label for="apiKeyLanding" data-translate="api_key_label">🔑 OpenAI API Key</label>
|
| 948 |
+
<input type="password" id="apiKeyLanding" placeholder="Enter your OpenAI API key" data-translate-placeholder="api_key_placeholder">
|
| 949 |
+
</div>
|
| 950 |
+
|
| 951 |
+
<button class="start-btn" id="startBtn" data-translate="start_button">🚀 Start Brainstorming Intelligence</button>
|
| 952 |
+
</div>
|
| 953 |
+
|
| 954 |
+
<!-- Main Application -->
|
| 955 |
+
<div class="main-app" id="mainApp">
|
| 956 |
+
<div class="app-container">
|
| 957 |
+
<!-- Language Switcher -->
|
| 958 |
+
<div class="language-switcher" id="languageSwitcher">
|
| 959 |
+
<div class="language-switch-btn" onclick="showLanguageLanding()">
|
| 960 |
+
<span data-translate="change_language">🌐 Change Language</span>
|
| 961 |
+
</div>
|
| 962 |
+
<div class="mini-clear-cache" onclick="clearAllTranslationCache()" title="Clear translation cache">
|
| 963 |
+
<span data-translate="clear_cache_mini">🗑️ Clear Cache</span>
|
| 964 |
+
</div>
|
| 965 |
+
</div>
|
| 966 |
+
|
| 967 |
+
<!-- Compact API Key in Top-Left -->
|
| 968 |
+
<div class="api-key-compact">
|
| 969 |
+
<label for="apiKey" class="api-key-compact-label" data-translate="api_key_short">API Key</label>
|
| 970 |
+
<input
|
| 971 |
+
type="password"
|
| 972 |
+
id="apiKey"
|
| 973 |
+
class="api-key-compact-input"
|
| 974 |
+
data-translate-placeholder="api_key_placeholder"
|
| 975 |
+
autocomplete="off"
|
| 976 |
+
>
|
| 977 |
+
</div>
|
| 978 |
+
|
| 979 |
+
<div class="main-content">
|
| 980 |
+
<!-- Header -->
|
| 981 |
+
<div class="header">
|
| 982 |
+
<h1 data-translate="app_title">IdeaForge Pro</h1>
|
| 983 |
+
<p class="subtitle" data-translate="app_subtitle">Advanced Brainstorming Intelligence Platform</p>
|
| 984 |
+
<p class="description" data-translate="app_description">Transform your creative thinking with AI-powered brainstorming, idea organization, and strategic analysis tools</p>
|
| 985 |
+
</div>
|
| 986 |
+
|
| 987 |
+
<!-- Error Message -->
|
| 988 |
+
<div class="error-message" id="errorMessage"></div>
|
| 989 |
+
|
| 990 |
+
<!-- Brainstorming Input Sections -->
|
| 991 |
+
<div class="input-section">
|
| 992 |
+
<h3 data-translate="problem_definition_title">🎯 Problem Definition</h3>
|
| 993 |
+
<p class="description" data-translate="problem_definition_desc">Clearly describe the problem or challenge you're facing</p>
|
| 994 |
+
<textarea id="problemDefinition" rows="4" data-translate-placeholder="problem_definition_placeholder" required></textarea>
|
| 995 |
+
</div>
|
| 996 |
+
|
| 997 |
+
<div class="input-section">
|
| 998 |
+
<h3 data-translate="idea_generation_title">⏱️ Idea Generation Timeline</h3>
|
| 999 |
+
<p class="description" data-translate="idea_generation_desc">Set a time limit for the ideation phase</p>
|
| 1000 |
+
<input type="text" id="ideaGeneration" data-translate-placeholder="idea_generation_placeholder" required>
|
| 1001 |
+
</div>
|
| 1002 |
+
|
| 1003 |
+
<div class="input-section">
|
| 1004 |
+
<h3 data-translate="additional_ideas_title">💡 Additional Ideas</h3>
|
| 1005 |
+
<p class="description" data-translate="additional_ideas_desc">Add any additional ideas that come to mind</p>
|
| 1006 |
+
<textarea id="ideaCapture" rows="4" data-translate-placeholder="additional_ideas_placeholder" required></textarea>
|
| 1007 |
+
</div>
|
| 1008 |
+
|
| 1009 |
+
<div class="input-section">
|
| 1010 |
+
<h3 data-translate="idea_organization_title">📊 Idea Organization Strategy</h3>
|
| 1011 |
+
<p class="description" data-translate="idea_organization_desc">Share your initial thoughts on grouping or categorizing ideas</p>
|
| 1012 |
+
<textarea id="ideaOrganization" rows="4" data-translate-placeholder="idea_organization_placeholder" required></textarea>
|
| 1013 |
+
</div>
|
| 1014 |
+
|
| 1015 |
+
<div class="input-section">
|
| 1016 |
+
<h3 data-translate="critical_analysis_title">🔍 Critical Analysis Focus</h3>
|
| 1017 |
+
<p class="description" data-translate="critical_analysis_desc">Select one idea to analyze critically and deeply</p>
|
| 1018 |
+
<textarea id="criticalAnalysis" rows="2" data-translate-placeholder="critical_analysis_placeholder" required></textarea>
|
| 1019 |
+
</div>
|
| 1020 |
+
|
| 1021 |
+
<div class="input-section">
|
| 1022 |
+
<h3 data-translate="idea_refinement_title">🔧 Idea Refinement Input</h3>
|
| 1023 |
+
<p class="description" data-translate="idea_refinement_desc">Provide responses to help refine and improve ideas</p>
|
| 1024 |
+
<textarea id="ideaRefinement" rows="4" data-translate-placeholder="idea_refinement_placeholder" required></textarea>
|
| 1025 |
+
</div>
|
| 1026 |
+
|
| 1027 |
+
<div class="input-section">
|
| 1028 |
+
<h3 data-translate="prioritization_title">⭐ Prioritization Criteria</h3>
|
| 1029 |
+
<p class="description" data-translate="prioritization_desc">Define criteria for evaluating and ranking ideas</p>
|
| 1030 |
+
<textarea id="prioritization" rows="3" data-translate-placeholder="prioritization_placeholder" required></textarea>
|
| 1031 |
+
</div>
|
| 1032 |
+
|
| 1033 |
+
<!-- Generate Button -->
|
| 1034 |
+
<button class="generate-btn" id="generateBrainstormingBtn">
|
| 1035 |
+
<span class="spinner" id="spinner"></span>
|
| 1036 |
+
<span id="buttonText" data-translate="generate_button">🚀 Generate Comprehensive Brainstorming Analysis</span>
|
| 1037 |
+
</button>
|
| 1038 |
+
|
| 1039 |
+
<!-- Output Section -->
|
| 1040 |
+
<div class="output-section">
|
| 1041 |
+
<h2 data-translate="output_title">📋 Brainstorming Analysis Results</h2>
|
| 1042 |
+
<div class="output-area" id="brainstormingOutput" contenteditable="true"></div>
|
| 1043 |
+
</div>
|
| 1044 |
+
</div>
|
| 1045 |
+
|
| 1046 |
+
<!-- Footer -->
|
| 1047 |
+
<div class="footer">
|
| 1048 |
+
Created by Shift Mind AI Labs
|
| 1049 |
+
</div>
|
| 1050 |
+
</div>
|
| 1051 |
+
</div>
|
| 1052 |
+
|
| 1053 |
+
<script>
|
| 1054 |
+
// RTL languages list
|
| 1055 |
+
const rtlLanguages = ['ar', 'he', 'fa', 'ur', 'ps', 'ku'];
|
| 1056 |
+
|
| 1057 |
+
// Current language and API key
|
| 1058 |
+
let currentLanguage = 'en';
|
| 1059 |
+
let currentApiKey = '';
|
| 1060 |
+
|
| 1061 |
+
// Language names mapping
|
| 1062 |
+
const languageNames = {
|
| 1063 |
+
en: 'English', es: 'Spanish', fr: 'French', de: 'German', zh: 'Chinese',
|
| 1064 |
+
ja: 'Japanese', ko: 'Korean', pt: 'Portuguese', it: 'Italian', ar: 'Arabic',
|
| 1065 |
+
ru: 'Russian', hi: 'Hindi', bn: 'Bengali', ur: 'Urdu', tr: 'Turkish',
|
| 1066 |
+
pl: 'Polish', nl: 'Dutch', sv: 'Swedish', da: 'Danish', no: 'Norwegian',
|
| 1067 |
+
fi: 'Finnish', is: 'Icelandic', cs: 'Czech', sk: 'Slovak', hu: 'Hungarian',
|
| 1068 |
+
ro: 'Romanian', bg: 'Bulgarian', hr: 'Croatian', sr: 'Serbian', sl: 'Slovenian',
|
| 1069 |
+
mk: 'Macedonian', sq: 'Albanian', lv: 'Latvian', lt: 'Lithuanian', et: 'Estonian',
|
| 1070 |
+
mt: 'Maltese', ga: 'Irish', cy: 'Welsh', eu: 'Basque', ca: 'Catalan',
|
| 1071 |
+
gl: 'Galician', el: 'Greek', he: 'Hebrew', fa: 'Persian', ps: 'Pashto',
|
| 1072 |
+
ku: 'Kurdish', az: 'Azerbaijani', kk: 'Kazakh', ky: 'Kyrgyz', uz: 'Uzbek',
|
| 1073 |
+
tk: 'Turkmen', tg: 'Tajik', mn: 'Mongolian', ka: 'Georgian', hy: 'Armenian',
|
| 1074 |
+
th: 'Thai', vi: 'Vietnamese', lo: 'Lao', km: 'Khmer', my: 'Myanmar',
|
| 1075 |
+
si: 'Sinhala', ta: 'Tamil', te: 'Telugu', kn: 'Kannada', ml: 'Malayalam',
|
| 1076 |
+
gu: 'Gujarati', pa: 'Punjabi', or: 'Odia', as: 'Assamese', ne: 'Nepali',
|
| 1077 |
+
dz: 'Dzongkha', bo: 'Tibetan', id: 'Indonesian', ms: 'Malay', tl: 'Filipino',
|
| 1078 |
+
ceb: 'Cebuano', haw: 'Hawaiian', mi: 'Maori', sm: 'Samoan', to: 'Tongan',
|
| 1079 |
+
fj: 'Fijian', mg: 'Malagasy', sw: 'Swahili', zu: 'Zulu', xh: 'Xhosa',
|
| 1080 |
+
af: 'Afrikaans', st: 'Southern Sotho', tn: 'Tswana', ss: 'Swati', ve: 'Venda',
|
| 1081 |
+
ts: 'Tsonga', nr: 'Southern Ndebele', am: 'Amharic', ti: 'Tigrinya', om: 'Oromo',
|
| 1082 |
+
so: 'Somali', ha: 'Hausa', yo: 'Yoruba', ig: 'Igbo', ff: 'Fulani',
|
| 1083 |
+
wo: 'Wolof', bm: 'Bambara', rn: 'Rundi', rw: 'Rwanda', lg: 'Luganda',
|
| 1084 |
+
ny: 'Chichewa', sn: 'Shona', nd: 'Northern Ndebele'
|
| 1085 |
+
};
|
| 1086 |
+
|
| 1087 |
+
// Translation cache management
|
| 1088 |
+
const CACHE_PREFIX = 'ideaforge_translations_';
|
| 1089 |
+
const CACHE_VERSION = '1.0';
|
| 1090 |
+
|
| 1091 |
+
// Check if translations are cached for a language
|
| 1092 |
+
function isLanguageCached(language) {
|
| 1093 |
+
const cacheKey = CACHE_PREFIX + language;
|
| 1094 |
+
const cached = localStorage.getItem(cacheKey);
|
| 1095 |
+
return cached !== null;
|
| 1096 |
+
}
|
| 1097 |
+
|
| 1098 |
+
// Save translations to cache
|
| 1099 |
+
function saveTranslationsToCache(language, translations) {
|
| 1100 |
+
const cacheKey = CACHE_PREFIX + language;
|
| 1101 |
+
const cacheData = {
|
| 1102 |
+
version: CACHE_VERSION,
|
| 1103 |
+
timestamp: Date.now(),
|
| 1104 |
+
translations: translations
|
| 1105 |
+
};
|
| 1106 |
+
localStorage.setItem(cacheKey, JSON.stringify(cacheData));
|
| 1107 |
+
console.log(`Translations cached for ${language}`);
|
| 1108 |
+
}
|
| 1109 |
+
|
| 1110 |
+
// Load translations from cache
|
| 1111 |
+
function loadTranslationsFromCache(language) {
|
| 1112 |
+
const cacheKey = CACHE_PREFIX + language;
|
| 1113 |
+
const cached = localStorage.getItem(cacheKey);
|
| 1114 |
+
|
| 1115 |
+
if (cached) {
|
| 1116 |
+
try {
|
| 1117 |
+
const cacheData = JSON.parse(cached);
|
| 1118 |
+
if (cacheData.version === CACHE_VERSION) {
|
| 1119 |
+
console.log(`Translations loaded from cache for ${language}`);
|
| 1120 |
+
return cacheData.translations;
|
| 1121 |
+
}
|
| 1122 |
+
} catch (error) {
|
| 1123 |
+
console.error('Error parsing cached translations:', error);
|
| 1124 |
+
}
|
| 1125 |
+
}
|
| 1126 |
+
return null;
|
| 1127 |
+
}
|
| 1128 |
+
|
| 1129 |
+
// Get all cached languages
|
| 1130 |
+
function getCachedLanguages() {
|
| 1131 |
+
const cachedLanguages = [];
|
| 1132 |
+
for (let i = 0; i < localStorage.length; i++) {
|
| 1133 |
+
const key = localStorage.key(i);
|
| 1134 |
+
if (key && key.startsWith(CACHE_PREFIX)) {
|
| 1135 |
+
const language = key.replace(CACHE_PREFIX, '');
|
| 1136 |
+
cachedLanguages.push(language);
|
| 1137 |
+
}
|
| 1138 |
+
}
|
| 1139 |
+
return cachedLanguages;
|
| 1140 |
+
}
|
| 1141 |
+
|
| 1142 |
+
// Clear all translation cache
|
| 1143 |
+
function clearAllTranslationCache() {
|
| 1144 |
+
const cachedLanguages = getCachedLanguages();
|
| 1145 |
+
|
| 1146 |
+
if (cachedLanguages.length === 0) {
|
| 1147 |
+
alert('No cached translations to clear.');
|
| 1148 |
+
return;
|
| 1149 |
+
}
|
| 1150 |
+
|
| 1151 |
+
const languageList = cachedLanguages.map(lang => languageNames[lang] || lang).join(', ');
|
| 1152 |
+
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.`;
|
| 1153 |
+
|
| 1154 |
+
if (confirm(confirmMessage)) {
|
| 1155 |
+
// Clear all translation caches
|
| 1156 |
+
cachedLanguages.forEach(language => {
|
| 1157 |
+
const cacheKey = CACHE_PREFIX + language;
|
| 1158 |
+
localStorage.removeItem(cacheKey);
|
| 1159 |
+
});
|
| 1160 |
+
|
| 1161 |
+
// Update cache status
|
| 1162 |
+
updateCacheStatus(currentLanguage);
|
| 1163 |
+
updateCacheStatusDisplay();
|
| 1164 |
+
|
| 1165 |
+
alert(`Cache cleared successfully!\n\n${cachedLanguages.length} language(s) removed from cache.`);
|
| 1166 |
+
|
| 1167 |
+
// Ask if user wants to reload current language translations
|
| 1168 |
+
if (currentLanguage !== 'en' && cachedLanguages.includes(currentLanguage)) {
|
| 1169 |
+
if (confirm('Would you like to reload the current language translations?')) {
|
| 1170 |
+
applyLanguage(currentLanguage);
|
| 1171 |
+
}
|
| 1172 |
+
}
|
| 1173 |
+
}
|
| 1174 |
+
}
|
| 1175 |
+
|
| 1176 |
+
// Update cache status indicator
|
| 1177 |
+
function updateCacheStatus(language) {
|
| 1178 |
+
const cacheStatus = document.getElementById('cacheStatus');
|
| 1179 |
+
const isCached = isLanguageCached(language);
|
| 1180 |
+
|
| 1181 |
+
if (language === 'en') {
|
| 1182 |
+
cacheStatus.classList.remove('cached', 'translating');
|
| 1183 |
+
return;
|
| 1184 |
+
}
|
| 1185 |
+
|
| 1186 |
+
if (isCached) {
|
| 1187 |
+
cacheStatus.textContent = '💾 Translations cached - instant loading!';
|
| 1188 |
+
cacheStatus.classList.add('cached');
|
| 1189 |
+
cacheStatus.classList.remove('translating');
|
| 1190 |
+
} else {
|
| 1191 |
+
cacheStatus.textContent = '🔄 First time translation - will be cached for future use';
|
| 1192 |
+
cacheStatus.classList.add('translating');
|
| 1193 |
+
cacheStatus.classList.remove('cached');
|
| 1194 |
+
}
|
| 1195 |
+
}
|
| 1196 |
+
|
| 1197 |
+
// Update cache status display in management section
|
| 1198 |
+
function updateCacheStatusDisplay() {
|
| 1199 |
+
const cacheStatusDisplay = document.getElementById('cacheStatusDisplay');
|
| 1200 |
+
const clearCacheBtn = document.getElementById('clearCacheBtn');
|
| 1201 |
+
const cachedLanguages = getCachedLanguages();
|
| 1202 |
+
|
| 1203 |
+
if (cachedLanguages.length === 0) {
|
| 1204 |
+
cacheStatusDisplay.textContent = '📭 No cached translations';
|
| 1205 |
+
cacheStatusDisplay.className = 'cache-status-display no-cache';
|
| 1206 |
+
clearCacheBtn.disabled = true;
|
| 1207 |
+
} else {
|
| 1208 |
+
const languageList = cachedLanguages.map(lang => languageNames[lang] || lang).join(', ');
|
| 1209 |
+
cacheStatusDisplay.textContent = `💾 ${cachedLanguages.length} language(s) cached: ${languageList}`;
|
| 1210 |
+
cacheStatusDisplay.className = 'cache-status-display';
|
| 1211 |
+
clearCacheBtn.disabled = false;
|
| 1212 |
+
}
|
| 1213 |
+
}
|
| 1214 |
+
|
| 1215 |
+
// Initialize the application
|
| 1216 |
+
function initializeApp() {
|
| 1217 |
+
// Load saved language and API key
|
| 1218 |
+
const savedLanguage = localStorage.getItem('ideaforge_language') || 'en';
|
| 1219 |
+
const savedApiKey = localStorage.getItem('ideaforge_api_key') || '';
|
| 1220 |
+
|
| 1221 |
+
currentLanguage = savedLanguage;
|
| 1222 |
+
currentApiKey = savedApiKey;
|
| 1223 |
+
|
| 1224 |
+
// Set language selector
|
| 1225 |
+
document.getElementById('languageSelect').value = currentLanguage;
|
| 1226 |
+
document.getElementById('apiKeyLanding').value = currentApiKey;
|
| 1227 |
+
|
| 1228 |
+
// Apply direction for current language
|
| 1229 |
+
applyDirection(currentLanguage);
|
| 1230 |
+
|
| 1231 |
+
// Update cache status
|
| 1232 |
+
updateCacheStatus(currentLanguage);
|
| 1233 |
+
updateCacheStatusDisplay();
|
| 1234 |
+
|
| 1235 |
+
// Show appropriate screen
|
| 1236 |
+
if (currentApiKey && currentLanguage) {
|
| 1237 |
+
showMainApp();
|
| 1238 |
+
} else {
|
| 1239 |
+
showLanguageLanding();
|
| 1240 |
+
}
|
| 1241 |
+
}
|
| 1242 |
+
|
| 1243 |
+
// Apply language direction
|
| 1244 |
+
function applyDirection(language) {
|
| 1245 |
+
currentLanguage = language;
|
| 1246 |
+
|
| 1247 |
+
// Set document language and direction
|
| 1248 |
+
document.documentElement.lang = language;
|
| 1249 |
+
document.documentElement.dir = rtlLanguages.includes(language) ? 'rtl' : 'ltr';
|
| 1250 |
+
|
| 1251 |
+
// Save language preference
|
| 1252 |
+
localStorage.setItem('ideaforge_language', language);
|
| 1253 |
+
|
| 1254 |
+
// Update cache status
|
| 1255 |
+
updateCacheStatus(language);
|
| 1256 |
+
}
|
| 1257 |
+
|
| 1258 |
+
// API call function for translation
|
| 1259 |
+
async function translateText(text, targetLanguage) {
|
| 1260 |
+
if (!currentApiKey) {
|
| 1261 |
+
throw new Error('API key is required for translation');
|
| 1262 |
+
}
|
| 1263 |
+
|
| 1264 |
+
const languageName = languageNames[targetLanguage] || 'English';
|
| 1265 |
+
|
| 1266 |
+
const prompt = `Translate the following text to ${languageName}. Provide ONLY the exact translation without any explanations, additional information, or formatting:
|
| 1267 |
+
|
| 1268 |
+
"${text}"`;
|
| 1269 |
+
|
| 1270 |
+
const payload = {
|
| 1271 |
+
model: "gpt-4o-mini",
|
| 1272 |
+
messages: [{ role: "user", content: prompt }],
|
| 1273 |
+
max_tokens: 500,
|
| 1274 |
+
temperature: 0.1
|
| 1275 |
+
};
|
| 1276 |
+
|
| 1277 |
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
| 1278 |
+
method: "POST",
|
| 1279 |
+
headers: {
|
| 1280 |
+
"Content-Type": "application/json",
|
| 1281 |
+
"Authorization": `Bearer ${currentApiKey}`
|
| 1282 |
+
},
|
| 1283 |
+
body: JSON.stringify(payload)
|
| 1284 |
+
});
|
| 1285 |
+
|
| 1286 |
+
if (!response.ok) {
|
| 1287 |
+
const errorData = await response.json();
|
| 1288 |
+
throw new Error(errorData.error?.message || "Translation API request failed");
|
| 1289 |
+
}
|
| 1290 |
+
|
| 1291 |
+
const data = await response.json();
|
| 1292 |
+
return data.choices[0].message.content.trim();
|
| 1293 |
+
}
|
| 1294 |
+
|
| 1295 |
+
// Apply cached translations to UI
|
| 1296 |
+
function applyCachedTranslations(translations) {
|
| 1297 |
+
// Apply text translations
|
| 1298 |
+
Object.keys(translations.texts).forEach(originalText => {
|
| 1299 |
+
const translation = translations.texts[originalText];
|
| 1300 |
+
const elements = document.querySelectorAll(`[data-translate]`);
|
| 1301 |
+
|
| 1302 |
+
elements.forEach(element => {
|
| 1303 |
+
const originalElementText = element.getAttribute('data-original-text') || element.textContent;
|
| 1304 |
+
if (originalElementText === originalText) {
|
| 1305 |
+
element.textContent = translation;
|
| 1306 |
+
}
|
| 1307 |
+
});
|
| 1308 |
+
});
|
| 1309 |
+
|
| 1310 |
+
// Apply placeholder translations
|
| 1311 |
+
Object.keys(translations.placeholders).forEach(originalPlaceholder => {
|
| 1312 |
+
const translation = translations.placeholders[originalPlaceholder];
|
| 1313 |
+
const elements = document.querySelectorAll(`[data-translate-placeholder]`);
|
| 1314 |
+
|
| 1315 |
+
elements.forEach(element => {
|
| 1316 |
+
const originalElementPlaceholder = element.getAttribute('data-original-placeholder') || element.placeholder;
|
| 1317 |
+
if (originalElementPlaceholder === originalPlaceholder) {
|
| 1318 |
+
element.placeholder = translation;
|
| 1319 |
+
}
|
| 1320 |
+
});
|
| 1321 |
+
});
|
| 1322 |
+
}
|
| 1323 |
+
|
| 1324 |
+
// Translate all UI elements
|
| 1325 |
+
async function translateInterface(targetLanguage) {
|
| 1326 |
+
if (targetLanguage === 'en') {
|
| 1327 |
+
// No translation needed for English
|
| 1328 |
+
return;
|
| 1329 |
+
}
|
| 1330 |
+
|
| 1331 |
+
// Check if translations are cached
|
| 1332 |
+
const cachedTranslations = loadTranslationsFromCache(targetLanguage);
|
| 1333 |
+
if (cachedTranslations) {
|
| 1334 |
+
// Use cached translations
|
| 1335 |
+
console.log('Using cached translations for', targetLanguage);
|
| 1336 |
+
applyCachedTranslations(cachedTranslations);
|
| 1337 |
+
return;
|
| 1338 |
+
}
|
| 1339 |
+
|
| 1340 |
+
// Need to translate via API
|
| 1341 |
+
showTranslationOverlay();
|
| 1342 |
+
|
| 1343 |
+
try {
|
| 1344 |
+
// Get all elements with data-translate attribute
|
| 1345 |
+
const elements = document.querySelectorAll('[data-translate]');
|
| 1346 |
+
const placeholderElements = document.querySelectorAll('[data-translate-placeholder]');
|
| 1347 |
+
|
| 1348 |
+
// Collect all texts to translate
|
| 1349 |
+
const textsToTranslate = [];
|
| 1350 |
+
const placeholdersToTranslate = [];
|
| 1351 |
+
const elementMap = new Map();
|
| 1352 |
+
|
| 1353 |
+
elements.forEach(element => {
|
| 1354 |
+
const originalText = element.getAttribute('data-original-text') || element.textContent;
|
| 1355 |
+
if (!element.getAttribute('data-original-text')) {
|
| 1356 |
+
element.setAttribute('data-original-text', originalText);
|
| 1357 |
+
}
|
| 1358 |
+
textsToTranslate.push(originalText);
|
| 1359 |
+
elementMap.set(originalText, element);
|
| 1360 |
+
});
|
| 1361 |
+
|
| 1362 |
+
placeholderElements.forEach(element => {
|
| 1363 |
+
const originalPlaceholder = element.getAttribute('data-original-placeholder') || element.placeholder;
|
| 1364 |
+
if (!element.getAttribute('data-original-placeholder')) {
|
| 1365 |
+
element.setAttribute('data-original-placeholder', originalPlaceholder);
|
| 1366 |
+
}
|
| 1367 |
+
placeholdersToTranslate.push(originalPlaceholder);
|
| 1368 |
+
elementMap.set(originalPlaceholder, element);
|
| 1369 |
+
});
|
| 1370 |
+
|
| 1371 |
+
// Prepare cache structure
|
| 1372 |
+
const translationsCache = {
|
| 1373 |
+
texts: {},
|
| 1374 |
+
placeholders: {}
|
| 1375 |
+
};
|
| 1376 |
+
|
| 1377 |
+
// Translate texts in batches
|
| 1378 |
+
const batchSize = 10;
|
| 1379 |
+
const allTexts = [...textsToTranslate, ...placeholdersToTranslate];
|
| 1380 |
+
|
| 1381 |
+
for (let i = 0; i < allTexts.length; i += batchSize) {
|
| 1382 |
+
const batch = allTexts.slice(i, i + batchSize);
|
| 1383 |
+
|
| 1384 |
+
// Update progress
|
| 1385 |
+
updateTranslationProgress(i, allTexts.length);
|
| 1386 |
+
|
| 1387 |
+
// Translate batch
|
| 1388 |
+
const translations = await Promise.all(
|
| 1389 |
+
batch.map(text => translateText(text, targetLanguage))
|
| 1390 |
+
);
|
| 1391 |
+
|
| 1392 |
+
// Apply translations and cache them
|
| 1393 |
+
batch.forEach((originalText, index) => {
|
| 1394 |
+
const element = elementMap.get(originalText);
|
| 1395 |
+
const translation = translations[index];
|
| 1396 |
+
|
| 1397 |
+
if (element.hasAttribute('data-translate')) {
|
| 1398 |
+
element.textContent = translation;
|
| 1399 |
+
translationsCache.texts[originalText] = translation;
|
| 1400 |
+
} else if (element.hasAttribute('data-translate-placeholder')) {
|
| 1401 |
+
element.placeholder = translation;
|
| 1402 |
+
translationsCache.placeholders[originalText] = translation;
|
| 1403 |
+
}
|
| 1404 |
+
});
|
| 1405 |
+
}
|
| 1406 |
+
|
| 1407 |
+
// Save translations to cache
|
| 1408 |
+
saveTranslationsToCache(targetLanguage, translationsCache);
|
| 1409 |
+
|
| 1410 |
+
// Update cache status
|
| 1411 |
+
updateCacheStatus(targetLanguage);
|
| 1412 |
+
updateCacheStatusDisplay();
|
| 1413 |
+
|
| 1414 |
+
} catch (error) {
|
| 1415 |
+
console.error('Translation error:', error);
|
| 1416 |
+
showError('Translation failed: ' + error.message);
|
| 1417 |
+
} finally {
|
| 1418 |
+
hideTranslationOverlay();
|
| 1419 |
+
}
|
| 1420 |
+
}
|
| 1421 |
+
|
| 1422 |
+
// Show translation overlay
|
| 1423 |
+
function showTranslationOverlay() {
|
| 1424 |
+
document.getElementById('translationOverlay').style.display = 'flex';
|
| 1425 |
+
}
|
| 1426 |
+
|
| 1427 |
+
// Hide translation overlay
|
| 1428 |
+
function hideTranslationOverlay() {
|
| 1429 |
+
document.getElementById('translationOverlay').style.display = 'none';
|
| 1430 |
+
}
|
| 1431 |
+
|
| 1432 |
+
// Update translation progress
|
| 1433 |
+
function updateTranslationProgress(current, total) {
|
| 1434 |
+
const percentage = Math.round((current / total) * 100);
|
| 1435 |
+
document.getElementById('translationMessage').textContent =
|
| 1436 |
+
`Translating interface... ${percentage}% complete (will be cached for future use)`;
|
| 1437 |
+
}
|
| 1438 |
+
|
| 1439 |
+
// Apply language with API translation or cache
|
| 1440 |
+
async function applyLanguage(language) {
|
| 1441 |
+
applyDirection(language);
|
| 1442 |
+
|
| 1443 |
+
if (language !== 'en') {
|
| 1444 |
+
await translateInterface(language);
|
| 1445 |
+
}
|
| 1446 |
+
}
|
| 1447 |
+
|
| 1448 |
+
// Show language landing page
|
| 1449 |
+
function showLanguageLanding() {
|
| 1450 |
+
document.getElementById('languageLanding').style.display = 'block';
|
| 1451 |
+
document.getElementById('mainApp').style.display = 'none';
|
| 1452 |
+
}
|
| 1453 |
+
|
| 1454 |
+
// Show main application
|
| 1455 |
+
function showMainApp() {
|
| 1456 |
+
document.getElementById('languageLanding').style.display = 'none';
|
| 1457 |
+
document.getElementById('mainApp').style.display = 'block';
|
| 1458 |
+
|
| 1459 |
+
// Set API key in main app
|
| 1460 |
+
document.getElementById('apiKey').value = currentApiKey;
|
| 1461 |
+
}
|
| 1462 |
+
|
| 1463 |
+
// Start button click handler
|
| 1464 |
+
document.getElementById('startBtn').addEventListener('click', async function() {
|
| 1465 |
+
const selectedLanguage = document.getElementById('languageSelect').value;
|
| 1466 |
+
const apiKey = document.getElementById('apiKeyLanding').value.trim();
|
| 1467 |
+
|
| 1468 |
+
if (!apiKey) {
|
| 1469 |
+
alert('Please enter your OpenAI API key');
|
| 1470 |
+
return;
|
| 1471 |
+
}
|
| 1472 |
+
|
| 1473 |
+
currentLanguage = selectedLanguage;
|
| 1474 |
+
currentApiKey = apiKey;
|
| 1475 |
+
|
| 1476 |
+
// Save API key
|
| 1477 |
+
localStorage.setItem('ideaforge_api_key', apiKey);
|
| 1478 |
+
|
| 1479 |
+
// Apply language with translation (cached or API)
|
| 1480 |
+
await applyLanguage(selectedLanguage);
|
| 1481 |
+
|
| 1482 |
+
// Show main app
|
| 1483 |
+
showMainApp();
|
| 1484 |
+
});
|
| 1485 |
+
|
| 1486 |
+
// Language selector change handler
|
| 1487 |
+
document.getElementById('languageSelect').addEventListener('change', async function() {
|
| 1488 |
+
const selectedLanguage = this.value;
|
| 1489 |
+
updateCacheStatus(selectedLanguage);
|
| 1490 |
+
|
| 1491 |
+
if (currentApiKey) {
|
| 1492 |
+
await applyLanguage(selectedLanguage);
|
| 1493 |
+
} else {
|
| 1494 |
+
applyDirection(selectedLanguage);
|
| 1495 |
+
}
|
| 1496 |
+
});
|
| 1497 |
+
|
| 1498 |
+
// Clear cache button handler
|
| 1499 |
+
document.getElementById('clearCacheBtn').addEventListener('click', clearAllTranslationCache);
|
| 1500 |
+
|
| 1501 |
+
// API key sync between landing and main app
|
| 1502 |
+
document.getElementById('apiKeyLanding').addEventListener('input', function() {
|
| 1503 |
+
currentApiKey = this.value;
|
| 1504 |
+
localStorage.setItem('ideaforge_api_key', this.value);
|
| 1505 |
+
document.getElementById('apiKey').value = this.value;
|
| 1506 |
+
});
|
| 1507 |
+
|
| 1508 |
+
document.getElementById('apiKey').addEventListener('input', function() {
|
| 1509 |
+
currentApiKey = this.value;
|
| 1510 |
+
localStorage.setItem('ideaforge_api_key', this.value);
|
| 1511 |
+
document.getElementById('apiKeyLanding').value = this.value;
|
| 1512 |
+
});
|
| 1513 |
+
|
| 1514 |
+
// Scroll-based progress bar
|
| 1515 |
+
window.addEventListener('scroll', () => {
|
| 1516 |
+
const { scrollTop, scrollHeight } = document.documentElement;
|
| 1517 |
+
const scrolled = (scrollTop / (scrollHeight - window.innerHeight)) * 100;
|
| 1518 |
+
document.getElementById('progressBar').style.width = `${scrolled}%`;
|
| 1519 |
+
});
|
| 1520 |
+
|
| 1521 |
+
// Error handling
|
| 1522 |
+
function showError(message) {
|
| 1523 |
+
const errorDiv = document.getElementById('errorMessage');
|
| 1524 |
+
errorDiv.textContent = message;
|
| 1525 |
+
errorDiv.style.display = 'block';
|
| 1526 |
+
setTimeout(() => {
|
| 1527 |
+
errorDiv.style.display = 'none';
|
| 1528 |
+
}, 5000);
|
| 1529 |
+
}
|
| 1530 |
+
|
| 1531 |
+
// API call function - Updated to use current language
|
| 1532 |
+
async function callAPI(prompt) {
|
| 1533 |
+
const apiKey = document.getElementById('apiKey').value.trim();
|
| 1534 |
+
|
| 1535 |
+
if (!apiKey) {
|
| 1536 |
+
throw new Error('Please enter your OpenAI API key');
|
| 1537 |
+
}
|
| 1538 |
+
|
| 1539 |
+
const payload = {
|
| 1540 |
+
model: "gpt-4o-mini",
|
| 1541 |
+
messages: [{ role: "user", content: prompt }],
|
| 1542 |
+
max_tokens: 3000,
|
| 1543 |
+
temperature: 0.7
|
| 1544 |
+
};
|
| 1545 |
+
|
| 1546 |
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
| 1547 |
+
method: "POST",
|
| 1548 |
+
headers: {
|
| 1549 |
+
"Content-Type": "application/json",
|
| 1550 |
+
"Authorization": `Bearer ${apiKey}`
|
| 1551 |
+
},
|
| 1552 |
+
body: JSON.stringify(payload)
|
| 1553 |
+
});
|
| 1554 |
+
|
| 1555 |
+
if (!response.ok) {
|
| 1556 |
+
const errorData = await response.json();
|
| 1557 |
+
throw new Error(errorData.error?.message || "API request failed");
|
| 1558 |
+
}
|
| 1559 |
+
|
| 1560 |
+
const data = await response.json();
|
| 1561 |
+
return data.choices[0].message.content;
|
| 1562 |
+
}
|
| 1563 |
+
|
| 1564 |
+
// Build comprehensive brainstorming prompt - Updated to use current language dynamically
|
| 1565 |
+
function buildBrainstormingPrompt() {
|
| 1566 |
+
const languageName = languageNames[currentLanguage] || 'English';
|
| 1567 |
+
const problemDefinition = document.getElementById('problemDefinition').value.trim();
|
| 1568 |
+
const ideaGeneration = document.getElementById('ideaGeneration').value.trim();
|
| 1569 |
+
const ideaCapture = document.getElementById('ideaCapture').value.trim();
|
| 1570 |
+
const ideaOrganization = document.getElementById('ideaOrganization').value.trim();
|
| 1571 |
+
const criticalAnalysis = document.getElementById('criticalAnalysis').value.trim();
|
| 1572 |
+
const ideaRefinement = document.getElementById('ideaRefinement').value.trim();
|
| 1573 |
+
const prioritization = document.getElementById('prioritization').value.trim();
|
| 1574 |
+
|
| 1575 |
+
return `
|
| 1576 |
+
You are an expert educational strategist and innovation consultant tasked with generating a comprehensive brainstorming analysis in ${languageName} based on the inputs provided below. Your final output must be organized into clear sections, each featuring detailed insights and actionable recommendations:
|
| 1577 |
+
|
| 1578 |
+
**Important: Generate the entire response in ${languageName}. All content, headings, explanations, and recommendations must be written in ${languageName}.**
|
| 1579 |
+
|
| 1580 |
+
1. **Problem Definition & Goal Articulation**
|
| 1581 |
+
- Rephrase and clarify the problem statement provided by the user
|
| 1582 |
+
- Articulate specific, measurable goals and objectives to address it
|
| 1583 |
+
- Identify key stakeholders and success metrics
|
| 1584 |
+
User Input: ${problemDefinition}
|
| 1585 |
+
|
| 1586 |
+
2. **Structured Idea Generation (Time-Boxed: ${ideaGeneration})**
|
| 1587 |
+
- Produce a rapid-fire list of 15-20 innovative ideas related to the defined problem
|
| 1588 |
+
- Use various brainstorming techniques (SCAMPER, Six Thinking Hats, etc.)
|
| 1589 |
+
- Include both conventional and unconventional approaches
|
| 1590 |
+
- Ensure ideas span different categories: immediate solutions, long-term strategies, and creative alternatives
|
| 1591 |
+
|
| 1592 |
+
3. **Comprehensive Idea Capture & Compilation**
|
| 1593 |
+
- Compile all ideas generated (both AI-generated and user-contributed) into a cohesive, numbered list
|
| 1594 |
+
- Add brief descriptions for each idea to ensure clarity
|
| 1595 |
+
- User Additional Ideas: ${ideaCapture}
|
| 1596 |
+
|
| 1597 |
+
4. **Strategic Idea Organization & Categorization**
|
| 1598 |
+
- Categorize the ideas into 3-5 logical groupings based on themes, implementation timeline, or approach
|
| 1599 |
+
- Create a visual representation framework (mind map structure described in text)
|
| 1600 |
+
- Identify patterns and connections between ideas
|
| 1601 |
+
- User Thoughts on Grouping: ${ideaOrganization}
|
| 1602 |
+
|
| 1603 |
+
5. **Deep Critical Analysis & Probing Questions**
|
| 1604 |
+
- For the selected idea: "${criticalAnalysis}"
|
| 1605 |
+
- Apply the "5 Whys" technique to uncover root causes
|
| 1606 |
+
- Generate 8-10 probing questions covering feasibility, resources, risks, and implementation
|
| 1607 |
+
- Identify potential obstacles and mitigation strategies
|
| 1608 |
+
- Analyze strengths, weaknesses, opportunities, and threats (SWOT)
|
| 1609 |
+
|
| 1610 |
+
6. **Idea Refinement & Enhancement**
|
| 1611 |
+
- Based on the user's refinement input: "${ideaRefinement}"
|
| 1612 |
+
- Present 3-5 refined versions of the selected idea
|
| 1613 |
+
- Suggest possibilities for combining related concepts
|
| 1614 |
+
- Propose hybrid solutions that merge multiple approaches
|
| 1615 |
+
- Include implementation considerations and resource requirements
|
| 1616 |
+
|
| 1617 |
+
7. **Strategic Prioritization & Ranking**
|
| 1618 |
+
- Utilize the user's criteria: "${prioritization}"
|
| 1619 |
+
- Create a prioritization matrix ranking top 10 ideas
|
| 1620 |
+
- Provide detailed rationale for rankings
|
| 1621 |
+
- Identify quick wins vs. long-term strategic initiatives
|
| 1622 |
+
- Recommend the top 3 ideas for immediate development with justification
|
| 1623 |
+
|
| 1624 |
+
8. **Comprehensive Wrap-Up & Next Steps**
|
| 1625 |
+
- Provide an executive summary of the brainstorming session
|
| 1626 |
+
- Recommend the most effective visual presentation format for outcomes
|
| 1627 |
+
- Suggest specific next steps for implementation
|
| 1628 |
+
- Include a timeline for moving forward with priority ideas
|
| 1629 |
+
- Propose methods for testing and validating selected concepts
|
| 1630 |
+
|
| 1631 |
+
**Formatting Requirements:**
|
| 1632 |
+
- Use clear headers and subheaders for each section
|
| 1633 |
+
- Include bullet points and numbered lists for easy scanning
|
| 1634 |
+
- Provide actionable recommendations throughout
|
| 1635 |
+
- Ensure professional tone suitable for business or educational contexts
|
| 1636 |
+
- Make the output comprehensive yet accessible
|
| 1637 |
+
|
| 1638 |
+
Ensure that all sections are seamlessly integrated into one final output that is clear, professional, and immediately actionable for the user.
|
| 1639 |
+
`;
|
| 1640 |
+
}
|
| 1641 |
+
|
| 1642 |
+
// Validation function
|
| 1643 |
+
function validateInputs() {
|
| 1644 |
+
const requiredFields = [
|
| 1645 |
+
'problemDefinition',
|
| 1646 |
+
'ideaGeneration',
|
| 1647 |
+
'ideaCapture',
|
| 1648 |
+
'ideaOrganization',
|
| 1649 |
+
'criticalAnalysis',
|
| 1650 |
+
'ideaRefinement',
|
| 1651 |
+
'prioritization'
|
| 1652 |
+
];
|
| 1653 |
+
|
| 1654 |
+
for (const fieldId of requiredFields) {
|
| 1655 |
+
const field = document.getElementById(fieldId);
|
| 1656 |
+
if (!field.value.trim()) {
|
| 1657 |
+
field.focus();
|
| 1658 |
+
throw new Error(`Please fill in the ${field.previousElementSibling.textContent.replace(/[🎯⏱️💡📊🔍🔧⭐]/g, '').trim()} field`);
|
| 1659 |
+
}
|
| 1660 |
+
}
|
| 1661 |
+
}
|
| 1662 |
+
|
| 1663 |
+
// Generate brainstorming analysis
|
| 1664 |
+
document.getElementById('generateBrainstormingBtn').addEventListener('click', async function() {
|
| 1665 |
+
const button = this;
|
| 1666 |
+
const buttonText = document.getElementById('buttonText');
|
| 1667 |
+
const spinner = document.getElementById('spinner');
|
| 1668 |
+
const outputArea = document.getElementById('brainstormingOutput');
|
| 1669 |
+
|
| 1670 |
+
try {
|
| 1671 |
+
// Validate inputs
|
| 1672 |
+
validateInputs();
|
| 1673 |
+
|
| 1674 |
+
// Update button state
|
| 1675 |
+
button.disabled = true;
|
| 1676 |
+
spinner.style.display = 'inline-block';
|
| 1677 |
+
buttonText.textContent = 'Generating Analysis...';
|
| 1678 |
+
|
| 1679 |
+
// Clear previous output
|
| 1680 |
+
outputArea.textContent = '';
|
| 1681 |
+
|
| 1682 |
+
// Build prompt and call API
|
| 1683 |
+
const prompt = buildBrainstormingPrompt();
|
| 1684 |
+
const result = await callAPI(prompt);
|
| 1685 |
+
|
| 1686 |
+
// Display result
|
| 1687 |
+
outputArea.textContent = result;
|
| 1688 |
+
|
| 1689 |
+
} catch (error) {
|
| 1690 |
+
showError(error.message);
|
| 1691 |
+
outputArea.textContent = '';
|
| 1692 |
+
} finally {
|
| 1693 |
+
// Reset button state
|
| 1694 |
+
button.disabled = false;
|
| 1695 |
+
spinner.style.display = 'none';
|
| 1696 |
+
buttonText.textContent = '🚀 Generate Comprehensive Brainstorming Analysis';
|
| 1697 |
+
}
|
| 1698 |
+
});
|
| 1699 |
+
|
| 1700 |
+
// Keyboard shortcut for generation
|
| 1701 |
+
document.addEventListener('keydown', function(e) {
|
| 1702 |
+
if (e.ctrlKey && e.key === 'Enter') {
|
| 1703 |
+
e.preventDefault();
|
| 1704 |
+
document.getElementById('generateBrainstormingBtn').click();
|
| 1705 |
+
}
|
| 1706 |
+
});
|
| 1707 |
+
|
| 1708 |
+
// Initialize app when DOM is loaded
|
| 1709 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 1710 |
+
initializeApp();
|
| 1711 |
+
});
|
| 1712 |
+
</script>
|
| 1713 |
+
</body>
|
| 1714 |
+
</html>
|
| 1715 |
+
|
README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: "💡 IdeaForge Pro – Advanced Brainstorming Intelligence"
|
| 3 |
+
emoji: "💡"
|
| 4 |
+
colorFrom: "green"
|
| 5 |
+
colorTo: "blue"
|
| 6 |
+
sdk: "static"
|
| 7 |
+
sdk_version: "0.1.0"
|
| 8 |
+
app_file: "Index.html"
|
| 9 |
+
pinned: false
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# 💡 IdeaForge Pro – Advanced Brainstorming Intelligence
|
| 13 |
+
**Developed by Shift Mind AI Labs**
|
| 14 |
+
|
| 15 |
+
IdeaForge Pro is an open-source, privacy-first platform for professional, multilingual brainstorming and idea development.
|
| 16 |
+
Empower creative thinking, problem-solving, and critical analysis in any classroom, project, or professional context—instantly and securely.
|
| 17 |
+
|
| 18 |
+
---
|
| 19 |
+
|
| 20 |
+
## 🚀 Features
|
| 21 |
+
|
| 22 |
+
- **Structured Brainstorming Workflow:**
|
| 23 |
+
Step-by-step prompts for problem definition, idea capture, organization, deep analysis, refinement, and prioritization.
|
| 24 |
+
- **AI-Enhanced Output:**
|
| 25 |
+
Generates comprehensive, multi-section analysis with actionable recommendations in 80+ languages.
|
| 26 |
+
- **Critical & Creative Thinking:**
|
| 27 |
+
Combines classic and advanced brainstorming, organization, and evaluation techniques.
|
| 28 |
+
- **Modern, Accessible UI:**
|
| 29 |
+
Multilingual, RTL/LTR support, color-coded cards, responsive and accessible.
|
| 30 |
+
- **Data Privacy:**
|
| 31 |
+
All content and keys **never leave your browser**—full local processing.
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
## 🛠 How to Use
|
| 36 |
+
|
| 37 |
+
1. **Open the tool** in your browser (local HTML or Hugging Face Space).
|
| 38 |
+
2. **Select your language** and enter your OpenAI API key (never leaves your device).
|
| 39 |
+
3. **Complete each brainstorming section** (see guide for tips and samples).
|
| 40 |
+
4. **Click “Generate Comprehensive Brainstorming Analysis”**.
|
| 41 |
+
5. **Review, copy, and use** the output for projects, reports, lessons, or innovation sessions.
|
| 42 |
+
|
| 43 |
+
---
|
| 44 |
+
|
| 45 |
+
## 👩🏫 For Teachers
|
| 46 |
+
|
| 47 |
+
- **Class Project Launch:**
|
| 48 |
+
Guide student groups through problem-solving and creative ideation.
|
| 49 |
+
- **Critical Thinking Skills:**
|
| 50 |
+
Teach the full cycle of innovation from problem framing to prioritization.
|
| 51 |
+
- **Cross-Disciplinary Use:**
|
| 52 |
+
Suitable for STEM, humanities, entrepreneurship, design, and more.
|
| 53 |
+
- **Formative Assessment:**
|
| 54 |
+
Use outputs for peer review, reflection, and project portfolios.
|
| 55 |
+
|
| 56 |
+
---
|
| 57 |
+
|
| 58 |
+
## 👨🎓 For Students
|
| 59 |
+
|
| 60 |
+
- **Individual & Team Projects:**
|
| 61 |
+
Tackle complex challenges step by step, using structured inputs.
|
| 62 |
+
- **Innovation Competitions:**
|
| 63 |
+
Prepare comprehensive, competitive submissions with AI guidance.
|
| 64 |
+
- **Skill Building:**
|
| 65 |
+
Develop organization, analysis, and strategic evaluation skills.
|
| 66 |
+
- **Multilingual Learning:**
|
| 67 |
+
Switch UI/output to your language—ideal for global and bilingual settings.
|
| 68 |
+
|
| 69 |
+
---
|
| 70 |
+
|
| 71 |
+
## 🔐 Data Privacy
|
| 72 |
+
|
| 73 |
+
- Your OpenAI API key and all content **never leave your device**.
|
| 74 |
+
- No data is transmitted to Shift Mind AI Labs, Hugging Face, or third parties.
|
| 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, innovation, and digital transformation.
|
| 87 |
+
|
| 88 |
+
🌐 https://www.shiftmind.io
|
| 89 |
+
✉️ info@shiftmind.io
|
| 90 |
+
|
| 91 |
+
---
|
| 92 |
+
|
| 93 |
+
## 🙌 Contributing
|
| 94 |
+
|
| 95 |
+
Feedback, ideas, and collaboration welcome!
|
| 96 |
+
For pilots, research, or partnerships: **info@shiftmind.io**
|
| 97 |
+
|
| 98 |
+
---
|
| 99 |
+
|
| 100 |
+
*Ignite every learner and team with structured, ethical, and creative brainstorming—anytime, anywhere, in any language.*
|
📘 Teacher & Student Guide IdeaForg.txt
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
📘 Teacher & Student Guide: IdeaForge Pro
|
| 2 |
+
Purpose & Classroom Impact
|
| 3 |
+
IdeaForge Pro supports educators and students in structured, creative, and critical brainstorming. It’s ideal for problem-solving in any subject—enabling deep thinking, collaboration, and practical project planning.
|
| 4 |
+
|
| 5 |
+
Step-by-Step Guide to Each Section
|
| 6 |
+
Section Explanation for Teachers & Students Sample Input
|
| 7 |
+
1. Problem Definition Describe the challenge or problem you want to solve. Be clear and concise. Framing the right question is the key to effective brainstorming. “How can our school reduce plastic waste in the cafeteria?”
|
| 8 |
+
2. Idea Generation Timeline Set a time limit for how long you’ll generate ideas (e.g., 10 minutes, 1 lesson, 2 days). This helps focus energy and creativity. “15 minutes” or “One class period”
|
| 9 |
+
3. Additional Ideas List any ideas you already have before starting the full brainstorm. There are no bad ideas—add everything that comes to mind. “Ban single-use bottles, start a recycling contest, give rewards for reusable lunchboxes.”
|
| 10 |
+
4. Idea Organization Strategy How will you group, categorize, or organize your ideas? (e.g., by type, timeline, feasibility, theme, etc.) “I will group ideas into quick wins, long-term projects, and awareness campaigns.”
|
| 11 |
+
5. Critical Analysis Focus Pick one idea from your list that you want to examine deeply—think about why it might work or fail, what’s needed, and possible impacts. “Ban single-use plastic bottles in the school.”
|
| 12 |
+
6. Idea Refinement Input How would you improve, combine, or reframe your chosen idea? Note feedback, challenges, or ways to make it stronger. “Maybe allow exceptions for medical needs; combine the ban with education sessions.”
|
| 13 |
+
7. Prioritization Criteria List the standards you’ll use to pick the best ideas. Consider cost, impact, ease, time, resources, and alignment with your goals. “Low cost, high impact, easy to implement, community support.”
|
| 14 |
+
|
| 15 |
+
Using the Tool: Tips for Success
|
| 16 |
+
Brainstorm in Groups: Assign roles—scribe, leader, timekeeper, presenter—for collaborative work.
|
| 17 |
+
|
| 18 |
+
Think Broadly: Encourage both realistic and “wild” ideas—creativity leads to innovation.
|
| 19 |
+
|
| 20 |
+
Critical Thinking: Don’t just list ideas—analyze, question, and refine them.
|
| 21 |
+
|
| 22 |
+
Use Output as a Project Plan: The generated report is ready to share or build on for project-based learning.
|
| 23 |
+
|
| 24 |
+
Multilingual Option: Use the language selector for ELLs or global teams.
|
| 25 |
+
|
| 26 |
+
Classroom & Project Applications
|
| 27 |
+
STEM Challenges: Tackle real-world engineering or science problems.
|
| 28 |
+
|
| 29 |
+
Entrepreneurship: Develop business or social innovation pitches.
|
| 30 |
+
|
| 31 |
+
Literature/Social Studies: Analyze historical or fictional problems—generate solutions as the protagonist.
|
| 32 |
+
|
| 33 |
+
School Improvement: Plan school-wide initiatives with broad student input.
|
| 34 |
+
|
| 35 |
+
Troubleshooting & Support
|
| 36 |
+
If output is generic, give more detail in your input for each section.
|
| 37 |
+
|
| 38 |
+
API errors? Double-check your OpenAI key and internet connection.
|
| 39 |
+
|
| 40 |
+
For technical help: info@shiftmind.io | www.shiftmind.io
|
| 41 |
+
|
| 42 |
+
IdeaForge Pro transforms classrooms and teams into innovation labs—turning ideas into impact through structure, creativity, and deep analysis.
|