failproofai 0.0.11-beta.2 → 0.0.11-beta.3
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +8 -1
- package/.next/standalone/.next/build-manifest.json +10 -10
- package/.next/standalone/.next/prerender-manifest.json +3 -32
- package/.next/standalone/.next/required-server-files.json +2 -1
- package/.next/standalone/.next/routes-manifest.json +45 -3
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +6 -6
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +12 -13
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/run/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
- package/.next/standalone/.next/server/app/audit/page.js +17 -0
- package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -17
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -17
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -3
- package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +14 -15
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +16 -16
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +16 -17
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +19 -20
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +15 -16
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +8 -1
- package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js → [externals]__1nl3dvw._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js → [externals]__1s61mel._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js → [externals]_node_os_0by37l-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07tgnzi._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js → [root-of-the-server]__0_0xu5z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js → [root-of-the-server]__0cycwg6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js → [root-of-the-server]__0f7mikp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oeun7z._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js → [root-of-the-server]__0sb_5m8._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0xuaoik._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12pit4m._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13ra2jq._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d_ob4n._.js → [root-of-the-server]__1_mqemn._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b9z5-i._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js → [root-of-the-server]__1hgv_75._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ixjiy8._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js → [root-of-the-server]__1jm9fw6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fwb7ao._.js → [root-of-the-server]__1m2_4t0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js → [root-of-the-server]__1mhmdzs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js → [root-of-the-server]__1ou2ehh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js → [root-of-the-server]__1w9zl9-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js → _0p53ge1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_1-1804f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
- package/.next/standalone/.next/server/chunks/{_next-internal_server_app_api_download_[project]_[session]_route_actions_0wb00i-.js → _next-internal_server_app_api_download_[project]_[session]_route_actions_1is7vs7.js} +1 -1
- package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js → lib_logger_ts_07e65t5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{package_json_[json]_cjs_0z7w.hh._.js → package_json_[json]_cjs_1nxcc4v._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js → [externals]__1_g_b3t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js → [externals]_node_async_hooks_1gjz99j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00jkjmt._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013du6r._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0989_dx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e85wxv._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gfxvb1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l13qf2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ts150~._.js → [root-of-the-server]__0ywoypf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-scthx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__100hdar._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1cd25c7._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js → [root-of-the-server]__1d8omgc._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tcyn68._.js → [root-of-the-server]__1dky4g0._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__1fax1sl._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hlrq6y._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ihxdo5._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-wn51s._.js → [root-of-the-server]__1pcxxwg._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vvfde2._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js → _05whahf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js → _1kje4fm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js → _1p0-leb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js → app_087bt9w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js → app_1fvisnp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js → app_209u41o._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +43 -0
- package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js → app_error_tsx_1zds1ns._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js → app_global-error_tsx_113y3za._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_error_tsx_0.9-fod._.js → app_project_[name]_error_tsx_1v02_5n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js → app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_error_tsx_0ler-mr._.js → app_project_[name]_session_[sessionId]_error_tsx_0-lj3nd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_loading_tsx_0c0e3yx._.js → app_project_[name]_session_[sessionId]_loading_tsx_0l4aixs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js → lib_codex-projects_ts_0pqlw37._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js → lib_copilot-projects_ts_19wl7tp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js → lib_cursor-projects_ts_18-iwyk._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js → lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js → lib_opencode-projects_ts_15bjxkm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js → lib_pi-projects_ts_1wikofb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_utils_ts_068jk73._.js → lib_utils_ts_0az0sfq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_05gja40.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1n-0xws.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js → node_modules_next_1a1kch7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0h9llsw._.js → node_modules_next_dist_0uboya6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js → node_modules_next_dist_1d_onnt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_0inhx6q._.js → node_modules_next_dist_client_components_0wpq8j3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js → node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js → node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js → node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +3 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +2 -21
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +27 -9
- package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js → 03fmihek9n986.js} +1 -1
- package/.next/standalone/.next/static/chunks/09ueq8s1as8xs.css +2 -0
- package/.next/standalone/.next/static/chunks/0ehe4dh0grngk.js +41 -0
- package/.next/standalone/.next/static/chunks/{0bke.~atnsbeb.js → 0gdm-xaez4l7t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{11w14gnqzprir.js → 0kdglk0vtzymo.js} +1 -1
- package/.next/standalone/.next/static/chunks/0qassxjx1ef04.js +1 -0
- package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
- package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
- package/.next/standalone/.next/static/chunks/1btx2c49fk9xt.css +1 -0
- package/.next/standalone/.next/static/chunks/1fmco3pvq_twz.js +1 -0
- package/.next/standalone/.next/static/chunks/2b1fzuhuk-42n.js +1 -0
- package/.next/standalone/.next/static/chunks/{0bv1oyxspkpkb.js → 2dtip-mvmihiu.js} +1 -1
- package/.next/standalone/.next/static/chunks/2srzafd1_ha5y.js +1 -0
- package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js → 33u59vf_8xpd-.js} +1 -1
- package/.next/standalone/.next/static/chunks/3gti1qdk5epqn.js +1 -0
- package/.next/standalone/.next/static/chunks/{0dvhi-prcsh3~.js → 3krzy-lhwfrmz.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17mubwtqwijpu.js → 3w8d8k_dca5rp.js} +1 -1
- package/.next/standalone/.next/static/chunks/43lnq0c1rnflb.js +6 -0
- package/.next/standalone/.next/static/chunks/{turbopack-0nh.aopesgj~5.js → turbopack-00qy7zfa7m--m.js} +1 -1
- package/.next/standalone/SECURITY.md +73 -0
- package/.next/standalone/app/actions/get-audit-result.ts +24 -0
- package/.next/standalone/app/api/audit/_state.ts +72 -0
- package/.next/standalone/app/api/audit/run/route.ts +89 -0
- package/.next/standalone/app/api/audit/status/route.ts +23 -0
- package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
- package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
- package/.next/standalone/app/api/auth/logout/route.ts +48 -0
- package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
- package/.next/standalone/app/api/auth/status/route.ts +42 -0
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +364 -0
- package/.next/standalone/app/audit/_components/auth-dialog.tsx +401 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +146 -0
- package/.next/standalone/app/audit/_components/findings-section.tsx +135 -0
- package/.next/standalone/app/audit/_components/identity-section.tsx +126 -0
- package/.next/standalone/app/audit/_components/policies-section.tsx +194 -0
- package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
- package/.next/standalone/app/audit/_components/rerun-button.tsx +81 -0
- package/.next/standalone/app/audit/_components/return-section.tsx +428 -0
- package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
- package/.next/standalone/app/audit/_components/score-section.tsx +179 -0
- package/.next/standalone/app/audit/_components/share-dock.tsx +265 -0
- package/.next/standalone/app/audit/_components/share-templates.ts +67 -0
- package/.next/standalone/app/audit/_components/show-off-cta.tsx +135 -0
- package/.next/standalone/app/audit/_components/sigil.tsx +93 -0
- package/.next/standalone/app/audit/_components/strengths-section.tsx +57 -0
- package/.next/standalone/app/audit/audit-styles.css +2066 -0
- package/.next/standalone/app/audit/loading.tsx +24 -0
- package/.next/standalone/app/audit/page.tsx +53 -0
- package/.next/standalone/app/globals.css +570 -137
- package/.next/standalone/app/layout.tsx +16 -9
- package/.next/standalone/app/policies/hooks-client.tsx +223 -129
- package/.next/standalone/app/project/[name]/page.tsx +89 -39
- package/.next/standalone/app/projects/loading.tsx +30 -8
- package/.next/standalone/app/projects/page.tsx +76 -18
- package/.next/standalone/assets/audit/Audit Report.html +22 -0
- package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
- package/.next/standalone/assets/audit/archetypes.jsx +277 -0
- package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/assets/audit/audit.jsx +825 -0
- package/.next/standalone/assets/audit/poster-styles.css +424 -0
- package/.next/standalone/assets/audit/poster.jsx +247 -0
- package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
- package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
- package/.next/standalone/assets/audit/styles.css +1225 -0
- package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
- package/.next/standalone/assets/logos/company/icon.svg +1 -0
- package/.next/standalone/assets/logos/company/logo.svg +1 -0
- package/.next/standalone/components/navbar.tsx +154 -65
- package/.next/standalone/components/reach-developers.tsx +37 -9
- package/.next/standalone/lib/atomic-write.ts +67 -0
- package/.next/standalone/lib/auth/api-server-client.ts +281 -0
- package/.next/standalone/lib/auth/auth-store.ts +250 -0
- package/.next/standalone/lib/client-telemetry.ts +2 -0
- package/.next/standalone/lib/fetch-with-timeout.ts +42 -0
- package/.next/standalone/lib/share-card.ts +120 -0
- package/.next/standalone/lib/telemetry.ts +12 -7
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +11 -11
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +18 -8
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +2 -2
- package/.next/standalone/osv-scanner.toml +17 -0
- package/.next/standalone/package.json +8 -3
- package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/public/icon.svg +1 -0
- package/.next/standalone/public/logo.svg +1 -0
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/templates/bitcount-font/README.md +42 -0
- package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
- package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
- package/README.md +2 -1
- package/bin/failproofai.mjs +165 -144
- package/dist/cli.mjs +607 -1858
- package/lib/atomic-write.ts +67 -0
- package/lib/auth/api-server-client.ts +281 -0
- package/lib/auth/auth-store.ts +250 -0
- package/lib/client-telemetry.ts +2 -0
- package/lib/fetch-with-timeout.ts +42 -0
- package/lib/share-card.ts +120 -0
- package/lib/telemetry.ts +12 -7
- package/package.json +8 -3
- package/scripts/install-telemetry.mjs +4 -0
- package/src/audit/archetypes.ts +924 -0
- package/src/audit/cache.ts +21 -2
- package/src/audit/dashboard-cache.ts +111 -0
- package/src/audit/features.ts +268 -0
- package/src/audit/findings.ts +298 -0
- package/src/audit/index.ts +39 -21
- package/src/audit/replay.ts +29 -3
- package/src/audit/scoring.ts +174 -0
- package/src/audit/strengths.ts +138 -0
- package/src/audit/types.ts +24 -1
- package/src/auth/cli.ts +359 -0
- package/src/hooks/builtin-policies.ts +2 -1
- package/src/hooks/hook-telemetry.ts +2 -2
- package/src/hooks/policy-registry.ts +20 -0
- package/src/posthog-key.ts +9 -0
- package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
- package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/icon.png.body +0 -0
- package/.next/standalone/.next/server/app/icon.png.meta +0 -1
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01as125._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09v.ljl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0agrcb8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b7hkr~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehh6vp._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g8l0tu._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j4l6hl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k5n2kz._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lp08ll._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0yaqw._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0o21f.o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t8juvy._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uylufv._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~03grs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
- package/.next/standalone/.next/static/chunks/07kpqoo7kuckx.js +0 -6
- package/.next/standalone/.next/static/chunks/0azb~vy9ds_uy.js +0 -1
- package/.next/standalone/.next/static/chunks/0f5p9plm.aqlp.css +0 -2
- package/.next/standalone/.next/static/chunks/0ffvlbgzgnlw7.js +0 -2
- package/.next/standalone/.next/static/chunks/0spktq7xqab9h.js +0 -1
- package/.next/standalone/.next/static/chunks/118q3uljozd5z.js +0 -4
- package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
- package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
- package/.next/standalone/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
- package/.next/standalone/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
- package/.next/standalone/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
- package/.next/standalone/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
- package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
- package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
- package/.next/standalone/app/icon.png +0 -0
- package/src/audit/telemetry.ts +0 -113
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route/build-manifest.json +0 -0
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route.js.map +0 -0
- /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0a40sy4tk8ioe.js → 0wwt5o04i4zwh.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0n1n67imq.udf.js → 1__i9af9g78vd.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0w6fzf.07a24u.js → 2so39wg7mjbi7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
|
|
2
|
+
// tweaks-panel.jsx
|
|
3
|
+
// Reusable Tweaks shell + form-control helpers.
|
|
4
|
+
//
|
|
5
|
+
// Owns the host protocol (listens for __activate_edit_mode / __deactivate_edit_mode,
|
|
6
|
+
// posts __edit_mode_available / __edit_mode_set_keys / __edit_mode_dismissed) so
|
|
7
|
+
// individual prototypes don't re-roll it. Ships a consistent set of controls so you
|
|
8
|
+
// don't hand-draw <input type="range">, segmented radios, steppers, etc.
|
|
9
|
+
//
|
|
10
|
+
// Usage (in an HTML file that loads React + Babel):
|
|
11
|
+
//
|
|
12
|
+
// const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
|
|
13
|
+
// "primaryColor": "#D97757",
|
|
14
|
+
// "fontSize": 16,
|
|
15
|
+
// "density": "regular",
|
|
16
|
+
// "dark": false
|
|
17
|
+
// }/*EDITMODE-END*/;
|
|
18
|
+
//
|
|
19
|
+
// function App() {
|
|
20
|
+
// const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
|
|
21
|
+
// return (
|
|
22
|
+
// <div style={{ fontSize: t.fontSize, color: t.primaryColor }}>
|
|
23
|
+
// Hello
|
|
24
|
+
// <TweaksPanel>
|
|
25
|
+
// <TweakSection label="Typography" />
|
|
26
|
+
// <TweakSlider label="Font size" value={t.fontSize} min={10} max={32} unit="px"
|
|
27
|
+
// onChange={(v) => setTweak('fontSize', v)} />
|
|
28
|
+
// <TweakRadio label="Density" value={t.density}
|
|
29
|
+
// options={['compact', 'regular', 'comfy']}
|
|
30
|
+
// onChange={(v) => setTweak('density', v)} />
|
|
31
|
+
// <TweakSection label="Theme" />
|
|
32
|
+
// <TweakColor label="Primary" value={t.primaryColor}
|
|
33
|
+
// onChange={(v) => setTweak('primaryColor', v)} />
|
|
34
|
+
// <TweakToggle label="Dark mode" value={t.dark}
|
|
35
|
+
// onChange={(v) => setTweak('dark', v)} />
|
|
36
|
+
// </TweaksPanel>
|
|
37
|
+
// </div>
|
|
38
|
+
// );
|
|
39
|
+
// }
|
|
40
|
+
//
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
const __TWEAKS_STYLE = `
|
|
44
|
+
.twk-panel{position:fixed;right:16px;bottom:16px;z-index:2147483646;width:280px;
|
|
45
|
+
max-height:calc(100vh - 32px);display:flex;flex-direction:column;
|
|
46
|
+
background:rgba(250,249,247,.78);color:#29261b;
|
|
47
|
+
-webkit-backdrop-filter:blur(24px) saturate(160%);backdrop-filter:blur(24px) saturate(160%);
|
|
48
|
+
border:.5px solid rgba(255,255,255,.6);border-radius:14px;
|
|
49
|
+
box-shadow:0 1px 0 rgba(255,255,255,.5) inset,0 12px 40px rgba(0,0,0,.18);
|
|
50
|
+
font:11.5px/1.4 ui-sans-serif,system-ui,-apple-system,sans-serif;overflow:hidden}
|
|
51
|
+
.twk-hd{display:flex;align-items:center;justify-content:space-between;
|
|
52
|
+
padding:10px 8px 10px 14px;cursor:move;user-select:none}
|
|
53
|
+
.twk-hd b{font-size:12px;font-weight:600;letter-spacing:.01em}
|
|
54
|
+
.twk-x{appearance:none;border:0;background:transparent;color:rgba(41,38,27,.55);
|
|
55
|
+
width:22px;height:22px;border-radius:6px;cursor:default;font-size:13px;line-height:1}
|
|
56
|
+
.twk-x:hover{background:rgba(0,0,0,.06);color:#29261b}
|
|
57
|
+
.twk-body{padding:2px 14px 14px;display:flex;flex-direction:column;gap:10px;
|
|
58
|
+
overflow-y:auto;overflow-x:hidden;min-height:0;
|
|
59
|
+
scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) transparent}
|
|
60
|
+
.twk-body::-webkit-scrollbar{width:8px}
|
|
61
|
+
.twk-body::-webkit-scrollbar-track{background:transparent;margin:2px}
|
|
62
|
+
.twk-body::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px;
|
|
63
|
+
border:2px solid transparent;background-clip:content-box}
|
|
64
|
+
.twk-body::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25);
|
|
65
|
+
border:2px solid transparent;background-clip:content-box}
|
|
66
|
+
.twk-row{display:flex;flex-direction:column;gap:5px}
|
|
67
|
+
.twk-row-h{flex-direction:row;align-items:center;justify-content:space-between;gap:10px}
|
|
68
|
+
.twk-lbl{display:flex;justify-content:space-between;align-items:baseline;
|
|
69
|
+
color:rgba(41,38,27,.72)}
|
|
70
|
+
.twk-lbl>span:first-child{font-weight:500}
|
|
71
|
+
.twk-val{color:rgba(41,38,27,.5);font-variant-numeric:tabular-nums}
|
|
72
|
+
|
|
73
|
+
.twk-sect{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
|
|
74
|
+
color:rgba(41,38,27,.45);padding:10px 0 0}
|
|
75
|
+
.twk-sect:first-child{padding-top:0}
|
|
76
|
+
|
|
77
|
+
.twk-field{appearance:none;width:100%;height:26px;padding:0 8px;
|
|
78
|
+
border:.5px solid rgba(0,0,0,.1);border-radius:7px;
|
|
79
|
+
background:rgba(255,255,255,.6);color:inherit;font:inherit;outline:none}
|
|
80
|
+
.twk-field:focus{border-color:rgba(0,0,0,.25);background:rgba(255,255,255,.85)}
|
|
81
|
+
select.twk-field{padding-right:22px;
|
|
82
|
+
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='rgba(0,0,0,.5)' d='M0 0h10L5 6z'/></svg>");
|
|
83
|
+
background-repeat:no-repeat;background-position:right 8px center}
|
|
84
|
+
|
|
85
|
+
.twk-slider{appearance:none;-webkit-appearance:none;width:100%;height:4px;margin:6px 0;
|
|
86
|
+
border-radius:999px;background:rgba(0,0,0,.12);outline:none}
|
|
87
|
+
.twk-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;
|
|
88
|
+
width:14px;height:14px;border-radius:50%;background:#fff;
|
|
89
|
+
border:.5px solid rgba(0,0,0,.12);box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:default}
|
|
90
|
+
.twk-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;
|
|
91
|
+
background:#fff;border:.5px solid rgba(0,0,0,.12);box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:default}
|
|
92
|
+
|
|
93
|
+
.twk-seg{position:relative;display:flex;padding:2px;border-radius:8px;
|
|
94
|
+
background:rgba(0,0,0,.06);user-select:none}
|
|
95
|
+
.twk-seg-thumb{position:absolute;top:2px;bottom:2px;border-radius:6px;
|
|
96
|
+
background:rgba(255,255,255,.9);box-shadow:0 1px 2px rgba(0,0,0,.12);
|
|
97
|
+
transition:left .15s cubic-bezier(.3,.7,.4,1),width .15s}
|
|
98
|
+
.twk-seg.dragging .twk-seg-thumb{transition:none}
|
|
99
|
+
.twk-seg button{appearance:none;position:relative;z-index:1;flex:1;border:0;
|
|
100
|
+
background:transparent;color:inherit;font:inherit;font-weight:500;min-height:22px;
|
|
101
|
+
border-radius:6px;cursor:default;padding:4px 6px;line-height:1.2;
|
|
102
|
+
overflow-wrap:anywhere}
|
|
103
|
+
|
|
104
|
+
.twk-toggle{position:relative;width:32px;height:18px;border:0;border-radius:999px;
|
|
105
|
+
background:rgba(0,0,0,.15);transition:background .15s;cursor:default;padding:0}
|
|
106
|
+
.twk-toggle[data-on="1"]{background:#34c759}
|
|
107
|
+
.twk-toggle i{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
|
|
108
|
+
background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
|
|
109
|
+
.twk-toggle[data-on="1"] i{transform:translateX(14px)}
|
|
110
|
+
|
|
111
|
+
.twk-num{display:flex;align-items:center;height:26px;padding:0 0 0 8px;
|
|
112
|
+
border:.5px solid rgba(0,0,0,.1);border-radius:7px;background:rgba(255,255,255,.6)}
|
|
113
|
+
.twk-num-lbl{font-weight:500;color:rgba(41,38,27,.6);cursor:ew-resize;
|
|
114
|
+
user-select:none;padding-right:8px}
|
|
115
|
+
.twk-num input{flex:1;min-width:0;height:100%;border:0;background:transparent;
|
|
116
|
+
font:inherit;font-variant-numeric:tabular-nums;text-align:right;padding:0 8px 0 0;
|
|
117
|
+
outline:none;color:inherit;-moz-appearance:textfield}
|
|
118
|
+
.twk-num input::-webkit-inner-spin-button,.twk-num input::-webkit-outer-spin-button{
|
|
119
|
+
-webkit-appearance:none;margin:0}
|
|
120
|
+
.twk-num-unit{padding-right:8px;color:rgba(41,38,27,.45)}
|
|
121
|
+
|
|
122
|
+
.twk-btn{appearance:none;height:26px;padding:0 12px;border:0;border-radius:7px;
|
|
123
|
+
background:rgba(0,0,0,.78);color:#fff;font:inherit;font-weight:500;cursor:default}
|
|
124
|
+
.twk-btn:hover{background:rgba(0,0,0,.88)}
|
|
125
|
+
.twk-btn.secondary{background:rgba(0,0,0,.06);color:inherit}
|
|
126
|
+
.twk-btn.secondary:hover{background:rgba(0,0,0,.1)}
|
|
127
|
+
|
|
128
|
+
.twk-swatch{appearance:none;-webkit-appearance:none;width:56px;height:22px;
|
|
129
|
+
border:.5px solid rgba(0,0,0,.1);border-radius:6px;padding:0;cursor:default;
|
|
130
|
+
background:transparent;flex-shrink:0}
|
|
131
|
+
.twk-swatch::-webkit-color-swatch-wrapper{padding:0}
|
|
132
|
+
.twk-swatch::-webkit-color-swatch{border:0;border-radius:5.5px}
|
|
133
|
+
.twk-swatch::-moz-color-swatch{border:0;border-radius:5.5px}
|
|
134
|
+
`;
|
|
135
|
+
|
|
136
|
+
// ── useTweaks ───────────────────────────────────────────────────────────────
|
|
137
|
+
// Single source of truth for tweak values. setTweak persists via the host
|
|
138
|
+
// (__edit_mode_set_keys → host rewrites the EDITMODE block on disk).
|
|
139
|
+
function useTweaks(defaults) {
|
|
140
|
+
const [values, setValues] = React.useState(defaults);
|
|
141
|
+
// Accepts either setTweak('key', value) or setTweak({ key: value, ... }) so a
|
|
142
|
+
// useState-style call doesn't write a "[object Object]" key into the persisted
|
|
143
|
+
// JSON block.
|
|
144
|
+
const setTweak = React.useCallback((keyOrEdits, val) => {
|
|
145
|
+
const edits = typeof keyOrEdits === 'object' && keyOrEdits !== null
|
|
146
|
+
? keyOrEdits : { [keyOrEdits]: val };
|
|
147
|
+
setValues((prev) => ({ ...prev, ...edits }));
|
|
148
|
+
window.parent.postMessage({ type: '__edit_mode_set_keys', edits }, '*');
|
|
149
|
+
}, []);
|
|
150
|
+
return [values, setTweak];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ── TweaksPanel ─────────────────────────────────────────────────────────────
|
|
154
|
+
// Floating shell. Registers the protocol listener BEFORE announcing
|
|
155
|
+
// availability — if the announce ran first, the host's activate could land
|
|
156
|
+
// before our handler exists and the toolbar toggle would silently no-op.
|
|
157
|
+
// The close button posts __edit_mode_dismissed so the host's toolbar toggle
|
|
158
|
+
// flips off in lockstep; the host echoes __deactivate_edit_mode back which
|
|
159
|
+
// is what actually hides the panel.
|
|
160
|
+
function TweaksPanel({ title = 'Tweaks', children }) {
|
|
161
|
+
const [open, setOpen] = React.useState(false);
|
|
162
|
+
const dragRef = React.useRef(null);
|
|
163
|
+
const offsetRef = React.useRef({ x: 16, y: 16 });
|
|
164
|
+
const PAD = 16;
|
|
165
|
+
|
|
166
|
+
const clampToViewport = React.useCallback(() => {
|
|
167
|
+
const panel = dragRef.current;
|
|
168
|
+
if (!panel) return;
|
|
169
|
+
const w = panel.offsetWidth, h = panel.offsetHeight;
|
|
170
|
+
const maxRight = Math.max(PAD, window.innerWidth - w - PAD);
|
|
171
|
+
const maxBottom = Math.max(PAD, window.innerHeight - h - PAD);
|
|
172
|
+
offsetRef.current = {
|
|
173
|
+
x: Math.min(maxRight, Math.max(PAD, offsetRef.current.x)),
|
|
174
|
+
y: Math.min(maxBottom, Math.max(PAD, offsetRef.current.y)),
|
|
175
|
+
};
|
|
176
|
+
panel.style.right = offsetRef.current.x + 'px';
|
|
177
|
+
panel.style.bottom = offsetRef.current.y + 'px';
|
|
178
|
+
}, []);
|
|
179
|
+
|
|
180
|
+
React.useEffect(() => {
|
|
181
|
+
if (!open) return;
|
|
182
|
+
clampToViewport();
|
|
183
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
184
|
+
window.addEventListener('resize', clampToViewport);
|
|
185
|
+
return () => window.removeEventListener('resize', clampToViewport);
|
|
186
|
+
}
|
|
187
|
+
const ro = new ResizeObserver(clampToViewport);
|
|
188
|
+
ro.observe(document.documentElement);
|
|
189
|
+
return () => ro.disconnect();
|
|
190
|
+
}, [open, clampToViewport]);
|
|
191
|
+
|
|
192
|
+
React.useEffect(() => {
|
|
193
|
+
const onMsg = (e) => {
|
|
194
|
+
const t = e?.data?.type;
|
|
195
|
+
if (t === '__activate_edit_mode') setOpen(true);
|
|
196
|
+
else if (t === '__deactivate_edit_mode') setOpen(false);
|
|
197
|
+
};
|
|
198
|
+
window.addEventListener('message', onMsg);
|
|
199
|
+
window.parent.postMessage({ type: '__edit_mode_available' }, '*');
|
|
200
|
+
return () => window.removeEventListener('message', onMsg);
|
|
201
|
+
}, []);
|
|
202
|
+
|
|
203
|
+
const dismiss = () => {
|
|
204
|
+
setOpen(false);
|
|
205
|
+
window.parent.postMessage({ type: '__edit_mode_dismissed' }, '*');
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const onDragStart = (e) => {
|
|
209
|
+
const panel = dragRef.current;
|
|
210
|
+
if (!panel) return;
|
|
211
|
+
const r = panel.getBoundingClientRect();
|
|
212
|
+
const sx = e.clientX, sy = e.clientY;
|
|
213
|
+
const startRight = window.innerWidth - r.right;
|
|
214
|
+
const startBottom = window.innerHeight - r.bottom;
|
|
215
|
+
const move = (ev) => {
|
|
216
|
+
offsetRef.current = {
|
|
217
|
+
x: startRight - (ev.clientX - sx),
|
|
218
|
+
y: startBottom - (ev.clientY - sy),
|
|
219
|
+
};
|
|
220
|
+
clampToViewport();
|
|
221
|
+
};
|
|
222
|
+
const up = () => {
|
|
223
|
+
window.removeEventListener('mousemove', move);
|
|
224
|
+
window.removeEventListener('mouseup', up);
|
|
225
|
+
};
|
|
226
|
+
window.addEventListener('mousemove', move);
|
|
227
|
+
window.addEventListener('mouseup', up);
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
if (!open) return null;
|
|
231
|
+
return (
|
|
232
|
+
<>
|
|
233
|
+
<style>{__TWEAKS_STYLE}</style>
|
|
234
|
+
<div ref={dragRef} className="twk-panel" data-noncommentable=""
|
|
235
|
+
style={{ right: offsetRef.current.x, bottom: offsetRef.current.y }}>
|
|
236
|
+
<div className="twk-hd" onMouseDown={onDragStart}>
|
|
237
|
+
<b>{title}</b>
|
|
238
|
+
<button className="twk-x" aria-label="Close tweaks"
|
|
239
|
+
onMouseDown={(e) => e.stopPropagation()}
|
|
240
|
+
onClick={dismiss}>✕</button>
|
|
241
|
+
</div>
|
|
242
|
+
<div className="twk-body">{children}</div>
|
|
243
|
+
</div>
|
|
244
|
+
</>
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ── Layout helpers ──────────────────────────────────────────────────────────
|
|
249
|
+
|
|
250
|
+
function TweakSection({ label, children }) {
|
|
251
|
+
return (
|
|
252
|
+
<>
|
|
253
|
+
<div className="twk-sect">{label}</div>
|
|
254
|
+
{children}
|
|
255
|
+
</>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function TweakRow({ label, value, children, inline = false }) {
|
|
260
|
+
return (
|
|
261
|
+
<div className={inline ? 'twk-row twk-row-h' : 'twk-row'}>
|
|
262
|
+
<div className="twk-lbl">
|
|
263
|
+
<span>{label}</span>
|
|
264
|
+
{value != null && <span className="twk-val">{value}</span>}
|
|
265
|
+
</div>
|
|
266
|
+
{children}
|
|
267
|
+
</div>
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ── Controls ────────────────────────────────────────────────────────────────
|
|
272
|
+
|
|
273
|
+
function TweakSlider({ label, value, min = 0, max = 100, step = 1, unit = '', onChange }) {
|
|
274
|
+
return (
|
|
275
|
+
<TweakRow label={label} value={`${value}${unit}`}>
|
|
276
|
+
<input type="range" className="twk-slider" min={min} max={max} step={step}
|
|
277
|
+
value={value} onChange={(e) => onChange(Number(e.target.value))} />
|
|
278
|
+
</TweakRow>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function TweakToggle({ label, value, onChange }) {
|
|
283
|
+
return (
|
|
284
|
+
<div className="twk-row twk-row-h">
|
|
285
|
+
<div className="twk-lbl"><span>{label}</span></div>
|
|
286
|
+
<button type="button" className="twk-toggle" data-on={value ? '1' : '0'}
|
|
287
|
+
role="switch" aria-checked={!!value}
|
|
288
|
+
onClick={() => onChange(!value)}><i /></button>
|
|
289
|
+
</div>
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function TweakRadio({ label, value, options, onChange }) {
|
|
294
|
+
const trackRef = React.useRef(null);
|
|
295
|
+
const [dragging, setDragging] = React.useState(false);
|
|
296
|
+
const opts = options.map((o) => (typeof o === 'object' ? o : { value: o, label: o }));
|
|
297
|
+
const idx = Math.max(0, opts.findIndex((o) => o.value === value));
|
|
298
|
+
const n = opts.length;
|
|
299
|
+
|
|
300
|
+
// The active value is read by pointer-move handlers attached for the lifetime
|
|
301
|
+
// of a drag — ref it so a stale closure doesn't fire onChange for every move.
|
|
302
|
+
const valueRef = React.useRef(value);
|
|
303
|
+
valueRef.current = value;
|
|
304
|
+
|
|
305
|
+
const segAt = (clientX) => {
|
|
306
|
+
const r = trackRef.current.getBoundingClientRect();
|
|
307
|
+
const inner = r.width - 4;
|
|
308
|
+
const i = Math.floor(((clientX - r.left - 2) / inner) * n);
|
|
309
|
+
return opts[Math.max(0, Math.min(n - 1, i))].value;
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
const onPointerDown = (e) => {
|
|
313
|
+
setDragging(true);
|
|
314
|
+
const v0 = segAt(e.clientX);
|
|
315
|
+
if (v0 !== valueRef.current) onChange(v0);
|
|
316
|
+
const move = (ev) => {
|
|
317
|
+
if (!trackRef.current) return;
|
|
318
|
+
const v = segAt(ev.clientX);
|
|
319
|
+
if (v !== valueRef.current) onChange(v);
|
|
320
|
+
};
|
|
321
|
+
const up = () => {
|
|
322
|
+
setDragging(false);
|
|
323
|
+
window.removeEventListener('pointermove', move);
|
|
324
|
+
window.removeEventListener('pointerup', up);
|
|
325
|
+
};
|
|
326
|
+
window.addEventListener('pointermove', move);
|
|
327
|
+
window.addEventListener('pointerup', up);
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
return (
|
|
331
|
+
<TweakRow label={label}>
|
|
332
|
+
<div ref={trackRef} role="radiogroup" onPointerDown={onPointerDown}
|
|
333
|
+
className={dragging ? 'twk-seg dragging' : 'twk-seg'}>
|
|
334
|
+
<div className="twk-seg-thumb"
|
|
335
|
+
style={{ left: `calc(2px + ${idx} * (100% - 4px) / ${n})`,
|
|
336
|
+
width: `calc((100% - 4px) / ${n})` }} />
|
|
337
|
+
{opts.map((o) => (
|
|
338
|
+
<button key={o.value} type="button" role="radio" aria-checked={o.value === value}>
|
|
339
|
+
{o.label}
|
|
340
|
+
</button>
|
|
341
|
+
))}
|
|
342
|
+
</div>
|
|
343
|
+
</TweakRow>
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function TweakSelect({ label, value, options, onChange }) {
|
|
348
|
+
return (
|
|
349
|
+
<TweakRow label={label}>
|
|
350
|
+
<select className="twk-field" value={value} onChange={(e) => onChange(e.target.value)}>
|
|
351
|
+
{options.map((o) => {
|
|
352
|
+
const v = typeof o === 'object' ? o.value : o;
|
|
353
|
+
const l = typeof o === 'object' ? o.label : o;
|
|
354
|
+
return <option key={v} value={v}>{l}</option>;
|
|
355
|
+
})}
|
|
356
|
+
</select>
|
|
357
|
+
</TweakRow>
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function TweakText({ label, value, placeholder, onChange }) {
|
|
362
|
+
return (
|
|
363
|
+
<TweakRow label={label}>
|
|
364
|
+
<input className="twk-field" type="text" value={value} placeholder={placeholder}
|
|
365
|
+
onChange={(e) => onChange(e.target.value)} />
|
|
366
|
+
</TweakRow>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function TweakNumber({ label, value, min, max, step = 1, unit = '', onChange }) {
|
|
371
|
+
const clamp = (n) => {
|
|
372
|
+
if (min != null && n < min) return min;
|
|
373
|
+
if (max != null && n > max) return max;
|
|
374
|
+
return n;
|
|
375
|
+
};
|
|
376
|
+
const startRef = React.useRef({ x: 0, val: 0 });
|
|
377
|
+
const onScrubStart = (e) => {
|
|
378
|
+
e.preventDefault();
|
|
379
|
+
startRef.current = { x: e.clientX, val: value };
|
|
380
|
+
const decimals = (String(step).split('.')[1] || '').length;
|
|
381
|
+
const move = (ev) => {
|
|
382
|
+
const dx = ev.clientX - startRef.current.x;
|
|
383
|
+
const raw = startRef.current.val + dx * step;
|
|
384
|
+
const snapped = Math.round(raw / step) * step;
|
|
385
|
+
onChange(clamp(Number(snapped.toFixed(decimals))));
|
|
386
|
+
};
|
|
387
|
+
const up = () => {
|
|
388
|
+
window.removeEventListener('pointermove', move);
|
|
389
|
+
window.removeEventListener('pointerup', up);
|
|
390
|
+
};
|
|
391
|
+
window.addEventListener('pointermove', move);
|
|
392
|
+
window.addEventListener('pointerup', up);
|
|
393
|
+
};
|
|
394
|
+
return (
|
|
395
|
+
<div className="twk-num">
|
|
396
|
+
<span className="twk-num-lbl" onPointerDown={onScrubStart}>{label}</span>
|
|
397
|
+
<input type="number" value={value} min={min} max={max} step={step}
|
|
398
|
+
onChange={(e) => onChange(clamp(Number(e.target.value)))} />
|
|
399
|
+
{unit && <span className="twk-num-unit">{unit}</span>}
|
|
400
|
+
</div>
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
function TweakColor({ label, value, onChange }) {
|
|
405
|
+
return (
|
|
406
|
+
<div className="twk-row twk-row-h">
|
|
407
|
+
<div className="twk-lbl"><span>{label}</span></div>
|
|
408
|
+
<input type="color" className="twk-swatch" value={value}
|
|
409
|
+
onChange={(e) => onChange(e.target.value)} />
|
|
410
|
+
</div>
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function TweakButton({ label, onClick, secondary = false }) {
|
|
415
|
+
return (
|
|
416
|
+
<button type="button" className={secondary ? 'twk-btn secondary' : 'twk-btn'}
|
|
417
|
+
onClick={onClick}>{label}</button>
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
Object.assign(window, {
|
|
422
|
+
useTweaks, TweaksPanel, TweakSection, TweakRow,
|
|
423
|
+
TweakSlider, TweakToggle, TweakRadio, TweakSelect,
|
|
424
|
+
TweakText, TweakNumber, TweakColor, TweakButton,
|
|
425
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1080" zoomAndPan="magnify" viewBox="0 0 810 809.999993" height="1080" preserveAspectRatio="xMidYMid meet" version="1.0"><defs><filter x="0%" y="0%" width="100%" height="100%" id="0147bff77b"><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0" color-interpolation-filters="sRGB"/></filter><filter x="0%" y="0%" width="100%" height="100%" id="43fbb8a76d"><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0.2126 0.7152 0.0722 0 0" color-interpolation-filters="sRGB"/></filter><clipPath id="511a46bb1d"><path d="M 143 13 L 666.988281 13 L 666.988281 797 L 143 797 Z M 143 13 " clip-rule="nonzero"/></clipPath><mask id="3514a3285d"><g filter="url(#0147bff77b)"><g filter="url(#43fbb8a76d)" transform="matrix(1.383245, 0, 0, 1.383598, 142.737301, 12.643963)"><image x="0" y="0" width="379" xlink:href="data:image/png;base64,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" height="567" preserveAspectRatio="xMidYMid meet"/></g></g></mask></defs><g clip-path="url(#511a46bb1d)"><g mask="url(#3514a3285d)"><g transform="matrix(1.383245, 0, 0, 1.383598, 142.737301, 12.643963)"><image x="0" y="0" width="379" xlink:href="data:image/png;base64,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" height="567" preserveAspectRatio="xMidYMid meet"/></g></g></g></svg>
|