synthos 0.7.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -65
- package/default-pages/application/page.html +42 -0
- package/default-pages/application/page.json +10 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
- package/default-pages/elevenlabs_effects_studio/page.json +11 -0
- package/default-pages/elevenlabs_voice_studio/page.html +801 -0
- package/default-pages/elevenlabs_voice_studio/page.json +11 -0
- package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
- package/default-pages/json_tools/page.json +10 -0
- package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
- package/default-pages/my_notes/page.html +132 -0
- package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
- package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
- package/default-pages/neon_asteroids/files/effects.json +74 -0
- package/default-pages/neon_asteroids/page.html +1822 -0
- package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
- package/default-pages/oregon_trail/page.html +323 -0
- package/default-pages/oregon_trail/page.json +12 -0
- package/default-pages/retro_game_starter/page.html +1308 -0
- package/default-pages/retro_game_starter/page.json +12 -0
- package/default-pages/{sidebar_builder.html → sidebar_page/page.html} +12 -10
- package/default-pages/sidebar_page/page.json +10 -0
- package/default-pages/{solar_explorer.html → solar_explorer/page.html} +24 -29
- package/default-pages/{solar_explorer.json → solar_explorer/page.json} +4 -4
- package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
- package/default-pages/solar_tutorial/page.json +10 -0
- package/default-pages/{two-panel_builder.html → two-panel_page/page.html} +13 -11
- package/default-pages/two-panel_page/page.json +10 -0
- package/default-pages/us_map/page.html +193 -0
- package/default-pages/us_map/page.json +12 -0
- package/default-pages/us_map_1850/page.html +326 -0
- package/default-pages/us_map_1850/page.json +12 -0
- package/default-pages/western_cities_1850/page.html +527 -0
- package/default-pages/western_cities_1850/page.json +12 -0
- package/default-themes/aurora-dawn.json +19 -0
- package/default-themes/aurora-dawn.v3.css +198 -0
- package/default-themes/aurora-dusk.json +19 -0
- package/default-themes/aurora-dusk.v3.css +200 -0
- package/default-themes/cosmos-dawn.json +19 -0
- package/default-themes/cosmos-dawn.v3.css +198 -0
- package/default-themes/cosmos-dusk.json +19 -0
- package/default-themes/cosmos-dusk.v3.css +200 -0
- package/default-themes/high-contrast-dark.json +19 -0
- package/default-themes/high-contrast-dark.v3.css +200 -0
- package/default-themes/high-contrast-light.json +19 -0
- package/default-themes/high-contrast-light.v3.css +198 -0
- package/default-themes/{nebula-dawn.css → nebula-dawn.v2.css} +134 -0
- package/default-themes/nebula-dawn.v3.css +199 -0
- package/default-themes/{nebula-dusk.css → nebula-dusk.v2.css} +128 -0
- package/default-themes/nebula-dusk.v3.css +201 -0
- package/default-themes/solar-flare-dawn.json +19 -0
- package/default-themes/solar-flare-dawn.v3.css +198 -0
- package/default-themes/solar-flare-dusk.json +19 -0
- package/default-themes/solar-flare-dusk.v3.css +200 -0
- package/dist/agents/a2a/a2aProvider.d.ts.map +1 -0
- package/dist/agents/a2a/a2aProvider.js +126 -0
- package/dist/agents/a2a/a2aProvider.js.map +1 -0
- package/dist/agents/discovery.d.ts.map +1 -0
- package/dist/agents/discovery.js +52 -0
- package/dist/agents/discovery.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +20 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/openclaw/gatewayManager.d.ts +117 -0
- package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -0
- package/dist/agents/openclaw/gatewayManager.js +486 -0
- package/dist/agents/openclaw/gatewayManager.js.map +1 -0
- package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -0
- package/dist/agents/openclaw/openclawProvider.js +237 -0
- package/dist/agents/openclaw/openclawProvider.js.map +1 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts +25 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -0
- package/dist/agents/openclaw/sshTunnelManager.js +359 -0
- package/dist/agents/openclaw/sshTunnelManager.js.map +1 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +6 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/builders/anthropic.d.ts +31 -0
- package/dist/builders/anthropic.d.ts.map +1 -0
- package/dist/builders/anthropic.js +227 -0
- package/dist/builders/anthropic.js.map +1 -0
- package/dist/builders/fireworksai.d.ts +9 -0
- package/dist/builders/fireworksai.d.ts.map +1 -0
- package/dist/builders/fireworksai.js +57 -0
- package/dist/builders/fireworksai.js.map +1 -0
- package/dist/builders/index.d.ts +13 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +31 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/openai.d.ts +8 -0
- package/dist/builders/openai.d.ts.map +1 -0
- package/dist/builders/openai.js +87 -0
- package/dist/builders/openai.js.map +1 -0
- package/dist/builders/types.d.ts +54 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +211 -0
- package/dist/builders/types.js.map +1 -0
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +3 -2
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +2 -1
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +65 -96
- package/dist/connectors/registry.js.map +1 -1
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/customizer/Customizer.d.ts +57 -0
- package/dist/customizer/Customizer.d.ts.map +1 -0
- package/dist/customizer/Customizer.js +124 -0
- package/dist/customizer/Customizer.js.map +1 -0
- package/dist/customizer/index.d.ts.map +1 -0
- package/dist/customizer/index.js +9 -0
- package/dist/customizer/index.js.map +1 -0
- package/dist/files.d.ts +17 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +75 -1
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +10 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +97 -86
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +142 -145
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +24 -0
- package/dist/models/anthropic.d.ts.map +1 -0
- package/dist/models/anthropic.js +103 -0
- package/dist/models/anthropic.js.map +1 -0
- package/dist/models/chainOfThought.d.ts.map +1 -0
- package/dist/models/chainOfThought.js +45 -0
- package/dist/models/chainOfThought.js.map +1 -0
- package/dist/models/fireworksai.d.ts.map +1 -0
- package/dist/models/fireworksai.js +141 -0
- package/dist/models/fireworksai.js.map +1 -0
- package/dist/models/index.d.ts +7 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +20 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/logCompletePrompt.d.ts.map +1 -0
- package/dist/models/logCompletePrompt.js +23 -0
- package/dist/models/logCompletePrompt.js.map +1 -0
- package/dist/models/openai.d.ts +24 -0
- package/dist/models/openai.d.ts.map +1 -0
- package/dist/models/openai.js +101 -0
- package/dist/models/openai.js.map +1 -0
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +12 -4
- package/dist/models/providers.js.map +1 -1
- package/dist/models/types.d.ts +53 -2
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +21 -0
- package/dist/models/types.js.map +1 -1
- package/dist/models/utils.d.ts.map +1 -0
- package/dist/models/utils.js +21 -0
- package/dist/models/utils.js.map +1 -0
- package/dist/pages.d.ts +30 -7
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +177 -55
- package/dist/pages.js.map +1 -1
- package/dist/scripts.d.ts.map +1 -1
- package/dist/scripts.js +4 -3
- package/dist/scripts.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +9 -6
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/generateImage.d.ts.map +1 -1
- package/dist/service/generateImage.js +3 -3
- package/dist/service/generateImage.js.map +1 -1
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +39 -7
- package/dist/service/server.js.map +1 -1
- package/dist/service/transformPage.d.ts +47 -18
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +559 -270
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useAgentRoutes.d.ts +5 -0
- package/dist/service/useAgentRoutes.d.ts.map +1 -0
- package/dist/service/useAgentRoutes.js +392 -0
- package/dist/service/useAgentRoutes.js.map +1 -0
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +380 -138
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.d.ts.map +1 -1
- package/dist/service/useConnectorRoutes.js +20 -9
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useFileRoutes.d.ts +4 -0
- package/dist/service/useFileRoutes.d.ts.map +1 -0
- package/dist/service/useFileRoutes.js +122 -0
- package/dist/service/useFileRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +660 -68
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts +4 -0
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
- package/dist/service/useSharedDataRoutes.js +104 -0
- package/dist/service/useSharedDataRoutes.js.map +1 -0
- package/dist/service/useSharedFileRoutes.d.ts +4 -0
- package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
- package/dist/service/useSharedFileRoutes.js +121 -0
- package/dist/service/useSharedFileRoutes.js.map +1 -0
- package/dist/settings.d.ts +3 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +5 -8
- package/dist/settings.js.map +1 -1
- package/dist/synthos-cli.d.ts.map +1 -1
- package/dist/synthos-cli.js +4 -3
- package/dist/synthos-cli.js.map +1 -1
- package/dist/themes.d.ts +15 -0
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +106 -20
- package/dist/themes.js.map +1 -1
- package/migration-rules/v1-to-v2.md +193 -0
- package/migration-rules/v2-to-v3.md +481 -0
- package/package.json +15 -11
- package/required-pages/builder/page.html +43 -0
- package/required-pages/builder/page.json +10 -0
- package/required-pages/pages/page.html +924 -0
- package/required-pages/pages/page.json +10 -0
- package/required-pages/settings/page.html +1753 -0
- package/required-pages/settings/page.json +10 -0
- package/required-pages/synthos_apis/page.html +846 -0
- package/required-pages/synthos_apis/page.json +10 -0
- package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
- package/required-pages/synthos_scripts/page.json +10 -0
- package/service-connectors/airtable/connector.json +27 -0
- package/service-connectors/alpha-vantage/connector.json +26 -0
- package/service-connectors/brave-search/connector.json +26 -0
- package/service-connectors/cloudinary/connector.json +27 -0
- package/service-connectors/deepl/connector.json +28 -0
- package/service-connectors/elevenlabs/connector.json +30 -0
- package/service-connectors/giphy/connector.json +27 -0
- package/service-connectors/github/connector.json +29 -0
- package/service-connectors/huggingface/connector.json +27 -0
- package/service-connectors/imgur/connector.json +29 -0
- package/service-connectors/instagram/connector.json +43 -0
- package/service-connectors/jira/connector.json +28 -0
- package/service-connectors/mapbox/connector.json +26 -0
- package/service-connectors/nasa/connector.json +27 -0
- package/service-connectors/newsapi/connector.json +27 -0
- package/service-connectors/notion/connector.json +28 -0
- package/service-connectors/open-exchange-rates/connector.json +27 -0
- package/service-connectors/openweathermap/connector.json +26 -0
- package/service-connectors/pexels/connector.json +27 -0
- package/service-connectors/resend/connector.json +29 -0
- package/service-connectors/rss2json/connector.json +27 -0
- package/service-connectors/sendgrid/connector.json +27 -0
- package/service-connectors/spoonacular/connector.json +28 -0
- package/service-connectors/stability-ai/connector.json +27 -0
- package/service-connectors/twilio/connector.json +28 -0
- package/service-connectors/unsplash/connector.json +27 -0
- package/service-connectors/wolfram-alpha/connector.json +26 -0
- package/service-connectors/youtube-data/connector.json +30 -0
- package/src/agents/a2a/a2aProvider.ts +110 -0
- package/src/agents/discovery.ts +74 -0
- package/src/agents/index.ts +6 -0
- package/src/agents/openclaw/gatewayManager.ts +570 -0
- package/src/agents/openclaw/openclawProvider.ts +259 -0
- package/src/agents/openclaw/sshTunnelManager.ts +393 -0
- package/src/agents/types.ts +82 -0
- package/src/builders/anthropic.ts +283 -0
- package/src/builders/fireworksai.ts +59 -0
- package/src/builders/index.ts +33 -0
- package/src/builders/openai.ts +89 -0
- package/src/builders/types.ts +261 -0
- package/src/connectors/index.ts +3 -1
- package/src/connectors/registry.ts +40 -96
- package/src/connectors/types.ts +25 -0
- package/src/customizer/Customizer.ts +151 -0
- package/src/customizer/index.ts +5 -0
- package/src/files.ts +71 -0
- package/src/index.ts +2 -1
- package/src/init.ts +138 -97
- package/src/migrations.ts +148 -145
- package/src/models/anthropic.ts +119 -0
- package/src/models/chainOfThought.ts +56 -0
- package/src/models/fireworksai.ts +143 -0
- package/src/models/index.ts +7 -1
- package/src/models/logCompletePrompt.ts +25 -0
- package/src/models/openai.ts +110 -0
- package/src/models/providers.ts +12 -3
- package/src/models/types.ts +97 -2
- package/src/models/utils.ts +16 -0
- package/src/pages.ts +176 -54
- package/src/scripts.ts +2 -2
- package/src/service/createCompletePrompt.ts +3 -1
- package/src/service/generateImage.ts +2 -2
- package/src/service/server.ts +39 -8
- package/src/service/transformPage.ts +605 -301
- package/src/service/useAgentRoutes.ts +428 -0
- package/src/service/useApiRoutes.ts +309 -45
- package/src/service/useConnectorRoutes.ts +21 -10
- package/src/service/useFileRoutes.ts +127 -0
- package/src/service/usePageRoutes.ts +736 -75
- package/src/service/useSharedDataRoutes.ts +106 -0
- package/src/service/useSharedFileRoutes.ts +126 -0
- package/src/settings.ts +8 -10
- package/src/synthos-cli.ts +4 -3
- package/src/themes.ts +103 -20
- package/static-files/favicon.svg +12 -0
- package/static-files/fluentlm-instructions.llmd +868 -0
- package/static-files/fluentlm-instructions.md +1595 -0
- package/static-files/fluentlm.css +4844 -0
- package/static-files/fluentlm.js +3602 -0
- package/static-files/fluentlm.min.css +1 -0
- package/static-files/fluentlm.min.js +1 -0
- package/static-files/helpers.v3.js +304 -0
- package/static-files/page.v3.js +1290 -0
- package/static-files/recommended-frameworks.llmd +81 -0
- package/static-files/recommended-frameworks.md +137 -0
- package/static-files/retro-game.js +877 -0
- package/static-files/shell.css +797 -0
- package/static-files/theme-dark.css +169 -0
- package/static-files/theme-light.css +169 -0
- package/tests/anthropic.spec.ts +84 -0
- package/tests/builders.spec.ts +139 -0
- package/tests/chainOfThought.spec.ts +108 -0
- package/tests/ensureScripts.spec.ts +82 -0
- package/tests/files.spec.ts +233 -0
- package/tests/fireworksai.spec.ts +92 -0
- package/tests/logCompletePrompt.spec.ts +74 -0
- package/tests/migrations.spec.ts +79 -1
- package/tests/openai.spec.ts +71 -0
- package/tests/pages.spec.ts +226 -1
- package/tests/providers.spec.ts +144 -0
- package/tests/scripts.spec.ts +209 -0
- package/tests/transformPage.spec.ts +456 -0
- package/tests/types.spec.ts +23 -0
- package/default-pages/app_builder.html +0 -40
- package/default-pages/app_builder.json +0 -1
- package/default-pages/json_tools.json +0 -1
- package/default-pages/my_notes.html +0 -33
- package/default-pages/neon_asteroids.html +0 -77
- package/default-pages/sidebar_builder.json +0 -1
- package/default-pages/solar_tutorial.json +0 -1
- package/default-pages/two-panel_builder.json +0 -1
- package/dist/connectors/index.d.ts +0 -3
- package/dist/connectors/types.d.ts +0 -61
- package/dist/index.d.ts +0 -7
- package/dist/migrations.d.ts +0 -11
- package/dist/models/providers.d.ts +0 -7
- package/dist/scripts.d.ts +0 -14
- package/dist/service/createCompletePrompt.d.ts +0 -5
- package/dist/service/debugLog.d.ts +0 -11
- package/dist/service/generateImage.d.ts +0 -32
- package/dist/service/index.d.ts +0 -8
- package/dist/service/modelInstructions.d.ts +0 -7
- package/dist/service/requiresSettings.d.ts +0 -3
- package/dist/service/server.d.ts +0 -4
- package/dist/service/useApiRoutes.d.ts +0 -4
- package/dist/service/useConnectorRoutes.d.ts +0 -4
- package/dist/service/useDataRoutes.d.ts +0 -4
- package/dist/service/usePageRoutes.d.ts +0 -5
- package/dist/synthos-cli.d.ts +0 -2
- package/images/home.png +0 -0
- package/images/page-management.png +0 -0
- package/images/settings.png +0 -0
- package/images/synthos-square.png +0 -0
- package/page-scripts/helpers-v2.js +0 -121
- package/page-scripts/page-v2.js +0 -615
- package/required-pages/builder.html +0 -74
- package/required-pages/builder.json +0 -1
- package/required-pages/pages.html +0 -196
- package/required-pages/pages.json +0 -1
- package/required-pages/settings.html +0 -841
- package/required-pages/settings.json +0 -1
- package/required-pages/synthos_apis.html +0 -272
- package/required-pages/synthos_apis.json +0 -1
- package/required-pages/synthos_scripts.json +0 -1
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.idle-container{position:absolute;width:100%;height:100%;pointer-events:none;opacity:1;transition:opacity 1s ease-out}.idle-container.hidden{opacity:0}.breathing-orb{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80px;height:80px;border-radius:50%;background:radial-gradient(circle,rgba(102,126,234,.15) 0,transparent 70%);animation:4s ease-in-out infinite breathe}.breathing-orb::before{content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:8px;height:8px;border-radius:50%;background:rgba(183,148,246,.6);box-shadow:0 0 20px rgba(183,148,246,.4);animation:4s ease-in-out infinite core-pulse}@keyframes breathe{0%,100%{width:80px;height:80px;opacity:.3}50%{width:120px;height:120px;opacity:.6}}@keyframes core-pulse{0%,100%{opacity:.4;box-shadow:0 0 20px rgba(183,148,246,.3)}50%{opacity:.8;box-shadow:0 0 30px rgba(183,148,246,.5)}}.orbit-ring{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:200px;height:200px;border:1px solid rgba(102,126,234,.1);border-radius:50%;animation:20s linear infinite orbit-rotate}.orbit-ring::after{content:'';position:absolute;top:-3px;left:50%;transform:translateX(-50%);width:6px;height:6px;background:rgba(240,147,251,.5);border-radius:50%;box-shadow:0 0 10px rgba(240,147,251,.3)}@keyframes orbit-rotate{from{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}</style>
|
|
8
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
9
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
10
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
11
|
-
<script id="page-info" src="/api/page-info.js?page=builder"></script>
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
<div class="chat-panel" data-locked="true">
|
|
15
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
16
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
17
|
-
<div class="chat-message" id="defaultGreeting"><strong>SynthOS:</strong> What can I create for you? Ask "what can you do?" or "how does this work?" to learn more. Remember to save often!</div>
|
|
18
|
-
<div class="chat-message" id="firstRunGreeting" style="display:none;">
|
|
19
|
-
<p><strong>Welcome to SynthOS!</strong></p>
|
|
20
|
-
<p>You're all set up and ready to start creating. This is the <strong>Builder</strong> — your main workspace. Just type what you want to build into the chat and SynthOS will generate it for you as a live, interactive page.</p>
|
|
21
|
-
<p>You can create just about anything: dashboards, tools, games, visualizations, forms, calculators — if it can be expressed as a web page, you can build it here through conversation.</p>
|
|
22
|
-
<p><strong>How pages work:</strong></p>
|
|
23
|
-
<ul>
|
|
24
|
-
<li>Each creation lives on its own <strong>page</strong>. When you save, it gets a name and becomes part of your collection.</li>
|
|
25
|
-
<li>The <strong>Pages</strong> button (in the link bar above) takes you to the <strong>Pages Gallery</strong> where you can browse, open, and manage all your saved creations.</li>
|
|
26
|
-
</ul>
|
|
27
|
-
<p><strong>Key actions:</strong></p>
|
|
28
|
-
<ul>
|
|
29
|
-
<li><strong>Save</strong> — saves your current page. You'll be prompted for a name the first time. <em>Save often!</em> Your work only persists when you save it.</li>
|
|
30
|
-
<li><strong>Reset</strong> — clears the current page back to a blank slate. Useful when you want to start fresh on something new.</li>
|
|
31
|
-
</ul>
|
|
32
|
-
<p>When you're ready, we recommend trying the <a href="/solar_tutorial">Solar Tutorial</a> — it's a guided walkthrough that will show you the basics of creating with SynthOS step by step.</p>
|
|
33
|
-
<p>Have fun building!</p>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
<div class="link-group" data-locked="true">
|
|
37
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
38
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
39
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
40
|
-
</div>
|
|
41
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
42
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
43
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
44
|
-
</form>
|
|
45
|
-
</div>
|
|
46
|
-
<div class="viewer-panel" id="viewerPanel">
|
|
47
|
-
<div class="idle-container" id="idleAnimation">
|
|
48
|
-
<div class="orbit-ring"></div>
|
|
49
|
-
<div class="breathing-orb"></div>
|
|
50
|
-
</div>
|
|
51
|
-
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
52
|
-
</div>
|
|
53
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
54
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
55
|
-
<script id="idle-animation">function hideIdleAnimation(){const idleContainer=document.getElementById("idleAnimation");idleContainer&&(idleContainer.classList.add("hidden"),setTimeout(()=>{idleContainer.style.display="none"},1e3))}function showIdleAnimation(){const idleContainer=document.getElementById("idleAnimation");idleContainer&&(idleContainer.style.display="block",setTimeout(()=>{idleContainer.classList.remove("hidden")},10))}</script>
|
|
56
|
-
<button class="chat-toggle" aria-label="Toggle chat panel">
|
|
57
|
-
<span class="chat-toggle-dots">
|
|
58
|
-
<span class="chat-toggle-dot"></span>
|
|
59
|
-
<span class="chat-toggle-dot"></span>
|
|
60
|
-
<span class="chat-toggle-dot"></span>
|
|
61
|
-
</span>
|
|
62
|
-
</button>
|
|
63
|
-
<script id="first-run-check">
|
|
64
|
-
(function() {
|
|
65
|
-
var params = new URLSearchParams(window.location.search);
|
|
66
|
-
if (params.get('firstRun') === 'true') {
|
|
67
|
-
document.getElementById('defaultGreeting').style.display = 'none';
|
|
68
|
-
document.getElementById('firstRunGreeting').style.display = '';
|
|
69
|
-
}
|
|
70
|
-
})();
|
|
71
|
-
</script>
|
|
72
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
73
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
74
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Builder", "categories": ["System"], "pinned": true, "showInAll": true, "pageVersion": 2, "mode": "unlockedS" }
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS - Pages</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.advanced-options{margin-top:8px}.advanced-toggle{background:0 0;border:none;color:var(--text-secondary);font-size:13px;cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:6px;transition:color .2s}.advanced-toggle:hover{color:var(--accent-primary)}.toggle-icon{font-size:10px;transition:transform .2s}.toggle-icon.open{transform:rotate(90deg)}.advanced-content{padding-left:16px;border-left:2px solid var(--border-color);margin-left:4px}</style>
|
|
8
|
-
<style>.saved-pages{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px;width:100%;box-shadow:0 6px 25px var(--accent-glow);position:relative;z-index:1;margin-bottom:20px}.page-category{width:100%;margin-bottom:20px;position:relative;z-index:1}.category-title{font-size:16px;color:var(--text-secondary);margin-bottom:12px;padding-left:5px;border-left:3px solid var(--accent-tertiary)}.page-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}.page-link{padding:12px 16px;background:linear-gradient(135deg,rgba(102,126,234,.15) 0,rgba(118,75,162,.15) 100%);border:1px solid var(--border-color);border-radius:10px;color:var(--text-primary);text-decoration:none;text-align:center;font-size:14px;transition:.3s;cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;position:relative}.page-link:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%);border-color:var(--text-secondary);box-shadow:0 4px 15px var(--accent-glow);color:var(--accent-tertiary);transform:translateY(-2px)}.page-link .scroll-text{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}.page-link.scrolling .scroll-text{text-overflow:clip;overflow:visible;animation:scrollText var(--scroll-duration,3s) linear infinite}@keyframes scrollText{0%,25%{transform:translateX(0)}100%,75%{transform:translateX(var(--scroll-distance,-50%))}}.page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.35) 0,rgba(118,75,162,.35) 100%);border:2px solid var(--accent-tertiary);box-shadow:0 2px 12px var(--accent-glow)}.page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.5) 0,rgba(118,75,162,.5) 100%);box-shadow:0 4px 20px var(--accent-glow)}.page-link.builder-page{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;box-shadow:0 4px 20px var(--accent-glow);font-weight:600}.page-link.builder-page:hover{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));filter:brightness(1.1);box-shadow:0 6px 25px var(--accent-glow);color:#fff;transform:translateY(-2px)}.light-mode .page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(192,84,212,.25) 100%);border-color:var(--accent-secondary)}.light-mode .page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.45) 0,rgba(192,84,212,.4) 100%)}.filter-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:nowrap}.filter-buttons-container{display:flex;gap:8px;flex-shrink:1;min-width:0;overflow:hidden}.filter-btn{padding:6px 14px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:.2s;white-space:nowrap;flex-shrink:0}.filter-btn:hover{border-color:var(--accent-primary);color:var(--accent-primary)}.filter-btn.active{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-color:transparent}.more-dropdown{position:relative;flex-shrink:0}.more-btn{position:relative}.more-menu{position:absolute;top:100%;left:0;margin-top:4px;min-width:150px;max-height:250px;overflow-y:auto;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95);z-index:100}.more-menu.show{display:block}.more-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s;white-space:nowrap}.more-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.more-menu-item.active{background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);color:var(--accent-tertiary)}.search-input{margin-left:auto;padding:6px 12px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-primary);font-size:13px;outline:0;width:180px;min-width:120px;flex-shrink:0;transition:border-color .2s}.search-input:focus{border-color:var(--accent-primary)}.search-input::placeholder{color:var(--text-secondary)}.context-menu{position:fixed;z-index:1000;min-width:180px;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95)}.context-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s}.context-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.light-mode .context-menu,.light-mode .more-menu{background:rgba(255,255,255,.97);box-shadow:0 8px 30px rgba(0,0,0,.15)}</style>
|
|
9
|
-
<style>.advanced-options{margin-top:8px}.advanced-toggle{background:0 0;border:none;color:var(--text-secondary);font-size:13px;cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:6px;transition:color .2s}.advanced-toggle:hover{color:var(--accent-primary)}.toggle-icon{font-size:10px;transition:transform .2s}.toggle-icon.open{transform:rotate(90deg)}.advanced-content{padding-left:16px;border-left:2px solid var(--border-color);margin-left:4px}</style>
|
|
10
|
-
<style>.saved-pages{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px;width:100%;box-shadow:0 6px 25px var(--accent-glow);position:relative;z-index:1;margin-bottom:20px}.page-category{width:100%;margin-bottom:20px;position:relative;z-index:1}.category-title{font-size:16px;color:var(--text-secondary);margin-bottom:12px;padding-left:5px;border-left:3px solid var(--accent-tertiary)}.page-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}.page-link{padding:12px 16px;background:linear-gradient(135deg,rgba(102,126,234,.15) 0,rgba(118,75,162,.15) 100%);border:1px solid var(--border-color);border-radius:10px;color:var(--text-primary);text-decoration:none;text-align:center;font-size:14px;transition:.3s;cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;position:relative}.page-link:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%);border-color:var(--text-secondary);box-shadow:0 4px 15px var(--accent-glow);color:var(--accent-tertiary);transform:translateY(-2px)}.page-link .scroll-text{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}.page-link.scrolling .scroll-text{text-overflow:clip;overflow:visible;animation:scrollText var(--scroll-duration,3s) linear infinite}@keyframes scrollText{0%,30%{transform:translateX(0)}100%,70%{transform:translateX(var(--scroll-distance,-50%))}}.page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.35) 0,rgba(118,75,162,.35) 100%);border:2px solid var(--accent-tertiary);box-shadow:0 2px 12px var(--accent-glow)}.page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.5) 0,rgba(118,75,162,.5) 100%);box-shadow:0 4px 20px var(--accent-glow)}.page-link.builder-page{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;box-shadow:0 4px 20px var(--accent-glow);font-weight:600}.page-link.builder-page:hover{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));filter:brightness(1.1);box-shadow:0 6px 25px var(--accent-glow);color:#fff;transform:translateY(-2px)}.light-mode .page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(192,84,212,.25) 100%);border-color:var(--accent-secondary)}.light-mode .page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.45) 0,rgba(192,84,212,.4) 100%)}.filter-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:nowrap}.filter-buttons-container{display:flex;gap:8px;flex-shrink:1;min-width:0;overflow:hidden}.filter-btn{padding:6px 14px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:.2s;white-space:nowrap;flex-shrink:0}.filter-btn:hover{border-color:var(--accent-primary);color:var(--accent-primary)}.filter-btn.active{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-color:transparent}.more-dropdown{position:relative;flex-shrink:0}.more-btn{position:relative}.more-menu{position:absolute;top:100%;left:0;margin-top:4px;min-width:150px;max-height:250px;overflow-y:auto;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95);z-index:100}.more-menu.show{display:block}.more-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s;white-space:nowrap}.more-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.more-menu-item.active{background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);color:var(--accent-tertiary)}.search-input{margin-left:auto;padding:6px 12px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-primary);font-size:13px;outline:0;width:180px;min-width:120px;flex-shrink:0;transition:border-color .2s}.search-input:focus{border-color:var(--accent-primary)}.search-input::placeholder{color:var(--text-secondary)}.context-menu{position:fixed;z-index:1000;min-width:180px;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95)}.context-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s}.context-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.light-mode .context-menu,.light-mode .more-menu{background:rgba(255,255,255,.97);box-shadow:0 8px 30px rgba(0,0,0,.15)}</style>
|
|
11
|
-
<style>.advanced-options{margin-top:8px}.advanced-toggle{background:0 0;border:none;color:var(--text-secondary);font-size:13px;cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:6px;transition:color .2s}.advanced-toggle:hover{color:var(--accent-primary)}.toggle-icon{font-size:10px;transition:transform .2s}.toggle-icon.open{transform:rotate(90deg)}.advanced-content{padding-left:16px;border-left:2px solid var(--border-color);margin-left:4px}</style>
|
|
12
|
-
<style>.saved-pages{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px;width:100%;box-shadow:0 6px 25px var(--accent-glow);position:relative;z-index:1;margin-bottom:20px}.page-category{width:100%;margin-bottom:20px;position:relative;z-index:1}.category-title{font-size:16px;color:var(--text-secondary);margin-bottom:12px;padding-left:5px;border-left:3px solid var(--accent-tertiary)}.page-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}.page-link{padding:12px 16px;background:linear-gradient(135deg,rgba(102,126,234,.15) 0,rgba(118,75,162,.15) 100%);border:1px solid var(--border-color);border-radius:10px;color:var(--text-primary);text-decoration:none;text-align:center;font-size:14px;transition:.3s;cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;position:relative}.page-link:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%);border-color:var(--text-secondary);box-shadow:0 4px 15px var(--accent-glow);color:var(--accent-tertiary);transform:translateY(-2px)}.page-link .scroll-text{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}.page-link.scrolling .scroll-text{text-overflow:clip;overflow:visible;animation:scrollText var(--scroll-duration,3s) linear infinite}@keyframes scrollText{0%,15%{transform:translateX(0)}100%,85%{transform:translateX(var(--scroll-distance,-50%))}}.page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.35) 0,rgba(118,75,162,.35) 100%);border:2px solid var(--accent-tertiary);box-shadow:0 2px 12px var(--accent-glow)}.page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.5) 0,rgba(118,75,162,.5) 100%);box-shadow:0 4px 20px var(--accent-glow)}.page-link.builder-page{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;box-shadow:0 4px 20px var(--accent-glow);font-weight:600}.page-link.builder-page:hover{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));filter:brightness(1.1);box-shadow:0 6px 25px var(--accent-glow);color:#fff;transform:translateY(-2px)}.light-mode .page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(192,84,212,.25) 100%);border-color:var(--accent-secondary)}.light-mode .page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.45) 0,rgba(192,84,212,.4) 100%)}.filter-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:nowrap}.filter-buttons-container{display:flex;gap:8px;flex-shrink:1;min-width:0;overflow:hidden}.filter-btn{padding:6px 14px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:.2s;white-space:nowrap;flex-shrink:0}.filter-btn:hover{border-color:var(--accent-primary);color:var(--accent-primary)}.filter-btn.active{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-color:transparent}.more-dropdown{position:relative;flex-shrink:0}.more-btn{position:relative}.more-menu{position:absolute;top:100%;left:0;margin-top:4px;min-width:150px;max-height:250px;overflow-y:auto;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95);z-index:100}.more-menu.show{display:block}.more-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s;white-space:nowrap}.more-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.more-menu-item.active{background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);color:var(--accent-tertiary)}.search-input{margin-left:auto;padding:6px 12px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-primary);font-size:13px;outline:0;width:180px;min-width:120px;flex-shrink:0;transition:border-color .2s}.search-input:focus{border-color:var(--accent-primary)}.search-input::placeholder{color:var(--text-secondary)}.context-menu{position:fixed;z-index:1000;min-width:180px;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95)}.context-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s}.context-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.light-mode .context-menu,.light-mode .more-menu{background:rgba(255,255,255,.97);box-shadow:0 8px 30px rgba(0,0,0,.15)}</style>
|
|
13
|
-
<style>.advanced-options{margin-top:8px}.advanced-toggle{background:0 0;border:none;color:var(--text-secondary);font-size:13px;cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:6px;transition:color .2s}.advanced-toggle:hover{color:var(--accent-primary)}.toggle-icon{font-size:10px;transition:transform .2s}.toggle-icon.open{transform:rotate(90deg)}.advanced-content{padding-left:16px;border-left:2px solid var(--border-color);margin-left:4px}</style>
|
|
14
|
-
<style>.saved-pages{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px;width:100%;box-shadow:0 6px 25px var(--accent-glow);position:relative;z-index:1;margin-bottom:20px}.page-category{width:100%;margin-bottom:20px;position:relative;z-index:1}.category-title{font-size:16px;color:var(--text-secondary);margin-bottom:12px;padding-left:5px;border-left:3px solid var(--accent-tertiary)}.page-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}.page-link{padding:12px 16px;background:linear-gradient(135deg,rgba(102,126,234,.15) 0,rgba(118,75,162,.15) 100%);border:1px solid var(--border-color);border-radius:10px;color:var(--text-primary);text-decoration:none;text-align:center;font-size:14px;transition:.3s;cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;position:relative}.page-link:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%);border-color:var(--text-secondary);box-shadow:0 4px 15px var(--accent-glow);color:var(--accent-tertiary);transform:translateY(-2px)}.page-link .scroll-text{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}.page-link.scrolling .scroll-text{text-overflow:clip;overflow:visible;animation:scrollText var(--scroll-duration,3s) linear infinite}@keyframes scrollText{0%,10%{transform:translateX(0)}100%,90%{transform:translateX(var(--scroll-distance,-50%))}}.page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.35) 0,rgba(118,75,162,.35) 100%);border:2px solid var(--accent-tertiary);box-shadow:0 2px 12px var(--accent-glow)}.page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.5) 0,rgba(118,75,162,.5) 100%);box-shadow:0 4px 20px var(--accent-glow)}.page-link.builder-page{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;box-shadow:0 4px 20px var(--accent-glow);font-weight:600}.page-link.builder-page:hover{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));filter:brightness(1.1);box-shadow:0 6px 25px var(--accent-glow);color:#fff;transform:translateY(-2px)}.light-mode .page-link.pinned{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(192,84,212,.25) 100%);border-color:var(--accent-secondary)}.light-mode .page-link.pinned:hover{background:linear-gradient(135deg,rgba(102,126,234,.45) 0,rgba(192,84,212,.4) 100%)}.filter-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:nowrap}.filter-buttons-container{display:flex;gap:8px;flex-shrink:1;min-width:0;overflow:hidden}.filter-btn{padding:6px 14px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:.2s;white-space:nowrap;flex-shrink:0}.filter-btn:hover{border-color:var(--accent-primary);color:var(--accent-primary)}.filter-btn.active{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-color:transparent}.more-dropdown{position:relative;flex-shrink:0}.more-btn{position:relative}.more-menu{position:absolute;top:100%;left:0;margin-top:4px;min-width:150px;max-height:250px;overflow-y:auto;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95);z-index:100}.more-menu.show{display:block}.more-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s;white-space:nowrap}.more-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.more-menu-item.active{background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);color:var(--accent-tertiary)}.search-input{margin-left:auto;padding:6px 12px;border-radius:20px;border:1px solid var(--border-color);background:0 0;color:var(--text-primary);font-size:13px;outline:0;width:180px;min-width:120px;flex-shrink:0;transition:border-color .2s}.search-input:focus{border-color:var(--accent-primary)}.search-input::placeholder{color:var(--text-secondary)}.context-menu{position:fixed;z-index:1000;min-width:180px;border-radius:8px;padding:4px 0;box-shadow:0 8px 30px rgba(0,0,0,.4);display:none;border:1px solid var(--border-color);background:rgba(30,30,50,.95)}.context-menu-item{padding:8px 16px;font-size:13px;cursor:pointer;color:var(--text-primary);transition:background .15s}.context-menu-item:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%)}.light-mode .context-menu,.light-mode .more-menu{background:rgba(255,255,255,.97);box-shadow:0 8px 30px rgba(0,0,0,.15)}.version-badge{display:block;font-size:10px;color:var(--accent-tertiary);margin-top:4px;opacity:.8}.page-link.needs-upgrade{border:1px dashed var(--accent-tertiary);background:linear-gradient(135deg,rgba(102,126,234,.08) 0,rgba(118,75,162,.08) 100%);animation:3s ease-in-out infinite upgradeGlow;overflow:visible;z-index:2}.page-link.needs-upgrade:hover{background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);border-color:var(--accent-primary)}@keyframes upgradeGlow{0%,100%{box-shadow:0 0 0 transparent}50%{box-shadow:0 0 12px var(--accent-glow)}}.upgrade-badge{position:absolute;top:-6px;right:-6px;font-size:9px;color:#fff;font-weight:600;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));padding:2px 7px;border-radius:10px;line-height:1.3;box-shadow:0 2px 8px var(--accent-glow);pointer-events:none;z-index:10}.light-mode .page-link.needs-upgrade{background:linear-gradient(135deg,rgba(102,126,234,.06) 0,rgba(192,84,212,.06) 100%)}.upgrade-toast{position:fixed;bottom:20px;right:20px;padding:12px 20px;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:8px;font-size:13px;box-shadow:0 4px 15px var(--accent-glow);z-index:2000;opacity:0;transform:translateY(10px);transition:opacity .3s,transform .3s}.upgrade-toast.show{opacity:1;transform:translateY(0)}</style>
|
|
15
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
16
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
17
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
18
|
-
<script id="page-info" src="/api/page-info.js?page=pages"></script>
|
|
19
|
-
</head>
|
|
20
|
-
|
|
21
|
-
<body>
|
|
22
|
-
<div class="chat-panel" data-locked="true">
|
|
23
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
24
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
25
|
-
<div class="chat-message">
|
|
26
|
-
<p><strong>SynthOS:</strong> Here are all of the created pages. Right-click any page to pin it to
|
|
27
|
-
favorites, edit its definition, or copy it to a new page.</p>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
<div class="link-group" data-locked="true">
|
|
31
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
32
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
33
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
34
|
-
</div>
|
|
35
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
36
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
37
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
38
|
-
</form>
|
|
39
|
-
</div>
|
|
40
|
-
<div class="viewer-panel" id="viewerPanel" style="justify-content: flex-start; align-items: stretch;">
|
|
41
|
-
<div class="saved-pages">Pages</div>
|
|
42
|
-
|
|
43
|
-
<!-- Favorites section (hidden when empty) -->
|
|
44
|
-
<div id="favoritesSection" class="page-category" style="display: none;">
|
|
45
|
-
<h2 class="category-title">Favorites</h2>
|
|
46
|
-
<div id="favoritesGrid" class="page-grid"></div>
|
|
47
|
-
</div>
|
|
48
|
-
|
|
49
|
-
<!-- All Pages section with filter bar -->
|
|
50
|
-
<div class="page-category">
|
|
51
|
-
<h2 class="category-title">Pages</h2>
|
|
52
|
-
<div id="filterBar" class="filter-bar">
|
|
53
|
-
<div class="filter-buttons-container">
|
|
54
|
-
<button class="filter-btn active" data-category="All">All</button>
|
|
55
|
-
</div>
|
|
56
|
-
<div class="more-dropdown" id="moreDropdown" style="display: none;">
|
|
57
|
-
<button class="filter-btn more-btn" id="moreBtn">More ▾</button>
|
|
58
|
-
<div class="more-menu" id="moreMenu"></div>
|
|
59
|
-
</div>
|
|
60
|
-
<input type="text" class="search-input" id="searchInput" placeholder="Search pages...">
|
|
61
|
-
</div>
|
|
62
|
-
<div id="pagesGrid" class="page-grid"></div>
|
|
63
|
-
</div>
|
|
64
|
-
|
|
65
|
-
<!-- Edit Page Modal -->
|
|
66
|
-
<div id="editPageModal" class="modal-overlay">
|
|
67
|
-
<div class="modal-content">
|
|
68
|
-
<div class="modal-header">Edit Page Definition</div>
|
|
69
|
-
<div class="modal-body">
|
|
70
|
-
<div class="form-group">
|
|
71
|
-
<label class="form-label">Display Title</label>
|
|
72
|
-
<input type="text" id="editPageTitle" class="form-input" placeholder="Enter display title...">
|
|
73
|
-
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px; opacity: 0.8;">Page
|
|
74
|
-
name: <span id="editPageNameDisplay"></span></div>
|
|
75
|
-
</div>
|
|
76
|
-
<div class="form-group">
|
|
77
|
-
<label class="form-label">Categories (comma-separated)</label>
|
|
78
|
-
<input type="text" id="editPageCategories" class="form-input" placeholder="e.g. Tools, Games, Utilities">
|
|
79
|
-
</div>
|
|
80
|
-
<div class="form-group">
|
|
81
|
-
<label class="form-label checkbox-label">
|
|
82
|
-
<input type="checkbox" id="editPagePinned">
|
|
83
|
-
<span>Pinned to Favorites</span>
|
|
84
|
-
</label>
|
|
85
|
-
</div>
|
|
86
|
-
<div class="form-group">
|
|
87
|
-
<label class="form-label checkbox-label">
|
|
88
|
-
<input type="checkbox" id="editPageLocked">
|
|
89
|
-
<span>Locked</span>
|
|
90
|
-
</label>
|
|
91
|
-
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px; opacity: 0.8;">
|
|
92
|
-
Locked pages are read-only and cannot be modified through chat.
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
<div class="form-group">
|
|
96
|
-
<label class="form-label checkbox-label">
|
|
97
|
-
<input type="checkbox" id="editPageShowInAll" checked>
|
|
98
|
-
<span>Show in All</span>
|
|
99
|
-
</label>
|
|
100
|
-
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px; opacity: 0.8;">
|
|
101
|
-
When unchecked, this page is hidden from the "All" filter and only appears under its category.
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
<div class="modal-footer">
|
|
106
|
-
<button class="modal-btn modal-btn-danger" id="deletePageBtn">Delete Page</button>
|
|
107
|
-
<div class="modal-footer-right">
|
|
108
|
-
<button class="modal-btn modal-btn-secondary" id="editCancelBtn">Cancel</button>
|
|
109
|
-
<button class="modal-btn modal-btn-primary" id="editSaveBtn">Save Changes</button>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
|
|
115
|
-
<!-- Copy Page Modal -->
|
|
116
|
-
<div id="copyPageModal" class="modal-overlay">
|
|
117
|
-
<div class="modal-content">
|
|
118
|
-
<div class="modal-header">Copy to New Page</div>
|
|
119
|
-
<div class="modal-body">
|
|
120
|
-
<div class="form-group">
|
|
121
|
-
<label class="form-label">Display Title</label>
|
|
122
|
-
<input type="text" id="copyPageTitle" class="form-input" placeholder="Enter display title...">
|
|
123
|
-
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px; opacity: 0.8;">
|
|
124
|
-
Source: <span id="copySourcePageDisplay"></span></div>
|
|
125
|
-
</div>
|
|
126
|
-
<div class="form-group">
|
|
127
|
-
<label class="form-label">Categories (comma-separated)</label>
|
|
128
|
-
<input type="text" id="copyPageCategories" class="form-input" placeholder="e.g. Tools, Games, Utilities">
|
|
129
|
-
</div>
|
|
130
|
-
<div class="advanced-options">
|
|
131
|
-
<button type="button" class="advanced-toggle" id="advancedToggle">
|
|
132
|
-
<span class="toggle-icon">▶</span> Advanced Options
|
|
133
|
-
</button>
|
|
134
|
-
<div class="advanced-content" id="advancedContent" style="display: none;">
|
|
135
|
-
<div class="form-group" style="margin-top: 12px;">
|
|
136
|
-
<label class="form-label">Custom Page ID</label>
|
|
137
|
-
<input type="text" id="copyNewPageName" class="form-input" placeholder="Auto-generated from title...">
|
|
138
|
-
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px; opacity: 0.8;">
|
|
139
|
-
Used in the URL. Leave blank to auto-generate from title.</div>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
</div>
|
|
143
|
-
</div>
|
|
144
|
-
<div class="modal-footer">
|
|
145
|
-
<div class="modal-footer-right">
|
|
146
|
-
<button class="modal-btn modal-btn-secondary" id="copyCancelBtn">Cancel</button>
|
|
147
|
-
<button class="modal-btn modal-btn-primary" id="copyConfirmBtn">Create Copy</button>
|
|
148
|
-
</div>
|
|
149
|
-
</div>
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
152
|
-
|
|
153
|
-
<!-- Delete Confirmation Modal -->
|
|
154
|
-
<div id="deleteConfirmModal" class="modal-overlay">
|
|
155
|
-
<div class="modal-content">
|
|
156
|
-
<div class="modal-header">Confirm Delete</div>
|
|
157
|
-
<div class="modal-body">
|
|
158
|
-
<p style="color: var(--text-primary); margin: 0;">Are you sure you want to delete "<span id="deletePageNameDisplay2"></span>"? This cannot be undone.</p>
|
|
159
|
-
</div>
|
|
160
|
-
<div class="modal-footer">
|
|
161
|
-
<div class="modal-footer-right">
|
|
162
|
-
<button class="modal-btn modal-btn-secondary" id="deleteCancelBtn">Cancel</button>
|
|
163
|
-
<button class="modal-btn modal-btn-danger" id="deleteConfirmBtn">Delete</button>
|
|
164
|
-
</div>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
169
|
-
</div>
|
|
170
|
-
|
|
171
|
-
<!-- Context menu -->
|
|
172
|
-
<div id="contextMenu" class="context-menu">
|
|
173
|
-
<div id="pinMenuItem" class="context-menu-item"></div>
|
|
174
|
-
<div id="editMenuItem" class="context-menu-item">Edit page definition</div>
|
|
175
|
-
<div id="copyMenuItem" class="context-menu-item">Copy to new page</div>
|
|
176
|
-
<div id="updateMenuItem" class="context-menu-item">Update page</div>
|
|
177
|
-
</div>
|
|
178
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
179
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
180
|
-
<script id="pages-core">let allPages=[],activeCategory="All",searchTerm="",contextTarget=null;const BUILDER_PAGE="builder";let visibleCategories=[],overflowCategories=[];function displayName(page){return page.title||page.name}function createPageLink(page,isBuilder=!1){const a=document.createElement("a");a.href="/"+page.name,a.textContent=displayName(page);let classes="page-link";return isBuilder?classes+=" builder-page":page.pinned&&(classes+=" pinned"),a.className=classes,isBuilder||a.addEventListener("contextmenu",e=>{e.preventDefault(),showContextMenu(e,page)}),a}function renderFavorites(){const section=document.getElementById("favoritesSection"),grid=document.getElementById("favoritesGrid");grid.innerHTML="";const builderPage=allPages.find(p=>"builder"===p.name);builderPage&&grid.appendChild(createPageLink(builderPage,!0));const pinned=allPages.filter(p=>p.pinned&&"builder"!==p.name).sort((a,b)=>displayName(a).localeCompare(displayName(b)));pinned.forEach(p=>grid.appendChild(createPageLink(p))),builderPage||pinned.length>0?section.style.display="":section.style.display="none"}function getAllCategories(){const cats=new Set;return allPages.filter(p=>"builder"!==p.name).forEach(p=>p.categories.forEach(c=>cats.add(c))),Array.from(cats).sort()}function renderFilterBar(){const container=document.querySelector(".filter-buttons-container"),moreDropdown=document.getElementById("moreDropdown"),moreMenu=document.getElementById("moreMenu");container.innerHTML="",moreMenu.innerHTML="";const allBtn=document.createElement("button");allBtn.className="filter-btn"+("All"===activeCategory?" active":""),allBtn.textContent="All",allBtn.dataset.category="All",allBtn.addEventListener("click",()=>setCategory("All")),container.appendChild(allBtn),visibleCategories.forEach(cat=>{const btn=document.createElement("button");btn.className="filter-btn"+(activeCategory===cat?" active":""),btn.textContent=cat,btn.dataset.category=cat,btn.addEventListener("click",()=>setCategory(cat)),container.appendChild(btn)}),overflowCategories.length>0?(moreDropdown.style.display="",document.getElementById("moreBtn").className="filter-btn more-btn"+(overflowCategories.includes(activeCategory)?" active":""),overflowCategories.forEach(cat=>{const item=document.createElement("div");item.className="more-menu-item"+(activeCategory===cat?" active":""),item.textContent=cat,item.addEventListener("click",()=>{setCategory(cat),hideMoreMenu()}),moreMenu.appendChild(item)})):moreDropdown.style.display="none"}function calculateVisibleCategories(){const allCats=getAllCategories(),filterBar=document.getElementById("filterBar"),searchInput=document.getElementById("searchInput");if(!filterBar)return;let availableWidth=filterBar.offsetWidth-(searchInput.offsetWidth+8)-50-16;visibleCategories=[],overflowCategories=[];const temp=document.createElement("button");temp.className="filter-btn",temp.style.visibility="hidden",temp.style.position="absolute",document.body.appendChild(temp);let usedWidth=0,needsOverflow=!1;for(let i=0;i<allCats.length;i++){temp.textContent=allCats[i];const btnWidth=temp.offsetWidth+8,remainingCats=allCats.length-i;usedWidth+btnWidth+(needsOverflow?0:remainingCats>1?88:0)<=availableWidth&&!needsOverflow?(visibleCategories.push(allCats[i]),usedWidth+=btnWidth):(needsOverflow=!0,overflowCategories.push(allCats[i]))}1===overflowCategories.length&&visibleCategories.length>0&&(temp.textContent=overflowCategories[0],usedWidth+(temp.offsetWidth+8)<=availableWidth&&visibleCategories.push(overflowCategories.pop())),document.body.removeChild(temp)}function renderPages(){const grid=document.getElementById("pagesGrid");grid.innerHTML="";const term=searchTerm.toLowerCase();allPages.forEach(p=>{"builder"!==p.name&&("All"===activeCategory?(p.showInAll!==false):p.categories.includes(activeCategory))&&(!term||p.name.toLowerCase().includes(term)||displayName(p).toLowerCase().includes(term))&&grid.appendChild(createPageLink(p))})}function setCategory(cat){activeCategory=cat,renderFilterBar(),renderPages()}function renderAll(){renderFavorites(),calculateVisibleCategories(),renderFilterBar(),renderPages()}document.getElementById("searchInput").addEventListener("input",e=>{searchTerm=e.target.value,renderPages()});const moreBtn=document.getElementById("moreBtn"),moreMenu=document.getElementById("moreMenu");function hideMoreMenu(){moreMenu.classList.remove("show")}moreBtn.addEventListener("click",e=>{e.stopPropagation(),moreMenu.classList.toggle("show")});const contextMenu=document.getElementById("contextMenu"),pinMenuItem=document.getElementById("pinMenuItem");function showContextMenu(e,page){"builder"!==page.name&&(contextTarget=page,pinMenuItem.textContent=page.pinned?"Unpin from Favorites":"Pin to Favorites",contextMenu.style.left=e.clientX+"px",contextMenu.style.top=e.clientY+"px",contextMenu.style.display="block")}function hideContextMenu(){contextMenu.style.display="none",contextTarget=null}document.addEventListener("click",()=>{hideContextMenu(),hideMoreMenu()}),contextMenu.addEventListener("click",e=>e.stopPropagation()),pinMenuItem.addEventListener("click",async()=>{if(!contextTarget)return;const pageName=contextTarget.name,newPinned=!contextTarget.pinned,categories=contextTarget.categories||[];hideContextMenu();try{const res=await fetch("/api/pages/"+encodeURIComponent(pageName),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({categories:categories,pinned:newPinned})});if(!res.ok){const errorText=await res.text();throw new Error("Failed to update page metadata: "+errorText)}const pageIndex=allPages.findIndex(p=>p.name===pageName);-1!==pageIndex&&(allPages[pageIndex].pinned=newPinned,renderAll()),await loadPages()}catch(err){console.error("Error toggling pin:",err),alert("Failed to update pin status: "+err.message)}});const resizeObserver=new ResizeObserver(()=>{calculateVisibleCategories(),renderFilterBar()});async function loadPages(){try{const res=await fetch("/api/pages");if(!res.ok)throw new Error("Failed to fetch pages");allPages=await res.json(),renderAll()}catch(err){console.error("Error fetching pages:",err)}}resizeObserver.observe(document.getElementById("filterBar")),loadPages();</script><script id="context-menu-override">const originalShowContextMenu=showContextMenu;function createPageLinkUpdated(page,isBuilder=!1){const a=document.createElement("a");a.href="/"+page.name,a.textContent=displayName(page);let classes="page-link";return isBuilder?classes+=" builder-page":page.pinned&&(classes+=" pinned"),a.className=classes,a.addEventListener("contextmenu",e=>{e.preventDefault(),showContextMenu(e,page)}),a}showContextMenu=function(e,page){contextTarget=page;const isBuilder=page.name===BUILDER_PAGE;pinMenuItem.style.display=isBuilder?"none":"",editMenuItem.style.display=isBuilder?"none":"",isBuilder||(pinMenuItem.textContent=page.pinned?"Unpin from Favorites":"Pin to Favorites");var updateItem=document.getElementById("updateMenuItem"),latestVersion=window.pageInfo?window.pageInfo.latestPageVersion:0;updateItem.style.display=page.pageVersion<latestVersion?"":"none",contextMenu.style.left=e.clientX+"px",contextMenu.style.top=e.clientY+"px",contextMenu.style.display="block"},createPageLink=createPageLinkUpdated,allPages.length>0&&renderAll();</script><script id="page-link-scroll">createPageLink=function(page,isBuilder=!1){const a=document.createElement("a");a.href="/"+page.name;const title=displayName(page),span=document.createElement("span");span.className="scroll-text",span.textContent=title,a.appendChild(span),a.title=title;let classes="page-link";return isBuilder?classes+=" builder-page":page.pinned&&(classes+=" pinned"),a.className=classes,a.addEventListener("contextmenu",e=>{e.preventDefault(),showContextMenu(e,page)}),a.addEventListener("mouseenter",function(){const textWidth=span.scrollWidth,containerWidth=a.clientWidth-32;if(textWidth>containerWidth){const scrollDistance=textWidth-containerWidth+20,duration=Math.max(2,scrollDistance/30);a.style.setProperty("--scroll-distance",`-${scrollDistance}px`),a.style.setProperty("--scroll-duration",`${duration}s`),a.classList.add("scrolling")}}),a.addEventListener("mouseleave",function(){a.classList.remove("scrolling")}),a},"undefined"!=typeof allPages&&allPages&&allPages.length>0&&renderAll();</script>
|
|
181
|
-
|
|
182
|
-
<script id="modal-logic">const editPageModal=document.getElementById("editPageModal"),copyPageModal=document.getElementById("copyPageModal"),editMenuItem=document.getElementById("editMenuItem"),copyMenuItem=document.getElementById("copyMenuItem"),editPageName=document.getElementById("editPageName"),editPageTitle=document.getElementById("editPageTitle"),editPageCategories=document.getElementById("editPageCategories"),editPagePinned=document.getElementById("editPagePinned"),editCancelBtn=document.getElementById("editCancelBtn"),editSaveBtn=document.getElementById("editSaveBtn"),deletePageBtn=document.getElementById("deletePageBtn"),copySourcePage=document.getElementById("copySourcePage"),copyNewPageName=document.getElementById("copyNewPageName"),copyCancelBtn=document.getElementById("copyCancelBtn"),copyConfirmBtn=document.getElementById("copyConfirmBtn");let currentEditPage=null;function closeEditModal(){editPageModal.classList.remove("show"),currentEditPage=null}function closeCopyModal(){copyPageModal.classList.remove("show")}editMenuItem.addEventListener("click",()=>{contextTarget&&(currentEditPage=contextTarget,editPageName.value=contextTarget.name,editPageTitle.value=contextTarget.title||"",editPageCategories.value=(contextTarget.categories||[]).join(", "),editPagePinned.checked=contextTarget.pinned||!1,hideContextMenu(),editPageModal.classList.add("show"))}),copyMenuItem.addEventListener("click",()=>{contextTarget&&(copySourcePage.value=displayName(contextTarget),document.getElementById("copyPageTitle").value="",copyNewPageName.value="",hideContextMenu(),copyPageModal.classList.add("show"),document.getElementById("copyPageTitle").focus())}),editCancelBtn.addEventListener("click",closeEditModal),copyCancelBtn.addEventListener("click",closeCopyModal),editPageModal.addEventListener("click",e=>{e.target===editPageModal&&closeEditModal()}),copyPageModal.addEventListener("click",e=>{e.target===copyPageModal&&closeCopyModal()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&(closeEditModal(),closeCopyModal())}),editSaveBtn.addEventListener("click",async()=>{if(!currentEditPage)return;const newTitle=editPageTitle.value.trim(),newCategories=editPageCategories.value.split(",").map(c=>c.trim()).filter(c=>c.length>0),newPinned=editPagePinned.checked,newMode=document.getElementById("editPageLocked").checked?"locked":"unlocked",newShowInAll=document.getElementById("editPageShowInAll").checked;try{if(!(await fetch("/api/pages/"+encodeURIComponent(currentEditPage.name),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:newTitle||void 0,categories:newCategories,pinned:newPinned,showInAll:newShowInAll,mode:newMode})})).ok)throw new Error("Failed to update page");closeEditModal(),await loadPages()}catch(err){console.error("Error saving page:",err),alert("Failed to save changes: "+err.message)}});const deleteConfirmModal=document.getElementById("deleteConfirmModal"),deletePageNameDisplay2=document.getElementById("deletePageNameDisplay2"),deleteCancelBtn=document.getElementById("deleteCancelBtn"),deleteConfirmBtn=document.getElementById("deleteConfirmBtn");let currentDeletePage=null;function closeDeleteModal(){deleteConfirmModal.classList.remove("show"),currentDeletePage=null}deleteCancelBtn.addEventListener("click",closeDeleteModal),deleteConfirmModal.addEventListener("click",e=>{e.target===deleteConfirmModal&&closeDeleteModal()}),deletePageBtn.addEventListener("click",()=>{currentEditPage&&(currentDeletePage=currentEditPage,deletePageNameDisplay2.textContent=displayName(currentEditPage),closeEditModal(),deleteConfirmModal.classList.add("show"))}),deleteConfirmBtn.addEventListener("click",async()=>{if(!currentDeletePage)return;const pageName=currentDeletePage.name;closeDeleteModal();try{const res=await fetch("/api/pages/"+encodeURIComponent(pageName),{method:"DELETE"});if(!res.ok){const data=await res.json().catch(()=>({}));throw new Error(data.error||"Failed to delete page")}await loadPages()}catch(err){console.error("Error deleting page:",err),alert("Failed to delete page: "+err.message)}}),document.addEventListener("keydown",e=>{"Escape"===e.key&&closeDeleteModal()});</script>
|
|
183
|
-
<script id="edit-modal-override">const editPageNameDisplay=document.getElementById("editPageNameDisplay");editMenuItem.removeEventListener("click",editMenuItem._handler),editMenuItem._handler=()=>{contextTarget&&(currentEditPage=contextTarget,editPageNameDisplay.textContent=contextTarget.name,editPageTitle.value=contextTarget.title||"",editPageCategories.value=(contextTarget.categories||[]).join(", "),editPagePinned.checked=contextTarget.pinned||!1,document.getElementById("editPageLocked").checked="locked"===contextTarget.mode,document.getElementById("editPageShowInAll").checked=contextTarget.showInAll!==!1,hideContextMenu(),editPageModal.classList.add("show"))},editMenuItem.addEventListener("click",editMenuItem._handler);</script>
|
|
184
|
-
<script id="error" type="application/json">{"message":"Something went wrong try again","details":"delete: node 53 not found"}</script>
|
|
185
|
-
<script id="copy-modal-rebind">const copySourcePageDisplay=document.getElementById("copySourcePageDisplay"),copyPageCategories=document.getElementById("copyPageCategories"),newCopyNewPageName=document.getElementById("copyNewPageName"),newCopyCancelBtn=document.getElementById("copyCancelBtn"),newCopyConfirmBtn=document.getElementById("copyConfirmBtn"),newCopyPageModal=document.getElementById("copyPageModal");let currentCopySource=null;function closeCopyModalNew(){newCopyPageModal.classList.remove("show"),currentCopySource=null}newCopyCancelBtn.addEventListener("click",closeCopyModalNew),newCopyPageModal.addEventListener("click",e=>{e.target===newCopyPageModal&&closeCopyModalNew()}),copyMenuItem.removeEventListener("click",copyMenuItem._handler),copyMenuItem._handler=()=>{contextTarget&&(currentCopySource=contextTarget,copySourcePageDisplay.textContent=displayName(contextTarget),document.getElementById("copyPageTitle").value="",copyPageCategories.value=(contextTarget.categories||[]).join(", "),newCopyNewPageName.value="",hideContextMenu(),newCopyPageModal.classList.add("show"),document.getElementById("copyPageTitle").focus())},copyMenuItem.addEventListener("click",copyMenuItem._handler);</script>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
<script id="copy-confirm-handler">newCopyConfirmBtn.removeEventListener("click",newCopyConfirmBtn._handler),newCopyConfirmBtn._handler=async()=>{if(!currentCopySource)return;const newTitle=document.getElementById("copyPageTitle").value.trim();let newName=newCopyNewPageName.value.trim();if(!newName&&newTitle&&(newName=newTitle),!newName)return alert("Please enter a title or page name."),void document.getElementById("copyPageTitle").focus();if(newName=newName.toLowerCase().replace(/\s+/g,"_"),newName=newName.replace(/[^a-z0-9_-]/g,""),!newName)return alert("Page name must contain at least one valid character (letters, numbers, hyphens, or underscores)."),void document.getElementById("copyPageTitle").focus();const newCategories=copyPageCategories.value.split(",").map(c=>c.trim()).filter(c=>c.length>0);try{const body={name:newName,title:newTitle,categories:newCategories},res=await fetch("/api/pages/"+encodeURIComponent(currentCopySource.name)+"/copy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)});if(!res.ok){const data=await res.json().catch(()=>({}));throw new Error(data.error||"Failed to copy page")}closeCopyModalNew(),window.location.href="/"+newName}catch(err){console.error("Error copying page:",err),alert("Failed to copy page: "+err.message)}},newCopyConfirmBtn.addEventListener("click",newCopyConfirmBtn._handler);</script>
|
|
189
|
-
<script id="advanced-toggle">document.getElementById("advancedToggle").addEventListener("click",function(){const content=document.getElementById("advancedContent"),icon=this.querySelector(".toggle-icon");"none"===content.style.display?(content.style.display="block",icon.classList.add("open")):(content.style.display="none",icon.classList.remove("open"))});</script>
|
|
190
|
-
<script id="update-handler">document.getElementById("updateMenuItem").addEventListener("click",async function(){if(contextTarget){var pageName=contextTarget.name;hideContextMenu(),await upgradePage(pageName)}});</script>
|
|
191
|
-
<!-- Toast container -->
|
|
192
|
-
<div id="upgradeToast" class="upgrade-toast"></div>
|
|
193
|
-
<script id="upgrade-logic">function showUpgradeToast(message){var toast=document.getElementById("upgradeToast");toast.textContent=message,toast.classList.add("show"),setTimeout(function(){toast.classList.remove("show")},3e3)}async function upgradePage(pageName){var overlay=document.getElementById("loadingOverlay");overlay.style.display="flex";try{var res=await fetch("/api/pages/"+encodeURIComponent(pageName)+"/upgrade",{method:"POST",headers:{"Content-Type":"application/json"}}),data=await res.json();if(!res.ok)throw new Error(data.error||"Upgrade failed");return!!data.upgraded&&(await loadPages(),showUpgradeToast("Page upgraded successfully"),!0)}catch(err){return console.error("Error upgrading page:",err),alert("Failed to upgrade page: "+err.message),!1}finally{overlay.style.display="none"}}createPageLink=function(page,isBuilder=!1){var latestVersion=window.pageInfo?window.pageInfo.latestPageVersion:0,needsUpgrade=!isBuilder&&page.pageVersion<latestVersion;const a=document.createElement("a");a.href="/"+page.name;const title=displayName(page),span=document.createElement("span");span.className="scroll-text",span.textContent=title,a.appendChild(span),a.title=title;let classes="page-link";if(isBuilder?classes+=" builder-page":needsUpgrade?classes+=" needs-upgrade":page.pinned&&(classes+=" pinned"),a.className=classes,needsUpgrade){var badge=document.createElement("span");badge.className="upgrade-badge",badge.textContent="Update",a.appendChild(badge)}return needsUpgrade&&a.addEventListener("click",function(e){e.preventDefault(),upgradePage(page.name)}),a.addEventListener("contextmenu",e=>{e.preventDefault(),showContextMenu(e,page)}),a.addEventListener("mouseenter",function(){const textWidth=span.scrollWidth,containerWidth=a.clientWidth-32;if(textWidth>containerWidth){const scrollDistance=textWidth-containerWidth+20,duration=Math.max(2,scrollDistance/30);a.style.setProperty("--scroll-distance",`-${scrollDistance}px`),a.style.setProperty("--scroll-duration",`${duration}s`),a.classList.add("scrolling")}}),a.addEventListener("mouseleave",function(){a.classList.remove("scrolling")}),a},allPages&&allPages.length>0&&renderAll();</script>
|
|
194
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
195
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
196
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Pages", "categories": ["System"], "pinned": true, "showInAll": true, "pageVersion": 2, "mode": "locked" }
|