thursday-agent 0.15.0 → 0.16.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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +4 -4
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +8 -8
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +3 -3
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +3 -3
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js +7 -7
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/route.js +6 -6
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js +5 -5
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +1 -1
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/favicon/[host]/route.js +1 -1
- package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +7 -7
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js +7 -7
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js +4 -4
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route.js +4 -4
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +2 -2
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +14 -15
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/reach/route.js +18 -19
- package/.next/server/app/api/reach/route.js.nft.json +1 -1
- package/.next/server/app/api/routine/route.js +3 -3
- package/.next/server/app/api/routine/route.js.nft.json +1 -1
- package/.next/server/app/api/signins/route.js +1 -1
- package/.next/server/app/api/signins/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +8 -5
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +8 -5
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +7 -7
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/settings/route.js +7 -7
- package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/text/route.js +15 -16
- package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +12 -13
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js +7 -7
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +7 -7
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +3 -3
- package/.next/server/app/artifact/[...path]/page.js +4 -4
- package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/page/server-reference-manifest.json +60 -60
- package/.next/server/app/page.js +9 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__00qyw01._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__03b09q0._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__03vunn6._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0adz-25._.js → [root-of-the-server]__05dp5tr._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__05n-hql._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__06nspyt._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0aijj66._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0g38-aj._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0h656y-._.js +11 -0
- package/.next/server/chunks/{[root-of-the-server]__0g67-oo._.js → [root-of-the-server]__0j_nz36._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ljizgj._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tsded0._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0tvoct-._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1-tdj60._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0132c27._.js → [root-of-the-server]__10_7vqz._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__10xnb7e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__118qjk_._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__11g20j-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__13hng6h._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0o-w4t4._.js → [root-of-the-server]__16yw3mb._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__18e65_-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18k8s-z._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1b8tp42._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1c2kwku._.js +12 -0
- package/.next/server/chunks/[root-of-the-server]__1ceammd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ep-pao._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__1gamvcz._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1gzcbda._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__20tvhdf._.js → [root-of-the-server]__1mbd2w_._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1ndi14y._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1p47fbb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1qcn1ti._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__1t0jj1j._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1v7x5ym._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1vlxv19._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0ei2xnb._.js → [root-of-the-server]__1voqqyc._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1zn039k._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1zrwxis._.js +3 -0
- package/.next/server/chunks/_01t8da9._.js +1 -1
- package/.next/server/chunks/_02fn1o3._.js +3 -0
- package/.next/server/chunks/_05sa7xl._.js +1 -1
- package/.next/server/chunks/_06u9yo-._.js +1 -1
- package/.next/server/chunks/_07nxi75._.js +250 -0
- package/.next/server/chunks/_08354bn._.js +107 -0
- package/.next/server/chunks/_0caua_s._.js +1 -1
- package/.next/server/chunks/_0j0-gq6._.js +5 -0
- package/.next/server/chunks/_0nn99o2._.js +1 -1
- package/.next/server/chunks/_0p-h6xe._.js +5 -0
- package/.next/server/chunks/_0p6v1fr._.js +5 -0
- package/.next/server/chunks/_0qoush_._.js +3 -0
- package/.next/server/chunks/_0srlnvd._.js +1 -1
- package/.next/server/chunks/_0t_7gji._.js +1 -1
- package/.next/server/chunks/_0uir6hb._.js +9 -9
- package/.next/server/chunks/_0uzj57i._.js +1 -1
- package/.next/server/chunks/_0xm040x._.js +1 -1
- package/.next/server/chunks/_0xx3ryc._.js +2 -2
- package/.next/server/chunks/_0xygcxs._.js +250 -0
- package/.next/server/chunks/{_0ol42w-._.js → _1-sk_q4._.js} +2 -2
- package/.next/server/chunks/_146mcip._.js +1 -1
- package/.next/server/chunks/_19kea1l._.js +8 -8
- package/.next/server/chunks/_1d5zmy8._.js +1 -1
- package/.next/server/chunks/_1dxq827._.js +5 -0
- package/.next/server/chunks/{_0ejoy4d._.js → _1e54wxa._.js} +2 -2
- package/.next/server/chunks/_1gn2r2q._.js +12 -12
- package/.next/server/chunks/_1gxankq._.js +2 -2
- package/.next/server/chunks/_1hyvcgk._.js +5 -0
- package/.next/server/chunks/_1m88lkh._.js +9 -9
- package/.next/server/chunks/_1mfu9a3._.js +5 -0
- package/.next/server/chunks/_1mx9sfo._.js +1 -1
- package/.next/server/chunks/_1ozcb6o._.js +27 -0
- package/.next/server/chunks/_1q6e56i._.js +12 -12
- package/.next/server/chunks/_1qgix-j._.js +1 -1
- package/.next/server/chunks/_1w6uf9k._.js +3 -0
- package/.next/server/chunks/_1wl2g8_._.js +2 -2
- package/.next/server/chunks/_1wwl_7o._.js +1 -1
- package/.next/server/chunks/_1xcnogc._.js +6 -0
- package/.next/server/chunks/_1zfxb7j._.js +1 -1
- package/.next/server/chunks/_20oecmn._.js +6 -0
- package/.next/server/chunks/_211dn2c._.js +1 -1
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0wm-ujw._.js +6 -0
- package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +4 -4
- package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +3 -3
- package/.next/server/chunks/{node_modules_1osf6vs._.js → node_modules_0dctjy-._.js} +1 -1
- package/.next/server/chunks/{node_modules_1821h5r._.js → node_modules_0mquap1._.js} +1 -1
- package/.next/server/chunks/{node_modules_1bfhxob._.js → node_modules_1er1u8w._.js} +1 -1
- package/.next/server/chunks/{node_modules_1i11kg5._.js → node_modules_1rosz79._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_035jiu9._.js → node_modules_consola_dist_chunks_prompt_mjs_0_nz09c._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0736s17._.js → node_modules_consola_dist_chunks_prompt_mjs_0rx6rvb._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_07szfwb._.js → node_modules_consola_dist_chunks_prompt_mjs_128pb4i._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0rzuf5j._.js → node_modules_consola_dist_chunks_prompt_mjs_1x3bsmx._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_20s275p._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0670az2._.js → [root-of-the-server]__02jdtqa._.js} +3 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0rnjkw2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10eb-1x._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1867koj._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1d7usu0._.js +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__00ro8qe._.js → [root-of-the-server]__1jyeu61._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__1y5_1cv._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1y8_-v1._.js +3 -0
- package/.next/server/chunks/ssr/{_1zdizo8._.js → _0-ou1b0._.js} +2 -2
- package/.next/server/chunks/ssr/{_02u485c._.js → _0afrpci._.js} +2 -2
- package/.next/server/chunks/ssr/_0cd6g3l._.js +5 -5
- package/.next/server/chunks/ssr/{_0trt3zp._.js → _0fo4552._.js} +17 -19
- package/.next/server/chunks/ssr/{_168tvri._.js → _0l1-xc6._.js} +2 -2
- package/.next/server/chunks/ssr/{_1rxpx-u._.js → _0ncuqct._.js} +2 -2
- package/.next/server/chunks/ssr/_0qsmpcu._.js +1 -1
- package/.next/server/chunks/ssr/{_0c1h0l9._.js → _0r0g9ki._.js} +3 -3
- package/.next/server/chunks/ssr/_0rvbegp._.js +7 -0
- package/.next/server/chunks/ssr/{_1_n8qpv._.js → _0w8r7o7._.js} +2 -2
- package/.next/server/chunks/ssr/{_074hv3s._.js → _0wupyvd._.js} +2 -2
- package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
- package/.next/server/chunks/ssr/{_0z0scn4._.js → _0y28gl3._.js} +3 -3
- package/.next/server/chunks/ssr/{node_modules_0vi73_6._.js → _10-_awu._.js} +2 -2
- package/.next/server/chunks/ssr/{_06m66w8._.js → _10fwcz_._.js} +2 -2
- package/.next/server/chunks/ssr/{_0ze-0vs._.js → _11pnnvd._.js} +4 -4
- package/.next/server/chunks/ssr/_17ble8k._.js +162 -0
- package/.next/server/chunks/ssr/_17qtuv7._.js +3 -0
- package/.next/server/chunks/ssr/{_1xq-4on._.js → _1dqaksc._.js} +2 -2
- package/.next/server/chunks/ssr/{_20lwjif._.js → _1f6s34p._.js} +2 -2
- package/.next/server/chunks/ssr/_1g48r6t._.js +3 -0
- package/.next/server/chunks/ssr/_1k0efi3._.js +3 -0
- package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
- package/.next/server/chunks/ssr/_1u5vsy-._.js +3 -0
- package/.next/server/chunks/ssr/_1uij_rj._.js +3 -0
- package/.next/server/chunks/ssr/{_1r0tx3q._.js → _1umbr78._.js} +3 -3
- package/.next/server/chunks/ssr/_1w9w1ok._.js +3 -0
- package/.next/server/chunks/ssr/_1z586yw._.js +3 -0
- package/.next/server/chunks/ssr/features_0796o8r._.js +3 -0
- package/.next/server/chunks/ssr/features_133mpna._.js +6 -0
- package/.next/server/chunks/ssr/features_bot_1k25jdg._.js +3 -0
- package/.next/server/chunks/ssr/{features_config_13cg2cx._.js → features_config_11dpa7r._.js} +3 -3
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +3 -3
- package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
- package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
- package/.next/server/chunks/ssr/features_workspace_workspace_ts_1wc7_u_._.js +4 -3
- package/.next/server/chunks/ssr/{node_modules_1lmv1ux._.js → node_modules_0-8r9yw._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-20i0r._.js → node_modules_0-ew8f8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1us2bdc._.js → node_modules_02uwbwp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1vx7yq2._.js → node_modules_097cl9f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16oefzh._.js → node_modules_0bas34k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0v6s4c8._.js → node_modules_0bbwe-u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ngj__4._.js → node_modules_0etz1i0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0den7sw._.js → node_modules_0ka8te1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_10t4pbm._.js → node_modules_0ld7p-1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09eqoqr._.js → node_modules_0mark4f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01uutx9._.js → node_modules_0n1js5k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0t93862._.js → node_modules_0sdjzae._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1x2-bh1._.js → node_modules_0u24mg0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_15ksxpk._.js → node_modules_0uibk9z._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0r6leyg._.js → node_modules_0x_2io2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_gizvz._.js → node_modules_0y5uubt._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1j59xrt._.js → node_modules_138kcrz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20d3gsv._.js → node_modules_156m1qh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_19d6gup._.js → node_modules_18yn_bs._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_218nu70._.js → node_modules_1dzye0n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1gdff1c._.js → node_modules_1o9n7_n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0yslr-j._.js → node_modules_1ozyial._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16op-wf._.js → node_modules_1r5o-bo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uil5qp._.js → node_modules_1tj7_9z._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0h3dnyw._.js → node_modules_1xua-g1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_03hfcze._.js → node_modules_1zkzksd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0wbgrv5._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_133hjui._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_15680yt._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b3vwd3._.js} +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +61 -61
- package/.next/static/chunks/00d54fcfm-lko.js +1 -0
- package/.next/static/chunks/05scfrgo_a_5_.js +58 -0
- package/.next/static/chunks/{1rjn_x_ty28qc.js → 0609ejkwuy4sf.js} +2 -2
- package/.next/static/chunks/{3w3v100tg-tun.js → 07vcuxousbmy1.js} +1 -1
- package/.next/static/chunks/{3r1p-za3kwq6b.js → 0cl_fgkphk1oz.js} +1 -1
- package/.next/static/chunks/0gjlsu6vrfzod.js +1 -0
- package/.next/static/chunks/0npvak0wpgagb.js +1 -0
- package/.next/static/chunks/{1wkrzv0y4qx48.js → 0o7o0eb7ihxi6.js} +1 -1
- package/.next/static/chunks/0q4ws7qd21chx.js +35 -0
- package/.next/static/chunks/{2q33y6q5_4yxf.js → 0unonxbajyknw.js} +1 -1
- package/.next/static/chunks/17yqt1p_svv13.js +1 -0
- package/.next/static/chunks/19l81deo_pyoc.js +1 -0
- package/.next/static/chunks/1ub9obhgfm4jl.js +1 -0
- package/.next/static/chunks/203pbwecfs3tm.js +1 -0
- package/.next/static/chunks/{30_2pay06oou4.js → 23tx-2paw9qa6.js} +3 -3
- package/.next/static/chunks/{22djpz2dakws5.js → 245_cp14iz637.js} +1 -1
- package/.next/static/chunks/2jbjyazqfqyoh.js +1 -0
- package/.next/static/chunks/2oa4gpkzjtpni.js +1 -0
- package/.next/static/chunks/2uraofiaoy32s.js +1 -0
- package/.next/static/chunks/{1ln0zczby868j.js → 2xjr5b-yk_h3o.js} +2 -2
- package/.next/static/chunks/314szf8yer-3n.js +2 -0
- package/.next/static/chunks/{38srd01ofppmn.css → 31kn4_h2rvf6k.css} +1 -1
- package/.next/static/chunks/39miwvg4k-b2d.js +1 -0
- package/.next/static/chunks/3ghvoe_mlljzs.js +15 -0
- package/.next/static/chunks/{2-9ybn1k9el1e.js → 3gn7dubb4-pwy.js} +1 -1
- package/.next/static/chunks/3j-l8un0d77v7.js +18 -0
- package/.next/static/chunks/{1iezy4u4v9kl7.js → 3ro66d9dc70bc.js} +1 -1
- package/.next/static/chunks/3vwjs5kq11417.js +1 -0
- package/.next/static/chunks/42m371fn687r5.js +1 -0
- package/README.md +3 -1
- package/guide/bots.md +3 -2
- package/guide/calls.md +16 -15
- package/guide/index.md +1 -1
- package/guide/setup.md +19 -10
- package/guide/trouble.md +12 -2
- package/package.json +2 -2
- package/public/sounds/NOTICE +213 -0
- package/public/sounds/end_voice.ogg +0 -0
- package/public/sounds/ring.ogg +0 -0
- package/public/sounds/start_voice.ogg +0 -0
- package/seed-skills/concierge/travel/SKILL.md +4 -4
- package/seed-skills/marketer/marketing/references/copywriting-copy-frameworks.md +3 -10
- package/seed-skills/marketer/marketing/references/copywriting.md +2 -2
- package/seed-skills/marketer/marketing/references/social-platforms.md +5 -5
- package/skills/artifact/SKILL.md +2 -1
- package/skills/artifact/references/book.md +2 -3
- package/skills/artifact/references/deck.md +4 -0
- package/skills/artifact/runtime/app/kit/vite.config.ts +6 -3
- package/skills/artifact/runtime/app/page/index.html +1 -1
- package/skills/artifact/runtime/book/book.html +1 -1
- package/skills/artifact/runtime/canvas/canvas.html +1 -1
- package/skills/artifact/runtime/deck/deck.html +1 -1
- package/skills/artifact/runtime/document/quick.html +1 -1
- package/skills/artifact/scripts/chart.mjs +122 -14
- package/skills/artifact/scripts/document.mjs +3 -2
- package/skills/daily-brief/scripts/story.mjs +13 -1
- package/skills/media-digest/SKILL.md +4 -2
- package/skills/media-digest/references/no-captions.md +2 -1
- package/skills/media-digest/scripts/audio.mjs +7 -2
- package/.next/server/chunks/[root-of-the-server]__0876r42._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0brcw76._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0c_j_qe._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0grmfwp._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0kv916d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0tkqhnc._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0vffrja._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0vn91fr._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0vxvcj4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0zbo906._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__10ep3hy._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10iry08._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__11d0tvc._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__19sv9or._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1_1zysn._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1e0f7he._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__1fdpwcm._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1hgdkzg._.js +0 -11
- package/.next/server/chunks/[root-of-the-server]__1ksm9m-._.js +0 -12
- package/.next/server/chunks/[root-of-the-server]__1l_nubj._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1pmsv_6._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1tdudkf._.js +0 -5
- package/.next/server/chunks/_02lipqs._.js +0 -5
- package/.next/server/chunks/_034lk-r._.js +0 -3
- package/.next/server/chunks/_04ynt0z._.js +0 -252
- package/.next/server/chunks/_171rt-v._.js +0 -109
- package/.next/server/chunks/_17esum5._.js +0 -5
- package/.next/server/chunks/_1p8rzg_._.js +0 -252
- package/.next/server/chunks/_1v5g4kx._.js +0 -3
- package/.next/server/chunks/_1vxrw1q._.js +0 -5
- package/.next/server/chunks/features_0-cnt0l._.js +0 -4
- package/.next/server/chunks/features_0hdaci0._.js +0 -4
- package/.next/server/chunks/features_0p85gv6._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0ta6hsy._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0tok7g7._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_187uwe9._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1cu9mam._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1g1et-d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__099tvf0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0dxszdt._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0ihvne0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__11hcjwx._.js +0 -3
- package/.next/server/chunks/ssr/_018vrx-._.js +0 -3
- package/.next/server/chunks/ssr/_0afqubz._.js +0 -162
- package/.next/server/chunks/ssr/_0ayihi5._.js +0 -3
- package/.next/server/chunks/ssr/_0gv5wzb._.js +0 -3
- package/.next/server/chunks/ssr/_0kkdx7t._.js +0 -3
- package/.next/server/chunks/ssr/_0yjztzi._.js +0 -3
- package/.next/server/chunks/ssr/_14fdswx._.js +0 -3
- package/.next/server/chunks/ssr/_1ajl6hf._.js +0 -5
- package/.next/server/chunks/ssr/_1o_i8-d._.js +0 -7
- package/.next/server/chunks/ssr/_1ri-y7z._.js +0 -4
- package/.next/server/chunks/ssr/features_0ctqq63._.js +0 -4
- package/.next/server/chunks/ssr/features_bot_0v6r-lh._.js +0 -3
- package/.next/static/chunks/0j8_qql4enu93.js +0 -1
- package/.next/static/chunks/0mr03ivl4_fxd.js +0 -1
- package/.next/static/chunks/13qwyo9-jd5kw.js +0 -1
- package/.next/static/chunks/17_b97pj_av_t.js +0 -1
- package/.next/static/chunks/18id2dgl_39_1.js +0 -18
- package/.next/static/chunks/1lp02y2nmddxg.js +0 -1
- package/.next/static/chunks/249i2g6ele3t2.js +0 -1
- package/.next/static/chunks/249wisxmxrwa9.js +0 -1
- package/.next/static/chunks/27dovttmtqjhi.js +0 -15
- package/.next/static/chunks/2k1rwhz_x2lej.js +0 -1
- package/.next/static/chunks/2p2pqpub-48me.js +0 -58
- package/.next/static/chunks/34-6gj9kheq74.js +0 -2
- package/.next/static/chunks/3a29oqdmvp25o.js +0 -35
- package/.next/static/chunks/3c_bgfr_z4peu.js +0 -1
- package/.next/static/chunks/3gyqds2iodotb.js +0 -1
- package/.next/static/chunks/3hxors_gsfsut.js +0 -1
- package/.next/static/chunks/3q-3lu8gpr4-h.js +0 -1
- package/.next/static/chunks/3qkm3p4g4ajku.js +0 -3
- package/.next/static/chunks/3w3mgbz8nuug2.js +0 -1
- package/app/api/bot/memory/files/route.ts +0 -14
- package/app/api/bot/memory/route.ts +0 -5
- package/app/api/events/app-event.client.ts +0 -30
- package/app/api/events/app-event.server.ts +0 -47
- package/app/api/events/app-event.ts +0 -78
- package/app/api/llm-model/catalog/route.ts +0 -12
- package/app/api/llm-model/credits/route.ts +0 -11
- package/app/api/llm-model/route.ts +0 -26
- package/app/api/llm-model/subscription/route.ts +0 -11
- package/app/api/memory/edit/route.ts +0 -7
- package/app/api/memory/route.ts +0 -8
- package/app/api/query-key.ts +0 -192
- package/app/api/thursday/tool-call/route.ts +0 -76
- package/biome.json +0 -72
- package/components/ui/button-group.tsx +0 -45
- package/components/ui/custom-icon.tsx +0 -199
- package/components/ui/dropdown-menu.tsx +0 -271
- package/components/ui/folded-text.tsx +0 -68
- package/components/ui/input-group.tsx +0 -157
- package/components/ui/json-view.tsx +0 -240
- package/components/ui/radio-group.tsx +0 -37
- package/components/ui/shiny-text.tsx +0 -68
- package/components/ui/site-icon.tsx +0 -45
- package/components/ui/source-chips.tsx +0 -54
- package/components/ui/theme-sync.tsx +0 -9
- package/components.json +0 -25
- package/docs/how-it-works.md +0 -76
- package/docs/images/errands-dark.png +0 -0
- package/docs/images/errands-light.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/more-dark.png +0 -0
- package/docs/images/more-light.png +0 -0
- package/docs/images/results-dark.png +0 -0
- package/docs/images/results-light.png +0 -0
- package/docs/images/talk-dark.png +0 -0
- package/docs/images/talk-light.png +0 -0
- package/docs/images/team-dark.png +0 -0
- package/docs/images/team-light.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/features/ai/chatgpt.ts +0 -638
- package/features/ai/components/chatgpt-sign-in.tsx +0 -66
- package/features/ai/components/effort-switch.tsx +0 -112
- package/features/ai/components/gateway-mark.tsx +0 -188
- package/features/ai/components/model-browser.tsx +0 -324
- package/features/ai/components/model-picker.tsx +0 -336
- package/features/ai/components/provider-icon.tsx +0 -162
- package/features/ai/guide.ts +0 -44
- package/features/ai/live.schema.ts +0 -150
- package/features/ai/load-tools.ts +0 -495
- package/features/ai/model.schema.ts +0 -985
- package/features/ai/model.ts +0 -662
- package/features/ai/prompts/bot.prompt.ts +0 -418
- package/features/ai/prompts/call-standing.ts +0 -43
- package/features/ai/prompts/live.prompt.ts +0 -197
- package/features/ai/prompts/memory-edit.prompt.ts +0 -33
- package/features/ai/prompts/persona.ts +0 -114
- package/features/ai/prompts/prompt-helper.ts +0 -287
- package/features/ai/prompts/thursday.prompt.ts +0 -281
- package/features/ai/tools/bot.tool.ts +0 -183
- package/features/ai/tools/call.tool.ts +0 -50
- package/features/ai/tools/connected.ts +0 -199
- package/features/ai/tools/deck.tool.ts +0 -518
- package/features/ai/tools/look.tool.ts +0 -65
- package/features/ai/tools/mcp.tool.ts +0 -187
- package/features/ai/tools/memory.tool.ts +0 -296
- package/features/ai/tools/routine.tool.ts +0 -214
- package/features/ai/tools/search.tool.ts +0 -248
- package/features/ai/tools/self.tool.ts +0 -58
- package/features/ai/tools/signin.tool.ts +0 -138
- package/features/ai/tools/skills.tool.ts +0 -109
- package/features/ai/tools/studio.tool.ts +0 -360
- package/features/ai/tools/tool-name.ts +0 -56
- package/features/ai/tools/workspace.tool.ts +0 -126
- package/features/ai/words.ts +0 -60
- package/features/artifact/artifact.action.ts +0 -12
- package/features/artifact/artifact.query.ts +0 -218
- package/features/artifact/artifact.schema.ts +0 -58
- package/features/artifact/components/artifact-setting.tsx +0 -513
- package/features/bot/bot.action.ts +0 -195
- package/features/bot/bot.memory.ts +0 -206
- package/features/bot/bot.query.ts +0 -293
- package/features/bot/bot.run.ts +0 -909
- package/features/bot/bot.runner.ts +0 -595
- package/features/bot/bot.schema.ts +0 -501
- package/features/bot/bot.seed.ts +0 -160
- package/features/bot/components/attachments.tsx +0 -225
- package/features/bot/components/bot-badge.tsx +0 -21
- package/features/bot/components/bot-mark.tsx +0 -1678
- package/features/bot/components/bot-room.tsx +0 -439
- package/features/bot/components/bot-roster.tsx +0 -43
- package/features/bot/components/bot-setting.tsx +0 -1698
- package/features/bot/components/bot-tip.tsx +0 -48
- package/features/bot/components/bot-tool.tsx +0 -644
- package/features/bot/components/crew-motion.ts +0 -168
- package/features/bot/components/mark-palette.tsx +0 -57
- package/features/bot/components/room-conversation.tsx +0 -1208
- package/features/bot/components/room-list.tsx +0 -539
- package/features/bot/components/room-pill.tsx +0 -1045
- package/features/bot/components/thread-badge.tsx +0 -37
- package/features/bot/components/thread-reply.tsx +0 -780
- package/features/bot/components/thread-setting.tsx +0 -718
- package/features/bot/components/write-orb.tsx +0 -298
- package/features/bot/mark.const.ts +0 -164
- package/features/bot/room.query.ts +0 -922
- package/features/bot/room.schema.ts +0 -78
- package/features/bot/seed-bots.ts +0 -44
- package/features/bot/thread.query.ts +0 -1175
- package/features/bot/thread.store.ts +0 -726
- package/features/config/components/config-badge.tsx +0 -28
- package/features/config/components/config-setting.tsx +0 -881
- package/features/config/components/models-badge.tsx +0 -42
- package/features/config/components/voice-key.tsx +0 -321
- package/features/config/config.action.ts +0 -67
- package/features/config/config.const.ts +0 -356
- package/features/config/config.query.ts +0 -43
- package/features/connectors/components/mcp-badge.tsx +0 -17
- package/features/connectors/components/mcp-mark.tsx +0 -4
- package/features/connectors/components/mcp-setting.tsx +0 -1028
- package/features/connectors/mcp.action.ts +0 -93
- package/features/connectors/mcp.const.ts +0 -336
- package/features/connectors/mcp.manager.ts +0 -497
- package/features/connectors/mcp.query.ts +0 -256
- package/features/connectors/mcp.schema.ts +0 -122
- package/features/intro/components/echoes.tsx +0 -563
- package/features/intro/components/intro.tsx +0 -964
- package/features/intro/intro-voice.ts +0 -174
- package/features/memory/components/memory-edit.tsx +0 -333
- package/features/memory/components/memory-mark.tsx +0 -4
- package/features/memory/components/memory-setting.tsx +0 -662
- package/features/memory/memory.action.ts +0 -75
- package/features/memory/memory.edit.ts +0 -79
- package/features/memory/memory.query.ts +0 -513
- package/features/memory/memory.schema.ts +0 -196
- package/features/reach/channel.ts +0 -127
- package/features/reach/chat-text.ts +0 -364
- package/features/reach/components/reach-ask.tsx +0 -94
- package/features/reach/components/reach-badge.tsx +0 -22
- package/features/reach/components/reach-guide.tsx +0 -777
- package/features/reach/discord.ts +0 -308
- package/features/reach/pictures.ts +0 -88
- package/features/reach/reach.action.ts +0 -30
- package/features/reach/reach.schema.ts +0 -80
- package/features/reach/reach.ts +0 -946
- package/features/reach/slack.ts +0 -319
- package/features/reach/socket.ts +0 -63
- package/features/reach/telegram.ts +0 -323
- package/features/routine/components/routine-mark.tsx +0 -7
- package/features/routine/components/routine-setting.tsx +0 -1078
- package/features/routine/routine.action.ts +0 -31
- package/features/routine/routine.clock.ts +0 -102
- package/features/routine/routine.query.ts +0 -207
- package/features/routine/routine.schema.ts +0 -157
- package/features/settings/components/install-app.tsx +0 -153
- package/features/settings/components/setting-ui.tsx +0 -482
- package/features/settings/components/settings.tsx +0 -464
- package/features/settings/settings.alert.ts +0 -42
- package/features/settings/settings.store.ts +0 -44
- package/features/signins/components/signin-ask.tsx +0 -51
- package/features/signins/components/signins-setting.tsx +0 -261
- package/features/signins/signins.action.ts +0 -22
- package/features/signins/signins.query.ts +0 -261
- package/features/signins/signins.schema.ts +0 -26
- package/features/skills/components/skills-mark.tsx +0 -4
- package/features/skills/components/skills-setting.tsx +0 -736
- package/features/skills/skills.action.ts +0 -118
- package/features/skills/skills.discover.ts +0 -146
- package/features/skills/skills.query.ts +0 -363
- package/features/skills/skills.schema.ts +0 -105
- package/features/thursday/ascii.const.ts +0 -218
- package/features/thursday/call-signal.ts +0 -41
- package/features/thursday/components/ascii-orb.tsx +0 -1523
- package/features/thursday/components/boot.tsx +0 -24
- package/features/thursday/components/call-log.tsx +0 -503
- package/features/thursday/components/caption-words.tsx +0 -117
- package/features/thursday/components/connect-wave.tsx +0 -266
- package/features/thursday/components/face.tsx +0 -137
- package/features/thursday/components/side-captions.tsx +0 -347
- package/features/thursday/components/tab-state.tsx +0 -108
- package/features/thursday/components/thursday-mark.tsx +0 -168
- package/features/thursday/components/thursday-setting.tsx +0 -1084
- package/features/thursday/components/thursday.tsx +0 -1823
- package/features/thursday/components/voice-picker.tsx +0 -254
- package/features/thursday/components/write-line.tsx +0 -714
- package/features/thursday/expressions.ts +0 -1278
- package/features/thursday/eyes.ts +0 -274
- package/features/thursday/face-words.ts +0 -44
- package/features/thursday/face.const.ts +0 -6
- package/features/thursday/face.store.ts +0 -62
- package/features/thursday/field.ts +0 -93
- package/features/thursday/open-work.ts +0 -180
- package/features/thursday/screen-act.ts +0 -15
- package/features/thursday/silent-voice.ts +0 -14
- package/features/thursday/smoke.ts +0 -510
- package/features/thursday/thursday.action.ts +0 -266
- package/features/thursday/thursday.query.ts +0 -382
- package/features/thursday/thursday.schema.ts +0 -251
- package/features/thursday/thursday.store.ts +0 -129
- package/features/thursday/thursday.text.ts +0 -567
- package/features/thursday/tool-call.ts +0 -42
- package/features/thursday/tool-line.ts +0 -333
- package/features/thursday/use-call-ring.ts +0 -194
- package/features/thursday/use-live-settings.ts +0 -66
- package/features/thursday/use-text-call.ts +0 -551
- package/features/thursday/use-thursday.ts +0 -1231
- package/features/thursday/wash.ts +0 -116
- package/features/thursday/work-chip.tsx +0 -64
- package/features/workspace/components/artifact-view.tsx +0 -510
- package/features/workspace/components/file-thumb.tsx +0 -253
- package/features/workspace/components/file-view.tsx +0 -875
- package/features/workspace/components/given-files.tsx +0 -195
- package/features/workspace/components/workspace-mark.tsx +0 -4
- package/features/workspace/components/workspace-setting.tsx +0 -454
- package/features/workspace/file-kind.ts +0 -190
- package/features/workspace/workspace.action.ts +0 -88
- package/features/workspace/workspace.query.ts +0 -220
- package/features/workspace/workspace.schema.ts +0 -58
- package/features/workspace/workspace.ts +0 -553
- package/hooks/use-draft.ts +0 -38
- package/hooks/use-hotkey.ts +0 -171
- package/hooks/use-object-state.ts +0 -22
- package/hooks/use-on-visible.ts +0 -72
- package/hooks/use-theme.ts +0 -120
- package/hooks/use-wake-word.ts +0 -262
- package/knip.json +0 -7
- package/lib/date-like.ts +0 -37
- package/lib/desktop-notify.ts +0 -81
- package/lib/favicon.ts +0 -88
- package/lib/json-schema.ts +0 -42
- package/lib/live/live.schema.ts +0 -36
- package/lib/live/live.server.ts +0 -188
- package/lib/live/live.session.ts +0 -712
- package/lib/live/live.tap.ts +0 -288
- package/lib/live/live.transport.ts +0 -152
- package/lib/live/ring.ts +0 -62
- package/lib/logger.ts +0 -14
- package/lib/oauth-page.ts +0 -27
- package/lib/protocol/events.client.ts +0 -89
- package/lib/protocol/events.server.ts +0 -158
- package/lib/protocol/events.ts +0 -53
- package/lib/protocol/presence.ts +0 -65
- package/lib/protocol/result.ts +0 -63
- package/lib/protocol/server-action.ts +0 -13
- package/lib/protocol/server-route.ts +0 -20
- package/lib/protocol/to-result.ts +0 -46
- package/lib/protocol/use-server-action.ts +0 -105
- package/lib/protocol/use-server-pages.ts +0 -117
- package/lib/protocol/use-server-route.ts +0 -165
- package/lib/public-error.ts +0 -19
- package/lib/queue.ts +0 -79
- package/lib/reveal-path.ts +0 -46
- package/lib/sandbox.ts +0 -269
- package/lib/theme.ts +0 -9
- package/lib/tokens.ts +0 -35
- package/lib/utils.ts +0 -163
- package/release-please-config.json +0 -21
- package/scripts/artifact-paths.test.mts +0 -56
- package/scripts/bot-context.test.mts +0 -2122
- package/scripts/intro-voice.mts +0 -65
- package/scripts/live-history.test.mts +0 -115
- package/scripts/live-session.test.mts +0 -1286
- package/scripts/memory-tools.test.mts +0 -177
- package/scripts/page-edits.test.mts +0 -319
- package/scripts/reach-channels.test.mts +0 -524
- package/scripts/skill-files.test.mts +0 -225
- package/scripts/text-call.test.mts +0 -540
- package/skills-lock.json +0 -23
- package/tsconfig.json +0 -44
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_buildManifest.js +0 -0
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_ssgManifest.js +0 -0
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useEffect, useRef, useState } from "react";
|
|
4
|
-
import { cn } from "@/lib/utils";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* What the pill's write button becomes while the line it opens is up: smoke in a glass, carried
|
|
8
|
-
* left to right. It keeps the button's box, so the pill is the same width either way.
|
|
9
|
-
*
|
|
10
|
-
* Drawn to frames the user brought, and measured off them rather than guessed:
|
|
11
|
-
* · one hue throughout — the blue channel never leaves 247..254 while red and green run
|
|
12
|
-
* 110..252 — so every pixel is that blue with some amount of white in it;
|
|
13
|
-
* · the picture is mostly PALE: median red 219, only a tenth under 145. One soft dark mass and
|
|
14
|
-
* three quarters of it light; half and half reads as a wave;
|
|
15
|
-
* · the ramps between are long, and a long ramp is a wide window over a big slow field;
|
|
16
|
-
* · a row across the middle is nearly flat and a column is not, so the smoke lies in banks
|
|
17
|
-
* stretched sideways;
|
|
18
|
-
* · the edge lands in two pixels, so the circle is cut, not faded — which the button's own
|
|
19
|
-
* `rounded-full overflow-hidden` does, at the screen's resolution rather than the buffer's.
|
|
20
|
-
*
|
|
21
|
-
* Four things were tried and are wrong, kept here so they are not tried again: one field sliding
|
|
22
|
-
* past reads as a camera moving over something standing still; crossfading two phases of one
|
|
23
|
-
* field reads as growing and shrinking in place; a twist strongest in the middle draws a taegeuk;
|
|
24
|
-
* and a scale under about 0.5 puts the whole disc inside one cell of noise, where it brightens
|
|
25
|
-
* and darkens as one lump instead of having weather in it.
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The one hue, deepest first: three smoke tones between the ink and the paper. The steps are
|
|
30
|
-
* walked from the app's own blue (`--brand` #0169cc) at the distances read off the frames, so
|
|
31
|
-
* the smoke is the app's colour and only the hue differs from what was measured.
|
|
32
|
-
*/
|
|
33
|
-
const STOPS: [number, [number, number, number]][] = [
|
|
34
|
-
[0.0, [21, 117, 208]],
|
|
35
|
-
[0.4, [90, 157, 222]],
|
|
36
|
-
[0.75, [179, 210, 239]],
|
|
37
|
-
[1.0, [252, 252, 254]],
|
|
38
|
-
];
|
|
39
|
-
const INK = STOPS[0][1];
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* The sheets, coarsest first. Each is the same cloud at a different size, carried at its own
|
|
43
|
-
* pace, every one stretched sideways (`wide` under `tall`) because that is how the frames lie.
|
|
44
|
-
* `gust*` is how much a gust pulls that sheet about; only the big one feels it. The last belongs
|
|
45
|
-
* to none of the others and pushes both ways — white where it is thick, indigo where it is thin —
|
|
46
|
-
* which is where the irregularity comes from.
|
|
47
|
-
*/
|
|
48
|
-
const SHEETS = [
|
|
49
|
-
{
|
|
50
|
-
pace: 0.075,
|
|
51
|
-
wide: 0.75,
|
|
52
|
-
tall: 1.15,
|
|
53
|
-
seed: 3.1,
|
|
54
|
-
gustWide: 0.4,
|
|
55
|
-
gustTall: 0.2,
|
|
56
|
-
sky: 1,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
pace: 0.16,
|
|
60
|
-
wide: 1.3,
|
|
61
|
-
tall: 2.2,
|
|
62
|
-
seed: 11.7,
|
|
63
|
-
gustWide: 0,
|
|
64
|
-
gustTall: 0,
|
|
65
|
-
sky: 1,
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
pace: 0.3,
|
|
69
|
-
wide: 2.4,
|
|
70
|
-
tall: 4.0,
|
|
71
|
-
seed: 19.3,
|
|
72
|
-
gustWide: 0,
|
|
73
|
-
gustTall: 0,
|
|
74
|
-
sky: 1,
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
pace: 0.21,
|
|
78
|
-
wide: 1.65,
|
|
79
|
-
tall: 2.9,
|
|
80
|
-
seed: 27.7,
|
|
81
|
-
gustWide: 0,
|
|
82
|
-
gustTall: 0,
|
|
83
|
-
sky: 1.3,
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Pixels across the buffer. The button is 28px, and smoke has no edge to lose, so the browser
|
|
89
|
-
* scales this up rather than the paint running at device resolution: about half a millisecond a
|
|
90
|
-
* frame, which at 30fps is a sixtieth of one core.
|
|
91
|
-
*/
|
|
92
|
-
const BUFFER = 48;
|
|
93
|
-
|
|
94
|
-
/*
|
|
95
|
-
* It arrives and goes by fading, and by nothing else (the user's pick). Four other ways in were
|
|
96
|
-
* built and turned down: smoke rising from the floor, a puff opening out of the middle, and a
|
|
97
|
-
* sweep blowing in with the wind all draw the round shape at some single moment, which reads as
|
|
98
|
-
* canned; and letting smoke escape past the rim, which at this size has three pixels to escape
|
|
99
|
-
* into — too few to read as anything, enough to lose the shape.
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
/** Thirty a second is enough for weather, and leaves the rest of the frame to the call. */
|
|
103
|
-
const FRAME_MS = 33;
|
|
104
|
-
|
|
105
|
-
/** How long it takes to fade in, and out again. */
|
|
106
|
-
const FADE_MS = 200;
|
|
107
|
-
|
|
108
|
-
const clamp = (value: number, low: number, high: number) =>
|
|
109
|
-
value < low ? low : value > high ? high : value;
|
|
110
|
-
const ease = (t: number) => t * t * (3 - 2 * t);
|
|
111
|
-
const fade = (edge0: number, edge1: number, x: number) =>
|
|
112
|
-
ease(clamp((x - edge0) / (edge1 - edge0), 0, 1));
|
|
113
|
-
|
|
114
|
-
const hash = (x: number, y: number) => {
|
|
115
|
-
let n = (x * 374761393 + y * 668265263) | 0;
|
|
116
|
-
n = (n ^ (n >>> 13)) * 1274126177;
|
|
117
|
-
return ((n ^ (n >>> 16)) >>> 0) / 4294967295;
|
|
118
|
-
};
|
|
119
|
-
const noise = (x: number, y: number) => {
|
|
120
|
-
const xi = Math.floor(x);
|
|
121
|
-
const yi = Math.floor(y);
|
|
122
|
-
const u = ease(x - xi);
|
|
123
|
-
const v = ease(y - yi);
|
|
124
|
-
const a = hash(xi, yi);
|
|
125
|
-
const b = hash(xi + 1, yi);
|
|
126
|
-
const c = hash(xi, yi + 1);
|
|
127
|
-
const d = hash(xi + 1, yi + 1);
|
|
128
|
-
return (a * (1 - u) + b * u) * (1 - v) + (c * (1 - u) + d * u) * v;
|
|
129
|
-
};
|
|
130
|
-
/** Two octaves and no more: a third is grain, and grain is what makes it look like marble. */
|
|
131
|
-
const cloud = (x: number, y: number, seed: number) =>
|
|
132
|
-
noise(x + seed, y + seed * 0.7) * 0.74 +
|
|
133
|
-
noise(x * 2.2 + seed, y * 2.2 + seed * 1.3) * 0.26;
|
|
134
|
-
|
|
135
|
-
/** The colour at one amount of light, along the measured ramp. */
|
|
136
|
-
function tone(level: number, out: [number, number, number]) {
|
|
137
|
-
const t = clamp(level, 0, 1);
|
|
138
|
-
let at = 1;
|
|
139
|
-
while (at < STOPS.length - 1 && t > STOPS[at][0]) at += 1;
|
|
140
|
-
const [t0, from] = STOPS[at - 1];
|
|
141
|
-
const [t1, to] = STOPS[at];
|
|
142
|
-
const part = (t - t0) / (t1 - t0);
|
|
143
|
-
out[0] = from[0] + (to[0] - from[0]) * part;
|
|
144
|
-
out[1] = from[1] + (to[1] - from[1]) * part;
|
|
145
|
-
out[2] = from[2] + (to[2] - from[2]) * part;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* `on` is the line being up. The orb outlives it by `FADE_MS` so it has time to draw back into
|
|
150
|
-
* the button rather than vanishing: a swap with no going-away is what made `/` read as a cut.
|
|
151
|
-
*/
|
|
152
|
-
export function WriteOrb({
|
|
153
|
-
on,
|
|
154
|
-
className,
|
|
155
|
-
}: {
|
|
156
|
-
on: boolean;
|
|
157
|
-
className?: string;
|
|
158
|
-
}) {
|
|
159
|
-
const held = useRef<HTMLCanvasElement>(null);
|
|
160
|
-
const [alive, setAlive] = useState(on);
|
|
161
|
-
|
|
162
|
-
// `alive` is whether it is in the tree, `shown` whether it has faded up. Two of them because a
|
|
163
|
-
// transition needs a frame at nothing before it can run to something, and because it has to
|
|
164
|
-
// stay in the tree long enough to fade out again.
|
|
165
|
-
const [shown, setShown] = useState(false);
|
|
166
|
-
useEffect(() => {
|
|
167
|
-
if (on) {
|
|
168
|
-
setAlive(true);
|
|
169
|
-
const up = requestAnimationFrame(() => setShown(true));
|
|
170
|
-
return () => cancelAnimationFrame(up);
|
|
171
|
-
}
|
|
172
|
-
setShown(false);
|
|
173
|
-
const leaving = setTimeout(() => setAlive(false), FADE_MS);
|
|
174
|
-
return () => clearTimeout(leaving);
|
|
175
|
-
}, [on]);
|
|
176
|
-
|
|
177
|
-
useEffect(() => {
|
|
178
|
-
const canvas = held.current;
|
|
179
|
-
const context = canvas?.getContext("2d");
|
|
180
|
-
if (!canvas || !context) return;
|
|
181
|
-
canvas.width = BUFFER;
|
|
182
|
-
canvas.height = BUFFER;
|
|
183
|
-
const image = context.createImageData(BUFFER, BUFFER);
|
|
184
|
-
const pixels = image.data;
|
|
185
|
-
const colour: [number, number, number] = [0, 0, 0];
|
|
186
|
-
// Somewhere else in the weather and under a sky of its own every time, so it never opens on
|
|
187
|
-
// the same frame twice.
|
|
188
|
-
const born = Math.random() * 900;
|
|
189
|
-
const sky = Math.random() * 400;
|
|
190
|
-
|
|
191
|
-
const draw = (seconds: number) => {
|
|
192
|
-
const time = seconds + born;
|
|
193
|
-
// Carried one way only, left to right, at a pace that breathes. This is the integral of
|
|
194
|
-
// that pace, so it speeds up and slows down but never slides back where it came from.
|
|
195
|
-
const flow = time + 1.7 * Math.sin(time * 0.33);
|
|
196
|
-
// The wind comes in gusts, on two beats that do not divide into each other.
|
|
197
|
-
const blow =
|
|
198
|
-
(0.5 + 0.5 * Math.sin(time * 0.27)) ** 2 * 0.72 +
|
|
199
|
-
(0.5 + 0.5 * Math.sin(time * 0.41 + 2.1)) ** 3 * 0.28;
|
|
200
|
-
const lift = Math.sin(time * 0.19) * 0.1;
|
|
201
|
-
const carried = SHEETS.map((sheet) => ({
|
|
202
|
-
seed: sheet.seed,
|
|
203
|
-
shift: flow * sheet.pace,
|
|
204
|
-
wide: sheet.wide * (1 - sheet.gustWide * blow),
|
|
205
|
-
tall: sheet.tall * (1 + sheet.gustTall * blow),
|
|
206
|
-
sky: sky * sheet.sky,
|
|
207
|
-
}));
|
|
208
|
-
|
|
209
|
-
let p = 0;
|
|
210
|
-
for (let py = 0; py < BUFFER; py += 1) {
|
|
211
|
-
const ny = ((py + 0.5) / BUFFER) * 2 - 1;
|
|
212
|
-
for (let px = 0; px < BUFFER; px += 1, p += 4) {
|
|
213
|
-
const nx = ((px + 0.5) / BUFFER) * 2 - 1;
|
|
214
|
-
|
|
215
|
-
// A deep slow warp under the lot, so no sheet lies in flat strata.
|
|
216
|
-
const wx = noise(nx * 0.55 + time * 0.03, ny * 0.55 + sky) - 0.5;
|
|
217
|
-
const wy =
|
|
218
|
-
noise(nx * 0.55 + 9.1 + sky, ny * 0.55 - time * 0.024) - 0.5;
|
|
219
|
-
const qx = nx + wx * 1.15;
|
|
220
|
-
const qy = ny + wy * 1.0 + lift;
|
|
221
|
-
|
|
222
|
-
const [mass, bank, wisp, spare] = carried.map((sheet) =>
|
|
223
|
-
cloud(
|
|
224
|
-
(qx - sheet.shift) * sheet.wide + sheet.sky,
|
|
225
|
-
qy * sheet.tall,
|
|
226
|
-
sheet.seed,
|
|
227
|
-
),
|
|
228
|
-
);
|
|
229
|
-
|
|
230
|
-
// Mostly pale, with one soft dark mass in it — the frames' own proportions.
|
|
231
|
-
let dark = clamp((0.52 - mass) / 0.34, 0, 1);
|
|
232
|
-
dark *= 0.7 + 0.6 * clamp((0.56 - bank) / 0.4, 0, 1);
|
|
233
|
-
dark = clamp(dark + (0.5 - wisp) * 0.42, 0, 1);
|
|
234
|
-
let level =
|
|
235
|
-
0.97 -
|
|
236
|
-
0.92 * dark ** 1.2 -
|
|
237
|
-
clamp((0.5 - wisp) / 0.6, 0, 1) * 0.1 +
|
|
238
|
-
(spare - 0.5) * 0.38;
|
|
239
|
-
|
|
240
|
-
// What is on the ball rather than in the smoke: a light standing off the upper left,
|
|
241
|
-
// and the one bounce a glass ball catches along its lower rim.
|
|
242
|
-
const radius = Math.sqrt(nx * nx + ny * ny);
|
|
243
|
-
level +=
|
|
244
|
-
clamp(1 - Math.hypot(nx + 0.42, ny + 0.48) / 1.5, 0, 1) * 0.16;
|
|
245
|
-
level +=
|
|
246
|
-
fade(0.84, 1.0, radius) *
|
|
247
|
-
clamp(0.15 + 0.85 * (ny * 0.8 + nx * 0.45), 0, 1) *
|
|
248
|
-
0.45;
|
|
249
|
-
|
|
250
|
-
tone(level, colour);
|
|
251
|
-
|
|
252
|
-
// Not a rim: the whole disc leaning into the ink as it goes out, which reads as a ball
|
|
253
|
-
// where a band reads as a border drawn round it.
|
|
254
|
-
const round = clamp(radius, 0, 1) ** 2.4 * 0.26;
|
|
255
|
-
pixels[p] = colour[0] + (INK[0] - colour[0]) * round;
|
|
256
|
-
pixels[p + 1] = colour[1] + (INK[1] - colour[1]) * round;
|
|
257
|
-
pixels[p + 2] = colour[2] + (INK[2] - colour[2]) * round;
|
|
258
|
-
// The circle is cut here rather than left to the button's `overflow-hidden`, which
|
|
259
|
-
// does not reach a canvas of its own layer.
|
|
260
|
-
pixels[p + 3] = 255 * (1 - fade(0.94, 1.0, radius));
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
context.putImageData(image, 0, 0);
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
const started = performance.now();
|
|
267
|
-
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
|
268
|
-
draw(6);
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
let frame = 0;
|
|
272
|
-
let last = 0;
|
|
273
|
-
const tick = (now: number) => {
|
|
274
|
-
frame = requestAnimationFrame(tick);
|
|
275
|
-
if (now - last < FRAME_MS) return;
|
|
276
|
-
last = now;
|
|
277
|
-
draw((now - started) / 1000);
|
|
278
|
-
};
|
|
279
|
-
frame = requestAnimationFrame(tick);
|
|
280
|
-
return () => cancelAnimationFrame(frame);
|
|
281
|
-
}, [alive]);
|
|
282
|
-
|
|
283
|
-
if (!alive) return null;
|
|
284
|
-
|
|
285
|
-
return (
|
|
286
|
-
<canvas
|
|
287
|
-
ref={held}
|
|
288
|
-
aria-hidden
|
|
289
|
-
className={cn(
|
|
290
|
-
"pointer-events-none absolute inset-0 size-full transition-opacity",
|
|
291
|
-
shown ? "opacity-100" : "opacity-0",
|
|
292
|
-
className,
|
|
293
|
-
)}
|
|
294
|
-
// The fade and the timer that takes the canvas away after it are one length
|
|
295
|
-
style={{ transitionDuration: `${FADE_MS}ms` }}
|
|
296
|
-
/>
|
|
297
|
-
);
|
|
298
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vocabulary a mark is drawn from. Lives outside the renderer (a client
|
|
3
|
-
* component) so the zod schema and the settings screen can read it on the server.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/** Every silhouette a mark can draw. */
|
|
7
|
-
export const MARK_SHAPES = ["blob", "poly", "squircle", "heart"] as const;
|
|
8
|
-
|
|
9
|
-
export type MarkShape = (typeof MARK_SHAPES)[number];
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Follows the theme's text colour. Distinct from no colour at all: an unset
|
|
13
|
-
* colour means nobody chose. BotMark draws both in currentColor; only the
|
|
14
|
-
* picker tells them apart.
|
|
15
|
-
*/
|
|
16
|
-
export const MARK_SYSTEM = "currentColor";
|
|
17
|
-
|
|
18
|
-
const MARK_COLORS = [
|
|
19
|
-
{ id: "system", label: "System", value: MARK_SYSTEM },
|
|
20
|
-
{ id: "slate", label: "Slate", value: "#64748B" },
|
|
21
|
-
{ id: "indigo", label: "Indigo", value: "#6366F1" },
|
|
22
|
-
{ id: "blue", label: "Blue", value: "#3B82F6" },
|
|
23
|
-
{ id: "cyan", label: "Cyan", value: "#06B6D4" },
|
|
24
|
-
{ id: "teal", label: "Teal", value: "#14B8A6" },
|
|
25
|
-
{ id: "green", label: "Green", value: "#22C55E" },
|
|
26
|
-
{ id: "lime", label: "Lime", value: "#84CC16" },
|
|
27
|
-
{ id: "amber", label: "Amber", value: "#F59E0B" },
|
|
28
|
-
{ id: "orange", label: "Orange", value: "#F97316" },
|
|
29
|
-
{ id: "red", label: "Red", value: "#EF4444" },
|
|
30
|
-
{ id: "pink", label: "Pink", value: "#EC4899" },
|
|
31
|
-
{ id: "violet", label: "Violet", value: "#8B5CF6" },
|
|
32
|
-
{ id: "fuchsia", label: "Fuchsia", value: "#D946EF" },
|
|
33
|
-
{ id: "rose", label: "Rose", value: "#F43F5E" },
|
|
34
|
-
{ id: "sky", label: "Sky", value: "#0EA5E9" },
|
|
35
|
-
{ id: "emerald", label: "Emerald", value: "#10B981" },
|
|
36
|
-
{ id: "yellow", label: "Yellow", value: "#EAB308" },
|
|
37
|
-
{ id: "stone", label: "Stone", value: "#78716C" },
|
|
38
|
-
// No darker neutrals: black is the theme dot, and a dark grey sinks into a dark theme.
|
|
39
|
-
] as const satisfies readonly {
|
|
40
|
-
id: string;
|
|
41
|
-
label: string;
|
|
42
|
-
value: string;
|
|
43
|
-
}[];
|
|
44
|
-
|
|
45
|
-
type MarkColor = (typeof MARK_COLORS)[number];
|
|
46
|
-
|
|
47
|
-
/** Colour by name, so code that names one (the status inks below) stays inside the palette. */
|
|
48
|
-
const MARK_INK = Object.fromEntries(
|
|
49
|
-
MARK_COLORS.map((color) => [color.id, color.value]),
|
|
50
|
-
) as Record<MarkColor["id"], string>;
|
|
51
|
-
|
|
52
|
-
/** Every preset that is an actual colour (no "system"), for swatch pickers and random picks. */
|
|
53
|
-
export const MARK_PALETTE: string[] = MARK_COLORS.filter(
|
|
54
|
-
(color) => color.value !== MARK_SYSTEM,
|
|
55
|
-
).map((color) => color.value);
|
|
56
|
-
|
|
57
|
-
/** The app's two status colours. A face wearing one reads as a state it is not in, so no roll lands on them. */
|
|
58
|
-
const STATUS_INK: string[] = [MARK_INK.amber, MARK_INK.red];
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* What a colour is drawn as on a white page. Nine of the eighteen are too light
|
|
62
|
-
* to read there — a yellow face on paper is 1.9:1 against a 3:1 floor for a
|
|
63
|
-
* shape — so each has a twin at the same hue and chroma, lightness lowered
|
|
64
|
-
* until it clears 3.2:1. The dark theme keeps the colour as it is, where all
|
|
65
|
-
* eighteen already pass. The stored value never changes: the picker, the name
|
|
66
|
-
* the user chose and the roll all stay on the original.
|
|
67
|
-
*/
|
|
68
|
-
const ON_PAPER: Record<string, string> = {
|
|
69
|
-
[MARK_INK.cyan]: "#009dbb",
|
|
70
|
-
[MARK_INK.teal]: "#00a190",
|
|
71
|
-
[MARK_INK.green]: "#00a640",
|
|
72
|
-
[MARK_INK.lime]: "#5ca100",
|
|
73
|
-
[MARK_INK.amber]: "#d07b00",
|
|
74
|
-
[MARK_INK.orange]: "#ec6700",
|
|
75
|
-
[MARK_INK.sky]: "#0098dc",
|
|
76
|
-
[MARK_INK.emerald]: "#00a46d",
|
|
77
|
-
[MARK_INK.yellow]: "#bb8600",
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
/** The colour as this theme should draw it. Anything not in the table is itself. */
|
|
81
|
-
export const markInk = (color: string, dark: boolean): string =>
|
|
82
|
-
dark ? color : (ON_PAPER[color] ?? color);
|
|
83
|
-
|
|
84
|
-
/** How the renderer lays a paint's colours out. */
|
|
85
|
-
export type MarkPaintLook = "flow" | "duo" | "aurora";
|
|
86
|
-
|
|
87
|
-
const hues = (list: number[], lightness: number, chroma: number) =>
|
|
88
|
-
list.map((hue) => `oklch(${lightness} ${chroma} ${hue})`);
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Paints a body can wear in place of its colour. Each names its colours once, for
|
|
92
|
-
* the renderer and for the swatch that picks it. Aurora lists its night first
|
|
93
|
-
* (two colours), then one light per curtain.
|
|
94
|
-
*/
|
|
95
|
-
export const MARK_PAINTS = {
|
|
96
|
-
rainbow: {
|
|
97
|
-
label: "Rainbow",
|
|
98
|
-
look: "flow",
|
|
99
|
-
colors: hues([0, 45, 90, 140, 190, 240, 290, 330, 360], 0.77, 0.16),
|
|
100
|
-
},
|
|
101
|
-
duo: { label: "Duo", look: "duo", colors: ["#818CF8", "#F472B6"] },
|
|
102
|
-
aurora: {
|
|
103
|
-
label: "Aurora",
|
|
104
|
-
look: "aurora",
|
|
105
|
-
edge: "dark",
|
|
106
|
-
colors: ["#1a2f73", "#2c56c9", "#34d399", "#22d3ee", "#a7f3d0"],
|
|
107
|
-
},
|
|
108
|
-
"aurora-pink": {
|
|
109
|
-
label: "Pink aurora",
|
|
110
|
-
look: "aurora",
|
|
111
|
-
edge: "dark",
|
|
112
|
-
colors: ["#3a1478", "#7c3aed", "#f472b6", "#e879f9", "#fbcfe8"],
|
|
113
|
-
},
|
|
114
|
-
} satisfies Record<
|
|
115
|
-
string,
|
|
116
|
-
{
|
|
117
|
-
label: string;
|
|
118
|
-
look: MarkPaintLook;
|
|
119
|
-
colors: string[];
|
|
120
|
-
/** A dark body: the mark draws its eyes, which as holes would show the dark page it sinks into. */
|
|
121
|
-
edge?: "dark";
|
|
122
|
-
}
|
|
123
|
-
>;
|
|
124
|
-
|
|
125
|
-
export type MarkPaint = keyof typeof MARK_PAINTS;
|
|
126
|
-
|
|
127
|
-
export type MarkPaintSpec = (typeof MARK_PAINTS)[MarkPaint];
|
|
128
|
-
|
|
129
|
-
export const MARK_PAINT_IDS = Object.keys(MARK_PAINTS) as [
|
|
130
|
-
MarkPaint,
|
|
131
|
-
...MarkPaint[],
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
/** What a body wears: one palette colour, or one of MARK_PAINTS in its place. */
|
|
135
|
-
type MarkFill = { color: string } | { paint: MarkPaint };
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* `count` distinct fills in random order. Colours and paints come out of one
|
|
139
|
-
* pool, so a paint is rolled as often as its share of the vocabulary; a face
|
|
140
|
-
* nobody drew wears the same range as one somebody picked. Fewer than asked when
|
|
141
|
-
* the pool runs out.
|
|
142
|
-
*/
|
|
143
|
-
export function randomMarkFills(count: number): MarkFill[] {
|
|
144
|
-
const pool: MarkFill[] = [
|
|
145
|
-
...MARK_PALETTE.filter((color) => !STATUS_INK.includes(color)).map(
|
|
146
|
-
(color) => ({ color }),
|
|
147
|
-
),
|
|
148
|
-
...MARK_PAINT_IDS.map((paint) => ({ paint })),
|
|
149
|
-
];
|
|
150
|
-
for (let at = pool.length - 1; at > 0; at--) {
|
|
151
|
-
const swap = Math.floor(Math.random() * (at + 1));
|
|
152
|
-
[pool[at], pool[swap]] = [pool[swap], pool[at]];
|
|
153
|
-
}
|
|
154
|
-
return pool.slice(0, count);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** A paint as a still CSS background, for the swatch that picks it. */
|
|
158
|
-
export function paintSwatch(paint: MarkPaint): string {
|
|
159
|
-
const { look, colors } = MARK_PAINTS[paint];
|
|
160
|
-
if (look === "aurora") {
|
|
161
|
-
return `radial-gradient(circle at 35% 30%, ${colors[2]}, transparent 70%), linear-gradient(180deg, ${colors[0]}, ${colors[1]})`;
|
|
162
|
-
}
|
|
163
|
-
return `linear-gradient(135deg, ${colors.join(", ")})`;
|
|
164
|
-
}
|