synthos 0.10.0 → 0.11.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 +5 -5
- package/default-pages/elevenlabs_effects_studio/chat-history.json +1 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1345 -1363
- package/default-pages/elevenlabs_effects_studio/page.json +13 -11
- package/default-pages/elevenlabs_voice_studio/chat-history.json +1 -0
- package/default-pages/elevenlabs_voice_studio/page.html +782 -801
- package/default-pages/elevenlabs_voice_studio/page.json +13 -11
- package/default-pages/json_tools/chat-history.json +1 -0
- package/default-pages/json_tools/page.html +70 -90
- package/default-pages/json_tools/page.json +12 -10
- package/default-pages/my_notes/chat-history.json +1 -0
- package/default-pages/my_notes/page.html +115 -131
- package/default-pages/my_notes/page.json +14 -12
- package/default-pages/neon_asteroids/chat-history.json +1 -0
- package/default-pages/neon_asteroids/page.html +1777 -1803
- package/default-pages/neon_asteroids/page.json +14 -12
- package/default-pages/oregon_trail/chat-history.json +1 -0
- package/default-pages/oregon_trail/page.html +290 -307
- package/default-pages/oregon_trail/page.json +14 -12
- package/default-pages/solar_explorer/chat-history.json +1 -0
- package/default-pages/solar_explorer/page.html +1929 -1951
- package/default-pages/solar_explorer/page.json +14 -12
- package/default-pages/solar_tutorial/chat-history.json +1 -0
- package/default-pages/solar_tutorial/page.html +464 -478
- package/default-pages/solar_tutorial/page.json +12 -10
- package/default-pages/us_map/chat-history.json +1 -0
- package/default-pages/us_map/page.html +170 -193
- package/default-pages/us_map/page.json +14 -12
- package/default-pages/us_map/page.light.png +0 -0
- package/default-pages/us_map_1850/chat-history.json +1 -0
- package/default-pages/us_map_1850/page.html +302 -326
- package/default-pages/us_map_1850/page.json +14 -12
- package/default-pages/western_cities_1850/chat-history.json +1 -0
- package/default-pages/western_cities_1850/page.html +503 -527
- package/default-pages/western_cities_1850/page.json +14 -12
- package/default-themes/aurora-dawn.v3.css +15 -14
- package/default-themes/aurora-dusk.v3.css +26 -26
- package/default-themes/cosmos-dawn.v3.css +15 -14
- package/default-themes/cosmos-dusk.v3.css +26 -26
- package/default-themes/elemental-dawn.v3.css +200 -0
- package/default-themes/nebula-dawn.v3.css +15 -14
- package/default-themes/nebula-dusk.v3.css +24 -24
- package/default-themes/solar-flare-dawn.v3.css +15 -14
- package/default-themes/solar-flare-dusk.v3.css +26 -26
- package/dist/builders/anthropic.d.ts +26 -2
- package/dist/builders/anthropic.d.ts.map +1 -1
- package/dist/builders/anthropic.js +132 -31
- package/dist/builders/anthropic.js.map +1 -1
- package/dist/builders/claudecode.d.ts +13 -0
- package/dist/builders/claudecode.d.ts.map +1 -0
- package/dist/builders/claudecode.js +253 -0
- package/dist/builders/claudecode.js.map +1 -0
- package/dist/builders/index.d.ts +2 -1
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +8 -1
- package/dist/builders/index.js.map +1 -1
- package/dist/builders/openai.js +2 -1
- package/dist/builders/openai.js.map +1 -1
- package/dist/builders/types.d.ts +31 -7
- package/dist/builders/types.d.ts.map +1 -1
- package/dist/builders/types.js +60 -28
- package/dist/builders/types.js.map +1 -1
- package/dist/connectors/types.d.ts +8 -0
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +13 -6
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +161 -14
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +1 -0
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +129 -29
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/chainOfThought.d.ts.map +1 -1
- package/dist/models/chainOfThought.js +32 -19
- package/dist/models/chainOfThought.js.map +1 -1
- package/dist/models/index.d.ts +2 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/providers.d.ts +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 +15 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/pages.d.ts +57 -8
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +258 -45
- package/dist/pages.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +5 -0
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/mediaCache.d.ts +36 -0
- package/dist/service/mediaCache.d.ts.map +1 -0
- package/dist/service/mediaCache.js +182 -0
- package/dist/service/mediaCache.js.map +1 -0
- package/dist/service/pageValidator.d.ts +25 -0
- package/dist/service/pageValidator.d.ts.map +1 -0
- package/dist/service/pageValidator.js +315 -0
- package/dist/service/pageValidator.js.map +1 -0
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +4 -0
- package/dist/service/server.js.map +1 -1
- package/dist/service/sharedTableSchema.d.ts +73 -0
- package/dist/service/sharedTableSchema.d.ts.map +1 -0
- package/dist/service/sharedTableSchema.js +206 -0
- package/dist/service/sharedTableSchema.js.map +1 -0
- package/dist/service/transformPage.d.ts +49 -11
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +354 -241
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +288 -34
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.d.ts.map +1 -1
- package/dist/service/useConnectorRoutes.js +170 -32
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useDataRoutes.d.ts.map +1 -1
- package/dist/service/useDataRoutes.js +59 -2
- package/dist/service/useDataRoutes.js.map +1 -1
- package/dist/service/useExtractRoutes.d.ts +4 -0
- package/dist/service/useExtractRoutes.d.ts.map +1 -0
- package/dist/service/useExtractRoutes.js +304 -0
- package/dist/service/useExtractRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts +17 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +1385 -483
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -1
- package/dist/service/useSharedDataRoutes.js +54 -2
- package/dist/service/useSharedDataRoutes.js.map +1 -1
- package/dist/settings.d.ts +27 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +40 -1
- package/dist/settings.js.map +1 -1
- package/dist/themes.d.ts +0 -5
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +3 -95
- package/dist/themes.js.map +1 -1
- package/migration-rules/v2-to-v3.md +277 -119
- package/package.json +5 -1
- package/{default-pages/application → required-pages/_shell}/page.html +56 -42
- package/required-pages/_shell/page.json +14 -0
- package/required-pages/_starters/page.html +534 -0
- package/required-pages/_starters/page.json +12 -0
- package/required-pages/builder/page.html +353 -43
- package/required-pages/builder/page.json +12 -10
- package/required-pages/pages/page.html +697 -924
- package/required-pages/pages/page.json +12 -10
- package/required-pages/settings/page.html +1879 -1753
- package/required-pages/settings/page.json +12 -10
- package/required-pages/synthos_apis/page.html +834 -845
- package/required-pages/synthos_apis/page.json +12 -10
- package/required-pages/synthos_scripts/page.html +74 -88
- package/required-pages/synthos_scripts/page.json +12 -10
- package/scripts/append-instructions.py +90 -0
- package/scripts/audit-instructions.py +76 -0
- package/scripts/cleanup-shell-markup.mjs +112 -0
- package/service-connectors/buffer/connector.json +46 -0
- package/service-connectors/canva/connector.json +67 -0
- package/service-connectors/elevenlabs/connector.json +1 -1
- package/src/builders/anthropic.ts +155 -30
- package/src/builders/claudecode.ts +310 -0
- package/src/builders/index.ts +7 -1
- package/src/builders/openai.ts +2 -1
- package/src/builders/types.ts +93 -32
- package/src/connectors/types.ts +8 -0
- package/src/init.ts +13 -7
- package/src/migrations.ts +187 -16
- package/src/models/anthropic.ts +140 -30
- package/src/models/chainOfThought.ts +33 -18
- package/src/models/index.ts +2 -2
- package/src/models/providers.ts +12 -3
- package/src/models/types.ts +21 -1
- package/src/pages.ts +271 -35
- package/src/service/createCompletePrompt.ts +6 -0
- package/src/service/mediaCache.ts +206 -0
- package/src/service/pageValidator.ts +337 -0
- package/src/service/server.ts +4 -0
- package/src/service/sharedTableSchema.ts +236 -0
- package/src/service/transformPage.ts +370 -260
- package/src/service/useApiRoutes.ts +282 -32
- package/src/service/useConnectorRoutes.ts +189 -34
- package/src/service/useDataRoutes.ts +198 -116
- package/src/service/useExtractRoutes.ts +331 -0
- package/src/service/usePageRoutes.ts +1411 -394
- package/src/service/useSharedDataRoutes.ts +184 -109
- package/src/settings.ts +65 -0
- package/src/themes.ts +78 -180
- package/starters/blank_starter/chat-history.json +1 -0
- package/starters/blank_starter/page.dark.png +0 -0
- package/starters/blank_starter/page.html +47 -0
- package/starters/blank_starter/page.json +13 -0
- package/starters/blank_starter/page.light.png +0 -0
- package/starters/calculator_starter/chat-history.json +1 -0
- package/starters/calculator_starter/page.dark.png +0 -0
- package/starters/calculator_starter/page.html +232 -0
- package/starters/calculator_starter/page.json +13 -0
- package/starters/calculator_starter/page.light.png +0 -0
- package/starters/calendar_starter/chat-history.json +1 -0
- package/starters/calendar_starter/page.dark.png +0 -0
- package/starters/calendar_starter/page.html +495 -0
- package/starters/calendar_starter/page.json +13 -0
- package/starters/calendar_starter/page.light.png +0 -0
- package/starters/chat_starter/chat-history.json +1 -0
- package/starters/chat_starter/page.dark.png +0 -0
- package/starters/chat_starter/page.html +351 -0
- package/starters/chat_starter/page.json +13 -0
- package/starters/chat_starter/page.light.png +0 -0
- package/starters/checklist_starter/chat-history.json +1 -0
- package/starters/checklist_starter/page.dark.png +0 -0
- package/starters/checklist_starter/page.html +437 -0
- package/starters/checklist_starter/page.json +13 -0
- package/starters/checklist_starter/page.light.png +0 -0
- package/starters/dashboard_starter/chat-history.json +1 -0
- package/starters/dashboard_starter/page.dark.png +0 -0
- package/starters/dashboard_starter/page.html +195 -0
- package/starters/dashboard_starter/page.json +13 -0
- package/starters/dashboard_starter/page.light.png +0 -0
- package/starters/form_starter/chat-history.json +1 -0
- package/starters/form_starter/page.dark.png +0 -0
- package/starters/form_starter/page.html +313 -0
- package/starters/form_starter/page.json +13 -0
- package/starters/form_starter/page.light.png +0 -0
- package/starters/gallery_starter/chat-history.json +1 -0
- package/starters/gallery_starter/page.dark.png +0 -0
- package/starters/gallery_starter/page.html +418 -0
- package/starters/gallery_starter/page.json +13 -0
- package/starters/gallery_starter/page.light.png +0 -0
- package/starters/generator_starter/chat-history.json +1 -0
- package/starters/generator_starter/page.dark.png +0 -0
- package/starters/generator_starter/page.html +261 -0
- package/starters/generator_starter/page.json +13 -0
- package/starters/generator_starter/page.light.png +0 -0
- package/starters/index.html +538 -0
- package/starters/kanban_starter/chat-history.json +1 -0
- package/starters/kanban_starter/page.dark.png +0 -0
- package/starters/kanban_starter/page.html +432 -0
- package/starters/kanban_starter/page.json +13 -0
- package/starters/kanban_starter/page.light.png +0 -0
- package/starters/presentation_builder/chat-history.json +1 -0
- package/starters/presentation_builder/page.dark.png +0 -0
- package/starters/presentation_builder/page.html +970 -0
- package/starters/presentation_builder/page.json +15 -0
- package/starters/presentation_builder/page.light.png +0 -0
- package/starters/presentation_builder/presentation_voice/voice_config.json +9 -0
- package/starters/pulse_starter/chat-history.json +1 -0
- package/starters/pulse_starter/page.dark.png +0 -0
- package/starters/pulse_starter/page.html +698 -0
- package/starters/pulse_starter/page.json +13 -0
- package/starters/pulse_starter/page.light.png +0 -0
- package/starters/quiz_starter/chat-history.json +1 -0
- package/starters/quiz_starter/page.dark.png +0 -0
- package/starters/quiz_starter/page.html +292 -0
- package/starters/quiz_starter/page.json +13 -0
- package/starters/quiz_starter/page.light.png +0 -0
- package/starters/reference_starter/chat-history.json +1 -0
- package/starters/reference_starter/page.dark.png +0 -0
- package/starters/reference_starter/page.html +250 -0
- package/starters/reference_starter/page.json +13 -0
- package/starters/reference_starter/page.light.png +0 -0
- package/starters/retro_game_starter/chat-history.json +1 -0
- package/starters/retro_game_starter/page.dark.png +0 -0
- package/{default-pages → starters}/retro_game_starter/page.html +1281 -1308
- package/starters/retro_game_starter/page.json +15 -0
- package/starters/retro_game_starter/page.light.png +0 -0
- package/starters/roster_starter/chat-history.json +1 -0
- package/starters/roster_starter/page.dark.png +0 -0
- package/starters/roster_starter/page.html +600 -0
- package/starters/roster_starter/page.json +13 -0
- package/starters/roster_starter/page.light.png +0 -0
- package/starters/server.js +182 -0
- package/starters/start.cmd +1 -0
- package/starters/timeline_starter/chat-history.json +1 -0
- package/starters/timeline_starter/page.dark.png +0 -0
- package/starters/timeline_starter/page.html +446 -0
- package/starters/timeline_starter/page.json +13 -0
- package/starters/timeline_starter/page.light.png +0 -0
- package/starters/tutorial_starter/chat-history.json +1 -0
- package/starters/tutorial_starter/page.dark.png +0 -0
- package/starters/tutorial_starter/page.html +283 -0
- package/starters/tutorial_starter/page.json +13 -0
- package/starters/tutorial_starter/page.light.png +0 -0
- package/static-files/agent.v3.js +122 -0
- package/static-files/connector.v3.js +48 -0
- package/static-files/extract.v3.js +188 -0
- package/static-files/helpers.v3.js +50 -6
- package/static-files/page-bridge.js +114 -0
- package/static-files/page.v3.js +1292 -1290
- package/static-files/script.v3.js +32 -0
- package/static-files/server.v3.js +89 -0
- package/static-files/shell-bridge.v3.js +174 -0
- package/static-files/shell-modals.v3.js +521 -0
- package/static-files/{shell.css → shell.v3.css} +271 -22
- package/static-files/shell.v3.js +1865 -0
- package/static-files/storage.v3.js +176 -0
- package/tests/anthropic.spec.ts +42 -7
- package/tests/builders.spec.ts +72 -4
- package/tests/pageValidator.spec.ts +548 -0
- package/tests/profiles.spec.ts +122 -0
- package/tests/providers.spec.ts +1 -1
- package/tests/sharedTableSchema.spec.ts +242 -0
- package/tests/transformPage.spec.ts +62 -81
- package/default-pages/application/page.json +0 -10
- package/default-pages/retro_game_starter/page.json +0 -12
- package/default-pages/sidebar_page/page.html +0 -51
- package/default-pages/sidebar_page/page.json +0 -10
- package/default-pages/two-panel_page/page.html +0 -68
- package/default-pages/two-panel_page/page.json +0 -10
|
@@ -0,0 +1,47 @@
|
|
|
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 - Blank Starter</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>
|
|
8
|
+
html, body { height: 100%; }
|
|
9
|
+
body { margin: 0; }
|
|
10
|
+
.viewer-panel { height: 100%; }
|
|
11
|
+
.blank-app {
|
|
12
|
+
min-height: 100%;
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
padding: 32px;
|
|
18
|
+
}
|
|
19
|
+
.blank-hint {
|
|
20
|
+
max-width: 480px;
|
|
21
|
+
text-align: center;
|
|
22
|
+
color: var(--bodySubtext, #605e5c);
|
|
23
|
+
font-size: 14px;
|
|
24
|
+
line-height: 1.5;
|
|
25
|
+
}
|
|
26
|
+
.blank-hint h1 {
|
|
27
|
+
margin: 0 0 8px;
|
|
28
|
+
font-size: 22px;
|
|
29
|
+
font-weight: 600;
|
|
30
|
+
color: var(--bodyText, #333333);
|
|
31
|
+
}
|
|
32
|
+
.blank-hint p { margin: 0; }
|
|
33
|
+
</style>
|
|
34
|
+
</head>
|
|
35
|
+
<body>
|
|
36
|
+
<div class="viewer-panel" id="viewerPanel">
|
|
37
|
+
<div class="blank-app">
|
|
38
|
+
<div class="blank-hint">
|
|
39
|
+
<h1>Blank page</h1>
|
|
40
|
+
<p>Describe what you want to build in the chat and I'll create it here.</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div id="instructions" style="display: none;" data-locked="true">Blank starter — an intentionally empty scaffold. There is no archetype here. The placeholder hint inside .blank-app is there only to communicate "this page is waiting for content" to the user; replace the entire .blank-app contents with whatever the user asks for. Keep the locked theme-info script and theme-css link at the top of head, keep semantic theme tokens (--bodyText, --bodySubtext, --bodyBackground, --themePrimary, --bodyDivider, --inputBorder, --defaultStateBackground) with hex fallbacks, and add a chrome-row style="padding: 0;" on the viewer-panel opening tag if you introduce a header / tab strip / toolbar. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
|
|
46
|
+
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
47
|
+
</body></html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Blank Page",
|
|
3
|
+
"description": "Start from a clean slate and tell the AI exactly what you want to build.",
|
|
4
|
+
"categories": [
|
|
5
|
+
"_Starters"
|
|
6
|
+
],
|
|
7
|
+
"pinned": false,
|
|
8
|
+
"showInAll": false,
|
|
9
|
+
"pageVersion": 3,
|
|
10
|
+
"mode": "unlocked",
|
|
11
|
+
"greeting": "Welcome to the Blank starter — an empty page ready to be shaped into anything. Tell me what you'd like to build and I'll lay out the structure, styles, and behavior from scratch.",
|
|
12
|
+
"firstRunGreeting": ""
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"role":"assistant","content":"Welcome to the Calculator starter — a single-purpose calculator scaffold. Tell me what you'd like to calculate (e.g. mortgage payments, tip splits, unit conversions, paint coverage) and I'll wire the input fields, formula, and breakdown rows."}]
|
|
Binary file
|
|
@@ -0,0 +1,232 @@
|
|
|
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 - Calculator Starter</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>
|
|
8
|
+
.calc-app {
|
|
9
|
+
max-width: 720px;
|
|
10
|
+
margin: 0 auto;
|
|
11
|
+
padding: 24px;
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
gap: 20px;
|
|
15
|
+
}
|
|
16
|
+
.calc-header h1 {
|
|
17
|
+
margin: 0 0 4px;
|
|
18
|
+
font-size: 24px;
|
|
19
|
+
font-weight: 700;
|
|
20
|
+
color: var(--bodyText, #333333);
|
|
21
|
+
}
|
|
22
|
+
.calc-header p {
|
|
23
|
+
margin: 0;
|
|
24
|
+
color: var(--bodySubtext, #605e5c);
|
|
25
|
+
font-size: 14px;
|
|
26
|
+
}
|
|
27
|
+
.calc-section {
|
|
28
|
+
background: var(--defaultStateBackground, #faf9f8);
|
|
29
|
+
border: 1px solid var(--bodyDivider, #edebe9);
|
|
30
|
+
border-radius: 10px;
|
|
31
|
+
padding: 20px;
|
|
32
|
+
}
|
|
33
|
+
.section-title {
|
|
34
|
+
font-size: 14px;
|
|
35
|
+
font-weight: 600;
|
|
36
|
+
color: var(--bodyText, #333333);
|
|
37
|
+
margin-bottom: 12px;
|
|
38
|
+
}
|
|
39
|
+
.calc-grid {
|
|
40
|
+
display: grid;
|
|
41
|
+
grid-template-columns: 1fr 1fr;
|
|
42
|
+
gap: 14px;
|
|
43
|
+
}
|
|
44
|
+
.form-group { display: flex; flex-direction: column; gap: 4px; }
|
|
45
|
+
.form-label {
|
|
46
|
+
font-size: 12px;
|
|
47
|
+
color: var(--bodySubtext, #605e5c);
|
|
48
|
+
}
|
|
49
|
+
.form-input,
|
|
50
|
+
.form-select {
|
|
51
|
+
padding: 8px 10px;
|
|
52
|
+
border: 1px solid var(--inputBorder, #d2d0ce);
|
|
53
|
+
border-radius: 4px;
|
|
54
|
+
background: var(--bodyBackground, #ffffff);
|
|
55
|
+
color: var(--bodyText, #333333);
|
|
56
|
+
font: inherit;
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
}
|
|
59
|
+
.form-input:focus,
|
|
60
|
+
.form-select:focus {
|
|
61
|
+
outline: 2px solid var(--themePrimary, #0078d4);
|
|
62
|
+
outline-offset: -2px;
|
|
63
|
+
}
|
|
64
|
+
.result-primary {
|
|
65
|
+
font-size: 40px;
|
|
66
|
+
font-weight: 700;
|
|
67
|
+
color: var(--themePrimary, #0078d4);
|
|
68
|
+
margin: 4px 0 12px;
|
|
69
|
+
}
|
|
70
|
+
.result-label {
|
|
71
|
+
font-size: 12px;
|
|
72
|
+
color: var(--bodySubtext, #605e5c);
|
|
73
|
+
text-transform: uppercase;
|
|
74
|
+
letter-spacing: 0.04em;
|
|
75
|
+
}
|
|
76
|
+
.breakdown {
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
gap: 8px;
|
|
80
|
+
}
|
|
81
|
+
.breakdown-row {
|
|
82
|
+
display: flex;
|
|
83
|
+
justify-content: space-between;
|
|
84
|
+
align-items: baseline;
|
|
85
|
+
padding: 8px 0;
|
|
86
|
+
border-top: 1px solid var(--bodyDivider, #edebe9);
|
|
87
|
+
font-size: 14px;
|
|
88
|
+
color: var(--bodyText, #333333);
|
|
89
|
+
}
|
|
90
|
+
.breakdown-row:first-child { border-top: none; }
|
|
91
|
+
.breakdown-row .lbl { color: var(--bodySubtext, #605e5c); }
|
|
92
|
+
.breakdown-row .val { font-weight: 600; }
|
|
93
|
+
.formula-note {
|
|
94
|
+
margin-top: 12px;
|
|
95
|
+
padding: 10px 12px;
|
|
96
|
+
background: var(--bodyBackground, #ffffff);
|
|
97
|
+
border: 1px solid var(--bodyDivider, #edebe9);
|
|
98
|
+
border-radius: 6px;
|
|
99
|
+
font-size: 12px;
|
|
100
|
+
color: var(--bodySubtext, #605e5c);
|
|
101
|
+
font-family: 'Cascadia Code', 'Consolas', monospace;
|
|
102
|
+
}
|
|
103
|
+
.preset-row {
|
|
104
|
+
display: flex;
|
|
105
|
+
flex-wrap: wrap;
|
|
106
|
+
gap: 8px;
|
|
107
|
+
align-items: center;
|
|
108
|
+
}
|
|
109
|
+
.preset-chip {
|
|
110
|
+
padding: 6px 12px;
|
|
111
|
+
border: 1px solid var(--inputBorder, #d2d0ce);
|
|
112
|
+
border-radius: 16px;
|
|
113
|
+
background: var(--bodyBackground, #ffffff);
|
|
114
|
+
color: var(--bodyText, #333333);
|
|
115
|
+
font-size: 12px;
|
|
116
|
+
cursor: pointer;
|
|
117
|
+
}
|
|
118
|
+
.preset-chip:hover { background: var(--bodyBackgroundHovered, #f3f2f1); }
|
|
119
|
+
.preset-empty {
|
|
120
|
+
color: var(--bodySubtext, #605e5c);
|
|
121
|
+
font-size: 12px;
|
|
122
|
+
font-style: italic;
|
|
123
|
+
}
|
|
124
|
+
</style>
|
|
125
|
+
</head>
|
|
126
|
+
<body>
|
|
127
|
+
<div class="viewer-panel" id="viewerPanel">
|
|
128
|
+
<div class="calc-app">
|
|
129
|
+
<div class="calc-header">
|
|
130
|
+
<h1>[Calculator Title]</h1>
|
|
131
|
+
<p>[One-line purpose — e.g. "Estimate your monthly mortgage payment."]</p>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<div class="calc-section">
|
|
135
|
+
<div class="section-title">Inputs</div>
|
|
136
|
+
<div class="calc-grid">
|
|
137
|
+
<div class="form-group">
|
|
138
|
+
<label class="form-label" for="inputA">Input A</label>
|
|
139
|
+
<input id="inputA" class="form-input" type="number" step="any" value="100">
|
|
140
|
+
</div>
|
|
141
|
+
<div class="form-group">
|
|
142
|
+
<label class="form-label" for="inputB">Input B</label>
|
|
143
|
+
<input id="inputB" class="form-input" type="number" step="any" value="20">
|
|
144
|
+
</div>
|
|
145
|
+
<div class="form-group">
|
|
146
|
+
<label class="form-label" for="inputC">Input C (count)</label>
|
|
147
|
+
<input id="inputC" class="form-input" type="number" step="1" min="1" value="2">
|
|
148
|
+
</div>
|
|
149
|
+
<div class="form-group">
|
|
150
|
+
<label class="form-label" for="modeSelect">Mode</label>
|
|
151
|
+
<select id="modeSelect" class="form-select">
|
|
152
|
+
<option value="standard">Standard</option>
|
|
153
|
+
<option value="alternate">Alternate</option>
|
|
154
|
+
</select>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="calc-section">
|
|
160
|
+
<div class="result-label">Result</div>
|
|
161
|
+
<div class="result-primary" id="resultPrimary">—</div>
|
|
162
|
+
<div class="breakdown" id="breakdown"></div>
|
|
163
|
+
<div class="formula-note" id="formulaNote">formula: result = A + (A * B / 100), per_person = result / C</div>
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<div class="calc-section">
|
|
167
|
+
<div class="section-title">Presets</div>
|
|
168
|
+
<div class="preset-row" id="presetRow">
|
|
169
|
+
<button class="flm-button" id="savePresetBtn" data-icon="Save">Save current</button>
|
|
170
|
+
<span class="preset-empty" id="presetEmpty">No presets saved yet.</span>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<div id="instructions" style="display: none;" data-locked="true">Calculator archetype. Pure client-side: inputs → live formula → result panel with primary value, breakdown rows, and a plain-language formula note. Optional presets row uses synthos.shared.data.save("<table>", record) when wired. Replace [Calculator Title], input labels/types, the formula in computeResult(), and the breakdown rows with whatever the user asks for. Keep the "result-primary" element as the headline number; everything else is supporting detail. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
|
|
177
|
+
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
178
|
+
|
|
179
|
+
<script>
|
|
180
|
+
(function () {
|
|
181
|
+
var inputA = document.getElementById('inputA');
|
|
182
|
+
var inputB = document.getElementById('inputB');
|
|
183
|
+
var inputC = document.getElementById('inputC');
|
|
184
|
+
var modeSel = document.getElementById('modeSelect');
|
|
185
|
+
var resultEl = document.getElementById('resultPrimary');
|
|
186
|
+
var breakdownEl = document.getElementById('breakdown');
|
|
187
|
+
|
|
188
|
+
function fmt(n) {
|
|
189
|
+
if (!isFinite(n)) return '—';
|
|
190
|
+
return Math.abs(n) >= 100 ? n.toFixed(0) : n.toFixed(2);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function computeResult() {
|
|
194
|
+
var a = parseFloat(inputA.value) || 0;
|
|
195
|
+
var b = parseFloat(inputB.value) || 0;
|
|
196
|
+
var c = Math.max(1, parseInt(inputC.value, 10) || 1);
|
|
197
|
+
var mode = modeSel.value;
|
|
198
|
+
var bonus = a * b / 100;
|
|
199
|
+
var total = mode === 'alternate' ? a - bonus : a + bonus;
|
|
200
|
+
var perItem = total / c;
|
|
201
|
+
resultEl.textContent = fmt(total);
|
|
202
|
+
breakdownEl.innerHTML = '';
|
|
203
|
+
[
|
|
204
|
+
['Base (A)', fmt(a)],
|
|
205
|
+
[(mode === 'alternate' ? 'Subtract' : 'Add') + ' (' + b + '%)', (mode === 'alternate' ? '−' : '+') + fmt(bonus)],
|
|
206
|
+
['Total', fmt(total)],
|
|
207
|
+
['Per item (÷ ' + c + ')', fmt(perItem)]
|
|
208
|
+
].forEach(function (r) {
|
|
209
|
+
var row = document.createElement('div');
|
|
210
|
+
row.className = 'breakdown-row';
|
|
211
|
+
row.innerHTML = '<span class="lbl">' + r[0] + '</span><span class="val">' + r[1] + '</span>';
|
|
212
|
+
breakdownEl.appendChild(row);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
[inputA, inputB, inputC, modeSel].forEach(function (el) {
|
|
217
|
+
el.addEventListener('input', computeResult);
|
|
218
|
+
el.addEventListener('change', computeResult);
|
|
219
|
+
});
|
|
220
|
+
computeResult();
|
|
221
|
+
|
|
222
|
+
// Presets — wire to synthos.shared.data once a table is named:
|
|
223
|
+
// document.getElementById('savePresetBtn').addEventListener('click', function () {
|
|
224
|
+
// synthos.shared.data.save('calculator_presets', {
|
|
225
|
+
// a: inputA.value, b: inputB.value, c: inputC.value, mode: modeSel.value,
|
|
226
|
+
// label: 'A=' + inputA.value + ' B=' + inputB.value, savedAt: new Date().toISOString()
|
|
227
|
+
// }).then(loadPresets);
|
|
228
|
+
// });
|
|
229
|
+
// function loadPresets() { synthos.shared.data.list('calculator_presets').then(renderPresets); }
|
|
230
|
+
})();
|
|
231
|
+
</script>
|
|
232
|
+
</body></html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Calculator",
|
|
3
|
+
"description": "Build a single-purpose calculator for finance, conversions, tip splits, or any input-driven formula.",
|
|
4
|
+
"categories": [
|
|
5
|
+
"_Starters"
|
|
6
|
+
],
|
|
7
|
+
"pinned": false,
|
|
8
|
+
"showInAll": false,
|
|
9
|
+
"pageVersion": 3,
|
|
10
|
+
"mode": "unlocked",
|
|
11
|
+
"greeting": "Welcome to the Calculator starter — a single-purpose calculator scaffold. Tell me what you'd like to calculate (e.g. mortgage payments, tip splits, unit conversions, paint coverage) and I'll wire the input fields, formula, and breakdown rows.",
|
|
12
|
+
"firstRunGreeting": ""
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"role":"assistant","content":"Welcome to the Calendar starter — a date-anchored scheduling scaffold. Tell me what you'll be scheduling (e.g. meetings, content posts, shifts, deadlines, meals) and I'll wire the views, event blocks, and edit drawer."}]
|
|
Binary file
|