diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 2be6018e..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index b2a40816..2261b2aa 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,10 @@ Thumbs.db # IDE .vscode -.idea \ No newline at end of file +.idea + +# Astro build cache +.astro + +# Obsidian vault config +.obsidian \ No newline at end of file diff --git a/astro-site/.astro/collections/work.schema.json b/astro-site/.astro/collections/work.schema.json deleted file mode 100644 index 9cfc1420..00000000 --- a/astro-site/.astro/collections/work.schema.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "image": { - "type": "string" - }, - "year": { - "type": "string" - }, - "company": { - "type": "string" - }, - "status": { - "default": "published", - "type": "string", - "enum": [ - "draft", - "published" - ] - }, - "$schema": { - "type": "string" - } - }, - "required": [ - "title", - "description", - "year" - ] -} \ No newline at end of file diff --git a/astro-site/.astro/collections/writing.schema.json b/astro-site/.astro/collections/writing.schema.json deleted file mode 100644 index 84d13067..00000000 --- a/astro-site/.astro/collections/writing.schema.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "date": { - "type": "string", - "format": "date-time" - }, - "image": { - "type": "string" - }, - "url": { - "type": "string" - }, - "status": { - "default": "published", - "type": "string", - "enum": [ - "draft", - "published" - ] - }, - "$schema": { - "type": "string" - } - }, - "required": [ - "title", - "description", - "date" - ] -} \ No newline at end of file diff --git a/astro-site/.astro/content-assets.mjs b/astro-site/.astro/content-assets.mjs deleted file mode 100644 index 16137356..00000000 --- a/astro-site/.astro/content-assets.mjs +++ /dev/null @@ -1,73 +0,0 @@ - -import __ASTRO_IMAGE_IMPORT_Z1AyhWV from "./4IiQQOEdmqPcCsjTqlta-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-in-tech-2024%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_JitFy from "./QRIS-gobiz.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2g9ce from "./akar.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Zn0Wwm from "./asana.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1Rx8Co from "./chatgpt-final.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Zc35bV from "./chatgpt-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1c50EV from "./claude-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_nLFJ5 from "./competitors.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2bA4yw from "./copy-doc.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZTIp58 from "./copy-sheets.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2gJYQo from "./design-keliling.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhiring%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZxH163 from "./dogfooding.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_pTGt3 from "./git25.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z8IC1H from "./gpt55.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2dP0WI from "./grindsize.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2wl5XB from "./how-i-build.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2bsoUx from "./jivalite.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fjiva-lite%2Findex.mdx"; -import __ASTRO_IMAGE_IMPORT_Z1p4q1D from "./lookback-design-tools-1.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2mwJGO from "./lookback-design-tools-2.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z181dEH from "./lookback-design-tools-3.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z25txkS from "./lookback-design-tools-4.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_22fgMR from "./lookback-design-tools-5.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Zzn5g5 from "./plugin-workflow.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z17WuoU from "./plugin.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_jzjgC from "./practo-pro.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fpracto-pro%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_17I6uK from "./practo-profile.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fclaim-profile%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z14usCA from "./process-1.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fprocess%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1Yqs2V from "./product-designer-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1zlJut from "./product-designer-2.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZOhPlD from "./rip-design-process.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Zxxblt from "./sjhome.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fsahabat-jiva-redesign%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2sVTyP from "./solo-designer-jobs-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fsolo-designer%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2bDri5 from "./sonnet46.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ogiEj from "./squiggle-labels-outline.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1CNLo3 from "./thai-header.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_jN1fQ from "./thai-research.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZGo3f5 from "./user-behaviour.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZVag2n from "./variant.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_20sBpP from "./viet.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_1KmdLN from "./viz-c1.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_fhgBY from "./vizc-4.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_22txty from "./whiteboard.JPG?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhiring-2%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_8cp2I from "./whiteboard.JPG?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fsecret-sauce%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1gJ4cL from "./zoom.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Frituals%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2obKnP from "67.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2jJ5Ao from "Design_Sprints.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_4i5Y1 from "Early-explorations.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1bqxmS from "GoBiz-ratings.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_1bfU05 from "Gobiz-web.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_FxCr from "Gobiz-web3.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_15X722 from "QRIS-gobiz.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZYRBrj from "akar-screens.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_9bdU7 from "budgie.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_dLojj from "color.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_9aYqu from "design-system-philosophy.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1OS06e from "gobiz-nav.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ilaDG from "gobiz-order.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2tXh3t from "gobiz-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z1BXNHp from "how-to-tokens.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_5v2l1 from "jivalite-ground.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_23hBfS from "midtrans-old.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_1887Yy from "midtrans-onboarding-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_196JQK from "midtrans-onboarding-2.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Ft3Cm from "midtrans-onboarding-impact.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_1Se92b from "naming.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_2pD41U from "rough-sketches.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z4LDMj from "spots.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_Z2wmyeK from "styleguide.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_CljXE from "type.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md"; -import __ASTRO_IMAGE_IMPORT_ZSEHB from "v1-prototype.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md"; -export default new Map([["./4IiQQOEdmqPcCsjTqlta-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-in-tech-2024%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1AyhWV], ["./QRIS-gobiz.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_JitFy], ["./akar.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2g9ce], ["./asana.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_Zn0Wwm], ["./chatgpt-final.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1Rx8Co], ["./chatgpt-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_Zc35bV], ["./claude-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1c50EV], ["./competitors.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_nLFJ5], ["./copy-doc.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2bA4yw], ["./copy-sheets.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_ZTIp58], ["./design-keliling.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhiring%2Findex.md", __ASTRO_IMAGE_IMPORT_2gJYQo], ["./dogfooding.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_ZxH163], ["./git25.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_pTGt3], ["./gpt55.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_Z8IC1H], ["./grindsize.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md", __ASTRO_IMAGE_IMPORT_2dP0WI], ["./how-i-build.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2wl5XB], ["./jivalite.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fjiva-lite%2Findex.mdx", __ASTRO_IMAGE_IMPORT_2bsoUx], ["./lookback-design-tools-1.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1p4q1D], ["./lookback-design-tools-2.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2mwJGO], ["./lookback-design-tools-3.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md", __ASTRO_IMAGE_IMPORT_Z181dEH], ["./lookback-design-tools-4.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md", __ASTRO_IMAGE_IMPORT_Z25txkS], ["./lookback-design-tools-5.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdesign-tools-decade%2Findex.md", __ASTRO_IMAGE_IMPORT_22fgMR], ["./plugin-workflow.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_Zzn5g5], ["./plugin.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_Z17WuoU], ["./practo-pro.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fpracto-pro%2Findex.md", __ASTRO_IMAGE_IMPORT_jzjgC], ["./practo-profile.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fclaim-profile%2Findex.md", __ASTRO_IMAGE_IMPORT_17I6uK], ["./process-1.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fprocess%2Findex.md", __ASTRO_IMAGE_IMPORT_Z14usCA], ["./product-designer-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1Yqs2V], ["./product-designer-2.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1zlJut], ["./rip-design-process.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md", __ASTRO_IMAGE_IMPORT_ZOhPlD], ["./sjhome.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fsahabat-jiva-redesign%2Findex.md", __ASTRO_IMAGE_IMPORT_Zxxblt], ["./solo-designer-jobs-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fsolo-designer%2Findex.md", __ASTRO_IMAGE_IMPORT_2sVTyP], ["./sonnet46.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_2bDri5], ["./squiggle-labels-outline.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fproduct-designer%2Findex.md", __ASTRO_IMAGE_IMPORT_ogiEj], ["./thai-header.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1CNLo3], ["./thai-research.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_jN1fQ], ["./user-behaviour.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_ZGo3f5], ["./variant.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhow-i-build-with-ai%2Findex.md", __ASTRO_IMAGE_IMPORT_ZVag2n], ["./viet.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Finternational%2Findex.md", __ASTRO_IMAGE_IMPORT_20sBpP], ["./viz-c1.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_1KmdLN], ["./vizc-4.jpeg?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fdata-vizard%2Findex.md", __ASTRO_IMAGE_IMPORT_fhgBY], ["./whiteboard.JPG?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fhiring-2%2Findex.md", __ASTRO_IMAGE_IMPORT_22txty], ["./whiteboard.JPG?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fsecret-sauce%2Findex.md", __ASTRO_IMAGE_IMPORT_8cp2I], ["./zoom.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Frituals%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1gJ4cL], ["67.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_2obKnP], ["Design_Sprints.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2jJ5Ao], ["Early-explorations.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_4i5Y1], ["GoBiz-ratings.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1bqxmS], ["Gobiz-web.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_1bfU05], ["Gobiz-web3.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_FxCr], ["QRIS-gobiz.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_15X722], ["akar-screens.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_ZYRBrj], ["budgie.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_9bdU7], ["color.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_dLojj], ["design-system-philosophy.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_9aYqu], ["gobiz-nav.jpg?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1OS06e], ["gobiz-order.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_ilaDG], ["gobiz-v1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_2tXh3t], ["how-to-tokens.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_Z1BXNHp], ["jivalite-ground.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Flong-live-design-process%2Findex.md", __ASTRO_IMAGE_IMPORT_5v2l1], ["midtrans-old.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_23hBfS], ["midtrans-onboarding-1.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_1887Yy], ["midtrans-onboarding-2.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_196JQK], ["midtrans-onboarding-impact.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_Ft3Cm], ["naming.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_1Se92b], ["rough-sketches.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_2pD41U], ["spots.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fgojek%2Findex.md", __ASTRO_IMAGE_IMPORT_Z4LDMj], ["styleguide.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_Z2wmyeK], ["type.webp?astroContentImageFlag=&importer=src%2Fcontent%2Fwork%2Fakar-design-system%2Findex.md", __ASTRO_IMAGE_IMPORT_CljXE], ["v1-prototype.png?astroContentImageFlag=&importer=src%2Fcontent%2Fwriting%2Fvibe-coding%2Findex.md", __ASTRO_IMAGE_IMPORT_ZSEHB]]); - \ No newline at end of file diff --git a/astro-site/.astro/content-modules.mjs b/astro-site/.astro/content-modules.mjs deleted file mode 100644 index 57862e6d..00000000 --- a/astro-site/.astro/content-modules.mjs +++ /dev/null @@ -1,4 +0,0 @@ - -export default new Map([ -["src/content/work/jiva-lite/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fwork%2Fjiva-lite%2Findex.mdx&astroContentModuleFlag=true")]]); - \ No newline at end of file diff --git a/astro-site/.astro/content.d.ts b/astro-site/.astro/content.d.ts deleted file mode 100644 index a6630fbd..00000000 --- a/astro-site/.astro/content.d.ts +++ /dev/null @@ -1,182 +0,0 @@ -declare module 'astro:content' { - interface Render { - '.mdx': Promise<{ - Content: import('astro').MDXContent; - headings: import('astro').MarkdownHeading[]; - remarkPluginFrontmatter: Record; - components: import('astro').MDXInstance<{}>['components']; - }>; - } -} - -declare module 'astro:content' { - export interface RenderResult { - Content: import('astro/runtime/server/index.js').AstroComponentFactory; - headings: import('astro').MarkdownHeading[]; - remarkPluginFrontmatter: Record; - } - interface Render { - '.md': Promise; - } - - export interface RenderedContent { - html: string; - metadata?: { - imagePaths: Array; - [key: string]: unknown; - }; - } - - type Flatten = T extends { [K: string]: infer U } ? U : never; - - export type CollectionKey = keyof DataEntryMap; - export type CollectionEntry = Flatten; - - type AllValuesOf = T extends any ? T[keyof T] : never; - - export type ReferenceDataEntry< - C extends CollectionKey, - E extends keyof DataEntryMap[C] = string, - > = { - collection: C; - id: E; - }; - - export type ReferenceLiveEntry = { - collection: C; - id: string; - }; - - export function getCollection>( - collection: C, - filter?: (entry: CollectionEntry) => entry is E, - ): Promise; - export function getCollection( - collection: C, - filter?: (entry: CollectionEntry) => unknown, - ): Promise[]>; - - export function getLiveCollection( - collection: C, - filter?: LiveLoaderCollectionFilterType, - ): Promise< - import('astro').LiveDataCollectionResult, LiveLoaderErrorType> - >; - - export function getEntry< - C extends keyof DataEntryMap, - E extends keyof DataEntryMap[C] | (string & {}), - >( - entry: ReferenceDataEntry, - ): E extends keyof DataEntryMap[C] - ? Promise - : Promise | undefined>; - export function getEntry< - C extends keyof DataEntryMap, - E extends keyof DataEntryMap[C] | (string & {}), - >( - collection: C, - id: E, - ): E extends keyof DataEntryMap[C] - ? string extends keyof DataEntryMap[C] - ? Promise | undefined - : Promise - : Promise | undefined>; - export function getLiveEntry( - collection: C, - filter: string | LiveLoaderEntryFilterType, - ): Promise, LiveLoaderErrorType>>; - - /** Resolve an array of entry references from the same collection */ - export function getEntries( - entries: ReferenceDataEntry[], - ): Promise[]>; - - export function render( - entry: DataEntryMap[C][string], - ): Promise; - - export function reference< - C extends - | keyof DataEntryMap - // Allow generic `string` to avoid excessive type errors in the config - // if `dev` is not running to update as you edit. - // Invalid collection names will be caught at build time. - | (string & {}), - >( - collection: C, - ): import('astro/zod').ZodPipe< - import('astro/zod').ZodString, - import('astro/zod').ZodTransform< - C extends keyof DataEntryMap - ? { - collection: C; - id: string; - } - : never, - string - > - >; - - type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T; - type InferEntrySchema = import('astro/zod').infer< - ReturnTypeOrOriginal['schema']> - >; - type ExtractLoaderConfig = T extends { loader: infer L } ? L : never; - type InferLoaderSchema< - C extends keyof DataEntryMap, - L = ExtractLoaderConfig, - > = L extends { schema: import('astro/zod').ZodSchema } - ? import('astro/zod').infer - : any; - - type DataEntryMap = { - "work": Record; - rendered?: RenderedContent; - filePath?: string; -}>; -"writing": Record; - rendered?: RenderedContent; - filePath?: string; -}>; - - }; - - type ExtractLoaderTypes = T extends import('astro/loaders').LiveLoader< - infer TData, - infer TEntryFilter, - infer TCollectionFilter, - infer TError - > - ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError } - : { data: never; entryFilter: never; collectionFilter: never; error: never }; - type ExtractEntryFilterType = ExtractLoaderTypes['entryFilter']; - type ExtractCollectionFilterType = ExtractLoaderTypes['collectionFilter']; - type ExtractErrorType = ExtractLoaderTypes['error']; - type ExtractDataType = ExtractLoaderTypes['data']; - - type LiveLoaderDataType = - LiveContentConfig['collections'][C]['schema'] extends undefined - ? ExtractDataType - : import('astro/zod').infer< - Exclude - >; - type LiveLoaderEntryFilterType = - ExtractEntryFilterType; - type LiveLoaderCollectionFilterType = - ExtractCollectionFilterType; - type LiveLoaderErrorType = ExtractErrorType< - LiveContentConfig['collections'][C]['loader'] - >; - - export type ContentConfig = typeof import("../src/content.config.js"); - export type LiveContentConfig = never; -} diff --git a/astro-site/.astro/data-store.json b/astro-site/.astro/data-store.json deleted file mode 100644 index a1da6c80..00000000 --- a/astro-site/.astro/data-store.json +++ /dev/null @@ -1 +0,0 @@ -[["Map",1,2,9,10,391,392],"meta::meta",["Map",3,4,5,6,7,8],"astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"site\":\"https://kenneth.dsouza.im\",\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"dangerouslyProcessSVG\":false,\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"processor\":{\"name\":\"unified\",\"options\":{\"remarkPlugins\":[null],\"rehypePlugins\":[[null,{\"className\":\"image-figure\"}],null],\"remarkRehype\":{}}}},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"csp\":false,\"actionBodySizeLimit\":1048576,\"serverIslandBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"prerenderConflictBehavior\":\"warn\",\"experimental\":{\"advancedRouting\":false,\"clientPrerender\":false,\"contentIntellisense\":false,\"chromeDevtoolsWorkspace\":false,\"rustCompiler\":false,\"queuedRendering\":{\"enabled\":false}},\"legacy\":{\"collectionsBackwardsCompat\":false}}","astro-version","6.4.4","content-config-digest","a5ccd081338e13d4","work",["Map",11,12,91,92,125,126,164,165,244,245,276,277,321,322,334,335,363,364],"akar-design-system",{"id":11,"data":13,"body":20,"filePath":21,"assetImports":22,"digest":31,"rendered":32},{"title":14,"description":15,"image":16,"year":17,"company":18,"status":19},"Building the Akar Design System","The philosophy and design principles behind Jiva’s scalable design system","__ASTRO_IMAGE_./akar.webp","2023-2024","Jiva","published","Design systems often represent an aspirational milestone for product design teams. But they’re often seen as an all-or-nothing project — something that takes months of planning and effort, \nwhile day-to-day product delivery suffers. When everything is moving at breakneck speed, it feels risky to divert resources into building a design system. \n**But is it really?**\n\nIn early 2022, Jiva was deep in the throes of hyper-growth, onboarding new team members almost every week. The chaos hit every part of the company, and the design team wasn’t immune. \nWork was being duplicated across pods, our user experience was inconsistent, accessibility needs were being overlooked, and our app’s \nperformance was lagging behind.\nAt the time, we had a Figma-style guide, but it simply wasn’t enough. We needed more than a set of visual guidelines — we needed a \ncomprehensive design system that could help us keep up with the rapid growth without adding friction to the process. And yet, we faced a tough constraint: \nour design team was tiny (and growing), so we had to approach this in a _lean_ way.\n\n![A snapshot of our Figma Component Library Circa early 2022](styleguide.webp)\n\n\n## Role\nI led the effort on the design system and my responsibilities included managing with various stakeholders(product, engineering, qa), pitching ideas, \ndefining the design system tokens, identifying the right tools and libraries. Post implementation, my focus was towards evangelizing the design system, getting buy-in for implementing it onto the various product roadmaps and \ntracking its usage within products. I was ***not*** responsible for creating the design system and its components in Figma.\n\n## Challenge\n\nWe set out with a clear set of goals for the design system:\n\n### Goals\n\n- **Scalability** \nLay a foundation that would allow Jiva to scale across platforms and countries.\n\n- **Speed** \nRemove friction in day-to-day work so designers could focus on designing, while product managers and developers knew exactly which components to use.\n\n- **Output quality** \nImprove the handoff process so what was designed could be built accurately.\n\n- **Accessibility** \nBring typography and color usage in line with minimum WCAG guidelines.\n\n- **Standardization** \nCreate a coherent, consistent feel across all our products, reinforcing a sense of trust and legitimacy.\n\n### Impact on our customers\n\n- **Familiarity** \nFamiliar patterns across products, reducing the learning curve.\n\n- **Readability** \nImproved readability for older MCs, with better support for built-in phone accessibility features.\n\n- **Performance** \nFaster, lighter apps through reduced duplication and a smaller overall app size.\n\n## Getting started\n\nIt's easy to write down what we wanted to achieve with our design system but we had 0 experience designing one. \n\nWe started by studying how well-known design systems such as Material Design, Shopify's Polaris, and Uber's Base were structured. \nWe analyzed their token structures, naming conventions, and the rationale behind their choices. We watched talks, talked to peers, read blog posts and then we got started.\n\n### Design Tokens\n\nDesign tokens represent the small, repeated design decisions that make up a design system's visual style. They replace static values, such as hex codes for color, with self-explanatory names. A token's value can be one of several things: a color, a typeface, a measurement, or even another token. \n\n![The way we envisioned our lean system to work inspired from Spotify’s Encore](design-system-philosophy.webp) [^1]\n\nWe chose **colour** and **typography** as tokens in our system. We chose only these tokens because they gave the team the autonomy to move fast while giving us the flexibility to maintain consistency where it mattered.\nAll without locking us into a rigid design expression. These tokens could be used to create design “atoms” and “molecules” across different platforms, allowing our \ncomponents to adapt naturally to each platform’s native constraints.\nThis flexibility was crucial. It allowed teams to move faster, design for different use cases, and scale without sacrificing brand coherence.\n\n>For example, in 2024, when we built react native apps by adopting [Paper](https://reactnativepaper.com/), our tokens could easily be ported to make Paper-based apps feel like a Jiva product. \n>In tools like Retool, we only ported over colour tokens because that’s all we needed to ensure visual consistency. \n>This token-driven flexibility became the key to scaling design without getting bogged down by unnecessary rigidity like uniformity of components.\n \n#### Typography\n\n![Old type vs New type](type.webp)\n\nFor Typography, we decided to lean on system defaults. On Android, by switching from [Mr. Eaves](https://fonts.adobe.com/fonts/mr-eaves-xl)(our brand font) to Roboto, we addressed the legibility issues we had previously\nfaced, particularly on budget Android devices. However, this wasn’t \na simple swap. We had to design a type scale that ensured our transition was seamless and consistent across various text elements, from headings to body text.\nfor this was taking several key UI screens and replacing text to see how we could map the new type styles to the old ones with minimal effect to the UI.\n\n#### Color\n\n![](color.webp)\n\nColour, on the other hand, posed a unique challenge. Our original primary colour (#0AB858), vibrant as it was, didn’t meet [WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/) contrast requirements, especially for text on white or green backgrounds in smaller font sizes. We knew this was a dealbreaker for accessibility.\nAchieving the right contrast was tough — white on green rarely provides the necessary legibility, particularly on low-resolution displays. Finally with the help of \nEnvoy’s post on [building an accessible colour scheme](https://medium.com/envoy-design/how-to-design-an-accessible-color-scheme-4a13ca12c92b), [Stark’s handy plugin](https://www.figma.com/community/plugin/732603254453395948/stark-contrast-accessibility-checker) and [Tailwind Color Generator plugin](https://www.figma.com/community/plugin/1242548152689430610/tailwind-css-color-generator), we found a modified shade of green(#006E25) \nthat worked visually and was AA compliant. But colour wasn’t just about picking a new shade; \nwe also had to write detailed guidelines for how and where it should be used to maintain consistency and accessibility across our products.\n\n\n### Bringing it all together\nM3 [(Material Design 3)](https://m3.material.io) had just released and we loved the fresh new style it brought with it. Material Design is built around a ‘primary’ color making it easy for \npeople(read: devs) to adopt it. They provide you a [figma plugin](https://www.figma.com/community/plugin/1034969338659738588/material-theme-builder) to generate your color tokens but it lacks customization and is overly technical. \n\nMoreover, the way these tokens styled the components felt awkward to us. It did not fit our brand. So we decided to take control and create our own token system which we would map to these components.\n\nDuring further research, we learned that there's no standardization of naming conventions across companies—each has its own needs and preferences. This situation challenged us, as we're new to design tokens and struggled to decide which approach we can go ahead with. It was only when we watched [this talk from Schema 2021](https://www.youtube.com/watch?v=ylDed18OVdY) titled *\"Design tokens at Asana\"* by Jina Anne, \nAinsley Wagoner, and Ivy Wang that the solution finally dawned on us.\n\n>Color tokens need to be comprehensive enough to clearly describe their usage, yet concise enough to make it easy to determine which tokens to apply.\n\nWe took the ideas from the talk and aimed to create tokens that are direct and self-explanatory. Our goal was to make them easily understandable by all and avoid designers needing to refer back to documentation to use the system. \n\nAfter a lot of discussions, we implemented the following structure structure designed for clarity and ease of use. It wasn't perfect, but it worked with a little bit of documentation better than Material Design's approach.\n![Naming convention of Akar](naming.webp)\n1. \u003Cins>Property\u003C/ins> We start with what we call ‘property’, thus called because it defines what kind of element it is applied to; content, background or border. So for a primary button below, the color token for the text uses the content property while the colour of the button is represented by the background property.\n2. \u003Cins>Roles\u003C/ins> The ‘role’ aspect is where you start to identify the kind of component you are attempting to style. We use ‘Action’ for components that need the user to ‘act’ on them while ‘Highlight’ and ‘Interactive’ are used for communicating a system reaction to the user. We have ‘default’ for neutral colours and ‘decorative’ was introduced at a later point for components like badges and tags that needed to be visually appealing.\n3. \u003Cins>Priority\u003C/ins> Priority is used to optimize the visual hierarchy within the user interface, ensuring that the most important elements stand out and draw the user’s attention. By assigning different priority levels to components, we can guide users through the interface more intuitively, highlighting key actions, content, or information and making the overall experience more seamless and efficient.\n4. \u003Cins>Type\u003C/ins> Type is used to express the tone or meaning of an element, such as information, success, warning, error, or neutrality. These types are applied to components like buttons, banners, and toasts, as well as to elements like icons and text.\n5. \u003Cins>States\u003C/ins> States are visual indicators that communicate the current status or condition of a component or interactive element. They help users understand how an element is behaving at any given moment, such as whether it’s pressed, loading, selected, focused, or disabled.\n\n![How designers can use our tokens](how-to-tokens.webp)\n\n### The Final stretch\nIf your design system exists only in Figma, then its just a style guide. For a design system to be truly complete, it needs to exists outside of Figma and as a code library.\n\nWe were re-writing our Android Front end in Jetpack Compose and decided to merge the two efforts to implement our design system. \nWhile having self-explanatory token naming certainly makes designers' lives easier, by taking this direction of deviating from Material Design's conventions, we increased our developement effort. \nWe had to build a bridge to make our tokens compatible with material design. This wasn’t straightforward. Most big companies that we studied had UX engineering teams to help build such plugins for their use. \nWe came across [Amazon’s style dictionary](https://github.com/style-dictionary/style-dictionary) from [this talk by Doordash](https://www.youtube.com/watch?v=jgueTz72ZMQ&t=760s) and Atlassian’s inhouse plugin in [their schema talk](https://www.youtube.com/watch?v=m8ZSu9eCsQc&t=814s) \nand the popular figma plugin [Tokens Studio](https://tokens.studio). \n\n>So why did we still proceed with this approach? We prioritized ease of use, recognizing that the development work to implement this system is a one-time investment. \n>We believed that it was a worthwhile trade-off.\n\nIt wasn’t really all that straightforward. We were only able to make it work by closely working with our developers(Sivan and Vishnu).\n\n#### Our Approach\nWe used Tokens Studio to export our tokens from Figma as JSON and the devs had to figure out how to translate this to a setup that can be consumed by our apps. \nThe aim was to make sure that the designers had the freedom to take decisions while the devs wouldn’t have to break a sweat in integrating them into the apps.\n\nOur apps are on the Jetpack Compose framework and this meant that the design language and consumption were slightly different from Android’s traditional XML. \nWe found [Lukas Opperman’s Design Token Transformer](https://github.com/lukasoppermann/design-token-transformer) to be a great tool for porting tokens to Web, \niOS and Android’s XML system but we needed something that would support Jetpack Compose as well. So we forked this repo and decided to add support for Jetpack Compose. \nThe overall idea was straightforward. The engine should take in the \nJSON file as the input, and spit out Compose Theming files that can be imported onto your project directly and the devs wouldn’t have to worry too much about the setup.\n\n\u003Cimg src=\"/images/tokens-figma.gif\" alt=\"Tokens in Figma\" loading=\"lazy\" style=\"border-radius: 8px;\" />\n\nAnd that’s how we placed the final piece of our design system jigsaw puzzle.\n\n\n## Presenting the Akar Design Sytem: \nAll this while, we had been working hard on the system but we realised we didn’t have a name for our design system. We wanted something that resonated with the agritech space we were in, so we began brainstorming. Finally, with the help of Notion AI, we chose to go with Akar.\n\nAkar, derived from the Bahasa Indonesia word for ‘root,’ perfectly reflects the role of our design system in providing a solid foundation for building products. It’s also symbolic, as Indonesia is where our products first took shape, making the name a meaningful nod to our origins.\n\n![Akar on our screens](akar-screens.webp)\n\n### Post-launch\nA design system's success is measure by its penetration and implementation by the team. Building it in isolation is bound to fail. Throughout the process, we spent time\ninvolving the dev and design teams. We did this by \n- We created Slack channels to communicate updates and invite collaboration. \n- We presented the system at an org-wide ‘Lunch and Learn’ (an org level initiative to talk about work) to bring awareness to the initiative.\n- To track adoption, we created pod-specific slack channels for devs and designers to have discussions around implementation and we set up a Notion page to track migration and adoption.\n- We created a [documentation site](https://zeroheight.com/5c1eb1bd5/p/73e674-akar-design-system) which devs and designers could refer to. \n\n## Impact\n\nHaving Akar, helped us scale faster and build and redesign new apps and products in the Jiva ecosystem. As of September 2025, it was used across various platforms and products at Jiva, \nsupporting our 3 core Android mobile apps (Sahabat Jiva, Jiva Petani, Jiva Agro). We also extended our tokens to be used in our internal React Native apps (Jiva Sales, Field Agent App), as well as internal tools built using Retool.\n\nImplementation of the code components was a slow process as getting it prioritised over business needs was hard. \nWe were able to get like 80% of the product verticals to completely use our libarary within the first 12 months. \n\n## Team\nTyo (who had just joined the team) worked with me and built out the Figma token and components system. Nav, (head of design), helped us take decisions\naround the direction of the design components. Sivan and VIshnu were the devs who we collaborated closely to get the code components out in production. \n\n[^1]: **Spotify's Encore** https://spotify.design/article/can-i-get-an-encore-spotifys-design-system-three-years-on","src/content/work/akar-design-system/index.md",[23,24,25,26,27,28,29,30],"styleguide.webp","design-system-philosophy.webp","type.webp","color.webp","naming.webp","how-to-tokens.webp","akar-screens.webp","./akar.webp","3c7ad219c91644da",{"html":33,"metadata":34},"\u003Cp>Design systems often represent an aspirational milestone for product design teams. But they’re often seen as an all-or-nothing project — something that takes months of planning and effort,\nwhile day-to-day product delivery suffers. When everything is moving at breakneck speed, it feels risky to divert resources into building a design system.\n\u003Cstrong>But is it really?\u003C/strong>\u003C/p>\n\u003Cp>In early 2022, Jiva was deep in the throes of hyper-growth, onboarding new team members almost every week. The chaos hit every part of the company, and the design team wasn’t immune.\nWork was being duplicated across pods, our user experience was inconsistent, accessibility needs were being overlooked, and our app’s\nperformance was lagging behind.\nAt the time, we had a Figma-style guide, but it simply wasn’t enough. We needed more than a set of visual guidelines — we needed a\ncomprehensive design system that could help us keep up with the rapid growth without adding friction to the process. And yet, we faced a tough constraint:\nour design team was tiny (and growing), so we had to approach this in a \u003Cem>lean\u003C/em> way.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"styleguide.webp","alt":"A snapshot of our Figma Component Library Circa early 2022","index":0}\">\u003Cfigcaption>A snapshot of our Figma Component Library Circa early 2022\u003C/figcaption>\u003C/figure>\n\u003Ch2 id=\"role\">Role\u003C/h2>\n\u003Cp>I led the effort on the design system and my responsibilities included managing with various stakeholders(product, engineering, qa), pitching ideas,\ndefining the design system tokens, identifying the right tools and libraries. Post implementation, my focus was towards evangelizing the design system, getting buy-in for implementing it onto the various product roadmaps and\ntracking its usage within products. I was \u003Cem>\u003Cstrong>not\u003C/strong>\u003C/em> responsible for creating the design system and its components in Figma.\u003C/p>\n\u003Ch2 id=\"challenge\">Challenge\u003C/h2>\n\u003Cp>We set out with a clear set of goals for the design system:\u003C/p>\n\u003Ch3 id=\"goals\">Goals\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Scalability\u003C/strong>\u003Cbr>\nLay a foundation that would allow Jiva to scale across platforms and countries.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Speed\u003C/strong>\u003Cbr>\nRemove friction in day-to-day work so designers could focus on designing, while product managers and developers knew exactly which components to use.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Output quality\u003C/strong>\u003Cbr>\nImprove the handoff process so what was designed could be built accurately.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Accessibility\u003C/strong>\u003Cbr>\nBring typography and color usage in line with minimum WCAG guidelines.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Standardization\u003C/strong>\u003Cbr>\nCreate a coherent, consistent feel across all our products, reinforcing a sense of trust and legitimacy.\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"impact-on-our-customers\">Impact on our customers\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Familiarity\u003C/strong>\u003Cbr>\nFamiliar patterns across products, reducing the learning curve.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Readability\u003C/strong>\u003Cbr>\nImproved readability for older MCs, with better support for built-in phone accessibility features.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Cstrong>Performance\u003C/strong>\u003Cbr>\nFaster, lighter apps through reduced duplication and a smaller overall app size.\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"getting-started\">Getting started\u003C/h2>\n\u003Cp>It’s easy to write down what we wanted to achieve with our design system but we had 0 experience designing one.\u003C/p>\n\u003Cp>We started by studying how well-known design systems such as Material Design, Shopify’s Polaris, and Uber’s Base were structured.\nWe analyzed their token structures, naming conventions, and the rationale behind their choices. We watched talks, talked to peers, read blog posts and then we got started.\u003C/p>\n\u003Ch3 id=\"design-tokens\">Design Tokens\u003C/h3>\n\u003Cp>Design tokens represent the small, repeated design decisions that make up a design system’s visual style. They replace static values, such as hex codes for color, with self-explanatory names. A token’s value can be one of several things: a color, a typeface, a measurement, or even another token.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"design-system-philosophy.webp","alt":"The way we envisioned our lean system to work inspired from Spotify’s Encore","index":0}\">\u003Cfigcaption>The way we envisioned our lean system to work inspired from Spotify’s Encore\u003C/figcaption>\u003C/figure>\n\u003Cp>We chose \u003Cstrong>colour\u003C/strong> and \u003Cstrong>typography\u003C/strong> as tokens in our system. We chose only these tokens because they gave the team the autonomy to move fast while giving us the flexibility to maintain consistency where it mattered.\nAll without locking us into a rigid design expression. These tokens could be used to create design “atoms” and “molecules” across different platforms, allowing our\ncomponents to adapt naturally to each platform’s native constraints.\nThis flexibility was crucial. It allowed teams to move faster, design for different use cases, and scale without sacrificing brand coherence.\u003C/p>\n\u003Cblockquote>\n\u003Cp>For example, in 2024, when we built react native apps by adopting \u003Ca href=\"https://reactnativepaper.com/\">Paper\u003C/a>, our tokens could easily be ported to make Paper-based apps feel like a Jiva product.\nIn tools like Retool, we only ported over colour tokens because that’s all we needed to ensure visual consistency.\nThis token-driven flexibility became the key to scaling design without getting bogged down by unnecessary rigidity like uniformity of components.\u003C/p>\n\u003C/blockquote>\n\u003Ch4 id=\"typography\">Typography\u003C/h4>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"type.webp","alt":"Old type vs New type","index":0}\">\u003Cfigcaption>Old type vs New type\u003C/figcaption>\u003C/figure>\n\u003Cp>For Typography, we decided to lean on system defaults. On Android, by switching from \u003Ca href=\"https://fonts.adobe.com/fonts/mr-eaves-xl\">Mr. Eaves\u003C/a>(our brand font) to Roboto, we addressed the legibility issues we had previously\nfaced, particularly on budget Android devices. However, this wasn’t\na simple swap. We had to design a type scale that ensured our transition was seamless and consistent across various text elements, from headings to body text.\nfor this was taking several key UI screens and replacing text to see how we could map the new type styles to the old ones with minimal effect to the UI.\u003C/p>\n\u003Ch4 id=\"color\">Color\u003C/h4>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"color.webp","alt":"","index":0}\">\u003C/figure>\n\u003Cp>Colour, on the other hand, posed a unique challenge. Our original primary colour (#0AB858), vibrant as it was, didn’t meet \u003Ca href=\"https://www.w3.org/WAI/standards-guidelines/wcag/\">WCAG\u003C/a> contrast requirements, especially for text on white or green backgrounds in smaller font sizes. We knew this was a dealbreaker for accessibility.\nAchieving the right contrast was tough — white on green rarely provides the necessary legibility, particularly on low-resolution displays. Finally with the help of\nEnvoy’s post on \u003Ca href=\"https://medium.com/envoy-design/how-to-design-an-accessible-color-scheme-4a13ca12c92b\">building an accessible colour scheme\u003C/a>, \u003Ca href=\"https://www.figma.com/community/plugin/732603254453395948/stark-contrast-accessibility-checker\">Stark’s handy plugin\u003C/a> and \u003Ca href=\"https://www.figma.com/community/plugin/1242548152689430610/tailwind-css-color-generator\">Tailwind Color Generator plugin\u003C/a>, we found a modified shade of green(#006E25)\nthat worked visually and was AA compliant. But colour wasn’t just about picking a new shade;\nwe also had to write detailed guidelines for how and where it should be used to maintain consistency and accessibility across our products.\u003C/p>\n\u003Ch3 id=\"bringing-it-all-together\">Bringing it all together\u003C/h3>\n\u003Cp>M3 \u003Ca href=\"https://m3.material.io\">(Material Design 3)\u003C/a> had just released and we loved the fresh new style it brought with it. Material Design is built around a ‘primary’ color making it easy for\npeople(read: devs) to adopt it. They provide you a \u003Ca href=\"https://www.figma.com/community/plugin/1034969338659738588/material-theme-builder\">figma plugin\u003C/a> to generate your color tokens but it lacks customization and is overly technical.\u003C/p>\n\u003Cp>Moreover, the way these tokens styled the components felt awkward to us. It did not fit our brand. So we decided to take control and create our own token system which we would map to these components.\u003C/p>\n\u003Cp>During further research, we learned that there’s no standardization of naming conventions across companies—each has its own needs and preferences. This situation challenged us, as we’re new to design tokens and struggled to decide which approach we can go ahead with. It was only when we watched \u003Ca href=\"https://www.youtube.com/watch?v=ylDed18OVdY\">this talk from Schema 2021\u003C/a> titled \u003Cem>“Design tokens at Asana”\u003C/em> by Jina Anne,\nAinsley Wagoner, and Ivy Wang that the solution finally dawned on us.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Color tokens need to be comprehensive enough to clearly describe their usage, yet concise enough to make it easy to determine which tokens to apply.\u003C/p>\n\u003C/blockquote>\n\u003Cp>We took the ideas from the talk and aimed to create tokens that are direct and self-explanatory. Our goal was to make them easily understandable by all and avoid designers needing to refer back to documentation to use the system.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"naming.webp","alt":"Naming convention of Akar","index":0}\">\u003Cfigcaption>Naming convention of Akar\u003C/figcaption>\u003C/figure>\n\u003Col>\n\u003Cli>\u003Cins>Property\u003C/ins> We start with what we call ‘property’, thus called because it defines what kind of element it is applied to; content, background or border. So for a primary button below, the color token for the text uses the content property while the colour of the button is represented by the background property.\u003C/li>\n\u003Cli>\u003Cins>Roles\u003C/ins> The ‘role’ aspect is where you start to identify the kind of component you are attempting to style. We use ‘Action’ for components that need the user to ‘act’ on them while ‘Highlight’ and ‘Interactive’ are used for communicating a system reaction to the user. We have ‘default’ for neutral colours and ‘decorative’ was introduced at a later point for components like badges and tags that needed to be visually appealing.\u003C/li>\n\u003Cli>\u003Cins>Priority\u003C/ins> Priority is used to optimize the visual hierarchy within the user interface, ensuring that the most important elements stand out and draw the user’s attention. By assigning different priority levels to components, we can guide users through the interface more intuitively, highlighting key actions, content, or information and making the overall experience more seamless and efficient.\u003C/li>\n\u003Cli>\u003Cins>Type\u003C/ins> Type is used to express the tone or meaning of an element, such as information, success, warning, error, or neutrality. These types are applied to components like buttons, banners, and toasts, as well as to elements like icons and text.\u003C/li>\n\u003Cli>\u003Cins>States\u003C/ins> States are visual indicators that communicate the current status or condition of a component or interactive element. They help users understand how an element is behaving at any given moment, such as whether it’s pressed, loading, selected, focused, or disabled.\u003C/li>\n\u003C/ol>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"how-to-tokens.webp","alt":"How designers can use our tokens","index":0}\">\u003Cfigcaption>How designers can use our tokens\u003C/figcaption>\u003C/figure>\n\u003Ch3 id=\"the-final-stretch\">The Final stretch\u003C/h3>\n\u003Cp>If your design system exists only in Figma, then its just a style guide. For a design system to be truly complete, it needs to exists outside of Figma and as a code library.\u003C/p>\n\u003Cp>We were re-writing our Android Front end in Jetpack Compose and decided to merge the two efforts to implement our design system.\nWhile having self-explanatory token naming certainly makes designers’ lives easier, by taking this direction of deviating from Material Design’s conventions, we increased our developement effort.\nWe had to build a bridge to make our tokens compatible with material design. This wasn’t straightforward. Most big companies that we studied had UX engineering teams to help build such plugins for their use.\nWe came across \u003Ca href=\"https://github.com/style-dictionary/style-dictionary\">Amazon’s style dictionary\u003C/a> from \u003Ca href=\"https://www.youtube.com/watch?v=jgueTz72ZMQ&t=760s\">this talk by Doordash\u003C/a> and Atlassian’s inhouse plugin in \u003Ca href=\"https://www.youtube.com/watch?v=m8ZSu9eCsQc&t=814s\">their schema talk\u003C/a>\nand the popular figma plugin \u003Ca href=\"https://tokens.studio\">Tokens Studio\u003C/a>.\u003C/p>\n\u003Cblockquote>\n\u003Cp>So why did we still proceed with this approach? We prioritized ease of use, recognizing that the development work to implement this system is a one-time investment.\nWe believed that it was a worthwhile trade-off.\u003C/p>\n\u003C/blockquote>\n\u003Cp>It wasn’t really all that straightforward. We were only able to make it work by closely working with our developers(Sivan and Vishnu).\u003C/p>\n\u003Ch4 id=\"our-approach\">Our Approach\u003C/h4>\n\u003Cp>We used Tokens Studio to export our tokens from Figma as JSON and the devs had to figure out how to translate this to a setup that can be consumed by our apps.\nThe aim was to make sure that the designers had the freedom to take decisions while the devs wouldn’t have to break a sweat in integrating them into the apps.\u003C/p>\n\u003Cp>Our apps are on the Jetpack Compose framework and this meant that the design language and consumption were slightly different from Android’s traditional XML.\nWe found \u003Ca href=\"https://github.com/lukasoppermann/design-token-transformer\">Lukas Opperman’s Design Token Transformer\u003C/a> to be a great tool for porting tokens to Web,\niOS and Android’s XML system but we needed something that would support Jetpack Compose as well. So we forked this repo and decided to add support for Jetpack Compose.\nThe overall idea was straightforward. The engine should take in the\nJSON file as the input, and spit out Compose Theming files that can be imported onto your project directly and the devs wouldn’t have to worry too much about the setup.\u003C/p>\n\u003Cimg src=\"/images/tokens-figma.gif\" alt=\"Tokens in Figma\" loading=\"lazy\" style=\"border-radius: 8px;\">\n\u003Cp>And that’s how we placed the final piece of our design system jigsaw puzzle.\u003C/p>\n\u003Ch2 id=\"presenting-the-akar-design-sytem\">Presenting the Akar Design Sytem:\u003C/h2>\n\u003Cp>All this while, we had been working hard on the system but we realised we didn’t have a name for our design system. We wanted something that resonated with the agritech space we were in, so we began brainstorming. Finally, with the help of Notion AI, we chose to go with Akar.\u003C/p>\n\u003Cp>Akar, derived from the Bahasa Indonesia word for ‘root,’ perfectly reflects the role of our design system in providing a solid foundation for building products. It’s also symbolic, as Indonesia is where our products first took shape, making the name a meaningful nod to our origins.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"akar-screens.webp","alt":"Akar on our screens","index":0}\">\u003Cfigcaption>Akar on our screens\u003C/figcaption>\u003C/figure>\n\u003Ch3 id=\"post-launch\">Post-launch\u003C/h3>\n\u003Cp>A design system’s success is measure by its penetration and implementation by the team. Building it in isolation is bound to fail. Throughout the process, we spent time\ninvolving the dev and design teams. We did this by\u003C/p>\n\u003Cul>\n\u003Cli>We created Slack channels to communicate updates and invite collaboration.\u003C/li>\n\u003Cli>We presented the system at an org-wide ‘Lunch and Learn’ (an org level initiative to talk about work) to bring awareness to the initiative.\u003C/li>\n\u003Cli>To track adoption, we created pod-specific slack channels for devs and designers to have discussions around implementation and we set up a Notion page to track migration and adoption.\u003C/li>\n\u003Cli>We created a \u003Ca href=\"https://zeroheight.com/5c1eb1bd5/p/73e674-akar-design-system\">documentation site\u003C/a> which devs and designers could refer to.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"impact\">Impact\u003C/h2>\n\u003Cp>Having Akar, helped us scale faster and build and redesign new apps and products in the Jiva ecosystem. As of September 2025, it was used across various platforms and products at Jiva,\nsupporting our 3 core Android mobile apps (Sahabat Jiva, Jiva Petani, Jiva Agro). We also extended our tokens to be used in our internal React Native apps (Jiva Sales, Field Agent App), as well as internal tools built using Retool.\u003C/p>\n\u003Cp>Implementation of the code components was a slow process as getting it prioritised over business needs was hard.\nWe were able to get like 80% of the product verticals to completely use our libarary within the first 12 months.\u003C/p>\n\u003Ch2 id=\"team\">Team\u003C/h2>\n\u003Cp>Tyo (who had just joined the team) worked with me and built out the Figma token and components system. Nav, (head of design), helped us take decisions\naround the direction of the design components. Sivan and VIshnu were the devs who we collaborated closely to get the code components out in production.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>\u003Cstrong>Spotify’s Encore\u003C/strong> \u003Ca href=\"https://spotify.design/article/can-i-get-an-encore-spotifys-design-system-three-years-on\">https://spotify.design/article/can-i-get-an-encore-spotifys-design-system-three-years-on\u003C/a> \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":35,"localImagePaths":87,"remoteImagePaths":88,"frontmatter":89,"imagePaths":90},[36,40,43,47,50,53,56,60,63,66,69,72,75,78,81,84],{"depth":37,"slug":38,"text":39},2,"role","Role",{"depth":37,"slug":41,"text":42},"challenge","Challenge",{"depth":44,"slug":45,"text":46},3,"goals","Goals",{"depth":44,"slug":48,"text":49},"impact-on-our-customers","Impact on our customers",{"depth":37,"slug":51,"text":52},"getting-started","Getting started",{"depth":44,"slug":54,"text":55},"design-tokens","Design Tokens",{"depth":57,"slug":58,"text":59},4,"typography","Typography",{"depth":57,"slug":61,"text":62},"color","Color",{"depth":44,"slug":64,"text":65},"bringing-it-all-together","Bringing it all together",{"depth":44,"slug":67,"text":68},"the-final-stretch","The Final stretch",{"depth":57,"slug":70,"text":71},"our-approach","Our Approach",{"depth":37,"slug":73,"text":74},"presenting-the-akar-design-sytem","Presenting the Akar Design Sytem:",{"depth":44,"slug":76,"text":77},"post-launch","Post-launch",{"depth":37,"slug":79,"text":80},"impact","Impact",{"depth":37,"slug":82,"text":83},"team","Team",{"depth":37,"slug":85,"text":86},"footnote-label","Footnotes",[23,24,25,26,27,28,29],[],{"title":14,"description":15,"year":17,"company":18,"image":30},[23,24,25,26,27,28,29],"claim-profile",{"id":91,"data":93,"body":100,"filePath":101,"assetImports":102,"digest":104,"rendered":105},{"title":94,"description":95,"image":96,"year":97,"company":98,"status":99},"Practo.com doctor profiles","Designing the onboarding experience for new doctors on Practo.com","__ASTRO_IMAGE_./practo-profile.png","2016-2017","Practo","draft","## Overview\n\nPracto has around 100k doctor profiles and another 70k clinic profiles currently live on its marketplace.\nThis accounts for barely 50% of coverage in our T6 cities. So during the Q3-Q4 of 2016-17, the primary\nobjective of the unified app; Practo Partner, was to get more profiles published and live.\n\nAround November 2016, to get a profile live on Practo.com, a doctor needed to fill in 20 fields which\nwere separated into 2 forms. We had taken the approach as an informational option but realized that\nlot of profiles were not being completed and we did not communicate what was necessary to go live to\na doctor within the app.\n\n\n[before we began]\n\n## Understanding the problem\n\nAs seen above, we did communicate that a profile was incomplete but the interface didn't\ncommunicate what was necessary for a doctor to go live. Our completion data showed us that major\ndropoffs occurred during profile completion, proof upload and clinic profile addition.\n\nWe studied onboarding flows of other applications like Airbnb and Gyroscope which deal with filling lot\nof mandatory data as well as Doximity which deals with the claiming of doctor profiles to get started.\nExploring a solution\n\nAfter some discussions with the stakeholders, we decided the best way to deliver impact was if we\nbreak this project into phases. For the first phase, we designed and shipped out with an intent page\nand a quick fix stitching the two forms together. At the same time, the app was going through the new\nbrand implementation which explains the choice of color palette and the change in typography.\n\n[designs from phase 1]\n\nPost this change, we saw an increase(approx 34%) in the profiles going towards completion in the\nmonth of March vs February and January numbers. This validated the brief and the direction that we\nwere going towards.\n\nAs part of the feet-on-street model adopted by Practo, we had several profiles that had been created\nby the salesguy, however those profiles were not being used by the doctor and instead the doctor\nwould create a new profile when they logged in leading to duplicates which would be an overhead for\noperations and decreased efficiency. We also needed doctors to keep their profile data fresh. So with\nthis in mind, Claim profile became a company objective so the next phase was integrating this into the\nonboarding\n\nThe various usecases and catering to both new and existing users kept us busy for almost a month\nwhere we iterated on various designs before narrowing down on one. We worked closely with the\nprofiles product team whenever we had to make a decision, since they knew best about the way profile\nclaim worked.\n\n\n[early explorations]\n\nBased on all these inputs, we were able to narrow down on the direction that we wanted to take for the\nproject.\nevolution of the ‘checkout’ screen\n\n\n### Things we are trying out with this\n– The design accommodated for problems with the flow with keeping a way to access our hotline on all\nthe decision making pages.\n– Users dropping off would be asked if they would want to be reminded to fill the form at a later time.\nThe form needs document proofs to be complete and these would not always be at hand.\n\n## Final screens\n\n\n**Footnote:**\nThanks to Sonal, Suhas, Preet, Rafiq, Pramod, Rachit and the rest of the Practo Pro team for their\ninputs and help in making this design come true","src/content/work/claim-profile/index.md",[103],"./practo-profile.png","a77ca723bf32625f",{"html":106,"metadata":107},"\u003Ch2 id=\"overview\">Overview\u003C/h2>\n\u003Cp>Practo has around 100k doctor profiles and another 70k clinic profiles currently live on its marketplace.\nThis accounts for barely 50% of coverage in our T6 cities. So during the Q3-Q4 of 2016-17, the primary\nobjective of the unified app; Practo Partner, was to get more profiles published and live.\u003C/p>\n\u003Cp>Around November 2016, to get a profile live on Practo.com, a doctor needed to fill in 20 fields which\nwere separated into 2 forms. We had taken the approach as an informational option but realized that\nlot of profiles were not being completed and we did not communicate what was necessary to go live to\na doctor within the app.\u003C/p>\n\u003Cp>[before we began]\u003C/p>\n\u003Ch2 id=\"understanding-the-problem\">Understanding the problem\u003C/h2>\n\u003Cp>As seen above, we did communicate that a profile was incomplete but the interface didn’t\ncommunicate what was necessary for a doctor to go live. Our completion data showed us that major\ndropoffs occurred during profile completion, proof upload and clinic profile addition.\u003C/p>\n\u003Cp>We studied onboarding flows of other applications like Airbnb and Gyroscope which deal with filling lot\nof mandatory data as well as Doximity which deals with the claiming of doctor profiles to get started.\nExploring a solution\u003C/p>\n\u003Cp>After some discussions with the stakeholders, we decided the best way to deliver impact was if we\nbreak this project into phases. For the first phase, we designed and shipped out with an intent page\nand a quick fix stitching the two forms together. At the same time, the app was going through the new\nbrand implementation which explains the choice of color palette and the change in typography.\u003C/p>\n\u003Cp>[designs from phase 1]\u003C/p>\n\u003Cp>Post this change, we saw an increase(approx 34%) in the profiles going towards completion in the\nmonth of March vs February and January numbers. This validated the brief and the direction that we\nwere going towards.\u003C/p>\n\u003Cp>As part of the feet-on-street model adopted by Practo, we had several profiles that had been created\nby the salesguy, however those profiles were not being used by the doctor and instead the doctor\nwould create a new profile when they logged in leading to duplicates which would be an overhead for\noperations and decreased efficiency. We also needed doctors to keep their profile data fresh. So with\nthis in mind, Claim profile became a company objective so the next phase was integrating this into the\nonboarding\u003C/p>\n\u003Cp>The various usecases and catering to both new and existing users kept us busy for almost a month\nwhere we iterated on various designs before narrowing down on one. We worked closely with the\nprofiles product team whenever we had to make a decision, since they knew best about the way profile\nclaim worked.\u003C/p>\n\u003Cp>[early explorations]\u003C/p>\n\u003Cp>Based on all these inputs, we were able to narrow down on the direction that we wanted to take for the\nproject.\nevolution of the ‘checkout’ screen\u003C/p>\n\u003Ch3 id=\"things-we-are-trying-out-with-this\">Things we are trying out with this\u003C/h3>\n\u003Cp>– The design accommodated for problems with the flow with keeping a way to access our hotline on all\nthe decision making pages.\n– Users dropping off would be asked if they would want to be reminded to fill the form at a later time.\nThe form needs document proofs to be complete and these would not always be at hand.\u003C/p>\n\u003Ch2 id=\"final-screens\">Final screens\u003C/h2>\n\u003Cp>\u003Cstrong>Footnote:\u003C/strong>\nThanks to Sonal, Suhas, Preet, Rafiq, Pramod, Rachit and the rest of the Practo Pro team for their\ninputs and help in making this design come true\u003C/p>",{"headings":108,"localImagePaths":121,"remoteImagePaths":122,"frontmatter":123,"imagePaths":124},[109,112,115,118],{"depth":37,"slug":110,"text":111},"overview","Overview",{"depth":37,"slug":113,"text":114},"understanding-the-problem","Understanding the problem",{"depth":44,"slug":116,"text":117},"things-we-are-trying-out-with-this","Things we are trying out with this",{"depth":37,"slug":119,"text":120},"final-screens","Final screens",[],[],{"title":94,"description":95,"year":97,"company":98,"image":103,"status":99},[],"gobiz-inbox",{"id":125,"data":127,"body":132,"filePath":133,"digest":134,"rendered":135},{"title":128,"description":129,"year":130,"company":131,"status":99},"Designing the Inbox experience for GoBiz","How we designed the in-app comms channel","2021","Gojek","The Gojek Chat SDK was built to support products wanting to integrate chat into their flows. However like many other platformized products, they end up being looked as solutions for use cases they were not designed for. The GoBiz inbox requirement wasn't my first experience with dog fooding, but it was one that I was able to influence positively for the benefit of the users.\n\nWe wanted to build an Inbox, an in-app channel for notifying our users. We just needed one-way communication. I do not understand the reason behind why product pushed to use the SDK, despite the arguments that the SDK wasn't able to support our web product and wasn't designed to communicate business updates.\n\n### Chat is chat, not inbox:\n\nI created a document to explain what that decision meant for the app.\nIf we use the chat sdk, then in the future as other teams build on the chat platform, we should plan to group all kinds of chat in a single space. This would align with the mental model of the user. This space would be the go-to place to follow up on your \"conversations\", whether its about onboarding a new outlet or following up about your GoFresh order.\n\n_Decision:_ We decided that all chats will show up in Inbox but we will need to visually separate them from the business chats. This is something that the Chat team had not yet designed for.\n\n### Where should Inbox/chat go?\n\nGiven that Inbox is something we are considering for communication, it should be easily accessible and indicate unread chats. Given the current structure of the GoBiz app, we could only think of 2 possible positions for the Inbox.\n\nHowever neither of these positions fulfill the conditions of\n\n1. Visibility of new messages: The red dot on Lainnya can't showcase a number since there are several other modules which have a no-number indication.\n\n2. Accessible from various parts of our app: A gofood merchant would jump right to the Orders inbox when they open the app and has no need to aware of this \"notification'\n\n_Decision:_ However without the redesign being prioritized, we decided to keep the entry point on the top right of the 'Lainnya' page.\n\n### Shuffle vs Inbox:\n\n1. Currently there can be overlaps. Overlaps may lead to reduction in importance of Inbox content.\n\n2. Can 'Promo' channel in Inbox be completely replaced by a shuffle card channel on lainnya? because promos need segmentation. Inbox may not work that way.\n\n_Decision:_ No decision yet\n\n### Design iterations\n\nThe Inbox requirement wasn't a new one. 11 months ago, Saneef had worked on how we could introduce communication channels(banner and inbox) in our /existing/ app. [(Aside: His redesign had 'Inbox' as a tab on the bottom navigation)](https://share.goabstract.com/8af61eee-de93-4f63-b0f8-64922742a29e?mode=design&sha=875263ee629f633ddd9229602605e3870884c3da)\n\nWhat was good about this iteration was that latest messages would be visible on the Lainnya page with a way for users to filter different kinds of messages. However this design wouldn't scale well if there were many channels. Think how filters work on Gojek Home's shuffles. Same problem.\n\nWhen we decided to adopt the Chat SDK, it came with a constraint that the view would be a chat window.\n\nSo this constraint causes us to have limited explorations for the channel view. Based on this, here are two iterations that could be possible.\n\n#### Iteration 1:\n\nIteration 1 is having a list of channels on the second page, but without the full message so users would need to make an additional click through to get the full message.\n\n#### Iteration 2:\n\nThis exploration attempts to use a notifier informing user about a new message. It could include the text of the message or a generic '1 new message'. In the chat window, we can see the latest message of a channel up front without clicking again to see the message. Even CTAs could be visible here.\n\nSo we went ahead with user-testing with both these iterations, and 'Iteration 2' came out successful.\n\n#### Key Learnings from the research\n\n1. People may ignore the position of the Inbox because of its proximity to the logout button\n\n2. The inbox icon was not understood, so we switched to the envelope icon and called it 'Kotak Pesan'","src/content/work/gobiz-inbox/index.md","e41b0d64e917328f",{"html":136,"metadata":137},"\u003Cp>The Gojek Chat SDK was built to support products wanting to integrate chat into their flows. However like many other platformized products, they end up being looked as solutions for use cases they were not designed for. The GoBiz inbox requirement wasn’t my first experience with dog fooding, but it was one that I was able to influence positively for the benefit of the users.\u003C/p>\n\u003Cp>We wanted to build an Inbox, an in-app channel for notifying our users. We just needed one-way communication. I do not understand the reason behind why product pushed to use the SDK, despite the arguments that the SDK wasn’t able to support our web product and wasn’t designed to communicate business updates.\u003C/p>\n\u003Ch3 id=\"chat-is-chat-not-inbox\">Chat is chat, not inbox:\u003C/h3>\n\u003Cp>I created a document to explain what that decision meant for the app.\nIf we use the chat sdk, then in the future as other teams build on the chat platform, we should plan to group all kinds of chat in a single space. This would align with the mental model of the user. This space would be the go-to place to follow up on your “conversations”, whether its about onboarding a new outlet or following up about your GoFresh order.\u003C/p>\n\u003Cp>\u003Cem>Decision:\u003C/em> We decided that all chats will show up in Inbox but we will need to visually separate them from the business chats. This is something that the Chat team had not yet designed for.\u003C/p>\n\u003Ch3 id=\"where-should-inboxchat-go\">Where should Inbox/chat go?\u003C/h3>\n\u003Cp>Given that Inbox is something we are considering for communication, it should be easily accessible and indicate unread chats. Given the current structure of the GoBiz app, we could only think of 2 possible positions for the Inbox.\u003C/p>\n\u003Cp>However neither of these positions fulfill the conditions of\u003C/p>\n\u003Col>\n\u003Cli>\n\u003Cp>Visibility of new messages: The red dot on Lainnya can’t showcase a number since there are several other modules which have a no-number indication.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Accessible from various parts of our app: A gofood merchant would jump right to the Orders inbox when they open the app and has no need to aware of this “notification’\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003Cp>\u003Cem>Decision:\u003C/em> However without the redesign being prioritized, we decided to keep the entry point on the top right of the ‘Lainnya’ page.\u003C/p>\n\u003Ch3 id=\"shuffle-vs-inbox\">Shuffle vs Inbox:\u003C/h3>\n\u003Col>\n\u003Cli>\n\u003Cp>Currently there can be overlaps. Overlaps may lead to reduction in importance of Inbox content.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Can ‘Promo’ channel in Inbox be completely replaced by a shuffle card channel on lainnya? because promos need segmentation. Inbox may not work that way.\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003Cp>\u003Cem>Decision:\u003C/em> No decision yet\u003C/p>\n\u003Ch3 id=\"design-iterations\">Design iterations\u003C/h3>\n\u003Cp>The Inbox requirement wasn’t a new one. 11 months ago, Saneef had worked on how we could introduce communication channels(banner and inbox) in our /existing/ app. \u003Ca href=\"https://share.goabstract.com/8af61eee-de93-4f63-b0f8-64922742a29e?mode=design&sha=875263ee629f633ddd9229602605e3870884c3da\">(Aside: His redesign had ‘Inbox’ as a tab on the bottom navigation)\u003C/a>\u003C/p>\n\u003Cp>What was good about this iteration was that latest messages would be visible on the Lainnya page with a way for users to filter different kinds of messages. However this design wouldn’t scale well if there were many channels. Think how filters work on Gojek Home’s shuffles. Same problem.\u003C/p>\n\u003Cp>When we decided to adopt the Chat SDK, it came with a constraint that the view would be a chat window.\u003C/p>\n\u003Cp>So this constraint causes us to have limited explorations for the channel view. Based on this, here are two iterations that could be possible.\u003C/p>\n\u003Ch4 id=\"iteration-1\">Iteration 1:\u003C/h4>\n\u003Cp>Iteration 1 is having a list of channels on the second page, but without the full message so users would need to make an additional click through to get the full message.\u003C/p>\n\u003Ch4 id=\"iteration-2\">Iteration 2:\u003C/h4>\n\u003Cp>This exploration attempts to use a notifier informing user about a new message. It could include the text of the message or a generic ‘1 new message’. In the chat window, we can see the latest message of a channel up front without clicking again to see the message. Even CTAs could be visible here.\u003C/p>\n\u003Cp>So we went ahead with user-testing with both these iterations, and ‘Iteration 2’ came out successful.\u003C/p>\n\u003Ch4 id=\"key-learnings-from-the-research\">Key Learnings from the research\u003C/h4>\n\u003Col>\n\u003Cli>\n\u003Cp>People may ignore the position of the Inbox because of its proximity to the logout button\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>The inbox icon was not understood, so we switched to the envelope icon and called it ‘Kotak Pesan’\u003C/p>\n\u003C/li>\n\u003C/ol>",{"headings":138,"localImagePaths":160,"remoteImagePaths":161,"frontmatter":162,"imagePaths":163},[139,142,145,148,151,154,157],{"depth":44,"slug":140,"text":141},"chat-is-chat-not-inbox","Chat is chat, not inbox:",{"depth":44,"slug":143,"text":144},"where-should-inboxchat-go","Where should Inbox/chat go?",{"depth":44,"slug":146,"text":147},"shuffle-vs-inbox","Shuffle vs Inbox:",{"depth":44,"slug":149,"text":150},"design-iterations","Design iterations",{"depth":57,"slug":152,"text":153},"iteration-1","Iteration 1:",{"depth":57,"slug":155,"text":156},"iteration-2","Iteration 2:",{"depth":57,"slug":158,"text":159},"key-learnings-from-the-research","Key Learnings from the research",[],[],{"title":128,"description":129,"year":130,"company":131,"status":99},[],"gojek",{"id":164,"data":166,"body":171,"filePath":172,"assetImports":173,"digest":189,"rendered":190},{"title":167,"description":168,"image":169,"year":170,"company":131,"status":19},"Designing for Gojek's Merchants","A brief overview of the work I did at GoBiz, Gojek's Merchant Platform","__ASTRO_IMAGE_./QRIS-gobiz.webp","2019-2021","### Role\nFrom 2019-2022, I worked on the merchant side of Gojek. GoBiz, Gojek's merchant platform, catered to 1M+ merchants across Indonesia, Vietnam(closed down in Sep 2024) and Thailand (sold to AirAsia in July 2021). The GoBiz Platform served GoFood merchants, GoPay Micro-merchants, as well as Enterprise merchants.\n\nI started off as the designer tasked with redesigning the GoBiz Android app and eventually moved to lead the design on the GoBiz Platform contributing towards the design of the GoBiz app and website, the Spots app and the Midtrans website. Over this period of time, the design team at GoBiz grew to 12 designers with the mergers and acquisitions of Midtrans, Kartuku and Moka POS before eventually breaking up pre-IPO. \n\n## GoBiz app\n[GO-RESTO](https://www.gojek.io/blog/whats-cooking-diving-into-kitchens-for-gobiz) ,released on 2017, was the app that our GO-FOOD partner merchants would use to receive orders, manage their catalogue and other restaurant information. But with the creation of the Merchant vertical, now GO-RESTO was to have a much larger vision. I joined the team as their designer in 2018 and worked on the redesign to convert it into a Super app. \n\nWhen we started working on this, we were worried that our users would feel isolated by this change in the interface which were driven by our business needs. \n\nSo as always, we began with the users.\n\nWe did a merchant segmentation study and then selected a few merchants from each of these segments to better understand their needs and came up with the following objectives.\n\n#### The objectives of the redesign were\n1. \u003Cins>Scalability:\u003C/ins> The main navigation (shown below) was a hamburger menu. As Go-RESTO had kept adding new features, adding them to the navbar as an when they were ready was how the product had scaled. However now we needed an information architecture that would work for GoFood, GoPay, and other merchants.\n2. \u003Cins>UI refresh:\u003C/ins> With the move, we rebranded from 'Go-Resto' to 'GoBiz' and adopted the newly minted [Asphalt 1.0](https://www.gojek.io/blog/of-dreams-deadlines-and-a-design-system) design language system. Due to the timing of the redesign, we were the first app in the Gojek ecosystem to be completely built on the new Asphalt design system. \n3. \u003Cins>Platformization\u003C/ins>: As Gojek grew, in-order to reduce duplication of efforts across multiple verticals, having a platform like GoBiz to build on would be beneficial for teams building for merchant partners like GoPay, GoMart, etc.\n\n#### Design Process:\n\n![Rough Sketches](rough-sketches.webp)\n![One of the early iterations](Early-explorations.png)\n![Redesigned screens in Sketch for GoBiz](gobiz-v1.png)\n\nLooking at existing analytics helped me make decision on the information architecture. Once we finalised the navigation with all the stakeholders, we moved into iterating solutions before finalizing on the design.\n\n#### User testing:\nWe decided to have a pilot group of merchants for the release and the research team conducted a user diary research with them. \nAs we had not changed any major flow, we did not find any issues. \n\n![GoBiz Navigation; before and after](gobiz-nav.jpg)\n#### Learnings post release:\nOnce we released we started seeing feedback on the playstore asking us why we had hidden the customer contact. In the design, in the interest of showing the list of ordered items, we had moved the customer contact behind an overflow menu. Our analytics had shown low usage of this feature and we felt we could move it and add an onboarding tooltip for the merchants\n\nHowever these complaints persisted and we followed up with a few merchants to understand the problem. We learned that though the merchants did not end up calling via the app (because the app may not have the phone balance), they would want to see the customer phone number either to collect it for marketing purpose, to call from another number or to identify if its a fraud order. \n\nBased on the feedback, we took a call to re-instate the customer number back on the order details screen. \n![There's a lot more back and forth than we expected](gobiz-order.png)\n\n#### Impact:\n\n![GoBiz Ratings](GoBiz-ratings.webp)\n\nThe ratings of the GoBiz Super app saw a positive growth from 3.7 when we started work to 4.5+ post release[^1].\n\n## GoBiz Dashboard\nSometimes you just inherit a product that has not been loved. The GoBiz dashboard was built for enterprise merchants by forking an internal portal. The portal was built on an internal front end framework “[Tanjidor](https://en.wikipedia.org/wiki/Tanjidor)” and the designers used to design in the browser and this meant that there were no design files. This meant that there was a dependency on the existing designers. So we decided to pick it up as a design initiative.\n\n#### Objectives of the redesign:\n1. Reduce dependancy on the existing designer by\n2. Make the dashboard accessible via mobile web\n\n#### What we did:\nIn 2019, we (product design and research) conducted a heuristic evaluation to identify key issues. But post that due to issues with design bandwidth, the project was deprioritised. \n\nFast forward to 2020, Hendri joined us on the GoBiz team and I assigned him to start work on the GoBiz Dashboard redesign as a way to familiarise himself with the product. \n\nWe decided to design anything new with our web design system and not do it in the browser. Due to some luck, the “platformisation” of the Dashboard project got prioritised that quarter. However the PM was going to do it without a change to the UI. I convinced her to switch to the new UI. But given the sprint was beginning in 2 weeks, we were short of time. So we got a list of pages to work on a priority basis and started exploring. A lot of work was already done by Hendri however we had to now make the whole site look coherent. \n\n> You can arrive at a different output using the same design system.\n\nWe experimented with spacing and separators, navigation menu designs and modal overlays in the next 10 days to finalise the boilerplate for all the pages. Oh and yeah we also made it responsive. \n\n![](Gobiz-web.png)\n\n\n![After our redesign with Asphalt Web](Gobiz-web3.png)\n#### What we could not do:\n* Fix the information architecture issues in every page. \n* Figure out a table design that works well on mobile and desktop\n\n#### Outcome:\nThe GoMart designers were able to use the design system and build their module on the Dashboard with limited dependency on our team. \n\n\n## The Spots app\n![Left: Original, Right: Redesigned](spots.png)\nThe SPOTS app was a point of sales app on a Landi device. We were selling these to offline merchants to let them collect payment via offline modes like credit card, debit card and QR. \n\nThe app they were using was a reskinned version of the default app provided by Landi(image on the left). \n\nI was asked to help out with it and I worked on a refresh for the app on a short timeline(image on the right) \n\n![](QRIS-gobiz.webp)\n\nWe later integrated this into the POS application on the GoBiz app. \n\n# Midtrans\nIn 2020, the Midtrans merchant onboarding was prioritized due to an external collaboration with Whatsapp. \n\n![](midtrans-old.png)\n\nGiven the urgency, I decided to ask Riyadhi to help the team with the wireframes. Riyadhi had previously worked on the merchant onboarding flow for the GoBiz app and I felt this would help us speed up the process. \n\nWe had just completed the platformization exercise so Hendri and Firman were proficient with the new design system. The dev team too was confident that using the web design system was the best decision. This also made the flow mobile web compatible which was one of the identified merchant pain points. \n\n![](midtrans-onboarding-1.png)\n![](midtrans-onboarding-2.png)\n\nSo we shipped the new onboarding and saw lot of reduction in the drop offs. \n\n![](midtrans-onboarding-impact.png)\n\n### Outcome:\nThis project exposed most of the team to the ‘merchant onboarding’ problem space and a surprising side-effect of this was that project handover of the ‘corporate onboarding’ project could be handled by Hendri when Riyadhi was affected by Covid-19.\n\n#### Miscellaneous:\nI consulted on the GoBiz and the Midtrans marketing website. \n\n[^1]: Road to a Merchant Super App on the Gojek Blog https://www.gojek.io/blog/the-road-to-a-merchant-superapp","src/content/work/gojek/index.md",[174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],"rough-sketches.webp","Early-explorations.png","gobiz-v1.png","gobiz-nav.jpg","gobiz-order.png","GoBiz-ratings.webp","Gobiz-web.png","Gobiz-web3.png","spots.png","QRIS-gobiz.webp","midtrans-old.png","midtrans-onboarding-1.png","midtrans-onboarding-2.png","midtrans-onboarding-impact.png","./QRIS-gobiz.webp","6f87550f560374ba",{"html":191,"metadata":192},"\u003Ch3 id=\"role\">Role\u003C/h3>\n\u003Cp>From 2019-2022, I worked on the merchant side of Gojek. GoBiz, Gojek’s merchant platform, catered to 1M+ merchants across Indonesia, Vietnam(closed down in Sep 2024) and Thailand (sold to AirAsia in July 2021). The GoBiz Platform served GoFood merchants, GoPay Micro-merchants, as well as Enterprise merchants.\u003C/p>\n\u003Cp>I started off as the designer tasked with redesigning the GoBiz Android app and eventually moved to lead the design on the GoBiz Platform contributing towards the design of the GoBiz app and website, the Spots app and the Midtrans website. Over this period of time, the design team at GoBiz grew to 12 designers with the mergers and acquisitions of Midtrans, Kartuku and Moka POS before eventually breaking up pre-IPO.\u003C/p>\n\u003Ch2 id=\"gobiz-app\">GoBiz app\u003C/h2>\n\u003Cp>\u003Ca href=\"https://www.gojek.io/blog/whats-cooking-diving-into-kitchens-for-gobiz\">GO-RESTO\u003C/a> ,released on 2017, was the app that our GO-FOOD partner merchants would use to receive orders, manage their catalogue and other restaurant information. But with the creation of the Merchant vertical, now GO-RESTO was to have a much larger vision. I joined the team as their designer in 2018 and worked on the redesign to convert it into a Super app.\u003C/p>\n\u003Cp>When we started working on this, we were worried that our users would feel isolated by this change in the interface which were driven by our business needs.\u003C/p>\n\u003Cp>So as always, we began with the users.\u003C/p>\n\u003Cp>We did a merchant segmentation study and then selected a few merchants from each of these segments to better understand their needs and came up with the following objectives.\u003C/p>\n\u003Ch4 id=\"the-objectives-of-the-redesign-were\">The objectives of the redesign were\u003C/h4>\n\u003Col>\n\u003Cli>\u003Cins>Scalability:\u003C/ins> The main navigation (shown below) was a hamburger menu. As Go-RESTO had kept adding new features, adding them to the navbar as an when they were ready was how the product had scaled. However now we needed an information architecture that would work for GoFood, GoPay, and other merchants.\u003C/li>\n\u003Cli>\u003Cins>UI refresh:\u003C/ins> With the move, we rebranded from ‘Go-Resto’ to ‘GoBiz’ and adopted the newly minted \u003Ca href=\"https://www.gojek.io/blog/of-dreams-deadlines-and-a-design-system\">Asphalt 1.0\u003C/a> design language system. Due to the timing of the redesign, we were the first app in the Gojek ecosystem to be completely built on the new Asphalt design system.\u003C/li>\n\u003Cli>\u003Cins>Platformization\u003C/ins>: As Gojek grew, in-order to reduce duplication of efforts across multiple verticals, having a platform like GoBiz to build on would be beneficial for teams building for merchant partners like GoPay, GoMart, etc.\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"design-process\">Design Process:\u003C/h4>\n\u003Cdiv class=\"image-figure-container\">\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"rough-sketches.webp","alt":"Rough Sketches","index":0}\">\u003Cfigcaption>Rough Sketches\u003C/figcaption>\u003C/figure>\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"Early-explorations.png","alt":"One of the early iterations","index":0}\">\u003Cfigcaption>One of the early iterations\u003C/figcaption>\u003C/figure>\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"gobiz-v1.png","alt":"Redesigned screens in Sketch for GoBiz","index":0}\">\u003Cfigcaption>Redesigned screens in Sketch for GoBiz\u003C/figcaption>\u003C/figure>\u003C/div>\n\u003Cp>Looking at existing analytics helped me make decision on the information architecture. Once we finalised the navigation with all the stakeholders, we moved into iterating solutions before finalizing on the design.\u003C/p>\n\u003Ch4 id=\"user-testing\">User testing:\u003C/h4>\n\u003Cp>We decided to have a pilot group of merchants for the release and the research team conducted a user diary research with them.\nAs we had not changed any major flow, we did not find any issues.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"gobiz-nav.jpg","alt":"GoBiz Navigation; before and after","index":0}\">\u003Cfigcaption>GoBiz Navigation; before and after\u003C/figcaption>\u003C/figure>\n\u003Ch4 id=\"learnings-post-release\">Learnings post release:\u003C/h4>\n\u003Cp>Once we released we started seeing feedback on the playstore asking us why we had hidden the customer contact. In the design, in the interest of showing the list of ordered items, we had moved the customer contact behind an overflow menu. Our analytics had shown low usage of this feature and we felt we could move it and add an onboarding tooltip for the merchants\u003C/p>\n\u003Cp>However these complaints persisted and we followed up with a few merchants to understand the problem. We learned that though the merchants did not end up calling via the app (because the app may not have the phone balance), they would want to see the customer phone number either to collect it for marketing purpose, to call from another number or to identify if its a fraud order.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"gobiz-order.png","alt":"There's a lot more back and forth than we expected","index":0}\">\u003Cfigcaption>There's a lot more back and forth than we expected\u003C/figcaption>\u003C/figure>\n\u003Ch4 id=\"impact\">Impact:\u003C/h4>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"GoBiz-ratings.webp","alt":"GoBiz Ratings","index":0}\">\u003Cfigcaption>GoBiz Ratings\u003C/figcaption>\u003C/figure>\n\u003Cp>The ratings of the GoBiz Super app saw a positive growth from 3.7 when we started work to 4.5+ post release\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Ch2 id=\"gobiz-dashboard\">GoBiz Dashboard\u003C/h2>\n\u003Cp>Sometimes you just inherit a product that has not been loved. The GoBiz dashboard was built for enterprise merchants by forking an internal portal. The portal was built on an internal front end framework “\u003Ca href=\"https://en.wikipedia.org/wiki/Tanjidor\">Tanjidor\u003C/a>” and the designers used to design in the browser and this meant that there were no design files. This meant that there was a dependency on the existing designers. So we decided to pick it up as a design initiative.\u003C/p>\n\u003Ch4 id=\"objectives-of-the-redesign\">Objectives of the redesign:\u003C/h4>\n\u003Col>\n\u003Cli>Reduce dependancy on the existing designer by\u003C/li>\n\u003Cli>Make the dashboard accessible via mobile web\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"what-we-did\">What we did:\u003C/h4>\n\u003Cp>In 2019, we (product design and research) conducted a heuristic evaluation to identify key issues. But post that due to issues with design bandwidth, the project was deprioritised.\u003C/p>\n\u003Cp>Fast forward to 2020, Hendri joined us on the GoBiz team and I assigned him to start work on the GoBiz Dashboard redesign as a way to familiarise himself with the product.\u003C/p>\n\u003Cp>We decided to design anything new with our web design system and not do it in the browser. Due to some luck, the “platformisation” of the Dashboard project got prioritised that quarter. However the PM was going to do it without a change to the UI. I convinced her to switch to the new UI. But given the sprint was beginning in 2 weeks, we were short of time. So we got a list of pages to work on a priority basis and started exploring. A lot of work was already done by Hendri however we had to now make the whole site look coherent.\u003C/p>\n\u003Cblockquote>\n\u003Cp>You can arrive at a different output using the same design system.\u003C/p>\n\u003C/blockquote>\n\u003Cp>We experimented with spacing and separators, navigation menu designs and modal overlays in the next 10 days to finalise the boilerplate for all the pages. Oh and yeah we also made it responsive.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"Gobiz-web.png","alt":"","index":0}\">\u003C/figure>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"Gobiz-web3.png","alt":"After our redesign with Asphalt Web","index":0}\">\u003Cfigcaption>After our redesign with Asphalt Web\u003C/figcaption>\u003C/figure>\n\u003Ch4 id=\"what-we-could-not-do\">What we could not do:\u003C/h4>\n\u003Cul>\n\u003Cli>Fix the information architecture issues in every page.\u003C/li>\n\u003Cli>Figure out a table design that works well on mobile and desktop\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"outcome\">Outcome:\u003C/h4>\n\u003Cp>The GoMart designers were able to use the design system and build their module on the Dashboard with limited dependency on our team.\u003C/p>\n\u003Ch2 id=\"the-spots-app\">The Spots app\u003C/h2>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"spots.png","alt":"Left: Original, Right: Redesigned","index":0}\">\u003Cfigcaption>Left: Original, Right: Redesigned\u003C/figcaption>\u003C/figure>\n\u003Cp>The app they were using was a reskinned version of the default app provided by Landi(image on the left).\u003C/p>\n\u003Cp>I was asked to help out with it and I worked on a refresh for the app on a short timeline(image on the right)\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"QRIS-gobiz.webp","alt":"","index":0}\">\u003C/figure>\n\u003Cp>We later integrated this into the POS application on the GoBiz app.\u003C/p>\n\u003Ch1 id=\"midtrans\">Midtrans\u003C/h1>\n\u003Cp>In 2020, the Midtrans merchant onboarding was prioritized due to an external collaboration with Whatsapp.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"midtrans-old.png","alt":"","index":0}\">\u003C/figure>\n\u003Cp>Given the urgency, I decided to ask Riyadhi to help the team with the wireframes. Riyadhi had previously worked on the merchant onboarding flow for the GoBiz app and I felt this would help us speed up the process.\u003C/p>\n\u003Cp>We had just completed the platformization exercise so Hendri and Firman were proficient with the new design system. The dev team too was confident that using the web design system was the best decision. This also made the flow mobile web compatible which was one of the identified merchant pain points.\u003C/p>\n\u003Cdiv class=\"image-figure-container\">\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"midtrans-onboarding-1.png","alt":"","index":0}\">\u003C/figure>\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"midtrans-onboarding-2.png","alt":"","index":0}\">\u003C/figure>\u003C/div>\n\u003Cp>So we shipped the new onboarding and saw lot of reduction in the drop offs.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"midtrans-onboarding-impact.png","alt":"","index":0}\">\u003C/figure>\n\u003Ch3 id=\"outcome-1\">Outcome:\u003C/h3>\n\u003Cp>This project exposed most of the team to the ‘merchant onboarding’ problem space and a surprising side-effect of this was that project handover of the ‘corporate onboarding’ project could be handled by Hendri when Riyadhi was affected by Covid-19.\u003C/p>\n\u003Ch4 id=\"miscellaneous\">Miscellaneous:\u003C/h4>\n\u003Cp>I consulted on the GoBiz and the Midtrans marketing website.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Road to a Merchant Super App on the Gojek Blog \u003Ca href=\"https://www.gojek.io/blog/the-road-to-a-merchant-superapp\">https://www.gojek.io/blog/the-road-to-a-merchant-superapp\u003C/a> \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":193,"localImagePaths":240,"remoteImagePaths":241,"frontmatter":242,"imagePaths":243},[194,195,198,201,204,207,210,212,215,218,221,224,227,230,234,236,239],{"depth":44,"slug":38,"text":39},{"depth":37,"slug":196,"text":197},"gobiz-app","GoBiz app",{"depth":57,"slug":199,"text":200},"the-objectives-of-the-redesign-were","The objectives of the redesign were",{"depth":57,"slug":202,"text":203},"design-process","Design Process:",{"depth":57,"slug":205,"text":206},"user-testing","User testing:",{"depth":57,"slug":208,"text":209},"learnings-post-release","Learnings post release:",{"depth":57,"slug":79,"text":211},"Impact:",{"depth":37,"slug":213,"text":214},"gobiz-dashboard","GoBiz Dashboard",{"depth":57,"slug":216,"text":217},"objectives-of-the-redesign","Objectives of the redesign:",{"depth":57,"slug":219,"text":220},"what-we-did","What we did:",{"depth":57,"slug":222,"text":223},"what-we-could-not-do","What we could not do:",{"depth":57,"slug":225,"text":226},"outcome","Outcome:",{"depth":37,"slug":228,"text":229},"the-spots-app","The Spots app",{"depth":231,"slug":232,"text":233},1,"midtrans","Midtrans",{"depth":44,"slug":235,"text":226},"outcome-1",{"depth":57,"slug":237,"text":238},"miscellaneous","Miscellaneous:",{"depth":37,"slug":85,"text":86},[174,175,176,177,178,179,180,181,182,183,184,185,186,187],[],{"title":167,"description":168,"year":170,"company":131,"status":19,"image":183},[174,175,176,177,178,179,180,181,182,183,184,185,186,187],"hiring-jiva",{"id":244,"data":246,"body":250,"filePath":251,"digest":252,"rendered":253},{"title":247,"description":248,"year":249,"status":99},"Hiring Product Designers at Jiva","An overview of the product design hiring process at Jiva that we used to scale to 11+ designers","2022-2024","When I joined Jiva in January of 2022, as the Senior Design Manager of Product Design, we were a team of 2; me and Sai. We had to start building a team. I’ve never had the opportunity to build a team from scratch and it felt scary at first.\nWe had no defined process nor an evaluation criteria, just a product designer job description. It was well structured job description and spoke to the generalist designers we wanted to recruit but we were aware we needed to scale.\n\nSo with Nav's guidance, we designed a simple hiring flow keeping the good part of the older scrappy process while being mindful about the candidates and their time. \n\nOur process therefore was quite simple; \n\n### Round 0: Shortlisting Candidates\nWith our job description posted, we looked for candidates and their submissions to shortlist the ones we wanted to speak to. When Jiva was less known, we barely had any interested candidates and shortlisting was very easy.\nBut for the last set of job openings, we had a lot of demand making it impossible to screen efficiently. We encouraged people to send us Cover letters while applying rather than applying via the portal.\nThis acted as a fairly effective screening condition as not many ended up emailing us.\n\n### Round 1: Screening Call\nThis is the first experience a candidate has of Jiva’s design team and we want it to be the best.\nWe want to make the candidate comfortable and help them understand what Jiva is and what working here would be like.\nThis was the round where we discussed compensation in brief so that we could set expectations both upstream (with HR and leadership) and downstream (with the candidate).\nThe hiring manager (i.e., me) was the best person to have this conversation with the candidate.\n\nFor a candidate to make it through, they just needed to feel like they knew how to design, work in the team and someone I would want to have on my team.\nThe folks who blew my mind in this round inadvertently went to be key members of the team and probably the best skilled designers I've worked with.\n\n### Round 2: Presentation Round\nSince we were a small team with a short candidate pipeline, we didn't see value in having take home assignments or whiteboarding sessions, instead we opted for the presentation round. The jury for this round was composed\nof the other designers. We designed the jury based on the candidate. There would be a cultural mix of nationalities, genders and design disciplines in every jury panel. What we mainly measured in this round was\nthe capabilities of a product designer, (eventually we used our Job levels for this evaluation) and how they vibed with the jury panel. It wasn't enough that you had good work, you needed\nto fit in. Controversial maybe? but I felt strongly that getting people to play well together is key to building good design teams. In time, I've come to realize that just because you have technical chops\ndoesn't make you a good product designer. You also need to be kind, empathetic and collaborative. Technical skills can be learned, these values can not.\n\nIf you made it past this round, \"Congrats, welcome to the Jiva design team\" 🙌🏽\n\nFor everyone we rejected in Round 2, I tried to send a personal email to them explaining why they didn't make it. But this was hard to follow 100% of the time and I'm sure I forgot to send a few.\n\n### Round 3(?): Stakeholder Round\nFor L3 (our highest IC level) hiring, we added an extra round. \nThis was a chat with a Lead product manager to help gauge how the designer would fit within the Product and their product thinking abilities.\nThese designers would function like leads and own design for their product vertical. \n\n### Round 4: HR Round\nThere was a final round(or two) where either Nav or HR would have a conversation with the employee and dealt with the technicalities around compensation and hiring policies.\n\nIn time, we grew the team to 11 product designers working on 5+ mobile and web apps across multiple business systems (farmer, collector, retailer).","src/content/work/hiring-jiva/index.md","a71264957ff07f2d",{"html":254,"metadata":255},"\u003Cp>When I joined Jiva in January of 2022, as the Senior Design Manager of Product Design, we were a team of 2; me and Sai. We had to start building a team. I’ve never had the opportunity to build a team from scratch and it felt scary at first.\nWe had no defined process nor an evaluation criteria, just a product designer job description. It was well structured job description and spoke to the generalist designers we wanted to recruit but we were aware we needed to scale.\u003C/p>\n\u003Cp>So with Nav’s guidance, we designed a simple hiring flow keeping the good part of the older scrappy process while being mindful about the candidates and their time.\u003C/p>\n\u003Cp>Our process therefore was quite simple;\u003C/p>\n\u003Ch3 id=\"round-0-shortlisting-candidates\">Round 0: Shortlisting Candidates\u003C/h3>\n\u003Cp>With our job description posted, we looked for candidates and their submissions to shortlist the ones we wanted to speak to. When Jiva was less known, we barely had any interested candidates and shortlisting was very easy.\nBut for the last set of job openings, we had a lot of demand making it impossible to screen efficiently. We encouraged people to send us Cover letters while applying rather than applying via the portal.\nThis acted as a fairly effective screening condition as not many ended up emailing us.\u003C/p>\n\u003Ch3 id=\"round-1-screening-call\">Round 1: Screening Call\u003C/h3>\n\u003Cp>This is the first experience a candidate has of Jiva’s design team and we want it to be the best.\nWe want to make the candidate comfortable and help them understand what Jiva is and what working here would be like.\nThis was the round where we discussed compensation in brief so that we could set expectations both upstream (with HR and leadership) and downstream (with the candidate).\nThe hiring manager (i.e., me) was the best person to have this conversation with the candidate.\u003C/p>\n\u003Cp>For a candidate to make it through, they just needed to feel like they knew how to design, work in the team and someone I would want to have on my team.\nThe folks who blew my mind in this round inadvertently went to be key members of the team and probably the best skilled designers I’ve worked with.\u003C/p>\n\u003Ch3 id=\"round-2-presentation-round\">Round 2: Presentation Round\u003C/h3>\n\u003Cp>Since we were a small team with a short candidate pipeline, we didn’t see value in having take home assignments or whiteboarding sessions, instead we opted for the presentation round. The jury for this round was composed\nof the other designers. We designed the jury based on the candidate. There would be a cultural mix of nationalities, genders and design disciplines in every jury panel. What we mainly measured in this round was\nthe capabilities of a product designer, (eventually we used our Job levels for this evaluation) and how they vibed with the jury panel. It wasn’t enough that you had good work, you needed\nto fit in. Controversial maybe? but I felt strongly that getting people to play well together is key to building good design teams. In time, I’ve come to realize that just because you have technical chops\ndoesn’t make you a good product designer. You also need to be kind, empathetic and collaborative. Technical skills can be learned, these values can not.\u003C/p>\n\u003Cp>If you made it past this round, “Congrats, welcome to the Jiva design team” 🙌🏽\u003C/p>\n\u003Cp>For everyone we rejected in Round 2, I tried to send a personal email to them explaining why they didn’t make it. But this was hard to follow 100% of the time and I’m sure I forgot to send a few.\u003C/p>\n\u003Ch3 id=\"round-3-stakeholder-round\">Round 3(?): Stakeholder Round\u003C/h3>\n\u003Cp>For L3 (our highest IC level) hiring, we added an extra round.\nThis was a chat with a Lead product manager to help gauge how the designer would fit within the Product and their product thinking abilities.\nThese designers would function like leads and own design for their product vertical.\u003C/p>\n\u003Ch3 id=\"round-4-hr-round\">Round 4: HR Round\u003C/h3>\n\u003Cp>There was a final round(or two) where either Nav or HR would have a conversation with the employee and dealt with the technicalities around compensation and hiring policies.\u003C/p>\n\u003Cp>In time, we grew the team to 11 product designers working on 5+ mobile and web apps across multiple business systems (farmer, collector, retailer).\u003C/p>",{"headings":256,"localImagePaths":272,"remoteImagePaths":273,"frontmatter":274,"imagePaths":275},[257,260,263,266,269],{"depth":44,"slug":258,"text":259},"round-0-shortlisting-candidates","Round 0: Shortlisting Candidates",{"depth":44,"slug":261,"text":262},"round-1-screening-call","Round 1: Screening Call",{"depth":44,"slug":264,"text":265},"round-2-presentation-round","Round 2: Presentation Round",{"depth":44,"slug":267,"text":268},"round-3-stakeholder-round","Round 3(?): Stakeholder Round",{"depth":44,"slug":270,"text":271},"round-4-hr-round","Round 4: HR Round",[],[],{"title":247,"description":248,"year":249,"status":99},[],"international",{"id":276,"data":278,"body":282,"filePath":283,"assetImports":284,"digest":294,"rendered":295},{"title":279,"description":280,"image":281,"year":130,"company":131,"status":19},"Taking GoBiz international","What I learnt from launching Gojek's GoBiz app for different Southeast Asian Countries","__ASTRO_IMAGE_./thai-header.jpeg","At Practo, I had my first experience designing for markets outside India. Singapore was one of the strongest regions for the Practo Ray product, and it encouraged us to build features tailored to their dentists like [Dental Charting](https://help.practo.com/practo-ray/emr/dental-emr/all-about-dental-charting/).\n\nBy 2015, we began rolling out the Practo Ray app to Malaysia, Indonesia, the Philippines, and Brazil. Looking back, our localisation efforts were still fairly shallow. Most of the adjustments were limited to currency, date and number formatting, or small copy tweaks.\n\nScaling the GoBiz app to Thailand, Vietnam, and Singapore was completely different. Just translating the interface was not an option. We did research to understand local restaurant workflows (e.g., Hawker Centres in Singapore), worked with the local team to understand local terminologies and cultural nuances, and studied how food ordering worked.\n\n### Collaboration and Organization\nBut first, every project needs a start. GoBiz functioned as a platform with multiple teams contributing to it. So when we prepared for a new country launch, it became crucial to have a transparent and collaborative approach. That's where Asana came in. I created the 'GoBiz International Design' template and assigned tasks to the different designers. This functioned as our team's design tracker and was referenced during the weekly SOS meetings (Scrum of Scrums) run by the program managers.\n\n![The GoBiz International Design template in Asana](./asana.png)\n\nFor the design work itself, we set up a new Sketch file in Abstract for every country launch instead of adding changes to the existing files. This kept file sizes manageable and reduced merge conflicts in the Master branch. It also made it much easier for other teams to locate the relevant designs without needing to check with us.\n\n### Typography\nDesigning for languages that use only Latin characters is fairly straightforward because most fonts support them. But when you need to support non-latin scripts like Thai, Vietnamese, and Simplified Chinese, things get a little complicated typographically.\nOur brand typeface, Maison Neue, did not support these scripts, so the app fell back to system fonts. In Thailand, this caused visible inconsistencies in size and styling.\nThis led to many merchants using their device accessibility settings to increase their font size, which caused our layouts to break.\n![Vietnamese rendering in Maison Neue](./viet.png)\n\nVietnamese had its own challenges. Missing glyphs resulted in broken, mismatched text because unsupported characters were rendered in a different fallback format. \nMaison Neue does not support several important Vietnamese glyphs such as ờ, ư, ằ, ố, ế, ữ, ả, ẻ, ễ, ỉ, ỏ, ủ, ư, ứ, ừ, ử, ữ, ự, ỷ.\n\nBy the time we started work on the Singapore app, I realized we needed to address this and sat down with the brand and design system leads to select a reliable fallback font. \nWe chose Noto Sans, which is free, widely supported, and covered all the scripts we needed. We replaced Maison Neue with Noto Sans in our GoBiz International app.\n\n##### P.S. \"wkwkwkwk\" and \"5555555\" are common ways of typing laughter in Indonesian and Thai texting culture.\n\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem;\">\n\n![Placing an order to test our flow](./dogfooding.webp)\n\n![Observing how they track orders](./user-behaviour.webp)\n\n![Checking out the competitors](./competitors.webp)\n\n\u003C/div>\n\n### Managing Copy\nManaging design files is relatively easy compared to managing multi-country copy. When we started supporting multiple languages, tools like Lokalise did not exist in our workflow. We relied entirely on Google Docs and Google Sheets.\n\n![How we managed copy in Google Docs](./copy-doc.png)\n\nWhen the product supported only Bahasa Indonesia, all GoBiz copy lived inside a single Google Doc. Over time, the document grew extremely long and slow. I had seen other teams use sheets for managing multi-language copy, so I worked with our UX writer, Lauditta, to create a template suited to our needs.\n\nDevelopers manage strings using “keys,” and we needed a way to map each key to the right line of copy. We realised too late how important this mapping was. Migrating retroactively meant spending a large amount of time copy-pasting, verifying strings, and searching through sheets.\n\n![How we managed copy in Google Sheets](./copy-sheets.png)\n\nWe also wanted screen references to help reviewers see copy in context. This was especially useful for UX writers in other countries, as well as QA and designers who did not speak the local languages. The release of Google Sheets’ “Insert picture in cell” feature was a huge help for this.\nGojek eventually moved to using [Lokalise](https://lokalise.com) for its copy management [^1] \n\n[^1]: You can read more about their International copy process on the blog by the Thai and Viet UX writer https://www.gojek.io/blog/language-no-bar-how-we-localise-ux-copies-at-gojek\n\n### Learnings\n- Scaling GoBiz across Thailand, Vietnam, and Singapore taught me that localisation is never something you add after the product is built. Even after launch, every new feature needs to be evaluated through the lens of each country. The same care you put into the initial rollout has to continue, otherwise the product quietly drifts back toward the needs of the base market.\n\n- There's also an organizational reality that often gets ignored. Supporting multiple markets properly sometimes requires reshaping how teams work, how decisions are made, and who is involved in the roadmap. But these shifts take time, and they rarely get prioritised unless there is a clear business outcome tied to them. \nAt Gojek, this misalignment became clear. Each international market operated under its own brand and leadership, which meant we couldn’t consistently involve those teams in product planning. As a result, our roadmaps naturally skewed toward Indonesia, and we only built out some must-have features for other countries. \n\n### Closing thoughts\n\nGojek eventually exited Thailand and Vietnam, and its presence in Singapore today is minimal. Looking back, designing GoBiz for other countries was a highly rewarding and learning experience. I got to experience new cultures and work with people from different nationalities. Those lessons stayed with us long after the product lines, org charts, and roadmaps changed.\n\n![The Gojek research team with a restaurant owner in Bangkok](./thai-research.jpeg)","src/content/work/international/index.md",[285,286,287,288,289,290,291,292,293],"./asana.png","./viet.png","./dogfooding.webp","./user-behaviour.webp","./competitors.webp","./copy-doc.png","./copy-sheets.png","./thai-research.jpeg","./thai-header.jpeg","9a8ca4c2f2519116",{"html":296,"metadata":297},"\u003Cp>At Practo, I had my first experience designing for markets outside India. Singapore was one of the strongest regions for the Practo Ray product, and it encouraged us to build features tailored to their dentists like \u003Ca href=\"https://help.practo.com/practo-ray/emr/dental-emr/all-about-dental-charting/\">Dental Charting\u003C/a>.\u003C/p>\n\u003Cp>By 2015, we began rolling out the Practo Ray app to Malaysia, Indonesia, the Philippines, and Brazil. Looking back, our localisation efforts were still fairly shallow. Most of the adjustments were limited to currency, date and number formatting, or small copy tweaks.\u003C/p>\n\u003Cp>Scaling the GoBiz app to Thailand, Vietnam, and Singapore was completely different. Just translating the interface was not an option. We did research to understand local restaurant workflows (e.g., Hawker Centres in Singapore), worked with the local team to understand local terminologies and cultural nuances, and studied how food ordering worked.\u003C/p>\n\u003Ch3 id=\"collaboration-and-organization\">Collaboration and Organization\u003C/h3>\n\u003Cp>But first, every project needs a start. GoBiz functioned as a platform with multiple teams contributing to it. So when we prepared for a new country launch, it became crucial to have a transparent and collaborative approach. That’s where Asana came in. I created the ‘GoBiz International Design’ template and assigned tasks to the different designers. This functioned as our team’s design tracker and was referenced during the weekly SOS meetings (Scrum of Scrums) run by the program managers.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./asana.png","alt":"The GoBiz International Design template in Asana","index":0}\">\u003Cfigcaption>The GoBiz International Design template in Asana\u003C/figcaption>\u003C/figure>\n\u003Cp>For the design work itself, we set up a new Sketch file in Abstract for every country launch instead of adding changes to the existing files. This kept file sizes manageable and reduced merge conflicts in the Master branch. It also made it much easier for other teams to locate the relevant designs without needing to check with us.\u003C/p>\n\u003Ch3 id=\"typography\">Typography\u003C/h3>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./viet.png","alt":"Vietnamese rendering in Maison Neue","index":0}\">\u003Cfigcaption>Vietnamese rendering in Maison Neue\u003C/figcaption>\u003C/figure>\n\u003Cp>Vietnamese had its own challenges. Missing glyphs resulted in broken, mismatched text because unsupported characters were rendered in a different fallback format.\u003Cbr>\nMaison Neue does not support several important Vietnamese glyphs such as ờ, ư, ằ, ố, ế, ữ, ả, ẻ, ễ, ỉ, ỏ, ủ, ư, ứ, ừ, ử, ữ, ự, ỷ.\u003C/p>\n\u003Cp>By the time we started work on the Singapore app, I realized we needed to address this and sat down with the brand and design system leads to select a reliable fallback font.\nWe chose Noto Sans, which is free, widely supported, and covered all the scripts we needed. We replaced Maison Neue with Noto Sans in our GoBiz International app.\u003C/p>\n\u003Ch5 id=\"ps-wkwkwkwk-and-5555555-are-common-ways-of-typing-laughter-in-indonesian-and-thai-texting-culture\">P.S. “wkwkwkwk” and “5555555” are common ways of typing laughter in Indonesian and Thai texting culture.\u003C/h5>\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem;\">\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./dogfooding.webp","alt":"Placing an order to test our flow","index":0}\">\u003Cfigcaption>Placing an order to test our flow\u003C/figcaption>\u003C/figure>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./user-behaviour.webp","alt":"Observing how they track orders","index":0}\">\u003Cfigcaption>Observing how they track orders\u003C/figcaption>\u003C/figure>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./competitors.webp","alt":"Checking out the competitors","index":0}\">\u003Cfigcaption>Checking out the competitors\u003C/figcaption>\u003C/figure>\n\u003C/div>\n\u003Ch3 id=\"managing-copy\">Managing Copy\u003C/h3>\n\u003Cp>Managing design files is relatively easy compared to managing multi-country copy. When we started supporting multiple languages, tools like Lokalise did not exist in our workflow. We relied entirely on Google Docs and Google Sheets.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./copy-doc.png","alt":"How we managed copy in Google Docs","index":0}\">\u003Cfigcaption>How we managed copy in Google Docs\u003C/figcaption>\u003C/figure>\n\u003Cp>When the product supported only Bahasa Indonesia, all GoBiz copy lived inside a single Google Doc. Over time, the document grew extremely long and slow. I had seen other teams use sheets for managing multi-language copy, so I worked with our UX writer, Lauditta, to create a template suited to our needs.\u003C/p>\n\u003Cp>Developers manage strings using “keys,” and we needed a way to map each key to the right line of copy. We realised too late how important this mapping was. Migrating retroactively meant spending a large amount of time copy-pasting, verifying strings, and searching through sheets.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./copy-sheets.png","alt":"How we managed copy in Google Sheets","index":0}\">\u003Cfigcaption>How we managed copy in Google Sheets\u003C/figcaption>\u003C/figure>\n\u003Cp>We also wanted screen references to help reviewers see copy in context. This was especially useful for UX writers in other countries, as well as QA and designers who did not speak the local languages. The release of Google Sheets’ “Insert picture in cell” feature was a huge help for this.\nGojek eventually moved to using \u003Ca href=\"https://lokalise.com\">Lokalise\u003C/a> for its copy management \u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>\u003C/p>\n\u003Ch3 id=\"learnings\">Learnings\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>Scaling GoBiz across Thailand, Vietnam, and Singapore taught me that localisation is never something you add after the product is built. Even after launch, every new feature needs to be evaluated through the lens of each country. The same care you put into the initial rollout has to continue, otherwise the product quietly drifts back toward the needs of the base market.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>There’s also an organizational reality that often gets ignored. Supporting multiple markets properly sometimes requires reshaping how teams work, how decisions are made, and who is involved in the roadmap. But these shifts take time, and they rarely get prioritised unless there is a clear business outcome tied to them.\nAt Gojek, this misalignment became clear. Each international market operated under its own brand and leadership, which meant we couldn’t consistently involve those teams in product planning. As a result, our roadmaps naturally skewed toward Indonesia, and we only built out some must-have features for other countries.\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"closing-thoughts\">Closing thoughts\u003C/h3>\n\u003Cp>Gojek eventually exited Thailand and Vietnam, and its presence in Singapore today is minimal. Looking back, designing GoBiz for other countries was a highly rewarding and learning experience. I got to experience new cultures and work with people from different nationalities. Those lessons stayed with us long after the product lines, org charts, and roadmaps changed.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./thai-research.jpeg","alt":"The Gojek research team with a restaurant owner in Bangkok","index":0}\">\u003Cfigcaption>The Gojek research team with a restaurant owner in Bangkok\u003C/figcaption>\u003C/figure>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>You can read more about their International copy process on the blog by the Thai and Viet UX writer \u003Ca href=\"https://www.gojek.io/blog/language-no-bar-how-we-localise-ux-copies-at-gojek\">https://www.gojek.io/blog/language-no-bar-how-we-localise-ux-copies-at-gojek\u003C/a> \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":298,"localImagePaths":317,"remoteImagePaths":318,"frontmatter":319,"imagePaths":320},[299,302,303,307,310,313,316],{"depth":44,"slug":300,"text":301},"collaboration-and-organization","Collaboration and Organization",{"depth":44,"slug":58,"text":59},{"depth":304,"slug":305,"text":306},5,"ps-wkwkwkwk-and-5555555-are-common-ways-of-typing-laughter-in-indonesian-and-thai-texting-culture","P.S. “wkwkwkwk” and “5555555” are common ways of typing laughter in Indonesian and Thai texting culture.",{"depth":44,"slug":308,"text":309},"managing-copy","Managing Copy",{"depth":44,"slug":311,"text":312},"learnings","Learnings",{"depth":44,"slug":314,"text":315},"closing-thoughts","Closing thoughts",{"depth":37,"slug":85,"text":86},[285,286,287,288,289,290,291,292],[],{"title":279,"description":280,"year":130,"company":131,"image":293,"status":19},[285,286,287,288,289,290,291,292],"jiva-lite",{"id":321,"data":323,"body":328,"filePath":329,"assetImports":330,"digest":332,"deferredRender":333},{"title":324,"description":325,"image":326,"year":327,"company":18,"status":19},"Jiva Lite","Building a farmer-centric experience for buying Corn in rural Indonesia leveraging Whatsapp","__ASTRO_IMAGE_./jivalite.jpg","2024-2025","import impactOne from './jl-impact-1.png';\nimport impactTwo from './jl-impact-2.png';\n\nWhen I joined Jiva in 2022, we had been leveraging collectors in rural areas to facilitate our business model.\n\nThe harvest of a smallholder corn farmer is typically around 2.5k-3k tons. The economics of sending it to the buyer isn't economically viable for such a small quantity when you factor in labour cost & transport cost. Additionally the ability to evaluate quality at the farmer level is approximate.\nCollectors helped fill this gap by aggregating corn for dispatch from multiple farmers and using moisture meters to estimate quality of the corn. \n\nJiva’s business model was working with buyers to acquire purchase orders for the corn and coordinate with the collectors to dispatch to feedmills to get the best price. \nThis wasn't a disruptionary model. The concept of middlemen have always existed in agricultural systems. What was different was the concept of a single entity who's presence across provinces helped get better prices. \nOur Collectors earned commission for selling through us and our Farmers got the best price. \n\nBut the question remained.. **could we do even better?** and that's where Jiva Lite came in.\n\n\n## Challenge\n\n- One of the reasons we resorted to the micro-collector model was the technical literacy and mobile device penetration in rural Indonesia. Most farmers still used feature phones and many families just had a shared single device usually operated by the children or the wife. For those who did have a smartphone device, local storage and internet were critical constraints. \nIt didn't make sense for them to keep our apps on their phones across seasons and our churn data suggested that as well.\n\n- Our research had shown us that the Sahabat Jiva android app was a complex system compared to the real world way to buying and selling corn\n\n- From the business side, this meant our customer acqusition funnel was fairly expensive and with the commissions and price fluctuations of the market, the Gross Contribution (GC) that we earned per kg was far below what we wanted to be at.\n\n## Role\nMy role was a fluid one in the project where at the start I was leading the product design effort and managing stakeholders but eventually transitioned to co-owning the project and focusing on the digital marketing efforts over the 1 year of operation. \n\n## Solution\n\n![Early Jiva Lite app wireframes](./lite-wire.png \"Early Jiva Lite app wireframes\")\n\nThe first idea for Jiva Lite came out of our efforts to simplify the Sahabat Jiva App information architecture and workflows. But it took a few more months before we got a chance to try to solve this.\nThe overwhelming idea at that time was to make another app albeit a \"lite\" one. But a few of us felt that Whatsapp was the way to go. So I used Landbot to quickly prototype how a Whatsapp based flow would look like.\n\n#### Why Whatsapp? \nMeta has deep penetration in Indonesia. Indonesia doesnt have net neutrality laws and hence Meta, Google, Netflix, etc have mobile plans that enabled unlimited usage of their services. \nThis is one of the reason that Facebook and Whatsapp are the communication tool of choice in our users. This meant that \nwe could be assured that unlike a mobile app, our target audience would definitely have Whatsapp on their phones.\n\nAfter pitching this to leadership, we got buyin to use the Whatsapp flow as a pilot project to test out the viability of the Jiva Lite business model.\n\n#### Why was Jiva Lite different?\n- If Jiva Lite had to succeed then it should be economically viable while at the same time, it should not cannibalize our existing businesses. So the pricing logic we set was to keep our offering price at 100idr/kg less than the price we showed in our Sahabat Jiva app. \n- A recent tax exemption made it easy for us to operate at the small scale without needing unnecessary documentation like KTPs\n- For the first time (probably), small holders could sell direct to our buyers irrespective of the volume of their harvest and get paid within a few hours.\n- Meta Ads and Whatsapp QRs let users quickly get into our flow and check prices.\n\n### Building the MVP\nA small team got together to work on this part time. Designing the first flow to be as simple took a few iterations. We used Figma and FigJam a lot to align everyone and used Slack's inbuilt project management system to keep us on track.\nWeekly syncs were run to share progress with the larger group of stakeholders and monthly meetings with the CEO.\n\n![Figjam](./figjam.png \"Blueprinting\")\n\nOur first version was built using Whatsapp Flows and simplified the crop buying flow to just 3 steps; View Prices, Register and Send Truck. \nWe offered farmers the option of selecting between 3 feedmills based on their corn quality. Prices would be updated everyday.\n\n![Designs for the first release version on Figma](./jivalitev1.png \"Designs for the first release version on Figma\")\n\n### Preparing for Go-To-Market\n\n#### Onboarding internal teams:\nWe ran sessions with our field agents, customer service agents and marketing teams to onboard them onto the pilot project. I prepared an \"objection handling\" (a FAQ document) for CX team to use for answering any queries they may receive on their channels.\nSpeaking to our on-ground field agents helped us address their concerns about Jiva Lite and its impact on their operations.\n\n#### Selecting a region for piloting:\nWe had to negotiate with stakeholders for selecting regions due to concerns around our existing micro-collector density as well as time of the year and , we decided to go with the regencies closest to Makassar (South Sulawesi) ; Maros and Takalar. \nThis meant that the distances to be travelled by the farmers to our buyers were just a few hours away.\n\n#### On field marketing:\nWe got 1 field marketer, Erwin, on loan from the growth team for the efforts on on-ground canvassing by meeting farmer groups (Gapoktans).\n\n#### Jiva Lite Website:\nWe built a website so that we could provide a social proof that Jiva Lite was infact an offering from Jiva and not a scam. The website had prices which we manually updated and directed users to the Whatsapp number.\n\n#### Doing things that don't scale:\nWe didn't build an in-flow way to add a farmer's bank account details. We resorted instead to use a manual system of getting the information from the farmer and getting CX team to add them to the system. This enabled us to ship faster and prevented user error from entering the wrong information. Where possible we pre-filled dummy data (e.g., user address) in the backend because we didnt want to build without valdiating our idea at this stage.\n\n\u003CYouTube id=\"kCQByHg5kBI\" title=\"Jiva Lite website walkthrough\" />\n\n## Post Launch of the MVP\n\n![Karan, Nav, Idul and Erwin meeting Saripuddin and other farmers](./jivalite-ground.webp)\n\nWe launched the first version to production on August 7th, but we didnt get our first transaction till Nav, Karan, Idul and Erwin visited Mr. Saripuddin and convinced him to send the corn to our collection centre.\nOn August 23rd, Saripuddin (seen in the cover image) became the first farmer to have sent us the corn directly. That first transaction was the litmus test that our systems failed, however with Karan co-ordinating with Erwin, we somehow managed to pull through.\n\n>“I made over IDR 3,000,000 with my truck! I invite all my friends to send trucks using Jiva Lite.”\n> — Saripuddin\n\nSaripuddin immediately saw the value Jiva Lite brought to him and instantly became our ambassador convincing multiple farmers in his village to send us corn over the year.\nWithin a month, we hit the milestone of 50 MT and started thinking of the next iteration for Jiva Lite.\n\nPersonally, the first transaction was a feeling unlike any other that my body had experienced. That day, I was unable to act rationally because I was completely blown away by the fact that 14 days after release we secured our first farmer and he saw the value we were providing. \nThere was a lot of time and effort that went into reaching this exact point and it felt glorious.\n\n## Learnings from the Pilot\n#### Selling breakdown:\nWe made a simple google sheets template to generate a breakdown that we sent to every farmer which helped them understand how much they were earning and what was the quality of their corn.\n\n#### Backend Issues: \nWe had not handled user creation of churned/deleted users and this is what caused our first transaction to fail. (Murphy's Law, amirite?)\n\n![spiderkaran](./spiderkaran.png)\n\n#### Changing behaviour isn't easy:\nWhen farmers are used to dealing with a broken system, 'a too-good to be true' deal like Jiva Lite feels unrealistic. Furthermore, farmers and local buyers tend to have a personal relationship that isnt easy to overcome. At the end of the day, Jiva is an external entity while the buyer may be a neighbour, a relative or their money lender.\n\n#### Flow still complex:\nWithout our on-field agents, getting users to navigate Whatsapp Flows wasnt easy. Whatsapp flows may seem simple to us, but for our target users, they were complex. We realized that just because they used Facebook and Whatsapp didn't mean that they were familiar navigating similar interfaces. We needed to re-do our flow.\n\n## Building V2\n\nFrom a product point of view, we realised the following shortcomings:\n- The current implementation didn't enable us to A/B test our flow fast enough. \n- There was no way for us to intervene in the flow to guide users through it if required\n- There was no way to re-target and engage our users\n\nWe decided to look if any pre-existing solutions would help us solve this. After an evaluation of several Whatsapp business providers, we decided to go ahead with Landbot. We were already familiar with Landbot and it met all the above criteria.\n\n![A small portion of the Landbot flow](./landbot.png)\n\n**Product:** We re-designed the whole flow to be more like a chat-bot conversation as Landbot didnt support Whatsapp flows. This unfortunately took longer than we planned for and we finally released in early January 2025.\n\n**Marketing:** While we built, we went ahead and started Meta Ads and sending Price Update notifications to users in our funnel. We felt the ads themselves may not be efficient at communicating the concept of Jiva Lite so Tyo and Nav created a few marketing videos to help us.\n\n## Post V2\n\n- Once Landbot released interacting with our users in the funnel became easy. Our Research Coordinators stepped in to own the role of helping guide our users through the funnel. They did a wonderful job (outside of their job description) and even converted a few sales purely via chat.\n\n- Our successful pilot had enabled us to get a small budget approved which allowed us to hire a few more Jive Lite Operators (or JLO's as we called them) to do outreach on ground. We also explored using Sentinel satellite data to help our JLOs narrow their canvassing regions to those being harvested.\n\n![Shakti, Abhishek and I travelled to Gorontalo to figure out if we could launch Jiva Lite there](./gorontalo.webp)\n\n- We wanted to scale our solution to other regions so we started expanding to Lampung, Sumatra and Central Java and explored building out Jiva Lite for other crops like Rubber. \n\n- We ran A/B tests and simplified our flow futher. Designed different types of ads; static, videos, localized (Bugis and Bahasa Indonesia) and even engaged social media influencers.\n\n## Final thoughts\n\n- Our digital conversion (Ads - Whatsapp)was near 0 throughout the time of operation. We tried a lot of different approaches but weren't able to get any organic sale from the digital channel. \n\n- Almost 98% of our sales came via our JLOs. This meant scaling volume would directly need more feet on ground and that was seen as expensive.\n\n![Some ads we made for recruiting drossers](./dross.png)\n\n- We uncovered certain systemic issues like Farmer debt, Cash payments (to avoid tax), Drossing systems. We attempted to solve Drossing (separating Corn kernels from Cob) by procuring and \nrenting out drossing machines and even built a simple advertising based funnel to acquire potential customers for this service. But we couldn't solve for the others with our budgetary constraints and the high level of risk associated with them.\n\n- Though I have attempted to write out the project in detail, there is still a lot that I feel I have left out because building a product and running it takes you in so many different directions. You encounter various problems and inefficiencies, some you solve and others you can't.\nThe experience takes a lot out of you but in the end, I am glad I got the opportunity to build a product with this level of ownership.\n\n## Impact\nIn the one year of operation, we scaled Jiva Lite from 0 to 600 registered users who sold 4102 MT of corn. With a margin of 100 IDR/kg, we generated around 24k USD of gross contribution (Additional earnings from sales from trading this corn added an additional 200 IDR/kg, which has not been counted here)\n\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr 3fr; gap: 1rem;\">\n \u003Cimg src={impactOne.src} alt=\"Slack note about a farmer earning extra through Jiva Lite\" />\n \u003Cimg src={impactTwo.src} alt=\"WhatsApp screenshot showing added farmer earnings from Jiva Lite\" />\n\u003C/div>\n\nBehaviourally though, we were able to bring meaningful improvements into the lives of the Farmers in a few provinces of South Sulawesi. Most farmers who transacted with us made about 2.5-3 million IDR(~$180 USD) more than they would otherwise.\nEven after Jiva Lite shut down, a few of the farmers continued to deal directly with the collection centres and improve their collective earnings.\n\n## Team\nIt takes a village to run a project like this and almost everyone in the Jiva design team contributed towards this project. I couldnt have done this without Karan owning the offline side, Nilesh running the product sprint and Shakti managing the JLO's. \n\nNav, Sai and Tyo worked on the initial flow designs and Niraj took the reigns towards the end, Kesha on the UX copy, and Karan and Bharath on the Service Design. \nAsa, Idul, Aldi and El contributed heavily on the User research side often intervening in our workflow to helpg guide our Farmers. \nAkshay Koul led the Engineering team with Kalpesh and Mani, Rajlakshmi on QA. DJ for Data Dashboards. Gada and Salma on Marketing. Aiko & Idayanti helped us from the CX team.\n\nAnd we really couldnt have done as much as we did without our Jiva Lite Operators Erwin, Firman, Rahma, Nur Faisyah, Ainun, Irsyam, Rajab & Fery.","src/content/work/jiva-lite/index.mdx",[331],"./jivalite.jpg","12c61351f0eb871d",true,"practo-pro",{"id":334,"data":336,"body":341,"filePath":342,"assetImports":343,"digest":345,"rendered":346},{"title":337,"description":338,"image":339,"year":340,"company":98,"status":99},"Practo Pro v1","Designing a unified mobile experience for providers using Practo products","__ASTRO_IMAGE_./practo-pro.png","2015-2016","## Overview\nAround Dec 2015, Practo had 3 mobile apps (Profile, Ray and Qikwell Pulse), each of which served a\nparticular purpose and worked independent of each other. Ray had been the mainstay app for most of\nPracto’s existence, while Profile was created to onboard doctors easily to the marketplace. The Qikwell\napp entered into this mix when we acquired their company earlier in 2015. Maintaining 3 separate\nmobile applications was an overhead for our internal teams as well as for our users. Thus **Project\nSingularity** was born.\n\n## Understanding the problem\nI was not involved in the user research phase of this project. I started work on this project at the\nconceptualisation stage. I worked with Jonathan during this phase. The three apps had different visual\nstyles and interactions and were structured as per their workflows. We needed to integrate these\ntogether without alienating their existing user base while also providing a scalable structure for the\nfuture.\n\n>Our vision was to build one app which needs to become the defacto app for doctors and eventually\nother provider segments\n\nBased on the research conducted, it was understood that a healthcare professional had the following\nneeds; Reputation, Productivity, Marketing, Money and Networking.\n\n[Personas for the unified app]\n\nThe new application had to cater to these needs if it had to be a central point of their life. However,\nthese needs vary as per the standing of the doctor. For e.g., a just graduated doctor would seek to\nlearn more from experienced doctors and would rarely have their own clinic while a doctor with 10\nyears of experience would be focussing on setting up her own business and getting more patients.\nFirst we needed to figure out the information architecture. We started putting all the existing parts\nof the various apps into an excel sheet to get an idea of what the pieces were and we also listed out\nfeatures that we felt could be integrated into the app at a later stage.\n\n[arriving at the information architecture]\n\nWe then started organising this based on how the users would be interacting with them. This is when\nwe started realising that some features seemed redundant while others were incomplete. We then\nlooked at how these various features would be impacted with respect to our user roles.\nWe looked at what are the requirements for a user to access our products as well as how the app\nwould be for users of any of the apps. Thus we were able to finalise the information architecture of the app.\n\n[final information architecture]\n\n## Concepts\nBased on this information architecture, I created few app concepts which we evaluated before\nfinalising on the one we would present to the stakeholders. The final concept was presented as an\nInVision prototype.\n\n[final information architecture]\n\nNotifications, Summary and Settings were concepts that we proposed as part of the new app.\n\n**Notifications:**\nAt that point of time, we did not have a single in-product channel of communication. Most\ncommunication happened either by emails, message bars or blocking dialogs. We wanted to change\nthis so we proposed a Notification Drawer. Further, we categorised as notifications as promotional and\ntransactional and provided users with a way to customise what kind of notifications they would like to\nreceive.\n\n**Summary:**\nThe Summary section was conceived as the newsfeed that would be the landing page for returning\nusers to jump directly into their workflow. It was comprised of stationary widgets and a refreshing\ninfinite newsfeed. The widgets were devised only for transactional products like Ray and Consult. The\nrest of the feed was to be powered by content from our other products like Healthfeed, Synapse and\nConsult.\n\n**Settings:**\nJust like notifications, this did not exist but was an obvious thing to build. We didn't want the user to\nexperience the internal product separations that existed.\nThere were many many meetings and back and forth before we could get everyone to agree that this\nwas the way we should go ahead. During the final discussion with the stakeholders, It was decided\nthat the workflow based structure was too futuristic and we would need to have an interface that lets\nour users understand our offerings. So we shifted to an app grid and widget landing as shown below\ninstead of a feed based landing.\n[final app navigation]\n\n## Detailing\nI led this effort with a team of 3 other designers. Hetang, Akshay and me worked to create the various\nproduct screens while Saloni was responsible for the theme and illustrations. Jonathan was overseeing\nthe entire operation and he gradually transitioned the responsibility to me.\nWe chose a clean content first approach that was becoming popular at that time. It was decided to\nmake the android and iOS apps similar in experience and independent of platforms. I set down the core\nguidelines that we would need to follow to align the various parts of the products. We decided to use\nthe system fonts i.e., Roboto on Android and SF on iOS, when available, for the design. To finalise on\nthe elements, we mocked up key screens within the product to understand and added to our\nguidelines when we found a component that was being used in multiple places.\n[singularity stickersheet]\n\nI created a stickersheet which functioned as a Master file for all the designers. We used a primitive\npeer review process so that the various parts would be consistent and present a coherent experience.\nOur core files would reside within Google Drive and we would work on our versions separately before I\nwould go through everyone’s files before replacing the versions in our core Drive folder.\n\n## Final screens\n\nDuring the implementation, I was the only designer assigned to the project and worked closely with the\ndevelopers to get things right which was how I earned the moniker ‘ceo’ from them. The android app\nshipped on June 25th, 2016 to 100% while the iOS app took another month before it was ready for\nrelease.\n\n\nThanks to Jonathan, Hetang, Akshay, Saloni and the rest of the Practo Partner team for coming\ntogether to bring this once-in-a-lifetime project to life.","src/content/work/practo-pro/index.md",[344],"./practo-pro.png","9357b996caae3882",{"html":347,"metadata":348},"\u003Ch2 id=\"overview\">Overview\u003C/h2>\n\u003Cp>Around Dec 2015, Practo had 3 mobile apps (Profile, Ray and Qikwell Pulse), each of which served a\nparticular purpose and worked independent of each other. Ray had been the mainstay app for most of\nPracto’s existence, while Profile was created to onboard doctors easily to the marketplace. The Qikwell\napp entered into this mix when we acquired their company earlier in 2015. Maintaining 3 separate\nmobile applications was an overhead for our internal teams as well as for our users. Thus \u003Cstrong>Project\nSingularity\u003C/strong> was born.\u003C/p>\n\u003Ch2 id=\"understanding-the-problem\">Understanding the problem\u003C/h2>\n\u003Cp>I was not involved in the user research phase of this project. I started work on this project at the\nconceptualisation stage. I worked with Jonathan during this phase. The three apps had different visual\nstyles and interactions and were structured as per their workflows. We needed to integrate these\ntogether without alienating their existing user base while also providing a scalable structure for the\nfuture.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Our vision was to build one app which needs to become the defacto app for doctors and eventually\nother provider segments\u003C/p>\n\u003C/blockquote>\n\u003Cp>Based on the research conducted, it was understood that a healthcare professional had the following\nneeds; Reputation, Productivity, Marketing, Money and Networking.\u003C/p>\n\u003Cp>[Personas for the unified app]\u003C/p>\n\u003Cp>The new application had to cater to these needs if it had to be a central point of their life. However,\nthese needs vary as per the standing of the doctor. For e.g., a just graduated doctor would seek to\nlearn more from experienced doctors and would rarely have their own clinic while a doctor with 10\nyears of experience would be focussing on setting up her own business and getting more patients.\nFirst we needed to figure out the information architecture. We started putting all the existing parts\nof the various apps into an excel sheet to get an idea of what the pieces were and we also listed out\nfeatures that we felt could be integrated into the app at a later stage.\u003C/p>\n\u003Cp>[arriving at the information architecture]\u003C/p>\n\u003Cp>We then started organising this based on how the users would be interacting with them. This is when\nwe started realising that some features seemed redundant while others were incomplete. We then\nlooked at how these various features would be impacted with respect to our user roles.\nWe looked at what are the requirements for a user to access our products as well as how the app\nwould be for users of any of the apps. Thus we were able to finalise the information architecture of the app.\u003C/p>\n\u003Cp>[final information architecture]\u003C/p>\n\u003Ch2 id=\"concepts\">Concepts\u003C/h2>\n\u003Cp>Based on this information architecture, I created few app concepts which we evaluated before\nfinalising on the one we would present to the stakeholders. The final concept was presented as an\nInVision prototype.\u003C/p>\n\u003Cp>[final information architecture]\u003C/p>\n\u003Cp>Notifications, Summary and Settings were concepts that we proposed as part of the new app.\u003C/p>\n\u003Cp>\u003Cstrong>Notifications:\u003C/strong>\nAt that point of time, we did not have a single in-product channel of communication. Most\ncommunication happened either by emails, message bars or blocking dialogs. We wanted to change\nthis so we proposed a Notification Drawer. Further, we categorised as notifications as promotional and\ntransactional and provided users with a way to customise what kind of notifications they would like to\nreceive.\u003C/p>\n\u003Cp>\u003Cstrong>Summary:\u003C/strong>\nThe Summary section was conceived as the newsfeed that would be the landing page for returning\nusers to jump directly into their workflow. It was comprised of stationary widgets and a refreshing\ninfinite newsfeed. The widgets were devised only for transactional products like Ray and Consult. The\nrest of the feed was to be powered by content from our other products like Healthfeed, Synapse and\nConsult.\u003C/p>\n\u003Cp>\u003Cstrong>Settings:\u003C/strong>\nJust like notifications, this did not exist but was an obvious thing to build. We didn’t want the user to\nexperience the internal product separations that existed.\nThere were many many meetings and back and forth before we could get everyone to agree that this\nwas the way we should go ahead. During the final discussion with the stakeholders, It was decided\nthat the workflow based structure was too futuristic and we would need to have an interface that lets\nour users understand our offerings. So we shifted to an app grid and widget landing as shown below\ninstead of a feed based landing.\n[final app navigation]\u003C/p>\n\u003Ch2 id=\"detailing\">Detailing\u003C/h2>\n\u003Cp>I led this effort with a team of 3 other designers. Hetang, Akshay and me worked to create the various\nproduct screens while Saloni was responsible for the theme and illustrations. Jonathan was overseeing\nthe entire operation and he gradually transitioned the responsibility to me.\nWe chose a clean content first approach that was becoming popular at that time. It was decided to\nmake the android and iOS apps similar in experience and independent of platforms. I set down the core\nguidelines that we would need to follow to align the various parts of the products. We decided to use\nthe system fonts i.e., Roboto on Android and SF on iOS, when available, for the design. To finalise on\nthe elements, we mocked up key screens within the product to understand and added to our\nguidelines when we found a component that was being used in multiple places.\n[singularity stickersheet]\u003C/p>\n\u003Cp>I created a stickersheet which functioned as a Master file for all the designers. We used a primitive\npeer review process so that the various parts would be consistent and present a coherent experience.\nOur core files would reside within Google Drive and we would work on our versions separately before I\nwould go through everyone’s files before replacing the versions in our core Drive folder.\u003C/p>\n\u003Ch2 id=\"final-screens\">Final screens\u003C/h2>\n\u003Cp>During the implementation, I was the only designer assigned to the project and worked closely with the\ndevelopers to get things right which was how I earned the moniker ‘ceo’ from them. The android app\nshipped on June 25th, 2016 to 100% while the iOS app took another month before it was ready for\nrelease.\u003C/p>\n\u003Cp>Thanks to Jonathan, Hetang, Akshay, Saloni and the rest of the Practo Partner team for coming\ntogether to bring this once-in-a-lifetime project to life.\u003C/p>",{"headings":349,"localImagePaths":359,"remoteImagePaths":360,"frontmatter":361,"imagePaths":362},[350,351,352,355,358],{"depth":37,"slug":110,"text":111},{"depth":37,"slug":113,"text":114},{"depth":37,"slug":353,"text":354},"concepts","Concepts",{"depth":37,"slug":356,"text":357},"detailing","Detailing",{"depth":37,"slug":119,"text":120},[],[],{"title":337,"description":338,"year":340,"company":98,"image":344,"status":99},[],"sahabat-jiva-redesign",{"id":363,"data":365,"body":370,"filePath":371,"assetImports":372,"digest":374,"rendered":375},{"title":366,"description":367,"image":368,"year":369,"company":18,"status":99},"Fixing the Information Architecture of the Sahabat Jiva app","Redesigning the Sahabat Jiva Android app to fit the user's mental model and making it an intuitive experience","__ASTRO_IMAGE_./sjhome.webp","2022-2023","\u003C!-- Add your project content here -->\n\nWhen I joined Jiva in 2022, we had been leveraging collectors in rural areas to facilitate our business model.\n\nThe harvest of a smallholder corn farmer is typically around 2.5k-3k tons. The economics of sending it to the buyer isn't economically viable for such a small quantity when you factor in labour cost & transport cost. Additionally the ability to evaluate quality at the farmer level is approximate. \n\nCollectors helped fill this gap by aggregating corn for dispatch from multiple farmers and using moisture meters to estimate quality of the corn. \n\nJiva's business model was working with buyers to acquire purchase orders for the corn and coordinate with the collectors to dispatch to feedmills to get the best price.\n\nThis wasn't a disruptionary model. The concept of middlemen have always existed in agricultural systems. Jiva and it's Collectors operated at a country level scale that hadn't been tried before. \nThe Sahabat Jiva android app was used by our Collectors to manage their Harvest Procurement, their Input sales (In the Agriculture business; Seeds, Chemicals, Fertilizers, Equipments are collectively termed as Inputs) and view their Earnings.\n\n## Challenge\nJiva had started off in the pandemic and we hadnt got a chance to observe our users on the ground. Moving to mobile apps had led to most of our transactions now flowing through a digital channel. However our qualitative research, quickly showed us that our users really struggled with our app. \n\nThese could be narrowed down to\n1. The app's localization was a mess since there had not been a dedicated UX Writer who was involved in the app in the past which led to wrong translations, english terms in various pages and alien terminology being used.\n2. Every new user had to sit through multiple training sessions to learn how to use the various features on the app and there was no guarantee that they remembered how to use it.\n3. There were many disconnected user flows which needed to be followed in a particular sequence.\n4. The Collector's privileges on the application were managed by the province's branch manager and finance team due to the financial risk. This led to a non-uniform user experience and rogue user behaviour. \n\nBusiness-wise, this was leading to: \n\n1. High investment into canvassing, recruiting, training and onboarding \n2. Churn increasing Season-on-Season \n\nWhat this really meant was that the Android app was not the primary channel used by the Collector but more of a digitization system while most of the actual activity happened on Whatsapp. \n\nThere were even cases where our field agents (Activation Co-ordinators, Finance Co-ordinators) may actually be the operators of the application as it had been mandated to digitize every transaction that flows through the system.\n\nThis was not a scalable business model as it was dependant on having more feet on ground to increase transactions. Our data had been lying all this while about product adoption and usage.\n\n## Solution\n\nCan you really solve a problem this systemic and prevalent at so many different levels? \n\nFor sure! but could we do it at one go? No way. \n\nI advocated to break these problems into multiple phases. The goal here was to ship small and impactful to show value in the larger project to the stakeholders. Given the state the app was in, any change we brought in was definitely a net positive to our users. \n\nIn this case study, I will talk about the first phase; the Information Architecture overhaul.\n\n--- \n\nBefore we began redesigning, we needed to deeply understand our users’ mental models — how they think about tasks, organize information, and navigate the app.\n\nTo do this, we took a mixed-method research approach, combining qualitative and quantitative inputs from multiple sources:\n\n**Card Sorting with Users:** \nOn the ground, we spoke to users and conducted card sorting exercises to learn how users perceived and grouped key features. This gave us foundational insights into user mental models and navigation logic.\n\n**Usage Data and CX Reports:** \nWe analyzed historical usage data from CleverTap, Mixpanel, and UXCam, alongside customer experience reports, to surface patterns, popular flows, and pain points. One of our takeaways was that over the years, the quality of in-app tracking had degraded and the data we had couldn't be relied on.\n\n**Competitive Research:** \nWe reviewed similar apps to understand how they structured information and workflows. This helped us identify best practices we could adapt to Jiva’s context.\n\n**Stakeholder Interviews and Workshops:** \nAs we knew that our data was in-accurate and prone to telling the wrong story, we had to rely on doing some qualitative research. We held workshops with branch managers, trainers, and on-ground teams. Their first-hand experience highlighted key gaps and opportunities that might not surface through analytics alone.\n\nI've done these kind of projects many times over the years and it's fairly easy to know how to execute each of the steps above, but the challenge really is in bringing all this together in a coherent way.\n\nThe data from all these sources can be overwhelming to deal with and the team often got stuck on how to go ahead. I had to step in to give direction on what we need to do next and keep moving forward.\n\n\n\n## Impact\n\n\n## Conclusion","src/content/work/sahabat-jiva-redesign/index.md",[373],"./sjhome.webp","b80d2600d8e697c4",{"html":376,"metadata":377},"\u003C!-- Add your project content here -->\n\u003Cp>When I joined Jiva in 2022, we had been leveraging collectors in rural areas to facilitate our business model.\u003C/p>\n\u003Cp>The harvest of a smallholder corn farmer is typically around 2.5k-3k tons. The economics of sending it to the buyer isn’t economically viable for such a small quantity when you factor in labour cost & transport cost. Additionally the ability to evaluate quality at the farmer level is approximate.\u003C/p>\n\u003Cp>Collectors helped fill this gap by aggregating corn for dispatch from multiple farmers and using moisture meters to estimate quality of the corn.\u003C/p>\n\u003Cp>Jiva’s business model was working with buyers to acquire purchase orders for the corn and coordinate with the collectors to dispatch to feedmills to get the best price.\u003C/p>\n\u003Cp>This wasn’t a disruptionary model. The concept of middlemen have always existed in agricultural systems. Jiva and it’s Collectors operated at a country level scale that hadn’t been tried before.\nThe Sahabat Jiva android app was used by our Collectors to manage their Harvest Procurement, their Input sales (In the Agriculture business; Seeds, Chemicals, Fertilizers, Equipments are collectively termed as Inputs) and view their Earnings.\u003C/p>\n\u003Ch2 id=\"challenge\">Challenge\u003C/h2>\n\u003Cp>Jiva had started off in the pandemic and we hadnt got a chance to observe our users on the ground. Moving to mobile apps had led to most of our transactions now flowing through a digital channel. However our qualitative research, quickly showed us that our users really struggled with our app.\u003C/p>\n\u003Cp>These could be narrowed down to\u003C/p>\n\u003Col>\n\u003Cli>The app’s localization was a mess since there had not been a dedicated UX Writer who was involved in the app in the past which led to wrong translations, english terms in various pages and alien terminology being used.\u003C/li>\n\u003Cli>Every new user had to sit through multiple training sessions to learn how to use the various features on the app and there was no guarantee that they remembered how to use it.\u003C/li>\n\u003Cli>There were many disconnected user flows which needed to be followed in a particular sequence.\u003C/li>\n\u003Cli>The Collector’s privileges on the application were managed by the province’s branch manager and finance team due to the financial risk. This led to a non-uniform user experience and rogue user behaviour.\u003C/li>\n\u003C/ol>\n\u003Cp>Business-wise, this was leading to:\u003C/p>\n\u003Col>\n\u003Cli>High investment into canvassing, recruiting, training and onboarding\u003C/li>\n\u003Cli>Churn increasing Season-on-Season\u003C/li>\n\u003C/ol>\n\u003Cp>What this really meant was that the Android app was not the primary channel used by the Collector but more of a digitization system while most of the actual activity happened on Whatsapp.\u003C/p>\n\u003Cp>There were even cases where our field agents (Activation Co-ordinators, Finance Co-ordinators) may actually be the operators of the application as it had been mandated to digitize every transaction that flows through the system.\u003C/p>\n\u003Cp>This was not a scalable business model as it was dependant on having more feet on ground to increase transactions. Our data had been lying all this while about product adoption and usage.\u003C/p>\n\u003Ch2 id=\"solution\">Solution\u003C/h2>\n\u003Cp>Can you really solve a problem this systemic and prevalent at so many different levels?\u003C/p>\n\u003Cp>For sure! but could we do it at one go? No way.\u003C/p>\n\u003Cp>I advocated to break these problems into multiple phases. The goal here was to ship small and impactful to show value in the larger project to the stakeholders. Given the state the app was in, any change we brought in was definitely a net positive to our users.\u003C/p>\n\u003Cp>In this case study, I will talk about the first phase; the Information Architecture overhaul.\u003C/p>\n\u003Chr>\n\u003Cp>Before we began redesigning, we needed to deeply understand our users’ mental models — how they think about tasks, organize information, and navigate the app.\u003C/p>\n\u003Cp>To do this, we took a mixed-method research approach, combining qualitative and quantitative inputs from multiple sources:\u003C/p>\n\u003Cp>\u003Cstrong>Card Sorting with Users:\u003C/strong>\nOn the ground, we spoke to users and conducted card sorting exercises to learn how users perceived and grouped key features. This gave us foundational insights into user mental models and navigation logic.\u003C/p>\n\u003Cp>\u003Cstrong>Usage Data and CX Reports:\u003C/strong>\nWe analyzed historical usage data from CleverTap, Mixpanel, and UXCam, alongside customer experience reports, to surface patterns, popular flows, and pain points. One of our takeaways was that over the years, the quality of in-app tracking had degraded and the data we had couldn’t be relied on.\u003C/p>\n\u003Cp>\u003Cstrong>Competitive Research:\u003C/strong>\nWe reviewed similar apps to understand how they structured information and workflows. This helped us identify best practices we could adapt to Jiva’s context.\u003C/p>\n\u003Cp>\u003Cstrong>Stakeholder Interviews and Workshops:\u003C/strong>\nAs we knew that our data was in-accurate and prone to telling the wrong story, we had to rely on doing some qualitative research. We held workshops with branch managers, trainers, and on-ground teams. Their first-hand experience highlighted key gaps and opportunities that might not surface through analytics alone.\u003C/p>\n\u003Cp>I’ve done these kind of projects many times over the years and it’s fairly easy to know how to execute each of the steps above, but the challenge really is in bringing all this together in a coherent way.\u003C/p>\n\u003Cp>The data from all these sources can be overwhelming to deal with and the team often got stuck on how to go ahead. I had to step in to give direction on what we need to do next and keep moving forward.\u003C/p>\n\u003Ch2 id=\"impact\">Impact\u003C/h2>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>",{"headings":378,"localImagePaths":387,"remoteImagePaths":388,"frontmatter":389,"imagePaths":390},[379,380,383,384],{"depth":37,"slug":41,"text":42},{"depth":37,"slug":381,"text":382},"solution","Solution",{"depth":37,"slug":79,"text":80},{"depth":37,"slug":385,"text":386},"conclusion","Conclusion",[],[],{"title":366,"description":367,"year":369,"company":18,"image":373,"status":99},[],"writing",["Map",393,394,421,422,442,443,467,468,488,489,519,520,557,558,581,582,610,611,649,650,678,679,697,698,727,728,747,748],"data-vizard",{"id":393,"data":395,"body":400,"filePath":401,"assetImports":402,"digest":409,"rendered":410},{"title":396,"description":397,"date":398,"image":399,"status":19},"Lessons learnt from building Data-Vizard","What building an AI-assisted workflow for interactive data visualization taught me",["Date","2026-07-16T00:00:00.000Z"],"__ASTRO_IMAGE_./viz-c1.jpeg","We hosted a third [in-person workshop this year at VizChitra 2026](https://vizchitra.com/2026/sessions/interactive-dataviz-using-ai-coding). This time it was a bit different. Usually the workshop is structured around getting folks to create their first online artifact using AI. But for VizChitra, we decided to get people to visualize a dataset into an interactive artifact. This meant we had to teach people the process behind making a visualization before asking them to create one. \n\n![Pariticipants of the workshop during the Ice breaker session](./vizc-4.jpeg)\n\n\nWhile preparing for the workshop, [Rasagy](https://rasagy.in) suggested that we introduce the concept of skills as a way for participants to build re-usable workflows. This made sense and I took it as an excuse for me to build an agentic-skills plugin.\n\nAnd that's how [Data-Vizard](https://data-vizard.com/) was born.\n\nToday most LLMs can easily generate a chart from a single prompt. At times, LLMs may have preset skills like OpenAI's Visualize or you can install user generated skills like this [Tufte skill](https://github.com/aref-vc/tufte-claude-skill). But they condense the creation process into a one-shot rather than an explorative one. The decisions would be taken by the AI and the outcomes may not always match your expectations.\n\nData-Vizard is different. It breaks the task into a series of smaller steps where the human makes the important decisions and AI helps automate the work in between.\n\n![v0.1.0 of data-vizard](./plugin.jpg)\n\nThe first version consisted of five skills:\n\n- Data-Vizard, an orchestrator to manage the overall workflow.\n- Curator prepares the dataset and can recommend additional datasets that might enrich it.\n- Analyst explores the data, looking for patterns, relationships and interesting questions.\n- Narrator helps turn those findings into a story worth telling.\n- Designer transforms everything into the final artifact—an interactive HTML page.\n\nLater, I added a sixth skill called Critic, which evaluates the output at every stage and provides feedback before handing work to the next skill.\n\nInstalling it in your system is pretty simple, just give your AI agent the following command to run or run it from the terminal yourself. There is support currently for Codex (or should I say ChatGPT), Claude Code and Gemini (untested)\n\n```bash\nnpx data-vizard install\n```\n\n\u003Cbr>\n\nAs I'm writing this, the project is at [v0.1.5](https://www.npmjs.com/package/data-vizard) and I continue to work on it. \nBeyond learning how to publish and update an npm package, building and testing it has taught me a few other things.\n\n1. **Hard to enforce Skills:** Skill files are good at shaping what questions get asked during the process of the LLM. But skill based workflows are weak at enforcing process steps or output quality. Those require something with actual stopping power — hooks, checklists the model has to fill out before continuing, or explicit gate steps the user has to clear.\n2. **Improvements are slow:** One thing I started seeing at the beginning was the tendency of GPT models to take datasets and create a template-y data-explorer dashboard. I guess it's because of the training data having a lot of visually boring dashboards. The only way to de-slop the outcomes and direct the models to create more unique data-visualizations was to identify the slop manually and rewrite skills to prevent them from occurring. This is naturally slow work as I need to find datasets and test outcomes to evaluate.\n3. **AI amplifies expertise:** One of the ideas we discuss during the workshop is how AI is an amplifier and not a cure-all. The better your understanding of a topic, the better the outcomes tend to be. And that's why knowing something is still important in this age of AI. Building Data-Vizard only reinforced that belief. The models are excellent at accelerating analysis, generating code and iterating on ideas but extremely poor in curating better outcomes. A human is still needed to direct, review and de-slop.\n \n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr\n 1fr; gap: 1rem;\">\n\n ![Open AI's GPT 5.5](./gpt55.png)\n\n ![Claude Sonnet 4.6](./sonnet46.png)\n\n \u003C/div>\n \n4. **Which model you use matters:** During the workshop, someone asked whether Skills would matter as foundation models continue to improve. At the time I didn't have a great answer. However when I was testing out data-vizard, I discovered that the given the same data, the same skill workflow being used by different models provides vastly different outcomes in terms of the quality. I believe this is because of even general models having specialized training data that optimize for a particular outcome and even a using a skill can't standardize quality across models.\n5. **Multi-model workflows are the future:** Taking this idea further implies that perhaps the best workflow would be one where you are utilizing models that are specialized to perform that particular task rather than using a generalized model. E.g., Analyst could be GPT, Narrator could be Gemini and Claude could be the Designer. One particular org may not be able to deliver the best outcome. (Diversity in AI workflows, hehe) and as we become sensitive to token costs and running local AI, we will need harnesses that make it easy to handle this.\n\n### Conclusion:\n\n![The plugin in progress](./plugin-workflow.jpg)\n\nBuilding data-vizard has helped me drift back into creating data visualizations. I used it to create this data viz of the [ongoing Fifa worldcup](https://astral-willow-xyk8.here.now) and this visualization of [London Salary data](https://devoted-huckle-mtxv.here.now). \n\nLike I said, Data-Vizard is still evolving, and I have plenty more ideas I'd like to explore within it. If you'd like to give it a try—or even help shape where it goes next—you can check it out at [data-vizard.com](https://data-vizard.com/). I'd love to see what you build.\n\n--\n\n*P.s. If you are interested in having me host a workshop, please reach out to me on [X](https://x.com/kenneth), [bsky](https://bsky.app/profile/ken.cv) or [Instagram](https://instagram.com/kennethmdesouza)*","src/content/writing/data-vizard/index.md",[403,404,405,406,407,408],"./vizc-4.jpeg","./plugin.jpg","./gpt55.png","./sonnet46.png","./plugin-workflow.jpg","./viz-c1.jpeg","794affe62fae3afb",{"html":411,"metadata":412},"\u003Cp>We hosted a third \u003Ca href=\"https://vizchitra.com/2026/sessions/interactive-dataviz-using-ai-coding\">in-person workshop this year at VizChitra 2026\u003C/a>. This time it was a bit different. Usually the workshop is structured around getting folks to create their first online artifact using AI. But for VizChitra, we decided to get people to visualize a dataset into an interactive artifact. This meant we had to teach people the process behind making a visualization before asking them to create one.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./vizc-4.jpeg","alt":"Pariticipants of the workshop during the Ice breaker session","index":0}\">\u003Cfigcaption>Pariticipants of the workshop during the Ice breaker session\u003C/figcaption>\u003C/figure>\n\u003Cp>While preparing for the workshop, \u003Ca href=\"https://rasagy.in\">Rasagy\u003C/a> suggested that we introduce the concept of skills as a way for participants to build re-usable workflows. This made sense and I took it as an excuse for me to build an agentic-skills plugin.\u003C/p>\n\u003Cp>And that’s how \u003Ca href=\"https://data-vizard.com/\">Data-Vizard\u003C/a> was born.\u003C/p>\n\u003Cp>Today most LLMs can easily generate a chart from a single prompt. At times, LLMs may have preset skills like OpenAI’s Visualize or you can install user generated skills like this \u003Ca href=\"https://github.com/aref-vc/tufte-claude-skill\">Tufte skill\u003C/a>. But they condense the creation process into a one-shot rather than an explorative one. The decisions would be taken by the AI and the outcomes may not always match your expectations.\u003C/p>\n\u003Cp>Data-Vizard is different. It breaks the task into a series of smaller steps where the human makes the important decisions and AI helps automate the work in between.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./plugin.jpg","alt":"v0.1.0 of data-vizard","index":0}\">\u003Cfigcaption>v0.1.0 of data-vizard\u003C/figcaption>\u003C/figure>\n\u003Cp>The first version consisted of five skills:\u003C/p>\n\u003Cul>\n\u003Cli>Data-Vizard, an orchestrator to manage the overall workflow.\u003C/li>\n\u003Cli>Curator prepares the dataset and can recommend additional datasets that might enrich it.\u003C/li>\n\u003Cli>Analyst explores the data, looking for patterns, relationships and interesting questions.\u003C/li>\n\u003Cli>Narrator helps turn those findings into a story worth telling.\u003C/li>\n\u003Cli>Designer transforms everything into the final artifact—an interactive HTML page.\u003C/li>\n\u003C/ul>\n\u003Cp>Later, I added a sixth skill called Critic, which evaluates the output at every stage and provides feedback before handing work to the next skill.\u003C/p>\n\u003Cp>Installing it in your system is pretty simple, just give your AI agent the following command to run or run it from the terminal yourself. There is support currently for Codex (or should I say ChatGPT), Claude Code and Gemini (untested)\u003C/p>\n\u003Cdiv class=\"expressive-code\">\u003Clink rel=\"stylesheet\" href=\"/_astro/ec.y0rd3.css\">\u003Cscript type=\"module\" src=\"/_astro/ec.0vx5m.js\">\u003C/script>\u003Cfigure class=\"frame is-terminal\">\u003Cfigcaption class=\"header\">\u003Cspan class=\"title\">\u003C/span>\u003Cspan class=\"sr-only\">Terminal window\u003C/span>\u003C/figcaption>\u003Cpre data-language=\"bash\">\u003Ccode>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan style=\"--0:#B392F0;--1:#6F42C1\">npx\u003C/span>\u003Cspan style=\"--0:#E1E4E8;--1:#24292E\"> \u003C/span>\u003Cspan style=\"--0:#9ECBFF;--1:#032F62\">data-vizard\u003C/span>\u003Cspan style=\"--0:#E1E4E8;--1:#24292E\"> \u003C/span>\u003Cspan style=\"--0:#9ECBFF;--1:#032F62\">install\u003C/span>\u003C/div>\u003C/div>\u003C/code>\u003C/pre>\u003Cdiv class=\"copy\">\u003Cdiv aria-live=\"polite\">\u003C/div>\u003Cbutton title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"npx data-vizard install\">\u003Cdiv>\u003C/div>\u003C/button>\u003C/div>\u003C/figure>\u003C/div>\n\u003Cbr>\n\u003Cp>As I’m writing this, the project is at \u003Ca href=\"https://www.npmjs.com/package/data-vizard\">v0.1.5\u003C/a> and I continue to work on it.\nBeyond learning how to publish and update an npm package, building and testing it has taught me a few other things.\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Hard to enforce Skills:\u003C/strong> Skill files are good at shaping what questions get asked during the process of the LLM. But skill based workflows are weak at enforcing process steps or output quality. Those require something with actual stopping power — hooks, checklists the model has to fill out before continuing, or explicit gate steps the user has to clear.\u003C/li>\n\u003Cli>\u003Cstrong>Improvements are slow:\u003C/strong> One thing I started seeing at the beginning was the tendency of GPT models to take datasets and create a template-y data-explorer dashboard. I guess it’s because of the training data having a lot of visually boring dashboards. The only way to de-slop the outcomes and direct the models to create more unique data-visualizations was to identify the slop manually and rewrite skills to prevent them from occurring. This is naturally slow work as I need to find datasets and test outcomes to evaluate.\u003C/li>\n\u003Cli>\u003Cstrong>AI amplifies expertise:\u003C/strong> One of the ideas we discuss during the workshop is how AI is an amplifier and not a cure-all. The better your understanding of a topic, the better the outcomes tend to be. And that’s why knowing something is still important in this age of AI. Building Data-Vizard only reinforced that belief. The models are excellent at accelerating analysis, generating code and iterating on ideas but extremely poor in curating better outcomes. A human is still needed to direct, review and de-slop.\u003C/li>\n\u003C/ol>\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr\n 1fr; gap: 1rem;\">\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./gpt55.png","alt":"Open AI's GPT 5.5","index":0}\">\u003Cfigcaption>Open AI's GPT 5.5\u003C/figcaption>\u003C/figure>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./sonnet46.png","alt":"Claude Sonnet 4.6","index":0}\">\u003Cfigcaption>Claude Sonnet 4.6\u003C/figcaption>\u003C/figure>\n \u003C/div>\n\u003Col start=\"4\">\n\u003Cli>\u003Cstrong>Which model you use matters:\u003C/strong> During the workshop, someone asked whether Skills would matter as foundation models continue to improve. At the time I didn’t have a great answer. However when I was testing out data-vizard, I discovered that the given the same data, the same skill workflow being used by different models provides vastly different outcomes in terms of the quality. I believe this is because of even general models having specialized training data that optimize for a particular outcome and even a using a skill can’t standardize quality across models.\u003C/li>\n\u003Cli>\u003Cstrong>Multi-model workflows are the future:\u003C/strong> Taking this idea further implies that perhaps the best workflow would be one where you are utilizing models that are specialized to perform that particular task rather than using a generalized model. E.g., Analyst could be GPT, Narrator could be Gemini and Claude could be the Designer. One particular org may not be able to deliver the best outcome. (Diversity in AI workflows, hehe) and as we become sensitive to token costs and running local AI, we will need harnesses that make it easy to handle this.\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"conclusion\">Conclusion:\u003C/h3>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./plugin-workflow.jpg","alt":"The plugin in progress","index":0}\">\u003Cfigcaption>The plugin in progress\u003C/figcaption>\u003C/figure>\n\u003Cp>Building data-vizard has helped me drift back into creating data visualizations. I used it to create this data viz of the \u003Ca href=\"https://astral-willow-xyk8.here.now\">ongoing Fifa worldcup\u003C/a> and this visualization of \u003Ca href=\"https://devoted-huckle-mtxv.here.now\">London Salary data\u003C/a>.\u003C/p>\n\u003Cp>Like I said, Data-Vizard is still evolving, and I have plenty more ideas I’d like to explore within it. If you’d like to give it a try—or even help shape where it goes next—you can check it out at \u003Ca href=\"https://data-vizard.com/\">data-vizard.com\u003C/a>. I’d love to see what you build.\u003C/p>\n\u003Cp>—\u003C/p>\n\u003Cp>\u003Cem>P.s. If you are interested in having me host a workshop, please reach out to me on \u003Ca href=\"https://x.com/kenneth\">X\u003C/a>, \u003Ca href=\"https://bsky.app/profile/ken.cv\">bsky\u003C/a> or \u003Ca href=\"https://instagram.com/kennethmdesouza\">Instagram\u003C/a>\u003C/em>\u003C/p>",{"headings":413,"localImagePaths":416,"remoteImagePaths":417,"frontmatter":418,"imagePaths":420},[414],{"depth":44,"slug":385,"text":415},"Conclusion:",[403,404,405,406,407],[],{"title":396,"description":397,"date":419,"status":19,"image":408},["Date","2026-07-16T00:00:00.000Z"],[403,404,405,406,407],"design-in-tech-2024",{"id":421,"data":423,"body":428,"filePath":429,"assetImports":430,"digest":432,"rendered":433},{"title":424,"description":425,"date":426,"image":427,"status":19},"An Insider's perspective on Design in Tech 2024","Reflections on the state of design leadership and the industry in India and Indonesia",["Date","2024-01-01T00:00:00.000Z"],"__ASTRO_IMAGE_./4IiQQOEdmqPcCsjTqlta-1.png","After the Great Layoffs, I've been seeing too many people declaring the [death](https://www.fastcompany.com/91027996/the-big-design-freak-out-a-generation-of-design-leaders-grapple-with-their-future) of [design](https://medium.com/@martynreding/how-to-survive-the-design-leadership-reckoning-ff2856bf4733) leadership and with the rise of AI, the death of the digital design industry as well. but I find that it's a poorly informed take and no offence, but in my opinion, written by outsiders or written about a specific industry/region/designer. In fact, there are a lot of highly [priced](https://maven.com/rachel-kobetz/dls-career-architecture) [leadership](https://www.designdept.co/series/design-leadership-fundamentals) [training](https://www.aiga.org/design/design-leadership) courses out there these days.\n\nOver my career of 10 odd years, I’ve had the honour of being an observer in the product design industry of 2 countries; India and Indonesia. My perspective comes from my vantage point of living in the Silicon Valley of India and professionally, from being part of the growth stage of the well funded startups.\n\nFor this article(rant?), I will use Startups vs Big Tech for sake of categorisation. Big tech would have the minimum expectation of being a listed company operating across more than 1 geographical region. Meta and the other MAANG companies would fall into big tech but do remember that they are the new entrants in a space already filled by CISCO, Intuit, Adobe.\n\nPost the dot-com bust, we saw the slow rise of today’s modern digital startups. First in the Silicon Valley and then in the rest of the world. This was mainly fuelled by the VC funding and still is. This lead us to look up to the Silicon Valley companies and the folks there as thought leaders for design. And rightly so since they were working on products we admired and used half a world away. That scale and magnitude is definitely something to be proud of. They encountered and solved problems at scale, establishing standards, registering patents and forming user behaviours that we take for granted today\n\nBut in our part of the world, even today, digital product design is still attempting to break out of its UI and UX tags. When I started out in 2014, UI/UX was the predominant way of describing designers in big tech, and even startups. Of course there were exceptions, but I will ignore them as outliers. The startup I worked at back then, was one of the first in India to adopt Facebook's popular convention to start using the term 'Product Designer'. Back then, the Indian digital design industry was so small. You were separated by 1-2 degrees from everyone and arguably, it's still that small. The VC funding, however, gave rise to a notion that tech startups are a lucrative career compared to the dominant IT/ITES industry. This led to a gold rush fuelled by opportunistic bootcamps and certification courses, most of which churned out low skill designers. However, unlike the West, few companies thrived and hardly any have scaled and now we have a supply-demand problem at hand.\n\nThis leads us to where we are today:\n\n1. Local companies are not getting 'Big' enough or if they are, once they get listed, they need to justify costs and respond to the market. It's quite easy for decision makers to take that call and cut a few roles to keep costs in check. Easier than getting out of your software license contracts to cut costs. Also much easier to do this when others in the industry are also doing layoffs. Smaller companies mean there are fewer senior roles to be filled especially when most teams out there are feature factories who know what to build next.\n\n2. In my experience, Design leaders in startups have always been expected to play a dual role of designer + manager. In fact the designer aspect is valued a lot more while the manager title is granted to keep designers happy. That said, Most companies do not know what to do with the design leaders that they hire. So often, what you encounter is the Design Leader who is a figurehead to appease the junior designers with almost 0 influence on business outcomes or worst case, to be head of design of a design team of 1. This explains the short tenures because those roles are just not fulfilling.\n\n3. This may anger a few, but in the current state of the industry, design progression ladders don’t need an IC track beyond the level of a senior designer of 5-6 years of experience. If you are not a Meta/Google, I don’t expect there to be scope or complexity that needs Staff Designers. So where have these senior designers been going? Well some of them move into “Manager” roles without the skills to operate in them while others tend to move out of the country to join companies which may have grown to a larger size or worst case at least they get to experience a new culture.\n\n4. The skills you need as a manager are different from the ones you polished as an IC designer. Being good at Figma can only take you so far, if you don’t have an affinity for bureaucracy, then being a manager is a bad fit. On the other extreme are the managers and heads of design, usually from a background in older big tech companies, who were at positions where their job was to pontificate about design and innovation. These folk tend to be disconnected from the day-to-day work and that’s bad for the team as well. Both of these are highly replaceable roles.\n\n5. And finally, we have not moved away from the worker productivity categorisation of industrialisation. Bell curves are common, business wants to keep control and budgets are paramount. I would like to argue that Design never got a seat at the table. The \"Design Thinking\" hype that got thrown around by IBM, McKinsey, IDEO was for their own PR and has run its due course. Everyone likes an optimistic story but rarely would you find actual organization leaders(CXOs) believing in the value that Design brings to the business and actually investing into Design. That is as true today, as it was a decade ago and hence good fulfilling design jobs are few and far between.\n\n This does not paint a very rosy picture of today's design industry but after all these years, this is my honest take on the state of affairs. Perhaps we've been swayed by all the positive marketing around design, perhaps we've believed that design in tech can save the world, but in reality, designers find themselves in a dystopia that they don't want to acknowledge. The old folks of the industry who have survived, will continue to do so but if you are a beginner, if you want to stick to design in tech, I recommend that you choose a discipline like engineering or product instead and leave your empathy at the door.","src/content/writing/design-in-tech-2024/index.md",[431],"./4IiQQOEdmqPcCsjTqlta-1.png","810211681d2c5d00",{"html":434,"metadata":435},"\u003Cp>After the Great Layoffs, I’ve been seeing too many people declaring the \u003Ca href=\"https://www.fastcompany.com/91027996/the-big-design-freak-out-a-generation-of-design-leaders-grapple-with-their-future\">death\u003C/a> of \u003Ca href=\"https://medium.com/@martynreding/how-to-survive-the-design-leadership-reckoning-ff2856bf4733\">design\u003C/a> leadership and with the rise of AI, the death of the digital design industry as well. but I find that it’s a poorly informed take and no offence, but in my opinion, written by outsiders or written about a specific industry/region/designer. In fact, there are a lot of highly \u003Ca href=\"https://maven.com/rachel-kobetz/dls-career-architecture\">priced\u003C/a> \u003Ca href=\"https://www.designdept.co/series/design-leadership-fundamentals\">leadership\u003C/a> \u003Ca href=\"https://www.aiga.org/design/design-leadership\">training\u003C/a> courses out there these days.\u003C/p>\n\u003Cp>Over my career of 10 odd years, I’ve had the honour of being an observer in the product design industry of 2 countries; India and Indonesia. My perspective comes from my vantage point of living in the Silicon Valley of India and professionally, from being part of the growth stage of the well funded startups.\u003C/p>\n\u003Cp>For this article(rant?), I will use Startups vs Big Tech for sake of categorisation. Big tech would have the minimum expectation of being a listed company operating across more than 1 geographical region. Meta and the other MAANG companies would fall into big tech but do remember that they are the new entrants in a space already filled by CISCO, Intuit, Adobe.\u003C/p>\n\u003Cp>Post the dot-com bust, we saw the slow rise of today’s modern digital startups. First in the Silicon Valley and then in the rest of the world. This was mainly fuelled by the VC funding and still is. This lead us to look up to the Silicon Valley companies and the folks there as thought leaders for design. And rightly so since they were working on products we admired and used half a world away. That scale and magnitude is definitely something to be proud of. They encountered and solved problems at scale, establishing standards, registering patents and forming user behaviours that we take for granted today\u003C/p>\n\u003Cp>But in our part of the world, even today, digital product design is still attempting to break out of its UI and UX tags. When I started out in 2014, UI/UX was the predominant way of describing designers in big tech, and even startups. Of course there were exceptions, but I will ignore them as outliers. The startup I worked at back then, was one of the first in India to adopt Facebook’s popular convention to start using the term ‘Product Designer’. Back then, the Indian digital design industry was so small. You were separated by 1-2 degrees from everyone and arguably, it’s still that small. The VC funding, however, gave rise to a notion that tech startups are a lucrative career compared to the dominant IT/ITES industry. This led to a gold rush fuelled by opportunistic bootcamps and certification courses, most of which churned out low skill designers. However, unlike the West, few companies thrived and hardly any have scaled and now we have a supply-demand problem at hand.\u003C/p>\n\u003Cp>This leads us to where we are today:\u003C/p>\n\u003Col>\n\u003Cli>\n\u003Cp>Local companies are not getting ‘Big’ enough or if they are, once they get listed, they need to justify costs and respond to the market. It’s quite easy for decision makers to take that call and cut a few roles to keep costs in check. Easier than getting out of your software license contracts to cut costs. Also much easier to do this when others in the industry are also doing layoffs. Smaller companies mean there are fewer senior roles to be filled especially when most teams out there are feature factories who know what to build next.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>In my experience, Design leaders in startups have always been expected to play a dual role of designer + manager. In fact the designer aspect is valued a lot more while the manager title is granted to keep designers happy. That said, Most companies do not know what to do with the design leaders that they hire. So often, what you encounter is the Design Leader who is a figurehead to appease the junior designers with almost 0 influence on business outcomes or worst case, to be head of design of a design team of 1. This explains the short tenures because those roles are just not fulfilling.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>This may anger a few, but in the current state of the industry, design progression ladders don’t need an IC track beyond the level of a senior designer of 5-6 years of experience. If you are not a Meta/Google, I don’t expect there to be scope or complexity that needs Staff Designers. So where have these senior designers been going? Well some of them move into “Manager” roles without the skills to operate in them while others tend to move out of the country to join companies which may have grown to a larger size or worst case at least they get to experience a new culture.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>The skills you need as a manager are different from the ones you polished as an IC designer. Being good at Figma can only take you so far, if you don’t have an affinity for bureaucracy, then being a manager is a bad fit. On the other extreme are the managers and heads of design, usually from a background in older big tech companies, who were at positions where their job was to pontificate about design and innovation. These folk tend to be disconnected from the day-to-day work and that’s bad for the team as well. Both of these are highly replaceable roles.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>And finally, we have not moved away from the worker productivity categorisation of industrialisation. Bell curves are common, business wants to keep control and budgets are paramount. I would like to argue that Design never got a seat at the table. The “Design Thinking” hype that got thrown around by IBM, McKinsey, IDEO was for their own PR and has run its due course. Everyone likes an optimistic story but rarely would you find actual organization leaders(CXOs) believing in the value that Design brings to the business and actually investing into Design. That is as true today, as it was a decade ago and hence good fulfilling design jobs are few and far between.\u003C/p>\n\u003Cp>This does not paint a very rosy picture of today’s design industry but after all these years, this is my honest take on the state of affairs. Perhaps we’ve been swayed by all the positive marketing around design, perhaps we’ve believed that design in tech can save the world, but in reality, designers find themselves in a dystopia that they don’t want to acknowledge. The old folks of the industry who have survived, will continue to do so but if you are a beginner, if you want to stick to design in tech, I recommend that you choose a discipline like engineering or product instead and leave your empathy at the door.\u003C/p>\n\u003C/li>\n\u003C/ol>",{"headings":436,"localImagePaths":437,"remoteImagePaths":438,"frontmatter":439,"imagePaths":441},[],[],[],{"title":424,"description":425,"date":440,"image":431},"2024-01-01",[],"design-tools-decade",{"id":442,"data":444,"body":449,"filePath":450,"assetImports":451,"digest":457,"rendered":458},{"title":445,"description":446,"date":447,"image":448,"status":19},"How far we've come: The last decade of design tools","A lookback at the evolution of design tools from Photoshop to Figma",["Date","2024-01-15T00:00:00.000Z"],"__ASTRO_IMAGE_./lookback-design-tools-1.jpg","Last night, I was thinking about how much the interface design and prototyping landscape has changed in the last decade. I started using Sketch and Marvelapp in 2014 when the predominant tools were Adobe Illustrator/Photoshop/Fireworks for UI, Balsamiq for low fidelity, Axure, Omnigraffle and Keynote for clickable prototypes. Some of these still exist today. While others like Antetype, Invision are no more.\n\nI was taught to design on [Photoshop](https://graphicdesign.stackexchange.com/questions/17928/what-is-the-exact-role-relationship-of-photoshop-in-web-design) at my first job. Even though, modern app stores had released three years earlier, websites was what we were designing back then. The Photoshop art boards we designed, would be ‘sliced’ and used in our HTML/CSS mockups. '[Redlining](https://x.com/teehanlax/status/560820287953195008)' was common practice for dev handovers. For personal projects and at hackathons, new age CSS/JS libraries like [Twitter Bootstrap](https://getbootstrap.com/1.0.0/) started being used. The designs I made back then are horrible and still exist in un-recoverable file formats (Okay, I actually found a photo of [one design](https://photos.app.goo.gl/yx1heXKvGiAFAkNn7)). Back then, I was a developer with an engineering degree working in a MNC IT company so I can’t blame myself for it.\n\n![A wireframe of mine from March 2012 for an event discovery startup idea.](./lookback-design-tools-1.jpg)\n\nWhen I was at Design school, using Adobe Illustrator for its vector capabilities became common place. We worked on information graphics and photoshop just didn't cut it for our workflow. It was largely a skill problem since we had no teachers for our tools, whatever we did was with knowledge from the internet and our peers. Outside in the world, the industry was using tools like Axure, Omnigraffle and Keynote and Teehan+Lax had legendary status in their community for their annual release of their iOS kits.\n\n![Teehan+Lax pictured in their iconic profile photo](./lookback-design-tools-2.jpg)\n\nBy the time we graduated, there had been changes in this ecosystem. Sketch started picking up market share, smart phone penetration was trending up and collaboration became an important buzzword. It was 2014.\n\nBy the time, I started my internship, Material Design had launched and I upgraded from my ancient Sony Viao to a MacBook Air (on EMI). We adopted Sketch and Marvelapp at my workplace.\n\n![My first Marvelapp prototype - June 2014. Created for my Master's submission, still seems to work.](./lookback-design-tools-3.png)\n\nBack then, Sketch files were saved in Google Drive Shared Drives for archival and access across the team. You still needed a license to access proprietary content so we still needed to redline screens and share exports in folders. This lead to tools like Zeplin, Invision and Marvelapp coming in to fill this gap. The next year, Facebook released [Origami](https://engineering.fb.com/2015/02/24/ios/introducing-origami-live/) built on top of Quartz Composer followed by [Framer 1.0](https://medium.com/insightdesign/this-is-how-i-tried-framer-in-8-active-hours-trial-c4a8a0392267) in the next year. That was the start of making prototypes multi-dimensional and letting users “interact” with UI elements and granting access to device hardware sensors like camera. There were [people](https://medium.com/framer-prototyping/making-framer-prototypes-talk-to-each-other-web-sockets-framer-85eedd2243aa) [that I](https://dribbble.com/shots/3699875-Life-Advices-app-Concept/attachments/9971472?mode=media) [knew](https://x.com/vikxlp/status/893453311210250240) making really cool stuff with this.\n\n![An Android date selector prototype I designed on Pixate and got implemented in 2015](./lookback-design-tools-4.png)\n\nNext, Figma and Abstract started up trying to solve the file organization and collaboration problem in their own way; Figma’s USP was that it was browser based and hence could be used by non-mac users so great for budding designers who couldn’t afford a Mac. I didn't use Figma until Jan 2022.\n\nAbstract targeted the existing Sketch user base and tried to introduce branching to the designer audience (albeit unsuccessfully?). [Framer X](https://blog.prototypr.io/framer-x-preview-9d067f35cf9a) built some hype but it didn’t catch on. I had beta access and building out a component system on Framer X(React) needed Dev support which most design teams didn’t have the luxury of. This (circa 2019) is when you started noticing design teams around the world having UX Engineers in their rosters. Design systems evolved out of style guides with the help of UX engineering and now we take design sytems to have both a design and code aspect to them along with voice, tone, illustrations, etc.\n\n![A responsive no-code app I built on Glide to help me expense bills for work travel](./lookback-design-tools-5.png)\n\nThen came the no-code/low-code revolution which simplified the ease of creation further and tools like Glideapps, Bubble and Landbot now make it easy for you to prototype and share ideas. And that brings us to 2024, where we are seeing the rise of AI assisted design and dev tools getting focus. These aren’t there yet but I wish with this we can sunset that beaten to death question of “Should designers code?”","src/content/writing/design-tools-decade/index.md",[452,453,454,455,456],"./lookback-design-tools-1.jpg","./lookback-design-tools-2.jpg","./lookback-design-tools-3.png","./lookback-design-tools-4.png","./lookback-design-tools-5.png","a11d46d7e892ab01",{"html":459,"metadata":460},"\u003Cp>Last night, I was thinking about how much the interface design and prototyping landscape has changed in the last decade. I started using Sketch and Marvelapp in 2014 when the predominant tools were Adobe Illustrator/Photoshop/Fireworks for UI, Balsamiq for low fidelity, Axure, Omnigraffle and Keynote for clickable prototypes. Some of these still exist today. While others like Antetype, Invision are no more.\u003C/p>\n\u003Cp>I was taught to design on \u003Ca href=\"https://graphicdesign.stackexchange.com/questions/17928/what-is-the-exact-role-relationship-of-photoshop-in-web-design\">Photoshop\u003C/a> at my first job. Even though, modern app stores had released three years earlier, websites was what we were designing back then. The Photoshop art boards we designed, would be ‘sliced’ and used in our HTML/CSS mockups. ‘\u003Ca href=\"https://x.com/teehanlax/status/560820287953195008\">Redlining\u003C/a>’ was common practice for dev handovers. For personal projects and at hackathons, new age CSS/JS libraries like \u003Ca href=\"https://getbootstrap.com/1.0.0/\">Twitter Bootstrap\u003C/a> started being used. The designs I made back then are horrible and still exist in un-recoverable file formats (Okay, I actually found a photo of \u003Ca href=\"https://photos.app.goo.gl/yx1heXKvGiAFAkNn7\">one design\u003C/a>). Back then, I was a developer with an engineering degree working in a MNC IT company so I can’t blame myself for it.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./lookback-design-tools-1.jpg","alt":"A wireframe of mine from March 2012 for an event discovery startup idea.","index":0}\">\u003Cfigcaption>A wireframe of mine from March 2012 for an event discovery startup idea.\u003C/figcaption>\u003C/figure>\n\u003Cp>When I was at Design school, using Adobe Illustrator for its vector capabilities became common place. We worked on information graphics and photoshop just didn’t cut it for our workflow. It was largely a skill problem since we had no teachers for our tools, whatever we did was with knowledge from the internet and our peers. Outside in the world, the industry was using tools like Axure, Omnigraffle and Keynote and Teehan+Lax had legendary status in their community for their annual release of their iOS kits.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./lookback-design-tools-2.jpg","alt":"Teehan+Lax pictured in their iconic profile photo","index":0}\">\u003Cfigcaption>Teehan+Lax pictured in their iconic profile photo\u003C/figcaption>\u003C/figure>\n\u003Cp>By the time we graduated, there had been changes in this ecosystem. Sketch started picking up market share, smart phone penetration was trending up and collaboration became an important buzzword. It was 2014.\u003C/p>\n\u003Cp>By the time, I started my internship, Material Design had launched and I upgraded from my ancient Sony Viao to a MacBook Air (on EMI). We adopted Sketch and Marvelapp at my workplace.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./lookback-design-tools-3.png","alt":"My first Marvelapp prototype - June 2014. Created for my Master's submission, still seems to work.","index":0}\">\u003Cfigcaption>My first Marvelapp prototype - June 2014. Created for my Master's submission, still seems to work.\u003C/figcaption>\u003C/figure>\n\u003Cp>Back then, Sketch files were saved in Google Drive Shared Drives for archival and access across the team. You still needed a license to access proprietary content so we still needed to redline screens and share exports in folders. This lead to tools like Zeplin, Invision and Marvelapp coming in to fill this gap. The next year, Facebook released \u003Ca href=\"https://engineering.fb.com/2015/02/24/ios/introducing-origami-live/\">Origami\u003C/a> built on top of Quartz Composer followed by \u003Ca href=\"https://medium.com/insightdesign/this-is-how-i-tried-framer-in-8-active-hours-trial-c4a8a0392267\">Framer 1.0\u003C/a> in the next year. That was the start of making prototypes multi-dimensional and letting users “interact” with UI elements and granting access to device hardware sensors like camera. There were \u003Ca href=\"https://medium.com/framer-prototyping/making-framer-prototypes-talk-to-each-other-web-sockets-framer-85eedd2243aa\">people\u003C/a> \u003Ca href=\"https://dribbble.com/shots/3699875-Life-Advices-app-Concept/attachments/9971472?mode=media\">that I\u003C/a> \u003Ca href=\"https://x.com/vikxlp/status/893453311210250240\">knew\u003C/a> making really cool stuff with this.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./lookback-design-tools-4.png","alt":"An Android date selector prototype I designed on Pixate and got implemented in 2015","index":0}\">\u003Cfigcaption>An Android date selector prototype I designed on Pixate and got implemented in 2015\u003C/figcaption>\u003C/figure>\n\u003Cp>Next, Figma and Abstract started up trying to solve the file organization and collaboration problem in their own way; Figma’s USP was that it was browser based and hence could be used by non-mac users so great for budding designers who couldn’t afford a Mac. I didn’t use Figma until Jan 2022.\u003C/p>\n\u003Cp>Abstract targeted the existing Sketch user base and tried to introduce branching to the designer audience (albeit unsuccessfully?). \u003Ca href=\"https://blog.prototypr.io/framer-x-preview-9d067f35cf9a\">Framer X\u003C/a> built some hype but it didn’t catch on. I had beta access and building out a component system on Framer X(React) needed Dev support which most design teams didn’t have the luxury of. This (circa 2019) is when you started noticing design teams around the world having UX Engineers in their rosters. Design systems evolved out of style guides with the help of UX engineering and now we take design sytems to have both a design and code aspect to them along with voice, tone, illustrations, etc.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./lookback-design-tools-5.png","alt":"A responsive no-code app I built on Glide to help me expense bills for work travel","index":0}\">\u003Cfigcaption>A responsive no-code app I built on Glide to help me expense bills for work travel\u003C/figcaption>\u003C/figure>\n\u003Cp>Then came the no-code/low-code revolution which simplified the ease of creation further and tools like Glideapps, Bubble and Landbot now make it easy for you to prototype and share ideas. And that brings us to 2024, where we are seeing the rise of AI assisted design and dev tools getting focus. These aren’t there yet but I wish with this we can sunset that beaten to death question of “Should designers code?”\u003C/p>",{"headings":461,"localImagePaths":462,"remoteImagePaths":463,"frontmatter":464,"imagePaths":466},[],[452,453,454,455,456],[],{"title":445,"description":446,"date":465,"image":452},"2024-01-15",[452,453,454,455,456],"hiring",{"id":467,"data":469,"body":474,"filePath":475,"assetImports":476,"digest":478,"rendered":479},{"title":470,"description":471,"date":472,"image":473,"status":19},"Thoughts on Hiring","Best practices for hiring designers based on my experiences hiring over the last 6 years",["Date","2021-08-19T00:00:00.000Z"],"__ASTRO_IMAGE_./design-keliling.jpg","> \"For every open job on your team, you need to spend one hour a day on recruiting-related activities. Cap that investment at 50% of your time.\"\n>\n> –– [Rands](https://randsinrepose.com/archives/how-to-recruit/)\n\nI strongly believe that hiring is a critical focus area for a design leader. I've been part of hiring panels since 2015. I've seen companies usually do not focus on hiring flows leading them to have a bad experience for interviewing candidates.\n\nI gave a short talk about hiring designers at a friend's startup in 2018 which could be drilled down into the following key points.\n\n1. **Write good job descriptions:**\n The industry is filled with nonsense JDs ~written~ copy-pasted by HRs. If you need to stand out, you need to write a good JD.\n Hire a design consultant to help you out with this if you are hiring the first designer for your startup.\n2. **Don't let a portfolio be a barrier for applying:**\n For entry level roles, I feel a portfolio acts like your resume but when you start hiring for senior designer roles you may want to broaden the application criteria.\n Most designers I know do not have an updated portfolio and this prevents them from applying to your startup if they are interested.\n3. **Customize application form to allow folks to upload a digital document:**\n The tool you use to run your hiring needs to be flexible to cater to your design hiring needs. \n At Gojek, we used Lever and for the longest time we did not have a way for designer applicants to upload a pdf portfolio.\n Binoy and I sat and figured out how to add it to the application form, however for internal referrals we were not able to enable it as Lever doesnt let you customize the form.\n4. **Keep the face-to-face rounds short:**\n In the interest of everyone's time, its best if you can earmark a particular day of the week for interviews and schedule all the rounds on that day for candidates.\n For this to work, your screening rounds need to be well designed so as to not overload your panelists.\n5. **Scaling the process:**\n If you have a lot of reqs to fill, you will need to get others to take part in the interview process.\n Playbooks and evaluation templates help scale the process while maintaining quality.\n \n\u003Cp class=\"attribution\"> Cover image: Taken at the end of the Bandung edition of \u003Ca href=\"https://www.linkedin.com/posts/trinugraha_gojekdesainkeliling-activity-6594891829370556416--yhf\">Gojek Desain Keliling\u003C/a>, Gojek's attempt to recruit designers in a sort of reality contest where winners would get golden tickets\n and a chance to be a part of the Gojek design team.\u003C/p>","src/content/writing/hiring/index.md",[477],"./design-keliling.jpg","16472590845e8714",{"html":480,"metadata":481},"\u003Cblockquote>\n\u003Cp>“For every open job on your team, you need to spend one hour a day on recruiting-related activities. Cap that investment at 50% of your time.”\u003C/p>\n\u003Cp>–– \u003Ca href=\"https://randsinrepose.com/archives/how-to-recruit/\">Rands\u003C/a>\u003C/p>\n\u003C/blockquote>\n\u003Cp>I strongly believe that hiring is a critical focus area for a design leader. I’ve been part of hiring panels since 2015. I’ve seen companies usually do not focus on hiring flows leading them to have a bad experience for interviewing candidates.\u003C/p>\n\u003Cp>I gave a short talk about hiring designers at a friend’s startup in 2018 which could be drilled down into the following key points.\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Write good job descriptions:\u003C/strong>\nThe industry is filled with nonsense JDs \u003Cdel>written\u003C/del> copy-pasted by HRs. If you need to stand out, you need to write a good JD.\nHire a design consultant to help you out with this if you are hiring the first designer for your startup.\u003C/li>\n\u003Cli>\u003Cstrong>Don’t let a portfolio be a barrier for applying:\u003C/strong>\nFor entry level roles, I feel a portfolio acts like your resume but when you start hiring for senior designer roles you may want to broaden the application criteria.\nMost designers I know do not have an updated portfolio and this prevents them from applying to your startup if they are interested.\u003C/li>\n\u003Cli>\u003Cstrong>Customize application form to allow folks to upload a digital document:\u003C/strong>\nThe tool you use to run your hiring needs to be flexible to cater to your design hiring needs.\nAt Gojek, we used Lever and for the longest time we did not have a way for designer applicants to upload a pdf portfolio.\nBinoy and I sat and figured out how to add it to the application form, however for internal referrals we were not able to enable it as Lever doesnt let you customize the form.\u003C/li>\n\u003Cli>\u003Cstrong>Keep the face-to-face rounds short:\u003C/strong>\nIn the interest of everyone’s time, its best if you can earmark a particular day of the week for interviews and schedule all the rounds on that day for candidates.\nFor this to work, your screening rounds need to be well designed so as to not overload your panelists.\u003C/li>\n\u003Cli>\u003Cstrong>Scaling the process:\u003C/strong>\nIf you have a lot of reqs to fill, you will need to get others to take part in the interview process.\nPlaybooks and evaluation templates help scale the process while maintaining quality.\u003C/li>\n\u003C/ol>\n\u003Cp class=\"attribution\"> Cover image: Taken at the end of the Bandung edition of \u003Ca href=\"https://www.linkedin.com/posts/trinugraha_gojekdesainkeliling-activity-6594891829370556416--yhf\">Gojek Desain Keliling\u003C/a>, Gojek's attempt to recruit designers in a sort of reality contest where winners would get golden tickets\n and a chance to be a part of the Gojek design team.\u003C/p>",{"headings":482,"localImagePaths":483,"remoteImagePaths":484,"frontmatter":485,"imagePaths":487},[],[],[],{"title":470,"description":471,"date":486,"image":477},"2021-08-19",[],"hiring-2",{"id":488,"data":490,"body":495,"filePath":496,"assetImports":497,"digest":499,"rendered":500},{"title":491,"description":492,"date":493,"image":494,"status":19},"Thoughts on Hiring, part 2","Reflections on hiring based on my experience building the product design team at Jiva",["Date","2025-12-07T00:00:00.000Z"],"__ASTRO_IMAGE_./whiteboard.JPG","There are lot of opinions out there about hiring. [Part 1](https://kenneth.dsouza.im/writing/hiring/) was written in 2020-21, when I was on interview panels for product design and product management. Whereas Part 2 consists of my reflections\nafter being in the role of the hiring manager and co-designing Jiva's hiring process.\n\n### 1. Your hiring process is a reflection of your culture\n\nThe design hiring process isn't standardised. These days you'll see a variety of rounds; visual portfolios, take-home assignments, whiteboarding sessions, etc. The mix you choose isn't random; it's a *reflection* of your organization's culture. You're designing a candidate's very first experience of how your team thinks and works.\n\nDifferent rounds signal different things. Asking for visual designs in a portfolio implies that your product team drives the flows and you need someone with strong visual craft. Take-home assignments (and their subsequent presentation) reveal the candidate's communication skills, which can be especially useful if your team works in a traditional \"siloed\" setup. Collaborative whiteboarding sessions show you how it feels to partner with them day-to-day but usually your organization's designers work solo within their own teams.\n\nNone of these are inherently wrong. But if you are not mindful about your processes you end up unnecessarily making the candidate experience time consuming, anxiety-filled, and worse, you start evaluating candidates for the wrong set of attributes — a costly mistake that almost always leads to failure down the line. \n\u003C!-- (You can read about how we designed our product design hiring process at Jiva here.) -->\n\n\n### 2. Today’s design team needs to be multi-faceted\n\nWhen I first started taking interviews (in 2015), my evaluation criteria naturally leaned toward a certain kind of product designer — usually someone whose strengths mirrored what **I** personally valued. That worked when every designer owned a single product end-to-end. But as the organization grew, this approach started breaking down. Designers now had to work together, share problem spaces, and complement one another's strengths rather than operate in isolation and we hadn't hired for that.\n\nA better approach — and one I wish I had learnt earlier[^1] — is to step back and visualise your team's skillset as a whole. One simple way to do this is by mapping your organization's design competencies onto a rough [spider chart or competency map](https://medium.com/shapingdesign/the-ux-spectrum-cb29f048faf9)[^2] and plotting each designer against it. It doesn’t need to be perfect; the point is to create a shared view of where your team is strong, where it’s weak, and if you’re overly dependent on the skills of a single person. \n\n![UX Spectrum via Jason Mesut's Shaping Design series](https://miro.medium.com/v2/resize:fit:2000/format:webp/1*Vi4kDiI5uLhlXJdztg7lwg.png)\n\nThis kind of visualisation becomes even more valuable when you’re managing multiple teams or products. It gives you clarity on what gaps you’re trying to fill, instead of defaulting to hiring “more of the same.” For example, pairing a highly visual designer with a more analytical one can create a healthier balance, with each designer taking control of the tasks as per their skill sets. \n\nIn other words, what you need to realise is that you are not hiring an individual — you’re shaping the distribution of strengths and weaknesses across your entire design function. \n\n\n### 3. There is no place for ego in the team\n\nIt’s called a design team for a reason. The product the user experiences should feel seamless, not like a patchwork of different personalities, preferences, or stylistic signatures. One of the biggest gaps in a skills-only evaluation is that it completely misses the *collaboration layer* of design: how someone shows up, how they listen, and how they work with others under pressure. \n\nYour spider chart or competency map can show you strengths and weaknesses in craft, but it won't tell you whether a candidate can actually work well with the rest of your organization. That’s where cultural alignment matters. A designer who is stubborn, who refuses to take cross-functional feedback, or insists on “their way” will quickly become a bottleneck — no matter how talented they are. \n\nGetting people who play well together is one of the most underrated aspects of building a high-performing design org. A difficult personality erodes trust, slows down execution, and adds unnecessary emotional weight on everyone else — a mess that you, as the design manager, will spend a lot of time and energy sorting out. \n\nThis is why running a “vibe check” through your existing team — designers, PMs, engineers — can be invaluable. These aren’t popularity tests; they’re ways to sense how someone collaborates in real, messy, day-to-day situations and to check how excited stakeholders are about working with the candidate.\n\nThe goal isn’t to hire the best individual — it’s to hire the person who will make the team stronger.\n\n\n\u003Cp class=\"attribution\"> Cover image: Akshay, Hetang and Riya working on a whiteboard at Practo, 4 April 2017\u003C/p>\n\n[^1]: Derived learning from faculty from Ownpath Manager training in Q1 2020 where we interacted with Kristin Skinner, Alysha Naples, and Meredith Black.\n[^2]: Jason Mesut's Shaping Design series of posts is full of useful toolkits and design management frameworks.","src/content/writing/hiring-2/index.md",[498],"./whiteboard.JPG","b23c68bc14f2b699",{"html":501,"metadata":502},"\u003Cp>There are lot of opinions out there about hiring. \u003Ca href=\"https://kenneth.dsouza.im/writing/hiring/\">Part 1\u003C/a> was written in 2020-21, when I was on interview panels for product design and product management. Whereas Part 2 consists of my reflections\nafter being in the role of the hiring manager and co-designing Jiva’s hiring process.\u003C/p>\n\u003Ch3 id=\"1-your-hiring-process-is-a-reflection-of-your-culture\">1. Your hiring process is a reflection of your culture\u003C/h3>\n\u003Cp>The design hiring process isn’t standardised. These days you’ll see a variety of rounds; visual portfolios, take-home assignments, whiteboarding sessions, etc. The mix you choose isn’t random; it’s a \u003Cem>reflection\u003C/em> of your organization’s culture. You’re designing a candidate’s very first experience of how your team thinks and works.\u003C/p>\n\u003Cp>Different rounds signal different things. Asking for visual designs in a portfolio implies that your product team drives the flows and you need someone with strong visual craft. Take-home assignments (and their subsequent presentation) reveal the candidate’s communication skills, which can be especially useful if your team works in a traditional “siloed” setup. Collaborative whiteboarding sessions show you how it feels to partner with them day-to-day but usually your organization’s designers work solo within their own teams.\u003C/p>\n\u003Cp>None of these are inherently wrong. But if you are not mindful about your processes you end up unnecessarily making the candidate experience time consuming, anxiety-filled, and worse, you start evaluating candidates for the wrong set of attributes — a costly mistake that almost always leads to failure down the line.\u003C/p>\n\u003C!-- (You can read about how we designed our product design hiring process at Jiva here.) -->\n\u003Ch3 id=\"2-todays-design-team-needs-to-be-multi-faceted\">2. Today’s design team needs to be multi-faceted\u003C/h3>\n\u003Cp>When I first started taking interviews (in 2015), my evaluation criteria naturally leaned toward a certain kind of product designer — usually someone whose strengths mirrored what \u003Cstrong>I\u003C/strong> personally valued. That worked when every designer owned a single product end-to-end. But as the organization grew, this approach started breaking down. Designers now had to work together, share problem spaces, and complement one another’s strengths rather than operate in isolation and we hadn’t hired for that.\u003C/p>\n\u003Cp>A better approach — and one I wish I had learnt earlier\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup> — is to step back and visualise your team’s skillset as a whole. One simple way to do this is by mapping your organization’s design competencies onto a rough \u003Ca href=\"https://medium.com/shapingdesign/the-ux-spectrum-cb29f048faf9\">spider chart or competency map\u003C/a>\u003Csup>\u003Ca href=\"#user-content-fn-2\" id=\"user-content-fnref-2\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">2\u003C/a>\u003C/sup> and plotting each designer against it. It doesn’t need to be perfect; the point is to create a shared view of where your team is strong, where it’s weak, and if you’re overly dependent on the skills of a single person.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg src=\"https://miro.medium.com/v2/resize:fit:2000/format:webp/1*Vi4kDiI5uLhlXJdztg7lwg.png\" alt=\"UX Spectrum via Jason Mesut's Shaping Design series\">\u003Cfigcaption>UX Spectrum via Jason Mesut's Shaping Design series\u003C/figcaption>\u003C/figure>\n\u003Cp>This kind of visualisation becomes even more valuable when you’re managing multiple teams or products. It gives you clarity on what gaps you’re trying to fill, instead of defaulting to hiring “more of the same.” For example, pairing a highly visual designer with a more analytical one can create a healthier balance, with each designer taking control of the tasks as per their skill sets.\u003C/p>\n\u003Cp>In other words, what you need to realise is that you are not hiring an individual — you’re shaping the distribution of strengths and weaknesses across your entire design function.\u003C/p>\n\u003Ch3 id=\"3-there-is-no-place-for-ego-in-the-team\">3. There is no place for ego in the team\u003C/h3>\n\u003Cp>It’s called a design team for a reason. The product the user experiences should feel seamless, not like a patchwork of different personalities, preferences, or stylistic signatures. One of the biggest gaps in a skills-only evaluation is that it completely misses the \u003Cem>collaboration layer\u003C/em> of design: how someone shows up, how they listen, and how they work with others under pressure.\u003C/p>\n\u003Cp>Your spider chart or competency map can show you strengths and weaknesses in craft, but it won’t tell you whether a candidate can actually work well with the rest of your organization. That’s where cultural alignment matters. A designer who is stubborn, who refuses to take cross-functional feedback, or insists on “their way” will quickly become a bottleneck — no matter how talented they are.\u003C/p>\n\u003Cp>Getting people who play well together is one of the most underrated aspects of building a high-performing design org. A difficult personality erodes trust, slows down execution, and adds unnecessary emotional weight on everyone else — a mess that you, as the design manager, will spend a lot of time and energy sorting out.\u003C/p>\n\u003Cp>This is why running a “vibe check” through your existing team — designers, PMs, engineers — can be invaluable. These aren’t popularity tests; they’re ways to sense how someone collaborates in real, messy, day-to-day situations and to check how excited stakeholders are about working with the candidate.\u003C/p>\n\u003Cp>The goal isn’t to hire the best individual — it’s to hire the person who will make the team stronger.\u003C/p>\n\u003Cp class=\"attribution\"> Cover image: Akshay, Hetang and Riya working on a whiteboard at Practo, 4 April 2017\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Derived learning from faculty from Ownpath Manager training in Q1 2020 where we interacted with Kristin Skinner, Alysha Naples, and Meredith Black. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-2\">\n\u003Cp>Jason Mesut’s Shaping Design series of posts is full of useful toolkits and design management frameworks. \u003Ca href=\"#user-content-fnref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":503,"localImagePaths":514,"remoteImagePaths":515,"frontmatter":516,"imagePaths":518},[504,507,510,513],{"depth":44,"slug":505,"text":506},"1-your-hiring-process-is-a-reflection-of-your-culture","1. Your hiring process is a reflection of your culture",{"depth":44,"slug":508,"text":509},"2-todays-design-team-needs-to-be-multi-faceted","2. Today’s design team needs to be multi-faceted",{"depth":44,"slug":511,"text":512},"3-there-is-no-place-for-ego-in-the-team","3. There is no place for ego in the team",{"depth":37,"slug":85,"text":86},[],[],{"title":491,"description":492,"date":517,"status":19,"image":498},"2025-12-07",[],"how-i-build-with-ai",{"id":519,"data":521,"body":526,"filePath":527,"assetImports":528,"digest":532,"rendered":533},{"title":522,"description":523,"date":524,"image":525,"status":19},"How I build with AI","A short overview of how I use AI when making my projects",["Date","2026-05-21T00:00:00.000Z"],"__ASTRO_IMAGE_./how-i-build.png","I've been making stuff almost every week (like this [threejs space-viz](https://eternal-nebula-33dy.here.now/) this week), not everything I make ends up being shared but there's a particular method to my madness.\n\n### Measure twice, cut once\nMost of my projects start their journey in a Claude Chat. Claude's research and artifact generation capabilities accessible from anywhere via mobile makes it easy to riff on the idea while on-the-go. Plus given my product and design experience, it's easy for me to do this as I can visualize designs and flows in my mind. \n\n![An example of how a UI description vs Output looks like](./grindsize.png)\n\nIf you are unclear about the technologies, you can get Claude to ask you questions to refine the idea. This conversation at the beginning of a project is like the understand phase of the design process. \n\nYou can consider using [/grill-me](https://www.aihero.dev/my-grill-me-skill-has-gone-viral) as well.\n### Ready, Set up, Go\nThe next step involves downloading the artifact (or plan.md, figma make file, etc) to my laptop and create a github repo to work in. Depending on the task and my situation, I spin up Claude on local or on cloud. \n\nAlthough I started using Claude via the cloud setup and moved to Claude Desktop, using Claude via terminal has been easier because it can do more for lazy old me without being buggy as Claude desktop. (note to anthropic: steal codex's reliability and not it's style) \n\nI don't use skills, etc at the start. I feel [they are over-rated](https://blog.jim-nielsen.com/2026/opacity-of-generative-tools/) and is like outsourcing your design decisions. I don't work with an org or a design system so making my own 'design.md' feels unnecessary. I rather spend this time finding references and making mood boards. I don't build complicated technical systems, so I don't worry about code quality either. Most of my projects are a single HTML file. YMMV.\n### Rinse and Repeat\nWhile I rarely use skills while creating, spawning sub-agents is something I've started to adopt. For e.g, for [grindsize.in](https://grindsize.in), where scaling the project would expect me to do repeated tasks, I employ 2 [sub-agents](https://github.com/inosaint/grinder-calibrator/tree/main/.claude/agents). I don't write these sub-agents, but just like my approach with skills, I ask Claude to generate them for me. When defining skills, I do specify the kind of model I want to power the sub-agent based on the task complexity and for token conservation. \n\nThe process of creating sub-agents is similar to my process of creating skills. I make Claude create an outcome I plan. I test and review it. I make changes where required. Once I'm certain of the quality of the outcome, I check with Claude about making the process into an agent/skill. A point to note is that at times, certain process may work better as code rather than an agent. Listen to Claude.\n### Tests, Evals... 🚀\nTesting takes like 90% of my time on every project. Making everything responsive is hard and the browser space is fragmented and it has led me to some interesting browser specific bugs that have stumped the LLMs. ngl, it's feels great to solve them and I can do that because I understand a bit of web technology. \n\nAnother thing I wish I did more of is *evals*. Evals helps me when I don't understand the code that is being written. I get another agent to review one agent's work. I consider it to be like a design critique or code review. To manage complex projects and usage limits, I keep a memory.md, agents.md and claude.md files to help with this back and forth.\n\nIf you are looking to use evals, consider impeccable's [critique](https://impeccable.style/docs/critique/) to see how it works,\n\n![How variant helped me improve the visual style of Dominic, a AI based Figma Plugin](./variant.png)\n### LLM based tools I currently use:\n- **Claude Code:** Bulk of my work is done on Sonnet + API.\n- **Codex (Free):** Mainly for evals and bug fixes\n- **ChatGPT:** Prompt definition, Image gen, API\n- **Gemini(Plus):** ImageGen, Deep Research and Prompt definition\n- **Variant.com:** Amazing for a functional minded designer like me, not sure how long they can survive though.\n\n--\n\n*If you are non-technical and want to learn how to to use AI to build, you can check out my free guide at [howtoaicode.com](https://howtoaicode.com)*","src/content/writing/how-i-build-with-ai/index.md",[529,530,531],"./grindsize.png","./variant.png","./how-i-build.png","1bb8d3aeea7d31cd",{"html":534,"metadata":535},"\u003Cp>I’ve been making stuff almost every week (like this \u003Ca href=\"https://eternal-nebula-33dy.here.now/\">threejs space-viz\u003C/a> this week), not everything I make ends up being shared but there’s a particular method to my madness.\u003C/p>\n\u003Ch3 id=\"measure-twice-cut-once\">Measure twice, cut once\u003C/h3>\n\u003Cp>Most of my projects start their journey in a Claude Chat. Claude’s research and artifact generation capabilities accessible from anywhere via mobile makes it easy to riff on the idea while on-the-go. Plus given my product and design experience, it’s easy for me to do this as I can visualize designs and flows in my mind.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./grindsize.png","alt":"An example of how a UI description vs Output looks like","index":0}\">\u003Cfigcaption>An example of how a UI description vs Output looks like\u003C/figcaption>\u003C/figure>\n\u003Cp>If you are unclear about the technologies, you can get Claude to ask you questions to refine the idea. This conversation at the beginning of a project is like the understand phase of the design process.\u003C/p>\n\u003Cp>You can consider using \u003Ca href=\"https://www.aihero.dev/my-grill-me-skill-has-gone-viral\">/grill-me\u003C/a> as well.\u003C/p>\n\u003Ch3 id=\"ready-set-up-go\">Ready, Set up, Go\u003C/h3>\n\u003Cp>The next step involves downloading the artifact (or plan.md, figma make file, etc) to my laptop and create a github repo to work in. Depending on the task and my situation, I spin up Claude on local or on cloud.\u003C/p>\n\u003Cp>Although I started using Claude via the cloud setup and moved to Claude Desktop, using Claude via terminal has been easier because it can do more for lazy old me without being buggy as Claude desktop. (note to anthropic: steal codex’s reliability and not it’s style)\u003C/p>\n\u003Cp>I don’t use skills, etc at the start. I feel \u003Ca href=\"https://blog.jim-nielsen.com/2026/opacity-of-generative-tools/\">they are over-rated\u003C/a> and is like outsourcing your design decisions. I don’t work with an org or a design system so making my own ‘design.md’ feels unnecessary. I rather spend this time finding references and making mood boards. I don’t build complicated technical systems, so I don’t worry about code quality either. Most of my projects are a single HTML file. YMMV.\u003C/p>\n\u003Ch3 id=\"rinse-and-repeat\">Rinse and Repeat\u003C/h3>\n\u003Cp>While I rarely use skills while creating, spawning sub-agents is something I’ve started to adopt. For e.g, for \u003Ca href=\"https://grindsize.in\">grindsize.in\u003C/a>, where scaling the project would expect me to do repeated tasks, I employ 2 \u003Ca href=\"https://github.com/inosaint/grinder-calibrator/tree/main/.claude/agents\">sub-agents\u003C/a>. I don’t write these sub-agents, but just like my approach with skills, I ask Claude to generate them for me. When defining skills, I do specify the kind of model I want to power the sub-agent based on the task complexity and for token conservation.\u003C/p>\n\u003Cp>The process of creating sub-agents is similar to my process of creating skills. I make Claude create an outcome I plan. I test and review it. I make changes where required. Once I’m certain of the quality of the outcome, I check with Claude about making the process into an agent/skill. A point to note is that at times, certain process may work better as code rather than an agent. Listen to Claude.\u003C/p>\n\u003Ch3 id=\"tests-evals--\">Tests, Evals… 🚀\u003C/h3>\n\u003Cp>Testing takes like 90% of my time on every project. Making everything responsive is hard and the browser space is fragmented and it has led me to some interesting browser specific bugs that have stumped the LLMs. ngl, it’s feels great to solve them and I can do that because I understand a bit of web technology.\u003C/p>\n\u003Cp>Another thing I wish I did more of is \u003Cem>evals\u003C/em>. Evals helps me when I don’t understand the code that is being written. I get another agent to review one agent’s work. I consider it to be like a design critique or code review. To manage complex projects and usage limits, I keep a memory.md, agents.md and claude.md files to help with this back and forth.\u003C/p>\n\u003Cp>If you are looking to use evals, consider impeccable’s \u003Ca href=\"https://impeccable.style/docs/critique/\">critique\u003C/a> to see how it works,\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./variant.png","alt":"How variant helped me improve the visual style of Dominic, a AI based Figma Plugin","index":0}\">\u003Cfigcaption>How variant helped me improve the visual style of Dominic, a AI based Figma Plugin\u003C/figcaption>\u003C/figure>\n\u003Ch3 id=\"llm-based-tools-i-currently-use\">LLM based tools I currently use:\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Claude Code:\u003C/strong> Bulk of my work is done on Sonnet + API.\u003C/li>\n\u003Cli>\u003Cstrong>Codex (Free):\u003C/strong> Mainly for evals and bug fixes\u003C/li>\n\u003Cli>\u003Cstrong>ChatGPT:\u003C/strong> Prompt definition, Image gen, API\u003C/li>\n\u003Cli>\u003Cstrong>Gemini(Plus):\u003C/strong> ImageGen, Deep Research and Prompt definition\u003C/li>\n\u003Cli>\u003Cstrong>Variant.com:\u003C/strong> Amazing for a functional minded designer like me, not sure how long they can survive though.\u003C/li>\n\u003C/ul>\n\u003Cp>—\u003C/p>\n\u003Cp>\u003Cem>If you are non-technical and want to learn how to to use AI to build, you can check out my free guide at \u003Ca href=\"https://howtoaicode.com\">howtoaicode.com\u003C/a>\u003C/em>\u003C/p>",{"headings":536,"localImagePaths":552,"remoteImagePaths":553,"frontmatter":554,"imagePaths":556},[537,540,543,546,549],{"depth":44,"slug":538,"text":539},"measure-twice-cut-once","Measure twice, cut once",{"depth":44,"slug":541,"text":542},"ready-set-up-go","Ready, Set up, Go",{"depth":44,"slug":544,"text":545},"rinse-and-repeat","Rinse and Repeat",{"depth":44,"slug":547,"text":548},"tests-evals--","Tests, Evals… 🚀",{"depth":44,"slug":550,"text":551},"llm-based-tools-i-currently-use","LLM based tools I currently use:",[529,530],[],{"title":522,"description":523,"date":555,"status":19,"image":531},["Date","2026-05-21T00:00:00.000Z"],[529,530],"long-live-design-process",{"id":557,"data":559,"body":564,"filePath":565,"assetImports":566,"digest":570,"rendered":571},{"title":560,"description":561,"date":562,"image":563,"status":19},"The design process is dead, long live the design process","I’ve been building with AI for the past few months and I dont think the design process is dead.",["Date","2026-03-02T00:00:00.000Z"],"__ASTRO_IMAGE_./rip-design-process.png","Over the last couple of decades, people have tried to tame and commoditize the design process into a neat package especially in the software startup world.\n\nThis in-turn had led to designer portfolios filled with a [templatic story](https://essays.uxdesign.cc/case-study-factory/) of research, personas, wireframes and final output[^1]. A predictable sequence manufactured (often in retrospect) to appease the hiring manager gods.\n\nThe design process was never about following a linear sequence. It wasn't about the artifacts or the rituals. It was just easy to market it as such.\n\n![The Design Sprint tried to emphasise on the Learn and Repeat Loop, but failed. Image source: Wikipedia](Design_Sprints.png)\n\nThe real design process was about making, testing, failing and learning – all in the quest for a better human centric product. It's far easier to build products and features by targeting \"low hanging fruits\", looking at what the competitors are doing, or favouring your CEO's bias. Much easier than going out to talk to your users, dissect your product’s data and figure out what you really need to build. After all, the cost of bad product decisions is only visible in hindsight, while the cost of user research is visible upfront. \n\nBut when you are building products for users who aren’t like you, there is no replacement for the process. \n\n![Speaking to Farmers to understand their decision making when it comes to selling their harvests](jivalite-ground.webp)\n\nAt Jiva.ag, we were building for rural Indonesia. Our users weren’t digital natives but often humans with limited technical literacy. We couldn’t really design products and systems for them sitting in our AC offices. We needed to spend time with them – mapping their world and understanding their ways. We tested with scrappy prototypes, iterating upon and validating ideas until we sat down to build. That’s how we understood how our customers used the internet, how they made decisions, and what mattered to them.\n\nYes, AI can help close the loop faster. But without a process, we would have designed for ourselves and not our users.\n\n\n[^1]: or beautiful dribbble UI or excessive animations that would frustrate the average user\n[^2]: \"Design fixation is a well-documented cognitive bias where a designer becomes stuck on a limited set of ideas, often influenced by prior knowledge, previous solutions, or dominant trends,\" explains design psychology expert Rachel A. Wood. [More here](https://www.livingetc.com/advice/what-is-design-fixation).\n[^3]: Cover image courtesy: [The Double Diamond from the Design Council UK](https://www.designcouncil.org.uk/our-resources/the-double-diamond/)\n[^4]: Design Sprint image: [Courtesy Wikipedia](https://en.wikipedia.org/wiki/Design_sprint).","src/content/writing/long-live-design-process/index.md",[567,568,569],"Design_Sprints.png","jivalite-ground.webp","./rip-design-process.png","1e16bdd3251387cb",{"html":572,"metadata":573},"\u003Cp>Over the last couple of decades, people have tried to tame and commoditize the design process into a neat package especially in the software startup world.\u003C/p>\n\u003Cp>This in-turn had led to designer portfolios filled with a \u003Ca href=\"https://essays.uxdesign.cc/case-study-factory/\">templatic story\u003C/a> of research, personas, wireframes and final output\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>. A predictable sequence manufactured (often in retrospect) to appease the hiring manager gods.\u003C/p>\n\u003Cp>The design process was never about following a linear sequence. It wasn’t about the artifacts or the rituals. It was just easy to market it as such.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"Design_Sprints.png","alt":"The Design Sprint tried to emphasise on the Learn and Repeat Loop, but failed. Image source: Wikipedia","index":0}\">\u003Cfigcaption>The Design Sprint tried to emphasise on the Learn and Repeat Loop, but failed. Image source: Wikipedia\u003C/figcaption>\u003C/figure>\n\u003Cp>The real design process was about making, testing, failing and learning – all in the quest for a better human centric product. It’s far easier to build products and features by targeting “low hanging fruits”, looking at what the competitors are doing, or favouring your CEO’s bias. Much easier than going out to talk to your users, dissect your product’s data and figure out what you really need to build. After all, the cost of bad product decisions is only visible in hindsight, while the cost of user research is visible upfront.\u003C/p>\n\u003Cp>But when you are building products for users who aren’t like you, there is no replacement for the process.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"jivalite-ground.webp","alt":"Speaking to Farmers to understand their decision making when it comes to selling their harvests","index":0}\">\u003Cfigcaption>Speaking to Farmers to understand their decision making when it comes to selling their harvests\u003C/figcaption>\u003C/figure>\n\u003Cp>At Jiva.ag, we were building for rural Indonesia. Our users weren’t digital natives but often humans with limited technical literacy. We couldn’t really design products and systems for them sitting in our AC offices. We needed to spend time with them – mapping their world and understanding their ways. We tested with scrappy prototypes, iterating upon and validating ideas until we sat down to build. That’s how we understood how our customers used the internet, how they made decisions, and what mattered to them.\u003C/p>\n\u003Cp>Yes, AI can help close the loop faster. But without a process, we would have designed for ourselves and not our users.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>or beautiful dribbble UI or excessive animations that would frustrate the average user \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":574,"localImagePaths":576,"remoteImagePaths":577,"frontmatter":578,"imagePaths":580},[575],{"depth":37,"slug":85,"text":86},[567,568],[],{"title":560,"description":561,"date":579,"status":19,"image":569},["Date","2026-03-02T00:00:00.000Z"],[567,568],"process",{"id":581,"data":583,"body":588,"filePath":589,"assetImports":590,"digest":592,"rendered":593},{"title":584,"description":585,"date":586,"image":587,"status":19},"Beyond building processes at GoMerchant Design Team","Team process and documentation",["Date","2021-08-19T00:00:00.000Z"],"__ASTRO_IMAGE_./process-1.webp","A considerable amount of time in 'Year 1' of being a manager has been about setting up artifacts and processes. I was lucky to be part of an organization that had a documentation culture in its DNA. This was partly because we had Program Managers embedded within each team. This meant that Jira, Confluence and Asana were setup and maintained religiously, with weekly feature spec reviews [FSR] and ProdTech meetings to keep these upto date.\n\n#### Setting up Documentation spaces\n\nI find design documentation to be a critical part of the design process. I recommend every designer takes the time to document the project because apart from being a design artifact, that serves as a single point of truth, it also helps them when they have to write their performance reviews, promotion proposals and build their portfolio.\n\nI do not like Google Docs for documentation. Documentation spaces need to be a searchable wiki and ironically Google Docs is poor at providing this. At Practo, we already had Atlassian's Confluence setup when I joined, and at Gojek, Maji setup our Confluence spaces in 2019 and then the two of us started structuring and documenting our knowledge about the product and its processes. I created a design documentation template based on the product feature spec template and advocated for it.\n\nAs for project management, the org moved to using Asana. Adding them here felt forced and an unnecessary addition to our workload. However as our product roadmap was moved into Asana, I devised a process to make design tasks a visible part of the product development process by adding them as subtasks and duplicating them to our design boards for effective tracking. Post every prioritization meeting, I added tasks into the todo list and tagged designers so that they were aware of what's coming up.\n\nHowever, we faced a problem with adoption of these processes. We lacked a program manager dedicated to design and not all designers in the team were able to keep their boards updated. We were able to setup a biweekly cadence with the program management VP, Gifika, to discuss our problems and understand how we can get better at solving them. And what we learned is two things.\n\n1. Add more meetings in the calendar\n2. Be a bad cop\n\n#### More meetings in the calendar\n\nWhen your calendar is already full of meetings, you feel like staying away from setting up any more that will take away whatever little 'time for focus work' that is left in it. But given our problem, this seemed to be the most effective way to get things working.\nOur team was a 3 level hierarchy so each lead now had to setup two additional cadences into their calendar. One was a common stream leads cadence where each stream lead would come prepared to the biweekly meeting with a progress update (which would be posted biweekly to the Asana board) Maji worked on a template for this.\n\nThe other meeting was with their stream where each of their reports could come with a similarly formatted update. This meeting helped stream leads prepare them for the stream leads meeting.\nYou can also make these meetings async if everyone is diligent. The updates were a small part of the biweekly leads meeting.\n\n#### Be a Bad Cop\n\nNot all designers like following process. They may see it as additional work with low ROI or they may just not have enough time. You should take the time to communicate the problems that the process is going to solve and ask them for feedback on the process. Make it feel like they co-own the process. But if this fails, then you should be okay with being \"bad cop\". This would mean that you would need to set Slack reminders, add calendar invites and send DMs if everything fails. This is the way.","src/content/writing/process/index.md",[591],"./process-1.webp","73311ebb7d499840",{"html":594,"metadata":595},"\u003Cp>A considerable amount of time in ‘Year 1’ of being a manager has been about setting up artifacts and processes. I was lucky to be part of an organization that had a documentation culture in its DNA. This was partly because we had Program Managers embedded within each team. This meant that Jira, Confluence and Asana were setup and maintained religiously, with weekly feature spec reviews [FSR] and ProdTech meetings to keep these upto date.\u003C/p>\n\u003Ch4 id=\"setting-up-documentation-spaces\">Setting up Documentation spaces\u003C/h4>\n\u003Cp>I find design documentation to be a critical part of the design process. I recommend every designer takes the time to document the project because apart from being a design artifact, that serves as a single point of truth, it also helps them when they have to write their performance reviews, promotion proposals and build their portfolio.\u003C/p>\n\u003Cp>I do not like Google Docs for documentation. Documentation spaces need to be a searchable wiki and ironically Google Docs is poor at providing this. At Practo, we already had Atlassian’s Confluence setup when I joined, and at Gojek, Maji setup our Confluence spaces in 2019 and then the two of us started structuring and documenting our knowledge about the product and its processes. I created a design documentation template based on the product feature spec template and advocated for it.\u003C/p>\n\u003Cp>As for project management, the org moved to using Asana. Adding them here felt forced and an unnecessary addition to our workload. However as our product roadmap was moved into Asana, I devised a process to make design tasks a visible part of the product development process by adding them as subtasks and duplicating them to our design boards for effective tracking. Post every prioritization meeting, I added tasks into the todo list and tagged designers so that they were aware of what’s coming up.\u003C/p>\n\u003Cp>However, we faced a problem with adoption of these processes. We lacked a program manager dedicated to design and not all designers in the team were able to keep their boards updated. We were able to setup a biweekly cadence with the program management VP, Gifika, to discuss our problems and understand how we can get better at solving them. And what we learned is two things.\u003C/p>\n\u003Col>\n\u003Cli>Add more meetings in the calendar\u003C/li>\n\u003Cli>Be a bad cop\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"more-meetings-in-the-calendar\">More meetings in the calendar\u003C/h4>\n\u003Cp>When your calendar is already full of meetings, you feel like staying away from setting up any more that will take away whatever little ‘time for focus work’ that is left in it. But given our problem, this seemed to be the most effective way to get things working.\nOur team was a 3 level hierarchy so each lead now had to setup two additional cadences into their calendar. One was a common stream leads cadence where each stream lead would come prepared to the biweekly meeting with a progress update (which would be posted biweekly to the Asana board) Maji worked on a template for this.\u003C/p>\n\u003Cp>The other meeting was with their stream where each of their reports could come with a similarly formatted update. This meeting helped stream leads prepare them for the stream leads meeting.\nYou can also make these meetings async if everyone is diligent. The updates were a small part of the biweekly leads meeting.\u003C/p>\n\u003Ch4 id=\"be-a-bad-cop\">Be a Bad Cop\u003C/h4>\n\u003Cp>Not all designers like following process. They may see it as additional work with low ROI or they may just not have enough time. You should take the time to communicate the problems that the process is going to solve and ask them for feedback on the process. Make it feel like they co-own the process. But if this fails, then you should be okay with being “bad cop”. This would mean that you would need to set Slack reminders, add calendar invites and send DMs if everything fails. This is the way.\u003C/p>",{"headings":596,"localImagePaths":606,"remoteImagePaths":607,"frontmatter":608,"imagePaths":609},[597,600,603],{"depth":57,"slug":598,"text":599},"setting-up-documentation-spaces","Setting up Documentation spaces",{"depth":57,"slug":601,"text":602},"more-meetings-in-the-calendar","More meetings in the calendar",{"depth":57,"slug":604,"text":605},"be-a-bad-cop","Be a Bad Cop",[],[],{"title":584,"description":585,"date":486,"image":591},[],"product-designer",{"id":610,"data":612,"body":617,"filePath":618,"assetImports":619,"digest":623,"rendered":624},{"title":613,"description":614,"date":615,"image":616,"status":19},"What is a product designer?","After a decade of designing products, I decided to make an attempt describing the role and qualities of a product designer",["Date","2025-01-01T00:00:00.000Z"],"__ASTRO_IMAGE_./squiggle-labels-outline.jpg","A decade ago, the 'product designer' title was being used to refer to designers (and still is) working on physical products. The adoption of using it for software designers got a shot in the arm when [Facebook adopted it](https://qr.ae/pGQdVi) for their designers. Until then UI/UX was the term of choice for folks in the industry and used to indicate a specific job that the designer performed in the team. This was indicative of the shift from the delivery teams working with client requirements (enterprise first) to product teams (rapidly iterating consumer tech) which had to learn and uncover what was the best product they could build. Due to the scarcity of product designers in the space, companies started acquiring design agencies around the world[^1].\n\nThe 'product designer' now had to start looking at what they are designing as a product and not be restricted by your traditional mindset of UI and UX responsibilities. This would mean that they would need to learn about business, uncover user insights, use data analytic tools, have technical understanding, etc to design their product. These aren't skills that come naturally to designers and therein lay the problem. Not every designer wanted to be a “product designer” but it was an aspirational job for designers given the pay packages were miles ahead of what designers were paid in other industries. More and more companies started adopting the term of ‘product designer’ to follow industry trends and attract talent.\n\nBut even then there were few orgs which took design seriously.\n\n![Source: 2014 interview in Dezeen](./product-designer-1.png)[^2]\n\nEven today, most orgs don’t really provide a space for designers to thrive in the product space and even today, there are probably a handful of product designers and product orgs in the world, the rest is mostly good PR.\n\n**And what are the aspects of a product designer that sets them apart from other designers?**\n\n### Quality\n\nThe primary aspect the product designer optimises for is quality of delivery. Quality being subjective makes it hard for the different disciplines to align over what this means. For me, it means that the product designer needs to understand the constraints of business and development to be able to deliver the best outcome possible in the defined timeline. You may want to build that perfect animated transition, but let’s be real, that’s not really a user need most of the time. The product’s usage and success should be the thing driving you towards excelling as a designer.\n\n![](./product-designer-2.jpg)\n\n### Curiosity\n\nJust like Alice, a product designer has to be inquisitive about their users and their behaviour and the systems they inhabit. The ‘product designer’ need to be comfortable looking at dashboards, analyzing events as well as drafting a research plan and talking to users. The best way to level up as a product designer is to learn from what you are building and putting out into the world. And this learning tends to compound as the years go by and helps you take decisions when faced with new design challenges.\n\n### Craft\n\nThe product designer is actually [T-shaped](https://spotify.design/article/finding-your-t-shape-as-a-generalist-designer) despite a lot of folks thinking that they are generalists. So although the industry largely refers to the visual polish as 'craft', I don't feel its restricted to just that. You could be a 'product designer' excelling at copy writing, or a 'product designer' inclined towards the code side. A good team is made of many such designers who can learn from each other. If every designer you hire (or in your team) has a similar skill set to you then there would be limited direction for you to grow in. Some teams out there have chosen to double down on this kind of team building but to me that's building a design specialist team.[^3]\n\n### Agency\n\nThis is a quality which is rare to find. I feel this is because most designers tend to be introverts and love to be comfortable in their “space”. It’s easy to spend time in the world making pixel perfection your entire personality, it’s not easy to go out on a limb and argue for a decision to be made. Unfortunately, agency is what helps you level up the ranks. Agency is what gets you a seat at the table. Another hurdle towards product designers developing agency is that they need to be part of good teams run by design leaders who support and sponsor you and those are really scarce in supply.\n\n### So where do we go from here?\n\n* I see that we need to address this at a system level, today the ‘product design’ comes with a better salary and so for designers to get better pay it’s better to call themselves Product Designers. So things can’t change until the hiring parties don’t get better at their jobs.\n\n* No one designer is the same as the other. Organisations should be cognizant that there are no such thing as generalists and design their career rubrics in a way to suit the different kinds of designers on their team. This helps each designer to grow in their own way within the org.\n\n* Job descriptions could be honest up front of the kind of designer that they are looking for rather than getting ChatGPT to write it. There is no point lying about this, infact it just takes you lot longer to find someone.\n\n\n[^1]: **John Maeda's Design in Tech report 2015, Slide 4** https://www.slideshare.net/slideshow/design-in-tech-report-2015-45858974/45858974\n\n[^2]: **Silicon Valley \"didn't think a designer could build a company\" says Airbnb co-founder Brian Chesky** https://www.dezeen.com/2014/01/28/silicon-valley-didnt-think-a-designer-could-build-a-company-interview-airbnb-co-founder-brian-chesky/\n\n[^3]: **Pablo Stanley, Collection of Random Comics** https://thedesignteam.io/collection-of-random-comics-d66f32ee9c52\n\n\n\u003Cp class=\"attribution\"> This post was my response to Sidu's \u003Ca href=\"https://sidu.in/essays/hiring-product-managers.html\">Hiring Product Managers\u003C/a> and John Allspaw's \u003Ca href=\"https://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/\">On being a Senior Engineer\u003C/a>.\u003C/p>\n\u003Cp class=\"attribution\"> Attribution: Cover image courtesy \u003Cstrong>'The Process of Design Squiggle' by Damien Newman, thedesignsquiggle.com\u003C/strong> \u003C/p>","src/content/writing/product-designer/index.md",[620,621,622],"./product-designer-1.png","./product-designer-2.jpg","./squiggle-labels-outline.jpg","595da99918ce871b",{"html":625,"metadata":626},"\u003Cp>A decade ago, the ‘product designer’ title was being used to refer to designers (and still is) working on physical products. The adoption of using it for software designers got a shot in the arm when \u003Ca href=\"https://qr.ae/pGQdVi\">Facebook adopted it\u003C/a> for their designers. Until then UI/UX was the term of choice for folks in the industry and used to indicate a specific job that the designer performed in the team. This was indicative of the shift from the delivery teams working with client requirements (enterprise first) to product teams (rapidly iterating consumer tech) which had to learn and uncover what was the best product they could build. Due to the scarcity of product designers in the space, companies started acquiring design agencies around the world\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>The ‘product designer’ now had to start looking at what they are designing as a product and not be restricted by your traditional mindset of UI and UX responsibilities. This would mean that they would need to learn about business, uncover user insights, use data analytic tools, have technical understanding, etc to design their product. These aren’t skills that come naturally to designers and therein lay the problem. Not every designer wanted to be a “product designer” but it was an aspirational job for designers given the pay packages were miles ahead of what designers were paid in other industries. More and more companies started adopting the term of ‘product designer’ to follow industry trends and attract talent.\u003C/p>\n\u003Cp>But even then there were few orgs which took design seriously.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./product-designer-1.png","alt":"Source: 2014 interview in Dezeen","index":0}\">\u003Cfigcaption>Source: 2014 interview in Dezeen\u003C/figcaption>\u003C/figure>\n\u003Cp>Even today, most orgs don’t really provide a space for designers to thrive in the product space and even today, there are probably a handful of product designers and product orgs in the world, the rest is mostly good PR.\u003C/p>\n\u003Cp>\u003Cstrong>And what are the aspects of a product designer that sets them apart from other designers?\u003C/strong>\u003C/p>\n\u003Ch3 id=\"quality\">Quality\u003C/h3>\n\u003Cp>The primary aspect the product designer optimises for is quality of delivery. Quality being subjective makes it hard for the different disciplines to align over what this means. For me, it means that the product designer needs to understand the constraints of business and development to be able to deliver the best outcome possible in the defined timeline. You may want to build that perfect animated transition, but let’s be real, that’s not really a user need most of the time. The product’s usage and success should be the thing driving you towards excelling as a designer.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./product-designer-2.jpg","alt":"","index":0}\">\u003C/figure>\n\u003Ch3 id=\"curiosity\">Curiosity\u003C/h3>\n\u003Cp>Just like Alice, a product designer has to be inquisitive about their users and their behaviour and the systems they inhabit. The ‘product designer’ need to be comfortable looking at dashboards, analyzing events as well as drafting a research plan and talking to users. The best way to level up as a product designer is to learn from what you are building and putting out into the world. And this learning tends to compound as the years go by and helps you take decisions when faced with new design challenges.\u003C/p>\n\u003Ch3 id=\"craft\">Craft\u003C/h3>\n\u003Cp>The product designer is actually \u003Ca href=\"https://spotify.design/article/finding-your-t-shape-as-a-generalist-designer\">T-shaped\u003C/a> despite a lot of folks thinking that they are generalists. So although the industry largely refers to the visual polish as ‘craft’, I don’t feel its restricted to just that. You could be a ‘product designer’ excelling at copy writing, or a ‘product designer’ inclined towards the code side. A good team is made of many such designers who can learn from each other. If every designer you hire (or in your team) has a similar skill set to you then there would be limited direction for you to grow in. Some teams out there have chosen to double down on this kind of team building but to me that’s building a design specialist team.\u003Csup>\u003Ca href=\"#user-content-fn-3\" id=\"user-content-fnref-3\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">3\u003C/a>\u003C/sup>\u003C/p>\n\u003Ch3 id=\"agency\">Agency\u003C/h3>\n\u003Cp>This is a quality which is rare to find. I feel this is because most designers tend to be introverts and love to be comfortable in their “space”. It’s easy to spend time in the world making pixel perfection your entire personality, it’s not easy to go out on a limb and argue for a decision to be made. Unfortunately, agency is what helps you level up the ranks. Agency is what gets you a seat at the table. Another hurdle towards product designers developing agency is that they need to be part of good teams run by design leaders who support and sponsor you and those are really scarce in supply.\u003C/p>\n\u003Ch3 id=\"so-where-do-we-go-from-here\">So where do we go from here?\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>I see that we need to address this at a system level, today the ‘product design’ comes with a better salary and so for designers to get better pay it’s better to call themselves Product Designers. So things can’t change until the hiring parties don’t get better at their jobs.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>No one designer is the same as the other. Organisations should be cognizant that there are no such thing as generalists and design their career rubrics in a way to suit the different kinds of designers on their team. This helps each designer to grow in their own way within the org.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Job descriptions could be honest up front of the kind of designer that they are looking for rather than getting ChatGPT to write it. There is no point lying about this, infact it just takes you lot longer to find someone.\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Cp class=\"attribution\"> This post was my response to Sidu's \u003Ca href=\"https://sidu.in/essays/hiring-product-managers.html\">Hiring Product Managers\u003C/a> and John Allspaw's \u003Ca href=\"https://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/\">On being a Senior Engineer\u003C/a>.\u003C/p>\n\u003Cp class=\"attribution\"> Attribution: Cover image courtesy \u003Cstrong>'The Process of Design Squiggle' by Damien Newman, thedesignsquiggle.com\u003C/strong> \u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>\u003Cstrong>John Maeda’s Design in Tech report 2015, Slide 4\u003C/strong> \u003Ca href=\"https://www.slideshare.net/slideshow/design-in-tech-report-2015-45858974/45858974\">https://www.slideshare.net/slideshow/design-in-tech-report-2015-45858974/45858974\u003C/a> \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-2\">\n\u003Cp>\u003Cstrong>Silicon Valley “didn’t think a designer could build a company” says Airbnb co-founder Brian Chesky\u003C/strong> \u003Ca href=\"https://www.dezeen.com/2014/01/28/silicon-valley-didnt-think-a-designer-could-build-a-company-interview-airbnb-co-founder-brian-chesky/\">https://www.dezeen.com/2014/01/28/silicon-valley-didnt-think-a-designer-could-build-a-company-interview-airbnb-co-founder-brian-chesky/\u003C/a> \u003Ca href=\"#user-content-fnref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-3\">\n\u003Cp>\u003Cstrong>Pablo Stanley, Collection of Random Comics\u003C/strong> \u003Ca href=\"https://thedesignteam.io/collection-of-random-comics-d66f32ee9c52\">https://thedesignteam.io/collection-of-random-comics-d66f32ee9c52\u003C/a> \u003Ca href=\"#user-content-fnref-3\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":627,"localImagePaths":644,"remoteImagePaths":645,"frontmatter":646,"imagePaths":648},[628,631,634,637,640,643],{"depth":44,"slug":629,"text":630},"quality","Quality",{"depth":44,"slug":632,"text":633},"curiosity","Curiosity",{"depth":44,"slug":635,"text":636},"craft","Craft",{"depth":44,"slug":638,"text":639},"agency","Agency",{"depth":44,"slug":641,"text":642},"so-where-do-we-go-from-here","So where do we go from here?",{"depth":37,"slug":85,"text":86},[620,621],[],{"title":613,"description":614,"date":647,"image":622},"2025-01-01",[620,621],"rituals",{"id":649,"data":651,"body":656,"filePath":657,"assetImports":658,"digest":660,"rendered":661},{"title":652,"description":653,"date":654,"image":655,"status":19},"Team rituals and culture of the GoMerchant Design Team","Three meetings that helped us work remote and stay sane during the COVID pandemic",["Date","2021-08-19T00:00:00.000Z"],"__ASTRO_IMAGE_./zoom.png","As the GoMerchant team grew, processes and rituals became very important.\n\n### 1. Design Critiques\nDesign Critiques were the first one we instituted. This was a weekly design and research only session where designers could present their work to other designers.\nThese would be weekly and designers were encouraged to show work in progress. To setup this session as a safe space, leaders were expected to be vulnerable and lead by showing their own work in progress.\n\n### 2. Design Review\nWith a need to showcase our work and drive alignment with non-design stakeholders, we setup a Design Review.\nThe format of the design review was formal compared to our informal design critique. \nWe invited non-design stakeholders to the review so that the feedback we collect could flow back into the design process. This was done weekly if required but usually as per our product development cycle it was bi-weekly.\n\n### 3. Design Standup (for lack of a better term)\nI used to be the only designer on my team based in India, but until the lockdown I did not think about instituting any daily standups.\nI used to frequently travel to Indonesia and everyone else was based in the same office. I felt that was enough.\nBut when the pandemic hit and the designers started being isolated in their houses, Maji and I decided to setup a daily cooler talk. We called it _Design Standup_ but we didn't want it to be a 'standup'.\nWe encouraged folks to talk about their personal life, what they were going through and what they were doing.\nWe played games, drew murals together on digital whiteboards and went down internet rabbit holes. Attendance was never compulsory, you could join in if you felt like it. We always posted the link and created a thread of what we discussed on our channel so that if you missed out, you could still follow what was discussed.\nThis ritual couldn't have been achieved without the team members especially Maji, Lauditta and Aryo driving the conversations.\n\nI wonder if this is replicable or was I lucky to have this wonderful team…","src/content/writing/rituals/index.md",[659],"./zoom.png","1249e6497e2be7b7",{"html":662,"metadata":663},"\u003Cp>As the GoMerchant team grew, processes and rituals became very important.\u003C/p>\n\u003Ch3 id=\"1-design-critiques\">1. Design Critiques\u003C/h3>\n\u003Cp>Design Critiques were the first one we instituted. This was a weekly design and research only session where designers could present their work to other designers.\nThese would be weekly and designers were encouraged to show work in progress. To setup this session as a safe space, leaders were expected to be vulnerable and lead by showing their own work in progress.\u003C/p>\n\u003Ch3 id=\"2-design-review\">2. Design Review\u003C/h3>\n\u003Cp>With a need to showcase our work and drive alignment with non-design stakeholders, we setup a Design Review.\nThe format of the design review was formal compared to our informal design critique.\nWe invited non-design stakeholders to the review so that the feedback we collect could flow back into the design process. This was done weekly if required but usually as per our product development cycle it was bi-weekly.\u003C/p>\n\u003Ch3 id=\"3-design-standup-for-lack-of-a-better-term\">3. Design Standup (for lack of a better term)\u003C/h3>\n\u003Cp>I used to be the only designer on my team based in India, but until the lockdown I did not think about instituting any daily standups.\nI used to frequently travel to Indonesia and everyone else was based in the same office. I felt that was enough.\nBut when the pandemic hit and the designers started being isolated in their houses, Maji and I decided to setup a daily cooler talk. We called it \u003Cem>Design Standup\u003C/em> but we didn’t want it to be a ‘standup’.\nWe encouraged folks to talk about their personal life, what they were going through and what they were doing.\nWe played games, drew murals together on digital whiteboards and went down internet rabbit holes. Attendance was never compulsory, you could join in if you felt like it. We always posted the link and created a thread of what we discussed on our channel so that if you missed out, you could still follow what was discussed.\nThis ritual couldn’t have been achieved without the team members especially Maji, Lauditta and Aryo driving the conversations.\u003C/p>\n\u003Cp>I wonder if this is replicable or was I lucky to have this wonderful team…\u003C/p>",{"headings":664,"localImagePaths":674,"remoteImagePaths":675,"frontmatter":676,"imagePaths":677},[665,668,671],{"depth":44,"slug":666,"text":667},"1-design-critiques","1. Design Critiques",{"depth":44,"slug":669,"text":670},"2-design-review","2. Design Review",{"depth":44,"slug":672,"text":673},"3-design-standup-for-lack-of-a-better-term","3. Design Standup (for lack of a better term)",[],[],{"title":652,"description":653,"date":486,"image":659},[],"secret-sauce",{"id":678,"data":680,"body":684,"filePath":685,"assetImports":686,"digest":687,"rendered":688},{"title":681,"description":682,"date":683,"image":494,"status":99},"this is a title","this is a description",["Date","2026-05-21T00:00:00.000Z"],"Recently a designer at an up-and-coming startup reached out asking for advice regarding their team structuring. A whatsapp conversation turned into an essay","src/content/writing/secret-sauce/index.md",[498],"439bf8c754f8f228",{"html":689,"metadata":690},"\u003Cp>Recently a designer at an up-and-coming startup reached out asking for advice regarding their team structuring. A whatsapp conversation turned into an essay\u003C/p>",{"headings":691,"localImagePaths":692,"remoteImagePaths":693,"frontmatter":694,"imagePaths":696},[],[],[],{"title":681,"description":682,"date":695,"status":99,"image":498},["Date","2026-05-21T00:00:00.000Z"],[],"solo-designer",{"id":697,"data":699,"body":704,"filePath":705,"assetImports":706,"digest":708,"rendered":709},{"title":700,"description":701,"date":702,"image":703,"status":19},"Evaluating that Solo Designer job","What to look for when joining a startup as the solo designer",["Date","2024-02-12T00:00:00.000Z"],"__ASTRO_IMAGE_./solo-designer-jobs-1.png","You often see people stating that they are joining as a solo designer in a Startup and want advice. Them being the solo designer shouldn’t directly impact their effectiveness.\n\nHere’s what I feel matters the most towards their success:\n\n### 1. What is your role?\n\nKnowing why they opened the designer role is important before you take that job. I recommend that you ask the hiring manager this question during your interview rounds and also ask to speak to the critical members in the team you will be joining. I take it that most Founders open a position because they got some feedback from customers or because their investor told them to. They may not be ready to invest in what can make a designer effective in their role.\n\n### 2. Fitting into the team:\n\nThe team would need to adapt to having an in-house designer working with them. The team members would need to understand what the role of the designer is and how they could work with them. They would need to take time to adapt their workflows or create new inclusive processes. All this is hard to do and the designer(especially a junior one) wouldn’t do very well without a sponsor.\n\n### 3. You need a sponsor.\n\nOne of my key learnings has been to choose to work with someone who will be your advocate in the organization. It's the single most important thing to look for during the interview process. The best teams I've observed had CEOs being the design sponsor and their products tend to win at least in terms of product quality (a product's success is more than it's quality, but that's another post) Don't believe me? Well in *Rams*, Dieter Rams states \"If you don't have someone who stands behind you, then you can forget it.\" And cites it as a reason for leaving Braun.\n\nOf course, not every Startup out there succeeds and there's no guarantee that the team you join will survive but its always good to make sure that you enjoy the team you spend there and learn how to become a better designer.\n\nIf you are looking for advice on what you can do as a solo designer to succeed, [this post I wrote after my first year as a designer](https://medium.com/user-experience-design-1/what-every-young-designer-should-know-abb2af79f43e) may be useful.","src/content/writing/solo-designer/index.md",[707],"./solo-designer-jobs-1.png","134f374691447467",{"html":710,"metadata":711},"\u003Cp>You often see people stating that they are joining as a solo designer in a Startup and want advice. Them being the solo designer shouldn’t directly impact their effectiveness.\u003C/p>\n\u003Cp>Here’s what I feel matters the most towards their success:\u003C/p>\n\u003Ch3 id=\"1-what-is-your-role\">1. What is your role?\u003C/h3>\n\u003Cp>Knowing why they opened the designer role is important before you take that job. I recommend that you ask the hiring manager this question during your interview rounds and also ask to speak to the critical members in the team you will be joining. I take it that most Founders open a position because they got some feedback from customers or because their investor told them to. They may not be ready to invest in what can make a designer effective in their role.\u003C/p>\n\u003Ch3 id=\"2-fitting-into-the-team\">2. Fitting into the team:\u003C/h3>\n\u003Cp>The team would need to adapt to having an in-house designer working with them. The team members would need to understand what the role of the designer is and how they could work with them. They would need to take time to adapt their workflows or create new inclusive processes. All this is hard to do and the designer(especially a junior one) wouldn’t do very well without a sponsor.\u003C/p>\n\u003Ch3 id=\"3-you-need-a-sponsor\">3. You need a sponsor.\u003C/h3>\n\u003Cp>One of my key learnings has been to choose to work with someone who will be your advocate in the organization. It’s the single most important thing to look for during the interview process. The best teams I’ve observed had CEOs being the design sponsor and their products tend to win at least in terms of product quality (a product’s success is more than it’s quality, but that’s another post) Don’t believe me? Well in \u003Cem>Rams\u003C/em>, Dieter Rams states “If you don’t have someone who stands behind you, then you can forget it.” And cites it as a reason for leaving Braun.\u003C/p>\n\u003Cp>Of course, not every Startup out there succeeds and there’s no guarantee that the team you join will survive but its always good to make sure that you enjoy the team you spend there and learn how to become a better designer.\u003C/p>\n\u003Cp>If you are looking for advice on what you can do as a solo designer to succeed, \u003Ca href=\"https://medium.com/user-experience-design-1/what-every-young-designer-should-know-abb2af79f43e\">this post I wrote after my first year as a designer\u003C/a> may be useful.\u003C/p>",{"headings":712,"localImagePaths":722,"remoteImagePaths":723,"frontmatter":724,"imagePaths":726},[713,716,719],{"depth":44,"slug":714,"text":715},"1-what-is-your-role","1. What is your role?",{"depth":44,"slug":717,"text":718},"2-fitting-into-the-team","2. Fitting into the team:",{"depth":44,"slug":720,"text":721},"3-you-need-a-sponsor","3. You need a sponsor.",[],[],{"title":700,"description":701,"date":725,"image":707},"2024-02-12",[],"toko-poster",{"id":727,"data":729,"body":733,"filePath":734,"assetImports":735,"digest":737,"rendered":738},{"title":730,"description":682,"date":731,"image":732,"status":99},"Midjourneying through Indonesia",["Date","2026-03-02T00:00:00.000Z"],"__ASTRO_IMAGE_","hello","src/content/writing/toko-poster/index.md",[736],"","917943514e073f56",{"html":739,"metadata":740},"\u003Cp>hello\u003C/p>",{"headings":741,"localImagePaths":742,"remoteImagePaths":743,"frontmatter":744,"imagePaths":746},[],[],[],{"title":730,"description":682,"date":745,"status":99,"image":736},["Date","2026-03-02T00:00:00.000Z"],[],"vibe-coding",{"id":747,"data":749,"body":754,"filePath":755,"assetImports":756,"digest":764,"rendered":765},{"title":750,"description":751,"date":752,"image":753,"status":19},"Through the vibe-coding looking glass","or How I stopped procrastinating and started to love vibe-coding",["Date","2025-12-22T00:00:00.000Z"],"__ASTRO_IMAGE_./git25.png","\u003Cdiv class=\"note\">Disclaimer: I had a shortlived career as a front end dev (IE7 era) at TCS when I began my career post-engineering in 2010, so I am familiar with the basics of web development. Hence vibe-coding on web may be slightly easier for me to grok then someone non-technical who is trying it out.\u003C/div>\n\nIn October, when I started off my break, I wanted to explore vibe coding but the choices are overwhelming. Up till then, my exposure to LLMs had been to use ChatGPT to edit blog posts and using Midjourney for creating assets for Meta Ads and VC pitch decks. Attending Razorpay’s Design x AI in November helped me understand the realities of vibe coding and prompting but I needed an extra push.\n\nThat push came in the form of a relative asking me to review their 'Vietnam Travel Itinerary'. They had shared their 'Itinerary as a huge wall of text pasted on Whatsapp. I could figure out a few obvious issues with it but I decided to see if AI can help me review and visualize the issues instead. I felt this would help me communicate the issues easier with my relative.\n\nPlanning holidays and building itineraries is a hobby of mine, so I had tried ChatGPT earlier to help with trip planning but I had found it lacking. It was great at generating rough to-dos for your trip like places to visit, etc which I believe it has adequate training data on and to be fair, it’s great for a normie. However, it fails miserably in many places like recommending good stays and other kinds of specialized interests and I've also observed that it tends to think about planning in terms of a western or american perspective. \n\nSo I started asking ChatGPT to visualize the itinerary on maps and when it created an html artifact, I asked it to iterated on the design and visuals. But there was a lot of back and forth to get something done and often subsequent generations rolled back changes I had made. Below are couple of variations of my iterations, ([left](/vibe-coding/iterations/vietnam_12_day_itinerary_web.html)) from when I started to ([right](/vibe-coding/iterations/Vietnam_12Day_Itinerary.html)) when I decided to get it to make it swiss-inspired.\n\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;\">\n\n![](./chatgpt-v1.png)\n\n![](./chatgpt-final.png)\n\n\u003C/div>\n\nI hit chatGPT's session limit and decided to move it to Claude. That's when it got easier. Claude's execution of my requests were better. You could see an invisible multiplier in place such that a 1x simple prompt gave a [10x output](/vibe-coding/iterations/vietnam_itinerary.html). \n\n![My input was the chatGPT html](./claude-v1.png)\n\nThat piqued my curiousity, I decided to see how far I could go.\n\nI first asked Claude what it would take to \"productivize this\" and it gave me a very detailed product roadmap of everything possible including the kitchen sink. It was overwhelming, but I made me learn that asking Claude for a plan is a good way to source ideas but better to work through the designs in the traditional way of implementation (prototype > iterate, repeat)\n\n![Version 1 of Claude](v1-prototype.png)\n\nIt took me about 40 iterations[^1] to get to a state I was comfortable sharing with friends to get feedback. Claude walked me through the steps of setting up Claude API key and hosting the app on Netlify, something I've never done before. You can check out the project at [Traviti](https://traviti.netlify.app/).\n\n![My last iteration](67.png)\n\n#### Fun fact: \n1. When I moved the html to Claude, it removed the 'Made by ChatGPT' label in the markup. Jealousy?\n2. Claude struggled a lot to add it's own logo into the markup and I had to write the markup in the end.\n\nThis project gave me sort of confidence to build further. The itinerary generator was not what I would have wanted to build, but [Budgie](https://kenneth.dsouza.im/budgie/) was. The time to build Budgie was faster. I now had Claude Pro subscription and quickly hit the weekly limit and had to stop so the v1 of Budgie took a week longer than expected to ship. Update: I shipped an [updated version of Budgie](https://budgie.travel) over the Christmas holidays.\n\n\n![Final version of Budgie](budgie.png)\nThis was before Claude's release of Skills and I tried out using Projects for this. There was no Figma involved, just prompting and reading through CSS classes. There were some parts that I had to step into debug but largely this was coded by Claude.\n\nTowards the end of this project, I moved to Claude Code on web and the experience dramatically improved again. Having Claude as a partner to pair with and write to the same repo was amazing QoL improvement. \n\nAfter Budgie, I felt it was time to stop procrastinating and start working on my portfolio (this site). It had been previously built on Eleventy via Glitch (RIP) but I wanted to test how easy would it be to re-write this. So for this project, I asked Claude Code to review and then rebuild the site in Astro and I also provided designs I made in Figma. Claude was easily able to render it and since then, I've taken to making Figma mockups to move the designs along. \n\nMidway through this, I decided to try Claude code on desktop and found myself lost a couple of times, so I decided to move back to Claude code on web. (I do want to try Claude code on Desktop for a future project where I build from scratch.)\n\nSince then, I've tried my hands at [visualizing my book reading on P5js](https://kenneth.dsouza.im/books-2025/index.html) and tried to clean up [an old D3js assignment](https://kenneth.dsouza.im/visualizing-trains/) from a college module. \n\nHonestly, LLMs have been able to help me overcome the barriers I used to face with hobby side projects and I hope more people get empowered this way.\n\n### Helpful tips if you want to get started\n\n- Starting new chat is the new CTRL+S. I struggled a lot on regular chat conversation. Claude Code however generates a nice summary of the chat when you hit context limit.\n\n- Be ready to make a LOT of iteratons. Designing on Figma and providing images has been generally efficient to get the outcome you want. \n\n- Start with small projects; for me that means static web projects. Identify what it means for you. \n \n- I expect design hiring to have a vibe coding round in the near future. Being able to translate your designs to a real functioning prototype has never been easier and moreover it gives an insight into how the designer solves problems.\n\n- Setup a free Github account and connect Claude to it. This will help with your versioning and the ability to roll back any unexpected changes. I personally prefer Github desktop over terminal and if you are new, I suggest you try that.\n\n\n--\n\n*If you are non-technical and want to learn how to to use AI to build, you can check out my free guide at [howtoaicode.com](https://howtoaicode.com)*\n\n[^1]: At times, some of Claude's prompts generated multiple iterations so iteration 40 was more like 10 prompts into the conversation.","src/content/writing/vibe-coding/index.md",[757,758,759,760,761,762,763],"./chatgpt-v1.png","./chatgpt-final.png","./claude-v1.png","v1-prototype.png","67.png","budgie.png","./git25.png","5707ad589b6b17c3",{"html":766,"metadata":767},"\u003Cdiv class=\"note\">Disclaimer: I had a shortlived career as a front end dev (IE7 era) at TCS when I began my career post-engineering in 2010, so I am familiar with the basics of web development. Hence vibe-coding on web may be slightly easier for me to grok then someone non-technical who is trying it out.\u003C/div>\n\u003Cp>In October, when I started off my break, I wanted to explore vibe coding but the choices are overwhelming. Up till then, my exposure to LLMs had been to use ChatGPT to edit blog posts and using Midjourney for creating assets for Meta Ads and VC pitch decks. Attending Razorpay’s Design x AI in November helped me understand the realities of vibe coding and prompting but I needed an extra push.\u003C/p>\n\u003Cp>That push came in the form of a relative asking me to review their ‘Vietnam Travel Itinerary’. They had shared their ‘Itinerary as a huge wall of text pasted on Whatsapp. I could figure out a few obvious issues with it but I decided to see if AI can help me review and visualize the issues instead. I felt this would help me communicate the issues easier with my relative.\u003C/p>\n\u003Cp>Planning holidays and building itineraries is a hobby of mine, so I had tried ChatGPT earlier to help with trip planning but I had found it lacking. It was great at generating rough to-dos for your trip like places to visit, etc which I believe it has adequate training data on and to be fair, it’s great for a normie. However, it fails miserably in many places like recommending good stays and other kinds of specialized interests and I’ve also observed that it tends to think about planning in terms of a western or american perspective.\u003C/p>\n\u003Cp>So I started asking ChatGPT to visualize the itinerary on maps and when it created an html artifact, I asked it to iterated on the design and visuals. But there was a lot of back and forth to get something done and often subsequent generations rolled back changes I had made. Below are couple of variations of my iterations, (\u003Ca href=\"/vibe-coding/iterations/vietnam_12_day_itinerary_web.html\">left\u003C/a>) from when I started to (\u003Ca href=\"/vibe-coding/iterations/Vietnam_12Day_Itinerary.html\">right\u003C/a>) when I decided to get it to make it swiss-inspired.\u003C/p>\n\u003Cdiv class=\"impact-images\" style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;\">\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./chatgpt-v1.png","alt":"","index":0}\">\u003C/figure>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./chatgpt-final.png","alt":"","index":0}\">\u003C/figure>\n\u003C/div>\n\u003Cp>I hit chatGPT’s session limit and decided to move it to Claude. That’s when it got easier. Claude’s execution of my requests were better. You could see an invisible multiplier in place such that a 1x simple prompt gave a \u003Ca href=\"/vibe-coding/iterations/vietnam_itinerary.html\">10x output\u003C/a>.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"./claude-v1.png","alt":"My input was the chatGPT html","index":0}\">\u003Cfigcaption>My input was the chatGPT html\u003C/figcaption>\u003C/figure>\n\u003Cp>That piqued my curiousity, I decided to see how far I could go.\u003C/p>\n\u003Cp>I first asked Claude what it would take to “productivize this” and it gave me a very detailed product roadmap of everything possible including the kitchen sink. It was overwhelming, but I made me learn that asking Claude for a plan is a good way to source ideas but better to work through the designs in the traditional way of implementation (prototype > iterate, repeat)\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"v1-prototype.png","alt":"Version 1 of Claude","index":0}\">\u003Cfigcaption>Version 1 of Claude\u003C/figcaption>\u003C/figure>\n\u003Cp>It took me about 40 iterations\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup> to get to a state I was comfortable sharing with friends to get feedback. Claude walked me through the steps of setting up Claude API key and hosting the app on Netlify, something I’ve never done before. You can check out the project at \u003Ca href=\"https://traviti.netlify.app/\">Traviti\u003C/a>.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"67.png","alt":"My last iteration","index":0}\">\u003Cfigcaption>My last iteration\u003C/figcaption>\u003C/figure>\n\u003Ch4 id=\"fun-fact\">Fun fact:\u003C/h4>\n\u003Col>\n\u003Cli>When I moved the html to Claude, it removed the ‘Made by ChatGPT’ label in the markup. Jealousy?\u003C/li>\n\u003Cli>Claude struggled a lot to add it’s own logo into the markup and I had to write the markup in the end.\u003C/li>\n\u003C/ol>\n\u003Cp>This project gave me sort of confidence to build further. The itinerary generator was not what I would have wanted to build, but \u003Ca href=\"https://kenneth.dsouza.im/budgie/\">Budgie\u003C/a> was. The time to build Budgie was faster. I now had Claude Pro subscription and quickly hit the weekly limit and had to stop so the v1 of Budgie took a week longer than expected to ship. Update: I shipped an \u003Ca href=\"https://budgie.travel\">updated version of Budgie\u003C/a> over the Christmas holidays.\u003C/p>\n\u003Cfigure class=\"image-figure\">\u003Cimg __ASTRO_IMAGE_=\"{"src":"budgie.png","alt":"Final version of Budgie","index":0}\">\u003Cfigcaption>Final version of Budgie\u003C/figcaption>\u003C/figure>\n\u003Cp>Towards the end of this project, I moved to Claude Code on web and the experience dramatically improved again. Having Claude as a partner to pair with and write to the same repo was amazing QoL improvement.\u003C/p>\n\u003Cp>After Budgie, I felt it was time to stop procrastinating and start working on my portfolio (this site). It had been previously built on Eleventy via Glitch (RIP) but I wanted to test how easy would it be to re-write this. So for this project, I asked Claude Code to review and then rebuild the site in Astro and I also provided designs I made in Figma. Claude was easily able to render it and since then, I’ve taken to making Figma mockups to move the designs along.\u003C/p>\n\u003Cp>Midway through this, I decided to try Claude code on desktop and found myself lost a couple of times, so I decided to move back to Claude code on web. (I do want to try Claude code on Desktop for a future project where I build from scratch.)\u003C/p>\n\u003Cp>Since then, I’ve tried my hands at \u003Ca href=\"https://kenneth.dsouza.im/books-2025/index.html\">visualizing my book reading on P5js\u003C/a> and tried to clean up \u003Ca href=\"https://kenneth.dsouza.im/visualizing-trains/\">an old D3js assignment\u003C/a> from a college module.\u003C/p>\n\u003Cp>Honestly, LLMs have been able to help me overcome the barriers I used to face with hobby side projects and I hope more people get empowered this way.\u003C/p>\n\u003Ch3 id=\"helpful-tips-if-you-want-to-get-started\">Helpful tips if you want to get started\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>Starting new chat is the new CTRL+S. I struggled a lot on regular chat conversation. Claude Code however generates a nice summary of the chat when you hit context limit.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Be ready to make a LOT of iteratons. Designing on Figma and providing images has been generally efficient to get the outcome you want.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Start with small projects; for me that means static web projects. Identify what it means for you.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>I expect design hiring to have a vibe coding round in the near future. Being able to translate your designs to a real functioning prototype has never been easier and moreover it gives an insight into how the designer solves problems.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Setup a free Github account and connect Claude to it. This will help with your versioning and the ability to roll back any unexpected changes. I personally prefer Github desktop over terminal and if you are new, I suggest you try that.\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Cp>—\u003C/p>\n\u003Cp>\u003Cem>If you are non-technical and want to learn how to to use AI to build, you can check out my free guide at \u003Ca href=\"https://howtoaicode.com\">howtoaicode.com\u003C/a>\u003C/em>\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>At times, some of Claude’s prompts generated multiple iterations so iteration 40 was more like 10 prompts into the conversation. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":768,"localImagePaths":776,"remoteImagePaths":777,"frontmatter":778,"imagePaths":781},[769,772,775],{"depth":57,"slug":770,"text":771},"fun-fact","Fun fact:",{"depth":44,"slug":773,"text":774},"helpful-tips-if-you-want-to-get-started","Helpful tips if you want to get started",{"depth":37,"slug":85,"text":86},[757,758,759,760,761,762],[],{"title":750,"description":751,"date":779,"status":19,"image":780},["Date","2025-12-22T00:00:00.000Z"],"git25.png",[757,758,759,760,761,762]] \ No newline at end of file diff --git a/astro-site/.astro/settings.json b/astro-site/.astro/settings.json deleted file mode 100644 index 2278e327..00000000 --- a/astro-site/.astro/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_variables": { - "lastUpdateCheck": 1784630445201 - } -} \ No newline at end of file diff --git a/astro-site/.astro/types.d.ts b/astro-site/.astro/types.d.ts deleted file mode 100644 index 03d7cc43..00000000 --- a/astro-site/.astro/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// \ No newline at end of file diff --git a/astro-site/.obsidian/app.json b/astro-site/.obsidian/app.json deleted file mode 100644 index 4a21d46c..00000000 --- a/astro-site/.obsidian/app.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "autoConvertHtml": false -} \ No newline at end of file diff --git a/astro-site/.obsidian/appearance.json b/astro-site/.obsidian/appearance.json deleted file mode 100644 index c2c300be..00000000 --- a/astro-site/.obsidian/appearance.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "cssTheme": "", - "baseFontSize": 18, - "textFontFamily": "Liter", - "interfaceFontFamily": "Inter" -} \ No newline at end of file diff --git a/astro-site/.obsidian/community-plugins.json b/astro-site/.obsidian/community-plugins.json deleted file mode 100644 index 3d143836..00000000 --- a/astro-site/.obsidian/community-plugins.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "templater-obsidian" -] \ No newline at end of file diff --git a/astro-site/.obsidian/core-plugins.json b/astro-site/.obsidian/core-plugins.json deleted file mode 100644 index 639b90da..00000000 --- a/astro-site/.obsidian/core-plugins.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "file-explorer": true, - "global-search": true, - "switcher": true, - "graph": true, - "backlink": true, - "canvas": true, - "outgoing-link": true, - "tag-pane": true, - "footnotes": false, - "properties": true, - "page-preview": true, - "daily-notes": true, - "templates": true, - "note-composer": true, - "command-palette": true, - "slash-command": false, - "editor-status": true, - "bookmarks": true, - "markdown-importer": false, - "zk-prefixer": false, - "random-note": false, - "outline": true, - "word-count": true, - "slides": false, - "audio-recorder": false, - "workspaces": false, - "file-recovery": true, - "publish": false, - "sync": true, - "bases": true, - "webviewer": false -} \ No newline at end of file diff --git a/astro-site/.obsidian/graph.json b/astro-site/.obsidian/graph.json deleted file mode 100644 index e21a18dc..00000000 --- a/astro-site/.obsidian/graph.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "collapse-filter": true, - "search": "", - "showTags": false, - "showAttachments": false, - "hideUnresolved": false, - "showOrphans": true, - "collapse-color-groups": true, - "colorGroups": [], - "collapse-display": true, - "showArrow": false, - "textFadeMultiplier": 0, - "nodeSizeMultiplier": 1, - "lineSizeMultiplier": 1, - "collapse-forces": true, - "centerStrength": 0.518713248970312, - "repelStrength": 10, - "linkStrength": 1, - "linkDistance": 250, - "scale": 1, - "close": false -} \ No newline at end of file diff --git a/astro-site/.obsidian/plugins/templater-obsidian/data.json b/astro-site/.obsidian/plugins/templater-obsidian/data.json deleted file mode 100644 index bdcd62a4..00000000 --- a/astro-site/.obsidian/plugins/templater-obsidian/data.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "command_timeout": 5, - "templates_folder": "src/content/templates", - "templates_pairs": [ - [ - "", - "" - ] - ], - "trigger_on_file_creation": true, - "auto_jump_to_cursor": false, - "enable_system_commands": false, - "shell_path": "", - "user_scripts_folder": "", - "enable_folder_templates": true, - "folder_templates": [ - { - "folder": "src/content/work", - "template": "src/content/templates/template-work/index.md" - }, - { - "folder": "src/content/writing", - "template": "src/content/templates/template-writing/index.md" - } - ], - "enable_file_templates": false, - "file_templates": [ - { - "regex": ".md", - "template": "src/content/work/Template/index.md" - } - ], - "syntax_highlighting": true, - "syntax_highlighting_mobile": false, - "enabled_templates_hotkeys": [ - "" - ], - "startup_templates": [ - "" - ], - "intellisense_render": 1 -} \ No newline at end of file diff --git a/astro-site/.obsidian/plugins/templater-obsidian/main.js b/astro-site/.obsidian/plugins/templater-obsidian/main.js deleted file mode 100644 index 481ca767..00000000 --- a/astro-site/.obsidian/plugins/templater-obsidian/main.js +++ /dev/null @@ -1,45 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -var ja=Object.create;var Rn=Object.defineProperty;var va=Object.getOwnPropertyDescriptor;var wa=Object.getOwnPropertyNames;var ba=Object.getPrototypeOf,Ea=Object.prototype.hasOwnProperty;var Vi=n=>Rn(n,"__esModule",{value:!0});var Ta=(n,e)=>{Vi(n);for(var t in e)Rn(n,t,{get:e[t],enumerable:!0})},ka=(n,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of wa(e))!Ea.call(n,r)&&r!=="default"&&Rn(n,r,{get:()=>e[r],enumerable:!(t=va(e,r))||t.enumerable});return n},X=n=>ka(Vi(Rn(n!=null?ja(ba(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);var zi=(()=>{for(var n=new Uint8Array(128),e=0;e<64;e++)n[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return t=>{for(var r=t.length,i=new Uint8Array((r-(t[r-1]=="=")-(t[r-2]=="="))*3/4|0),o=0,a=0;o>4,i[a++]=c<<4|d>>2,i[a++]=d<<6|m}return i}})();Ta(exports,{default:()=>Fi});var Er=X(require("obsidian"));var L=X(require("obsidian"));var Ji=X(require("obsidian"));function oe(n){let e=new Ji.Notice("",8e3),t=createFragment(r=>{r.createEl("b",{text:"Templater Error"}),r.createEl("span",{text:":"}),r.createEl("br"),r.createEl("span",{text:n.message}),n instanceof P&&n.console_msg&&(r.createEl("br"),r.createEl("span",{text:"Check console for more information"}),console.error("Templater Error:",n.message,` -`,n.console_msg))});e.noticeEl.appendChild(t)}var P=class extends Error{constructor(e,t){super(e);this.console_msg=t;this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}};async function Se(n,e){try{return await n()}catch(t){return t instanceof P?oe(t):oe(new P(e,t.message)),null}}function Ce(n,e){try{return n()}catch(t){return oe(new P(e,t.message)),null}}var re=function(){function n(){}return n.explainIfInvalidTSDocTagName=function(e){if(e[0]!=="@")return'A TSDoc tag name must start with an "@" symbol';if(!n._tsdocTagNameRegExp.test(e))return"A TSDoc tag name must start with a letter and contain only letters and numbers"},n.validateTSDocTagName=function(e){var t=n.explainIfInvalidTSDocTagName(e);if(t)throw new Error(t)},n.explainIfInvalidLinkUrl=function(e){if(e.length===0)return"The URL cannot be empty";if(!n._urlSchemeRegExp.test(e))return'An @link URL must begin with a scheme comprised only of letters and numbers followed by "://". (For general URLs, use an HTML "" tag instead.)';if(!n._urlSchemeAfterRegExp.test(e))return'An @link URL must have at least one character after "://"'},n.explainIfInvalidHtmlName=function(e){if(!n._htmlNameRegExp.test(e))return"An HTML name must be an ASCII letter followed by zero or more letters, digits, or hyphens"},n.validateHtmlName=function(e){var t=n.explainIfInvalidHtmlName(e);if(t)throw new Error(t)},n.explainIfInvalidPackageName=function(e){if(e.length===0)return"The package name cannot be an empty string";if(!n._validPackageNameRegExp.test(e))return"The package name ".concat(JSON.stringify(e)," is not a valid package name")},n.explainIfInvalidImportPath=function(e,t){if(e.length>0){if(e.indexOf("//")>=0)return'An import path must not contain "//"';if(e[e.length-1]==="/")return'An import path must not end with "/"';if(!t&&e[0]==="/")return'An import path must not start with "/" unless prefixed by a package name'}},n.isSystemSelector=function(e){return n._systemSelectors.has(e)},n.explainIfInvalidUnquotedIdentifier=function(e){if(e.length===0)return"The identifier cannot be an empty string";if(n._identifierBadCharRegExp.test(e))return"The identifier cannot non-word characters";if(n._identifierNumberStartRegExp.test(e))return"The identifier must not start with a number"},n.explainIfInvalidUnquotedMemberIdentifier=function(e){var t=n.explainIfInvalidUnquotedIdentifier(e);if(t!==void 0)return t;if(n.isSystemSelector(e))return'The identifier "'.concat(e,'" must be quoted because it is a TSDoc system selector name')},n._tsdocTagNameRegExp=/^@[a-z][a-z0-9]*$/i,n._urlSchemeRegExp=/^[a-z][a-z0-9]*\:\/\//i,n._urlSchemeAfterRegExp=/^[a-z][a-z0-9]*\:\/\/./i,n._htmlNameRegExp=/^[a-z]+[a-z0-9\-]*$/i,n._identifierBadCharRegExp=/[^a-z0-9_$]/i,n._identifierNumberStartRegExp=/^[0-9]/,n._validPackageNameRegExp=/^(?:@[a-z0-9\-_\.]+\/)?[a-z0-9\-_\.]+$/i,n._systemSelectors=new Set(["instance","static","constructor","class","enum","function","interface","namespace","type","variable"]),n}();var Pr=function(){function n(){this._docNodeDefinitionsByKind=new Map,this._docNodeDefinitionsByConstructor=new Map}return n.prototype.registerDocNodes=function(e,t){var r=re.explainIfInvalidPackageName(e);if(r)throw new Error("Invalid NPM package name: "+r);for(var i=0,o=t;i0&&i.appendNodes(r),i}return Object.defineProperty(e.prototype,"nodes",{get:function(){return this._nodes},enumerable:!1,configurable:!0}),e.prototype.appendNode=function(t){if(!this.configuration.docNodeManager.isAllowedChild(this.kind,t.kind))throw new Error("The TSDocConfiguration does not allow a ".concat(this.kind," node to")+" contain a node of type ".concat(t.kind));this._nodes.push(t)},e.prototype.appendNodes=function(t){for(var r=0,i=t;r0){var i=this.nodes[this.nodes.length-1];i.kind===g.Paragraph&&(r=i)}r||(r=new at({configuration:this.configuration}),this.appendNode(r)),r.appendNode(t)},e.prototype.appendNodesInParagraph=function(t){for(var r=0,i=t;r1){var e=this._chunks.join("");this._chunks.length=1,this._chunks[0]=e}return this._chunks[0]},n}();var Zi=function(){function n(){}return n.transform=function(e){for(var t=[],r=!1,i=[],o=[],a=!1,l=0,c=e.nodes;l0&&(r&&(i.push(" "),r=!1),i.push(S),o.push(d),a=!0),b&&a&&(r=!0);break;case g.SoftBreak:a&&(r=!0),o.push(d);break;default:r&&(i.push(" "),r=!1),i.length>0&&(t.push(new Ve({configuration:e.configuration,text:i.join("")})),i.length=0,o.length=0),t.push(d),a=!0}}i.length>0&&(t.push(new Ve({configuration:e.configuration,text:i.join("")})),i.length=0,o.length=0);var k=new at({configuration:e.configuration});return k.appendNodes(t),k},n}();var Fr=function(){function n(){}return n.trimSpacesInParagraph=function(e){return Zi.transform(e)},n}();var qr=function(n,e,t){if(t||arguments.length===2)for(var r=0,i=e.length,o;r0&&(this._ensureLineSkipped(),this._renderNodes(a.modifierTagSet.nodes));break;case g.DeclarationReference:var l=e;this._writeContent(l.packageName),this._writeContent(l.importPath),(l.packageName!==void 0||l.importPath!==void 0)&&this._writeContent("#"),this._renderNodes(l.memberReferences);break;case g.ErrorText:var c=e;this._writeContent(c.text);break;case g.EscapedText:var d=e;this._writeContent(d.encodedText);break;case g.FencedCode:var m=e;this._ensureAtStartOfLine(),this._writeContent("```"),this._writeContent(m.language),this._writeNewline(),this._writeContent(m.code),this._writeContent("```"),this._writeNewline(),this._writeNewline();break;case g.HtmlAttribute:var _=e;this._writeContent(_.name),this._writeContent(_.spacingAfterName),this._writeContent("="),this._writeContent(_.spacingAfterEquals),this._writeContent(_.value),this._writeContent(_.spacingAfterValue);break;case g.HtmlEndTag:var w=e;this._writeContent("");break;case g.HtmlStartTag:var b=e;this._writeContent("<"),this._writeContent(b.name),this._writeContent(b.spacingAfterName);for(var S=b.spacingAfterName===void 0||b.spacingAfterName.length===0,k=0,E=b.htmlAttributes;k":">");break;case g.InheritDocTag:var $=e;this._renderInlineTag($,function(){$.declarationReference&&(t._writeContent(" "),t._renderNode($.declarationReference))});break;case g.InlineTag:var K=e;this._renderInlineTag(K,function(){K.tagContent.length>0&&(t._writeContent(" "),t._writeContent(K.tagContent))});break;case g.LinkTag:var D=e;this._renderInlineTag(D,function(){(D.urlDestination!==void 0||D.codeDestination!==void 0)&&(D.urlDestination!==void 0?(t._writeContent(" "),t._writeContent(D.urlDestination)):D.codeDestination!==void 0&&(t._writeContent(" "),t._renderNode(D.codeDestination))),D.linkText!==void 0&&(t._writeContent(" "),t._writeContent("|"),t._writeContent(" "),t._writeContent(D.linkText))});break;case g.MemberIdentifier:var H=e;H.hasQuotes?(this._writeContent('"'),this._writeContent(H.identifier),this._writeContent('"')):this._writeContent(H.identifier);break;case g.MemberReference:var F=e;F.hasDot&&this._writeContent("."),F.selector&&this._writeContent("("),F.memberSymbol?this._renderNode(F.memberSymbol):this._renderNode(F.memberIdentifier),F.selector&&(this._writeContent(":"),this._renderNode(F.selector),this._writeContent(")"));break;case g.MemberSelector:var J=e;this._writeContent(J.selector);break;case g.MemberSymbol:var te=e;this._writeContent("["),this._renderNode(te.symbolReference),this._writeContent("]");break;case g.Section:var ne=e;this._renderNodes(ne.nodes);break;case g.Paragraph:var Q=Fr.trimSpacesInParagraph(e);Q.nodes.length>0&&(this._hangingParagraph?this._hangingParagraph=!1:this._ensureLineSkipped(),this._renderNodes(Q.nodes),this._writeNewline());break;case g.ParamBlock:var h=e;this._ensureLineSkipped(),this._renderNode(h.blockTag),this._writeContent(" "),this._writeContent(h.parameterName),this._writeContent(" - "),this._hangingParagraph=!0,this._renderNode(h.content),this._hangingParagraph=!1;break;case g.ParamCollection:var C=e;this._renderNodes(C.blocks);break;case g.PlainText:var f=e;this._writeContent(f.text);break}},n.prototype._renderInlineTag=function(e,t){this._writeContent("{"),this._writeContent(e.tagName),t(),this._writeContent("}")},n.prototype._renderNodes=function(e){for(var t=0,r=e;t1){for(var r=!0,i=0,o=t;i0?this.params:void 0,this.typeParams.count>0?this.typeParams:void 0,this.returnsBlock],this.customBlocks,!0),this.seeBlocks,!0),[this.inheritDocTag],!1),this.modifierTagSet.nodes,!0)},e.prototype.emitAsTsdoc=function(){var t=new st,r=new ct;return r.renderComment(t,this),t.toString()},e}(T);var qa=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),La=function(n,e,t){if(t||arguments.length===2)for(var r=0,i=e.length,o;r=t},n._scanTextContent=function(e,t,r){for(var i=0,o=e;i=t||(r+=n._scanTextContent(a.getChildNodes(),t,r),r>=t))break}return r},n._countNonSpaceCharacters=function(e){for(var t=0,r=e.length,i=0;ithis.buffer.length)return{line:0,column:0};for(var t=1,r=1,i=0;ithis.buffer.length)throw new Error("TextRange.pos cannot exceed the associated text buffer length");if(this.end>this.buffer.length)throw new Error("TextRange.end cannot exceed the associated text buffer length")},n.empty=new n("",0,0),n}();var hn=function(){function n(e){this.messageId=e.messageId,this.unformattedText=e.messageText,this.textRange=e.textRange,this.tokenSequence=e.tokenSequence,this.docNode=e.docNode,this._text=void 0}return n._formatMessageText=function(e,t){if(e||(e="An unknown error occurred"),t.pos!==0||t.end!==0){var r=t.getLocation(t.pos);if(r.line)return"(".concat(r.line,",").concat(r.column,"): ")+e}return e},Object.defineProperty(n.prototype,"text",{get:function(){return this._text===void 0&&(this._text=n._formatMessageText(this.unformattedText,this.textRange)),this._text},enumerable:!1,configurable:!0}),n.prototype.toString=function(){return this.text},n}();var Lr=function(){function n(){this._messages=[]}return Object.defineProperty(n.prototype,"messages",{get:function(){return this._messages},enumerable:!1,configurable:!0}),n.prototype.addMessage=function(e){this._messages.push(e)},n.prototype.addMessageForTextRange=function(e,t,r){this.addMessage(new hn({messageId:e,messageText:t,textRange:r}))},n.prototype.addMessageForTokenSequence=function(e,t,r,i){this.addMessage(new hn({messageId:e,messageText:t,textRange:r.getContainingTextRange(),tokenSequence:r,docNode:i}))},n.prototype.addMessageForDocErrorText=function(e){var t;e.textExcerpt?t=e.textExcerpt:t=e.errorLocation,this.addMessage(new hn({messageId:e.messageId,messageText:e.errorMessage,textRange:t.getContainingTextRange(),tokenSequence:t,docNode:e}))},n}();var Hr=function(){function n(e,t){this.commentRange=ze.empty,this.lines=[],this.tokens=[],this.configuration=e,this.sourceRange=t,this.docComment=new Gn({configuration:this.configuration}),this.log=new Lr}return n}();var xt=function(){function n(e){this.parserContext=e.parserContext,this._startIndex=e.startIndex,this._endIndex=e.endIndex,this._validateBounds()}return n.createEmpty=function(e){return new n({parserContext:e,startIndex:0,endIndex:0})},Object.defineProperty(n.prototype,"startIndex",{get:function(){return this._startIndex},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"endIndex",{get:function(){return this._endIndex},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"tokens",{get:function(){return this.parserContext.tokens.slice(this._startIndex,this._endIndex)},enumerable:!1,configurable:!0}),n.prototype.getNewSequence=function(e,t){return new n({parserContext:this.parserContext,startIndex:e,endIndex:t})},n.prototype.getContainingTextRange=function(){return this.isEmpty()?ze.empty:this.parserContext.sourceRange.getNewRange(this.parserContext.tokens[this._startIndex].range.pos,this.parserContext.tokens[this._endIndex-1].range.end)},n.prototype.isEmpty=function(){return this._startIndex===this._endIndex},n.prototype.toString=function(){return this.tokens.map(function(e){return e.toString()}).join("")},n.prototype._validateBounds=function(){if(this.startIndex<0)throw new Error("TokenSequence.startIndex cannot be negative");if(this.endIndex<0)throw new Error("TokenSequence.endIndex cannot be negative");if(this.endIndexthis.parserContext.tokens.length)throw new Error("TokenSequence.startIndex cannot exceed the associated token array");if(this.endIndex>this.parserContext.tokens.length)throw new Error("TokenSequence.endIndex cannot exceed the associated token array")},n}();var pe;(function(n){n[n.BeginComment1=0]="BeginComment1",n[n.BeginComment2=1]="BeginComment2",n[n.CollectingFirstLine=2]="CollectingFirstLine",n[n.CollectingLine=3]="CollectingLine",n[n.AdvancingLine=4]="AdvancingLine",n[n.Done=5]="Done"})(pe||(pe={}));var no=function(){function n(){}return n.extract=function(e){for(var t=e.sourceRange,r=t.buffer,i=0,o=0,a=0,l=0,c=t.pos,d=pe.BeginComment1,m=[];d!==pe.Done;){if(c>=t.end)switch(d){case pe.BeginComment1:case pe.BeginComment2:return e.log.addMessageForTextRange(v.CommentNotFound,'Expecting a "/**" comment',t),!1;default:return e.log.addMessageForTextRange(v.CommentMissingClosingDelimiter,"Unexpected end of input",t),!1}var _=r[c],w=c;++c;var b=ca)&&m.push(t.getNewRange(a,l)),a=c,l=c,d=pe.AdvancingLine):_==="*"&&b==="/"?(l>a&&m.push(t.getNewRange(a,l)),a=0,l=0,++c,o=c,d=pe.Done):n._whitespaceCharacterRegExp.test(_)||(l=c);break;case pe.AdvancingLine:_==="*"?b==="/"?(a=0,l=0,++c,o=c,d=pe.Done):(b===" "&&++c,a=c,l=c,d=pe.CollectingLine):_===` -`?(m.push(t.getNewRange(w,w)),a=c):n._whitespaceCharacterRegExp.test(_)||(l=c,d=pe.CollectingLine);break}}return e.commentRange=t.getNewRange(i,o),e.lines=m,!0},n._whitespaceCharacterRegExp=/^\s$/,n}();var An=function(){function n(){}return n.readTokens=function(e){n._ensureInitialized();for(var t=[],r=void 0,i=0,o=e;i":u.GreaterThan,"=":u.Equals,"'":u.SingleQuote,'"':u.DoubleQuote,"/":u.Slash,"-":u.Hyphen,"@":u.AtSign,"{":u.LeftCurlyBracket,"}":u.RightCurlyBracket,"`":u.Backtick,".":u.Period,":":u.Colon,",":u.Comma,"[":u.LeftSquareBracket,"]":u.RightSquareBracket,"|":u.Pipe,"(":u.LeftParenthesis,")":u.RightParenthesis,"#":u.PoundSymbol,"+":u.Plus,$:u.DollarSign},o=0,a=Object.getOwnPropertyNames(i);o?@[\\]^`{|}~",n._wordCharacters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_",n}();var $r=function(){function n(e,t){if(this._parserContext=e,this.tokens=e.tokens,t){if(t.parserContext!==this._parserContext)throw new Error("The embeddedTokenSequence must use the same parser context");this._readerStartIndex=t.startIndex,this._readerEndIndex=t.endIndex}else this._readerStartIndex=0,this._readerEndIndex=this.tokens.length;this._currentIndex=this._readerStartIndex,this._accumulatedStartIndex=this._readerStartIndex}return n.prototype.extractAccumulatedSequence=function(){if(this._accumulatedStartIndex===this._currentIndex)throw new Error("Parser assertion failed: The queue should not be empty when extractAccumulatedSequence() is called");var e=new xt({parserContext:this._parserContext,startIndex:this._accumulatedStartIndex,endIndex:this._currentIndex});return this._accumulatedStartIndex=this._currentIndex,e},n.prototype.isAccumulatedSequenceEmpty=function(){return this._accumulatedStartIndex===this._currentIndex},n.prototype.tryExtractAccumulatedSequence=function(){if(!this.isAccumulatedSequenceEmpty())return this.extractAccumulatedSequence()},n.prototype.assertAccumulatedSequenceIsEmpty=function(){if(!this.isAccumulatedSequenceEmpty()){var e=new xt({parserContext:this._parserContext,startIndex:this._accumulatedStartIndex,endIndex:this._currentIndex}),t=e.tokens.map(function(r){return r.toString()});throw new Error(`Parser assertion failed: The queue should be empty, but it contains: -`+JSON.stringify(t))}},n.prototype.peekToken=function(){return this.tokens[this._currentIndex]},n.prototype.peekTokenKind=function(){return this._currentIndex>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex].kind},n.prototype.peekTokenAfterKind=function(){return this._currentIndex+1>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex+1].kind},n.prototype.peekTokenAfterAfterKind=function(){return this._currentIndex+2>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex+2].kind},n.prototype.readToken=function(){if(this._currentIndex>=this._readerEndIndex)throw new Error("Cannot read past end of stream");var e=this.tokens[this._currentIndex];if(e.kind===u.EndOfInput)throw new Error("The EndOfInput token cannot be read");return this._currentIndex++,e},n.prototype.peekPreviousTokenKind=function(){return this._currentIndex===0?u.EndOfInput:this.tokens[this._currentIndex-1].kind},n.prototype.createMarker=function(){return this._currentIndex},n.prototype.backtrackToMarker=function(e){if(e>this._currentIndex)throw new Error("The marker has expired");this._currentIndex=e,e" character should be escaped using a backslash to avoid confusion with an HTML tag'));break;case u.Backtick:this._pushAccumulatedPlainText(e),e.peekTokenAfterKind()===u.Backtick&&e.peekTokenAfterAfterKind()===u.Backtick?this._pushNode(this._parseFencedCode(e)):this._pushNode(this._parseCodeSpan(e));break;default:e.readToken();break}this._pushAccumulatedPlainText(e),this._performValidationChecks()},n.prototype._performValidationChecks=function(){var e=this._parserContext.docComment;e.deprecatedBlock&&(cr.hasAnyTextContent(e.deprecatedBlock)||this._parserContext.log.addMessageForTokenSequence(v.MissingDeprecationMessage,"The ".concat(e.deprecatedBlock.blockTag.tagName," block must include a deprecation message,")+" e.g. describing the recommended alternative",e.deprecatedBlock.blockTag.getTokenSequence(),e.deprecatedBlock)),e.inheritDocTag&&(e.remarksBlock&&this._parserContext.log.addMessageForTokenSequence(v.InheritDocIncompatibleTag,'A "'.concat(e.remarksBlock.blockTag.tagName,'" block must not be used, because that')+" content is provided by the @inheritDoc tag",e.remarksBlock.blockTag.getTokenSequence(),e.remarksBlock.blockTag),cr.hasAnyTextContent(e.summarySection)&&this._parserContext.log.addMessageForTextRange(v.InheritDocIncompatibleSummary,"The summary section must not have any content, because that content is provided by the @inheritDoc tag",this._parserContext.commentRange))},n.prototype._validateTagDefinition=function(e,t,r,i,o){if(e){var a=e.syntaxKind===R.InlineTag;a!==r?r?this._parserContext.log.addMessageForTokenSequence(v.TagShouldNotHaveBraces,'The TSDoc tag "'.concat(t,'" is not an inline tag; it must not be enclosed in "{ }" braces'),i,o):this._parserContext.log.addMessageForTokenSequence(v.InlineTagMissingBraces,'The TSDoc tag "'.concat(t,'" is an inline tag; it must be enclosed in "{ }" braces'),i,o):this._parserContext.configuration.validation.reportUnsupportedTags&&(this._parserContext.configuration.isTagSupported(e)||this._parserContext.log.addMessageForTokenSequence(v.UnsupportedTag,'The TSDoc tag "'.concat(t,'" is not supported by this tool'),i,o))}else this._parserContext.configuration.validation.ignoreUndefinedTags||this._parserContext.log.addMessageForTokenSequence(v.UndefinedTag,'The TSDoc tag "'.concat(t,'" is not defined in this configuration'),i,o)},n.prototype._pushAccumulatedPlainText=function(e){e.isAccumulatedSequenceEmpty()||this._pushNode(new Ve({parsed:!0,configuration:this._configuration,textExcerpt:e.extractAccumulatedSequence()}))},n.prototype._parseAndPushBlock=function(e){var t=this._parserContext.docComment,r=this._parserContext.configuration,i=t.modifierTagSet,o=this._parseBlockTag(e);if(o.kind!==g.BlockTag){this._pushNode(o);return}var a=o,l=r.tryGetTagDefinitionWithUpperCase(a.tagNameWithUpperCase);if(this._validateTagDefinition(l,a.tagName,!1,a.getTokenSequence(),a),l)switch(l.syntaxKind){case R.BlockTag:if(a.tagNameWithUpperCase===G.param.tagNameWithUpperCase){var c=this._parseParamBlock(e,a,G.param.tagName);this._parserContext.docComment.params.add(c),this._currentSection=c.content;return}else if(a.tagNameWithUpperCase===G.typeParam.tagNameWithUpperCase){var c=this._parseParamBlock(e,a,G.typeParam.tagName);this._parserContext.docComment.typeParams.add(c),this._currentSection=c.content;return}else{var d=new Vt({configuration:this._configuration,blockTag:a});this._addBlockToDocComment(d),this._currentSection=d.content}return;case R.ModifierTag:i.addTag(a);return}this._pushNode(a)},n.prototype._addBlockToDocComment=function(e){var t=this._parserContext.docComment;switch(e.blockTag.tagNameWithUpperCase){case G.remarks.tagNameWithUpperCase:t.remarksBlock=e;break;case G.privateRemarks.tagNameWithUpperCase:t.privateRemarks=e;break;case G.deprecated.tagNameWithUpperCase:t.deprecatedBlock=e;break;case G.returns.tagNameWithUpperCase:t.returnsBlock=e;break;case G.see.tagNameWithUpperCase:t._appendSeeBlock(e);break;default:t.appendCustomBlock(e)}},n.prototype._tryParseJSDocTypeOrValueRest=function(e,t,r,i){for(var o,a=1;a>0;){var l=e.peekTokenKind();switch(l){case t:o===void 0&&a++;break;case r:o===void 0&&a--;break;case u.Backslash:o!==void 0&&(e.readToken(),l=e.peekTokenKind());break;case u.DoubleQuote:case u.SingleQuote:case u.Backtick:o===l?o=void 0:o===void 0&&(o=l);break}if(l===u.EndOfInput){e.backtrackToMarker(i);return}e.readToken()}return e.tryExtractAccumulatedSequence()},n.prototype._tryParseUnsupportedJSDocType=function(e,t,r){if(e.assertAccumulatedSequenceIsEmpty(),!(e.peekTokenKind()!==u.LeftCurlyBracket||e.peekTokenAfterKind()===u.AtSign)){var i=e.createMarker();e.readToken();var o=this._tryParseJSDocTypeOrValueRest(e,u.LeftCurlyBracket,u.RightCurlyBracket,i);if(o){this._parserContext.log.addMessageForTokenSequence(v.ParamTagWithInvalidType,"The "+r+" block should not include a JSDoc-style '{type}'",o,t);var a=this._tryReadSpacingAndNewlines(e);a&&(o=o.getNewSequence(o.startIndex,a.endIndex))}return o}},n.prototype._tryParseJSDocOptionalNameRest=function(e){if(e.assertAccumulatedSequenceIsEmpty(),e.peekTokenKind()!==u.EndOfInput){var t=e.createMarker();return this._tryParseJSDocTypeOrValueRest(e,u.LeftSquareBracket,u.RightSquareBracket,t)}},n.prototype._parseParamBlock=function(e,t,r){var i=e.createMarker(),o=this._tryReadSpacingAndNewlines(e),a=this._tryParseUnsupportedJSDocType(e,t,r),l;e.peekTokenKind()===u.LeftSquareBracket&&(e.readToken(),l=e.extractAccumulatedSequence());for(var c="",d=!1;!d;)switch(e.peekTokenKind()){case u.AsciiWord:case u.Period:case u.DollarSign:c+=e.readToken();break;default:d=!0;break}var m=re.explainIfInvalidUnquotedIdentifier(c);if(m!==void 0){e.backtrackToMarker(i);var _=new gn({configuration:this._configuration,blockTag:t,parameterName:""}),w=c.length>0?"The "+r+" block should be followed by a valid parameter name: "+m:"The "+r+" block should be followed by a parameter name";return this._parserContext.log.addMessageForTokenSequence(v.ParamTagWithInvalidName,w,t.getTokenSequence(),t),_}var b=e.extractAccumulatedSequence(),S;if(l){S=this._tryParseJSDocOptionalNameRest(e);var k=l;S&&(k=t.getTokenSequence().getNewSequence(l.startIndex,S.endIndex)),this._parserContext.log.addMessageForTokenSequence(v.ParamTagWithInvalidOptionalName,"The "+r+" should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets.",k,t)}var E=this._tryReadSpacingAndNewlines(e),O=this._tryParseUnsupportedJSDocType(e,t,r),$,K,D;return e.peekTokenKind()===u.Hyphen?(e.readToken(),$=e.extractAccumulatedSequence(),K=this._tryReadSpacingAndNewlines(e),D=this._tryParseUnsupportedJSDocType(e,t,r)):this._parserContext.log.addMessageForTokenSequence(v.ParamTagMissingHyphen,"The "+r+" block should be followed by a parameter name and then a hyphen",t.getTokenSequence(),t),new gn({parsed:!0,configuration:this._configuration,blockTag:t,spacingBeforeParameterNameExcerpt:o,unsupportedJsdocTypeBeforeParameterNameExcerpt:a,unsupportedJsdocOptionalNameOpenBracketExcerpt:l,parameterNameExcerpt:b,parameterName:c,unsupportedJsdocOptionalNameRestExcerpt:S,spacingAfterParameterNameExcerpt:E,unsupportedJsdocTypeAfterParameterNameExcerpt:O,hyphenExcerpt:$,spacingAfterHyphenExcerpt:K,unsupportedJsdocTypeAfterHyphenExcerpt:D})},n.prototype._pushNode=function(e){this._configuration.docNodeManager.isAllowedChild(g.Paragraph,e.kind)?this._currentSection.appendNodeInParagraph(e):this._currentSection.appendNode(e)},n.prototype._parseBackslashEscape=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker();if(e.readToken(),e.peekTokenKind()===u.EndOfInput)return this._backtrackAndCreateError(e,t,v.UnnecessaryBackslash,"A backslash must precede another character that is being escaped");var r=e.readToken();if(!An.isPunctuation(r.kind))return this._backtrackAndCreateError(e,t,v.UnnecessaryBackslash,"A backslash can only be used to escape a punctuation character");var i=e.extractAccumulatedSequence();return new Vn({parsed:!0,configuration:this._configuration,escapeStyle:sr.CommonMarkBackslash,encodedTextExcerpt:i,decodedText:r.toString()})},n.prototype._parseBlockTag=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker();if(e.peekTokenKind()!==u.AtSign)return this._backtrackAndCreateError(e,t,v.MissingTag,'Expecting a TSDoc tag starting with "@"');switch(e.peekPreviousTokenKind()){case u.EndOfInput:case u.Spacing:case u.Newline:break;default:return this._backtrackAndCreateError(e,t,v.AtSignInWord,'The "@" character looks like part of a TSDoc tag; use a backslash to escape it')}var r=e.readToken().toString();if(e.peekTokenKind()!==u.AsciiWord)return this._backtrackAndCreateError(e,t,v.AtSignWithoutTagName,'Expecting a TSDoc tag name after "@"; if it is not a tag, use a backslash to escape this character');for(var i=e.createMarker();e.peekTokenKind()===u.AsciiWord;)r+=e.readToken().toString();switch(e.peekTokenKind()){case u.Spacing:case u.Newline:case u.EndOfInput:break;default:var o=e.peekToken().range.toString()[0];return this._backtrackAndCreateError(e,t,v.CharactersAfterBlockTag,'The token "'.concat(r,'" looks like a TSDoc tag but contains an invalid character')+" ".concat(JSON.stringify(o),'; if it is not a tag, use a backslash to escape the "@"'))}if(re.explainIfInvalidTSDocTagName(r)){var a=this._createFailureForTokensSince(e,v.MalformedTagName,"A TSDoc tag name must start with a letter and contain only letters and numbers",i);return this._backtrackAndCreateErrorForFailure(e,t,"",a)}return new Yn({parsed:!0,configuration:this._configuration,tagName:r,tagNameExcerpt:e.extractAccumulatedSequence()})},n.prototype._parseInlineTag=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker();if(e.peekTokenKind()!==u.LeftCurlyBracket)return this._backtrackAndCreateError(e,t,v.MissingTag,'Expecting a TSDoc tag starting with "{"');e.readToken();var r=e.extractAccumulatedSequence(),i=e.createMarker();if(e.peekTokenKind()!==u.AtSign)return this._backtrackAndCreateError(e,t,v.MalformedInlineTag,'Expecting a TSDoc tag starting with "{@"');for(var o=e.readToken().toString();e.peekTokenKind()===u.AsciiWord;)o+=e.readToken().toString();if(o==="@"){var a=this._createFailureForTokensSince(e,v.MalformedInlineTag,'Expecting a TSDoc inline tag name after the "{@" characters',i);return this._backtrackAndCreateErrorRangeForFailure(e,t,i,"",a)}if(re.explainIfInvalidTSDocTagName(o)){var a=this._createFailureForTokensSince(e,v.MalformedTagName,"A TSDoc tag name must start with a letter and contain only letters and numbers",i);return this._backtrackAndCreateErrorRangeForFailure(e,t,i,"",a)}var l=e.extractAccumulatedSequence(),c=this._tryReadSpacingAndNewlines(e);if(c===void 0&&e.peekTokenKind()!==u.RightCurlyBracket){var d=e.peekToken().range.toString()[0],a=this._createFailureForToken(e,v.CharactersAfterInlineTag,"The character ".concat(JSON.stringify(d)," cannot appear after the TSDoc tag name; expecting a space"));return this._backtrackAndCreateErrorRangeForFailure(e,t,i,"",a)}for(var m=!1;!m;)switch(e.peekTokenKind()){case u.EndOfInput:return this._backtrackAndCreateErrorRange(e,t,i,v.InlineTagMissingRightBrace,'The TSDoc inline tag name is missing its closing "}"');case u.Backslash:if(e.readToken(),!An.isPunctuation(e.peekTokenKind())){var a=this._createFailureForToken(e,v.UnnecessaryBackslash,"A backslash can only be used to escape a punctuation character");return this._backtrackAndCreateErrorRangeForFailure(e,t,i,"Error reading inline TSDoc tag: ",a)}e.readToken();break;case u.LeftCurlyBracket:{var a=this._createFailureForToken(e,v.InlineTagUnescapedBrace,'The "{" character must be escaped with a backslash when used inside a TSDoc inline tag');return this._backtrackAndCreateErrorRangeForFailure(e,t,i,"",a)}case u.RightCurlyBracket:m=!0;break;default:e.readToken();break}var _=e.tryExtractAccumulatedSequence();e.readToken();var w=e.extractAccumulatedSequence(),b={parsed:!0,configuration:this._configuration,openingDelimiterExcerpt:r,tagNameExcerpt:l,tagName:o,spacingAfterTagNameExcerpt:c,tagContentExcerpt:_,closingDelimiterExcerpt:w},S=o.toUpperCase(),k=new $r(this._parserContext,_||xt.createEmpty(this._parserContext)),E;switch(S){case G.inheritDoc.tagNameWithUpperCase:E=this._parseInheritDocTag(b,k);break;case G.link.tagNameWithUpperCase:E=this._parseLinkTag(b,k);break;default:E=new zt(b)}var O=this._parserContext.configuration.tryGetTagDefinitionWithUpperCase(S);return this._validateTagDefinition(O,o,!0,l,E),E},n.prototype._parseInheritDocTag=function(e,t){var r=new zt(e),i=lr({},e);if(t.peekTokenKind()!==u.EndOfInput){if(i.declarationReference=this._parseDeclarationReference(t,e.tagNameExcerpt,r),!i.declarationReference)return r;if(t.peekTokenKind()!==u.EndOfInput)return t.readToken(),this._parserContext.log.addMessageForTokenSequence(v.InheritDocTagSyntax,"Unexpected character after declaration reference",t.extractAccumulatedSequence(),r),r}return new dn(i)},n.prototype._parseLinkTag=function(e,t){var r=new zt(e),i=lr({},e);if(!e.tagContentExcerpt)return this._parserContext.log.addMessageForTokenSequence(v.LinkTagEmpty,"The @link tag content is missing",i.tagNameExcerpt,r),r;for(var o=t.peekTokenKind()===u.Slash&&t.peekTokenAfterKind()===u.Slash,a=t.createMarker(),l=o;!l;)switch(t.peekTokenKind()){case u.AsciiWord:case u.Period:case u.Hyphen:case u.Plus:t.readToken();break;case u.Colon:t.readToken(),o=t.peekTokenKind()===u.Slash&&t.peekTokenAfterKind()===u.Slash,l=!0;break;default:l=!0}if(t.backtrackToMarker(a),o){if(!this._parseLinkTagUrlDestination(t,i,e.tagNameExcerpt,r))return r}else if(!this._parseLinkTagCodeDestination(t,i,e.tagNameExcerpt,r))return r;if(t.peekTokenKind()===u.Spacing)throw new Error("Unconsumed spacing encountered after construct");if(t.peekTokenKind()===u.Pipe){t.readToken(),i.pipeExcerpt=t.extractAccumulatedSequence(),i.spacingAfterPipeExcerpt=this._tryReadSpacingAndNewlines(t),l=!1;for(var c=void 0;!l;)switch(t.peekTokenKind()){case u.EndOfInput:l=!0;break;case u.Pipe:case u.LeftCurlyBracket:var d=t.readToken().toString();return this._parserContext.log.addMessageForTokenSequence(v.LinkTagUnescapedText,'The "'.concat(d,'" character may not be used in the link text without escaping it'),t.extractAccumulatedSequence(),r),r;case u.Spacing:case u.Newline:t.readToken();break;default:c=t.createMarker()+1,t.readToken()}var m=t.tryExtractAccumulatedSequence();m&&(c===void 0?i.spacingAfterLinkTextExcerpt=m:c>=m.endIndex?i.linkTextExcerpt=m:(i.linkTextExcerpt=m.getNewSequence(m.startIndex,c),i.spacingAfterLinkTextExcerpt=m.getNewSequence(c,m.endIndex)))}else if(t.peekTokenKind()!==u.EndOfInput)return t.readToken(),this._parserContext.log.addMessageForTokenSequence(v.LinkTagDestinationSyntax,"Unexpected character after link destination",t.extractAccumulatedSequence(),r),r;return new Zn(i)},n.prototype._parseLinkTagUrlDestination=function(e,t,r,i){for(var o="",a=!1;!a;)switch(e.peekTokenKind()){case u.Spacing:case u.Newline:case u.EndOfInput:case u.Pipe:case u.RightCurlyBracket:a=!0;break;default:o+=e.readToken();break}if(o.length===0)throw new Error("Missing URL in _parseLinkTagUrlDestination()");var l=e.extractAccumulatedSequence(),c=re.explainIfInvalidLinkUrl(o);return c?(this._parserContext.log.addMessageForTokenSequence(v.LinkTagInvalidUrl,c,l,i),!1):(t.urlDestinationExcerpt=l,t.spacingAfterDestinationExcerpt=this._tryReadSpacingAndNewlines(e),!0)},n.prototype._parseLinkTagCodeDestination=function(e,t,r,i){return t.codeDestination=this._parseDeclarationReference(e,r,i),!!t.codeDestination},n.prototype._parseDeclarationReference=function(e,t,r){e.assertAccumulatedSequenceIsEmpty();for(var i=e.createMarker(),o=!1,a=!0,l=!1,c=!1;!c;)switch(e.peekTokenKind()){case u.DoubleQuote:case u.EndOfInput:case u.LeftCurlyBracket:case u.LeftParenthesis:case u.LeftSquareBracket:case u.Newline:case u.Pipe:case u.RightCurlyBracket:case u.RightParenthesis:case u.RightSquareBracket:case u.SingleQuote:case u.Spacing:c=!0;break;case u.PoundSymbol:o=!0,c=!0;break;case u.Slash:case u.AtSign:a&&(l=!0),e.readToken();break;case u.AsciiWord:case u.Period:case u.Hyphen:e.readToken();break;default:a=!1,e.readToken()}if(!o&&l){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingHash,'The declaration reference appears to contain a package name or import path, but it is missing the "#" delimiter',e.extractAccumulatedSequence(),r);return}e.backtrackToMarker(i);var d,m,_,w;if(o){if(e.peekTokenKind()!==u.Period){var b=e.peekTokenKind()===u.AtSign,S=!1;for(c=!1;!c;)switch(e.peekTokenKind()){case u.EndOfInput:throw new Error("Expecting pound symbol");case u.Slash:b&&!S?(e.readToken(),S=!0):c=!0;break;case u.PoundSymbol:c=!0;break;default:e.readToken()}if(!e.isAccumulatedSequenceEmpty()){d=e.extractAccumulatedSequence();var k=re.explainIfInvalidPackageName(d.toString());if(k){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMalformedPackageName,k,d,r);return}}}for(c=!1;!c;)switch(e.peekTokenKind()){case u.EndOfInput:throw new Error("Expecting pound symbol");case u.PoundSymbol:c=!0;break;default:e.readToken()}if(!e.isAccumulatedSequenceEmpty()){m=e.extractAccumulatedSequence();var k=re.explainIfInvalidImportPath(m.toString(),!!d);if(k){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMalformedImportPath,k,m,r);return}}if(e.peekTokenKind()!==u.PoundSymbol)throw new Error("Expecting pound symbol");if(e.readToken(),_=e.extractAccumulatedSequence(),w=this._tryReadSpacingAndNewlines(e),d===void 0&&m===void 0){this._parserContext.log.addMessageForTokenSequence(v.ReferenceHashSyntax,"The hash character must be preceded by a package name or import path",_,r);return}}var E=[];for(c=!1;!c;)switch(e.peekTokenKind()){case u.Period:case u.LeftParenthesis:case u.AsciiWord:case u.Colon:case u.LeftSquareBracket:case u.DoubleQuote:var O=E.length>0,$=this._parseMemberReference(e,O,t,r);if(!$)return;E.push($);break;default:c=!0}if(d===void 0&&m===void 0&&E.length===0){this._parserContext.log.addMessageForTokenSequence(v.MissingReference,"Expecting a declaration reference",t,r);return}return new Wn({parsed:!0,configuration:this._configuration,packageNameExcerpt:d,importPathExcerpt:m,importHashExcerpt:_,spacingAfterImportHashExcerpt:w,memberReferences:E})},n.prototype._parseMemberReference=function(e,t,r,i){var o={parsed:!0,configuration:this._configuration};if(t){if(e.peekTokenKind()!==u.Period){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingDot,"Expecting a period before the next component of a declaration reference",r,i);return}e.readToken(),o.dotExcerpt=e.extractAccumulatedSequence(),o.spacingAfterDotExcerpt=this._tryReadSpacingAndNewlines(e)}if(e.peekTokenKind()===u.LeftParenthesis&&(e.readToken(),o.leftParenthesisExcerpt=e.extractAccumulatedSequence(),o.spacingAfterLeftParenthesisExcerpt=this._tryReadSpacingAndNewlines(e)),e.peekTokenKind()===u.LeftSquareBracket){if(o.memberSymbol=this._parseMemberSymbol(e,i),!o.memberSymbol)return}else if(o.memberIdentifier=this._parseMemberIdentifier(e,r,i),!o.memberIdentifier)return;if(o.spacingAfterMemberExcerpt=this._tryReadSpacingAndNewlines(e),e.peekTokenKind()===u.Colon){if(e.readToken(),o.colonExcerpt=e.extractAccumulatedSequence(),o.spacingAfterColonExcerpt=this._tryReadSpacingAndNewlines(e),!o.leftParenthesisExcerpt){this._parserContext.log.addMessageForTokenSequence(v.ReferenceSelectorMissingParens,"Syntax error in declaration reference: the member selector must be enclosed in parentheses",o.colonExcerpt,i);return}if(o.selector=this._parseMemberSelector(e,o.colonExcerpt,i),!o.selector)return;o.spacingAfterSelectorExcerpt=this._tryReadSpacingAndNewlines(e)}else if(o.leftParenthesisExcerpt){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingColon,"Expecting a colon after the identifier because the expression is in parentheses",o.leftParenthesisExcerpt,i);return}if(o.leftParenthesisExcerpt){if(e.peekTokenKind()!==u.RightParenthesis){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingRightParen,"Expecting a matching right parenthesis",o.leftParenthesisExcerpt,i);return}e.readToken(),o.rightParenthesisExcerpt=e.extractAccumulatedSequence(),o.spacingAfterRightParenthesisExcerpt=this._tryReadSpacingAndNewlines(e)}return new er(o)},n.prototype._parseMemberSymbol=function(e,t){if(e.peekTokenKind()!==u.LeftSquareBracket)throw new Error('Expecting "["');e.readToken();var r=e.extractAccumulatedSequence(),i=this._tryReadSpacingAndNewlines(e),o=this._parseDeclarationReference(e,r,t);if(!o){this._parserContext.log.addMessageForTokenSequence(v.ReferenceSymbolSyntax,"Missing declaration reference in symbol reference",r,t);return}if(e.peekTokenKind()!==u.RightSquareBracket){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingRightBracket,"Missing closing square bracket for symbol reference",r,t);return}e.readToken();var a=e.extractAccumulatedSequence();return new nr({parsed:!0,configuration:this._configuration,leftBracketExcerpt:r,spacingAfterLeftBracketExcerpt:i,symbolReference:o,rightBracketExcerpt:a})},n.prototype._parseMemberIdentifier=function(e,t,r){var i=void 0,o=void 0;if(e.peekTokenKind()===u.DoubleQuote){for(e.readToken(),i=e.extractAccumulatedSequence();e.peekTokenKind()!==u.DoubleQuote;){if(e.peekTokenKind()===u.EndOfInput){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingQuote,"Unexpected end of input inside quoted member identifier",i,r);return}e.readToken()}if(e.isAccumulatedSequenceEmpty()){this._parserContext.log.addMessageForTokenSequence(v.ReferenceEmptyIdentifier,"The quoted identifier cannot be empty",i,r);return}var a=e.extractAccumulatedSequence();return e.readToken(),o=e.extractAccumulatedSequence(),new mn({parsed:!0,configuration:this._configuration,leftQuoteExcerpt:i,identifierExcerpt:a,rightQuoteExcerpt:o})}else{for(var l=!1;!l;)switch(e.peekTokenKind()){case u.AsciiWord:case u.DollarSign:e.readToken();break;default:l=!0;break}if(e.isAccumulatedSequenceEmpty()){this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingIdentifier,"Syntax error in declaration reference: expecting a member identifier",t,r);return}var a=e.extractAccumulatedSequence(),c=a.toString(),d=re.explainIfInvalidUnquotedMemberIdentifier(c);if(d){this._parserContext.log.addMessageForTokenSequence(v.ReferenceUnquotedIdentifier,d,a,r);return}return new mn({parsed:!0,configuration:this._configuration,leftQuoteExcerpt:i,identifierExcerpt:a,rightQuoteExcerpt:o})}},n.prototype._parseMemberSelector=function(e,t,r){e.peekTokenKind()!==u.AsciiWord&&this._parserContext.log.addMessageForTokenSequence(v.ReferenceMissingLabel,"Expecting a selector label after the colon",t,r);var i=e.readToken().toString(),o=e.extractAccumulatedSequence(),a=new tr({parsed:!0,configuration:this._configuration,selectorExcerpt:o,selector:i});if(a.errorMessage){this._parserContext.log.addMessageForTokenSequence(v.ReferenceSelectorSyntax,a.errorMessage,o,r);return}return a},n.prototype._parseHtmlStartTag=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker(),r=e.readToken();if(r.kind!==u.LessThan)throw new Error('Expecting an HTML tag starting with "<"');var i=e.extractAccumulatedSequence(),o=this._parseHtmlName(e);if(_n(o))return this._backtrackAndCreateErrorForFailure(e,t,"Invalid HTML element: ",o);for(var a=this._tryReadSpacingAndNewlines(e),l=[];e.peekTokenKind()===u.AsciiWord;){var c=this._parseHtmlAttribute(e);if(_n(c))return this._backtrackAndCreateErrorForFailure(e,t,"The HTML element has an invalid attribute: ",c);l.push(c)}e.assertAccumulatedSequenceIsEmpty();var d=e.createMarker(),m=!1;if(e.peekTokenKind()===u.Slash&&(e.readToken(),m=!0),e.peekTokenKind()!==u.GreaterThan){var _=this._createFailureForTokensSince(e,v.HtmlTagMissingGreaterThan,'Expecting an attribute or ">" or "/>"',d);return this._backtrackAndCreateErrorForFailure(e,t,"The HTML tag has invalid syntax: ",_)}e.readToken();var w=e.extractAccumulatedSequence();return new Xn({parsed:!0,configuration:this._configuration,openingDelimiterExcerpt:i,nameExcerpt:o,spacingAfterNameExcerpt:a,htmlAttributes:l,selfClosingTag:m,closingDelimiterExcerpt:w})},n.prototype._parseHtmlAttribute=function(e){e.assertAccumulatedSequenceIsEmpty();var t=this._parseHtmlName(e);if(_n(t))return t;var r=this._tryReadSpacingAndNewlines(e);if(e.peekTokenKind()!==u.Equals)return this._createFailureForToken(e,v.HtmlTagMissingEquals,'Expecting "=" after HTML attribute name');e.readToken();var i=e.extractAccumulatedSequence(),o=this._tryReadSpacingAndNewlines(e),a=this._parseHtmlString(e);if(_n(a))return a;var l=e.extractAccumulatedSequence(),c=this._tryReadSpacingAndNewlines(e);return new Jn({parsed:!0,configuration:this._configuration,nameExcerpt:t,spacingAfterNameExcerpt:r,equalsExcerpt:i,spacingAfterEqualsExcerpt:o,valueExcerpt:l,spacingAfterValueExcerpt:c})},n.prototype._parseHtmlString=function(e){var t=e.createMarker(),r=e.peekTokenKind();if(r!==u.DoubleQuote&&r!==u.SingleQuote)return this._createFailureForToken(e,v.HtmlTagMissingString,"Expecting an HTML string starting with a single-quote or double-quote character");e.readToken();for(var i="";;){var o=e.peekTokenKind();if(o===r){e.readToken();break}if(o===u.EndOfInput||o===u.Newline)return this._createFailureForToken(e,v.HtmlStringMissingQuote,"The HTML string is missing its closing quote",t);i+=e.readToken().toString()}return e.peekTokenKind()===u.AsciiWord?this._createFailureForToken(e,v.TextAfterHtmlString,"The next character after a closing quote must be spacing or punctuation"):i},n.prototype._parseHtmlEndTag=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker(),r=e.peekToken();if(r.kind!==u.LessThan)return this._backtrackAndCreateError(e,t,v.MissingHtmlEndTag,'Expecting an HTML tag starting with "" for the HTML tag');return this._backtrackAndCreateErrorForFailure(e,t,"",c)}e.readToken();var d=e.extractAccumulatedSequence();return new Qn({parsed:!0,configuration:this._configuration,openingDelimiterExcerpt:o,nameExcerpt:a,spacingAfterNameExcerpt:l,closingDelimiterExcerpt:d})},n.prototype._parseHtmlName=function(e){var t=e.createMarker();if(e.peekTokenKind()===u.Spacing)return this._createFailureForTokensSince(e,v.MalformedHtmlName,"A space is not allowed here",t);for(var r=!1;!r;)switch(e.peekTokenKind()){case u.Hyphen:case u.Period:case u.AsciiWord:e.readToken();break;default:r=!0;break}var i=e.tryExtractAccumulatedSequence();if(!i)return this._createFailureForToken(e,v.MalformedHtmlName,"Expecting an HTML name");var o=i.toString(),a=re.explainIfInvalidHtmlName(o);return a?this._createFailureForTokensSince(e,v.MalformedHtmlName,a,t):this._configuration.validation.reportUnsupportedHtmlElements&&!this._configuration.isHtmlElementSupported(o)?this._createFailureForToken(e,v.UnsupportedHtmlElementName,"The HTML element name ".concat(JSON.stringify(o)," is not defined by your TSDoc configuration"),t):i},n.prototype._parseFencedCode=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker(),r=t+2;switch(e.peekPreviousTokenKind()){case u.Newline:case u.EndOfInput:break;default:return this._backtrackAndCreateErrorRange(e,t,r,v.CodeFenceOpeningIndent,"The opening backtick for a code fence must appear at the start of the line")}var i="";if(i+=e.readToken(),i+=e.readToken(),i+=e.readToken(),i!=="```")throw new Error("Expecting three backticks");for(var o=e.extractAccumulatedSequence();e.peekTokenKind()===u.Spacing;)e.readToken();for(var a=e.tryExtractAccumulatedSequence(),l=!1,c=void 0;!l;)switch(e.peekTokenKind()){case u.Spacing:case u.Newline:c===void 0&&(c=e.createMarker()),e.peekTokenKind()===u.Newline&&(l=!0),e.readToken();break;case u.Backtick:var d=this._createFailureForToken(e,v.CodeFenceSpecifierSyntax,"The language specifier cannot contain backtick characters");return this._backtrackAndCreateErrorRangeForFailure(e,t,r,"Error parsing code fence: ",d);case u.EndOfInput:var m=this._createFailureForToken(e,v.CodeFenceMissingDelimiter,"Missing closing delimiter");return this._backtrackAndCreateErrorRangeForFailure(e,t,r,"Error parsing code fence: ",m);default:c=void 0,e.readToken();break}var _=e.extractAccumulatedSequence(),w=_.getNewSequence(_.startIndex,c),b=_.getNewSequence(c,_.endIndex),S=-1,k=-1;l=!1;for(var E;!l;)switch(e.peekTokenKind()){case u.EndOfInput:var m=this._createFailureForToken(e,v.CodeFenceMissingDelimiter,"Missing closing delimiter");return this._backtrackAndCreateErrorRangeForFailure(e,t,r,"Error parsing code fence: ",m);case u.Newline:for(E=e.readToken(),S=e.createMarker();e.peekTokenKind()===u.Spacing;)E=e.readToken();if(e.peekTokenKind()!==u.Backtick||(k=e.createMarker(),e.readToken(),e.peekTokenKind()!==u.Backtick)||(e.readToken(),e.peekTokenKind()!==u.Backtick))break;e.readToken(),l=!0;break;default:e.readToken();break}E.kind!==u.Newline&&this._parserContext.log.addMessageForTextRange(v.CodeFenceClosingIndent,"The closing delimiter for a code fence must not be indented",E.range);var O=e.extractAccumulatedSequence(),$=O.getNewSequence(O.startIndex,S),K=O.getNewSequence(S,k),D=O.getNewSequence(k,O.endIndex);for(l=!1;!l;)switch(e.peekTokenKind()){case u.Spacing:e.readToken();break;case u.Newline:l=!0,e.readToken();break;case u.EndOfInput:l=!0;break;default:this._parserContext.log.addMessageForTextRange(v.CodeFenceClosingSyntax,"Unexpected characters after closing delimiter for code fence",e.peekToken().range),l=!0;break}var H=e.tryExtractAccumulatedSequence();return new zn({parsed:!0,configuration:this._configuration,openingFenceExcerpt:o,spacingAfterOpeningFenceExcerpt:a,languageExcerpt:w,spacingAfterLanguageExcerpt:b,codeExcerpt:$,spacingBeforeClosingFenceExcerpt:K,closingFenceExcerpt:D,spacingAfterClosingFenceExcerpt:H})},n.prototype._parseCodeSpan=function(e){e.assertAccumulatedSequenceIsEmpty();var t=e.createMarker();if(e.peekTokenKind()!==u.Backtick)throw new Error('Expecting a code span starting with a backtick character "`"');e.readToken();for(var r=e.extractAccumulatedSequence(),i=void 0,o=void 0;;){var a=e.peekTokenKind();if(a===u.Backtick){if(e.isAccumulatedSequenceEmpty())return this._backtrackAndCreateErrorRange(e,t,t+1,v.CodeSpanEmpty,"A code span must contain at least one character between the backticks");i=e.extractAccumulatedSequence(),e.readToken(),o=e.extractAccumulatedSequence();break}if(a===u.EndOfInput||a===u.Newline)return this._backtrackAndCreateError(e,t,v.CodeSpanMissingDelimiter,"The code span is missing its closing backtick");e.readToken()}return new Un({parsed:!0,configuration:this._configuration,openingDelimiterExcerpt:r,codeExcerpt:i,closingDelimiterExcerpt:o})},n.prototype._tryReadSpacingAndNewlines=function(e){var t=!1;do switch(e.peekTokenKind()){case u.Spacing:case u.Newline:e.readToken();break;default:t=!0;break}while(!t);return e.tryExtractAccumulatedSequence()},n.prototype._createError=function(e,t,r){e.readToken();var i=e.extractAccumulatedSequence(),o=new Dt({parsed:!0,configuration:this._configuration,textExcerpt:i,messageId:t,errorMessage:r,errorLocation:i});return this._parserContext.log.addMessageForDocErrorText(o),o},n.prototype._backtrackAndCreateError=function(e,t,r,i){return e.backtrackToMarker(t),this._createError(e,r,i)},n.prototype._backtrackAndCreateErrorRange=function(e,t,r,i,o){for(e.backtrackToMarker(t);e.createMarker()!==r;)e.readToken();e.peekTokenKind()!==u.EndOfInput&&e.readToken();var a=e.extractAccumulatedSequence(),l=new Dt({parsed:!0,configuration:this._configuration,textExcerpt:a,messageId:i,errorMessage:o,errorLocation:a});return this._parserContext.log.addMessageForDocErrorText(l),l},n.prototype._backtrackAndCreateErrorForFailure=function(e,t,r,i){e.backtrackToMarker(t),e.readToken();var o=e.extractAccumulatedSequence(),a=new Dt({parsed:!0,configuration:this._configuration,textExcerpt:o,messageId:i.failureMessageId,errorMessage:r+i.failureMessage,errorLocation:i.failureLocation});return this._parserContext.log.addMessageForDocErrorText(a),a},n.prototype._backtrackAndCreateErrorRangeForFailure=function(e,t,r,i,o){for(e.backtrackToMarker(t);e.createMarker()!==r;)e.readToken();e.peekTokenKind()!==u.EndOfInput&&e.readToken();var a=e.extractAccumulatedSequence(),l=new Dt({parsed:!0,configuration:this._configuration,textExcerpt:a,messageId:o.failureMessageId,errorMessage:i+o.failureMessage,errorLocation:o.failureLocation});return this._parserContext.log.addMessageForDocErrorText(l),l},n.prototype._createFailureForToken=function(e,t,r,i){i||(i=e.createMarker());var o=new xt({parserContext:this._parserContext,startIndex:i,endIndex:i+1});return{failureMessageId:t,failureMessage:r,failureLocation:o}},n.prototype._createFailureForTokensSince=function(e,t,r,i){var o=e.createMarker();if(osetTimeout(e,n))}function ao(){return/(<%(?:-|_)?\s*[*~]{0,1})\+((?:.|\s)*?%>)/g}function rs(n,e){e=(0,Te.normalizePath)(e);let t=n.vault.getAbstractFileByPath(e);if(!t)throw new P(`Folder "${e}" doesn't exist`);if(!(t instanceof Te.TFolder))throw new P(`${e} is a file, not a folder`);return t}function Nt(n,e){e=(0,Te.normalizePath)(e);let t=n.vault.getAbstractFileByPath(e);if(!t)throw new P(`File "${e}" doesn't exist`);if(!(t instanceof Te.TFile))throw new P(`${e} is a folder, not a file`);return t}function Je(n,e){let t=rs(n,e),r=[];return Te.Vault.recurseChildren(t,i=>{i instanceof Te.TFile&&r.push(i)}),r.sort((i,o)=>i.path.localeCompare(o.path)),r}async function so(n,e){return await Promise.all(e.map(async r=>{let i=await n.vault.cachedRead(r);return is(r,i)}))}function is(n,e){let r=new Kr().parseString(e),i=new Rr(n);return i.description=os(r.docComment.summarySection),i.returns=as(r.docComment.returnsBlock),i.arguments=ss(r.docComment.params),i}function os(n){try{return n.nodes.map(t=>t.getChildNodes().filter(r=>r instanceof Ve).map(r=>r.text).join(` -`)).join(` -`)}catch{console.error("Failed to parse summary section")}}function as(n){if(!n)return"";try{return n.content.nodes[0].getChildNodes()[0].text.trim()}catch{return""}}function ss(n){try{return n.blocks.map(r=>{let i=r.parameterName,o=r.content.getChildNodes()[0].getChildNodes().filter(a=>a instanceof Ve).map(a=>a.text).join(" ");return new Yr(i,o)})}catch{return[]}}function Mt(n,e,t){if(t<0||t===n.length)return;let r=n[e];n[e]=n[t],n[t]=r}function Xt(n){return n.workspace.activeEditor?.file??n.workspace.getActiveFile()}function co(n){let e=n.lastIndexOf("/");return e!==-1?n.slice(0,e):""}function xn(n){return n!==null&&typeof n=="object"}function lo(n){let e=n.toString(),t=e.indexOf("(");return e.substring(t+1,e.indexOf(")")).replace(/ /g,"").split(",")}function Ur(n,e,t){let r=n instanceof HTMLOListElement?"li":"p",i=n.createEl(r),o=n.createEl("b",{text:e});return i.appendChild(o),i.appendChild(document.createTextNode(`: ${t}`)),i}function pr(n,e){if(Object.keys(e).length!==0){for(let t in e)if(e.hasOwnProperty(t))if(n.hasOwnProperty(t)){let r=n[t],i=e[t];if(Array.isArray(r)||Array.isArray(i)){let o=Array.isArray(r)?r:[r],a=Array.isArray(i)?i:[i];n[t]=o.concat(a).unique()}else xn(r)&&xn(i)?pr(r,i):i!=null&&i!==""&&(n[t]=i)}else n[t]=e[t]}}function yn(n){let e={},t=(0,Te.getFrontMatterInfo)(n);return t.frontmatter&&(e=(0,Te.parseYaml)(t.frontmatter)),{frontmatter:e,content:n.slice(t.contentStart)}}var Oo=X(require("obsidian"));var No=X(require("obsidian"));var ie="top",ue="bottom",ce="right",ae="left",ur="auto",jt=[ie,ue,ce,ae],lt="start",Ot="end",po="clippingParents",fr="viewport",Zt="popper",uo="reference",Gr=jt.reduce(function(n,e){return n.concat([e+"-"+lt,e+"-"+Ot])},[]),dr=[].concat(jt,[ur]).reduce(function(n,e){return n.concat([e,e+"-"+lt,e+"-"+Ot])},[]),cs="beforeRead",ls="read",ps="afterRead",us="beforeMain",fs="main",ds="afterMain",ms="beforeWrite",gs="write",hs="afterWrite",fo=[cs,ls,ps,us,fs,ds,ms,gs,hs];function me(n){return n?(n.nodeName||"").toLowerCase():null}function Z(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var e=n.ownerDocument;return e&&e.defaultView||window}return n}function Me(n){var e=Z(n).Element;return n instanceof e||n instanceof Element}function fe(n){var e=Z(n).HTMLElement;return n instanceof e||n instanceof HTMLElement}function en(n){if(typeof ShadowRoot=="undefined")return!1;var e=Z(n).ShadowRoot;return n instanceof e||n instanceof ShadowRoot}function As(n){var e=n.state;Object.keys(e.elements).forEach(function(t){var r=e.styles[t]||{},i=e.attributes[t]||{},o=e.elements[t];!fe(o)||!me(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(a){var l=i[a];l===!1?o.removeAttribute(a):o.setAttribute(a,l===!0?"":l)}))})}function _s(n){var e=n.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(r){var i=e.elements[r],o=e.attributes[r]||{},a=Object.keys(e.styles.hasOwnProperty(r)?e.styles[r]:t[r]),l=a.reduce(function(c,d){return c[d]="",c},{});!fe(i)||!me(i)||(Object.assign(i.style,l),Object.keys(o).forEach(function(c){i.removeAttribute(c)}))})}}var mo={name:"applyStyles",enabled:!0,phase:"write",fn:As,effect:_s,requires:["computeStyles"]};function ge(n){return n.split("-")[0]}var qe=Math.max,Bt=Math.min,pt=Math.round;function tn(){var n=navigator.userAgentData;return n!=null&&n.brands&&Array.isArray(n.brands)?n.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function jn(){return!/^((?!chrome|android).)*safari/i.test(tn())}function Oe(n,e,t){e===void 0&&(e=!1),t===void 0&&(t=!1);var r=n.getBoundingClientRect(),i=1,o=1;e&&fe(n)&&(i=n.offsetWidth>0&&pt(r.width)/n.offsetWidth||1,o=n.offsetHeight>0&&pt(r.height)/n.offsetHeight||1);var a=Me(n)?Z(n):window,l=a.visualViewport,c=!jn()&&t,d=(r.left+(c&&l?l.offsetLeft:0))/i,m=(r.top+(c&&l?l.offsetTop:0))/o,_=r.width/i,w=r.height/o;return{width:_,height:w,top:m,right:d+_,bottom:m+w,left:d,x:d,y:m}}function It(n){var e=Oe(n),t=n.offsetWidth,r=n.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-r)<=1&&(r=e.height),{x:n.offsetLeft,y:n.offsetTop,width:t,height:r}}function vn(n,e){var t=e.getRootNode&&e.getRootNode();if(n.contains(e))return!0;if(t&&en(t)){var r=e;do{if(r&&n.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function we(n){return Z(n).getComputedStyle(n)}function Wr(n){return["table","td","th"].indexOf(me(n))>=0}function Ae(n){return((Me(n)?n.ownerDocument:n.document)||window.document).documentElement}function ut(n){return me(n)==="html"?n:n.assignedSlot||n.parentNode||(en(n)?n.host:null)||Ae(n)}function go(n){return!fe(n)||we(n).position==="fixed"?null:n.offsetParent}function xs(n){var e=/firefox/i.test(tn()),t=/Trident/i.test(tn());if(t&&fe(n)){var r=we(n);if(r.position==="fixed")return null}var i=ut(n);for(en(i)&&(i=i.host);fe(i)&&["html","body"].indexOf(me(i))<0;){var o=we(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function Le(n){for(var e=Z(n),t=go(n);t&&Wr(t)&&we(t).position==="static";)t=go(t);return t&&(me(t)==="html"||me(t)==="body"&&we(t).position==="static")?e:t||xs(n)||e}function Ft(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function qt(n,e,t){return qe(n,Bt(e,t))}function ho(n,e,t){var r=qt(n,e,t);return r>t?t:r}function wn(){return{top:0,right:0,bottom:0,left:0}}function bn(n){return Object.assign({},wn(),n)}function En(n,e){return e.reduce(function(t,r){return t[r]=n,t},{})}var ys=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,bn(typeof e!="number"?e:En(e,jt))};function js(n){var e,t=n.state,r=n.name,i=n.options,o=t.elements.arrow,a=t.modifiersData.popperOffsets,l=ge(t.placement),c=Ft(l),d=[ae,ce].indexOf(l)>=0,m=d?"height":"width";if(!(!o||!a)){var _=ys(i.padding,t),w=It(o),b=c==="y"?ie:ae,S=c==="y"?ue:ce,k=t.rects.reference[m]+t.rects.reference[c]-a[c]-t.rects.popper[m],E=a[c]-t.rects.reference[c],O=Le(o),$=O?c==="y"?O.clientHeight||0:O.clientWidth||0:0,K=k/2-E/2,D=_[b],H=$-w[m]-_[S],F=$/2-w[m]/2+K,J=qt(D,F,H),te=c;t.modifiersData[r]=(e={},e[te]=J,e.centerOffset=J-F,e)}}function vs(n){var e=n.state,t=n.options,r=t.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=e.elements.popper.querySelector(i),!i)||!vn(e.elements.popper,i)||(e.elements.arrow=i))}var Ao={name:"arrow",enabled:!0,phase:"main",fn:js,effect:vs,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Be(n){return n.split("-")[1]}var ws={top:"auto",right:"auto",bottom:"auto",left:"auto"};function bs(n,e){var t=n.x,r=n.y,i=e.devicePixelRatio||1;return{x:pt(t*i)/i||0,y:pt(r*i)/i||0}}function _o(n){var e,t=n.popper,r=n.popperRect,i=n.placement,o=n.variation,a=n.offsets,l=n.position,c=n.gpuAcceleration,d=n.adaptive,m=n.roundOffsets,_=n.isFixed,w=a.x,b=w===void 0?0:w,S=a.y,k=S===void 0?0:S,E=typeof m=="function"?m({x:b,y:k}):{x:b,y:k};b=E.x,k=E.y;var O=a.hasOwnProperty("x"),$=a.hasOwnProperty("y"),K=ae,D=ie,H=window;if(d){var F=Le(t),J="clientHeight",te="clientWidth";if(F===Z(t)&&(F=Ae(t),we(F).position!=="static"&&l==="absolute"&&(J="scrollHeight",te="scrollWidth")),F=F,i===ie||(i===ae||i===ce)&&o===Ot){D=ue;var ne=_&&F===H&&H.visualViewport?H.visualViewport.height:F[J];k-=ne-r.height,k*=c?1:-1}if(i===ae||(i===ie||i===ue)&&o===Ot){K=ce;var Q=_&&F===H&&H.visualViewport?H.visualViewport.width:F[te];b-=Q-r.width,b*=c?1:-1}}var h=Object.assign({position:l},d&&ws),C=m===!0?bs({x:b,y:k},Z(t)):{x:b,y:k};if(b=C.x,k=C.y,c){var f;return Object.assign({},h,(f={},f[D]=$?"0":"",f[K]=O?"0":"",f.transform=(H.devicePixelRatio||1)<=1?"translate("+b+"px, "+k+"px)":"translate3d("+b+"px, "+k+"px, 0)",f))}return Object.assign({},h,(e={},e[D]=$?k+"px":"",e[K]=O?b+"px":"",e.transform="",e))}function Es(n){var e=n.state,t=n.options,r=t.gpuAcceleration,i=r===void 0?!0:r,o=t.adaptive,a=o===void 0?!0:o,l=t.roundOffsets,c=l===void 0?!0:l,d={placement:ge(e.placement),variation:Be(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,_o(Object.assign({},d,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:a,roundOffsets:c})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,_o(Object.assign({},d,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var xo={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Es,data:{}};var mr={passive:!0};function Ts(n){var e=n.state,t=n.instance,r=n.options,i=r.scroll,o=i===void 0?!0:i,a=r.resize,l=a===void 0?!0:a,c=Z(e.elements.popper),d=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&d.forEach(function(m){m.addEventListener("scroll",t.update,mr)}),l&&c.addEventListener("resize",t.update,mr),function(){o&&d.forEach(function(m){m.removeEventListener("scroll",t.update,mr)}),l&&c.removeEventListener("resize",t.update,mr)}}var yo={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Ts,data:{}};var ks={left:"right",right:"left",bottom:"top",top:"bottom"};function nn(n){return n.replace(/left|right|bottom|top/g,function(e){return ks[e]})}var Ss={start:"end",end:"start"};function gr(n){return n.replace(/start|end/g,function(e){return Ss[e]})}function Lt(n){var e=Z(n),t=e.pageXOffset,r=e.pageYOffset;return{scrollLeft:t,scrollTop:r}}function Ht(n){return Oe(Ae(n)).left+Lt(n).scrollLeft}function Vr(n,e){var t=Z(n),r=Ae(n),i=t.visualViewport,o=r.clientWidth,a=r.clientHeight,l=0,c=0;if(i){o=i.width,a=i.height;var d=jn();(d||!d&&e==="fixed")&&(l=i.offsetLeft,c=i.offsetTop)}return{width:o,height:a,x:l+Ht(n),y:c}}function zr(n){var e,t=Ae(n),r=Lt(n),i=(e=n.ownerDocument)==null?void 0:e.body,o=qe(t.scrollWidth,t.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),a=qe(t.scrollHeight,t.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),l=-r.scrollLeft+Ht(n),c=-r.scrollTop;return we(i||t).direction==="rtl"&&(l+=qe(t.clientWidth,i?i.clientWidth:0)-o),{width:o,height:a,x:l,y:c}}function $t(n){var e=we(n),t=e.overflow,r=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+i+r)}function hr(n){return["html","body","#document"].indexOf(me(n))>=0?n.ownerDocument.body:fe(n)&&$t(n)?n:hr(ut(n))}function vt(n,e){var t;e===void 0&&(e=[]);var r=hr(n),i=r===((t=n.ownerDocument)==null?void 0:t.body),o=Z(r),a=i?[o].concat(o.visualViewport||[],$t(r)?r:[]):r,l=e.concat(a);return i?l:l.concat(vt(ut(a)))}function rn(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function Cs(n,e){var t=Oe(n,!1,e==="fixed");return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function jo(n,e,t){return e===fr?rn(Vr(n,t)):Me(e)?Cs(e,t):rn(zr(Ae(n)))}function Ds(n){var e=vt(ut(n)),t=["absolute","fixed"].indexOf(we(n).position)>=0,r=t&&fe(n)?Le(n):n;return Me(r)?e.filter(function(i){return Me(i)&&vn(i,r)&&me(i)!=="body"}):[]}function Jr(n,e,t,r){var i=e==="clippingParents"?Ds(n):[].concat(e),o=[].concat(i,[t]),a=o[0],l=o.reduce(function(c,d){var m=jo(n,d,r);return c.top=qe(m.top,c.top),c.right=Bt(m.right,c.right),c.bottom=Bt(m.bottom,c.bottom),c.left=qe(m.left,c.left),c},jo(n,a,r));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l}function Tn(n){var e=n.reference,t=n.element,r=n.placement,i=r?ge(r):null,o=r?Be(r):null,a=e.x+e.width/2-t.width/2,l=e.y+e.height/2-t.height/2,c;switch(i){case ie:c={x:a,y:e.y-t.height};break;case ue:c={x:a,y:e.y+e.height};break;case ce:c={x:e.x+e.width,y:l};break;case ae:c={x:e.x-t.width,y:l};break;default:c={x:e.x,y:e.y}}var d=i?Ft(i):null;if(d!=null){var m=d==="y"?"height":"width";switch(o){case lt:c[d]=c[d]-(e[m]/2-t[m]/2);break;case Ot:c[d]=c[d]+(e[m]/2-t[m]/2);break;default:}}return c}function He(n,e){e===void 0&&(e={});var t=e,r=t.placement,i=r===void 0?n.placement:r,o=t.strategy,a=o===void 0?n.strategy:o,l=t.boundary,c=l===void 0?po:l,d=t.rootBoundary,m=d===void 0?fr:d,_=t.elementContext,w=_===void 0?Zt:_,b=t.altBoundary,S=b===void 0?!1:b,k=t.padding,E=k===void 0?0:k,O=bn(typeof E!="number"?E:En(E,jt)),$=w===Zt?uo:Zt,K=n.rects.popper,D=n.elements[S?$:w],H=Jr(Me(D)?D:D.contextElement||Ae(n.elements.popper),c,m,a),F=Oe(n.elements.reference),J=Tn({reference:F,element:K,strategy:"absolute",placement:i}),te=rn(Object.assign({},K,J)),ne=w===Zt?te:F,Q={top:H.top-ne.top+O.top,bottom:ne.bottom-H.bottom+O.bottom,left:H.left-ne.left+O.left,right:ne.right-H.right+O.right},h=n.modifiersData.offset;if(w===Zt&&h){var C=h[i];Object.keys(Q).forEach(function(f){var Ie=[ce,ue].indexOf(f)>=0?1:-1,Ee=[ie,ue].indexOf(f)>=0?"y":"x";Q[f]+=C[Ee]*Ie})}return Q}function Qr(n,e){e===void 0&&(e={});var t=e,r=t.placement,i=t.boundary,o=t.rootBoundary,a=t.padding,l=t.flipVariations,c=t.allowedAutoPlacements,d=c===void 0?dr:c,m=Be(r),_=m?l?Gr:Gr.filter(function(S){return Be(S)===m}):jt,w=_.filter(function(S){return d.indexOf(S)>=0});w.length===0&&(w=_);var b=w.reduce(function(S,k){return S[k]=He(n,{placement:k,boundary:i,rootBoundary:o,padding:a})[ge(k)],S},{});return Object.keys(b).sort(function(S,k){return b[S]-b[k]})}function Ps(n){if(ge(n)===ur)return[];var e=nn(n);return[gr(n),e,gr(e)]}function Ns(n){var e=n.state,t=n.options,r=n.name;if(!e.modifiersData[r]._skip){for(var i=t.mainAxis,o=i===void 0?!0:i,a=t.altAxis,l=a===void 0?!0:a,c=t.fallbackPlacements,d=t.padding,m=t.boundary,_=t.rootBoundary,w=t.altBoundary,b=t.flipVariations,S=b===void 0?!0:b,k=t.allowedAutoPlacements,E=e.options.placement,O=ge(E),$=O===E,K=c||($||!S?[nn(E)]:Ps(E)),D=[E].concat(K).reduce(function(B,N){return B.concat(ge(N)===ur?Qr(e,{placement:N,boundary:m,rootBoundary:_,padding:d,flipVariations:S,allowedAutoPlacements:k}):N)},[]),H=e.rects.reference,F=e.rects.popper,J=new Map,te=!0,ne=D[0],Q=0;Q=0,Ee=Ie?"width":"height",_e=He(e,{placement:h,boundary:m,rootBoundary:_,altBoundary:w,padding:d}),xe=Ie?f?ce:ae:f?ue:ie;H[Ee]>F[Ee]&&(xe=nn(xe));var Ye=nn(xe),ke=[];if(o&&ke.push(_e[C]<=0),l&&ke.push(_e[xe]<=0,_e[Ye]<=0),ke.every(function(B){return B})){ne=h,te=!1;break}J.set(h,ke)}if(te)for(var Rt=S?3:1,Ue=function(N){var q=D.find(function(ee){var et=J.get(ee);if(et)return et.slice(0,N).every(function(W){return W})});if(q)return ne=q,"break"},Ze=Rt;Ze>0;Ze--){var ye=Ue(Ze);if(ye==="break")break}e.placement!==ne&&(e.modifiersData[r]._skip=!0,e.placement=ne,e.reset=!0)}}var vo={name:"flip",enabled:!0,phase:"main",fn:Ns,requiresIfExists:["offset"],data:{_skip:!1}};function wo(n,e,t){return t===void 0&&(t={x:0,y:0}),{top:n.top-e.height-t.y,right:n.right-e.width+t.x,bottom:n.bottom-e.height+t.y,left:n.left-e.width-t.x}}function bo(n){return[ie,ce,ue,ae].some(function(e){return n[e]>=0})}function Ms(n){var e=n.state,t=n.name,r=e.rects.reference,i=e.rects.popper,o=e.modifiersData.preventOverflow,a=He(e,{elementContext:"reference"}),l=He(e,{altBoundary:!0}),c=wo(a,r),d=wo(l,i,o),m=bo(c),_=bo(d);e.modifiersData[t]={referenceClippingOffsets:c,popperEscapeOffsets:d,isReferenceHidden:m,hasPopperEscaped:_},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":m,"data-popper-escaped":_})}var Eo={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Ms};function Os(n,e,t){var r=ge(n),i=[ae,ie].indexOf(r)>=0?-1:1,o=typeof t=="function"?t(Object.assign({},e,{placement:n})):t,a=o[0],l=o[1];return a=a||0,l=(l||0)*i,[ae,ce].indexOf(r)>=0?{x:l,y:a}:{x:a,y:l}}function Bs(n){var e=n.state,t=n.options,r=n.name,i=t.offset,o=i===void 0?[0,0]:i,a=dr.reduce(function(m,_){return m[_]=Os(_,e.rects,o),m},{}),l=a[e.placement],c=l.x,d=l.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=c,e.modifiersData.popperOffsets.y+=d),e.modifiersData[r]=a}var To={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Bs};function Is(n){var e=n.state,t=n.name;e.modifiersData[t]=Tn({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var ko={name:"popperOffsets",enabled:!0,phase:"read",fn:Is,data:{}};function Xr(n){return n==="x"?"y":"x"}function Fs(n){var e=n.state,t=n.options,r=n.name,i=t.mainAxis,o=i===void 0?!0:i,a=t.altAxis,l=a===void 0?!1:a,c=t.boundary,d=t.rootBoundary,m=t.altBoundary,_=t.padding,w=t.tether,b=w===void 0?!0:w,S=t.tetherOffset,k=S===void 0?0:S,E=He(e,{boundary:c,rootBoundary:d,padding:_,altBoundary:m}),O=ge(e.placement),$=Be(e.placement),K=!$,D=Ft(O),H=Xr(D),F=e.modifiersData.popperOffsets,J=e.rects.reference,te=e.rects.popper,ne=typeof k=="function"?k(Object.assign({},e.rects,{placement:e.placement})):k,Q=typeof ne=="number"?{mainAxis:ne,altAxis:ne}:Object.assign({mainAxis:0,altAxis:0},ne),h=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,C={x:0,y:0};if(!!F){if(o){var f,Ie=D==="y"?ie:ae,Ee=D==="y"?ue:ce,_e=D==="y"?"height":"width",xe=F[D],Ye=xe+E[Ie],ke=xe-E[Ee],Rt=b?-te[_e]/2:0,Ue=$===lt?J[_e]:te[_e],Ze=$===lt?-te[_e]:-J[_e],ye=e.elements.arrow,B=b&&ye?It(ye):{width:0,height:0},N=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:wn(),q=N[Ie],ee=N[Ee],et=qt(0,J[_e],B[_e]),W=K?J[_e]/2-Rt-et-q-Q.mainAxis:Ue-et-q-Q.mainAxis,je=K?-J[_e]/2+Rt+et+ee+Q.mainAxis:Ze+et+ee+Q.mainAxis,Tt=e.elements.arrow&&Le(e.elements.arrow),Nn=Tt?D==="y"?Tt.clientTop||0:Tt.clientLeft||0:0,tt=(f=h==null?void 0:h[D])!=null?f:0,nt=xe+W-tt-Nn,gt=xe+je-tt,kt=qt(b?Bt(Ye,nt):Ye,xe,b?qe(ke,gt):ke);F[D]=kt,C[D]=kt-xe}if(l){var Mn,On=D==="x"?ie:ae,Bn=D==="x"?ue:ce,rt=F[H],Yt=H==="y"?"height":"width",In=rt+E[On],Fn=rt-E[Bn],cn=[ie,ae].indexOf(O)!==-1,St=(Mn=h==null?void 0:h[H])!=null?Mn:0,qn=cn?In:rt-J[Yt]-te[Yt]-St+Q.altAxis,Ge=cn?rt+J[Yt]+te[Yt]-St-Q.altAxis:Fn,se=b&&cn?ho(qn,rt,Ge):qt(b?qn:In,rt,b?Ge:Fn);F[H]=se,C[H]=se-rt}e.modifiersData[r]=C}}var So={name:"preventOverflow",enabled:!0,phase:"main",fn:Fs,requiresIfExists:["offset"]};function Zr(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function ei(n){return n===Z(n)||!fe(n)?Lt(n):Zr(n)}function qs(n){var e=n.getBoundingClientRect(),t=pt(e.width)/n.offsetWidth||1,r=pt(e.height)/n.offsetHeight||1;return t!==1||r!==1}function ti(n,e,t){t===void 0&&(t=!1);var r=fe(e),i=fe(e)&&qs(e),o=Ae(e),a=Oe(n,i,t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(r||!r&&!t)&&((me(e)!=="body"||$t(o))&&(l=ei(e)),fe(e)?(c=Oe(e,!0),c.x+=e.clientLeft,c.y+=e.clientTop):o&&(c.x=Ht(o))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function Ls(n){var e=new Map,t=new Set,r=[];n.forEach(function(o){e.set(o.name,o)});function i(o){t.add(o.name);var a=[].concat(o.requires||[],o.requiresIfExists||[]);a.forEach(function(l){if(!t.has(l)){var c=e.get(l);c&&i(c)}}),r.push(o)}return n.forEach(function(o){t.has(o.name)||i(o)}),r}function ni(n){var e=Ls(n);return fo.reduce(function(t,r){return t.concat(e.filter(function(i){return i.phase===r}))},[])}function ri(n){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(n())})})),e}}function ii(n){var e=n.reduce(function(t,r){var i=t[r.name];return t[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,t},{});return Object.keys(e).map(function(t){return e[t]})}var Co={placement:"bottom",modifiers:[],strategy:"absolute"};function Do(){for(var n=arguments.length,e=new Array(n),t=0;t(n%e+e)%e,Mo=class{constructor(e,t,r){this.owner=e,this.containerEl=t,t.on("click",".suggestion-item",this.onSuggestionClick.bind(this)),t.on("mousemove",".suggestion-item",this.onSuggestionMouseover.bind(this)),r.register([],"ArrowUp",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem-1,!0),!1}),r.register([],"ArrowDown",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem+1,!0),!1}),r.register([],"Enter",i=>{if(!i.isComposing)return this.useSelectedItem(i),!1})}onSuggestionClick(e,t){e.preventDefault();let r=this.suggestions.indexOf(t);this.setSelectedItem(r,!1),this.useSelectedItem(e)}onSuggestionMouseover(e,t){let r=this.suggestions.indexOf(t);this.setSelectedItem(r,!1)}setSuggestions(e){this.containerEl.empty();let t=[];e.forEach(r=>{let i=this.containerEl.createDiv("suggestion-item");this.owner.renderSuggestion(r,i),t.push(i)}),this.values=e,this.suggestions=t,this.setSelectedItem(0,!1)}useSelectedItem(e){let t=this.values[this.selectedItem];t&&this.owner.selectSuggestion(t,e)}setSelectedItem(e,t){let r=$s(e,this.suggestions.length),i=this.suggestions[this.selectedItem],o=this.suggestions[r];i?.removeClass("is-selected"),o?.addClass("is-selected"),this.selectedItem=r,t&&o.scrollIntoView(!1)}},kn=class{constructor(e,t){this.app=e,this.inputEl=t,this.scope=new No.Scope,this.suggestEl=createDiv("suggestion-container");let r=this.suggestEl.createDiv("suggestion");this.suggest=new Mo(this,r,this.scope),this.scope.register([],"Escape",this.close.bind(this)),this.inputEl.addEventListener("input",this.onInputChanged.bind(this)),this.inputEl.addEventListener("focus",this.onInputChanged.bind(this)),this.inputEl.addEventListener("blur",this.close.bind(this)),this.suggestEl.on("mousedown",".suggestion-container",i=>{i.preventDefault()})}onInputChanged(){let e=this.inputEl.value,t=this.getSuggestions(e);if(!t){this.close();return}t.length>0?(this.suggest.setSuggestions(t),this.open(this.app.dom.appContainerEl,this.inputEl)):this.close()}open(e,t){this.app.keymap.pushScope(this.scope),e.appendChild(this.suggestEl),this.popper=oi(t,this.suggestEl,{placement:"bottom-start",modifiers:[{name:"sameWidth",enabled:!0,fn:({state:r,instance:i})=>{let o=`${r.rects.reference.width}px`;r.styles.popper.width!==o&&(r.styles.popper.width=o,i.update())},phase:"beforeWrite",requires:["computeStyles"]}]})}close(){this.app.keymap.popScope(this.scope),this.suggest.setSuggestions([]),this.popper&&this.popper.destroy(),this.suggestEl.detach()}};var $e;(function(t){t[t.TemplateFiles=0]="TemplateFiles",t[t.ScriptFiles=1]="ScriptFiles"})($e||($e={}));var on=class extends kn{constructor(e,t,r){super(t.app,e);this.inputEl=e;this.plugin=t;this.mode=r}get_folder(e){switch(e){case 0:return this.plugin.settings.templates_folder;case 1:return this.plugin.settings.user_scripts_folder}}get_error_msg(e){switch(e){case 0:return"Templates folder doesn't exist";case 1:return"User Scripts folder doesn't exist"}}getSuggestions(e){let t=Ce(()=>Je(this.plugin.app,this.get_folder(this.mode)),this.get_error_msg(this.mode));if(!t)return[];let r=[],i=e.toLowerCase();return t.forEach(o=>{o instanceof Oo.TFile&&o.extension==="md"&&o.path.toLowerCase().contains(i)&&r.push(o)}),r.slice(0,1e3)}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var Bo=X(require("obsidian"));var Sn=class extends kn{constructor(e,t){super(e,t)}getSuggestions(e){let t=this.app.vault.getAllLoadedFiles(),r=[],i=e.toLowerCase();return t.forEach(o=>{o instanceof Bo.TFolder&&o.path.toLowerCase().contains(i)&&r.push(o)}),r.slice(0,1e3)}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var ft;(function(o){o[o.Off=0]="Off",o[o.RenderDescriptionParameterReturn=1]="RenderDescriptionParameterReturn",o[o.RenderDescriptionParameterList=2]="RenderDescriptionParameterList",o[o.RenderDescriptionReturn=3]="RenderDescriptionReturn",o[o.RenderDescriptionOnly=4]="RenderDescriptionOnly"})(ft||(ft={}));function Io(n){return isBoolean(n)?n:[1,3].includes(n)}function Fo(n){return isBoolean(n)?n:[1,2].includes(n)}function qo(n){return isBoolean(n)?n:n!=0}var Lo={command_timeout:5,templates_folder:"",templates_pairs:[["",""]],trigger_on_file_creation:!1,auto_jump_to_cursor:!1,enable_system_commands:!1,shell_path:"",user_scripts_folder:"",enable_folder_templates:!0,folder_templates:[{folder:"",template:""}],enable_file_templates:!1,file_templates:[{regex:".*",template:""}],syntax_highlighting:!0,syntax_highlighting_mobile:!1,enabled_templates_hotkeys:[""],startup_templates:[""],intellisense_render:ft.RenderDescriptionParameterReturn},ai=class extends L.PluginSettingTab{constructor(e){super(e.app,e);this.plugin=e}display(){this.containerEl.empty(),this.add_template_folder_setting(),this.add_internal_functions_setting(),this.add_syntax_highlighting_settings(),this.add_auto_jump_to_cursor(),this.add_trigger_on_new_file_creation_setting(),this.plugin.settings.trigger_on_file_creation&&(this.add_folder_templates_setting(),this.add_file_templates_setting()),this.add_templates_hotkeys_setting(),this.add_startup_templates_setting(),this.add_user_script_functions_setting(),this.add_user_system_command_functions_setting(),this.add_donating_setting()}add_template_folder_setting(){new L.Setting(this.containerEl).setName("Template folder location").setDesc("Files in this folder will be available as templates.").addSearch(e=>{new Sn(this.app,e.inputEl),e.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.templates_folder).onChange(t=>{t=t.trim(),t=t.replace(/\/$/,""),this.plugin.settings.templates_folder=t,this.plugin.save_settings()}),e.containerEl.addClass("templater_search")})}add_internal_functions_setting(){let e=document.createDocumentFragment();e.append("Templater provides multiples predefined variables / functions that you can use.",e.createEl("br"),"Check the ",e.createEl("a",{href:"https://silentvoid13.github.io/Templater/",text:"documentation"})," to get a list of all the available internal variables / functions."),new L.Setting(this.containerEl).setName("Internal variables and functions").setDesc(e)}add_syntax_highlighting_settings(){let e=document.createDocumentFragment();e.append("Adds syntax highlighting for Templater commands in edit mode.");let t=document.createDocumentFragment();t.append("Adds syntax highlighting for Templater commands in edit mode on mobile. Use with caution: this may break live preview on mobile platforms."),new L.Setting(this.containerEl).setName("Syntax highlighting on desktop").setDesc(e).addToggle(r=>{r.setValue(this.plugin.settings.syntax_highlighting).onChange(i=>{this.plugin.settings.syntax_highlighting=i,this.plugin.save_settings(),this.plugin.event_handler.update_syntax_highlighting()})}),new L.Setting(this.containerEl).setName("Syntax highlighting on mobile").setDesc(t).addToggle(r=>{r.setValue(this.plugin.settings.syntax_highlighting_mobile).onChange(i=>{this.plugin.settings.syntax_highlighting_mobile=i,this.plugin.save_settings(),this.plugin.event_handler.update_syntax_highlighting()})})}add_auto_jump_to_cursor(){let e=document.createDocumentFragment();e.append("Automatically triggers ",e.createEl("code",{text:"tp.file.cursor"})," after inserting a template.",e.createEl("br"),"You can also set a hotkey to manually trigger ",e.createEl("code",{text:"tp.file.cursor"}),"."),new L.Setting(this.containerEl).setName("Automatic jump to cursor").setDesc(e).addToggle(t=>{t.setValue(this.plugin.settings.auto_jump_to_cursor).onChange(r=>{this.plugin.settings.auto_jump_to_cursor=r,this.plugin.save_settings()})})}add_trigger_on_new_file_creation_setting(){let e=document.createDocumentFragment();e.append("Templater will listen for the new file creation event, and, if it matches a rule you've set, replace every command it finds in the new file's content. ","This makes Templater compatible with other plugins like the Daily note core plugin, Calendar plugin, Review plugin, Note refactor plugin, etc. ",e.createEl("br"),e.createEl("br"),"Make sure to set up rules under either folder templates or file regex template below.",e.createEl("br"),e.createEl("br"),e.createEl("b",{text:"Warning: "}),"This can be dangerous if you create new files with unknown / unsafe content on creation. Make sure that every new file's content is safe on creation."),new L.Setting(this.containerEl).setName("Trigger Templater on new file creation").setDesc(e).addToggle(t=>{t.setValue(this.plugin.settings.trigger_on_file_creation).onChange(r=>{this.plugin.settings.trigger_on_file_creation=r,this.plugin.save_settings(),this.plugin.event_handler.update_trigger_file_on_creation(),this.display()})})}add_templates_hotkeys_setting(){new L.Setting(this.containerEl).setName("Template hotkeys").setHeading();let e=document.createDocumentFragment();e.append("Template hotkeys allows you to bind a template to a hotkey."),new L.Setting(this.containerEl).setDesc(e),this.plugin.settings.enabled_templates_hotkeys.forEach((t,r)=>{new L.Setting(this.containerEl).addSearch(o=>{new on(o.inputEl,this.plugin,$e.TemplateFiles),o.setPlaceholder("Example: folder1/template_file").setValue(t).onChange(a=>{if(a&&this.plugin.settings.enabled_templates_hotkeys.contains(a)){oe(new P("This template is already bound to a hotkey"));return}this.plugin.command_handler.add_template_hotkey(this.plugin.settings.enabled_templates_hotkeys[r],a),this.plugin.settings.enabled_templates_hotkeys[r]=a,this.plugin.save_settings()}),o.containerEl.addClass("templater_search")}).addExtraButton(o=>{o.setIcon("any-key").setTooltip("Configure Hotkey").onClick(()=>{this.app.setting.openTabById("hotkeys");let a=this.app.setting.activeTab;a.searchComponent.inputEl.value=t,a.updateHotkeyVisibility()})}).addExtraButton(o=>{o.setIcon("up-chevron-glyph").setTooltip("Move up").onClick(()=>{Mt(this.plugin.settings.enabled_templates_hotkeys,r,r-1),this.plugin.save_settings(),this.display()})}).addExtraButton(o=>{o.setIcon("down-chevron-glyph").setTooltip("Move down").onClick(()=>{Mt(this.plugin.settings.enabled_templates_hotkeys,r,r+1),this.plugin.save_settings(),this.display()})}).addExtraButton(o=>{o.setIcon("cross").setTooltip("Delete").onClick(()=>{this.plugin.command_handler.remove_template_hotkey(this.plugin.settings.enabled_templates_hotkeys[r]),this.plugin.settings.enabled_templates_hotkeys.splice(r,1),this.plugin.save_settings(),this.display()})}).infoEl.remove()}),new L.Setting(this.containerEl).addButton(t=>{t.setButtonText("Add new hotkey for template").setCta().onClick(()=>{this.plugin.settings.enabled_templates_hotkeys.push(""),this.plugin.save_settings(),this.display()})})}add_folder_templates_setting(){new L.Setting(this.containerEl).setName("Folder templates").setHeading();let e=document.createDocumentFragment();e.append("Folder templates are triggered when a new ",e.createEl("strong",{text:"empty "}),"file is created in a given folder.",e.createEl("br"),"Templater will fill the empty file with the specified template.",e.createEl("br"),"The deepest match is used. A global default template would be defined on the root ",e.createEl("code",{text:"/"}),"."),new L.Setting(this.containerEl).setDesc(e);let t=document.createDocumentFragment();t.append("When enabled, Templater will make use of the folder templates defined below. This option is mutually exclusive with file regex templates below, so enabling one will disable the other."),new L.Setting(this.containerEl).setName("Enable folder templates").setDesc(t).addToggle(r=>{r.setValue(this.plugin.settings.enable_folder_templates).onChange(i=>{this.plugin.settings.enable_folder_templates=i,i&&(this.plugin.settings.enable_file_templates=!1),this.plugin.save_settings(),this.display()})}),!!this.plugin.settings.enable_folder_templates&&(this.plugin.settings.folder_templates.forEach((r,i)=>{new L.Setting(this.containerEl).addSearch(a=>{new Sn(this.app,a.inputEl),a.setPlaceholder("Folder").setValue(r.folder).onChange(l=>{if(l&&this.plugin.settings.folder_templates.some(c=>c.folder==l)){oe(new P("This folder already has a template associated with it"));return}this.plugin.settings.folder_templates[i].folder=l,this.plugin.save_settings()}),a.containerEl.addClass("templater_search")}).addSearch(a=>{new on(a.inputEl,this.plugin,$e.TemplateFiles),a.setPlaceholder("Template").setValue(r.template).onChange(l=>{this.plugin.settings.folder_templates[i].template=l,this.plugin.save_settings()}),a.containerEl.addClass("templater_search")}).addExtraButton(a=>{a.setIcon("up-chevron-glyph").setTooltip("Move up").onClick(()=>{Mt(this.plugin.settings.folder_templates,i,i-1),this.plugin.save_settings(),this.display()})}).addExtraButton(a=>{a.setIcon("down-chevron-glyph").setTooltip("Move down").onClick(()=>{Mt(this.plugin.settings.folder_templates,i,i+1),this.plugin.save_settings(),this.display()})}).addExtraButton(a=>{a.setIcon("cross").setTooltip("Delete").onClick(()=>{this.plugin.settings.folder_templates.splice(i,1),this.plugin.save_settings(),this.display()})}).infoEl.remove()}),new L.Setting(this.containerEl).addButton(r=>{r.setButtonText("Add new folder template").setTooltip("Add additional folder template").setCta().onClick(()=>{this.plugin.settings.folder_templates.push({folder:"",template:""}),this.plugin.save_settings(),this.display()})}))}add_file_templates_setting(){new L.Setting(this.containerEl).setName("File regex templates").setHeading();let e=document.createDocumentFragment();e.append("File regex templates are triggered when a new ",e.createEl("strong",{text:"empty"})," file is created that matches one of them. Templater will fill the empty file with the specified template.",e.createEl("br"),"The first match from the top is used, so the order of the rules is important.",e.createEl("br"),"Use ",e.createEl("code",{text:".*"})," as a final catch-all, if you need it."),new L.Setting(this.containerEl).setDesc(e);let t=document.createDocumentFragment();t.append("When enabled, Templater will make use of the file regex templates defined below. This option is mutually exclusive with folder templates above, so enabling one will disable the other."),new L.Setting(this.containerEl).setName("Enable file regex templates").setDesc(t).addToggle(r=>{r.setValue(this.plugin.settings.enable_file_templates).onChange(i=>{this.plugin.settings.enable_file_templates=i,i&&(this.plugin.settings.enable_folder_templates=!1),this.plugin.save_settings(),this.display()})}),!!this.plugin.settings.enable_file_templates&&(this.plugin.settings.file_templates.forEach((r,i)=>{new L.Setting(this.containerEl).addText(a=>{a.setPlaceholder("File regex").setValue(r.regex).onChange(l=>{this.plugin.settings.file_templates[i].regex=l,this.plugin.save_settings()}),a.inputEl.addClass("templater_search")}).addSearch(a=>{new on(a.inputEl,this.plugin,$e.TemplateFiles),a.setPlaceholder("Template").setValue(r.template).onChange(l=>{this.plugin.settings.file_templates[i].template=l,this.plugin.save_settings()}),a.containerEl.addClass("templater_search")}).addExtraButton(a=>{a.setIcon("up-chevron-glyph").setTooltip("Move up").onClick(()=>{Mt(this.plugin.settings.file_templates,i,i-1),this.plugin.save_settings(),this.display()})}).addExtraButton(a=>{a.setIcon("down-chevron-glyph").setTooltip("Move down").onClick(()=>{Mt(this.plugin.settings.file_templates,i,i+1),this.plugin.save_settings(),this.display()})}).addExtraButton(a=>{a.setIcon("cross").setTooltip("Delete").onClick(()=>{this.plugin.settings.file_templates.splice(i,1),this.plugin.save_settings(),this.display()})}).infoEl.remove()}),new L.Setting(this.containerEl).addButton(r=>{r.setButtonText("Add new file regex").setTooltip("Add additional file regex").setCta().onClick(()=>{this.plugin.settings.file_templates.push({regex:"",template:""}),this.plugin.save_settings(),this.display()})}))}add_startup_templates_setting(){new L.Setting(this.containerEl).setName("Startup templates").setHeading();let e=document.createDocumentFragment();e.append("Startup templates are templates that will get executed once when Templater starts.",e.createEl("br"),"These templates won't output anything.",e.createEl("br"),"This can be useful to set up templates adding hooks to Obsidian events for example."),new L.Setting(this.containerEl).setDesc(e),this.plugin.settings.startup_templates.forEach((t,r)=>{new L.Setting(this.containerEl).addSearch(o=>{new on(o.inputEl,this.plugin,$e.TemplateFiles),o.setPlaceholder("Example: folder1/template_file").setValue(t).onChange(a=>{if(a&&this.plugin.settings.startup_templates.contains(a)){oe(new P("This startup template already exist"));return}this.plugin.settings.startup_templates[r]=a,this.plugin.save_settings()}),o.containerEl.addClass("templater_search")}).addExtraButton(o=>{o.setIcon("cross").setTooltip("Delete").onClick(()=>{this.plugin.settings.startup_templates.splice(r,1),this.plugin.save_settings(),this.display()})}).infoEl.remove()}),new L.Setting(this.containerEl).addButton(t=>{t.setButtonText("Add new startup template").setCta().onClick(()=>{this.plugin.settings.startup_templates.push(""),this.plugin.save_settings(),this.display()})})}add_user_script_functions_setting(){new L.Setting(this.containerEl).setName("User script functions").setHeading();let e=document.createDocumentFragment();e.append("All JavaScript files in this folder will be loaded as CommonJS modules, to import custom user functions.",e.createEl("br"),"The folder needs to be accessible from the vault.",e.createEl("br"),"Check the ",e.createEl("a",{href:"https://silentvoid13.github.io/Templater/",text:"documentation"})," for more information."),new L.Setting(this.containerEl).setName("Script files folder location").setDesc(e).addSearch(r=>{new Sn(this.app,r.inputEl),r.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.user_scripts_folder).onChange(i=>{this.plugin.settings.user_scripts_folder=i,this.plugin.save_settings()}),r.containerEl.addClass("templater_search")}),new L.Setting(this.containerEl).setName("User script intellisense").setDesc("Determine how you'd like to have user script intellisense render. Note values will not render if not in the script.").addDropdown(r=>{r.addOption("0","Turn off intellisense").addOption("1","Render method description, parameters list, and return").addOption("2","Render method description and parameters list").addOption("3","Render method description and return").addOption("4","Render method description").setValue(this.plugin.settings.intellisense_render.toString()).onChange(i=>{this.plugin.settings.intellisense_render=parseInt(i),this.plugin.save_settings()})}),e=document.createDocumentFragment();let t;if(!this.plugin.settings.user_scripts_folder)t="No user scripts folder set";else{let r=Ce(()=>Je(this.app,this.plugin.settings.user_scripts_folder),"User scripts folder doesn't exist");if(!r||r.length===0)t="No user scripts detected";else{let i=0;for(let o of r)o.extension==="js"&&(i++,e.append(e.createEl("li",{text:`tp.user.${o.basename}`})));t=`Detected ${i} User Script(s)`}}new L.Setting(this.containerEl).setName(t).setDesc(e).addExtraButton(r=>{r.setIcon("sync").setTooltip("Refresh").onClick(()=>{this.display()})})}add_user_system_command_functions_setting(){let e=document.createDocumentFragment();if(e.append("Allows you to create user functions linked to system commands.",e.createEl("br"),e.createEl("b",{text:"Warning: "}),"It can be dangerous to execute arbitrary system commands from untrusted sources. Only run system commands that you understand, from trusted sources."),new L.Setting(this.containerEl).setName("User system command functions").setHeading(),new L.Setting(this.containerEl).setName("Enable user system command functions").setDesc(e).addToggle(t=>{t.setValue(this.plugin.settings.enable_system_commands).onChange(r=>{this.plugin.settings.enable_system_commands=r,this.plugin.save_settings(),this.display()})}),this.plugin.settings.enable_system_commands){new L.Setting(this.containerEl).setName("Timeout").setDesc("Maximum timeout in seconds for a system command.").addText(o=>{o.setPlaceholder("Timeout").setValue(this.plugin.settings.command_timeout.toString()).onChange(a=>{let l=Number(a);if(isNaN(l)){oe(new P("Timeout must be a number"));return}this.plugin.settings.command_timeout=l,this.plugin.save_settings()})}),e=document.createDocumentFragment(),e.append("Full path to the shell binary to execute the command with.",e.createEl("br"),"This setting is optional and will default to the system's default shell if not specified.",e.createEl("br"),"You can use forward slashes ('/') as path separators on all platforms if in doubt."),new L.Setting(this.containerEl).setName("Shell binary location").setDesc(e).addText(o=>{o.setPlaceholder("Example: /bin/bash, ...").setValue(this.plugin.settings.shell_path).onChange(a=>{this.plugin.settings.shell_path=a,this.plugin.save_settings()})});let t=1;this.plugin.settings.templates_pairs.forEach(o=>{let a=this.containerEl.createEl("div");a.addClass("templater_div");let l=this.containerEl.createEl("h4",{text:"User function n\xB0"+t});l.addClass("templater_title"),new L.Setting(this.containerEl).addExtraButton(d=>{d.setIcon("cross").setTooltip("Delete").onClick(()=>{let m=this.plugin.settings.templates_pairs.indexOf(o);m>-1&&(this.plugin.settings.templates_pairs.splice(m,1),this.plugin.save_settings(),this.display())})}).addText(d=>{let m=d.setPlaceholder("Function name").setValue(o[0]).onChange(_=>{let w=this.plugin.settings.templates_pairs.indexOf(o);w>-1&&(this.plugin.settings.templates_pairs[w][0]=_,this.plugin.save_settings())});return m.inputEl.addClass("templater_template"),m}).addTextArea(d=>{let m=d.setPlaceholder("System command").setValue(o[1]).onChange(_=>{let w=this.plugin.settings.templates_pairs.indexOf(o);w>-1&&(this.plugin.settings.templates_pairs[w][1]=_,this.plugin.save_settings())});return m.inputEl.setAttr("rows",2),m.inputEl.addClass("templater_cmd"),m}).infoEl.remove(),a.appendChild(l),a.appendChild(this.containerEl.lastChild),t+=1});let r=this.containerEl.createEl("div");r.addClass("templater_div2"),new L.Setting(this.containerEl).addButton(o=>{o.setButtonText("Add new user function").setCta().onClick(()=>{this.plugin.settings.templates_pairs.push(["",""]),this.plugin.save_settings(),this.display()})}).infoEl.remove(),r.appendChild(this.containerEl.lastChild)}}add_donating_setting(){let e=new L.Setting(this.containerEl).setName("Donate").setDesc("If you like this Plugin, consider donating to support continued development."),t=document.createElement("a");t.setAttribute("href","https://github.com/sponsors/silentvoid13"),t.addClass("templater_donating");let r=document.createElement("img");r.src="https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86",t.appendChild(r);let i=document.createElement("a");i.setAttribute("href","https://www.paypal.com/donate?hosted_button_id=U2SRGAFYXT32Q"),i.addClass("templater_donating");let o=document.createElement("img");o.src="https://img.shields.io/badge/paypal-silentvoid13-yellow?style=social&logo=paypal",i.appendChild(o),e.settingEl.appendChild(t),e.settingEl.appendChild(i)}};var Ar=X(require("obsidian"));var an;(function(t){t[t.InsertTemplate=0]="InsertTemplate",t[t.CreateNoteTemplate=1]="CreateNoteTemplate"})(an||(an={}));var si=class extends Ar.FuzzySuggestModal{constructor(e){super(e.app);this.plugin=e,this.setPlaceholder("Type name of a template...")}getItems(){if(!this.plugin.settings.templates_folder)return this.app.vault.getMarkdownFiles();let e=Ce(()=>Je(this.plugin.app,this.plugin.settings.templates_folder),`Couldn't retrieve template files from templates folder ${this.plugin.settings.templates_folder}`);return e||[]}getItemText(e){let t=e.path;if(e.path.startsWith(this.plugin.settings.templates_folder)&&(0,Ar.normalizePath)(this.plugin.settings.templates_folder)!="/"){let r=this.plugin.settings.templates_folder.length,i=this.plugin.settings.templates_folder.endsWith("/")?r:r+1;t=e.path.slice(i)}return t.split(".").slice(0,-1).join(".")}onChooseItem(e){switch(this.open_mode){case 0:this.plugin.templater.append_template_to_active_file(e);break;case 1:this.plugin.templater.create_new_note_from_template(e,this.creation_folder);break}}start(){try{this.open()}catch(e){oe(e)}}insert_template(){this.open_mode=0,this.start()}create_new_note_from_template(e){this.creation_folder=e,this.open_mode=1,this.start()}};var Ho="Error_MobileUnsupportedTemplate",$o='';var de=X(require("obsidian"));var dt=X(require("obsidian"));var be=class{constructor(e){this.plugin=e;this.static_functions=new Map;this.dynamic_functions=new Map}getName(){return this.name}async init(){await this.create_static_templates(),this.static_object=Object.fromEntries(this.static_functions)}async generate_object(e){return this.config=e,await this.create_dynamic_templates(),{...this.static_object,...Object.fromEntries(this.dynamic_functions)}}};var ci=class extends be{constructor(){super(...arguments);this.name="date"}async create_static_templates(){this.static_functions.set("now",this.generate_now()),this.static_functions.set("tomorrow",this.generate_tomorrow()),this.static_functions.set("weekday",this.generate_weekday()),this.static_functions.set("yesterday",this.generate_yesterday())}async create_dynamic_templates(){}async teardown(){}generate_now(){return(e="YYYY-MM-DD",t,r,i)=>{if(r&&!(0,dt.moment)(r,i).isValid())throw new P("Invalid reference date format, try specifying one with the argument 'reference_format'");let o;return typeof t=="string"?o=dt.moment.duration(t):typeof t=="number"&&(o=dt.moment.duration(t,"days")),(0,dt.moment)(r,i).add(o).format(e)}}generate_tomorrow(){return(e="YYYY-MM-DD")=>(0,dt.moment)().add(1,"days").format(e)}generate_weekday(){return(e="YYYY-MM-DD",t,r,i)=>{if(r&&!(0,dt.moment)(r,i).isValid())throw new P("Invalid reference date format, try specifying one with the argument 'reference_format'");return(0,dt.moment)(r,i).weekday(t).format(e)}}generate_yesterday(){return(e="YYYY-MM-DD")=>(0,dt.moment)().add(-1,"days").format(e)}};var le=X(require("obsidian"));var Ko=10,li=class extends be{constructor(){super(...arguments);this.name="file";this.include_depth=0;this.create_new_depth=0;this.linkpath_regex=new RegExp("^\\[\\[(.*)\\]\\]$")}async create_static_templates(){this.static_functions.set("creation_date",this.generate_creation_date()),this.static_functions.set("create_new",this.generate_create_new()),this.static_functions.set("cursor",this.generate_cursor()),this.static_functions.set("cursor_append",this.generate_cursor_append()),this.static_functions.set("exists",this.generate_exists()),this.static_functions.set("find_tfile",this.generate_find_tfile()),this.static_functions.set("folder",this.generate_folder()),this.static_functions.set("include",this.generate_include()),this.static_functions.set("last_modified_date",this.generate_last_modified_date()),this.static_functions.set("move",this.generate_move()),this.static_functions.set("path",this.generate_path()),this.static_functions.set("rename",this.generate_rename()),this.static_functions.set("selection",this.generate_selection())}async create_dynamic_templates(){this.dynamic_functions.set("content",await this.generate_content()),this.dynamic_functions.set("tags",this.generate_tags()),this.dynamic_functions.set("title",this.generate_title())}async teardown(){}async generate_content(){return await this.plugin.app.vault.read(this.config.target_file)}generate_create_new(){return async(e,t,r=!1,i)=>{if(this.create_new_depth+=1,this.create_new_depth>Ko)throw this.create_new_depth=0,new P("Reached create_new depth limit (max = 10)");let o=await this.plugin.templater.create_new_note_from_template(e,i,t,r);return this.create_new_depth-=1,o}}generate_creation_date(){return(e="YYYY-MM-DD HH:mm")=>(0,le.moment)(this.config.target_file.stat.ctime).format(e)}generate_cursor(){return e=>`<% tp.file.cursor(${e??""}) %>`}generate_cursor_append(){return e=>{let t=this.plugin.app.workspace.activeEditor;if(!t||!t.editor){oe(new P("No active editor, can't append to cursor."));return}return t.editor.getDoc().replaceSelection(e),""}}generate_exists(){return async e=>{let t=(0,le.normalizePath)(e);return await this.plugin.app.vault.exists(t)}}generate_find_tfile(){return e=>{let t=(0,le.normalizePath)(e);return this.plugin.app.metadataCache.getFirstLinkpathDest(t,"")}}generate_folder(){return(e=!1)=>{let t=this.config.target_file.parent,r;return e?r=t.path:r=t.name,r}}generate_include(){return async e=>{if(this.include_depth+=1,this.include_depth>Ko)throw this.include_depth-=1,new P("Reached inclusion depth limit (max = 10)");let t;if(e instanceof le.TFile)t=await this.plugin.app.vault.read(e);else{let r;if((r=this.linkpath_regex.exec(e))===null)throw this.include_depth-=1,new P("Invalid file format, provide an obsidian link between quotes.");let{path:i,subpath:o}=(0,le.parseLinktext)(r[1]),a=this.plugin.app.metadataCache.getFirstLinkpathDest(i,"");if(!a)throw this.include_depth-=1,new P(`File ${e} doesn't exist`);if(t=await this.plugin.app.vault.read(a),o){let l=this.plugin.app.metadataCache.getFileCache(a);if(l){let c=(0,le.resolveSubpath)(l,o);c&&(t=t.slice(c.start.offset,c.end?.offset))}}}try{let r=await this.plugin.templater.parser.parse_commands(t,this.plugin.templater.current_functions_object);return this.include_depth-=1,r}catch(r){throw this.include_depth-=1,r}}}generate_last_modified_date(){return(e="YYYY-MM-DD HH:mm")=>(0,le.moment)(this.config.target_file.stat.mtime).format(e)}generate_move(){return async(e,t)=>{let r=t||this.config.target_file,i=(0,le.normalizePath)(`${e}.${r.extension}`),o=i.replace(/\\/g,"/").split("/");if(o.pop(),o.length){let a=o.join("/");this.plugin.app.vault.getAbstractFileByPath(a)||await this.plugin.app.vault.createFolder(a)}return await this.plugin.app.fileManager.renameFile(r,i),""}}generate_path(){return(e=!1)=>{let t="";if(le.Platform.isMobile){let r=this.plugin.app.vault.adapter.fs.uri,i=this.plugin.app.vault.adapter.basePath;t=`${r}/${i}`}else if(this.plugin.app.vault.adapter instanceof le.FileSystemAdapter)t=this.plugin.app.vault.adapter.getBasePath();else throw new P("app.vault is not a FileSystemAdapter instance");return e?this.config.target_file.path:`${t}/${this.config.target_file.path}`}}generate_rename(){return async e=>{if(e.match(/[\\/:]+/g))throw new P("File name cannot contain any of these characters: \\ / :");let t=(0,le.normalizePath)(`${this.config.target_file.parent.path}/${e}.${this.config.target_file.extension}`);return await this.plugin.app.fileManager.renameFile(this.config.target_file,t),""}}generate_selection(){return()=>{let e=this.plugin.app.workspace.activeEditor;if(!e||!e.editor)throw new P("Active editor is null, can't read selection.");return e.editor.getSelection()}}generate_tags(){let e=this.plugin.app.metadataCache.getFileCache(this.config.target_file);return e?(0,le.getAllTags)(e):null}generate_title(){return this.config.target_file.basename}};var Ro=X(require("obsidian"));var pi=class extends be{constructor(){super(...arguments);this.name="web"}async create_static_templates(){this.static_functions.set("daily_quote",this.generate_daily_quote()),this.static_functions.set("request",this.generate_request()),this.static_functions.set("random_picture",this.generate_random_picture())}async create_dynamic_templates(){}async teardown(){}async getRequest(e){try{let t=await(0,Ro.requestUrl)(e);if(t.status<200&&t.status>=300)throw new P("Error performing GET request");return t}catch{throw new P("Error performing GET request")}}generate_daily_quote(){return async()=>{try{let t=(await this.getRequest("https://raw.githubusercontent.com/Zachatoo/quotes-database/refs/heads/main/quotes.json")).json,r=t[Math.floor(Math.random()*t.length)],{quote:i,author:o}=r;return`> [!quote] ${i} -> \u2014 ${o}`}catch{return new P("Error generating daily quote"),"Error generating daily quote"}}}generate_random_picture(){return async(e,t,r=!1)=>{try{let i=await this.getRequest(`https://templater-unsplash-2.fly.dev/${t?"?q="+t:""}`).then(a=>a.json),o=i.full;if(e&&!r)if(e.includes("x")){let[a,l]=e.split("x");o=o.concat(`&w=${a}&h=${l}`)}else o=o.concat(`&w=${e}`);return r?`![photo by ${i.photog}(${i.photogUrl}) on Unsplash|${e}](${o})`:`![photo by ${i.photog}(${i.photogUrl}) on Unsplash](${o})`}catch{return new P("Error generating random picture"),"Error generating random picture"}}}generate_request(){return async(e,t)=>{try{let i=await(await this.getRequest(e)).json;return t&&i?t.split(".").reduce((o,a)=>{if(o&&o.hasOwnProperty(a))return o[a];throw new Error(`Path ${t} not found in the JSON response`)},i):i}catch(r){throw console.error(r),new P("Error fetching and extracting value")}}}};var ui=class extends be{constructor(){super(...arguments);this.name="hooks";this.event_refs=[]}async create_static_templates(){this.static_functions.set("on_all_templates_executed",this.generate_on_all_templates_executed())}async create_dynamic_templates(){}async teardown(){this.event_refs.forEach(e=>{e.e.offref(e)}),this.event_refs=[]}generate_on_all_templates_executed(){return e=>{let t=this.plugin.app.workspace.on("templater:all-templates-executed",async()=>{await yt(1),e()});t&&this.event_refs.push(t)}}};var fi=class extends be{constructor(){super(...arguments);this.name="frontmatter"}async create_static_templates(){}async create_dynamic_templates(){let e=this.plugin.app.metadataCache.getFileCache(this.config.target_file);this.dynamic_functions=new Map(Object.entries(e?.frontmatter||{}))}async teardown(){}};var wt=X(require("obsidian"));var di=class extends wt.Modal{constructor(e,t,r,i){super(e);this.prompt_text=t;this.default_value=r;this.multi_line=i;this.submitted=!1}onOpen(){this.titleEl.setText(this.prompt_text),this.createForm()}onClose(){this.contentEl.empty(),this.submitted||this.reject(new P("Cancelled prompt"))}createForm(){let e=this.contentEl.createDiv();e.addClass("templater-prompt-div");let t=new wt.TextAreaComponent(e),r=this.contentEl.createDiv();r.addClass("templater-button-div");let i=new wt.ButtonComponent(r);i.buttonEl.addClass("mod-cta"),i.setButtonText("Submit").onClick(o=>{this.resolveAndClose(o)}),this.value=this.default_value??"",t.inputEl.addClass("templater-prompt-input"),t.setPlaceholder("Type text here"),t.setValue(this.value),t.onChange(o=>this.value=o),t.inputEl.focus(),t.inputEl.addEventListener("keydown",o=>this.enterCallback(o))}enterCallback(e){e.isComposing||e.keyCode===229||(this.multi_line?wt.Platform.isDesktop&&e.key==="Enter"&&!e.shiftKey&&this.resolveAndClose(e):e.key==="Enter"&&this.resolveAndClose(e))}resolveAndClose(e){this.submitted=!0,e.preventDefault(),this.resolve(this.value),this.close()}async openAndGetValue(e,t){this.resolve=e,this.reject=t,this.open()}};var Yo=X(require("obsidian")),mi=class extends Yo.FuzzySuggestModal{constructor(e,t,r,i,o){super(e);this.text_items=t;this.items=r;this.submitted=!1;this.setPlaceholder(i),o&&(this.limit=o)}getItems(){return this.items}onClose(){this.submitted||this.reject(new P("Cancelled prompt"))}selectSuggestion(e,t){this.submitted=!0,this.close(),this.onChooseSuggestion(e,t)}getItemText(e){return this.text_items instanceof Function?this.text_items(e):this.text_items[this.items.indexOf(e)]||"Undefined Text Item"}onChooseItem(e){this.resolve(e)}async openAndGetValue(e,t){this.resolve=e,this.reject=t,this.open()}};var De=X(require("obsidian")),gi=class extends De.Modal{constructor(e,t,r,i,o){super(e);this.text_items=t;this.items=r;this.submitted=!1;this.selectedItems=[];this.setTitle(i),this.listEl=this.contentEl.createDiv("templater-multisuggester-list");let a=this.contentEl.createDiv("templater-multisuggester-div"),l=new De.TextComponent(a);l.inputEl.addClass("templater-multisuggester-input"),this.suggester=new Uo(e,l.inputEl,this.getItemText.bind(this),r,o).onSelect(this.onChooseItem.bind(this));let c=this.contentEl.createDiv("modal-button-container");new De.ButtonComponent(c).setButtonText("Save").setCta().onClick(()=>this.save()),new De.ButtonComponent(c).setButtonText("Cancel").onClick(()=>this.close())}onOpen(){this.display()}display(){this.listEl.empty(),this.selectedItems.forEach(e=>{let t=this.listEl.createDiv("mobile-option-setting-item");t.createSpan("mobile-option-setting-item-name").setText(this.getItemText(e)),t.createDiv("clickable-icon mobile-option-setting-item-option-icon",r=>{(0,De.setIcon)(r,"lucide-x"),r.addEventListener("click",()=>{this.onRemoveItem(e)})})})}getItemText(e){return this.text_items instanceof Function?this.text_items(e):this.text_items[this.items.indexOf(e)]||"Undefined Text Item"}onChooseItem(e){this.selectedItems.push(e);let t=this.items.filter(r=>!this.selectedItems.some(i=>i===r));this.suggester.setItems(t),this.display()}onRemoveItem(e){this.selectedItems=this.selectedItems.filter(r=>r!==e);let t=this.items.filter(r=>!this.selectedItems.some(i=>i===r));this.suggester.setItems(t),this.display()}save(){this.submitted=!0,this.close(),this.resolve(this.selectedItems)}onClose(){this.submitted||this.reject(new P("Cancelled prompt"))}async openAndGetValue(e,t){this.resolve=e,this.reject=t,this.open()}},Uo=class extends De.AbstractInputSuggest{constructor(e,t,r,i,o){super(e,t);this.getItemText=r;this.items=i;o&&(this.limit=o)}getSuggestions(e){let t=(0,De.prepareFuzzySearch)(e);return this.items.reduce((r,i)=>{let o=this.getItemText(i);return t(o)&&r.push(i),r},[])}renderSuggestion(e,t){t.createDiv("suggestion-content").setText(this.getItemText(e))}setItems(e){this.items=e}selectSuggestion(e,t){this.setValue(""),this.close(),super.selectSuggestion(e,t)}};var hi=class extends be{constructor(){super(...arguments);this.name="system"}async create_static_templates(){this.static_functions.set("clipboard",this.generate_clipboard()),this.static_functions.set("prompt",this.generate_prompt()),this.static_functions.set("suggester",this.generate_suggester()),this.static_functions.set("multi_suggester",this.generate_multi_suggester())}async create_dynamic_templates(){}async teardown(){}generate_clipboard(){return async()=>await navigator.clipboard.readText()}generate_prompt(){return async(e,t,r=!1,i=!1)=>{let o=new di(this.plugin.app,e,t,i),a=new Promise((l,c)=>o.openAndGetValue(l,c));try{return await a}catch(l){if(r)throw l;return null}}}generate_suggester(){return async(e,t,r=!1,i="",o)=>{let a=new mi(this.plugin.app,e,t,i,o),l=new Promise((c,d)=>a.openAndGetValue(c,d));try{return await l}catch(c){if(r)throw c;return null}}}generate_multi_suggester(){return async(e,t,r=!1,i="",o)=>{let a=new gi(this.plugin.app,e,t,i,o),l=new Promise((c,d)=>a.openAndGetValue(c,d));try{return await l}catch(c){if(r)throw c;return[]}}}};var Ai=class extends be{constructor(){super(...arguments);this.name="config"}async create_static_templates(){}async create_dynamic_templates(){}async teardown(){}async generate_object(e){return e}};var _i=class{constructor(e){this.plugin=e;this.modules_array=[];this.modules_array.push(new ci(this.plugin)),this.modules_array.push(new li(this.plugin)),this.modules_array.push(new pi(this.plugin)),this.modules_array.push(new fi(this.plugin)),this.modules_array.push(new ui(this.plugin)),this.modules_array.push(new hi(this.plugin)),this.modules_array.push(new Ai(this.plugin))}async init(){for(let e of this.modules_array)await e.init()}async teardown(){for(let e of this.modules_array)await e.teardown()}async generate_object(e){let t={};for(let r of this.modules_array)t[r.getName()]=await r.generate_object(e);return t}};var Cn=X(require("obsidian"));var xi=class{constructor(e){this.plugin=e;if(Cn.Platform.isMobile||!(this.plugin.app.vault.adapter instanceof Cn.FileSystemAdapter))this.cwd="";else{this.cwd=this.plugin.app.vault.adapter.getBasePath();let{promisify:t}=require("util"),{exec:r}=require("child_process");this.exec_promise=t(r)}}async generate_system_functions(e){let t=new Map,r=await this.plugin.templater.functions_generator.generate_object(e,Qe.INTERNAL);for(let i of this.plugin.settings.templates_pairs){let o=i[0],a=i[1];!o||!a||(Cn.Platform.isMobile?t.set(o,()=>new Promise(l=>l(Ho))):(a=await this.plugin.templater.parser.parse_commands(a,r),t.set(o,async l=>{let c={...process.env,...l},d={timeout:this.plugin.settings.command_timeout*1e3,cwd:this.cwd,env:c,...this.plugin.settings.shell_path&&{shell:this.plugin.settings.shell_path}};try{let{stdout:m}=await this.exec_promise(a,d);return m.trimRight()}catch(m){throw new P(`Error with User Template ${o}`,m)}})))}return t}async generate_object(e){let t=await this.generate_system_functions(e);return Object.fromEntries(t)}};var yi=class{constructor(e){this.plugin=e}async generate_user_script_functions(){let e=new Map,t=Ce(()=>Je(this.plugin.app,this.plugin.settings.user_scripts_folder),`Couldn't find user script folder "${this.plugin.settings.user_scripts_folder}"`);if(!t)return new Map;for(let r of t)r.extension.toLowerCase()==="js"&&await this.load_user_script_function(r,e);return e}async load_user_script_function(e,t){let r=c=>window.require&&window.require(c),i={},o={exports:i},a=await this.plugin.app.vault.read(e);try{window.eval("(function anonymous(require, module, exports){"+a+` -})`)(r,o,i)}catch(c){throw new P(`Failed to load user script at "${e.path}".`,c.message)}let l=i.default??o.exports;if(!l)throw new P(`Failed to load user script at "${e.path}". No exports detected.`);if(typeof l=="function")t.set(e.basename,l);else if(typeof l=="object"&&l!==null){if(!Object.values(l).every(d=>typeof d=="function"))throw new P(`Exported object in "${e.path}" must contain only functions.`);t.set(e.basename,l)}else throw new P(`Invalid export in "${e.path}". Must be a function or object of functions.`)}async generate_object(){let e=await this.generate_user_script_functions();return Object.fromEntries(e)}};var ji=class{constructor(e){this.plugin=e;this.user_system_functions=new xi(e),this.user_script_functions=new yi(e)}async generate_object(e){let t={},r={};return this.plugin.settings.enable_system_commands&&(t=await this.user_system_functions.generate_object(e)),this.plugin.settings.user_scripts_folder&&(r=await this.user_script_functions.generate_object()),{...t,...r}}};var Ks=X(require("obsidian")),Qe;(function(t){t[t.INTERNAL=0]="INTERNAL",t[t.USER_INTERNAL=1]="USER_INTERNAL"})(Qe||(Qe={}));var vi=class{constructor(e){this.plugin=e;this.internal_functions=new _i(this.plugin),this.user_functions=new ji(this.plugin)}async init(){await this.internal_functions.init()}async teardown(){await this.internal_functions.teardown()}additional_functions(){return{app:this.plugin.app,obsidian:Ks}}async generate_object(e,t=1){let r={},i=this.additional_functions(),o=await this.internal_functions.generate_object(e),a={};switch(Object.assign(r,i),t){case 0:Object.assign(r,o);break;case 1:a=await this.user_functions.generate_object(e),Object.assign(r,{...o,user:a});break}return r}};var Xs={},M,Ke=new Array(32).fill(void 0);Ke.push(void 0,null,!0,!1);function Pe(n){return Ke[n]}var Dn=Ke.length;function Rs(n){n<36||(Ke[n]=Dn,Dn=n)}function wi(n){let e=Pe(n);return Rs(n),e}var Go=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});Go.decode();var _r=new Uint8Array;function xr(){return _r.byteLength===0&&(_r=new Uint8Array(M.memory.buffer)),_r}function bt(n,e){return Go.decode(xr().subarray(n,n+e))}function Et(n){Dn===Ke.length&&Ke.push(Ke.length+1);let e=Dn;return Dn=Ke[e],Ke[e]=n,e}var Re=0,yr=new TextEncoder("utf-8"),Ys=typeof yr.encodeInto=="function"?function(n,e){return yr.encodeInto(n,e)}:function(n,e){let t=yr.encode(n);return e.set(t),{read:n.length,written:t.length}};function mt(n,e,t){if(t===void 0){let l=yr.encode(n),c=e(l.length);return xr().subarray(c,c+l.length).set(l),Re=l.length,c}let r=n.length,i=e(r),o=xr(),a=0;for(;a127)break;o[i+a]=l}if(a!==r){a!==0&&(n=n.slice(a)),i=t(i,r,r=a+n.length*3);let l=xr().subarray(i+a,i+r);a+=Ys(n,l).written}return Re=a,i}function Us(n){return n==null}var jr=new Int32Array;function Ne(){return jr.byteLength===0&&(jr=new Int32Array(M.memory.buffer)),jr}function bi(n){let e=typeof n;if(e=="number"||e=="boolean"||n==null)return`${n}`;if(e=="string")return`"${n}"`;if(e=="symbol"){let i=n.description;return i==null?"Symbol":`Symbol(${i})`}if(e=="function"){let i=n.name;return typeof i=="string"&&i.length>0?`Function(${i})`:"Function"}if(Array.isArray(n)){let i=n.length,o="[";i>0&&(o+=bi(n[0]));for(let a=1;a1)r=t[1];else return toString.call(n);if(r=="Object")try{return"Object("+JSON.stringify(n)+")"}catch{return"Object"}return n instanceof Error?`${n.name}: ${n.message} -${n.stack}`:r}function Gs(n,e){if(!(n instanceof e))throw new Error(`expected instance of ${e.name}`);return n.ptr}var vr=32;function Ws(n){if(vr==1)throw new Error("out of js stack");return Ke[--vr]=n,vr}function Ei(n,e){try{return n.apply(this,e)}catch(t){M.__wbindgen_exn_store(Et(t))}}var Kt=class{static __wrap(e){let t=Object.create(Kt.prototype);return t.ptr=e,t}__destroy_into_raw(){let e=this.ptr;return this.ptr=0,e}free(){let e=this.__destroy_into_raw();M.__wbg_parserconfig_free(e)}get interpolate(){let e=M.__wbg_get_parserconfig_interpolate(this.ptr);return String.fromCodePoint(e)}set interpolate(e){M.__wbg_set_parserconfig_interpolate(this.ptr,e.codePointAt(0))}get execution(){let e=M.__wbg_get_parserconfig_execution(this.ptr);return String.fromCodePoint(e)}set execution(e){M.__wbg_set_parserconfig_execution(this.ptr,e.codePointAt(0))}get single_whitespace(){let e=M.__wbg_get_parserconfig_single_whitespace(this.ptr);return String.fromCodePoint(e)}set single_whitespace(e){M.__wbg_set_parserconfig_single_whitespace(this.ptr,e.codePointAt(0))}get multiple_whitespace(){let e=M.__wbg_get_parserconfig_multiple_whitespace(this.ptr);return String.fromCodePoint(e)}set multiple_whitespace(e){M.__wbg_set_parserconfig_multiple_whitespace(this.ptr,e.codePointAt(0))}constructor(e,t,r,i,o,a,l){let c=mt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),d=Re,m=mt(t,M.__wbindgen_malloc,M.__wbindgen_realloc),_=Re,w=mt(l,M.__wbindgen_malloc,M.__wbindgen_realloc),b=Re,S=M.parserconfig_new(c,d,m,_,r.codePointAt(0),i.codePointAt(0),o.codePointAt(0),a.codePointAt(0),w,b);return Kt.__wrap(S)}get opening_tag(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_opening_tag(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set opening_tag(e){let t=mt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_opening_tag(this.ptr,t,r)}get closing_tag(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_closing_tag(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set closing_tag(e){let t=mt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_closing_tag(this.ptr,t,r)}get global_var(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_global_var(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set global_var(e){let t=mt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_global_var(this.ptr,t,r)}},sn=class{static __wrap(e){let t=Object.create(sn.prototype);return t.ptr=e,t}__destroy_into_raw(){let e=this.ptr;return this.ptr=0,e}free(){let e=this.__destroy_into_raw();M.__wbg_renderer_free(e)}constructor(e){Gs(e,Kt);var t=e.ptr;e.ptr=0;let r=M.renderer_new(t);return sn.__wrap(r)}render_content(e,t){try{let a=M.__wbindgen_add_to_stack_pointer(-16),l=mt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),c=Re;M.renderer_render_content(a,this.ptr,l,c,Ws(t));var r=Ne()[a/4+0],i=Ne()[a/4+1],o=Ne()[a/4+2];if(o)throw wi(i);return wi(r)}finally{M.__wbindgen_add_to_stack_pointer(16),Ke[vr++]=void 0}}};async function Vs(n,e){if(typeof Response=="function"&&n instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(n,e)}catch(r){if(n.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let t=await n.arrayBuffer();return await WebAssembly.instantiate(t,e)}else{let t=await WebAssembly.instantiate(n,e);return t instanceof WebAssembly.Instance?{instance:t,module:n}:t}}function zs(){let n={};return n.wbg={},n.wbg.__wbindgen_object_drop_ref=function(e){wi(e)},n.wbg.__wbindgen_string_new=function(e,t){let r=bt(e,t);return Et(r)},n.wbg.__wbindgen_string_get=function(e,t){let r=Pe(t),i=typeof r=="string"?r:void 0;var o=Us(i)?0:mt(i,M.__wbindgen_malloc,M.__wbindgen_realloc),a=Re;Ne()[e/4+1]=a,Ne()[e/4+0]=o},n.wbg.__wbg_call_97ae9d8645dc388b=function(){return Ei(function(e,t){let r=Pe(e).call(Pe(t));return Et(r)},arguments)},n.wbg.__wbg_new_8d2af00bc1e329ee=function(e,t){let r=new Error(bt(e,t));return Et(r)},n.wbg.__wbg_message_fe2af63ccc8985bc=function(e){let t=Pe(e).message;return Et(t)},n.wbg.__wbg_newwithargs_8fe23e3842840c8e=function(e,t,r,i){let o=new Function(bt(e,t),bt(r,i));return Et(o)},n.wbg.__wbg_call_168da88779e35f61=function(){return Ei(function(e,t,r){let i=Pe(e).call(Pe(t),Pe(r));return Et(i)},arguments)},n.wbg.__wbg_call_3999bee59e9f7719=function(){return Ei(function(e,t,r,i){let o=Pe(e).call(Pe(t),Pe(r),Pe(i));return Et(o)},arguments)},n.wbg.__wbindgen_debug_string=function(e,t){let r=bi(Pe(t)),i=mt(r,M.__wbindgen_malloc,M.__wbindgen_realloc),o=Re;Ne()[e/4+1]=o,Ne()[e/4+0]=i},n.wbg.__wbindgen_throw=function(e,t){throw new Error(bt(e,t))},n}function Js(n,e){}function Qs(n,e){return M=n.exports,Wo.__wbindgen_wasm_module=e,jr=new Int32Array,_r=new Uint8Array,M}async function Wo(n){typeof n=="undefined"&&(n=new URL("rusty_engine_bg.wasm",Xs.url));let e=zs();(typeof n=="string"||typeof Request=="function"&&n instanceof Request||typeof URL=="function"&&n instanceof URL)&&(n=fetch(n)),Js(e);let{instance:t,module:r}=await Vs(await n,e);return Qs(t,r)}var Vo=Wo;var zo=zi("AGFzbQEAAAABvwEaYAJ/fwBgAn9/AX9gAX8Bf2ADf39/AX9gA39/fwBgAX8AYAV/f39/fwBgBH9/f38AYAR/f39/AX9gAABgBX9/f39/AX9gAX8BfmAAAX9gBn9/f39/fwBgB39/f39/f38AYAV/f35/fwBgBX9/fX9/AGAFf398f38AYAR/fn9/AGAFf35/f38AYAR/fX9/AGAEf3x/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gCn9/f39/f39/f38Bf2ACfn8BfwLkAgsDd2JnGl9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmAAUDd2JnFV9fd2JpbmRnZW5fc3RyaW5nX25ldwABA3diZxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAAAN3YmcbX193YmdfY2FsbF85N2FlOWQ4NjQ1ZGMzODhiAAEDd2JnGl9fd2JnX25ld184ZDJhZjAwYmMxZTMyOWVlAAEDd2JnHl9fd2JnX21lc3NhZ2VfZmUyYWY2M2NjYzg5ODViYwACA3diZyJfX3diZ19uZXd3aXRoYXJnc184ZmUyM2UzODQyODQwYzhlAAgDd2JnG19fd2JnX2NhbGxfMTY4ZGE4ODc3OWUzNWY2MQADA3diZxtfX3diZ19jYWxsXzM5OTliZWU1OWU5Zjc3MTkACAN3YmcXX193YmluZGdlbl9kZWJ1Z19zdHJpbmcAAAN3YmcQX193YmluZGdlbl90aHJvdwAAA7kBtwECBwAGAgYEBAcBBQMKCAAEBgYAAwcCAAEADgETAQQXAQICAQAAAwcZAQAFAQwABgACAgAAAgAEBAAGAQAAAAAEBw0CAQUEBQYCDBgAAQAAAAQBAQEAAQABBAQEBgMDBwMJAwQIAAAABQkAAgEAAAAABwAAAgICAgAFBQMEFgoGEQ8QAAUHAwIBAgABBQEBCAACAQEBBQEAAgECAgACAQEBAgAJCQICAgIAAAAAAwMDAQECAgsLCwUEBQFwATs7BQMBABEGCQF/AUGAgMAACwfcBRkGbWVtb3J5AgAXX193YmdfcGFyc2VyY29uZmlnX2ZyZWUAUSJfX3diZ19nZXRfcGFyc2VyY29uZmlnX2ludGVycG9sYXRlAH4iX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19pbnRlcnBvbGF0ZQB3IF9fd2JnX2dldF9wYXJzZXJjb25maWdfZXhlY3V0aW9uAH8gX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19leGVjdXRpb24AeChfX3diZ19nZXRfcGFyc2VyY29uZmlnX3NpbmdsZV93aGl0ZXNwYWNlAIABKF9fd2JnX3NldF9wYXJzZXJjb25maWdfc2luZ2xlX3doaXRlc3BhY2UAeSpfX3diZ19nZXRfcGFyc2VyY29uZmlnX211bHRpcGxlX3doaXRlc3BhY2UAgQEqX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19tdWx0aXBsZV93aGl0ZXNwYWNlAHoQcGFyc2VyY29uZmlnX25ldwBVGHBhcnNlcmNvbmZpZ19vcGVuaW5nX3RhZwBGHHBhcnNlcmNvbmZpZ19zZXRfb3BlbmluZ190YWcAYxhwYXJzZXJjb25maWdfY2xvc2luZ190YWcARxxwYXJzZXJjb25maWdfc2V0X2Nsb3NpbmdfdGFnAGQXcGFyc2VyY29uZmlnX2dsb2JhbF92YXIASBtwYXJzZXJjb25maWdfc2V0X2dsb2JhbF92YXIAZRNfX3diZ19yZW5kZXJlcl9mcmVlAE8McmVuZGVyZXJfbmV3ACAXcmVuZGVyZXJfcmVuZGVyX2NvbnRlbnQAORFfX3diaW5kZ2VuX21hbGxvYwB1El9fd2JpbmRnZW5fcmVhbGxvYwCFAR9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAKsBD19fd2JpbmRnZW5fZnJlZQCaARRfX3diaW5kZ2VuX2V4bl9zdG9yZQCfAQllAQBBAQs6mAGdAaoBPzzBAZUBlgFOkgGOAWotYsEBwQFnKl3BAXaIAUyJAYgBhwGQAY8BiQGJAYwBigGLAZgBX8EBaKABXo4BvwG+AYQBOElwoQHBAWioAWCjAVclqQGcAcEBwAEK2dYCtwG8IAIPfwF+IwBBEGsiCyQAAkACQCAAQfUBTwRAQYCAfEEIQQgQlwFBFEEIEJcBakEQQQgQlwFqa0F3cUF9aiICQQBBEEEIEJcBQQJ0ayIBIAEgAksbIABNDQIgAEEEakEIEJcBIQRBrK7AACgCAEUNAUEAIARrIQMCQAJAAn9BACAEQYACSQ0AGkEfIARB////B0sNABogBEEGIARBCHZnIgBrdkEBcSAAQQF0a0E+agsiBkECdEG4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EBBBIAQoAgAiBSAAKAIAaiIGQdSDwAApAAA3AAAgBCAFQRBqNgIAIAZBCGpB3IPAACkAADcAACADQQE2AiwgAyABKAIIQShqIgU2AiggAyAANgIYIANB3ABqQQE2AgAgA0ICNwJMIANB8IPAADYCSCADIANBKGo2AlgCQAJAAkACQAJAAkAgA0EYakGYisAAIANByABqEB5FBEAgAigCACEIAkAgAigCCCIBRQ0AIAFBBHQhCkGQhMAAIQZBACEBQQAhBANAAn8gASAIaiIHQQRqIgkgBygCAEUNABoCQCAERQ0AIANBEGogBCgCACAEKAIEQQAgBiAGLQAAQQJGG0EBEBAgA0EIaiADKAIQIAMoAhRBACAHQQ1qIgQgBC0AAEECRhtBABAQIANBGGogAygCCCADKAIMEBIgA0EBNgI0IANBATYCLCADIAU2AiggAyADQRhqNgIwIAMgADYCRCADQQI2AlwgA0IDNwJMIANBmITAADYCSCADIANBKGo2AlggA0HEAGpBmIrAACADQcgAahAeDQUgAygCHEUNACADKAIYEBULIAdBDmohBgJAIAdBDGotAABFBEAgA0ECNgIsIAMgCTYCKCADIAA2AhggA0EBNgJcIANCAjcCTCADQfSEwAA2AkggAyADQShqNgJYIANBGGpBmIrAACADQcgAahAeDQcgA0ECNgI0IANBoIXAADYCMCADQQE2AiwgAyAFNgIoIAMgADYCGCADQQI2AlwgA0IDNwJMIANBmITAADYCSCADIANBKGo2AlggA0EYakGYisAAIANByABqEB5FDQFBq4HAAEErIANByABqQdiBwABBqIXAABBSAAsgA0ECNgIsIAMgCTYCKCADIAA2AhggA0EBNgJcIANCAjcCTCADQcSEwAA2AkggAyADQShqNgJYIANBGGpBmIrAACADQcgAahAeDQcLQQALIQQgCiABQRBqIgFHDQALIARFDQAgAyAEKAIAIAQoAgRBACAGIAYtAABBAkYbQQEQECADQRhqIAMoAgAgAygCBBASIANBNGpBATYCACADQQE2AiwgAyAFNgIoIAMgA0EYajYCMCADIAA2AkQgA0HcAGpBAjYCACADQgM3AkwgA0GYhMAANgJIIAMgA0EoajYCWCADQcQAakGYisAAIANByABqEB4NBSADKAIcRQ0AIAMoAhgQFQsgAEEEaigCACAAQQhqIgQoAgAiAWtBJ00EQCAAIAFBKBBBIAQoAgAhAQsgBCABQShqNgIAIAAoAgAgAWoiAUHIhcAAKQAANwAAIAFBCGpB0IXAACkAADcAACABQRBqQdiFwAApAAA3AAAgAUEYakHghcAAKQAANwAAIAFBIGpB6IXAACkAADcAACADQTxqQQI2AgAgA0E0akEBNgIAIANBoIXAADYCOCADIAU2AjAgA0EBNgIsIAMgBTYCKCADIAA2AhggA0HcAGoiAUEDNgIAIANCBDcCTCADQZiGwAA2AkggAyADQShqNgJYIANBGGpBmIrAACADQcgAahAeDQUgA0EBNgIsIAMgBTYCKCADIAA2AhggAUEBNgIAIANCAjcCTCADQdCGwAA2AkggAyADQShqNgJYIANBGGpBmIrAACADQcgAahAeDQYgAkEEaigCAARAIAgQFQsgA0HgAGokAA8LQauBwABBKyADQcgAakHYgcAAQYCEwAAQUgALQauBwABBKyADQcgAakHYgcAAQbCEwAAQUgALQauBwABBKyADQcgAakHYgcAAQYSFwAAQUgALQauBwABBKyADQcgAakHYgcAAQdSEwAAQUgALQauBwABBKyADQcgAakHYgcAAQbiFwAAQUgALQauBwABBKyADQcgAakHYgcAAQbiGwAAQUgALQauBwABBKyADQcgAakHYgcAAQeCGwAAQUgAL7QkCCH8GfiMAQdAAayIDJAACQAJAAkAQVCIEBEAgA0EgakIANwMAIANBHGpBkIrAADYCACAEIAQpAwAiC0IBfDcDACADQQA2AhggAyALNwMIIAMgBEEIaikDADcDECADQqeAgIDwBDcDSCADQo2AgICgDjcDQCADQoqAgIDgDTcDOCADQtyAgIDACzcDMCADQQhqIANBMGoQGSADQQA2AjggA0IENwMwIAJFBEAgAEEANgIIIABCATcCAEEEIQRBBCEBDAQLIAEgAmohCEEAIQIDQAJ/IAEsAAAiBEF/SgRAIARB/wFxIQQgAUEBagwBCyABLQABQT9xIQUgBEEfcSEGIARBX00EQCAGQQZ0IAVyIQQgAUECagwBCyABLQACQT9xIAVBBnRyIQUgBEFwSQRAIAUgBkEMdHIhBCABQQNqDAELIAZBEnRBgIDwAHEgAS0AA0E/cSAFQQZ0cnIiBEGAgMQA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ASACIANqQQFqIgM2AhAgAyAHT0EAIAMgDE0bRQRAIAYgA08NAQwDCwsgB0EEELUBAAsgASAGNgIQCyABLQAkIAEoAgAiAiABKAIEIgRHckUNASABQQE6ACUgBCACawshAyAIRQ0AIAIgCGohCyADRQRAQQAhAgwBCyADQX9qIgEgAyABIAtqLQAAQQ1GGyECCyAAIAI2AgQgACALNgIAIAVBEGokAAv+BAEKfyMAQTBrIgMkACADQSRqIAE2AgAgA0EDOgAoIANCgICAgIAENwMIIAMgADYCICADQQA2AhggA0EANgIQAkACQAJAIAIoAggiCkUEQCACQRRqKAIAIgRFDQEgAigCACEBIAIoAhAhACAEQX9qQf////8BcUEBaiIHIQQDQCABQQRqKAIAIgUEQCADKAIgIAEoAgAgBSADKAIkKAIMEQMADQQLIAAoAgAgA0EIaiAAQQRqKAIAEQEADQMgAEEIaiEAIAFBCGohASAEQX9qIgQNAAsMAQsgAkEMaigCACIARQ0AIABBBXQhCyAAQX9qQf///z9xQQFqIQcgAigCACEBA0AgAUEEaigCACIABEAgAygCICABKAIAIAAgAygCJCgCDBEDAA0DCyADIAQgCmoiBUEcai0AADoAKCADIAVBBGopAgBCIIk3AwggBUEYaigCACEGIAIoAhAhCEEAIQlBACEAAkACQAJAIAVBFGooAgBBAWsOAgACAQsgBkEDdCAIaiIMKAIEQTdHDQEgDCgCACgCACEGC0EBIQALIAMgBjYCFCADIAA2AhAgBUEQaigCACEAAkACQAJAIAVBDGooAgBBAWsOAgACAQsgAEEDdCAIaiIGKAIEQTdHDQEgBigCACgCACEAC0EBIQkLIAMgADYCHCADIAk2AhggCCAFKAIAQQN0aiIAKAIAIANBCGogACgCBBEBAA0CIAFBCGohASALIARBIGoiBEcNAAsLQQAhACAHIAIoAgRJIgFFDQEgAygCICACKAIAIAdBA3RqQQAgARsiASgCACABKAIEIAMoAiQoAgwRAwBFDQELQQEhAAsgA0EwaiQAIAALwgQBCH8jAEHQAGsiBCQAIARBEGogASACIAMoAgAgA0EIaigCABAOAkACQAJAAkACQAJAIAQoAhBFBEAgBEEeai0AAA0EIARBxABqKAIAIQYgBCgCQCEHIARBHGot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AkAgAUGAAU8EQCACQQA2AgwgAUGAEEkNASABQYCABE8NAiACIAFBP3FBgAFyOgAOIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADUEDDAMLIAAoAggiAyAAQQRqKAIARgR/IAAgAxBAIAAoAggFIAMLIAAoAgBqIAE6AAAgACAAKAIIQQFqNgIIDAMLIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECDAELIAIgAUE/cUGAAXI6AA8gAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANIAIgAUESdkEHcUHwAXI6AAxBBAshASAAQQRqKAIAIABBCGoiBCgCACIDayABSQRAIAAgAyABEEEgBCgCACEDCyAAKAIAIANqIAJBDGogARC5ARogBCABIANqNgIACyACQRBqJABBAAvVAgEDfyMAQRBrIgIkAAJAAn8CQCABQYABTwRAIAJBADYCDCABQYAQTw0BIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECDAILIAAoAggiAyAAQQRqKAIARgRAIAAgAxBDIAAoAgghAwsgACADQQFqNgIIIAAoAgAgA2ogAToAAAwCCyABQYCABE8EQCACIAFBP3FBgAFyOgAPIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADSACIAFBEnZBB3FB8AFyOgAMQQQMAQsgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwshASAAQQRqKAIAIABBCGoiBCgCACIDayABSQRAIAAgAyABEEIgBCgCACEDCyAAKAIAIANqIAJBDGogARC5ARogBCABIANqNgIACyACQRBqJAAL1wIBA38jAEEQayICJAACQAJ/AkACQCABQYABTwRAIAJBADYCDCABQYAQSQ0BIAFBgIAETw0CIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAwsgACgCCCIDIABBBGooAgBGBEAgACADEEMgACgCCCEDCyAAIANBAWo2AgggACgCACADaiABOgAADAMLIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECDAELIAIgAUE/cUGAAXI6AA8gAiABQQZ2QT9xQYABcjoADiAC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AiADKAIIIgRNBEAgASECDAELIARFBEBBASECIAEQFQwBCyABIAJBASAEEJkBIgJFDQMLIAAgBDYCBCAAIAI2AgAgA0EQaiQADwsQrQEACxCuAQALIARBARCzAQALrAEBA38jAEEQayIDJAACQAJAIAEEQCABKAIAIgJBf0YNASABIAJBAWo2AgAgAyABQRBqEGEgASABKAIAQX9qNgIAIAMoAgAhAQJAIAMoAgQiAiADKAIIIgRNBEAgASECDAELIARFBEBBASECIAEQFQwBCyABIAJBASAEEJkBIgJFDQMLIAAgBDYCBCAAIAI2AgAgA0EQaiQADwsQrQEACxCuAQALIARBARCzAQALrAEBA38jAEEQayIDJAACQAJAIAEEQCABKAIAIgJBf0YNASABIAJBAWo2AgAgAyABQSxqEGEgASABKAIAQX9qNgIAIAMoAgAhAQJAIAMoAgQiAiADKAIIIgRNBEAgASECDAELIARFBEBBASECIAEQFQwBCyABIAJBASAEEJkBIgJFDQMLIAAgBDYCBCAAIAI2AgAgA0EQaiQADwsQrQEACxCuAQALIARBARCzAQALrAEBA38jAEEwayICJAAgAUEEaiEDIAEoAgRFBEAgASgCACEBIAJBEGoiBEEANgIAIAJCATcDCCACIAJBCGo2AhQgAkEoaiABQRBqKQIANwMAIAJBIGogAUEIaikCADcDACACIAEpAgA3AxggAkEUakGAjsAAIAJBGGoQHhogA0EIaiAEKAIANgIAIAMgAikDCDcCAAsgAEHoj8AANgIEIAAgAzYCACACQTBqJAALkAEBAn8CQAJ/AkACQAJAAn9BASIDIAFBAEgNABogAigCCEUNAiACKAIEIgQNASABDQNBAQwECyEDQQAhAQwECyACKAIAIARBASABEJkBDAILIAENAEEBDAELIAFBARCeAQsiAgRAIAAgAjYCBEEAIQMMAQsgACABNgIEQQEhAQsgACADNgIAIABBCGogATYCAAunAQECfwJAAkACQAJAAkACQAJAAn8gAgRAQQEiBCABQQBIDQEaIAMoAghFDQMgAygCBCIFDQIgAQ0EDAYLIAAgATYCBEEBCyEEQQAhAQwGCyADKAIAIAUgAiABEJkBIgNFDQIMBAsgAUUNAgsgASACEJ4BIgMNAgsgACABNgIEIAIhAQwCCyACIQML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AX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQRxqQQI2AgAgAkEsakEDNgIAIAJCAjcCDCACQfSWwAA2AgggAkEDNgIkIAIgAkEgajYCGCACIAJBBGo2AiggAiACNgIgIAJBCGpBhJfAABB0AAtsAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EcakECNgIAIANBLGpBAzYCACADQgI3AgwgA0HAk8AANgIIIANBAzYCJCADIANBIGo2AhggAyADNgIoIAMgA0EEajYCICADQQhqIAIQdAALVgECfyMAQSBrIgIkACAAQRxqKAIAIQMgACgCGCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCADIAJBCGoQHiACQSBqJAALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakGYisAAIAJBCGoQHiACQSBqJAALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakGAjsAAIAJBCGoQHiACQSBqJAALZwAjAEEwayIBJABB2K3AAC0AAARAIAFBHGpBATYCACABQgI3AgwgAUH0jsAANgIIIAFBAzYCJCABIAA2AiwgASABQSBqNgIYIAEgAUEsajYCICABQQhqQZyPwAAQdAALIAFBMGokAAtZAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQbSRwAAgAkEIahAeIAJBIGokAAtnAQJ/IAEoAgAhAwJAAkACQCABQQhqKAIAIgFFBEBBASECDAELIAFBf0wNASABQQEQngEiAkUNAgsgAiADIAEQuQEhAiAAIAE2AgggACABNgIEIAAgAjYCAA8LEHMACyABQQEQswEAC1YBAX8jAEEgayICJAAgAiAANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpBmIrAACACQQhqEB4gAkEgaiQAC1YBAX8CQCAABEAgACgCAA0BIABBfzYCACAAQQhqIgMoAgAEQCAAKAIEEBULIAAgATYCBCAAQQA2AgAgAEEMaiACNgIAIAMgAjYCAA8LEK0BAAsQrgEAC1YBAX8CQCAABEAgACgCAA0BIABBfzYCACAAQRRqIgMoAgAEQCAAKAIQEBULIAAgATYCECAAQQA2AgAgAEEYaiACNgIAIAMgAjYCAA8LEK0BAAsQrgEAC1YBAX8CQCAABEAgACgCAA0BIABBfzYCACAAQTBqIgMoAgAEQCAAKAIsEBULIAAgATYCLCAAQQA2AgAgAEE0aiACNgIAIAMgAjYCAA8LEK0BAAsQrgEAC1YBAX8jAEEQayIFJAAgASgCACACKAIAIAMoAgAgBCgCABAIIQEgBUEIahCDASAFKAIMIQIgACAFKAIIIgNBAEc2AgAgACACIAEgAxs2AgQgBUEQaiQAC08BAn8gACgCACIDQQRqKAIAIANBCGoiBCgCACIAayACSQRAIAMgACACEEEgBCgCACEACyADKAIAIABqIAEgAhC5ARogBCAAIAJqNgIAQQALTwECfyAAKAIAIgNBBGooAgAgA0EIaiIEKAIAIgBrIAJJBEAgAyAAIAIQQiAEKAIAIQALIAMoAgAgAGogASACELkBGiAEIAAgAmo2AgBBAAtRAQF/IwBBEGsiBCQAIAEoAgAgAigCACADKAIAEAchASAEQQhqEIMBIAQoAgwhAiAAIAQoAggiA0EARzYCACAAIAIgASADGzYCBCAEQRBqJAALSgECfyAAQQRqKAIAIABBCGoiBCgCACIDayACSQRAIAAgAyACEEEgBCgCACEDCyAAKAIAIANqIAEgAhC5ARogBCACIANqNgIAQQALPwEBfyMAQSBrIgAkACAAQRxqQQA2AgAgAEGwkMAANgIYIABCATcCDCAAQcyQwAA2AgggAEEIakGkkcAAEHQAC0MBA38CQCACRQ0AA0AgAC0AACIEIAEtAAAiBUYEQCAAQQFqIQAgAUEBaiEBIAJBf2oiAg0BDAILCyAEIAVrIQMLIAMLTAECfyMAQRBrIgMkACABKAIAIAIoAgAQAyEBIANBCGoQgwEgAygCDCECIAAgAygCCCIEQQBHNgIAIAAgAiABIAQbNgIEIANBEGokAAtLAAJAAn8gAUGAgMQARwRAQQEgACgCGCABIABBHGooAgAoAhARAQANARoLIAINAUEACw8LIAAoAhggAiADIABBHGooAgAoAgwRAwALRwEBfyMAQSBrIgIkACACQRRqQQA2AgAgAkGAk8AANgIQIAJCATcCBCACQSs2AhwgAiAANgIYIAIgAkEYajYCACACIAEQdAALRgECfyABKAIEIQIgASgCACEDQQhBBBCeASIBRQRAQQhBBBCzAQALIAEgAjYCBCABIAM2AgAgAEH4j8AANgIEIAAgATYCAAs5AQF/IAFBEHZAACECIABBADYCCCAAQQAgAUGAgHxxIAJBf0YiARs2AgQgAEEAIAJBEHQgARs2AgALZAEDfyMAQRBrIgEkACAAKAIMIgJFBEBBmI7AAEHIj8AAEG8ACyAAKAIIIgNFBEBBmI7AAEHYj8AAEG8ACyABIAI2AgggASAANgIEIAEgAzYCACABKAIAIAEoAgQgASgCCBBQAAs/AQF/IwBBIGsiACQAIABBHGpBADYCACAAQcyRwAA2AhggAEIBNwIMIABBjJLAADYCCCAAQQhqQZSSwAAQdAALPgEBfyMAQSBrIgIkACACQQE6ABggAiABNgIUIAIgADYCECACQfyTwAA2AgwgAkGAk8AANgIIIAJBCGoQcgALKwACQCAAQXxLDQAgAEUEQEEEDwsgACAAQX1JQQJ0EJ4BIgBFDQAgAA8LAAsiACMAQRBrIgAkACAAQQhqIAEQfSAAQQhqEFMgAEEQaiQACysAAkAgAARAIAAoAgANASAAQQA2AgAgAEEcaiABNgIADwsQrQEACxCuAQALKwACQCAABEAgACgCAA0BIABBADYCACAAQSBqIAE2AgAPCxCtAQALEK4BAAsrAAJAIAAEQCAAKAIADQEgAEEANgIAIABBJGogATYCAA8LEK0BAAsQrgEACysAAkAgAARAIAAoAgANASAAQQA2AgAgAEEoaiABNgIADwsQrQEACxCuAQALQAEBfyMAQRBrIgQkACAEIAM2AgwgBCACNgIIIAQgATYCBCAEIAA2AgAgBCgCACAEKAIEIAQoAgggBCgCDBATAAs3ACAAQQM6ACAgAEKAgICAgAQ3AgAgACABNgIYIABBADYCECAAQQA2AgggAEEcakHEh8AANgIACzUBAX8gASgCGEHDjsAAQQsgAUEcaigCACgCDBEDACECIABBADoABSAAIAI6AAQgACABNgIACyUAAkAgAARAIAAoAgBBf0YNASAAQRxqKAIADwsQrQEACxCuAQALJQACQCAABEAgACgCAEF/Rg0BIABBIGooAgAPCxCtAQALEK4BAAslAAJAIAAEQCAAKAIAQX9GDQEgAEEkaigCAA8LEK0BAAsQrgEACyUAAkAgAARAIAAoAgBBf0YNASAAQShqKAIADwsQrQEACxCuAQALJwAgACAAKAIEQQFxIAFyQQJyNgIEIAAgAWoiACAAKAIEQQFyNgIECzoBAn9B3K3AAC0AACEBQdytwABBADoAAEHgrcAAKAIAIQJB4K3AAEEANgIAIAAgAjYCBCAAIAE2AgALIAEBfwJAIAAoAgQiAUUNACAAQQhqKAIARQ0AIAEQFQsLHwACQCABQXxNBEAgACABQQQgAhCZASIADQELAAsgAAsjACACIAIoAgRBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAslACAARQRAQciMwABBMBCsAQALIAAgAiADIAQgBSABKAIQEQoACyMAIABFBEBByIzAAEEwEKwBAAsgACACIAMgBCABKAIQEQgACyMAIABFBEBByIzAAEEwEKwBAAsgACACIAMgBCABKAIQEQcACyMAIABFBEBByIzAAEEwEKwBAAsgACACIAMgBCABKAIQERUACyMAIABFBEBByIzAAEEwEKwBAAsgACACIAMgBCABKAIQERIACyMAIABFBEBByIzAAEEwEKwBAAsgACACIAMgBCABKAIQERQACx4AIAAgAUEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAsUACAAQQRqKAIABEAgACgCABAVCwshACAARQRAQciMwABBMBCsAQALIAAgAiADIAEoAhARBAALHwAgAEUEQEHIjMAAQTAQrAEACyAAIAIgASgCEBEBAAsZAQF/IAAoAhAiAQR/IAEFIABBFGooAgALCxkAIAAoAgAiACgCACAAQQhqKAIAIAEQtwELEgBBAEEZIABBAXZrIABBH0YbCxYAIAAgAUEBcjYCBCAAIAFqIAE2AgALHAAgASgCGEHgpsAAQQUgAUEcaigCACgCDBEDAAsTACAAKAIAIgBBJE8EQCAAEAALCxAAIAAgAWpBf2pBACABa3ELFAAgACgCACAAQQhqKAIAIAEQtwELDAAgACABIAIgAxAYCwsAIAEEQCAAEBULCw8AIABBAXQiAEEAIABrcgsUACAAKAIAIAEg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BAAAAAQAAAARAAAAEgAAABMAAABjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uL3J1c3RjL2E1NWRkNzFkNWZiMGVjNWE2YTNhOWU4YzI3YjIxMjdiYTQ5MWNlNTIvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwAAAHYFEABPAAAApQEAABoAAAAUAAAAAAAAAAEAAAAVAAAAL3J1c3RjL2E1NWRkNzFkNWZiMGVjNWE2YTNhOWU4YzI3YjIxMjdiYTQ5MWNlNTIvbGlicmFyeS9jb3JlL3NyYy9zdHIvcGF0dGVybi5ycwDoBRAATwAAALcBAAAmAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGRlc3Ryb3llZCBhbHJlYWR5SnNWYWx1ZSgpAAAAeAYQAAgAAACABhAAAQAAAG51bGwgcG9pbnRlciBwYXNzZWQgdG8gcnVzdHJlY3Vyc2l2ZSB1c2Ugb2YgYW4gb2JqZWN0IGRldGVjdGVkIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5zYWZlIGFsaWFzaW5nIGluIHJ1c3QAACQAAAAEAAAABAAAACUAAAAmAAAAJwAAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVBY2Nlc3NFcnJvcm1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQKAAAATgcQABUAAABjBxAADgAAAGxpYnJhcnkvc3RkL3NyYy9hbGxvYy5yc4QHEAAYAAAAUgEAAAkAAABsaWJyYXJ5L3N0ZC9zcmMvcGFuaWNraW5nLnJzrAcQABwAAABGAgAAHwAAAKwHEAAcAAAARwIAAB4AAAAoAAAADAAAAAQAAAApAAAAJAAAAAgAAAAEAAAAKgAAACsAAAAQAAAABAAAACwAAAAtAAAAJAAAAAgAAAAEAAAALgAAAC8AAABIYXNoIHRhYmxlIGNhcGFjaXR5IG92ZXJmbG93MAgQABwAAAAvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9oYXNoYnJvd24tMC4xMi4zL3NyYy9yYXcvbW9kLnJzAFQIEABPAAAAWgAAACgAAAAwAAAABAAAAAQAAAAxAAAAMgAAADMAAAAwAAAAAAAAAAEAAAAHAAAAbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5yc2NhcGFjaXR5IG92ZXJmbG93AAAA+AgQABEAAADcCBAAHAAAAAYCAAAFAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9ybGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAFcJEAAYAAAAZAIAACAAAAAuLgAAgAkQAAIAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAjAkQACAAAACsCRAAEgAAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWUAOQAAAAAAAAABAAAAOgAAAGA6IACACRAAAAAAAA0KEAACAAAAfSB9MHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OXJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCAAAADtChAAEgAAAP8KEAAiAAAAbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwA0CxAAHwAAADQAAAAFAAAAcmFuZ2UgZW5kIGluZGV4IGQLEAAQAAAA/woQACIAAAA0CxAAHwAAAEkAAAAFAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAlAsQABYAAACqCxAADQAAADQLEAAfAAAAXAAAAAUAAABsaWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzANgLEAAfAAAAGgYAABUAAADYCxAAHwAAAEgGAAAVAAAA2AsQAB8AAABJBgAA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");var Ti=class{async init(){await Vo(zo);let e=new Kt("<%","%>","\0","*","-","_","tR");this.renderer=new sn(e)}async parse_commands(e,t){return this.renderer.render_content(e,t)}};var Xe;(function(a){a[a.CreateNewFromTemplate=0]="CreateNewFromTemplate",a[a.AppendActiveFile=1]="AppendActiveFile",a[a.OverwriteFile=2]="OverwriteFile",a[a.OverwriteActiveFile=3]="OverwriteActiveFile",a[a.DynamicProcessor=4]="DynamicProcessor",a[a.StartupTemplate=5]="StartupTemplate"})(Xe||(Xe={}));var Pn=class{constructor(e){this.plugin=e;this.functions_generator=new vi(this.plugin),this.parser=new Ti}async setup(){this.files_with_pending_templates=new Set,await this.parser.init(),await this.functions_generator.init(),this.plugin.registerMarkdownPostProcessor((e,t)=>this.process_dynamic_templates(e,t))}create_running_config(e,t,r){let i=Xt(this.plugin.app);return{template_file:e,target_file:t,run_mode:r,active_file:i}}async read_and_parse_template(e){let t=await this.plugin.app.vault.read(e.template_file);return this.parse_template(e,t)}async parse_template(e,t){let r=await this.functions_generator.generate_object(e,Qe.USER_INTERNAL);return this.current_functions_object=r,await this.parser.parse_commands(t,r)}start_templater_task(e){this.files_with_pending_templates.add(e)}async end_templater_task(e){this.files_with_pending_templates.delete(e),this.files_with_pending_templates.size===0&&(this.plugin.app.workspace.trigger("templater:all-templates-executed"),await this.functions_generator.teardown())}async create_new_note_from_template(e,t,r,i=!0){if(!t)switch(this.plugin.app.vault.getConfig("newFileLocation")){case"current":{let _=Xt(this.plugin.app);_&&(t=_.parent);break}case"folder":t=this.plugin.app.fileManager.getNewFileParent("");break;case"root":t=this.plugin.app.vault.getRoot();break;default:break}let o=e instanceof de.TFile&&e.extension||"md",a=await Se(async()=>{let m=t instanceof de.TFolder?t.path:t,_=this.plugin.app.vault.getAvailablePath((0,de.normalizePath)(`${m??""}/${r||"Untitled"}`),o),w=co(_);return w&&!this.plugin.app.vault.getAbstractFileByPathInsensitive(w)&&await this.plugin.app.vault.createFolder(w),this.plugin.app.vault.create(_,"")},`Couldn't create ${o} file.`);if(a==null)return;let{path:l}=a;this.start_templater_task(l);let c,d;if(e instanceof de.TFile?(c=this.create_running_config(e,a,0),d=await Se(async()=>this.read_and_parse_template(c),"Template parsing error, aborting.")):(c=this.create_running_config(void 0,a,0),d=await Se(async()=>this.parse_template(c,e),"Template parsing error, aborting.")),d==null){await this.plugin.app.vault.delete(a),await this.end_templater_task(l);return}if(await this.plugin.app.vault.modify(a,d),this.plugin.app.workspace.trigger("templater:new-note-from-template",{file:a,content:d}),i){let m=this.plugin.app.workspace.getLeaf(!1);if(!m){oe(new P("No active leaf"));return}await m.openFile(a,{state:{mode:"source"}}),await this.plugin.editor_handler.jump_to_next_cursor_location(a,!0),m.setEphemeralState({rename:"all"})}return await this.end_templater_task(l),a}async append_template_to_active_file(e){let t=this.plugin.app.workspace.getActiveViewOfType(de.MarkdownView),r=this.plugin.app.workspace.activeEditor;if(!r||!r.file||!r.editor){oe(new P("No active editor, can't append templates."));return}let{path:i}=r.file;this.start_templater_task(i);let o=this.create_running_config(e,r.file,1),a=await Se(async()=>this.read_and_parse_template(o),"Template parsing error, aborting.");if(a==null){await this.end_templater_task(i);return}let{content:l,frontmatter:c}=yn(a),m=r.editor.getDoc(),_=m.listSelections();m.replaceSelection(l),t&&(Object.keys(c).length>0&&t instanceof de.MarkdownView&&typeof t.metadataEditor?.insertProperties=="function"&&t.metadataEditor.insertProperties(c),await yt(100),await t.save()),this.plugin.app.workspace.trigger("templater:template-appended",{view:t,editor:r,content:a,oldSelections:_,newSelections:m.listSelections()}),await this.plugin.editor_handler.jump_to_next_cursor_location(r.file,!0),await this.end_templater_task(i)}async write_template_to_file(e,t){let{path:r}=t;this.start_templater_task(r);let i=this.plugin.app.workspace.getActiveViewOfType(de.MarkdownView),o=this.plugin.app.workspace.activeEditor,a=Xt(this.plugin.app),l=this.create_running_config(e,t,2),c=await Se(async()=>this.read_and_parse_template(l),"Template parsing error, aborting.");if(c==null){await this.end_templater_task(r);return}let{content:d,frontmatter:m}=yn(c);if(a?.path===t.path&&o&&o.editor&&i){let _="",{content:w,frontmatter:b}=yn(o.editor.getValue());pr(b,m),Object.keys(b).length>0&&(_+=`--- -${(0,de.stringifyYaml)(b)}--- -`),_+=w+d,o.editor.setValue(_),o.editor.setSelection({line:0,ch:0},{line:0,ch:0}),await yt(100),await i.save()}else await this.plugin.app.vault.process(t,_=>{let w="",{content:b,frontmatter:S}=yn(_);return pr(S,m),Object.keys(S).length>0&&(w+=`--- -${(0,de.stringifyYaml)(S)}--- -`),w+=b+d,c=w,w});this.plugin.app.workspace.trigger("templater:new-note-from-template",{file:t,content:c}),await this.plugin.editor_handler.jump_to_next_cursor_location(t,!0),await this.end_templater_task(r)}overwrite_active_file_commands(){let e=this.plugin.app.workspace.activeEditor;if(!e||!e.file){oe(new P("Active editor is null, can't overwrite content"));return}this.overwrite_file_commands(e.file,!0)}async overwrite_file_commands(e,t=!1){let{path:r}=e;this.start_templater_task(r);let i=this.create_running_config(e,e,t?3:2),o=await Se(async()=>this.read_and_parse_template(i),"Template parsing error, aborting.");if(o==null){await this.end_templater_task(r);return}await this.plugin.app.vault.modify(e,o),this.plugin.app.workspace.trigger("templater:overwrite-file",{file:e,content:o}),await this.plugin.editor_handler.jump_to_next_cursor_location(e,!0),await this.end_templater_task(r)}async process_dynamic_templates(e,t){let r=ao(),i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT),o,a=!1,l;for(;o=i.nextNode();){let c=o.nodeValue;if(c!==null){let d=r.exec(c);if(d!==null){let m=this.plugin.app.metadataCache.getFirstLinkpathDest("",t.sourcePath);if(!m||!(m instanceof de.TFile))return;if(!a){a=!0;let _=this.create_running_config(m,m,4);l=await this.functions_generator.generate_object(_,Qe.USER_INTERNAL),this.current_functions_object=l}}for(;d!=null;){let m=d[1]+d[2],_=await Se(async()=>await this.parser.parse_commands(m,l),`Command Parsing error in dynamic command '${m}'`);if(_==null)return;let w=r.lastIndex-d[0].length,b=r.lastIndex;c=c.substring(0,w)+_+c.substring(b),r.lastIndex+=_.length-d[0].length,d=r.exec(c)}o.nodeValue=c}}}get_new_file_template_for_folder(e){do{let t=this.plugin.settings.folder_templates.find(r=>r.folder==e.path);if(t&&t.template)return t.template;e=e.parent}while(e)}get_new_file_template_for_file(e){let t=this.plugin.settings.file_templates.find(r=>new RegExp(r.regex).test(e.path));if(t&&t.template)return t.template}static async on_file_creation(e,t,r){if(!(r instanceof de.TFile)||r.extension!=="md")return;let i=(0,de.normalizePath)(e.plugin.settings.templates_folder);if(r.path.includes(i)&&i!=="/"||(await yt(300),e.files_with_pending_templates.has(r.path)))return;let o=await t.vault.read(r),a=(0,de.getFrontMatterInfo)(o),l=o.length-a.contentStart;if(l==0&&e.plugin.settings.enable_folder_templates){let c=e.get_new_file_template_for_folder(r.parent);if(!c)return;let d=await Se(async()=>Nt(t,c),`Couldn't find template ${c}`);if(d==null)return;await e.write_template_to_file(d,r)}else if(l==0&&e.plugin.settings.enable_file_templates){let c=e.get_new_file_template_for_file(r);if(!c)return;let d=await Se(async()=>Nt(t,c),`Couldn't find template ${c}`);if(d==null)return;await e.write_template_to_file(d,r)}else{let c=1e5;r.stat.size<=c?await e.overwrite_file_commands(r):console.log(`Templater skipped parsing ${r.path} because file size exceeds ${c}`)}}async execute_startup_scripts(){for(let e of this.plugin.settings.startup_templates){if(!e)continue;let t=Ce(()=>Nt(this.plugin.app,e),`Couldn't find startup template "${e}"`);if(!t)continue;let{path:r}=t;this.start_templater_task(r);let i=this.create_running_config(t,t,5);await Se(async()=>this.read_and_parse_template(i),"Startup Template parsing error, aborting."),await this.end_templater_task(r)}}};var Jo=X(require("obsidian")),wr=class{constructor(e,t,r){this.plugin=e;this.templater=t;this.settings=r}setup(){Array.isArray(this.plugin.app.workspace.onLayoutReadyCallbacks)?this.plugin.app.workspace.onLayoutReadyCallbacks.unshift({pluginId:this.plugin.manifest.id,callback:()=>{this.update_trigger_file_on_creation()}}):this.plugin.app.workspace.onLayoutReady(()=>{this.update_trigger_file_on_creation()}),this.update_syntax_highlighting(),this.update_file_menu()}update_syntax_highlighting(){let e=this.plugin.editor_handler.desktopShouldHighlight(),t=this.plugin.editor_handler.mobileShouldHighlight();e||t?this.plugin.editor_handler.enable_highlighter():this.plugin.editor_handler.disable_highlighter()}update_trigger_file_on_creation(){this.settings.trigger_on_file_creation?(this.trigger_on_file_creation_event=this.plugin.app.vault.on("create",e=>Pn.on_file_creation(this.templater,this.plugin.app,e)),this.plugin.registerEvent(this.trigger_on_file_creation_event)):this.trigger_on_file_creation_event&&(this.plugin.app.vault.offref(this.trigger_on_file_creation_event),this.trigger_on_file_creation_event=void 0)}update_file_menu(){this.plugin.registerEvent(this.plugin.app.workspace.on("file-menu",(e,t)=>{t instanceof Jo.TFolder&&e.addItem(r=>{r.setTitle("Create new note from template").setIcon("templater-icon").onClick(()=>{this.plugin.fuzzy_suggester.create_new_note_from_template(t)})})}))}};var br=X(require("obsidian"));var ki=class{constructor(e){this.plugin=e}setup(){this.plugin.addCommand({id:"insert-templater",name:"Open insert template modal",icon:"templater-icon",hotkeys:br.Platform.isMacOS?void 0:[{modifiers:["Alt"],key:"e"}],callback:()=>{this.plugin.fuzzy_suggester.insert_template()}}),this.plugin.addCommand({id:"replace-in-file-templater",name:"Replace templates in the active file",icon:"templater-icon",hotkeys:br.Platform.isMacOS?void 0:[{modifiers:["Alt"],key:"r"}],callback:()=>{this.plugin.templater.overwrite_active_file_commands()}}),this.plugin.addCommand({id:"jump-to-next-cursor-location",name:"Jump to next cursor location",icon:"text-cursor",hotkeys:[{modifiers:["Alt"],key:"Tab"}],callback:()=>{this.plugin.editor_handler.jump_to_next_cursor_location()}}),this.plugin.addCommand({id:"create-new-note-from-template",name:"Create new note from template",icon:"templater-icon",hotkeys:br.Platform.isMacOS?void 0:[{modifiers:["Alt"],key:"n"}],callback:()=>{this.plugin.fuzzy_suggester.create_new_note_from_template()}}),this.register_templates_hotkeys()}register_templates_hotkeys(){this.plugin.settings.enabled_templates_hotkeys.forEach(e=>{e&&this.add_template_hotkey(null,e)})}add_template_hotkey(e,t){if(this.remove_template_hotkey(e),t){let r=this.plugin.settings.templates_folder?this.plugin.settings.templates_folder.length+1:0,i=t.slice(r,-3);this.plugin.addCommand({id:t,name:`Insert ${i}`,icon:"templater-icon",callback:()=>{let o=Ce(()=>Nt(this.plugin.app,t),"Couldn't find the template file associated with this hotkey");!o||this.plugin.templater.append_template_to_active_file(o)}}),this.plugin.addCommand({id:`create-${t}`,name:`Create ${i}`,icon:"templater-icon",callback:()=>{let o=Ce(()=>Nt(this.plugin.app,t),"Couldn't find the template file associated with this hotkey");!o||this.plugin.templater.create_new_note_from_template(o)}})}}remove_template_hotkey(e){e&&(this.plugin.removeCommand(`${e}`),this.plugin.removeCommand(`create-${e}`))}};var Mi=X(require("obsidian"));var Si=X(require("obsidian"));var Ci=class{constructor(e){this.app=e}async jump_to_next_cursor_location(){let e=this.app.workspace.activeEditor;if(!e?.editor)return;let t=e.editor.getValue(),{cursor_matches:r,positions:i}=this.get_cursor_matches_and_positions(t);if(!i||!r)return;let o=e instanceof Si.MarkdownView?e.currentMode.getFoldInfo():null,a=[];for(let l=r.length-1;l>=0;l--){let c=r[l],d=this.get_editor_position_from_index(t,c.index),m=this.get_editor_position_from_index(t,c.index+c[0].length);a.push({from:d,to:m,text:""})}e.editor.transaction({changes:a,selections:i.map(l=>({from:l}))}),o&&Array.isArray(o.folds)&&(i.forEach(l=>{o.folds=o.folds.filter(c=>c.from>l.line||c.to[0-9]*)\)\s*%>/g,r=Array.from(e.matchAll(t));if(r.length===0)return{};r.sort((d,m)=>Number(d.groups?.order||0)-Number(m.groups?.order||0));let i=r[0][0],o=r.filter(d=>d[0]===i),a=o[0][1]===""?[o[0]]:o,l=[],c=0;for(let d of a){let m=d.index-c;l.push(this.get_editor_position_from_index(e,m)),e=e.slice(0,m)+e.slice(m+d[0].length),c+=d[0].length}return{cursor_matches:a,positions:l}}};var ea=X(require("obsidian"));var ec={app:{name:"app",description:"This module exposes the app instance. Prefer to use this over the global app instance."},user:{name:"user",description:"This module exposes custom made scripts, written by yourself within the script file folder location"},config:{name:"config",description:`This module exposes Templater's running configuration. - -This is mostly useful when writing scripts requiring some context information. -`,functions:{template_file:{name:"template_file",description:"The `TFile` object representing the template file.",definition:"tp.config.template_file"},target_file:{name:"target_file",description:"The `TFile` object representing the target file where the template will be inserted.",definition:"tp.config.target_file"},run_mode:{name:"run_mode",description:"The `RunMode`, representing the way Templater was launched (Create new from template, Append to active file, ...).",definition:"tp.config.run_mode"},active_file:{name:"active_file",description:"The active file (if existing) when launching Templater.",definition:"tp.config.active_file?"}}},date:{name:"date",description:"This module contains every internal function related to dates.",functions:{now:{name:"now",description:"Retrieves the date.",definition:'tp.date.now(format: string = "YYYY-MM-DD", offset?: number\u23AEstring, reference?: string, reference_format?: string)',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'},{name:"offset",description:"Duration to offset the date from. If a number is provided, duration will be added to the date in days. You can also specify the offset as a string using the ISO 8601 format."},{name:"reference",description:"The date referential, e.g. set this to the note's title."},{name:"reference_format",description:"The format for the reference date. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/)."}],examples:[{name:"Date now",example:"<% tp.date.now() %>"},{name:"Date now with format",example:'<% tp.date.now("Do MMMM YYYY") %>'},{name:"Last week",example:'<% tp.date.now("YYYY-MM-DD", -7) %>'},{name:"Next week",example:'<% tp.date.now("YYYY-MM-DD", 7) %>'},{name:"Last month",example:'<% tp.date.now("YYYY-MM-DD", "P-1M") %>'},{name:"Next year",example:'<% tp.date.now("YYYY-MM-DD", "P1Y") %>'},{name:"File's title date + 1 day (tomorrow)",example:'<% tp.date.now("YYYY-MM-DD", 1, tp.file.title, "YYYY-MM-DD") %>'},{name:"File's title date - 1 day (yesterday)",example:'<% tp.date.now("YYYY-MM-DD", -1, tp.file.title, "YYYY-MM-DD") %>'}]},tomorrow:{name:"tomorrow",description:"Retrieves tomorrow's date.",definition:'tp.date.tomorrow(format: string = "YYYY-MM-DD")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"Date tomorrow",example:"<% tp.date.tomorrow() %>"},{name:"Date tomorrow with format",example:'<% tp.date.tomorrow("Do MMMM YYYY") %>'}]},yesterday:{name:"yesterday",description:"Retrieves yesterday's date.",definition:'tp.date.yesterday(format: string = "YYYY-MM-DD")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"Date yesterday",example:"<% tp.date.yesterday() %>"},{name:"Date yesterday with format",example:'<% tp.date.yesterday("Do MMMM YYYY") %>'}]},weekday:{name:"weekday",description:"",definition:'tp.date.weekday(format: string = "YYYY-MM-DD", weekday: number, reference?: string, reference_format?: string)',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'},{name:"weekday",description:"Week day number. If the locale assigns Monday as the first day of the week, `0` will be Monday, `-7` will be last week's day."},{name:"reference",description:"The date referential, e.g. set this to the note's title."},{name:"reference_format",description:"The format for the reference date. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/)."}],examples:[{name:"This week's Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 0) %>'},{name:"Next Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 7) %>'},{name:"File's title Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 0, tp.file.title, "YYYY-MM-DD") %>'},{name:"File's title previous Monday",example:'<% tp.date.weekday("YYYY-MM-DD", -7, tp.file.title, "YYYY-MM-DD") %>'}]}},momentjs:{examples:[{name:"Date now",example:'<% moment(tp.file.title, "YYYY-MM-DD").format("YYYY-MM-DD") %>'},{name:"Get start of month from note title",example:'<% moment(tp.file.title, "YYYY-MM-DD").startOf("month").format("YYYY-MM-DD") %>'},{name:"Get end of month from note title",example:'<% moment(tp.file.title, "YYYY-MM-DD").endOf("month").format("YYYY-MM-DD") %>'}]}},file:{name:"file",description:"This module contains every internal function related to files.",functions:{content:{name:"content",description:"The string contents of the file at the time that Templater was executed. Manipulating this string will *not* update the current file.",definition:"tp.file.content",examples:[{name:"Retrieve file content",example:"<% tp.file.content %>"}]},create_new:{name:"create_new",description:"Creates a new file using a specified template or with a specified content.",definition:"tp.file.create_new(template: TFile \u23AE string, filename?: string, open_new: boolean = false, folder?: TFolder | string)",args:[{name:"template",description:"Either the template used for the new file content, or the file content as a string. If it is the template to use, you retrieve it with `tp.file.find_tfile(TEMPLATENAME)`."},{name:"filename",description:'The filename of the new file, defaults to "Untitled".'},{name:"open_new",description:"Whether to open or not the newly created file. Warning: if you use this option, since commands are executed asynchronously, the file can be opened first and then other commands are appended to that new file and not the previous file."},{name:"folder",description:'The folder to put the new file in, defaults to Obsidian\'s default location. If you want the file to appear in a different folder, specify it with `"PATH/TO/FOLDERNAME"` or `tp.app.vault.getAbstractFileByPath("PATH/TO/FOLDERNAME")`.'}],examples:[{name:"File creation",example:'<%* await tp.file.create_new("MyFileContent", "MyFilename") %>'},{name:"File creation with template",example:'<%* await tp.file.create_new(tp.file.find_tfile("MyTemplate"), "MyFilename") %>'},{name:"File creation and open created note",example:'<%* await tp.file.create_new("MyFileContent", "MyFilename", true) %>'},{name:"File creation in current folder",example:'<%* await tp.file.create_new("MyFileContent", "MyFilename", false, tp.file.folder(true)) %>'},{name:"File creation in specified folder with string path",example:'<%* await tp.file.create_new("MyFileContent", "MyFilename", false, "Path/To/MyFolder") %>'},{name:"File creation in specified folder with TFolder",example:'<%* await tp.file.create_new("MyFileContent", "MyFilename", false, tp.app.vault.getAbstractFileByPath("MyFolder")) %>'},{name:"File creation and append link to current note",example:'[[<% (await tp.file.create_new("MyFileContent", "MyFilename")).basename %>]]'}]},creation_date:{name:"creation_date",description:"Retrieves the file's creation date.",definition:'tp.file.creation_date(format: string = "YYYY-MM-DD HH:mm")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD HH:mm"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"File creation date",example:"<% tp.file.creation_date() %>"},{name:"File creation date with format",example:'<% tp.file.creation_date("dddd Do MMMM YYYY HH:mm") %>'}]},cursor:{name:"cursor",description:`Sets the cursor to this location after the template has been inserted. - -You can navigate between the different cursors using the configured hotkey in Obsidian settings. -`,definition:"tp.file.cursor(order?: number)",args:[{name:"order",description:`The order of the different cursors jump, e.g. it will jump from 1 to 2 to 3, and so on. -If you specify multiple tp.file.cursor with the same order, the editor will switch to multi-cursor. -`}],examples:[{name:"File cursor",example:"<% tp.file.cursor() %>"},{name:"File multi-cursor",example:"<% tp.file.cursor(1) %>Content<% tp.file.cursor(1) %>"}]},cursor_append:{name:"cursor_append",description:"Appends some content after the active cursor in the file.",definition:"tp.file.cursor_append(content: string)",args:[{name:"content",description:"The content to append after the active cursor."}],examples:[{name:"File cursor append",example:'<% tp.file.cursor_append("Some text") %>'}]},exists:{name:"exists",description:"Check to see if a file exists by it's file path. The full path to the file, relative to the Vault and containing the extension, must be provided.",definition:"tp.file.exists(filepath: string)",args:[{name:"filepath",description:"The full file path of the file we want to check existence for."}],examples:[{name:"File existence",example:'<% await tp.file.exists("MyFolder/MyFile.md") %>'},{name:"File existence of current file",example:'<% await tp.file.exists(tp.file.folder(true) + "/" + tp.file.title + ".md") %>'}]},find_tfile:{name:"find_tfile",description:"Search for a file and returns its `TFile` instance.",definition:"tp.file.find_tfile(filename: string)",args:[{name:"filename",description:"The filename we want to search and resolve as a `TFile`."}],examples:[{name:"File find TFile",example:'<% tp.file.find_tfile("MyFile").basename %>'}]},folder:{name:"folder",description:"Retrieves the file's folder name.",definition:"tp.file.folder(absolute: boolean = false)",args:[{name:"absolute",description:"If set to `true`, returns the vault-absolute path of the folder. If `false`, only returns the basename of the folder (the last part). Defaults to `false`."}],examples:[{name:"File folder (Folder)",example:"<% tp.file.folder() %>"},{name:"File folder with vault-absolute path (Path/To/Folder)",example:"<% tp.file.folder(true) %>"}]},include:{name:"include",description:"Includes the file's link content. Templates in the included content will be resolved.",definition:"tp.file.include(include_link: string \u23AE TFile)",args:[{name:"include_link",description:'The link to the file to include, e.g. `"[[MyFile]]"`, or a TFile object. Also supports sections or blocks inclusions.'}],examples:[{name:"File include",example:'<% await tp.file.include("[[Template1]]") %>'},{name:"File include TFile",example:'<% await tp.file.include(tp.file.find_tfile("MyFile")) %>'},{name:"File include section",example:'<% await tp.file.include("[[MyFile#Section1]]") %>'},{name:"File include block",example:'<% await tp.file.include("[[MyFile#^block1]]") %>'}]},last_modified_date:{name:"last_modified_date",description:"Retrieves the file's last modification date.",definition:'tp.file.last_modified_date(format: string = "YYYY-MM-DD HH:mm")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD HH:mm"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"File last modified date",example:"<% tp.file.last_modified_date() %>"},{name:"File last modified date with format",example:'<% tp.file.last_modified_date("dddd Do MMMM YYYY HH:mm") %>'}]},move:{name:"move",description:"Moves the file to the desired vault location.",definition:"tp.file.move(new_path: string, file_to_move?: TFile)",args:[{name:"new_path",description:'The new vault relative path of the file, without the file extension. Note: the new path needs to include the folder and the filename, e.g. `"/Notes/MyNote"`.'},{name:"file_to_move",description:"The file to move, defaults to the current file."}],examples:[{name:"File move",example:'<%* await tp.file.move("/A/B/" + tp.file.title) %>'},{name:"File move and rename",example:'<%* await tp.file.move("/A/B/NewTitle") %>'}]},path:{name:"path",description:"Retrieves the file's absolute path on the system.",definition:"tp.file.path(relative: boolean = false)",args:[{name:"relative",description:"If set to `true`, only retrieves the vault's relative path."}],examples:[{name:"File path",example:"<% tp.file.path() %>"},{name:"File relative path (relative to vault root)",example:"<% tp.file.path(true) %>"}]},rename:{name:"rename",description:"Renames the file (keeps the same file extension).",definition:"tp.file.rename(new_title: string)",args:[{name:"new_title",description:"The new file title."}],examples:[{name:"File rename",example:'<%* await tp.file.rename("MyNewName") %>'},{name:"File append a 2 to the file name",example:'<%* await tp.file.rename(tp.file.title + "2") %>'}]},selection:{name:"selection",description:"Retrieves the active file's text selection.",definition:"tp.file.selection()",examples:[{name:"File selection",example:"<% tp.file.selection() %>"}]},tags:{name:"tags",description:"Retrieves the file's tags (array of string).",definition:"tp.file.tags",examples:[{name:"File tags",example:"<% tp.file.tags %>"}]},title:{name:"title",definition:"tp.file.title",description:"Retrieves the file's title.",examples:[{name:"File title",example:"<% tp.file.title %>"},{name:"Strip the Zettelkasten ID of title (if space separated)",example:'<% tp.file.title.split(" ")[1] %>'}]}}},frontmatter:{name:"frontmatter",description:"This modules exposes all the frontmatter variables of a file as variables."},hooks:{name:"hooks",description:"This module exposes hooks that allow you to execute code when a Templater event occurs.",functions:{on_all_templates_executed:{name:"on_all_templates_executed",description:"Hooks into when all actively running templates have finished executing. Most of the time this will be a single template, unless you are using `tp.file.include` or `tp.file.create_new`.\n\nMultiple invokations of this method will have their callback functions run in parallel.",definition:"tp.hooks.on_all_templates_executed(callback_function: () => any)",args:[{name:"callback_function",description:"Callback function that will be executed when all actively running templates have finished executing."}]}}},obsidian:{name:"obsidian",description:"This module exposes all the functions and classes from the Obsidian API."},system:{name:"system",description:"This module contains system related functions.",functions:{clipboard:{name:"clipboard",description:"Retrieves the clipboard's content.",definition:"tp.system.clipboard()",examples:[{name:"Clipboard",example:"<% tp.system.clipboard() %>"}]},prompt:{name:"prompt",description:"Spawns a prompt modal and returns the user's input.",definition:"tp.system.prompt(prompt_text?: string, default_value?: string, throw_on_cancel: boolean = false, multiline?: boolean = false)",args:[{name:"prompt_text",description:"Text placed above the input field."},{name:"default_value",description:"A default value for the input field."},{name:"throw_on_cancel",description:"Throws an error if the prompt is canceled, instead of returning a `null` value."},{name:"multiline",description:"If set to `true`, the input field will be a multiline textarea. Defaults to `false`."}],examples:[{name:"Prompt",example:'<% await tp.system.prompt("Please enter a value") %>'},{name:"Prompt with default value",example:'<% await tp.system.prompt("What is your mood today?", "happy") %>'},{name:"Multiline prompt",example:'<% await tp.system.prompt("What is your mood today?", null, false, true) %>'},{name:"Reuse output from prompt",example:`<%* -let value = await tp.system.prompt("Please enter a value"); -%> -# <% value %> -selected value: <% value %>`}]},suggester:{name:"suggester",description:"Spawns a suggester prompt and returns the user's chosen item.",definition:'tp.system.suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = "", limit?: number = undefined)',args:[{name:"text_items",description:"Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation."},{name:"items",description:"Array containing the values of each item in the correct order."},{name:"throw_on_cancel",description:"Throws an error if the prompt is canceled, instead of returning a `null` value."},{name:"placeholder",description:"Placeholder string of the prompt."},{name:"limit",description:"Limit the number of items rendered at once (useful to improve performance when displaying large lists)."}],examples:[{name:"Suggester",example:'<% await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>'},{name:"Suggester with mapping function (same as above example)",example:'<% await tp.system.suggester((item) => item, ["Happy", "Sad", "Confused"]) %>'},{name:"Suggester for files",example:"[[<% (await tp.system.suggester((item) => item.basename, tp.app.vault.getMarkdownFiles())).basename %>]]"},{name:"Suggester for tags",example:'<% await tp.system.suggester(item => item, Object.keys(tp.app.metadataCache.getTags()).map(x => x.replace("#", ""))) %>'},{name:"Reuse value from suggester",example:`<%* -let selectedValue = await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]); -%> -# <% selectedValue %> -selected value: <% selectedValue %>`}]},multi_suggester:{name:"multi_suggester",description:"Spawns a suggester prompt that supports selecting multiple items and returns the user's chosen items.",definition:'tp.system.multi_suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, title: string = "", limit?: number = undefined)',args:[{name:"text_items",description:"Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation."},{name:"items",description:"Array containing the values of each item in the correct order."},{name:"throw_on_cancel",description:"Throws an error if the prompt is canceled, instead of returning a `null` value."},{name:"title",description:"Text placed at the top of the modal."},{name:"limit",description:"Limit the number of items rendered at once (useful to improve performance when displaying large lists)."}],examples:[{name:"Multi-suggester",example:'<% await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>'},{name:"Multi-suggester with mapping function (same as above example)",example:'<% await tp.system.multi_suggester((item) => item, ["Happy", "Sad", "Confused"]) %>'},{name:"Multi-suggester for files",example:"<% (await tp.system.multi_suggester((item) => item.basename, tp.app.vault.getMarkdownFiles())).map(f => `[[${f.basename}]]`) %>"},{name:"Multi-suggester for tags",example:'<% await tp.system.multi_suggester(item => item, Object.keys(tp.app.metadataCache.getTags()).map(x => x.replace("#", ""))) %>'},{name:"Reuse value from multi-suggester",example:`<%* -let selectedValues = await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]); -%> -# <% selectedValues %> -selected values: <% selectedValues %>`}]}}},web:{name:"web",description:"This modules contains every internal function related to the web (making web requests).",functions:{daily_quote:{name:"daily_quote",description:"Retrieves and parses the daily quote from `https://github.com/Zachatoo/quotes-database` as a callout.",definition:"tp.web.daily_quote()",examples:[{name:"Daily quote",example:"<% await tp.web.daily_quote() %>"}]},random_picture:{name:"random_picture",description:"Gets a random image from `https://unsplash.com/`.",definition:"tp.web.random_picture(size?: string, query?: string, include_size?: boolean)",args:[{name:"size",description:"Image size in the format `x`."},{name:"query",description:"Limits selection to photos matching a search term. Multiple search terms can be passed separated by a comma."},{name:"include_size",description:"Optional argument to include the specified size in the image link markdown. Defaults to false."}],examples:[{name:"Random picture",example:"<% await tp.web.random_picture() %>"},{name:"Random picture with size",example:'<% await tp.web.random_picture("200x200") %>'},{name:"Random picture with size and query",example:'<% await tp.web.random_picture("200x200", "landscape,water") %>'}]},request:{name:"request",description:"Makes a HTTP request to the specified URL. Optionally, you can specify a path to extract specific data from the response.",definition:"tp.web.request(url: string, path?: string)",args:[{name:"url",description:"The URL to which the HTTP request will be made."},{name:"path",description:"A path within the response JSON to extract specific data."}],examples:[{name:"Simple request",example:'<% await tp.web.request("https://jsonplaceholder.typicode.com/todos/1") %>'},{name:"Request with path",example:'<% await tp.web.request("https://jsonplaceholder.typicode.com/todos", "0.title") %>'}]}}}},Xo={tp:ec};var tc=["app","config","date","file","frontmatter","hooks","obsidian","system","user","web"],nc=new Set(tc);function Zo(n){return typeof n=="string"&&nc.has(n)}function Di(n){return!!(n.definition||n.returns||n.args)}var Pi=class{constructor(e){this.plugin=e;this.documentation=Xo}get_all_modules_documentation(){let e=this.documentation.tp;return(!this.plugin.settings||!this.plugin.settings.user_scripts_folder)&&(e=Object.values(e).filter(t=>t.name!=="user")),Object.values(e).map(t=>(t.queryKey=t.name,t))}async get_all_functions_documentation(e,t){if(e==="app")return this.get_app_functions_documentation(this.plugin.app,t);if(e==="user"){if(!this.plugin.settings||!this.plugin.settings.user_scripts_folder)return;let r=await Se(async()=>{let i=Je(this.plugin.app,this.plugin.settings.user_scripts_folder).filter(a=>a.extension=="js");return await so(this.plugin.app,i)},"User Scripts folder doesn't exist");return!r||r.length===0?void 0:r.reduce((i,o)=>o.extension!=="js"?i:[...i,{name:o.basename,queryKey:o.basename,definition:"",description:o.description,returns:o.returns,args:o.arguments.reduce((l,c)=>(l[c.name]={name:c.name,description:c.description},l),{}),example:""}],[])}if(!!this.documentation.tp[e].functions)return Object.values(this.documentation.tp[e].functions).map(r=>(r.queryKey=r.name,r))}get_app_functions_documentation(e,t){if(!xn(e))return[];let r=t.split(".");if(r.length===0)return[];let i=e;for(let c=0;c[a-z]*)?(?\.(?[a-zA-Z_.]*)?)?$/;this.documentation=new Pi(e),this.intellisense_render_setting=e.settings.intellisense_render}onTrigger(e,t,r){let i=t.getRange({line:e.line,ch:0},{line:e.line,ch:e.ch}),o=this.tp_keyword_regex.exec(i);if(!o)return null;let a,l=o.groups&&o.groups.module||"";if(this.module_name=l,o.groups&&o.groups.fn_trigger){if(l==""||!Zo(l))return null;this.function_trigger=!0,this.function_name=o.groups.fn||"",a=this.function_name}else this.function_trigger=!1,a=this.module_name;let c={start:{line:e.line,ch:e.ch-a.length},end:{line:e.line,ch:e.ch},query:a};return this.latest_trigger_info=c,c}async getSuggestions(e){let t;return this.module_name&&this.function_trigger?t=await this.documentation.get_all_functions_documentation(this.module_name,this.function_name):t=this.documentation.get_all_modules_documentation(),t?t.filter(r=>r.queryKey.toLowerCase().startsWith(e.query.toLowerCase())):[]}renderSuggestion(e,t){if(t.createEl("b",{text:e.name}),Di(e)){if(e.args&&this.getNumberOfArguments(e.args)>0&&Fo(this.intellisense_render_setting)){t.createEl("p",{text:"Parameter list:"});let r=t.createEl("ol");for(let[i,o]of Object.entries(e.args))Ur(r,i,o.description)}e.returns&&Io(this.intellisense_render_setting)&&Ur(t,"Returns",e.returns)}this.function_trigger&&Di(e)&&t.createEl("code",{text:e.definition}),e.description&&qo(this.intellisense_render_setting)&&t.createEl("div",{text:e.description})}selectSuggestion(e,t){let r=this.app.workspace.activeEditor;if(!(!r||!r.editor)&&(r.editor.replaceRange(e.queryKey,this.latest_trigger_info.start,this.latest_trigger_info.end),this.latest_trigger_info.start.ch==this.latest_trigger_info.end.ch)){let i=this.latest_trigger_info.end;i.ch+=e.queryKey.length,r.editor.setCursor(i)}}getNumberOfArguments(e){try{return new Map(Object.entries(e)).size}catch{return 0}}updateAutocompleteIntellisenseSetting(e){this.intellisense_render_setting=e}};(function(n){n(window.CodeMirror)})(function(n){"use strict";n.defineMode("javascript",function(e,t){var r=e.indentUnit,i=t.statementIndent,o=t.jsonld,a=t.json||o,l=t.trackScope!==!1,c=t.typescript,d=t.wordCharacters||/[\w$\xa1-\uffff]/,m=function(){function s(ve){return{type:ve,style:"keyword"}}var p=s("keyword a"),A=s("keyword b"),x=s("keyword c"),I=s("keyword d"),Y=s("operator"),z={type:"atom",style:"atom"};return{if:s("if"),while:p,with:p,else:A,do:A,try:A,finally:A,return:I,break:I,continue:I,new:s("new"),delete:x,void:x,throw:x,debugger:s("debugger"),var:s("var"),const:s("var"),let:s("var"),function:s("function"),catch:s("catch"),for:s("for"),switch:s("switch"),case:s("case"),default:s("default"),in:Y,typeof:Y,instanceof:Y,true:z,false:z,null:z,undefined:z,NaN:z,Infinity:z,this:s("this"),class:s("class"),super:s("atom"),yield:x,export:s("export"),import:s("import"),extends:x,await:x}}(),_=/[+\-*&%=<>!?|~^@]/,w=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function b(s){for(var p=!1,A,x=!1;(A=s.next())!=null;){if(!p){if(A=="/"&&!x)return;A=="["?x=!0:x&&A=="]"&&(x=!1)}p=!p&&A=="\\"}}var S,k;function E(s,p,A){return S=s,k=A,p}function O(s,p){var A=s.next();if(A=='"'||A=="'")return p.tokenize=$(A),p.tokenize(s,p);if(A=="."&&s.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return E("number","number");if(A=="."&&s.match(".."))return E("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(A))return E(A);if(A=="="&&s.eat(">"))return E("=>","operator");if(A=="0"&&s.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return E("number","number");if(/\d/.test(A))return s.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),E("number","number");if(A=="/")return s.eat("*")?(p.tokenize=K,K(s,p)):s.eat("/")?(s.skipToEnd(),E("comment","comment")):Wi(s,p,1)?(b(s),s.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),E("regexp","string-2")):(s.eat("="),E("operator","operator",s.current()));if(A=="`")return p.tokenize=D,D(s,p);if(A=="#"&&s.peek()=="!")return s.skipToEnd(),E("meta","meta");if(A=="#"&&s.eatWhile(d))return E("variable","property");if(A=="<"&&s.match("!--")||A=="-"&&s.match("->")&&!/\S/.test(s.string.slice(0,s.start)))return s.skipToEnd(),E("comment","comment");if(_.test(A))return(A!=">"||!p.lexical||p.lexical.type!=">")&&(s.eat("=")?(A=="!"||A=="=")&&s.eat("="):/[<>*+\-|&?]/.test(A)&&(s.eat(A),A==">"&&s.eat(A))),A=="?"&&s.eat(".")?E("."):E("operator","operator",s.current());if(d.test(A)){s.eatWhile(d);var x=s.current();if(p.lastType!="."){if(m.propertyIsEnumerable(x)){var I=m[x];return E(I.type,I.style,x)}if(x=="async"&&s.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return E("async","keyword",x)}return E("variable","variable",x)}}function $(s){return function(p,A){var x=!1,I;if(o&&p.peek()=="@"&&p.match(w))return A.tokenize=O,E("jsonld-keyword","meta");for(;(I=p.next())!=null&&!(I==s&&!x);)x=!x&&I=="\\";return x||(A.tokenize=O),E("string","string")}}function K(s,p){for(var A=!1,x;x=s.next();){if(x=="/"&&A){p.tokenize=O;break}A=x=="*"}return E("comment","comment")}function D(s,p){for(var A=!1,x;(x=s.next())!=null;){if(!A&&(x=="`"||x=="$"&&s.eat("{"))){p.tokenize=O;break}A=!A&&x=="\\"}return E("quasi","string-2",s.current())}var H="([{}])";function F(s,p){p.fatArrowAt&&(p.fatArrowAt=null);var A=s.string.indexOf("=>",s.start);if(!(A<0)){if(c){var x=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(s.string.slice(s.start,A));x&&(A=x.index)}for(var I=0,Y=!1,z=A-1;z>=0;--z){var ve=s.string.charAt(z),We=H.indexOf(ve);if(We>=0&&We<3){if(!I){++z;break}if(--I==0){ve=="("&&(Y=!0);break}}else if(We>=3&&We<6)++I;else if(d.test(ve))Y=!0;else if(/["'\/`]/.test(ve))for(;;--z){if(z==0)return;var ya=s.string.charAt(z-1);if(ya==ve&&s.string.charAt(z-2)!="\\"){z--;break}}else if(Y&&!I){++z;break}}Y&&!I&&(p.fatArrowAt=z)}}var J={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,import:!0,"jsonld-keyword":!0};function te(s,p,A,x,I,Y){this.indented=s,this.column=p,this.type=A,this.prev=I,this.info=Y,x!=null&&(this.align=x)}function ne(s,p){if(!l)return!1;for(var A=s.localVars;A;A=A.next)if(A.name==p)return!0;for(var x=s.context;x;x=x.prev)for(var A=x.vars;A;A=A.next)if(A.name==p)return!0}function Q(s,p,A,x,I){var Y=s.cc;for(h.state=s,h.stream=I,h.marked=null,h.cc=Y,h.style=p,s.lexical.hasOwnProperty("align")||(s.lexical.align=!0);;){var z=Y.length?Y.pop():a?W:ee;if(z(A,x)){for(;Y.length&&Y[Y.length-1].lex;)Y.pop()();return h.marked?h.marked:A=="variable"&&ne(s,x)?"variable-2":p}}}var h={state:null,column:null,marked:null,cc:null};function C(){for(var s=arguments.length-1;s>=0;s--)h.cc.push(arguments[s])}function f(){return C.apply(null,arguments),!0}function Ie(s,p){for(var A=p;A;A=A.next)if(A.name==s)return!0;return!1}function Ee(s){var p=h.state;if(h.marked="def",!!l){if(p.context){if(p.lexical.info=="var"&&p.context&&p.context.block){var A=_e(s,p.context);if(A!=null){p.context=A;return}}else if(!Ie(s,p.localVars)){p.localVars=new ke(s,p.localVars);return}}t.globalVars&&!Ie(s,p.globalVars)&&(p.globalVars=new ke(s,p.globalVars))}}function _e(s,p){if(p)if(p.block){var A=_e(s,p.prev);return A?A==p.prev?p:new Ye(A,p.vars,!0):null}else return Ie(s,p.vars)?p:new Ye(p.prev,new ke(s,p.vars),!1);else return null}function xe(s){return s=="public"||s=="private"||s=="protected"||s=="abstract"||s=="readonly"}function Ye(s,p,A){this.prev=s,this.vars=p,this.block=A}function ke(s,p){this.name=s,this.next=p}var Rt=new ke("this",new ke("arguments",null));function Ue(){h.state.context=new Ye(h.state.context,h.state.localVars,!1),h.state.localVars=Rt}function Ze(){h.state.context=new Ye(h.state.context,h.state.localVars,!0),h.state.localVars=null}function ye(){h.state.localVars=h.state.context.vars,h.state.context=h.state.context.prev}ye.lex=!0;function B(s,p){var A=function(){var x=h.state,I=x.indented;if(x.lexical.type=="stat")I=x.lexical.indented;else for(var Y=x.lexical;Y&&Y.type==")"&&Y.align;Y=Y.prev)I=Y.indented;x.lexical=new te(I,h.stream.column(),s,null,x.lexical,p)};return A.lex=!0,A}function N(){var s=h.state;s.lexical.prev&&(s.lexical.type==")"&&(s.indented=s.lexical.indented),s.lexical=s.lexical.prev)}N.lex=!0;function q(s){function p(A){return A==s?f():s==";"||A=="}"||A==")"||A=="]"?C():f(p)}return p}function ee(s,p){return s=="var"?f(B("vardef",p),Cr,q(";"),N):s=="keyword a"?f(B("form"),Tt,ee,N):s=="keyword b"?f(B("form"),ee,N):s=="keyword d"?h.stream.match(/^\s*$/,!1)?f():f(B("stat"),tt,q(";"),N):s=="debugger"?f(q(";")):s=="{"?f(B("}"),Ze,Ln,N,ye):s==";"?f():s=="if"?(h.state.lexical.info=="else"&&h.state.cc[h.state.cc.length-1]==N&&h.state.cc.pop()(),f(B("form"),Tt,ee,N,Hi)):s=="function"?f(At):s=="for"?f(B("form"),Ze,$i,ee,ye,N):s=="class"||c&&p=="interface"?(h.marked="keyword",f(B("form",s=="class"?s:p),Ri,N)):s=="variable"?c&&p=="declare"?(h.marked="keyword",f(ee)):c&&(p=="module"||p=="enum"||p=="type")&&h.stream.match(/^\s*\w/,!1)?(h.marked="keyword",p=="enum"?f(Gi):p=="type"?f(Ki,q("operator"),V,q(";")):f(B("form"),Fe,q("{"),B("}"),Ln,N,N)):c&&p=="namespace"?(h.marked="keyword",f(B("form"),W,ee,N)):c&&p=="abstract"?(h.marked="keyword",f(ee)):f(B("stat"),Fn):s=="switch"?f(B("form"),Tt,q("{"),B("}","switch"),Ze,Ln,N,N,ye):s=="case"?f(W,q(":")):s=="default"?f(q(":")):s=="catch"?f(B("form"),Ue,et,ee,N,ye):s=="export"?f(B("stat"),ma,N):s=="import"?f(B("stat"),ga,N):s=="async"?f(ee):p=="@"?f(W,ee):C(B("stat"),W,q(";"),N)}function et(s){if(s=="(")return f(Ct,q(")"))}function W(s,p){return Nn(s,p,!1)}function je(s,p){return Nn(s,p,!0)}function Tt(s){return s!="("?C():f(B(")"),tt,q(")"),N)}function Nn(s,p,A){if(h.state.fatArrowAt==h.stream.start){var x=A?Bn:On;if(s=="(")return f(Ue,B(")"),se(Ct,")"),N,q("=>"),x,ye);if(s=="variable")return C(Ue,Fe,q("=>"),x,ye)}var I=A?gt:nt;return J.hasOwnProperty(s)?f(I):s=="function"?f(At,I):s=="class"||c&&p=="interface"?(h.marked="keyword",f(B("form"),da,N)):s=="keyword c"||s=="async"?f(A?je:W):s=="("?f(B(")"),tt,q(")"),N,I):s=="operator"||s=="spread"?f(A?je:W):s=="["?f(B("]"),Aa,N,I):s=="{"?ln(St,"}",null,I):s=="quasi"?C(kt,I):s=="new"?f(rt(A)):f()}function tt(s){return s.match(/[;\}\)\],]/)?C():C(W)}function nt(s,p){return s==","?f(tt):gt(s,p,!1)}function gt(s,p,A){var x=A==!1?nt:gt,I=A==!1?W:je;if(s=="=>")return f(Ue,A?Bn:On,ye);if(s=="operator")return/\+\+|--/.test(p)||c&&p=="!"?f(x):c&&p=="<"&&h.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?f(B(">"),se(V,">"),N,x):p=="?"?f(W,q(":"),I):f(I);if(s=="quasi")return C(kt,x);if(s!=";"){if(s=="(")return ln(je,")","call",x);if(s==".")return f(cn,x);if(s=="[")return f(B("]"),tt,q("]"),N,x);if(c&&p=="as")return h.marked="keyword",f(V,x);if(s=="regexp")return h.state.lastType=h.marked="operator",h.stream.backUp(h.stream.pos-h.stream.start-1),f(I)}}function kt(s,p){return s!="quasi"?C():p.slice(p.length-2)!="${"?f(kt):f(tt,Mn)}function Mn(s){if(s=="}")return h.marked="string-2",h.state.tokenize=D,f(kt)}function On(s){return F(h.stream,h.state),C(s=="{"?ee:W)}function Bn(s){return F(h.stream,h.state),C(s=="{"?ee:je)}function rt(s){return function(p){return p=="."?f(s?In:Yt):p=="variable"&&c?f(ca,s?gt:nt):C(s?je:W)}}function Yt(s,p){if(p=="target")return h.marked="keyword",f(nt)}function In(s,p){if(p=="target")return h.marked="keyword",f(gt)}function Fn(s){return s==":"?f(N,ee):C(nt,q(";"),N)}function cn(s){if(s=="variable")return h.marked="property",f()}function St(s,p){if(s=="async")return h.marked="property",f(St);if(s=="variable"||h.style=="keyword"){if(h.marked="property",p=="get"||p=="set")return f(qn);var A;return c&&h.state.fatArrowAt==h.stream.start&&(A=h.stream.match(/^\s*:\s*/,!1))&&(h.state.fatArrowAt=h.stream.pos+A[0].length),f(Ge)}else{if(s=="number"||s=="string")return h.marked=o?"property":h.style+" property",f(Ge);if(s=="jsonld-keyword")return f(Ge);if(c&&xe(p))return h.marked="keyword",f(St);if(s=="[")return f(W,Ut,q("]"),Ge);if(s=="spread")return f(je,Ge);if(p=="*")return h.marked="keyword",f(St);if(s==":")return C(Ge)}}function qn(s){return s!="variable"?C(Ge):(h.marked="property",f(At))}function Ge(s){if(s==":")return f(je);if(s=="(")return C(At)}function se(s,p,A){function x(I,Y){if(A?A.indexOf(I)>-1:I==","){var z=h.state.lexical;return z.info=="call"&&(z.pos=(z.pos||0)+1),f(function(ve,We){return ve==p||We==p?C():C(s)},x)}return I==p||Y==p?f():A&&A.indexOf(";")>-1?C(s):f(q(p))}return function(I,Y){return I==p||Y==p?f():C(s,x)}}function ln(s,p,A){for(var x=3;x"),V);if(s=="quasi")return C(kr,it)}function aa(s){if(s=="=>")return f(V)}function Tr(s){return s.match(/[\}\)\]]/)?f():s==","||s==";"?f(Tr):C(pn,Tr)}function pn(s,p){if(s=="variable"||h.style=="keyword")return h.marked="property",f(pn);if(p=="?"||s=="number"||s=="string")return f(pn);if(s==":")return f(V);if(s=="[")return f(q("variable"),ia,q("]"),pn);if(s=="(")return C(Wt,pn);if(!s.match(/[;\}\)\],]/))return f()}function kr(s,p){return s!="quasi"?C():p.slice(p.length-2)!="${"?f(kr):f(V,sa)}function sa(s){if(s=="}")return h.marked="string-2",h.state.tokenize=D,f(kr)}function Sr(s,p){return s=="variable"&&h.stream.match(/^\s*[?:]/,!1)||p=="?"?f(Sr):s==":"?f(V):s=="spread"?f(Sr):C(V)}function it(s,p){if(p=="<")return f(B(">"),se(V,">"),N,it);if(p=="|"||s=="."||p=="&")return f(V);if(s=="[")return f(V,q("]"),it);if(p=="extends"||p=="implements")return h.marked="keyword",f(V);if(p=="?")return f(V,q(":"),V)}function ca(s,p){if(p=="<")return f(B(">"),se(V,">"),N,it)}function Hn(){return C(V,la)}function la(s,p){if(p=="=")return f(V)}function Cr(s,p){return p=="enum"?(h.marked="keyword",f(Gi)):C(Fe,Ut,ht,ua)}function Fe(s,p){if(c&&xe(p))return h.marked="keyword",f(Fe);if(s=="variable")return Ee(p),f();if(s=="spread")return f(Fe);if(s=="[")return ln(pa,"]");if(s=="{")return ln(Li,"}")}function Li(s,p){return s=="variable"&&!h.stream.match(/^\s*:/,!1)?(Ee(p),f(ht)):(s=="variable"&&(h.marked="property"),s=="spread"?f(Fe):s=="}"?C():s=="["?f(W,q("]"),q(":"),Li):f(q(":"),Fe,ht))}function pa(){return C(Fe,ht)}function ht(s,p){if(p=="=")return f(je)}function ua(s){if(s==",")return f(Cr)}function Hi(s,p){if(s=="keyword b"&&p=="else")return f(B("form","else"),ee,N)}function $i(s,p){if(p=="await")return f($i);if(s=="(")return f(B(")"),fa,N)}function fa(s){return s=="var"?f(Cr,Gt):s=="variable"?f(Gt):C(Gt)}function Gt(s,p){return s==")"?f():s==";"?f(Gt):p=="in"||p=="of"?(h.marked="keyword",f(W,Gt)):C(W,Gt)}function At(s,p){if(p=="*")return h.marked="keyword",f(At);if(s=="variable")return Ee(p),f(At);if(s=="(")return f(Ue,B(")"),se(Ct,")"),N,qi,ee,ye);if(c&&p=="<")return f(B(">"),se(Hn,">"),N,At)}function Wt(s,p){if(p=="*")return h.marked="keyword",f(Wt);if(s=="variable")return Ee(p),f(Wt);if(s=="(")return f(Ue,B(")"),se(Ct,")"),N,qi,ye);if(c&&p=="<")return f(B(">"),se(Hn,">"),N,Wt)}function Ki(s,p){if(s=="keyword"||s=="variable")return h.marked="type",f(Ki);if(p=="<")return f(B(">"),se(Hn,">"),N)}function Ct(s,p){return p=="@"&&f(W,Ct),s=="spread"?f(Ct):c&&xe(p)?(h.marked="keyword",f(Ct)):c&&s=="this"?f(Ut,ht):C(Fe,Ut,ht)}function da(s,p){return s=="variable"?Ri(s,p):$n(s,p)}function Ri(s,p){if(s=="variable")return Ee(p),f($n)}function $n(s,p){if(p=="<")return f(B(">"),se(Hn,">"),N,$n);if(p=="extends"||p=="implements"||c&&s==",")return p=="implements"&&(h.marked="keyword"),f(c?V:W,$n);if(s=="{")return f(B("}"),ot,N)}function ot(s,p){if(s=="async"||s=="variable"&&(p=="static"||p=="get"||p=="set"||c&&xe(p))&&h.stream.match(/^\s+[\w$\xa1-\uffff]/,!1))return h.marked="keyword",f(ot);if(s=="variable"||h.style=="keyword")return h.marked="property",f(un,ot);if(s=="number"||s=="string")return f(un,ot);if(s=="[")return f(W,Ut,q("]"),un,ot);if(p=="*")return h.marked="keyword",f(ot);if(c&&s=="(")return C(Wt,ot);if(s==";"||s==",")return f(ot);if(s=="}")return f();if(p=="@")return f(W,ot)}function un(s,p){if(p=="!"||p=="?")return f(un);if(s==":")return f(V,ht);if(p=="=")return f(je);var A=h.state.lexical.prev,x=A&&A.info=="interface";return C(x?Wt:At)}function ma(s,p){return p=="*"?(h.marked="keyword",f(Dr,q(";"))):p=="default"?(h.marked="keyword",f(W,q(";"))):s=="{"?f(se(Yi,"}"),Dr,q(";")):C(ee)}function Yi(s,p){if(p=="as")return h.marked="keyword",f(q("variable"));if(s=="variable")return C(je,Yi)}function ga(s){return s=="string"?f():s=="("?C(W):s=="."?C(nt):C(Kn,Ui,Dr)}function Kn(s,p){return s=="{"?ln(Kn,"}"):(s=="variable"&&Ee(p),p=="*"&&(h.marked="keyword"),f(ha))}function Ui(s){if(s==",")return f(Kn,Ui)}function ha(s,p){if(p=="as")return h.marked="keyword",f(Kn)}function Dr(s,p){if(p=="from")return h.marked="keyword",f(W)}function Aa(s){return s=="]"?f():C(se(je,"]"))}function Gi(){return C(B("form"),Fe,q("{"),B("}"),se(_a,"}"),N,N)}function _a(){return C(Fe,ht)}function xa(s,p){return s.lastType=="operator"||s.lastType==","||_.test(p.charAt(0))||/[,.]/.test(p.charAt(0))}function Wi(s,p,A){return p.tokenize==O&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(p.lastType)||p.lastType=="quasi"&&/\{\s*$/.test(s.string.slice(0,s.pos-(A||0)))}return{startState:function(s){var p={tokenize:O,lastType:"sof",cc:[],lexical:new te((s||0)-r,0,"block",!1),localVars:t.localVars,context:t.localVars&&new Ye(null,null,!1),indented:s||0};return t.globalVars&&typeof t.globalVars=="object"&&(p.globalVars=t.globalVars),p},token:function(s,p){if(s.sol()&&(p.lexical.hasOwnProperty("align")||(p.lexical.align=!1),p.indented=s.indentation(),F(s,p)),p.tokenize!=K&&s.eatSpace())return null;var A=p.tokenize(s,p);return S=="comment"?A:(p.lastType=S=="operator"&&(k=="++"||k=="--")?"incdec":S,Q(p,A,S,k,s))},indent:function(s,p){if(s.tokenize==K||s.tokenize==D)return n.Pass;if(s.tokenize!=O)return 0;var A=p&&p.charAt(0),x=s.lexical,I;if(!/^\s*else\b/.test(p))for(var Y=s.cc.length-1;Y>=0;--Y){var z=s.cc[Y];if(z==N)x=x.prev;else if(z!=Hi&&z!=ye)break}for(;(x.type=="stat"||x.type=="form")&&(A=="}"||(I=s.cc[s.cc.length-1])&&(I==nt||I==gt)&&!/^[,\.=+\-*:?[\(]/.test(p));)x=x.prev;i&&x.type==")"&&x.prev.type=="stat"&&(x=x.prev);var ve=x.type,We=A==ve;return ve=="vardef"?x.indented+(s.lastType=="operator"||s.lastType==","?x.info.length+1:0):ve=="form"&&A=="{"?x.indented:ve=="form"?x.indented+r:ve=="stat"?x.indented+(xa(s,p)?i||r:0):x.info=="switch"&&!We&&t.doubleIndentSwitch!=!1?x.indented+(/^(?:case|default)\b/.test(p)?r:2*r):x.align?x.column+(We?0:1):x.indented+(We?0:r)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:a?null:"/*",blockCommentEnd:a?null:"*/",blockCommentContinue:a?null:" * ",lineComment:a?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:a?"json":"javascript",jsonldMode:o,jsonMode:a,expressionAllowed:Wi,skipExpression:function(s){Q(s,"atom","atom","true",new n.StringStream("",2,null))}}}),n.registerHelper("wordChars","javascript",/[\w$]/),n.defineMIME("text/javascript","javascript"),n.defineMIME("text/ecmascript","javascript"),n.defineMIME("application/javascript","javascript"),n.defineMIME("application/x-javascript","javascript"),n.defineMIME("application/ecmascript","javascript"),n.defineMIME("application/json",{name:"javascript",json:!0}),n.defineMIME("application/x-json",{name:"javascript",json:!0}),n.defineMIME("application/manifest+json",{name:"javascript",json:!0}),n.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),n.defineMIME("text/typescript",{name:"javascript",typescript:!0}),n.defineMIME("application/typescript",{name:"javascript",typescript:!0})});(function(n){n(window.CodeMirror)})(function(n){"use strict";n.customOverlayMode=function(e,t,r){return{startState:function(){return{base:n.startState(e),overlay:n.startState(t),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(i){return{base:n.copyState(e,i.base),overlay:n.copyState(t,i.overlay),basePos:i.basePos,baseCur:null,overlayPos:i.overlayPos,overlayCur:null}},token:function(i,o){return(i!=o.streamSeen||Math.min(o.basePos,o.overlayPos)0&&(this.activeEditorExtensions.pop(),this.plugin.app.workspace.updateOptions())}async jump_to_next_cursor_location(e=null,t=!1){t&&!this.plugin.settings.auto_jump_to_cursor||e&&Xt(this.plugin.app)!==e||await this.cursor_jumper.jump_to_next_cursor_location()}async registerCodeMirrorMode(){if(!this.desktopShouldHighlight()&&!this.mobileShouldHighlight())return;let e=window.CodeMirror.getMode({},"javascript");if(e.name==="null"){oe(new P("Javascript syntax mode couldn't be found, can't enable syntax highlighting."));return}let t=window.CodeMirror.customOverlayMode;if(t==null){oe(new P("Couldn't find customOverlayMode, can't enable syntax highlighting."));return}window.CodeMirror.defineMode(ra,function(r){let i={startState:function(){return{...window.CodeMirror.startState(e),inCommand:!1,tag_class:"",freeLine:!1}},copyState:function(o){return{...window.CodeMirror.startState(e),inCommand:o.inCommand,tag_class:o.tag_class,freeLine:o.freeLine}},blankLine:function(o){return o.inCommand?"line-background-templater-command-bg":null},token:function(o,a){if(o.sol()&&a.inCommand&&(a.freeLine=!0),a.inCommand){let c="";if(o.match(/[-_]{0,1}%>/,!0)){a.inCommand=!1,a.freeLine=!1;let m=a.tag_class;return a.tag_class="",`line-${Bi} ${Oi} ${ic} ${m}`}let d=e.token&&e.token(o,a);return o.peek()==null&&a.freeLine&&(c+=" line-background-templater-command-bg"),a.freeLine||(c+=` line-${Bi}`),`${c} ${Oi} ${d}`}let l=o.match(/<%[-_]{0,1}\s*([*+]{0,1})/,!0);if(l!=null){switch(l[1]){case"*":a.tag_class=ac;break;default:a.tag_class=oc;break}return a.inCommand=!0,`line-${Bi} ${Oi} ${rc} ${a.tag_class}`}for(;o.next()!=null&&!o.match(/<%/,!1););return null}};return t(window.CodeMirror.getMode(r,"hypermd"),i)})}updateEditorIntellisenseSetting(e){this.autocomplete.updateAutocompleteIntellisenseSetting(e)}};var Fi=class extends Er.Plugin{async onload(){await this.load_settings(),this.templater=new Pn(this),await this.templater.setup(),this.editor_handler=new Ii(this),await this.editor_handler.setup(),this.fuzzy_suggester=new si(this),this.event_handler=new wr(this,this.templater,this.settings),this.event_handler.setup(),this.command_handler=new ki(this),this.command_handler.setup(),(0,Er.addIcon)("templater-icon",$o),this.addRibbonIcon("templater-icon","Templater",async()=>{this.fuzzy_suggester.insert_template()}).setAttribute("id","rb-templater-icon"),this.addSettingTab(new ai(this)),this.app.workspace.onLayoutReady(()=>{this.templater.execute_startup_scripts()})}async onExternalSettingsChange(){await this.load_settings()}onunload(){this.templater.functions_generator.teardown()}async save_settings(){await this.saveData(this.settings),this.editor_handler.updateEditorIntellisenseSetting(this.settings.intellisense_render)}async load_settings(){this.settings=Object.assign({},Lo,await this.loadData())}}; - -/* nosourcemap */ \ No newline at end of file diff --git a/astro-site/.obsidian/plugins/templater-obsidian/manifest.json b/astro-site/.obsidian/plugins/templater-obsidian/manifest.json deleted file mode 100644 index 3984cf1a..00000000 --- a/astro-site/.obsidian/plugins/templater-obsidian/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "templater-obsidian", - "name": "Templater", - "version": "2.16.4", - "description": "Create and use templates", - "minAppVersion": "1.5.0", - "author": "SilentVoid", - "authorUrl": "https://github.com/SilentVoid13", - "helpUrl": "https://silentvoid13.github.io/Templater/", - "isDesktopOnly": false -} diff --git a/astro-site/.obsidian/plugins/templater-obsidian/styles.css b/astro-site/.obsidian/plugins/templater-obsidian/styles.css deleted file mode 100644 index 36aa4fac..00000000 --- a/astro-site/.obsidian/plugins/templater-obsidian/styles.css +++ /dev/null @@ -1,226 +0,0 @@ -.templater_search { - width: calc(100% - 20px); -} - -.templater_div { - border-top: 1px solid var(--background-modifier-border); -} - -.templater_div > .setting-item { - border-top: none !important; - align-self: center; -} - -.templater_div > .setting-item > .setting-item-control { - justify-content: space-around; - padding: 0; - width: 100%; -} - -.templater_div - > .setting-item - > .setting-item-control - > .setting-editor-extra-setting-button { - align-self: center; -} - -.templater_donating { - margin: 10px; -} - -.templater_title { - margin: 0; - padding: 0; - margin-top: 5px; - text-align: center; -} - -.templater_template { - align-self: center; - margin-left: 5px; - margin-right: 5px; - width: 70%; -} - -.templater_cmd { - margin-left: 5px; - margin-right: 5px; - font-size: 14px; - width: 100%; -} - -.templater_div2 > .setting-item { - align-content: center; - justify-content: center; -} - -.templater-prompt-div, -.templater-multisuggester-div { - display: flex; -} - -.templater-prompt-form { - display: flex; - flex-grow: 1; -} - -.templater-prompt-input, -.templater-multisuggester-input { - flex-grow: 1; -} - -.templater-button-div { - display: flex; - flex-direction: column; - align-items: center; - margin-top: 1rem; -} - -textarea.templater-prompt-input { - height: 10rem; -} - -textarea.templater-prompt-input:focus { - border-color: var(--interactive-accent); -} - -.templater-multisuggester-list { - margin: 1.5em 0; -} - -.cm-s-obsidian .templater-command-bg { - left: 0px; - right: 0px; - background-color: var(--background-primary-alt); -} - -.cm-s-obsidian .cm-templater-command { - font-size: 0.85em; - font-family: var(--font-monospace); - line-height: 1.3; -} - -.cm-s-obsidian .templater-inline .cm-templater-command { - background-color: var(--background-primary-alt); -} - -.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag { - font-weight: bold; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag { - font-weight: bold; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag { - color: var(--code-property, #008bff); -} - -.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag { - color: var(--code-function, #c0d700); -} - -.cm-s-obsidian .cm-templater-command.cm-keyword { - color: var(--code-keyword, #00a7aa); - font-weight: normal; -} - -.cm-s-obsidian .cm-templater-command.cm-atom { - color: var(--code-normal, #f39b35); -} - -.cm-s-obsidian .cm-templater-command.cm-value, -.cm-s-obsidian .cm-templater-command.cm-number, -.cm-s-obsidian .cm-templater-command.cm-type { - color: var(--code-value, #a06fca); -} - -.cm-s-obsidian .cm-templater-command.cm-def, -.cm-s-obsidian .cm-templater-command.cm-type.cm-def { - color: var(--code-normal, var(--text-normal)); -} - -.cm-s-obsidian .cm-templater-command.cm-property, -.cm-s-obsidian .cm-templater-command.cm-property.cm-def, -.cm-s-obsidian .cm-templater-command.cm-attribute { - color: var(--code-function, #98e342); -} - -.cm-s-obsidian .cm-templater-command.cm-variable, -.cm-s-obsidian .cm-templater-command.cm-variable-2, -.cm-s-obsidian .cm-templater-command.cm-variable-3, -.cm-s-obsidian .cm-templater-command.cm-meta { - color: var(--code-property, #d4d4d4); -} - -.cm-s-obsidian .cm-templater-command.cm-callee, -.cm-s-obsidian .cm-templater-command.cm-operator, -.cm-s-obsidian .cm-templater-command.cm-qualifier, -.cm-s-obsidian .cm-templater-command.cm-builtin { - color: var(--code-operator, #fc4384); -} - -.cm-s-obsidian .cm-templater-command.cm-tag { - color: var(--code-tag, #fc4384); -} - -.cm-s-obsidian .cm-templater-command.cm-comment, -.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag, -.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute { - color: var(--code-comment, #696d70); -} - -.cm-s-obsidian .cm-templater-command.cm-string, -.cm-s-obsidian .cm-templater-command.cm-string-2 { - color: var(--code-string, #e6db74); -} - -.cm-s-obsidian .cm-templater-command.cm-header, -.cm-s-obsidian .cm-templater-command.cm-hr { - color: var(--code-keyword, #da7dae); -} - -.cm-s-obsidian .cm-templater-command.cm-link { - color: var(--code-normal, #696d70); -} - -.cm-s-obsidian .cm-templater-command.cm-error { - border-bottom: 1px solid #c42412; -} - -.CodeMirror-hints { - position: absolute; - z-index: 10; - overflow: hidden; - list-style: none; - - margin: 0; - padding: 2px; - - -webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); - box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); - border-radius: 3px; - border: 1px solid silver; - - background: white; - font-size: 90%; - font-family: monospace; - - max-height: 20em; - overflow-y: auto; -} - -.CodeMirror-hint { - margin: 0; - padding: 0 4px; - border-radius: 2px; - white-space: pre; - color: black; - cursor: pointer; -} - -li.CodeMirror-hint-active { - background: #08f; - color: white; -} diff --git a/astro-site/.obsidian/themes/Minimal/manifest.json b/astro-site/.obsidian/themes/Minimal/manifest.json deleted file mode 100644 index 6bc5d4b0..00000000 --- a/astro-site/.obsidian/themes/Minimal/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "Minimal", - "version": "8.1.2", - "minAppVersion": "1.9.0", - "author": "@kepano", - "authorUrl": "https://twitter.com/kepano", - "fundingUrl": "https://www.buymeacoffee.com/kepano" -} diff --git a/astro-site/.obsidian/themes/Minimal/theme.css b/astro-site/.obsidian/themes/Minimal/theme.css deleted file mode 100644 index 1ead8ff2..00000000 --- a/astro-site/.obsidian/themes/Minimal/theme.css +++ /dev/null @@ -1,2251 +0,0 @@ -/* --------------------------------------------------------------------------- - -Minimal Theme by @kepano - -User interface replacement for Obsidian. - -Designed to be used with the Minimal Theme Settings -plugin and the Hider plugin. - -Sponsor my work: -https://www.buymeacoffee.com/kepano - -Readme: -https://github.com/kepano/obsidian-minimal - ------------------------------------------------------------------------------ - -MIT License - -Copyright (c) 2020-2024 Steph Ango (@kepano) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ -body{--font-editor-theme:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Inter,Ubuntu,sans-serif;--font-editor:var(--font-editor-override),var(--font-text-override),var(--font-editor-theme);--bases-table-column-border-width:0px;--bases-header-border-width:0;--blockquote-style:normal;--blockquote-color:var(--text-muted);--blockquote-border-thickness:1px;--blockquote-border-color:var(--quote-opening-modifier);--embed-block-shadow-hover:none;--font-ui-smaller:11px;--normal-weight:400;--inline-title-margin-bottom:1rem;--h1-size:1.125em;--h2-size:1.05em;--h3-size:1em;--h4-size:0.90em;--h5-size:0.85em;--h6-size:0.85em;--h1-weight:600;--h2-weight:600;--h3-weight:500;--h4-weight:500;--h5-weight:500;--h6-weight:400;--h1-variant:normal;--h2-variant:normal;--h3-variant:normal;--h4-variant:normal;--h5-variant:small-caps;--h6-variant:small-caps;--h1-style:normal;--h2-style:normal;--h3-style:normal;--h4-style:normal;--h5-style:normal;--h6-style:normal;--line-width:40rem;--line-height:1.5;--line-height-normal:var(--line-height);--max-width:88%;--max-col-width:18em;--icon-muted:0.5;--nested-padding:1.1em;--folding-offset:32px;--list-edit-offset:0.5em;--list-indent:2em;--list-spacing:0.075em;--input-height:32px;--header-height:40px;--metadata-label-width-multiplier:9;--metadata-label-width:calc(var(--font-adaptive-small) * var(--metadata-label-width-multiplier));--metadata-label-font-size:var(--font-adaptive-small);--metadata-input-font-size:var(--font-adaptive-small);--mobile-left-sidebar-width:280pt;--mobile-right-sidebar-width:240pt;--top-left-padding-y:0px;--image-muted:0.7;--image-radius:4px;--heading-spacing:2em;--p-spacing:1.75rem;--border-width:1px;--table-border-width:var(--border-width);--table-selection:var(--text-selection);--table-selection-border-color:var(--text-accent);--table-selection-border-width:0px;--table-selection-border-radius:0px;--table-drag-handle-background-active:var(--text-selection);--table-drag-handle-color-active:var(--text-accent);--table-add-button-border-width:0px;--file-margins:var(--size-4-2) var(--size-4-12)}.mod-macos{--top-left-padding-y:24px}.is-phone{--metadata-label-font-size:var(--font-adaptive-smaller);--metadata-input-font-size:var(--font-adaptive-smaller)}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.is-phone{--border-width:0.75px}}body{--base-h:0;--base-s:0%;--base-l:96%;--accent-h:201;--accent-s:17%;--accent-l:50%}.theme-dark,.theme-light{--color-red-rgb:208,66,85;--color-orange-rgb:213,118,63;--color-yellow-rgb:229,181,103;--color-green-rgb:168,195,115;--color-cyan-rgb:115,187,178;--color-blue-rgb:108,153,187;--color-purple-rgb:158,134,200;--color-pink-rgb:176,82,121;--color-red:#d04255;--color-orange:#d5763f;--color-yellow:#e5b567;--color-green:#a8c373;--color-cyan:#73bbb2;--color-blue:#6c99bb;--color-purple:#9e86c8;--color-pink:#b05279}.theme-light,.theme-light.minimal-default-light,body .excalidraw{--bg1:white;--bg2:hsl( var(--base-h), var(--base-s), var(--base-l) );--bg3:hsla( var(--base-h), var(--base-s), calc(var(--base-l) - 50%), 0.12 );--ui1:hsl( var(--base-h), var(--base-s), calc(var(--base-l) - 6%) );--ui2:hsl( var(--base-h), var(--base-s), calc(var(--base-l) - 12%) );--ui3:hsl( var(--base-h), var(--base-s), calc(var(--base-l) - 20%) );--tx1:hsl( var(--base-h), var(--base-s), calc(var(--base-l) - 90%) );--tx2:hsl( var(--base-h), calc(var(--base-s) - 20%), calc(var(--base-l) - 50%) );--tx3:hsl( var(--base-h), calc(var(--base-s) - 10%), calc(var(--base-l) - 25%) );--tx4:hsl( var(--base-h), calc(var(--base-s) - 10%), calc(var(--base-l) - 60%) );--ax1:hsl( var(--accent-h), var(--accent-s), var(--accent-l) );--ax2:hsl( var(--accent-h), var(--accent-s), calc(var(--accent-l) - 8%) );--ax3:hsl( var(--accent-h), var(--accent-s), calc(var(--accent-l) + 6%) );--hl1:hsla( var(--accent-h), 50%, calc(var(--base-l) - 20%), 30% );--hl2:rgba(255, 225, 0, 0.5);--sp1:white}.excalidraw.theme--dark,.theme-dark,.theme-dark.minimal-default-dark,.theme-light.minimal-light-contrast .titlebar,.theme-light.minimal-light-contrast.minimal-status-off .status-bar{--accent-l:60%;--base-l:15%;--bg1:hsl( var(--base-h), var(--base-s), var(--base-l) );--bg2:hsl( var(--base-h), var(--base-s), calc(var(--base-l) - 2%) );--bg3:hsla( var(--base-h), var(--base-s), calc(var(--base-l) + 40%), 0.12 );--ui1:hsl( var(--base-h), var(--base-s), calc(var(--base-l) + 6%) );--ui2:hsl( var(--base-h), var(--base-s), calc(var(--base-l) + 12%) );--ui3:hsl( var(--base-h), var(--base-s), calc(var(--base-l) + 20%) );--tx1:hsl( var(--base-h), calc(var(--base-s) - 10%), calc(var(--base-l) + 67%) );--tx2:hsl( var(--base-h), calc(var(--base-s) - 20%), calc(var(--base-l) + 45%) );--tx3:hsl( var(--base-h), calc(var(--base-s) - 10%), calc(var(--base-l) + 20%) );--tx4:hsl( var(--base-h), calc(var(--base-s) - 10%), calc(var(--base-l) + 50%) );--ax1:hsl( var(--accent-h), var(--accent-s), var(--accent-l) );--ax2:hsl( var(--accent-h), var(--accent-s), calc(var(--accent-l) + 8%) );--ax3:hsl( var(--accent-h), var(--accent-s), calc(var(--accent-l) - 5%) );--hl1:hsla( var(--accent-h), 50%, 40%, 30% );--hl2:rgba(255, 177, 80, 0.3);--sp1:white}.theme-light.minimal-light-white{--background-primary:white;--background-secondary:white;--background-secondary-alt:white;--ribbon-background:white;--titlebar-background:white;--mobile-sidebar-background:white;--bg1:white}.theme-dark.minimal-dark-black{--base-d:0%;--titlebar-background:black;--background-primary:black;--background-secondary:black;--background-secondary-alt:black;--ribbon-background:black;--background-modifier-hover:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 10%));--tx1:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 75%) );--tx2:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 50%) );--tx3:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 25%) );--ui1:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 12%) );--ui2:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 20%) );--ui3:hsl( var(--base-h), var(--base-s), calc(var(--base-d) + 30%) )}.theme-light{--mono100:black;--mono0:white}.theme-dark{--mono100:white;--mono0:black}.theme-dark,.theme-light,.theme-light.minimal-light-contrast .titlebar,.theme-light.minimal-light-contrast.is-mobile .workspace-drawer.mod-left,.theme-light.minimal-light-contrast.minimal-status-off .status-bar{--background-modifier-accent:var(--ax3);--background-modifier-border-focus:var(--ui3);--background-modifier-border-hover:var(--ui2);--background-modifier-border:var(--ui1);--mobile-sidebar-background:var(--bg1);--background-modifier-form-field-highlighted:var(--bg1);--background-modifier-form-field:var(--bg1);--background-modifier-success:var(--color-green);--background-modifier-hover:var(--bg3);--background-modifier-active-hover:var(--bg3);--background-primary:var(--bg1);--background-primary-alt:var(--bg2);--background-secondary:var(--bg2);--background-secondary-alt:var(--bg1);--background-table-rows:var(--bg2);--checkbox-color:var(--ax3);--code-normal:var(--tx1);--divider-color:var(--ui1);--frame-divider-color:var(--ui1);--icon-color-active:var(--tx1);--icon-color-focused:var(--tx1);--icon-color-hover:var(--tx2);--icon-color:var(--tx2);--icon-hex:var(--mono0);--interactive-normal:var(--ui1);--interactive-accent-hover:var(--ax1);--interactive-accent:var(--ax3);--interactive-hover:var(--ui1);--list-marker-color:var(--tx3);--nav-item-background-active:var(--bg3);--nav-item-background-hover:var(--bg3);--nav-item-color:var(--tx2);--nav-item-color-active:var(--tx1);--nav-item-color-hover:var(--tx1);--nav-item-color-selected:var(--tx1);--nav-collapse-icon-color:var(--tx2);--nav-collapse-icon-color-collapsed:var(--tx2);--nav-indentation-guide-color:var(--ui1);--prompt-border-color:var(--ui3);--quote-opening-modifier:var(--ui2);--ribbon-background:var(--bg2);--scrollbar-active-thumb-bg:var(--ui3);--scrollbar-bg:transparent;--scrollbar-thumb-bg:var(--ui1);--search-result-background:var(--bg1);--tab-text-color-focused-active:var(--tx1);--tab-outline-color:var(--ui1);--text-accent-hover:var(--ax2);--text-accent:var(--ax1);--text-blockquote:var(--tx2);--text-bold:var(--tx1);--text-code:var(--tx4);--text-error:var(--color-red);--text-faint:var(--tx3);--text-highlight-bg:var(--hl2);--text-italic:var(--tx1);--text-muted:var(--tx2);--text-normal:var(--tx1);--text-on-accent:var(--sp1);--text-selection:var(--hl1);--text-formatting:var(--tx3);--title-color-inactive:var(--tx2);--title-color:var(--tx1);--titlebar-background:var(--bg2);--titlebar-background-focused:var(--bg2);--titlebar-text-color-focused:var(--tx1);--vault-profile-color:var(--tx1);--vault-profile-color-hover:var(--tx1);--workspace-background-translucent:hsla(var(--base-h),var(--base-s), var(--base-l), 0.7)}.theme-light.minimal-light-contrast.is-mobile .workspace-drawer.mod-left{--raised-background:var(--ui1);--raised-shadow:none;--raised-mask-border-width:0px}.theme-dark .view-actions,.theme-light .view-actions{--icon-color-active:var(--ax1)}.theme-light.minimal-light-contrast{--workspace-background-translucent:rgba(0,0,0,0.6)}.theme-light.minimal-light-contrast .theme-dark{--tab-container-background:var(--bg2);--ribbon-background-collapsed:var(--bg2)}.theme-light{--interactive-normal:var(--bg1);--interactive-accent-rgb:220,220,220;--active-line-bg:rgba(0,0,0,0.035);--background-modifier-cover:hsla(var(--base-h),calc(var(--base-s) - 70%),calc(var(--base-l) - 20%),0.5);--text-highlight-bg-active:rgba(0, 0, 0, 0.1);--background-modifier-error:rgba(255,0,0,0.14);--background-modifier-error-hover:rgba(255,0,0,0.08);--shadow-color:rgba(0, 0, 0, 0.1);--btn-shadow-color:rgba(0, 0, 0, 0.05)}.theme-dark{--interactive-normal:var(--bg3);--interactive-accent-rgb:66,66,66;--active-line-bg:rgba(255,255,255,0.04);--background-modifier-cover:hsla(var(--base-h),var(--base-s), calc(var(--base-l) - 12%), 0.5);--text-highlight-bg-active:rgba(255, 255, 255, 0.1);--background-modifier-error:rgba(255,20,20,0.12);--background-modifier-error-hover:rgba(255,20,20,0.18);--background-modifier-box-shadow:rgba(0, 0, 0, 0.3);--shadow-color:rgba(0, 0, 0, 0.3);--btn-shadow-color:rgba(0, 0, 0, 0.2);--modal-border-color:var(--ui2)}.theme-light.minimal-light-white{--background-table-rows:var(--bg2);--interactive-normal:var(--bg3);--setting-items-background:var(--bg3)}.theme-light.minimal-light-tonal{--background-secondary:var(--bg1);--background-primary-alt:var(--bg3);--background-table-rows:var(--bg3);--setting-items-background:var(--bg3)}.theme-light.minimal-light-tonal.is-mobile{--background-modifier-form-field:var(--bg3);--interactive-normal:var(--bg3)}.theme-dark.minimal-dark-tonal{--ribbon-background:var(--bg1);--background-secondary:var(--bg1);--background-table-rows:var(--bg3);--setting-items-background:var(--bg3)}.theme-dark.minimal-dark-black{--background-primary-alt:var(--bg3);--background-table-rows:var(--bg3);--setting-items-background:var(--bg3);--modal-border:var(--ui2);--active-line-bg:rgba(255,255,255,0.085);--background-modifier-form-field:var(--bg3);--background-modifier-cover:hsla(var(--base-h),var(--base-s),calc(var(--base-d) + 8%),0.7);--background-modifier-box-shadow:rgba(0, 0, 0, 1)}body{--font-adaptive-normal:var(--font-text-size,var(--editor-font-size));--font-adaptive-small:calc(var(--font-ui-small) * 1.07);--font-adaptive-smaller:var(--font-ui-small);--font-adaptive-smallest:var(--font-ui-smaller);--line-width-wide:calc(var(--line-width) + 12.5%);--font-code:calc(var(--font-adaptive-normal) * 0.9);--table-text-size:calc(var(--font-adaptive-normal) * 0.875);--bases-table-font-size:calc(var(--font-adaptive-normal) * 0.875)}.bases-view{--bases-table-font-size:var(--table-text-size)}.query-toolbar-menu .combobox-button{background-color:rgba(0,0,0,0)}.bases-embed .bases-header .query-toolbar,.block-language-base .bases-header .query-toolbar{padding-bottom:2px;opacity:var(--bases-toolbar-opacity);transition:.15s .15s opacity}.bases-embed .bases-header .query-toolbar:hover,.block-language-base .bases-header .query-toolbar:hover{opacity:1;transition:0s opacity}.base-plain .bases-header{display:none}.bases-table-header-icon{display:var(--bases-table-header-icon-display)}.CodeMirror-wrap>div>textarea{opacity:0}.cm-editor .cm-content{padding-top:.5em}.markdown-source-view{color:var(--text-normal)}.markdown-source-view.mod-cm6 .cm-sizer{display:block}.markdown-source-view.mod-cm6 .cm-scroller{padding-inline-end:0;padding-inline-start:0}.cm-s-obsidian .cm-line.HyperMD-header{padding-top:calc(var(--p-spacing)/2)}.markdown-rendered .mod-header+div>*{margin-block-start:0}body :not(.canvas-node) .markdown-source-view.mod-cm6 .cm-gutters{position:absolute!important;z-index:0;margin-inline-end:0}body :not(.canvas-node) .markdown-source-view.mod-cm6 .cm-gutters .cm-gutter:before{content:"";height:100%;top:-100%;width:100%;position:absolute;z-index:1;background-color:var(--gutter-background);min-width:var(--folding-offset)}body :not(.canvas-node) .markdown-source-view.mod-cm6.is-rtl .cm-gutters{right:0}body{--line-number-color:var(--text-faint);--line-number-color-active:var(--text-muted)}.empty-state-title{display:none}.markdown-source-view.mod-cm6 .cm-gutters{color:var(--line-number-color)!important}.markdown-source-view.mod-cm6 .cm-editor .cm-gutterElement.cm-active .cm-heading-marker,.markdown-source-view.mod-cm6 .cm-editor .cm-lineNumbers .cm-gutterElement.cm-active{color:var(--line-number-color-active)}.cm-editor .cm-lineNumbers{background-color:var(--gutter-background)}.cm-editor .cm-lineNumbers .cm-gutterElement{min-width:var(--folding-offset);padding-inline-end:.5em}.is-rtl .cm-editor .cm-lineNumbers .cm-gutterElement{text-align:left}@media(max-width:400pt){.cm-editor .cm-lineNumbers .cm-gutterElement{padding-inline-end:4px;padding-inline-start:8px}}.cm-editor .cm-gutterElement.cm-active .cm-heading-marker,.cm-editor .cm-lineNumbers .cm-gutterElement.cm-active{color:var(--text-muted)}.markdown-source-view.mod-cm6 .edit-block-button{cursor:var(--cursor);color:var(--text-faint);background-color:var(--background-primary);top:0;opacity:0;transition:opacity .2s;padding:4px 4px 4px 9px}.markdown-source-view.mod-cm6 .edit-block-button svg{margin:0!important}.markdown-source-view.mod-cm6.is-live-preview.is-readable-line-width .cm-embed-block>.edit-block-button{width:30px!important;padding-inline-start:7px!important}.is-live-preview:not(.is-readable-line-width) .cm-embed-block>.edit-block-button{padding-inline-start:0px!important;margin-inline-start:0!important;padding:4px}.markdown-source-view.mod-cm6 .edit-block-button:hover{background-color:var(--background-primary);color:var(--text-muted)}.markdown-source-view.mod-cm6 .edit-block-button svg{opacity:1}.markdown-source-view.mod-cm6 .edit-block-button:hover svg{opacity:1}.markdown-source-view.mod-cm6 .cm-embed-block{padding:0;border:0;border-radius:0}.markdown-source-view.mod-cm6 .cm-embed-block:hover{border:0}.metadata-container{--input-height:calc(var(--font-adaptive-small) * 2.2)}body.metadata-heading-off .metadata-properties-heading{display:none}.metadata-add-property-off .mod-root .metadata-add-button{display:none}.metadata-dividers{--metadata-divider-width:1px;--metadata-gap:0px}.metadata-icons-off .workspace-leaf-content[data-type=all-properties] .tree-item-inner{margin-inline-start:-16px}.metadata-icons-off .workspace-leaf-content[data-type=all-properties] .tree-item-icon{display:none}.metadata-icons-off .metadata-property-icon{display:none}figure{margin-inline-start:0;margin-inline-end:0}.markdown-preview-view .mod-highlighted{transition:background-color .3s ease;background-color:var(--text-selection);color:inherit}.inline-title{padding-top:16px}.mod-macos.hider-frameless .workspace-ribbon{border:none}.is-tablet.hider-ribbon{--ribbon-width:0px}.is-tablet.hider-ribbon .side-dock-ribbon{display:none}.hider-ribbon .workspace-ribbon{padding:0}:root{--hider-ribbon-display:none;--ribbon-animation-duration:0.1s}.ribbon-bottom-left-hover-vertical:not(.is-mobile),.ribbon-bottom-left-hover:not(.is-mobile){--hider-ribbon-display:flex}body.ribbon-vertical-expand:not(.is-mobile){--ribbon-width:0px}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left{width:10px;flex-basis:10px;opacity:0;position:fixed;height:100%;top:0;bottom:0;left:0;z-index:10;transition:all var(--ribbon-animation-duration) linear .6s}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left .side-dock-actions{transition:opacity var(--ribbon-animation-duration) linear .3s}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left:hover{width:44px;opacity:1;flex-basis:44px;transition:opacity var(--ribbon-animation-duration) linear .1s}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left:hover .side-dock-actions{opacity:1;transition:opacity calc(var(--ribbon-animation-duration)*2) linear .2s}body.ribbon-vertical-expand:not(.is-mobile).labeled-nav .workspace-ribbon.mod-left~.mod-left-split .workspace-tab-header-container{margin-left:0;transition:all var(--ribbon-animation-duration) linear .6s}body.ribbon-vertical-expand:not(.is-mobile).labeled-nav .workspace-ribbon.mod-left:hover~.mod-left-split .workspace-tab-header-container{margin-left:44px;transition:all var(--ribbon-animation-duration) linear}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left~.mod-left-split .workspace-tab-container{padding-left:0;transition:all var(--ribbon-animation-duration) linear .6s}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left~.mod-left-split .workspace-sidedock-vault-profile{transition:all var(--ribbon-animation-duration) linear .6s}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left:hover~.mod-left-split .workspace-tab-container{padding-left:44px;transition:all var(--ribbon-animation-duration) linear}body.ribbon-vertical-expand:not(.is-mobile) .workspace-ribbon.mod-left:hover~.mod-left-split .workspace-sidedock-vault-profile{padding-left:52px;transition:all var(--ribbon-animation-duration) linear}.hider-ribbon .workspace-ribbon.mod-left:before,.ribbon-bottom-left-hover .workspace-ribbon.mod-left:before,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left:before{opacity:0}.hider-ribbon .workspace-ribbon-collapse-btn,.ribbon-bottom-left-hover .workspace-ribbon-collapse-btn,.ribbon-bottom-left-hover-vertical .workspace-ribbon-collapse-btn{display:none}.hider-ribbon .workspace-ribbon.mod-right,.ribbon-bottom-left-hover .workspace-ribbon.mod-right,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-right{pointer-events:none}.hider-ribbon .workspace-ribbon.mod-left,.ribbon-bottom-left-hover .workspace-ribbon.mod-left,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left{overflow:visible;border-top:var(--border-width) solid var(--background-modifier-border)!important;border-right:var(--border-width) solid var(--background-modifier-border)!important;border-top-right-radius:var(--radius-m);padding:0;position:absolute;border-right:0px;margin:0;width:auto;height:44px;flex-basis:0;bottom:0;top:auto;background:var(--background-secondary);display:var(--hider-ribbon-display)!important;flex-direction:row;z-index:17;opacity:0;transition:opacity calc(var(--ribbon-animation-duration)*2) ease-in-out;filter:drop-shadow(2px 10px 30px rgba(0, 0, 0, .2));gap:0}.hider-ribbon .side-dock-actions,.hider-ribbon .side-dock-settings,.ribbon-bottom-left-hover .side-dock-actions,.ribbon-bottom-left-hover .side-dock-settings,.ribbon-bottom-left-hover-vertical .side-dock-actions,.ribbon-bottom-left-hover-vertical .side-dock-settings{flex-direction:row;display:var(--hider-ribbon-display);background:rgba(0,0,0,0);margin:0;position:relative;gap:var(--size-2-2)}.hider-ribbon .side-dock-actions,.ribbon-bottom-left-hover .side-dock-actions,.ribbon-bottom-left-hover-vertical .side-dock-actions{padding:6px 6px 6px 8px}.hider-ribbon .side-dock-settings:empty,.ribbon-bottom-left-hover .side-dock-settings:empty,.ribbon-bottom-left-hover-vertical .side-dock-settings:empty{display:none}.hider-ribbon .workspace-ribbon.mod-left .side-dock-ribbon-action,.ribbon-bottom-left-hover .workspace-ribbon.mod-left .side-dock-ribbon-action,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left .side-dock-ribbon-action{display:var(--hider-ribbon-display)}.hider-ribbon .workspace-ribbon.mod-left:hover,.ribbon-bottom-left-hover .workspace-ribbon.mod-left:hover,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left:hover{opacity:1;transition:opacity .25s ease-in-out}.hider-ribbon .workspace-ribbon.mod-left .workspace-ribbon-collapse-btn,.ribbon-bottom-left-hover .workspace-ribbon.mod-left .workspace-ribbon-collapse-btn,.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left .workspace-ribbon-collapse-btn{opacity:0}.hider-ribbon .workspace-split.mod-left-split,.ribbon-bottom-left-hover .workspace-split.mod-left-split,.ribbon-bottom-left-hover-vertical .workspace-split.mod-left-split{margin:0}.hider-ribbon .workspace-leaf-content .item-list,.ribbon-bottom-left-hover .workspace-leaf-content .item-list,.ribbon-bottom-left-hover-vertical .workspace-leaf-content .item-list{padding-bottom:40px}.ribbon-bottom-left-hover-vertical .workspace-ribbon.mod-left{height:auto}.ribbon-bottom-left-hover-vertical .side-dock-actions{flex-direction:column;padding:8px 6px}.minimal-status-off .status-bar{--status-bar-position:static;--status-bar-radius:0;--status-bar-border-width:1px 0 0 0;--status-bar-background:var(--background-secondary);--status-bar-border-color:var(--ui1)}body:not(.minimal-status-off) .status-bar{background-color:var(--background-primary);--status-bar-border-width:0}.status-bar{transition:color .2s linear;color:var(--text-faint);font-size:var(--font-adaptive-smallest)}.status-bar .sync-status-icon.mod-success,.status-bar .sync-status-icon.mod-working{color:var(--text-faint)}.status-bar:hover,.status-bar:hover .sync-status-icon.mod-success,.status-bar:hover .sync-status-icon.mod-working{color:var(--text-muted);transition:color .2s linear}.status-bar .plugin-sync:hover .sync-status-icon.mod-success,.status-bar .plugin-sync:hover .sync-status-icon.mod-working{color:var(--text-normal)}.status-bar .status-bar-item{cursor:var(--cursor)!important}.status-bar .status-bar-item.cMenu-statusbar-button:hover,.status-bar .status-bar-item.mod-clickable:hover,.status-bar .status-bar-item.plugin-editor-status:hover,.status-bar .status-bar-item.plugin-sync:hover{text-align:center;background-color:var(--background-modifier-hover)!important}.tab-stack-top-flipped{--tab-stacked-text-transform:rotate(180deg);--tab-stacked-text-align:right}.tab-stack-center{--tab-stacked-text-align:center}.tab-stack-center-flipped{--tab-stacked-text-transform:rotate(180deg);--tab-stacked-text-align:center}.tab-stack-bottom{--tab-stacked-text-transform:rotate(180deg)}.tab-stack-bottom-flipped{--tab-stacked-text-align:right}.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header-inner{flex-direction:var(--tab-stacked-spine-order)}.view-header-title,.view-header-title-parent{text-overflow:ellipsis}.view-header-title-container:not(.mod-at-end):after{display:none}body:not(.is-mobile) .view-actions .view-action:last-child{margin-left:-1px}.minimal-focus-mode .workspace-ribbon:not(.is-collapsed)~.mod-root .view-header:hover .view-actions,.mod-right.is-collapsed~.mod-root .view-header:hover .view-actions,.view-action.is-active:hover,.workspace-ribbon.mod-left.is-collapsed~.mod-root .view-header:hover .view-actions,body:not(.minimal-focus-mode) .workspace-ribbon:not(.is-collapsed)~.mod-root .view-actions{opacity:1;transition:opacity .25s ease-in-out}.view-header-title-container{opacity:0;transition:opacity .1s ease-in-out}.view-header-title-container:focus-within{opacity:1;transition:opacity .1s ease-in-out}.view-header:hover .view-header-title-container,.workspace-tab-header-container:hover+.workspace-tab-container .view-header-title-container{opacity:1;transition:opacity .1s ease-in-out}.is-phone .view-header-title-container,.minimal-tab-title-visible .view-header-title-container{opacity:1}.minimal-tab-title-hidden .view-header-title-container{opacity:0}.minimal-tab-title-hidden .view-header-title-container:focus-within{opacity:1;transition:opacity .1s ease-in-out}.minimal-tab-title-hidden .view-header:hover .view-header-title-container,.minimal-tab-title-hidden .workspace-tab-header-container:hover+.workspace-tab-container .view-header-title-container{opacity:0}body.window-title-off .titlebar-text{display:none}.titlebar-button-container.mod-right{background-color:rgba(0,0,0,0)!important}.is-hidden-frameless.theme-dark:not(.minimal-dark-black):not(.colorful-frame),.is-hidden-frameless.theme-light:not(.minimal-light-tonal):not(.colorful-frame):not(.minimal-light-white){--titlebar-background:var(--bg1)}.is-hidden-frameless.theme-dark:not(.minimal-dark-black):not(.colorful-frame).is-focused .sidebar-toggle-button.mod-right,.is-hidden-frameless.theme-dark:not(.minimal-dark-black):not(.colorful-frame).is-focused .workspace-ribbon.mod-left.is-collapsed,.is-hidden-frameless.theme-dark:not(.minimal-dark-black):not(.colorful-frame).is-focused .workspace-tabs.mod-top,.is-hidden-frameless.theme-light:not(.minimal-light-tonal):not(.colorful-frame):not(.minimal-light-white).is-focused .sidebar-toggle-button.mod-right,.is-hidden-frameless.theme-light:not(.minimal-light-tonal):not(.colorful-frame):not(.minimal-light-white).is-focused .workspace-ribbon.mod-left.is-collapsed,.is-hidden-frameless.theme-light:not(.minimal-light-tonal):not(.colorful-frame):not(.minimal-light-white).is-focused .workspace-tabs.mod-top{--titlebar-background-focused:var(--bg1)}.is-hidden-frameless.theme-dark:not(.minimal-dark-black):not(.colorful-frame):not(.minimal-dark-tonal):not(.minimal-light-white) .workspace-ribbon.mod-left:not(.is-collapsed),.is-hidden-frameless.theme-light:not(.minimal-light-tonal):not(.colorful-frame):not(.minimal-light-white):not(.minimal-dark-tonal):not(.minimal-light-white) .workspace-ribbon.mod-left:not(.is-collapsed){--titlebar-background:var(--bg2)}.mod-macos.is-hidden-frameless:not(.is-popout-window) .sidebar-toggle-button.mod-right{right:0;padding-right:var(--size-4-2)}body.is-focused{--titlebar-background-focused:var(--background-secondary)}.is-hidden-frameless:not(.colorful-frame) .mod-left-split .mod-top .workspace-tab-header-container{--tab-container-background:var(--background-secondary)}.mod-root .workspace-tab-header-status-icon{color:var(--text-muted)}.is-collapsed .workspace-sidedock-vault-profile{opacity:0}body:not(.is-mobile).hide-help .workspace-drawer-vault-actions .clickable-icon:first-child{display:none}body:not(.is-mobile).hide-settings .workspace-drawer-vault-actions .clickable-icon:last-child{display:none}body:not(.is-mobile).hide-help.hide-settings .workspace-drawer-vault-actions{display:none!important}body:not(.is-grabbing):not(.is-fullscreen).labeled-nav.is-hidden-frameless.vault-profile-top .mod-left-split .mod-top .workspace-tab-header-container{-webkit-app-region:no-drag}body:not(.is-grabbing):not(.is-fullscreen).labeled-nav.is-hidden-frameless.vault-profile-top .mod-left-split .mod-top .workspace-tab-header-container:before{position:absolute;top:0;content:"";height:var(--header-height);width:100%;-webkit-app-region:drag}body:not(.is-mobile):not(.labeled-nav).vault-profile-top .workspace-split.mod-left-split .mod-top .workspace-tab-container{margin-top:calc(var(--header-height) + 8px)}body:not(.is-mobile):not(.labeled-nav).vault-profile-top .workspace-split.mod-left-split .workspace-sidedock-vault-profile{-webkit-app-region:no-drag;position:absolute;top:var(--header-height);z-index:6;width:100%;border-top:0;border-bottom:1px solid var(--background-modifier-border)}body:not(.is-mobile):not(.labeled-nav).vault-profile-top .workspace-split.mod-left-split .workspace-sidedock-vault-profile .workspace-drawer-vault-switcher{padding-left:var(--size-4-2)}body:not(.is-mobile).labeled-nav.vault-profile-top .workspace-split.mod-left-split .workspace-sidedock-vault-profile{-webkit-app-region:no-drag;position:absolute;top:var(--labeled-nav-top-margin);z-index:6;width:100%;background-color:rgba(0,0,0,0);border-top:0;border-bottom:1px solid var(--background-modifier-border)}body:not(.is-mobile).labeled-nav.vault-profile-top .workspace-split.mod-left-split .workspace-sidedock-vault-profile .workspace-drawer-vault-switcher{padding-left:var(--size-4-2)}.vault-profile-top .workspace-tab-header-container-inner{--labeled-nav-top-margin:84px}.document-replace,.document-search{max-width:100%;padding:0}.document-search-container{margin:0 auto;max-width:var(--max-width);width:var(--line-width)}.modal-button-container .mod-checkbox{--checkbox-radius:4px}.modal-container.mod-confirmation .modal{width:480px;min-width:0}.hide-settings-desc.is-phone .setting-item{padding:.65em 0}.hide-settings-desc.is-phone .setting-item-name{font-weight:400;font-size:16px}.hide-settings-desc .setting-item-name{transition:max-height .2s ease-in-out,padding-top .2s ease-in-out}.hide-settings-desc .setting-item-name:active+.setting-item-description{opacity:1;max-height:500px;padding-top:4px;transition:opacity .1s ease-out,max-height .2s ease-out,padding-top .2s ease-in-out}.hide-settings-desc .setting-item-description{opacity:0;max-height:0;padding-top:0;transition:max-height .2s ease-in-out,padding-top .2s ease-in-out}.popover{--file-margins:var(--size-4-6) var(--size-4-6) var(--size-4-6)}.minimal-line-nums .popover .markdown-source-view{--file-margins:var(--size-4-4) var(--size-4-6) var(--size-4-6) var(--size-4-12)}.minimal-line-nums .popover .markdown-source-view.is-rtl{--file-margins:var(--size-4-4) var(--size-4-12) var(--size-4-6) var(--size-4-6)}body{--progress-outline:var(--background-modifier-border);--progress-complete:var(--text-accent)}.markdown-preview-view progress,.markdown-rendered progress,.markdown-source-view.is-live-preview progress{width:220px}.markdown-preview-view progress[value]::-webkit-progress-bar,.markdown-rendered progress[value]::-webkit-progress-bar,.markdown-source-view.is-live-preview progress[value]::-webkit-progress-bar{box-shadow:inset 0 0 0 var(--border-width) var(--progress-outline)}.markdown-preview-view progress[value^="1"]::-webkit-progress-value,.markdown-preview-view progress[value^="2"]::-webkit-progress-value,.markdown-preview-view progress[value^="3"]::-webkit-progress-value,.markdown-rendered progress[value^="1"]::-webkit-progress-value,.markdown-rendered progress[value^="2"]::-webkit-progress-value,.markdown-rendered progress[value^="3"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="1"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="2"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="3"]::-webkit-progress-value{background-color:var(--color-red)}.markdown-preview-view progress[value^="4"]::-webkit-progress-value,.markdown-preview-view progress[value^="5"]::-webkit-progress-value,.markdown-rendered progress[value^="4"]::-webkit-progress-value,.markdown-rendered progress[value^="5"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="4"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="5"]::-webkit-progress-value{background-color:var(--color-orange)}.markdown-preview-view progress[value^="6"]::-webkit-progress-value,.markdown-preview-view progress[value^="7"]::-webkit-progress-value,.markdown-rendered progress[value^="6"]::-webkit-progress-value,.markdown-rendered progress[value^="7"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="6"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="7"]::-webkit-progress-value{background-color:var(--color-yellow)}.markdown-preview-view progress[value^="8"]::-webkit-progress-value,.markdown-preview-view progress[value^="9"]::-webkit-progress-value,.markdown-rendered progress[value^="8"]::-webkit-progress-value,.markdown-rendered progress[value^="9"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="8"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value^="9"]::-webkit-progress-value{background-color:var(--color-green)}.markdown-preview-view progress[value="1"]::-webkit-progress-value,.markdown-preview-view progress[value="100"]::-webkit-progress-value,.markdown-rendered progress[value="1"]::-webkit-progress-value,.markdown-rendered progress[value="100"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="1"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="100"]::-webkit-progress-value{background-color:var(--progress-complete)}.markdown-preview-view progress[value="0"]::-webkit-progress-value,.markdown-preview-view progress[value="2"]::-webkit-progress-value,.markdown-preview-view progress[value="3"]::-webkit-progress-value,.markdown-preview-view progress[value="4"]::-webkit-progress-value,.markdown-preview-view progress[value="5"]::-webkit-progress-value,.markdown-preview-view progress[value="6"]::-webkit-progress-value,.markdown-preview-view progress[value="7"]::-webkit-progress-value,.markdown-preview-view progress[value="8"]::-webkit-progress-value,.markdown-preview-view progress[value="9"]::-webkit-progress-value,.markdown-rendered progress[value="0"]::-webkit-progress-value,.markdown-rendered progress[value="2"]::-webkit-progress-value,.markdown-rendered progress[value="3"]::-webkit-progress-value,.markdown-rendered progress[value="4"]::-webkit-progress-value,.markdown-rendered progress[value="5"]::-webkit-progress-value,.markdown-rendered progress[value="6"]::-webkit-progress-value,.markdown-rendered progress[value="7"]::-webkit-progress-value,.markdown-rendered progress[value="8"]::-webkit-progress-value,.markdown-rendered progress[value="9"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="0"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="2"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="3"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="4"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="5"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="6"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="7"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="8"]::-webkit-progress-value,.markdown-source-view.is-live-preview progress[value="9"]::-webkit-progress-value{background-color:var(--color-red)}.tooltip{transition:none;animation:none}.tooltip.mod-left,.tooltip.mod-right{animation:none}.tooltip.mod-error{color:var(--text-error)}.markdown-preview-view blockquote{padding-inline-start:var(--nested-padding);font-size:var(--blockquote-size)}.markdown-source-view.mod-cm6 .HyperMD-quote,.markdown-source-view.mod-cm6.is-live-preview .HyperMD-quote{font-size:var(--blockquote-size)}.is-live-preview .cm-hmd-indent-in-quote{color:var(--text-faint)}.is-live-preview.is-readable-line-width>.cm-callout .callout{max-width:var(--max-width);margin:0 auto}.callouts-outlined .callout .callout-title{background-color:var(--background-primary);margin-top:-24px;z-index:200;width:fit-content;padding:0 .5em;margin-left:-.75em;letter-spacing:.05em;font-variant-caps:all-small-caps}.callouts-outlined .callout{overflow:visible;--callout-border-width:1px;--callout-border-opacity:0.5;--callout-title-size:0.8em;--callout-blend-mode:normal;background-color:rgba(0,0,0,0)}.callouts-outlined .cm-embed-block.cm-callout{padding-top:12px}.callouts-outlined .callout-content .callout{margin-top:18px}body{--checkbox-radius:50%;--checkbox-top:2px;--checkbox-left:0px;--checkbox-margin:0px 6px 0px -2em}.checkbox-square{--checkbox-size:calc(var(--font-text-size) * 0.85);--checkbox-radius:4px;--checkbox-top:1px;--checkbox-left:0px;--checkbox-margin:0px 8px 0px -2em}body.minimal-strike-lists{--checklist-done-decoration:line-through}body:not(.minimal-strike-lists){--checklist-done-decoration:none;--checklist-done-color:var(--text-normal)}.markdown-preview-section>.contains-task-list{padding-bottom:.5em}.mod-cm6 .HyperMD-task-line[data-task] .cm-formatting-list-ol~.task-list-label .task-list-item-checkbox{margin:1px}.markdown-preview-view .task-list-item-checkbox{position:relative;top:var(--checkbox-top);left:var(--checkbox-left)}.markdown-preview-view ul>li.task-list-item{text-indent:0}.minimal-code-scroll{--code-white-space:pre}.minimal-code-scroll .HyperMD-codeblock.HyperMD-codeblock-bg{overflow-y:scroll;white-space:pre}.minimal-code-scroll .cm-hmd-codeblock{white-space:pre!important}@media print{.print{--code-background:#eee!important}}body{--embed-max-height:none;--embed-decoration-style:solid;--embed-decoration-color:var(--background-modifier-border-hover)}.embed-strict{--embed-background:transparent;--embed-border-start:0;--embed-border-left:0;--embed-padding:0}.embed-strict .markdown-embed-content{--folding-offset:0px}.embed-strict .internal-embed .markdown-embed,.embed-strict .markdown-preview-view .markdown-embed,.embed-strict.markdown-preview-view .markdown-embed{padding:0}.embed-strict .internal-embed .markdown-embed .markdown-embed-title,.embed-strict .markdown-embed-title{display:none}.embed-strict .internal-embed:not([src*="#^"]) .markdown-embed-link{width:24px;opacity:0}.embed-underline .internal-embed:not(.pdf-embed,.bases-embed){text-decoration-line:underline;text-decoration-style:var(--embed-decoration-style);text-decoration-color:var(--embed-decoration-color)}.embed-hide-title .markdown-embed-title{display:none}.contextual-typography .embed-strict .internal-embed .markdown-preview-view .markdown-preview-sizer>div,.embed-strict.contextual-typography .internal-embed .markdown-preview-view .markdown-preview-sizer>div{margin:0;width:100%}.markdown-embed .markdown-preview-view .markdown-preview-sizer{padding-bottom:0!important}.markdown-preview-view.is-readable-line-width .markdown-embed .markdown-preview-sizer,.markdown-preview-view.markdown-embed .markdown-preview-sizer{max-width:100%;width:100%;min-height:0!important;padding-bottom:0!important}.markdown-embed .markdown-preview-section div:last-child p,.markdown-embed .markdown-preview-section div:last-child ul{margin-block-end:2px}.markdown-preview-view .markdown-embed{margin-top:var(--nested-padding);padding:0 calc(var(--nested-padding)/2) 0 var(--nested-padding)}.internal-embed:not([src*="#^"]) .markdown-embed-link{right:0;width:100%}.file-embed-link,.markdown-embed-link{top:0;right:0;text-align:right;justify-content:flex-end}.file-embed-link svg,.markdown-embed-link svg{width:16px;height:16px}.markdown-embed .file-embed-link,.markdown-embed .markdown-embed-link{opacity:.6;transition:opacity .1s linear}.markdown-embed .file-embed-link:hover,.markdown-embed .markdown-embed-link:hover{opacity:1}.markdown-embed .file-embed-link:hover:hover,.markdown-embed .markdown-embed-link:hover:hover{background-color:rgba(0,0,0,0);--icon-color:var(--text-accent)}.file-embed-link:hover,.markdown-embed-link:hover{color:var(--text-muted)}.markdown-embed .markdown-preview-view{padding:0}.internal-embed .markdown-embed{border:0;border-left:1px solid var(--quote-opening-modifier);border-radius:0}a[href*="obsidian://search"]{background-image:url("data:image/svg+xml,")}.theme-dark a[href*="obsidian://search"]{background-image:url("data:image/svg+xml,")}.plain-external-links .external-link{background-image:none;padding-right:0}body{--adaptive-list-edit-offset:var(--list-edit-offset)}.is-rtl{--adaptive-list-edit-offset:calc(var(--list-edit-offset)*-1)}.markdown-preview-view ol>li,.markdown-preview-view ul>li,.markdown-source-view ol>li,.markdown-source-view ul>li,.mod-cm6 .HyperMD-list-line.cm-line{padding-top:var(--list-spacing);padding-bottom:var(--list-spacing)}.is-mobile ul>li:not(.task-list-item)::marker{font-size:.8em}.is-mobile .workspace-leaf-content:not([data-type=search]) .workspace-leaf-content[data-type=markdown] .nav-buttons-container{border-bottom:none;padding-top:5px}.is-mobile .mod-root .workspace-leaf-content[data-type=markdown] .search-input-container{width:calc(100% - 160px)}.embedded-backlinks .backlink-pane>.tree-item-self,.embedded-backlinks .backlink-pane>.tree-item-self:hover{text-transform:none;color:var(--text-normal);font-size:var(--font-adaptive-normal);font-weight:500;letter-spacing:unset}body{--pdf-dark-opacity:1}.theme-dark:not(.pdf-shadows-on),.theme-light:not(.pdf-shadows-on){--pdf-shadow:none;--pdf-thumbnail-shadow:none}.theme-dark:not(.pdf-shadows-on) .pdf-viewer .page,.theme-dark:not(.pdf-shadows-on) .pdfViewer .page,.theme-light:not(.pdf-shadows-on) .pdf-viewer .page,.theme-light:not(.pdf-shadows-on) .pdfViewer .page{border:0}.theme-dark:not(.pdf-shadows-on) .pdf-sidebar-container .thumbnailSelectionRing,.theme-light:not(.pdf-shadows-on) .pdf-sidebar-container .thumbnailSelectionRing{padding:0}.theme-dark:not(.pdf-shadows-on) .pdf-sidebar-container .thumbnail::after,.theme-light:not(.pdf-shadows-on) .pdf-sidebar-container .thumbnail::after{right:var(--size-4-2);bottom:var(--size-4-2)}.theme-dark{--pdf-thumbnail-shadow:0 0 1px 0 rgba(0,0,0,0.6);--pdf-shadow:0 0 1px 0 rgba(0,0,0,0.6)}.theme-dark .pdf-viewer .canvasWrapper,.theme-dark .pdfViewer .canvasWrapper{opacity:var(--pdf-dark-opacity)}.theme-dark.pdf-invert-dark .workspace-leaf-content[data-type=pdf] .pdf-viewer .canvasWrapper,.theme-dark.pdf-invert-dark .workspace-leaf-content[data-type=pdf] .pdfViewer .canvasWrapper{filter:invert(1) hue-rotate(180deg);mix-blend-mode:screen}.theme-light.pdf-blend-light .workspace-leaf-content[data-type=pdf] .pdf-viewer .canvasWrapper,.theme-light.pdf-blend-light .workspace-leaf-content[data-type=pdf] .pdfViewer .canvasWrapper{mix-blend-mode:multiply}body{--table-header-border-width:0;--table-column-first-border-width:0;--table-column-last-border-width:0;--table-row-last-border-width:0;--table-edge-cell-padding-first:0;--table-edge-cell-padding-last:0;--table-cell-padding:4px 10px;--table-header-size:var(--table-text-size)}.markdown-source-view.mod-cm6 table{border-collapse:collapse}.markdown-rendered th{--table-header-size:var(--table-text-size)}.markdown-preview-view table,.markdown-source-view.mod-cm6 table{border:var(--border-width) solid var(--border-color);border-collapse:collapse}.markdown-preview-view td,.markdown-preview-view th,.markdown-source-view.mod-cm6 td,.markdown-source-view.mod-cm6 th{padding:var(--table-cell-padding)}.markdown-preview-view td:first-child,.markdown-preview-view th:first-child,.markdown-source-view.mod-cm6 td:first-child,.markdown-source-view.mod-cm6 th:first-child{padding-inline-start:var(--table-edge-cell-padding-first)}.markdown-preview-view td:first-child .table-cell-wrapper,.markdown-preview-view th:first-child .table-cell-wrapper,.markdown-source-view.mod-cm6 td:first-child .table-cell-wrapper,.markdown-source-view.mod-cm6 th:first-child .table-cell-wrapper{padding-inline-start:0}.markdown-preview-view td:last-child,.markdown-preview-view th:last-child,.markdown-source-view.mod-cm6 td:last-child,.markdown-source-view.mod-cm6 th:last-child{padding-inline-end:var(--table-edge-cell-padding-last)}.markdown-preview-view td:last-child .table-cell-wrapper,.markdown-preview-view th:last-child .table-cell-wrapper,.markdown-source-view.mod-cm6 td:last-child .table-cell-wrapper,.markdown-source-view.mod-cm6 th:last-child .table-cell-wrapper{padding-inline-end:0}.markdown-source-view.mod-cm6 .cm-table-widget table{margin-top:0}.markdown-source-view.mod-cm6 .cm-table-widget .table-cell-wrapper{padding:var(--table-cell-padding)}.markdown-reading-view table{--p-spacing:0.5rem}.cm-embed-block.cm-table-widget.markdown-rendered{padding:var(--table-drag-padding);overscroll-behavior-x:none}.is-mobile .cm-embed-block.cm-table-widget.markdown-rendered{padding-bottom:40px}.markdown-preview-view th,.markdown-source-view.mod-cm6 .dataview.table-view-table thead.table-view-thead tr th,.table-view-table>thead>tr>th{padding:var(--table-cell-padding)}.markdown-preview-view th:first-child,.markdown-source-view.mod-cm6 .dataview.table-view-table thead.table-view-thead tr th:first-child,.table-view-table>thead>tr>th:first-child{padding-inline-start:var(--table-edge-cell-padding-first)}.markdown-preview-view th:last-child,.markdown-source-view.mod-cm6 .dataview.table-view-table thead.table-view-thead tr th:last-child,.table-view-table>thead>tr>th:last-child{padding-inline-end:var(--table-edge-cell-padding-last)}.cm-hmd-table-sep-dummy,.cm-s-obsidian .HyperMD-table-row span.cm-hmd-table-sep{color:var(--text-faint);font-weight:400}body.minimal-unstyled-tags{--tag-background:transparent;--tag-background-hover:transparent;--tag-border-width:0px;--tag-padding-x:0;--tag-padding-y:0;--tag-size:inherit;--tag-color-hover:var(--text-accent-hover)}body.minimal-unstyled-tags.is-mobile.theme-dark{--tag-background:transparent}body:not(.minimal-unstyled-tags){--tag-size:0.8em;--tag-padding-y:0.2em;--tag-background:transparent;--tag-background-hover:transparent;--tag-color:var(--text-muted);--tag-border-width:1px;--tag-border-color:var(--background-modifier-border);--tag-border-color-hover:var(--background-modifier-border-hover);--tag-color-hover:var(--text-normal)}body.is-mobile.theme-dark{--tag-background:transparent}h1,h2,h3,h4{letter-spacing:-.02em}body,button,input{font-family:var(--font-interface)}.cm-s-obsidian span.cm-error{color:var(--color-red)}.markdown-preview-view,.popover,.workspace-leaf-content[data-type=markdown]{font-family:var(--font-text)}.markdown-preview-view,.view-content>.cm-s-obsidian,.view-content>.markdown-source-view.mod-cm6.is-live-preview>.cm-scroller,body{font-size:var(--font-adaptive-normal);font-weight:var(--normal-weight)}.view-content>.cm-s-obsidian,.view-content>.markdown-source-view,.view-content>.markdown-source-view.mod-cm6 .cm-scroller{font-family:var(--font-editor)}.cm-formatting:not(.cm-formatting-code-block):not(.cm-formatting-hashtag){color:var(--text-formatting)}.hide-markdown .is-live-preview .cm-formatting.cm-formatting-code.cm-inline-code,.hide-markdown .is-live-preview .cm-formatting.cm-formatting-em,.hide-markdown .is-live-preview .cm-formatting.cm-formatting-highlight,.hide-markdown .is-live-preview .cm-formatting.cm-formatting-link,.hide-markdown .is-live-preview .cm-formatting.cm-formatting-strikethrough,.hide-markdown .is-live-preview .cm-formatting.cm-formatting-strong{display:none}.hide-markdown .is-live-preview .cm-formatting-quote{opacity:0}.hide-markdown .is-live-preview .cm-formatting-header,.hide-markdown .is-live-preview .cm-formatting-link,.hide-markdown .is-live-preview .cm-hmd-internal-link.cm-link-has-alias,.hide-markdown .is-live-preview .cm-link-alias-pipe{display:none}.active-line-on .workspace-leaf-content[data-type=markdown] .cm-line.cm-active,.active-line-on .workspace-leaf-content[data-type=markdown] .markdown-source-view.mod-cm6.is-live-preview .HyperMD-quote.cm-active{background-color:var(--active-line-bg);box-shadow:-25vw 0 var(--active-line-bg),25vw 0 var(--active-line-bg)}.disable-animations{--ribbon-animation-duration:0ms;--focus-animation-duration:0ms}.disable-animations .mod-sidedock{transition-duration:0s!important}.fast-animations{--ribbon-animation-duration:0.05s;--focus-animation-duration:0.05s}.fast-animations .mod-sidedock{transition-duration:70ms!important}body{--content-margin:auto;--content-margin-start:max( calc(50% - var(--line-width)/2), calc(50% - var(--max-width)/2) );--content-line-width:min(var(--line-width), var(--max-width));--map-header-padding:2px}.markdown-preview-view .markdown-preview-sizer.markdown-preview-sizer{max-width:100%;margin-inline:auto;width:100%}.markdown-source-view.mod-cm6.is-readable-line-width .cm-content,.markdown-source-view.mod-cm6.is-readable-line-width .cm-sizer{max-width:100%;width:100%}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div,.markdown-source-view.mod-cm6.is-readable-line-width .cm-sizer>.embedded-backlinks,.markdown-source-view.mod-cm6.is-readable-line-width .cm-sizer>.inline-title,.markdown-source-view.mod-cm6.is-readable-line-width .cm-sizer>.metadata-container{max-width:var(--max-width);width:var(--line-width);margin-inline:var(--content-margin)!important}.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>:not(div){max-width:var(--content-line-width);margin-inline-start:var(--content-margin-start)!important}.is-readable-line-width{--file-margins:1rem 0 0 0}.is-mobile .markdown-preview-view{--folding-offset:0}.minimal-line-nums .workspace-leaf-content[data-type=markdown]{--file-margins:var(--size-4-8) var(--size-4-8) var(--size-4-8) 48px}.minimal-line-nums .workspace-leaf-content[data-type=markdown].is-rtl{--file-margins:var(--size-4-8) 48px var(--size-4-8) var(--size-4-8)}.minimal-line-nums .workspace-leaf-content[data-type=markdown] .is-readable-line-width{--file-margins:1rem 0 0 var(--folding-offset)}.minimal-line-nums .workspace-leaf-content[data-type=markdown] .is-readable-line-width.is-rtl{--file-margins:1rem var(--folding-offset) 0 0}.minimal-line-nums .mod-left-split .markdown-preview-view,.minimal-line-nums .mod-left-split .markdown-source-view.mod-cm6 .cm-scroller,.minimal-line-nums .mod-right-split .markdown-preview-view,.minimal-line-nums .mod-right-split .markdown-source-view.mod-cm6 .cm-scroller{--file-margins:var(--size-4-5) var(--size-4-5) var(--size-4-5) 48px}.view-content .reader-mode-content.is-readable-line-width .markdown-preview-sizer{max-width:var(--max-width);width:var(--line-width)}.markdown-preview-view .inline-embed{--max-width:100%}body{--container-table-max-width:var(--max-width);--table-max-width:none;--table-width:auto;--table-margin:inherit;--table-wrapper-width:fit-content;--container-dataview-table-width:var(--line-width);--container-img-width:var(--line-width);--container-img-max-width:var(--max-width);--img-max-width:100%;--img-width:auto;--img-margin-start:var(--content-margin-start);--img-line-width:var(--content-line-width);--container-chart-width:var(--line-width);--container-chart-max-width:var(--max-width);--chart-max-width:none;--chart-width:auto;--container-map-width:var(--line-width);--container-map-max-width:var(--max-width);--map-max-width:none;--map-width:auto;--container-iframe-width:var(--line-width);--container-iframe-max-width:var(--max-width);--iframe-max-width:none;--iframe-width:auto}body .wide{--line-width:var(--line-width-wide);--container-table-width:var(--line-width-wide);--container-dataview-table-width:var(--line-width-wide);--container-img-width:var(--line-width-wide);--container-iframe-width:var(--line-width-wide);--container-map-width:var(--line-width-wide);--container-chart-width:var(--line-width-wide)}body .max{--line-width:var(--max-width);--container-table-width:var(--max-width);--container-dataview-table-width:var(--max-width);--container-img-width:var(--max-width);--container-iframe-width:var(--max-width);--container-map-width:var(--max-width);--container-chart-width:var(--max-width)}table.dataview{--table-min-width:min(var(--line-width),var(--max-width))}.cards table.dataview{--table-width:100%;--table-min-width:none}body{--table-drag-space:16px;--container-table-margin:calc(var(--content-margin-start) - var(--table-drag-space));--container-table-width:calc(var(--line-width) + var(--table-drag-space)*2);--table-drag-padding:var(--table-drag-space)}.is-mobile{--table-drag-space:16px;--container-table-max-width:calc(100% - var(--container-table-margin))}.maximize-tables-auto{--container-table-max-width:100%;--container-table-width:100%;--container-dataview-table-width:100%;--container-table-margin:0;--table-drag-padding:var(--table-drag-space) 0;--table-max-width:100%;--table-margin:var(--content-margin-start) auto;--table-width:auto}.maximize-tables-auto .cards{--container-table-max-width:var(--max-width)}.maximize-tables-auto .cards .block-language-dataview{--table-margin:auto}.maximize-tables{--container-table-max-width:100%;--container-table-width:100%;--container-table-margin:0;--table-drag-padding:var(--table-drag-space) 0;--table-min-width:min(var(--line-width), var(--max-width));--table-max-width:100%;--table-margin:auto;--table-width:auto;--table-edge-cell-padding-first:8px;--table-edge-cell-padding-last:8px;--table-wrapper-width:auto}.table-100,.table-max,.table-wide{--table-max-width:100%;--table-width:100%}.table-wide{--container-table-width:var(--line-width-wide);--container-dataview-table-width:var(--line-width-wide);--container-table-margin:auto;--table-edge-cell-padding-first:0px}.table-max{--container-table-width:var(--max-width);--container-table-max-width:calc(var(--max-width) + var(--table-drag-space)*2);--container-dataview-table-width:var(--max-width);--container-table-margin:auto;--table-edge-cell-padding-first:0px;--table-margin:0}.table-100{--container-table-width:100%;--container-dataview-table-width:100%;--container-table-max-width:100%;--container-table-margin:0;--table-edge-cell-padding-first:16px;--table-edge-cell-padding-last:16px;--table-margin:0;--table-drag-padding:var(--table-drag-space) 0;--table-wrapper-width:min(fit-content, 100%);--bases-cards-embed-padding:0 12px;--bases-header-padding-end:var(--size-4-2);--bases-header-padding-start:var(--size-4-2)}.table-100 .bases-view[data-view-type=table]{--bases-embed-border-width:0;--bases-embed-border-radius:0}.table-100 .table-col-btn{cursor:default!important;margin-top:8px;height:var(--table-header-size);inset-inline-start:calc(100% - var(--table-drag-handle-size) - 4px)!important}.table-100 .markdown-source-view.mod-cm6,.table-100.markdown-source-view.mod-cm6{--table-drag-handle-background-active:transparent}.table-100 .markdown-source-view.mod-cm6 .cm-table-widget .table-row-drag-handle,.table-100.markdown-source-view.mod-cm6 .cm-table-widget .table-row-drag-handle{inset-inline-end:calc(100% - var(--table-drag-handle-size))!important}.img-100,.img-max,.img-wide{--img-max-width:100%;--img-width:100%}.img-wide{--container-img-width:var(--line-width-wide);--img-line-width:var(--line-width-wide);--img-margin-start:calc(50% - var(--line-width-wide)/2)}.img-max{--container-img-width:var(--max-width);--img-line-width:var(--max-width);--img-margin-start:calc(50% - var(--max-width)/2)}.img-100{--container-img-width:100%;--container-img-max-width:100%;--img-line-width:100%;--img-margin-start:0}.map-100,.map-max,.map-wide{--map-max-width:100%;--map-width:100%}.map-wide{--container-map-width:var(--line-width-wide)}.map-max{--container-map-width:var(--max-width)}.map-100{--container-map-width:100%;--container-map-max-width:100%;--map-header-padding:var(--size-4-2)}.map-100 .bases-view[data-view-type=map]{--bases-embed-border-radius:0}.chart-100,.chart-max,.chart-wide{--chart-max-width:100%;--chart-width:100%}.chart-wide{--container-chart-width:var(--line-width-wide)}.chart-max{--container-chart-width:var(--max-width)}.chart-100{--container-chart-width:100%;--container-chart-max-width:100%}.iframe-100,.iframe-max,.iframe-wide{--iframe-max-width:100%;--iframe-width:100%}.iframe-wide{--container-iframe-width:var(--line-width-wide)}.iframe-max{--container-iframe-width:var(--max-width)}.iframe-100{--container-iframe-width:100%;--container-iframe-max-width:100%}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .cm-table-widget,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(table),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .cm-table-widget,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(table){width:var(--container-table-width);max-width:var(--container-table-max-width);margin-inline:var(--container-table-margin)!important;padding-inline-start:var(--table-drag-padding)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .el-table,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .el-table{margin-inline:var(--container-table-margin)!important;padding-inline-start:var(--table-drag-padding)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .table-wrapper,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .table-wrapper{width:var(--table-wrapper-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>.bases-embed,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>:has(>.block-language-dataview table),.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>:has(>.block-language-dataviewjs table),.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(.bases-embed),.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(.block-language-base),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>.bases-embed,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>:has(>.block-language-dataview table),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>:has(>.block-language-dataviewjs table),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(.bases-embed),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(.block-language-base){width:var(--container-dataview-table-width);max-width:var(--container-table-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer table,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content table{width:var(--table-width);max-width:var(--table-max-width);margin-inline:var(--table-margin);min-width:var(--table-min-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .block-language-dataviewjs>:is(p,h1,h2,h3,h4,h5,h6),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .block-language-dataviewjs>:is(p,h1,h2,h3,h4,h5,h6){width:var(--line-width);margin-inline:var(--content-margin)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .block-language-dataviewjs>.dataview-error,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .block-language-dataviewjs>.dataview-error{margin:0 auto;width:var(--content-line-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer .dataview.dataview-error-box,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content .dataview.dataview-error-box{margin-inline:var(--table-margin)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>.image-embed,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>.image-embed{padding-top:.25rem;padding-bottom:.25rem}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>.image-embed,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(.image-embed),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>.image-embed,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(.image-embed){width:var(--container-img-width);max-width:var(--container-img-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>.image-embed img,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(.image-embed) img,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>.image-embed img,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(.image-embed) img{max-width:var(--img-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>img,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>img{max-width:var(--img-line-width);margin-inline-start:var(--img-margin-start)!important}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.block-language-dataviewjs canvas,>.block-language-chart),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.block-language-dataviewjs canvas,>.block-language-chart){width:var(--container-chart-width);max-width:var(--container-chart-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.block-language-dataviewjs canvas,>.block-language-chart) canvas,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.block-language-dataviewjs canvas,>.block-language-chart) canvas{max-width:var(--chart-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(.bases-view[data-view-type=map]),.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.block-language-leaflet),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(.bases-view[data-view-type=map]),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.block-language-leaflet){width:var(--container-map-width);max-width:var(--container-map-max-width);--bases-header-padding-end:var(--map-header-padding);--bases-header-padding-start:var(--map-header-padding)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(.bases-view[data-view-type=map]) iframe,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.block-language-leaflet) iframe,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(.bases-view[data-view-type=map]) iframe,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.block-language-leaflet) iframe{max-width:var(--map-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.cm-html-embed),.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(>iframe),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.cm-html-embed),.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(>iframe){width:var(--container-iframe-width);max-width:var(--container-iframe-max-width)}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer div:has(>.cm-html-embed) iframe,.markdown-preview-view.is-readable-line-width .markdown-preview-sizer>div:has(>iframe) iframe,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content div:has(>.cm-html-embed) iframe,.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(>iframe) iframe{max-width:var(--iframe-max-width)}.borders-none{--divider-width:0px;--tab-outline-width:0px}body:is(.borders-none) .mod-root .workspace-tab-header-container:is(div,:hover){--tab-outline-width:0px}body{--cards-min-width:180px;--cards-max-width:1fr;--cards-mobile-width:120px;--cards-image-height:400px;--cards-padding:1.2em;--cards-image-fit:contain;--cards-background:transparent;--cards-background-hover:transparent;--cards-border-width:1px;--cards-aspect-ratio:auto;--cards-columns:repeat(auto-fit, minmax(var(--cards-min-width), var(--cards-max-width)))}@media(max-width:400pt){body{--cards-min-width:var(--cards-mobile-width)}}.cards.table-100 table.dataview tbody,.table-100 .cards table.dataview tbody{padding:.25rem .75rem}.cards table.dataview{--table-width:100%;--table-edge-cell-padding-first:calc(var(--cards-padding)/2);--table-edge-cell-padding-last:calc(var(--cards-padding)/2);--table-cell-padding:calc(var(--cards-padding)/3) calc(var(--cards-padding)/2);line-height:1.3}.cards table.dataview tbody{clear:both;padding:.5rem 0;display:grid;grid-template-columns:var(--cards-columns);grid-column-gap:.75rem;grid-row-gap:.75rem}.cards table.dataview>tbody>tr{background-color:var(--cards-background);border:var(--cards-border-width) solid var(--background-modifier-border);display:flex;flex-direction:column;margin:0;padding:0 0 calc(var(--cards-padding)/3) 0;border-radius:6px;overflow:hidden;transition:box-shadow .15s linear;max-width:var(--cards-max-width);height:auto}.cards table.dataview>tbody>tr:hover{background-color:var(--cards-background-hover)!important;border:var(--cards-border-width) solid var(--background-modifier-border-hover);box-shadow:0 4px 6px 0 rgba(0,0,0,.05),0 1px 3px 1px rgba(0,0,0,.025);transition:box-shadow .15s linear}.cards table.dataview tbody>tr>td:first-child{font-weight:var(--bold-weight);border:none}.cards table.dataview tbody>tr>td:first-child a{display:block}.cards table.dataview tbody>tr>td:last-child{border:none}.cards table.dataview tbody>tr>td:not(:first-child){font-size:calc(var(--table-text-size)*.9);color:var(--text-muted)}.cards table.dataview tbody>tr>td>*{padding:calc(var(--cards-padding)/3) 0}.cards table.dataview tbody>tr>td:not(:last-child):not(:first-child){padding:4px 0;border-bottom:1px solid var(--background-modifier-border);width:calc(100% - var(--cards-padding));margin:0 calc(var(--cards-padding)/2)}.cards table.dataview tbody>tr>td a{text-decoration:none}.cards table.dataview tbody>tr>td>button{width:100%;margin:calc(var(--cards-padding)/2) 0}.cards table.dataview tbody>tr>td:last-child>button{margin-bottom:calc(var(--cards-padding)/6)}.cards table.dataview tbody>tr>td>ul{width:100%;padding:.25em 0!important;margin:0 auto!important}.cards table.dataview tbody>tr>td img{aspect-ratio:var(--cards-aspect-ratio);width:100%;object-fit:var(--cards-image-fit);max-height:var(--cards-image-height);background-color:var(--background-secondary);vertical-align:bottom}.markdown-source-view.mod-cm6.cards .dataview.table-view-table>tbody>tr>td,.trim-cols .cards table.dataview tbody>tr>td{white-space:normal}.links-int-on .cards table{--link-decoration:none}.markdown-source-view.mod-cm6.cards .edit-block-button{top:-1px;right:28px;opacity:1}.cards.table-100 table.dataview thead>tr,.table-100 .cards table.dataview thead>tr{right:.75rem}.cards.table-100 table.dataview thead:before,.table-100 .cards table.dataview thead:before{margin-right:.75rem}.cards table.dataview thead{user-select:none;width:180px;display:block;float:right;position:relative;text-align:right;height:24px;padding-bottom:0}.cards table.dataview thead:hover:after{background-color:var(--background-modifier-hover)}.cards table.dataview thead:hover:before{background-color:var(--text-muted)}.cards table.dataview thead:after,.cards table.dataview thead:before{content:"";position:absolute;right:0;top:0;width:10px;height:16px;cursor:var(--cursor);text-align:right;padding:var(--size-4-1) var(--size-4-2);margin-bottom:2px;border-radius:var(--radius-s);font-weight:500;font-size:var(--font-adaptive-small)}.cards table.dataview thead:before{background-color:var(--text-faint);-webkit-mask-repeat:no-repeat;-webkit-mask-size:16px;-webkit-mask-position:center center;-webkit-mask-image:url('data:image/svg+xml;utf8,')}.cards table.dataview thead>tr{top:-1px;position:absolute;display:none;z-index:9;border:1px solid var(--background-modifier-border-hover);background-color:var(--background-secondary);box-shadow:var(--shadow-s);padding:6px;border-radius:var(--radius-m);flex-direction:column;margin:24px 0 0 0;width:100%}.cards table.dataview thead:hover>tr{display:flex;height:auto}.cards table.dataview thead>tr>th{display:block;padding:3px 30px 3px 6px!important;border-radius:var(--radius-s);width:100%;font-weight:400;color:var(--text-normal);cursor:var(--cursor);border:none;font-size:var(--font-ui-small)}.cards table.dataview thead>tr>th[sortable-style=sortable-asc],.cards table.dataview thead>tr>th[sortable-style=sortable-desc]{color:var(--text-normal)}.cards table.dataview thead>tr>th:hover{color:var(--text-normal);background-color:var(--background-modifier-hover)}.list-cards.markdown-preview-view .list-bullet,.list-cards.markdown-preview-view .list-collapse-indicator,.list-cards.markdown-preview-view.markdown-rendered.show-indentation-guide li>ul::before{display:none}.list-cards.markdown-preview-view div>ul{display:grid;gap:.75rem;grid-template-columns:var(--cards-columns);padding:0;line-height:var(--line-height-tight)}.list-cards.markdown-preview-view div>ul .contains-task-list{padding-inline-start:calc(var(--cards-padding)*1.5)}.list-cards.markdown-preview-view div>ul>li.task-list-item>.task-list-item-checkbox{margin-inline-start:3px}.list-cards.markdown-preview-view div>ul>li{background-color:var(--cards-background);padding:calc(var(--cards-padding)/2);border-radius:var(--radius-s);border:var(--cards-border-width) solid var(--background-modifier-border);overflow:hidden;margin-inline-start:0}.list-cards.markdown-preview-view div>ul .image-embed{padding:0;display:block;background-color:var(--background-secondary);border-radius:var(--image-radius)}.list-cards.markdown-preview-view div>ul .image-embed img{aspect-ratio:var(--cards-aspect-ratio);object-fit:var(--cards-image-fit);max-height:var(--cards-image-height);background-color:var(--background-secondary);vertical-align:bottom}.list-cards.markdown-preview-view div>ul>li>a{--link-decoration:none;--link-external-decoration:none;font-weight:var(--bold-weight)}.list-cards.markdown-preview-view div ul>li:hover{border-color:var(--background-modifier-border-hover)}.list-cards.markdown-preview-view div ul ul{display:block;width:100%;color:var(--text-muted);font-size:var(--font-smallest);margin:calc(var(--cards-padding)/-4) 0;padding:calc(var(--cards-padding)/2) 0}.list-cards.markdown-preview-view div ul ul ul{padding-bottom:calc(var(--cards-padding)/4)}.list-cards.markdown-preview-view div ul ul>li{display:block;margin-inline-start:0}.cards.cards-16-9,.list-cards.cards-16-9{--cards-aspect-ratio:16/9}.cards.cards-1-1,.list-cards.cards-1-1{--cards-aspect-ratio:1/1}.cards.cards-2-1,.list-cards.cards-2-1{--cards-aspect-ratio:2/1}.cards.cards-2-3,.list-cards.cards-2-3{--cards-aspect-ratio:2/3}.cards.cards-cols-1,.list-cards.cards-cols-1{--cards-columns:repeat(1, minmax(0, 1fr))}.cards.cards-cols-2,.list-cards.cards-cols-2{--cards-columns:repeat(2, minmax(0, 1fr))}.cards.cards-cover,.list-cards.cards-cover{--cards-image-fit:cover}.cards.cards-cover tbody>tr>td:first-child,.list-cards.cards-cover tbody>tr>td:first-child{padding:0!important;background-color:var(--background-secondary);display:block;margin:0;width:100%}.cards.cards-cover tbody>tr>td:first-child img,.list-cards.cards-cover tbody>tr>td:first-child img{border-radius:0}.cards.cards-align-bottom table.dataview tbody>tr>td:last-child,.list-cards.cards-align-bottom table.dataview tbody>tr>td:last-child{margin-top:auto}@media(max-width:400pt){.cards table.dataview tbody>tr>td:not(:first-child){font-size:80%}}@media(min-width:400pt){.cards-cols-3{--cards-columns:repeat(3, minmax(0, 1fr))}.cards-cols-4{--cards-columns:repeat(4, minmax(0, 1fr))}.cards-cols-5{--cards-columns:repeat(5, minmax(0, 1fr))}.cards-cols-6{--cards-columns:repeat(6, minmax(0, 1fr))}.cards-cols-7{--cards-columns:repeat(7, minmax(0, 1fr))}.cards-cols-8{--cards-columns:repeat(8, minmax(0, 1fr))}}.cm-formatting.cm-formatting-task.cm-property{font-family:var(--font-monospace)}input[data-task="!"]:checked,input[data-task="*"]:checked,input[data-task="-"]:checked,input[data-task="<"]:checked,input[data-task=">"]:checked,input[data-task=I]:checked,input[data-task=b]:checked,input[data-task=c]:checked,input[data-task=d]:checked,input[data-task=f]:checked,input[data-task=k]:checked,input[data-task=l]:checked,input[data-task=p]:checked,input[data-task=u]:checked,input[data-task=w]:checked,li[data-task="!"]>input:checked,li[data-task="!"]>p>input:checked,li[data-task="*"]>input:checked,li[data-task="*"]>p>input:checked,li[data-task="-"]>input:checked,li[data-task="-"]>p>input:checked,li[data-task="<"]>input:checked,li[data-task="<"]>p>input:checked,li[data-task=">"]>input:checked,li[data-task=">"]>p>input:checked,li[data-task=I]>input:checked,li[data-task=I]>p>input:checked,li[data-task=b]>input:checked,li[data-task=b]>p>input:checked,li[data-task=c]>input:checked,li[data-task=c]>p>input:checked,li[data-task=d]>input:checked,li[data-task=d]>p>input:checked,li[data-task=f]>input:checked,li[data-task=f]>p>input:checked,li[data-task=k]>input:checked,li[data-task=k]>p>input:checked,li[data-task=l]>input:checked,li[data-task=l]>p>input:checked,li[data-task=p]>input:checked,li[data-task=p]>p>input:checked,li[data-task=u]>input:checked,li[data-task=u]>p>input:checked,li[data-task=w]>input:checked,li[data-task=w]>p>input:checked{--checkbox-marker-color:transparent;border:none;border-radius:0;background-image:none;background-color:currentColor;-webkit-mask-size:var(--checkbox-icon);-webkit-mask-position:50% 50%}input[data-task=">"]:checked,li[data-task=">"]>input:checked,li[data-task=">"]>p>input:checked{color:var(--text-faint);transform:rotate(90deg);-webkit-mask-position:50% 100%;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M10.894 2.553a1 1 0 00-1.788 0l-7 14a1 1 0 001.169 1.409l5-1.429A1 1 0 009 15.571V11a1 1 0 112 0v4.571a1 1 0 00.725.962l5 1.428a1 1 0 001.17-1.408l-7-14z' /%3E%3C/svg%3E")}input[data-task="<"]:checked,li[data-task="<"]>input:checked,li[data-task="<"]>p>input:checked{color:var(--text-faint);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z' clip-rule='evenodd' /%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task="?"]:checked,li[data-task="?"]>input:checked,li[data-task="?"]>p>input:checked{--checkbox-marker-color:transparent;background-color:var(--color-yellow);border-color:var(--color-yellow);background-position:50% 50%;background-size:200% 90%;background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"%3E%3Cpath fill="white" fill-rule="evenodd" d="M4.475 5.458c-.284 0-.514-.237-.47-.517C4.28 3.24 5.576 2 7.825 2c2.25 0 3.767 1.36 3.767 3.215c0 1.344-.665 2.288-1.79 2.973c-1.1.659-1.414 1.118-1.414 2.01v.03a.5.5 0 0 1-.5.5h-.77a.5.5 0 0 1-.5-.495l-.003-.2c-.043-1.221.477-2.001 1.645-2.712c1.03-.632 1.397-1.135 1.397-2.028c0-.979-.758-1.698-1.926-1.698c-1.009 0-1.71.529-1.938 1.402c-.066.254-.278.461-.54.461h-.777ZM7.496 14c.622 0 1.095-.474 1.095-1.09c0-.618-.473-1.092-1.095-1.092c-.606 0-1.087.474-1.087 1.091S6.89 14 7.496 14Z"%2F%3E%3C%2Fsvg%3E')}.theme-dark input[data-task="?"]:checked,.theme-dark li[data-task="?"]>input:checked,.theme-dark li[data-task="?"]>p>input:checked{background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"%3E%3Cpath fill="black" fill-opacity="0.8" fill-rule="evenodd" d="M4.475 5.458c-.284 0-.514-.237-.47-.517C4.28 3.24 5.576 2 7.825 2c2.25 0 3.767 1.36 3.767 3.215c0 1.344-.665 2.288-1.79 2.973c-1.1.659-1.414 1.118-1.414 2.01v.03a.5.5 0 0 1-.5.5h-.77a.5.5 0 0 1-.5-.495l-.003-.2c-.043-1.221.477-2.001 1.645-2.712c1.03-.632 1.397-1.135 1.397-2.028c0-.979-.758-1.698-1.926-1.698c-1.009 0-1.71.529-1.938 1.402c-.066.254-.278.461-.54.461h-.777ZM7.496 14c.622 0 1.095-.474 1.095-1.09c0-.618-.473-1.092-1.095-1.092c-.606 0-1.087.474-1.087 1.091S6.89 14 7.496 14Z"%2F%3E%3C%2Fsvg%3E')}input[data-task="/"]:checked,li[data-task="/"]>input:checked,li[data-task="/"]>p>input:checked{background-image:none;background-color:rgba(0,0,0,0);position:relative;overflow:hidden}input[data-task="/"]:checked:after,li[data-task="/"]>input:checked:after,li[data-task="/"]>p>input:checked:after{top:0;left:0;content:" ";display:block;position:absolute;background-color:var(--background-modifier-accent);width:calc(50% - .5px);height:100%;-webkit-mask-image:none}input[data-task="!"]:checked,li[data-task="!"]>input:checked,li[data-task="!"]>p>input:checked{color:var(--color-orange);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task='"']:checked,input[data-task=“]:checked,li[data-task='"']>input:checked,li[data-task='"']>p>input:checked,li[data-task=“]>input:checked,li[data-task=“]>p>input:checked{--checkbox-marker-color:transparent;background-position:50% 50%;background-color:var(--color-cyan);border-color:var(--color-cyan);background-size:75%;background-repeat:no-repeat;background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"%3E%3Cpath fill="white" d="M6.5 10c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.318.142-.686.238-1.028.466c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.945c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 6.5 10zm11 0c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.317.143-.686.238-1.028.467c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.944c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 17.5 10z"%2F%3E%3C%2Fsvg%3E')}.theme-dark input[data-task='"']:checked,.theme-dark input[data-task=“]:checked,.theme-dark li[data-task='"']>input:checked,.theme-dark li[data-task='"']>p>input:checked,.theme-dark li[data-task=“]>input:checked,.theme-dark li[data-task=“]>p>input:checked{background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"%3E%3Cpath fill="black" fill-opacity="0.7" d="M6.5 10c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.318.142-.686.238-1.028.466c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.945c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 6.5 10zm11 0c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.317.143-.686.238-1.028.467c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.944c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 17.5 10z"%2F%3E%3C%2Fsvg%3E')}input[data-task="-"]:checked,li[data-task="-"]>input:checked,li[data-task="-"]>p>input:checked{color:var(--text-faint);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E")}body:not(.tasks) .markdown-preview-view ul li[data-task="-"].task-list-item.is-checked,body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="-"]),body:not(.tasks) li[data-task="-"].task-list-item.is-checked{color:var(--text-faint);text-decoration:line-through solid var(--text-faint) 1px}input[data-task="*"]:checked,li[data-task="*"]>input:checked,li[data-task="*"]>p>input:checked{color:var(--color-yellow);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z' /%3E%3C/svg%3E")}input[data-task=l]:checked,li[data-task=l]>input:checked,li[data-task=l]>p>input:checked{color:var(--color-red);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=i]:checked,li[data-task=i]>input:checked,li[data-task=i]>p>input:checked{--checkbox-marker-color:transparent;background-color:var(--color-blue);border-color:var(--color-blue);background-position:50%;background-size:100%;background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"%3E%3Cpath fill="none" stroke="white" stroke-linecap="round" stroke-linejoin="round" stroke-width="40" d="M196 220h64v172"%2F%3E%3Cpath fill="none" stroke="white" stroke-linecap="round" stroke-miterlimit="10" stroke-width="40" d="M187 396h138"%2F%3E%3Cpath fill="white" d="M256 160a32 32 0 1 1 32-32a32 32 0 0 1-32 32Z"%2F%3E%3C%2Fsvg%3E')}.theme-dark input[data-task=i]:checked,.theme-dark li[data-task=i]>input:checked,.theme-dark li[data-task=i]>p>input:checked{background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"%3E%3Cpath fill="none" stroke="black" stroke-opacity="0.8" stroke-linecap="round" stroke-linejoin="round" stroke-width="40" d="M196 220h64v172"%2F%3E%3Cpath fill="none" stroke="black" stroke-opacity="0.8" stroke-linecap="round" stroke-miterlimit="10" stroke-width="40" d="M187 396h138"%2F%3E%3Cpath fill="black" fill-opacity="0.8" d="M256 160a32 32 0 1 1 32-32a32 32 0 0 1-32 32Z"%2F%3E%3C%2Fsvg%3E')}input[data-task=S]:checked,li[data-task=S]>input:checked,li[data-task=S]>p>input:checked{--checkbox-marker-color:transparent;border-color:var(--color-green);background-color:var(--color-green);background-size:100%;background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48"%3E%3Cpath fill="white" fill-rule="evenodd" d="M26 8a2 2 0 1 0-4 0v2a8 8 0 1 0 0 16v8a4.002 4.002 0 0 1-3.773-2.666a2 2 0 0 0-3.771 1.332A8.003 8.003 0 0 0 22 38v2a2 2 0 1 0 4 0v-2a8 8 0 1 0 0-16v-8a4.002 4.002 0 0 1 3.773 2.666a2 2 0 0 0 3.771-1.332A8.003 8.003 0 0 0 26 10V8Zm-4 6a4 4 0 0 0 0 8v-8Zm4 12v8a4 4 0 0 0 0-8Z" clip-rule="evenodd"%2F%3E%3C%2Fsvg%3E')}.theme-dark input[data-task=S]:checked,.theme-dark li[data-task=S]>input:checked,.theme-dark li[data-task=S]>p>input:checked{background-image:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48"%3E%3Cpath fill-opacity="0.8" fill="black" fill-rule="evenodd" d="M26 8a2 2 0 1 0-4 0v2a8 8 0 1 0 0 16v8a4.002 4.002 0 0 1-3.773-2.666a2 2 0 0 0-3.771 1.332A8.003 8.003 0 0 0 22 38v2a2 2 0 1 0 4 0v-2a8 8 0 1 0 0-16v-8a4.002 4.002 0 0 1 3.773 2.666a2 2 0 0 0 3.771-1.332A8.003 8.003 0 0 0 26 10V8Zm-4 6a4 4 0 0 0 0 8v-8Zm4 12v8a4 4 0 0 0 0-8Z" clip-rule="evenodd"%2F%3E%3C%2Fsvg%3E')}input[data-task=I]:checked,li[data-task=I]>input:checked,li[data-task=I]>p>input:checked{color:var(--color-yellow);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M11 3a1 1 0 10-2 0v1a1 1 0 102 0V3zM15.657 5.757a1 1 0 00-1.414-1.414l-.707.707a1 1 0 001.414 1.414l.707-.707zM18 10a1 1 0 01-1 1h-1a1 1 0 110-2h1a1 1 0 011 1zM5.05 6.464A1 1 0 106.464 5.05l-.707-.707a1 1 0 00-1.414 1.414l.707.707zM5 10a1 1 0 01-1 1H3a1 1 0 110-2h1a1 1 0 011 1zM8 16v-1h4v1a2 2 0 11-4 0zM12 14c.015-.34.208-.646.477-.859a4 4 0 10-4.954 0c.27.213.462.519.476.859h4.002z' /%3E%3C/svg%3E")}input[data-task=f]:checked,li[data-task=f]>input:checked,li[data-task=f]>p>input:checked{color:var(--color-red);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12.395 2.553a1 1 0 00-1.45-.385c-.345.23-.614.558-.822.88-.214.33-.403.713-.57 1.116-.334.804-.614 1.768-.84 2.734a31.365 31.365 0 00-.613 3.58 2.64 2.64 0 01-.945-1.067c-.328-.68-.398-1.534-.398-2.654A1 1 0 005.05 6.05 6.981 6.981 0 003 11a7 7 0 1011.95-4.95c-.592-.591-.98-.985-1.348-1.467-.363-.476-.724-1.063-1.207-2.03zM12.12 15.12A3 3 0 017 13s.879.5 2.5.5c0-1 .5-4 1.25-4.5.5 1 .786 1.293 1.371 1.879A2.99 2.99 0 0113 13a2.99 2.99 0 01-.879 2.121z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=k]:checked,li[data-task=k]>input:checked,li[data-task=k]>p>input:checked{color:var(--color-yellow);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M18 8a6 6 0 01-7.743 5.743L10 14l-1 1-1 1H6v2H2v-4l4.257-4.257A6 6 0 1118 8zm-6-4a1 1 0 100 2 2 2 0 012 2 1 1 0 102 0 4 4 0 00-4-4z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=u]:checked,li[data-task=u]>input:checked,li[data-task=u]>p>input:checked{color:var(--color-green);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12 7a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0V8.414l-4.293 4.293a1 1 0 01-1.414 0L8 10.414l-4.293 4.293a1 1 0 01-1.414-1.414l5-5a1 1 0 011.414 0L11 10.586 14.586 7H12z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=d]:checked,li[data-task=d]>input:checked,li[data-task=d]>p>input:checked{color:var(--color-red);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12 13a1 1 0 100 2h5a1 1 0 001-1V9a1 1 0 10-2 0v2.586l-4.293-4.293a1 1 0 00-1.414 0L8 9.586 3.707 5.293a1 1 0 00-1.414 1.414l5 5a1 1 0 001.414 0L11 9.414 14.586 13H12z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=w]:checked,li[data-task=w]>input:checked,li[data-task=w]>p>input:checked{color:var(--color-purple);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M6 3a1 1 0 011-1h.01a1 1 0 010 2H7a1 1 0 01-1-1zm2 3a1 1 0 00-2 0v1a2 2 0 00-2 2v1a2 2 0 00-2 2v.683a3.7 3.7 0 011.055.485 1.704 1.704 0 001.89 0 3.704 3.704 0 014.11 0 1.704 1.704 0 001.89 0 3.704 3.704 0 014.11 0 1.704 1.704 0 001.89 0A3.7 3.7 0 0118 12.683V12a2 2 0 00-2-2V9a2 2 0 00-2-2V6a1 1 0 10-2 0v1h-1V6a1 1 0 10-2 0v1H8V6zm10 8.868a3.704 3.704 0 01-4.055-.036 1.704 1.704 0 00-1.89 0 3.704 3.704 0 01-4.11 0 1.704 1.704 0 00-1.89 0A3.704 3.704 0 012 14.868V17a1 1 0 001 1h14a1 1 0 001-1v-2.132zM9 3a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1zm3 0a1 1 0 011-1h.01a1 1 0 110 2H13a1 1 0 01-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E")}input[data-task=p]:checked,li[data-task=p]>input:checked,li[data-task=p]>p>input:checked{color:var(--color-green);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z' /%3E%3C/svg%3E")}input[data-task=c]:checked,li[data-task=c]>input:checked,li[data-task=c]>p>input:checked{color:var(--color-orange);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M18 9.5a1.5 1.5 0 11-3 0v-6a1.5 1.5 0 013 0v6zM14 9.667v-5.43a2 2 0 00-1.105-1.79l-.05-.025A4 4 0 0011.055 2H5.64a2 2 0 00-1.962 1.608l-1.2 6A2 2 0 004.44 12H8v4a2 2 0 002 2 1 1 0 001-1v-.667a4 4 0 01.8-2.4l1.4-1.866a4 4 0 00.8-2.4z' /%3E%3C/svg%3E")}input[data-task=b]:checked,li[data-task=b]>input:checked,li[data-task=b]>p>input:checked{color:var(--color-orange);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M5 4a2 2 0 012-2h6a2 2 0 012 2v14l-5-2.5L5 18V4z' /%3E%3C/svg%3E")}.colorful-active .nav-files-container{--nav-item-background-active:var(--interactive-accent);--nav-item-color-active:var(--text-on-accent)}.colorful-active .nav-files-container .is-active .nav-file-tag{color:var(--text-on-accent);opacity:.6}.colorful-active .tree-item-self.is-being-renamed:focus-within{--nav-item-color-active:var(--text-normal)}.colorful-active #calendar-container .active,.colorful-active #calendar-container .active.today,.colorful-active #calendar-container .active:hover,.colorful-active #calendar-container .day:active{background-color:var(--interactive-accent);color:var(--text-on-accent)}.colorful-active #calendar-container .active .dot,.colorful-active #calendar-container .day:active .dot,.colorful-active #calendar-container .today.active .dot{fill:var(--text-on-accent)}body:not(.colorful-active) .horizontal-tab-nav-item.is-active,body:not(.colorful-active) .vertical-tab-nav-item.is-active{background-color:var(--bg3);color:var(--text-normal)}body{--frame-background:hsl( var(--frame-background-h), var(--frame-background-s), var(--frame-background-l));--frame-icon-color:var(--frame-muted-color)}.theme-light{--frame-background-h:var(--accent-h);--frame-background-s:var(--accent-s);--frame-background-l:calc(var(--accent-l) + 30%);--frame-outline-color:hsla( var(--frame-background-h), var(--frame-background-s), calc(var(--frame-background-l) - 6.5%), 1 );--frame-muted-color:hsl( var(--frame-background-h), calc(var(--frame-background-s) - 10%), calc(var(--frame-background-l) - 35%))}.theme-dark{--frame-background-h:var(--accent-h);--frame-background-s:var(--accent-s);--frame-background-l:calc(var(--accent-l) - 25%);--frame-outline-color:hsla( var(--frame-background-h), calc(var(--frame-background-s) - 2%), calc(var(--frame-background-l) + 6.5%), 1 );--frame-muted-color:hsl( var(--frame-background-h), calc(var(--frame-background-s) - 10%), calc(var(--frame-background-l) + 25%))}.colorful-frame.theme-dark{--tab-outline-width:0px}.colorful-frame,.colorful-frame.is-focused{--frame-divider-color:var(--frame-outline-color);--titlebar-background:var(--frame-background);--titlebar-background-focused:var(--frame-background);--titlebar-text-color:var(--frame-muted-color);--minimal-tab-text-color:var(--frame-muted-color)}.colorful-frame .workspace-tabs:not(.mod-stacked),.colorful-frame.is-focused .workspace-tabs:not(.mod-stacked){--tab-text-color:var(--minimal-tab-text-color);--tab-text-color-focused:var(--minimal-tab-text-color)}.colorful-frame .mod-top .workspace-tab-header-container,.colorful-frame .titlebar,.colorful-frame .workspace-ribbon.mod-left:before,.colorful-frame.is-focused .mod-top .workspace-tab-header-container,.colorful-frame.is-focused .titlebar,.colorful-frame.is-focused .workspace-ribbon.mod-left:before{--tab-outline-color:var(--frame-outline-color);--tab-divider-color:var(--frame-outline-color)}.colorful-frame .mod-root .workspace-tab-header .workspace-tab-header-inner-icon,.colorful-frame.is-focused .mod-root .workspace-tab-header .workspace-tab-header-inner-icon{--icon-color:var(--minimal-tab-text-color-active);--icon-color-hover:var(--minimal-tab-text-color-active);--icon-color-active:var(--minimal-tab-text-color-active);--icon-color-focused:var(--minimal-tab-text-color-active)}.colorful-frame .mod-left-split .mod-top .workspace-tab-header,.colorful-frame .mod-right-split .mod-top .workspace-tab-header,.colorful-frame .sidebar-toggle-button,.colorful-frame .workspace-tab-header-new-tab,.colorful-frame .workspace-tab-header-tab-list,.colorful-frame .workspace-tab-header:not(.is-active),.colorful-frame.is-focused .mod-left-split .mod-top .workspace-tab-header,.colorful-frame.is-focused .mod-right-split .mod-top .workspace-tab-header,.colorful-frame.is-focused .sidebar-toggle-button,.colorful-frame.is-focused .workspace-tab-header-new-tab,.colorful-frame.is-focused .workspace-tab-header-tab-list,.colorful-frame.is-focused .workspace-tab-header:not(.is-active){--background-modifier-hover:var(--frame-outline-color);--icon-color:var(--frame-icon-color);--icon-color-hover:var(--frame-icon-color);--icon-color-active:var(--frame-icon-color);--icon-color-focused:var(--frame-icon-color);--icon-color-focus:var(--frame-icon-color)}.colorful-frame .mod-left-split .mod-top .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.colorful-frame .mod-right-split .mod-top .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.colorful-frame.is-focused .mod-left-split .mod-top .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.colorful-frame.is-focused .mod-right-split .mod-top .workspace-tab-header.is-active .workspace-tab-header-inner-icon{color:var(--frame-icon-color)}.workspace-leaf-resize-handle{transition:none}.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-left-split>.workspace-leaf-resize-handle,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-right-split>.workspace-leaf-resize-handle,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle{-webkit-app-region:no-drag;border:0;z-index:15}.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-left-split>.workspace-leaf-resize-handle:after,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-right-split>.workspace-leaf-resize-handle:after,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle:after{content:"";height:100%;width:1px;background:linear-gradient(180deg,var(--frame-outline-color) var(--header-height),var(--divider-color) var(--header-height));top:0;position:absolute}.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-left-split>.workspace-leaf-resize-handle:hover:after,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-right-split>.workspace-leaf-resize-handle:hover:after,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle:hover:after{background:var(--divider-color-hover)}.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-right-split>.workspace-leaf-resize-handle:after{left:0}.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-left-split>.workspace-leaf-resize-handle:after,.colorful-frame.is-hidden-frameless:not(.minimal-focus-mode) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle:after{right:0}body.colorful-headings{--h1-color:var(--color-red);--h2-color:var(--color-orange);--h3-color:var(--color-yellow);--h4-color:var(--color-green);--h5-color:var(--color-blue);--h6-color:var(--color-purple)}body.colorful-headings .modal{--h1-color:var(--text-normal);--h2-color:var(--text-normal);--h3-color:var(--text-normal);--h4-color:var(--text-normal);--h5-color:var(--text-normal);--h6-color:var(--text-normal)}.workspace-ribbon.mod-left{border-left:0;transition:none}:root{--focus-animation-duration:0.1s}.minimal-focus-mode.is-translucent .workspace-ribbon.mod-left.is-collapsed,.minimal-focus-mode.is-translucent .workspace-ribbon.mod-left.is-collapsed:before{background-color:var(--background-primary)!important}.minimal-focus-mode .workspace-ribbon.mod-left{transition:background-color 0s linear 0s}.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed{border-color:transparent;background-color:var(--background-primary)}.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed:before{background-color:var(--background-primary);border-color:transparent}.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed .side-dock-actions,.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed .side-dock-settings{opacity:0;transition:opacity var(--focus-animation-duration) ease-in-out .1s}.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed:hover .side-dock-actions,.minimal-focus-mode .workspace-ribbon.mod-left.is-collapsed:hover .side-dock-settings{opacity:1;transition:opacity var(--focus-animation-duration) ease-in-out .1s}.minimal-focus-mode.borders-title .workspace-ribbon.mod-left.is-collapsed{border-right:none}.minimal-focus-mode .mod-root .sidebar-toggle-button.mod-right{opacity:0;transition:opacity var(--focus-animation-duration) ease-in-out .5s}.minimal-focus-mode:not(.minimal-status-off) .status-bar{opacity:0;transition:opacity var(--focus-animation-duration) ease-in-out}.minimal-focus-mode .status-bar:hover{opacity:1;transition:opacity var(--focus-animation-duration) ease-in-out}.minimal-focus-mode .mod-root .workspace-tabs{position:relative}.minimal-focus-mode .mod-root .workspace-tabs:before:hover{background-color:#00f}.minimal-focus-mode .mod-root .workspace-tab-header-container{height:0;transition:all var(--focus-animation-duration) linear .6s;--tab-outline-width:0px}.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-container-inner,.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-new-tab,.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-tab-list{opacity:0;transition:all var(--focus-animation-duration) linear .6s}.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-spacer:before{width:100%;content:" ";background-color:rgba(0,0,0,0);height:15px;position:absolute;z-index:100;top:0;left:0}.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-container-inner .workspace-tab-header.is-active,.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-container-inner .workspace-tab-header.is-active::after,.minimal-focus-mode .mod-root .workspace-tab-header-container .workspace-tab-header-container-inner .workspace-tab-header.is-active::before{transition:all var(--focus-animation-duration) linear .6s}.minimal-focus-mode .mod-root .workspace-tab-header-container:hover{height:var(--header-height);--tab-outline-width:1px;transition:all var(--focus-animation-duration) linear .05s}.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .sidebar-toggle-button.mod-right,.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-container-inner,.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-new-tab,.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-tab-list{opacity:1;transition:all var(--focus-animation-duration) linear .05s}.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-container-inner .workspace-tab-header.is-active,.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-container-inner .workspace-tab-header.is-active::after,.minimal-focus-mode .mod-root .workspace-tab-header-container:hover .workspace-tab-header-container-inner .workspace-tab-header.is-active::before{transition:all var(--focus-animation-duration) linear .05s}.minimal-focus-mode.mod-macos:not(.is-fullscreen) .workspace:not(.is-left-sidedock-open) .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header-inner{padding-top:30px}body.show-view-header .app-container .workspace-split.mod-root>.workspace-leaf .view-header{transition:height var(--focus-animation-duration) linear .1s}body.minimal-focus-mode.show-view-header .mod-top-left-space .view-header{padding-left:var(--frame-left-space)}body.minimal-focus-mode.show-view-header .mod-root .workspace-leaf .view-header{height:0;transition:all var(--focus-animation-duration) linear .5s}body.minimal-focus-mode.show-view-header .view-header::after{width:100%;content:" ";background-color:rgba(0,0,0,0);height:40px;position:absolute;z-index:-9;top:0}body.minimal-focus-mode.show-view-header .view-actions,body.minimal-focus-mode.show-view-header .view-header-nav-buttons,body.minimal-focus-mode.show-view-header .view-header-title-container{opacity:0;transition:all var(--focus-animation-duration) linear .5s}body.minimal-focus-mode.show-view-header .mod-root .workspace-leaf .view-header:focus-within,body.minimal-focus-mode.show-view-header .mod-root .workspace-leaf .view-header:hover,body.minimal-focus-mode.show-view-header .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header{height:calc(var(--header-height) + 2px);transition:all var(--focus-animation-duration) linear .1s}body.minimal-focus-mode.show-view-header .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header .view-actions,body.minimal-focus-mode.show-view-header .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header .view-header-nav-buttons,body.minimal-focus-mode.show-view-header .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header .view-header-title-container,body.minimal-focus-mode.show-view-header .view-header:focus-within .view-actions,body.minimal-focus-mode.show-view-header .view-header:focus-within .view-header-nav-buttons,body.minimal-focus-mode.show-view-header .view-header:focus-within .view-header-title-container,body.minimal-focus-mode.show-view-header .view-header:hover .view-actions,body.minimal-focus-mode.show-view-header .view-header:hover .view-header-nav-buttons,body.minimal-focus-mode.show-view-header .view-header:hover .view-header-title-container{opacity:1;transition:all var(--focus-animation-duration) linear .1s}body.minimal-focus-mode.show-view-header .view-content{height:100%}.full-width-media{--iframe-width:100%}.full-width-media .markdown-preview-view .external-embed,.full-width-media .markdown-preview-view .image-embed img:not(.link-favicon):not(.emoji):not([width]),.full-width-media .markdown-preview-view audio,.full-width-media .markdown-preview-view img:not(.link-favicon):not(.emoji):not([width]),.full-width-media .markdown-preview-view video,.full-width-media .markdown-source-view .external-embed,.full-width-media .markdown-source-view .image-embed img:not(.link-favicon):not(.emoji):not([width]),.full-width-media .markdown-source-view audio,.full-width-media .markdown-source-view img:not(.link-favicon):not(.emoji):not([width]),.full-width-media .markdown-source-view video{width:100%}.markdown-rendered img:not(.emoji),.markdown-rendered video,.markdown-source-view img:not(.emoji),.markdown-source-view video{border-radius:var(--image-radius)}.tabular{font-variant-numeric:tabular-nums}.table-small .bases-view{--bases-table-font-size:85%}.table-small table:not(.calendar){--table-text-size:85%}.table-tiny .bases-view{--bases-table-font-size:75%}.table-tiny table:not(.calendar){--table-text-size:75%}.row-hover{--table-edge-cell-padding-first:8px;--table-edge-cell-padding-last:8px;--table-row-background-hover:var(--hl1);--table-row-alt-background-hover:var(--hl1)}.row-alt{--table-row-alt-background:var(--background-table-rows);--table-row-alt-background-hover:var(--background-table-rows);--table-edge-cell-padding-first:8px;--table-edge-cell-padding-last:8px}.col-alt .markdown-rendered:not(.cards){--table-column-alt-background:var(--background-table-rows)}.table-tabular table:not(.calendar){font-variant-numeric:tabular-nums}.table-center .markdown-preview-view .markdown-preview-sizer table,.table-center .markdown-source-view.mod-cm6 .table-wrapper,.table-center.markdown-preview-view .markdown-preview-sizer table,.table-center.markdown-source-view.mod-cm6 .table-wrapper{margin:0 auto}.table-lines{--table-border-width:var(--border-width);--table-header-border-width:var(--border-width);--table-column-first-border-width:var(--border-width);--table-column-last-border-width:var(--border-width);--table-row-last-border-width:var(--border-width);--table-edge-cell-padding:8px;--table-edge-cell-padding-first:8px;--table-edge-cell-padding-last:8px;--table-add-button-border-width:1px}.table-nowrap{--table-white-space:nowrap}.table-nowrap-first table tbody>tr>td:first-child,.table-nowrap-first table thead>tr>th:first-child{--table-white-space:nowrap}.table-nowrap .table-wrap,.trim-cols{--table-white-space:normal}.table-numbers{--table-numbers-padding-right:0.5em}.table-numbers table:not(.calendar){counter-reset:section}.table-numbers table:not(.calendar)>thead>tr>th:first-child{white-space:nowrap}.table-numbers table:not(.calendar)>thead>tr>th:first-child::before{content:" ";padding-right:var(--table-numbers-padding-right);display:inline-block;min-width:2em}.table-numbers table:not(.calendar)>thead>tr>th:first-child .cm-s-obsidian,.table-numbers table:not(.calendar)>thead>tr>th:first-child .table-cell-wrapper{display:inline-block;min-width:10px}.table-numbers table:not(.calendar).table-editor>tbody>tr>td:first-child .table-cell-wrapper,.table-numbers table:not(.calendar):not(.table-editor)>tbody>tr>td:first-child{white-space:nowrap}.table-numbers table:not(.calendar).table-editor>tbody>tr>td:first-child .table-cell-wrapper::before,.table-numbers table:not(.calendar):not(.table-editor)>tbody>tr>td:first-child::before{counter-increment:section;content:counter(section) " ";text-align:center;padding-right:var(--table-numbers-padding-right);display:inline-block;min-width:2em;color:var(--text-faint);font-variant-numeric:tabular-nums}.table-numbers table:not(.calendar).table-editor>tbody>tr>td:first-child .table-cell-wrapper .cm-s-obsidian,.table-numbers table:not(.calendar):not(.table-editor)>tbody>tr>td:first-child .cm-s-obsidian{display:inline-block;min-width:10px}.table-numbers .table-editor{--table-numbers-padding-right:0}.row-lines-off{--table-row-last-border-width:0;--bases-table-row-border-width:0}.row-lines-off .table-view-table>tbody>tr>td,.row-lines-off table:not(.calendar) tbody>tr:last-child>td,.row-lines-off table:not(.calendar) tbody>tr>td{border-bottom:none}.row-lines:not(.table-lines) .markdown-preview-view:not(.cards),.row-lines:not(.table-lines) .markdown-source-view:not(.cards){--table-row-last-border-width:0}.row-lines:not(.table-lines) .markdown-preview-view:not(.cards) .table-view-table>tbody>tr:not(:last-child)>td,.row-lines:not(.table-lines) .markdown-preview-view:not(.cards) table:not(.calendar) tbody>tr:not(:last-child)>td,.row-lines:not(.table-lines) .markdown-source-view:not(.cards) .table-view-table>tbody>tr:not(:last-child)>td,.row-lines:not(.table-lines) .markdown-source-view:not(.cards) table:not(.calendar) tbody>tr:not(:last-child)>td{border-bottom:var(--table-border-width) solid var(--table-border-color)}.col-lines{--bases-table-column-border-width:var(--table-border-width)}.col-lines .table-view-table thead>tr>th:not(:last-child),.col-lines .table-view-table>tbody>tr>td:not(:last-child),.col-lines table:not(.calendar) tbody>tr>td:not(:last-child){border-right:var(--table-border-width) solid var(--background-modifier-border)}:root{--image-mix:normal}.image-blend-light{--image-mix:multiply}.theme-dark .markdown-preview-view img,.theme-dark .markdown-source-view img{opacity:var(--image-muted);transition:opacity .25s linear}@media print{body{--image-muted:1}}.theme-dark .markdown-preview-view img:hover,.theme-dark .markdown-source-view img:hover,.theme-dark .print-preview img{opacity:1;transition:opacity .25s linear}.theme-light img{mix-blend-mode:var(--image-mix)}div[src$="#blend"],div[src$="#invert"]{background-color:var(--background-primary)}.theme-dark div[src$="#invert"] img,.theme-dark img[src$="#invert"],.theme-dark span[src$="#invert"] img{filter:invert(1) hue-rotate(180deg);mix-blend-mode:screen}.theme-dark div[src$="#blend"] img,.theme-dark img[src$="#blend"],.theme-dark span[src$="#blend"] img{mix-blend-mode:screen}.theme-dark .img-blend{mix-blend-mode:screen}.theme-light div[src$="#blend"] img,.theme-light img[src$="#blend"],.theme-light span[src$="#blend"] img{mix-blend-mode:multiply}.theme-light div[src$="#invertW"] img,.theme-light img[src$="#invertW"],.theme-light span[src$=invertW] img{filter:invert(1) hue-rotate(180deg)}.theme-light .img-blend{mix-blend-mode:multiply}img[src$="#circle"]:not(.emoji),span[src$="#circle"] img:not(.emoji),span[src$="#round"] img:not(.emoji){border-radius:50%;aspect-ratio:1/1}div[src$="#outline"] img,img[src$="#outline"],span[src$="#outline"] img{border:1px solid var(--ui1)}img[src$="#interface"],span[src$="#interface"] img{border:1px solid var(--ui1);box-shadow:0 .5px .9px rgba(0,0,0,.021),0 1.3px 2.5px rgba(0,0,0,.03),0 3px 6px rgba(0,0,0,.039),0 10px 20px rgba(0,0,0,.06);margin-top:10px;margin-bottom:15px;border-radius:var(--radius-m)}body{--image-grid-fit:cover;--image-grid-background:transparent;--img-grid-gap:0.5rem}@media(max-width:400pt){body{--img-grid-gap:0.25rem}}.img-grid-ratio{--image-grid-fit:contain}.img-grid-ratio{--image-grid-fit:contain}.img-grid .image-embed.is-loaded{line-height:0;display:flex;align-items:stretch}.img-grid .image-embed.is-loaded img{background-color:var(--image-grid-background)}.img-grid .image-embed.is-loaded img:active{background-color:rgba(0,0,0,0)}.img-grid .markdown-preview-section>div:has(img) .image-embed~br,.img-grid .markdown-preview-section>div:has(img) img~br,.img-grid .markdown-preview-section>div:has(img) p:empty{display:none}.img-grid .markdown-preview-section div:has(>.image-embed~.image-embed),.img-grid .markdown-preview-section div:has(>img~img),.img-grid .markdown-preview-section p:has(>.image-embed~.image-embed),.img-grid .markdown-preview-section p:has(>.image-embed~img),.img-grid .markdown-preview-section p:has(>img~.image-embed),.img-grid .markdown-preview-section p:has(>img~img){display:grid;margin-block-start:var(--img-grid-gap);margin-block-end:var(--img-grid-gap);grid-column-gap:var(--img-grid-gap);grid-row-gap:0;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.img-grid .markdown-preview-section div:has(>.image-embed~.image-embed)>img,.img-grid .markdown-preview-section div:has(>img~img)>img,.img-grid .markdown-preview-section p:has(>.image-embed~.image-embed)>img,.img-grid .markdown-preview-section p:has(>.image-embed~img)>img,.img-grid .markdown-preview-section p:has(>img~.image-embed)>img,.img-grid .markdown-preview-section p:has(>img~img)>img{object-fit:var(--image-grid-fit);align-self:stretch}.img-grid .markdown-preview-section div:has(>.image-embed~.image-embed)>.internal-embed img,.img-grid .markdown-preview-section div:has(>img~img)>.internal-embed img,.img-grid .markdown-preview-section p:has(>.image-embed~.image-embed)>.internal-embed img,.img-grid .markdown-preview-section p:has(>.image-embed~img)>.internal-embed img,.img-grid .markdown-preview-section p:has(>img~.image-embed)>.internal-embed img,.img-grid .markdown-preview-section p:has(>img~img)>.internal-embed img{object-fit:var(--image-grid-fit);align-self:center}.img-grid .markdown-preview-section>div:has(img)>p{display:grid;margin-block-start:var(--img-grid-gap);margin-block-end:var(--img-grid-gap);grid-column-gap:var(--img-grid-gap);grid-row-gap:0;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.img-grid .markdown-preview-section>div:has(img)>p>br{display:none}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content div:not(.canvas-node-content) img{cursor:zoom-in}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content img:active{cursor:zoom-out;max-width:100%;z-index:900}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .markdown-preview-view img[referrerpolicy=no-referrer]:active,body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .markdown-source-view.mod-cm6 .cm-content>img[contenteditable=false]:active{background-color:var(--background-primary)}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .image-embed:not(.canvas-node-content):active,body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .markdown-preview-view img[referrerpolicy=no-referrer]:active,body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .markdown-source-view.mod-cm6 .cm-content>img[contenteditable=false]:active{--container-img-width:100%;--container-img-max-width:100%;aspect-ratio:unset;cursor:zoom-out;display:block;z-index:200;position:fixed;max-height:calc(100% + 1px);max-width:100%;height:calc(100% + 1px);width:100%;object-fit:contain;margin:-.5px auto 0!important;text-align:center;padding:0;left:0;right:0;bottom:0}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .image-embed:not(.canvas-node-content):active:after{background-color:var(--background-primary);opacity:.9;content:" ";height:calc(100% + 1px);width:100%;position:fixed;left:0;right:1px;z-index:0}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .image-embed:not(.canvas-node-content):active img{aspect-ratio:unset;z-index:99;padding:0;margin:0 auto;width:calc(100% - 20px);max-height:95vh;object-fit:contain;left:0;right:0;bottom:0;position:absolute;opacity:1}body:not(.zoom-off):not(.is-mobile) .workspace-leaf-content[data-type=markdown] .view-content .markdown-source-view.mod-cm6 .cm-content>.cm-callout[contenteditable=false]:active{contain:unset!important}.labeled-nav.is-fullscreen:not(.colorful-frame),.labeled-nav.mod-windows{--labeled-nav-top-margin:0}.labeled-nav{--labeled-nav-top-margin:var(--header-height)}.labeled-nav.is-translucent .mod-left-split .mod-top .workspace-tab-header-container .workspace-tab-header-container-inner{background-color:rgba(0,0,0,0)}.labeled-nav.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .workspace-tabs.mod-top-left-space .workspace-tab-header-container{padding-left:0}.labeled-nav.mod-macos .mod-left-split .mod-top .workspace-tab-header-container:before,.labeled-nav.mod-macos.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .mod-top .workspace-tab-header-container:before{-webkit-app-region:drag;position:absolute;width:calc(100% - var(--divider-width));height:calc(var(--header-height) - var(--tab-outline-width));border-bottom:0 solid var(--tab-outline-color)}.labeled-nav.mod-macos.is-hidden-frameless:not(.is-fullscreen) .workspace-ribbon.mod-left:not(.is-collapsed){border:none;--tab-outline-width:0px}.labeled-nav.colorful-frame.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .mod-top .workspace-tab-header-container:before,.labeled-nav.mod-macos:not(.hider-ribbon) .mod-left-split .mod-top .workspace-tab-header-container:before,.labeled-nav:not(.is-hidden-frameless) .mod-left-split .mod-top .workspace-tab-header-container:before{border-bottom:var(--tab-outline-width) solid var(--tab-outline-color)}.labeled-nav.colorful-frame.is-hidden-frameless:not(.is-fullscreen) .workspace-ribbon.mod-left:not(.is-collapsed),.labeled-nav.mod-macos:not(.hider-ribbon) .workspace-ribbon.mod-left:not(.is-collapsed),.labeled-nav:not(.is-hidden-frameless) .workspace-ribbon.mod-left:not(.is-collapsed){--tab-outline-width:1px}.labeled-nav:not(.is-hidden-frameless) .mod-left-split .mod-top .workspace-tab-header-container:before{position:absolute;top:0;content:" "}.labeled-nav.hider-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):not(.is-popout-window) .mod-left-split:not(.is-sidedock-collapsed) .workspace-tabs.mod-top-left-space .workspace-tab-header-container{padding-left:0}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-spacer{display:none}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-inner-title{display:inline-block;font-weight:500;font-size:var(--font-adaptive-smaller)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-container{position:relative;flex-direction:column-reverse!important;height:auto;width:100%}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-container .sidebar-toggle-button.mod-left{position:absolute;justify-content:flex-end;padding-right:var(--size-4-2);top:0;right:0}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-container .workspace-tab-header-container-inner{padding:var(--size-4-2) var(--size-4-2);margin-top:var(--labeled-nav-top-margin);flex-direction:column!important;background-color:var(--background-secondary)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-container .workspace-tab-container-inner{flex-grow:1;gap:0;padding:var(--size-4-2) var(--size-4-3)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header{--icon-color:var(--text-muted);--tab-text-color:var(--text-muted);--tab-text-color-focused:var(--text-muted);padding:0;margin-bottom:2px;border:none;height:auto}.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active:not(:hover){background-color:rgba(0,0,0,0)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active,.labeled-nav .mod-left-split .mod-top .workspace-tab-header:hover{opacity:1;--tab-text-color-active:var(--text-normal);--tab-text-color-focused:var(--text-normal);--tab-text-color-focused-active:var(--text-normal);--tab-text-color-focused-active-current:var(--text-normal);--icon-color:var(--text-normal)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header .workspace-tab-header-inner{gap:var(--size-2-3);padding:var(--size-4-1) var(--size-4-2);box-shadow:none;border:none}.labeled-nav .mod-left-split .mod-top .workspace-tab-header.has-active-menu:hover,.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active:hover{background-color:rgba(0,0,0,0)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active:hover .workspace-tab-header-inner,.labeled-nav .mod-left-split .mod-top .workspace-tab-header:not(.is-active):hover .workspace-tab-header-inner{background-color:var(--nav-item-background-hover)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.labeled-nav .mod-left-split .mod-top .workspace-tab-header:hover .workspace-tab-header-inner-icon{color:var(--icon-color-active)}.labeled-nav .mod-left-split .mod-top .workspace-tab-header-container{border:none;padding:0}body:not(.links-int-on){--link-decoration:none}body:not(.links-ext-on){--link-external-decoration:none}body:not(.sidebar-color) .mod-right-split{--background-secondary:var(--background-primary)}body:not(.sidebar-color) .mod-right-split :not(.mod-top) .workspace-tab-header-container{--tab-container-background:var(--background-primary)}.theme-dark,.theme-light{--minimal-tab-text-color:var(--tx2);--minimal-tab-text-color-active:var(--tx1)}.workspace-tabs:not(.mod-stacked){--tab-text-color:var(--minimal-tab-text-color);--tab-text-color-focused:var(--minimal-tab-text-color);--tab-text-color-active:var(--minimal-tab-text-color-active);--tab-text-color-focused-active:var(--minimal-tab-text-color-active);--tab-text-color-focused-active-current:var(--minimal-tab-text-color-active)}.tabs-plain-square .mod-root{--tab-curve:0;--tab-radius:0;--tab-radius-active:0}.tabs-plain-square .mod-root .workspace-tab-header-container{padding-left:0;padding-right:0}.tabs-plain-square .mod-root .workspace-tab-header-container-inner{margin-top:-1px;margin-left:-15px}.tabs-plain-square .mod-root .workspace-tab-header{padding:0}.tabs-plain-square .mod-root .workspace-tab-header-inner{padding:0 8px}.tabs-square .mod-root{--tab-curve:0;--tab-radius:0;--tab-radius-active:0}.tabs-underline .mod-root{--tab-curve:0;--tab-radius:0;--tab-radius-active:0;--tab-outline-width:0px;--tab-background-active:transparent}.tabs-underline .mod-root .workspace-tab-header-container{border-bottom:1px solid var(--divider-color)}.tabs-underline .mod-root .workspace-tab-header{border-bottom:2px solid transparent}.tabs-underline .mod-root .workspace-tab-header:hover{border-bottom:2px solid var(--ui2)}.tabs-underline .mod-root .workspace-tab-header:hover .workspace-tab-header-inner{background-color:rgba(0,0,0,0)}.tabs-underline .mod-root .workspace-tab-header.is-active{border-bottom:2px solid var(--ax3)}.tabs-underline .mod-root .workspace-tab-header-inner:hover{background-color:rgba(0,0,0,0)}body:not(.sidebar-tabs-underline):not(.sidebar-tabs-index):not(.sidebar-tabs-square) .workspace>.workspace-split:not(.mod-root) .workspace-tabs:not(.mod-top) .workspace-tab-header-container{--tab-outline-width:0}.tabs-modern.colorful-frame .mod-root .mod-top.workspace-tabs:not(.mod-stacked){--tab-background:var(--frame-outline-color);--tab-outline-width:1px}.tabs-modern.colorful-frame .mod-root .mod-top.workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner-close-button,.tabs-modern.colorful-frame .mod-root .mod-top.workspace-tabs:not(.mod-stacked) .workspace-tab-header:hover .workspace-tab-header-inner-close-button{color:var(--minimal-tab-text-color-active)}.tabs-modern.minimal-focus-mode .mod-root .workspace-tab-header-container:hover{--tab-outline-width:0px}.tabs-modern .mod-root{--tab-container-background:var(--background-primary)}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked){--tab-background:var(--background-modifier-hover);--tab-height:calc(var(--header-height) - 14px);--tab-outline-width:0px}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header-inner::after,.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header::after,.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header::before{display:none}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header-container-inner{align-items:center;margin:0;padding:2px var(--size-4-2) 0 var(--size-4-1)}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header-inner-title{text-overflow:ellipsis;-webkit-mask-image:none}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header{background:rgba(0,0,0,0);border-radius:5px;border:none;box-shadow:none;height:var(--tab-height);margin-left:var(--size-4-1);padding:0}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner-title{color:var(--tab-text-color-active)}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active.mod-active,.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header:hover{opacity:1;background-color:var(--tab-background)}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header-new-tab{margin-inline-end:0}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header-inner{padding:0 var(--size-4-1) 0 var(--size-4-2);border:1px solid transparent}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header:not(.is-active):hover .workspace-tab-header-inner{background-color:rgba(0,0,0,0)}.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active:not(.mod-active) .workspace-tab-header-inner,.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header:not(:hover):not(.mod-active) .workspace-tab-header-inner{border:1px solid var(--tab-outline-color)}.tab-names-on .workspace-split:not(.mod-root) .workspace-tab-header-container-inner{--sidebar-tab-text-display:static}.tab-names-on .workspace-split:not(.mod-root) .workspace-tab-header-container-inner .workspace-tab-header-inner-title{font-weight:500}.tab-names-on .workspace-split:not(.mod-root) .workspace-tab-header-container-inner .workspace-tab-header-inner{gap:var(--size-2-3)}.tab-names-single .workspace>.workspace-split:not(.mod-root) .workspace-tab-header-container-inner .workspace-tab-header:only-child{--sidebar-tab-text-display:static;background-color:rgba(0,0,0,0)}.tab-names-single .workspace>.workspace-split:not(.mod-root) .workspace-tab-header-container-inner .workspace-tab-header:only-child .workspace-tab-header-inner-title{font-weight:500}.tab-names-single .workspace>.workspace-split:not(.mod-root) .workspace-tab-header-container-inner .workspace-tab-header:only-child .workspace-tab-header-inner{gap:var(--size-2-3)}.tabs-modern.sidebar-tabs-default .mod-right-split,.tabs-modern.sidebar-tabs-wide .mod-right-split{--tab-outline-width:0}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-spacer,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-spacer,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-spacer{display:none}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container{padding-right:0}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container-inner,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container-inner,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container-inner{padding:0;margin:0;flex-grow:1;gap:0}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header{flex-grow:1;border-radius:0;max-width:100px}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header.is-active,.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header:hover,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header.is-active,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header:hover,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header.is-active,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header:hover{background-color:rgba(0,0,0,0)}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner,.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header:hover .workspace-tab-header-inner,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header:hover .workspace-tab-header-inner,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header:hover .workspace-tab-header-inner{background-color:rgba(0,0,0,0)}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner{border-bottom:2px solid transparent;border-radius:0}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner:hover,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner:hover,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header .workspace-tab-header-inner:hover{border-color:var(--ui2)}.sidebar-tabs-underline .mod-right-split .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner,.sidebar-tabs-underline.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner,.sidebar-tabs-underline:not(.labeled-nav) .mod-left-split .workspace-tab-header-container .workspace-tab-header.is-active .workspace-tab-header-inner{border-color:var(--ax3);padding-top:1px}.sidebar-tabs-square .mod-left-split,.sidebar-tabs-square .mod-right-split{--tab-radius:0px}.sidebar-tabs-plain-square .mod-left-split,.sidebar-tabs-plain-square .mod-right-split{--tab-radius:0px}.sidebar-tabs-plain-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top),.sidebar-tabs-plain-square:not(.labeled-nav) .mod-left-split{--tab-background-active:var(--background-secondary)}.sidebar-tabs-plain-square .mod-right-split .workspace-tab-header-container,.sidebar-tabs-plain-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container,.sidebar-tabs-plain-square:not(.labeled-nav) .mod-left-split .workspace-tab-header-container{padding-left:0}.sidebar-tabs-plain-square .mod-right-split .workspace-tab-header-container-inner,.sidebar-tabs-plain-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container-inner,.sidebar-tabs-plain-square:not(.labeled-nav) .mod-left-split .workspace-tab-header-container-inner{padding:0;margin:0 0 calc(var(--tab-outline-width)*-1);flex-grow:1;gap:0}.sidebar-tabs-plain-square .mod-right-split .workspace-tab-header,.sidebar-tabs-plain-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header,.sidebar-tabs-plain-square:not(.labeled-nav) .mod-left-split .workspace-tab-header{flex-grow:1;max-width:100px;border-radius:var(--tab-radius) var(--tab-radius) 0 0}.sidebar-tabs-plain-square .mod-right-split .workspace-tab-header.is-active,.sidebar-tabs-plain-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header.is-active,.sidebar-tabs-plain-square:not(.labeled-nav) .mod-left-split .workspace-tab-header.is-active{box-shadow:0 0 0 var(--tab-outline-width) var(--tab-outline-color);color:var(--tab-text-color-active);background-color:var(--tab-background-active)}.sidebar-tabs-index.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top),.sidebar-tabs-index:not(.labeled-nav) .mod-left-split,.sidebar-tabs-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top),.sidebar-tabs-square:not(.labeled-nav) .mod-left-split{--tab-background-active:var(--background-secondary)}.sidebar-tabs-index .mod-right-split .workspace-tab-header-container-inner,.sidebar-tabs-index.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container-inner,.sidebar-tabs-index:not(.labeled-nav) .mod-left-split .workspace-tab-header-container-inner,.sidebar-tabs-square .mod-right-split .workspace-tab-header-container-inner,.sidebar-tabs-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container-inner,.sidebar-tabs-square:not(.labeled-nav) .mod-left-split .workspace-tab-header-container-inner{padding:1px var(--size-4-2) 0;margin:6px 0 calc(var(--tab-outline-width)*-1);flex-grow:1}.sidebar-tabs-index .mod-right-split .workspace-tab-header,.sidebar-tabs-index.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header,.sidebar-tabs-index:not(.labeled-nav) .mod-left-split .workspace-tab-header,.sidebar-tabs-square .mod-right-split .workspace-tab-header,.sidebar-tabs-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header,.sidebar-tabs-square:not(.labeled-nav) .mod-left-split .workspace-tab-header{flex-grow:1;max-width:100px;border-radius:var(--tab-radius) var(--tab-radius) 0 0}.sidebar-tabs-index .mod-right-split .workspace-tab-header.is-active,.sidebar-tabs-index.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header.is-active,.sidebar-tabs-index:not(.labeled-nav) .mod-left-split .workspace-tab-header.is-active,.sidebar-tabs-square .mod-right-split .workspace-tab-header.is-active,.sidebar-tabs-square.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header.is-active,.sidebar-tabs-square:not(.labeled-nav) .mod-left-split .workspace-tab-header.is-active{box-shadow:0 0 0 var(--tab-outline-width) var(--tab-outline-color);color:var(--tab-text-color-active);background-color:var(--tab-background-active)}.sidebar-tabs-wide .mod-right-split .workspace-tab-header-container-inner,.sidebar-tabs-wide.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container-inner,.sidebar-tabs-wide:not(.labeled-nav) .mod-left-split .workspace-tab-header-container-inner{flex-grow:1;border:1px solid var(--tab-outline-color);padding:3px;margin:6px 8px 6px;border-radius:4px}.sidebar-tabs-wide .mod-right-split .workspace-tab-header,.sidebar-tabs-wide.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header,.sidebar-tabs-wide:not(.labeled-nav) .mod-left-split .workspace-tab-header{flex-grow:1}.sidebar-tabs-wide .mod-right-split .workspace-tab-header.is-active,.sidebar-tabs-wide.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header.is-active,.sidebar-tabs-wide:not(.labeled-nav) .mod-left-split .workspace-tab-header.is-active{border-color:transparent}.sidebar-tabs-wide .mod-right-split .workspace-tab-header-container,.sidebar-tabs-wide.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-container,.sidebar-tabs-wide:not(.labeled-nav) .mod-left-split .workspace-tab-header-container{padding-right:0}.sidebar-tabs-wide .mod-right-split .workspace-tab-header-spacer,.sidebar-tabs-wide.labeled-nav .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-header-spacer,.sidebar-tabs-wide:not(.labeled-nav) .mod-left-split .workspace-tab-header-spacer{display:none}.full-file-names{--nav-item-white-space:normal}body:not(.full-file-names){--nav-item-white-space:nowrap}body:not(.full-file-names) .tree-item-self{white-space:nowrap}body:not(.full-file-names) .tree-item-inner{text-overflow:ellipsis;overflow:hidden}.theme-dark,.theme-light{--h1l:var(--ui1);--h2l:var(--ui1);--h3l:var(--ui1);--h4l:var(--ui1);--h5l:var(--ui1);--h6l:var(--ui1)}.h1-l .markdown-reading-view h1:not(.embedded-note-title),.h1-l .mod-cm6 .cm-editor .HyperMD-header-1{border-bottom:1px solid var(--h1l);padding-bottom:.4em;margin-block-end:.6em}.h2-l .markdown-reading-view h2,.h2-l .mod-cm6 .cm-editor .HyperMD-header-2{border-bottom:1px solid var(--h2l);padding-bottom:.4em;margin-block-end:.6em}.h3-l .markdown-reading-view h3,.h3-l .mod-cm6 .cm-editor .HyperMD-header-3{border-bottom:1px solid var(--h3l);padding-bottom:.4em;margin-block-end:.6em}.h4-l .markdown-reading-view h4,.h4-l .mod-cm6 .cm-editor .HyperMD-header-4{border-bottom:1px solid var(--h4l);padding-bottom:.4em;margin-block-end:.6em}.h5-l .markdown-reading-view h5,.h5-l .mod-cm6 .cm-editor .HyperMD-header-5{border-bottom:1px solid var(--h5l);padding-bottom:.4em;margin-block-end:.6em}.h6-l .markdown-reading-view h6,.h6-l .mod-cm6 .cm-editor .HyperMD-header-6{border-bottom:1px solid var(--h6l);padding-bottom:.4em;margin-block-end:.6em}.is-tablet .workspace-drawer{padding-top:0}.is-tablet .workspace-drawer:not(.is-pinned){margin:30px 16px 0;height:calc(100vh - 48px);border-radius:15px;border:none}.is-tablet .workspace-drawer-ribbon{background-color:var(--background-primary);border-right:1px solid var(--background-modifier-border)}.is-tablet .workspace-drawer-header,.is-tablet .workspace-drawer.is-pinned .workspace-drawer-header{padding-top:var(--size-4-4)}.is-tablet .workspace-drawer-header-icon{margin-inline-start:0}.is-mobile{--font-bold:600;--font-ui-medium:var(--font-adaptive-small);--interactive-normal:var(--background-secondary);--background-modifier-form-field:var(--background-secondary);--background-modifier-form-field-highlighted:var(--background-secondary)}.is-mobile .markdown-source-view.mod-cm6 .cm-gutters{margin-left:0}.is-mobile.theme-light .menu{--interactive-normal:var(--background-modifier-hover)}.is-mobile .workspace-drawer.mod-left.is-pinned{width:var(--mobile-left-sidebar-width);min-width:150pt}.is-mobile .workspace-drawer.mod-right.is-pinned{width:var(--mobile-right-sidebar-width);min-width:150pt}.is-phone{--bases-embed-width:100%;--bases-embed-transform:none}.backlink-pane>.tree-item-self,.backlink-pane>.tree-item-self:hover,.outgoing-link-pane>.tree-item-self,.outgoing-link-pane>.tree-item-self:hover{color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-size:var(--font-adaptive-smallest);font-weight:500}body{--canvas-dot-pattern:var(--background-modifier-border-hover)}.canvas-node-label{font-size:var(--font-adaptive-small)}.canvas-edges :not(.is-themed) path.canvas-display-path{stroke:var(--background-modifier-border-focus)}.canvas-edges :not(.is-themed) polyline.canvas-path-end{stroke:var(--background-modifier-border-focus);fill:var(--background-modifier-border-focus)}.canvas-node-container{border:1.5px solid var(--background-modifier-border-focus)}.node-insert-event.mod-inside-iframe{--max-width:100%;--folding-offset:0px}.node-insert-event.mod-inside-iframe .cm-editor .cm-content{padding-top:0}.hider-file-nav-header:not(.labeled-nav) .nav-files-container{padding-top:var(--size-4-3)}.is-mobile .nav-folder.mod-root>.nav-folder-title .nav-folder-title-content{display:none}body:not(.is-mobile) .nav-folder.mod-root>.nav-folder-title .nav-folder-title-content{font-weight:500;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-size:var(--font-adaptive-smallest)}body:not(.is-mobile) .nav-buttons-container{justify-content:flex-start}.nav-file-tag{padding-top:.2em;background-color:rgba(0,0,0,0);color:var(--text-faint)}.nav-file .is-active .nav-file-tag,.nav-file:hover .nav-file-tag{color:var(--text-muted)}input.prompt-input,input.prompt-input:focus,input.prompt-input:focus-visible,input.prompt-input:hover{border-color:rgba(var(--mono-rgb-100),.05)}.is-mobile .mod-publish .modal-content{display:unset;padding:10px 10px 10px;margin-bottom:120px;overflow-x:hidden}.is-mobile .mod-publish .button-container,.is-mobile .modal.mod-publish .modal-button-container{padding:10px 15px 30px;margin-left:0;left:0}.is-mobile .modal.mod-publish .modal-title{padding:10px 20px;margin:0 -10px;border-bottom:1px solid var(--background-modifier-border)}.is-mobile .publish-site-settings-container{margin-right:0;padding:0}.is-mobile .modal.mod-publish .modal-content .publish-sections-container{margin-right:0;padding-right:0}@media(max-width:400pt){.is-mobile .publish-changes-info,.is-mobile .publish-section-header{flex-wrap:wrap;border:none}.is-mobile .publish-changes-info .publish-changes-add-linked-btn{flex-basis:100%;margin-top:10px}.is-mobile .publish-section-header-text{flex-basis:100%;margin-bottom:10px;margin-left:20px;margin-top:-8px}.is-mobile .publish-section{background:var(--background-secondary);border-radius:10px;padding:12px 12px 1px}.is-mobile .publish-changes-switch-site{flex-grow:0;margin-right:10px}}.release-notes-view .cm-scroller.is-readable-line-width{width:var(--line-width);max-width:var(--max-width);margin:0 auto}.search-results-info{border-bottom:none}.workspace-leaf-content[data-type=sync] .tree-item.nav-folder .nav-folder-title{color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-size:var(--font-adaptive-smallest);font-weight:500;margin-bottom:4px}.workspace-leaf-content[data-type=sync] .tree-item.nav-folder .nav-folder-title:hover{color:var(--text-normal)}.workspace-leaf-content[data-type=sync] .tree-item.nav-folder.is-collapsed .nav-folder-title{color:var(--text-faint)}.workspace-leaf-content[data-type=sync] .tree-item.nav-folder.is-collapsed .nav-folder-title:hover{color:var(--text-muted)}.workspace-leaf-content[data-type=calendar] .view-content{padding:5px 0 0 0}.mod-root #calendar-container{width:var(--line-width);max-width:var(--max-width);margin:0 auto;padding:0}body{--calendar-dot-active:var(--text-faint);--calendar-dot-today:var(--text-accent)}#calendar-container{padding:0 var(--size-4-4) var(--size-4-1);--color-background-day-empty:var(--background-secondary-alt);--color-background-day-active:var(--background-modifier-hover);--color-background-day-hover:var(--background-modifier-hover);--color-dot:var(--text-faint);--calendar-text-active:inherit;--color-text-title:var(--text-normal);--color-text-heading:var(--text-muted);--color-text-day:var(--text-normal);--color-text-today:var(--text-normal);--color-arrow:var(--text-faint);--color-background-day-empty:transparent}#calendar-container .table{border-collapse:separate;table-layout:fixed}#calendar-container h2{font-weight:400;font-size:var(--h2)}#calendar-container .arrow{cursor:var(--cursor);width:22px;border-radius:4px;padding:3px 7px}#calendar-container .arrow svg{width:12px;height:12px;color:var(--text-faint);opacity:.7}#calendar-container .arrow:hover{fill:var(--text-muted);color:var(--text-muted);background-color:var(--background-modifier-hover)}#calendar-container .arrow:hover svg{color:var(--text-muted);opacity:1}#calendar-container tr th{padding:2px 0 4px;font-weight:500;letter-spacing:.1em;font-size:var(--font-adaptive-smallest)}#calendar-container tr th:first-child{padding-left:0!important}#calendar-container tr td{padding:2px 0 0 0;border-radius:var(--radius-m);cursor:var(--cursor);border:1px solid transparent;transition:none}#calendar-container tr td:first-child{padding-left:0!important}#calendar-container .nav{padding:0;margin:var(--size-4-2) var(--size-4-1)}#calendar-container .dot{margin:0}#calendar-container .month,#calendar-container .title,#calendar-container .year{font-size:calc(var(--font-adaptive-small) + 2px);font-weight:400;color:var(--text-normal)}#calendar-container .today,#calendar-container .today.active{color:var(--text-accent);font-weight:600}#calendar-container .today .dot,#calendar-container .today.active .dot{fill:var(--calendar-dot-today)}#calendar-container .active .task{stroke:var(--text-faint)}#calendar-container .active{color:var(--text-normal)}#calendar-container .reset-button{text-transform:none;letter-spacing:0;font-size:var(--font-adaptive-smaller);font-weight:500;color:var(--text-muted);border-radius:4px;margin:0;padding:2px 8px}#calendar-container .reset-button:hover{color:var(--text-normal);background-color:var(--background-modifier-hover)}#calendar-container .day,#calendar-container .reset-button,#calendar-container .week-num{cursor:var(--cursor)}#calendar-container .day.adjacent-month{color:var(--text-faint);opacity:1}#calendar-container .day{padding:2px 4px 4px;transition:none}#calendar-container .day,#calendar-container .week-num{font-size:calc(var(--font-adaptive-smaller) + 5%)}#calendar-container .active,#calendar-container .active.today,#calendar-container .day:hover,#calendar-container .week-num:hover{background-color:var(--color-background-day-active);color:var(--calendar-text-active);transition:none}#calendar-container .active .dot{fill:var(--calendar-dot-active)}#calendar-container .active .task{stroke:var(--text-faint)}.block-language-chart canvas,.block-language-dataviewjs canvas{margin:1em 0}.theme-dark,.theme-light{--chart-color-1:var(--color-blue);--chart-color-2:var(--color-red);--chart-color-3:var(--color-yellow);--chart-color-4:var(--color-green);--chart-color-5:var(--color-orange);--chart-color-6:var(--color-purple);--chart-color-7:var(--color-cyan);--chart-color-8:var(--color-pink)}body #cMenuModalBar{box-shadow:0 2px 20px var(--shadow-color)}body #cMenuModalBar .cMenuCommandItem{cursor:var(--cursor)}body #cMenuModalBar button.cMenuCommandItem:hover{background-color:var(--background-modifier-hover)}.MiniSettings-statusbar-button{padding-top:0;padding-bottom:0}.MySnippets-statusbar-menu .menu-item .MS-OpenSnippet{height:auto;border:none;background:rgba(0,0,0,0);box-shadow:none;width:auto;padding:4px 6px;margin-left:0}.MySnippets-statusbar-menu .menu-item .MS-OpenSnippet svg path{fill:var(--text-muted)}.MySnippets-statusbar-menu .menu-item .MS-OpenSnippet:hover{background-color:var(--background-modifier-hover)}.dataview-inline-lists .markdown-preview-view .dataview-ul,.dataview-inline-lists .markdown-source-view .dataview-ul{--list-spacing:0}.dataview-inline-lists .markdown-preview-view .dataview-ol li:not(:last-child):after,.dataview-inline-lists .markdown-preview-view .dataview-ul li:not(:last-child):after,.dataview-inline-lists .markdown-source-view .dataview-ol li:not(:last-child):after,.dataview-inline-lists .markdown-source-view .dataview-ul li:not(:last-child):after{content:", "}.dataview-inline-lists .markdown-preview-view ul.dataview-ol>li::before,.dataview-inline-lists .markdown-preview-view ul.dataview-ul>li::before,.dataview-inline-lists .markdown-source-view ul.dataview-ol>li::before,.dataview-inline-lists .markdown-source-view ul.dataview-ul>li::before{display:none}.dataview-inline-lists .markdown-preview-view .dataview-ol li,.dataview-inline-lists .markdown-preview-view .dataview-ul li,.dataview-inline-lists .markdown-source-view .dataview-ol li,.dataview-inline-lists .markdown-source-view .dataview-ul li{display:inline-block;padding-inline-end:.25em;margin-inline-start:0}.markdown-rendered table.dataview{margin-block-start:0;margin-block-end:0}.markdown-rendered table.dataview .dataview-result-list-li{margin-inline-start:0}.markdown-preview-view .table-view-table>thead>tr>th,body .table-view-table>thead>tr>th{font-weight:400;font-size:var(--table-text-size);color:var(--text-muted);border-bottom:var(--table-border-width) solid var(--table-border-color);cursor:var(--cursor)}table.dataview ul.dataview-ul{list-style:none;padding-inline-start:0;margin-block-start:0em!important;margin-block-end:0em!important}.markdown-preview-view:not(.cards) .table-view-table>tbody>tr>td,.markdown-source-view.mod-cm6:not(.cards) .table-view-table>tbody>tr>td{max-width:var(--max-col-width)}body .dataview.small-text{color:var(--text-faint)}body:not(.row-hover) .dataview.task-list-basic-item:hover,body:not(.row-hover) .dataview.task-list-item:hover,body:not(.row-hover) .table-view-table>tbody>tr:hover{background-color:rgba(0,0,0,0)!important;box-shadow:none}body.row-hover .dataview.task-list-basic-item:hover,body.row-hover .dataview.task-list-item:hover,body.row-hover .table-view-table>tbody>tr:hover{background-color:var(--table-row-background-hover)}body .dataview-error{background-color:rgba(0,0,0,0)}.dataview.dataview-error,.markdown-source-view.mod-cm6 .cm-content .dataview.dataview-error{color:var(--text-muted)}body div.dataview-error-box{min-height:0;border:none;background-color:rgba(0,0,0,0);font-size:var(--table-text-size);border-radius:var(--radius-m);padding:15px 0;justify-content:flex-start}body div.dataview-error-box p{margin-block-start:0;margin-block-end:0;color:var(--text-faint)}.trim-cols .markdown-preview-view .table-view-table>tbody>tr>td,.trim-cols .markdown-source-view.mod-cm6 .table-view-table>tbody>tr>td,.trim-cols .markdown-source-view.mod-cm6 .table-view-table>thead>tr>th{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}ul .dataview .task-list-basic-item:hover,ul .dataview .task-list-item:hover{background-color:rgba(0,0,0,0);box-shadow:none}body .dataview.result-group{padding-left:0}body .dataview .inline-field-standalone-value,body .dataview.inline-field-key,body .dataview.inline-field-value{font-family:var(--font-text);font-size:calc(var(--font-adaptive-normal) - 2px);background:rgba(0,0,0,0);color:var(--text-muted)}body .dataview.inline-field-key{padding:0}body .dataview .inline-field-standalone-value{padding:0}body .dataview.inline-field-key::after{margin-left:3px;content:"|";color:var(--background-modifier-border)}body .dataview.inline-field-value{padding:0 1px 0 3px}.markdown-preview-view .block-language-dataview table.calendar th{border:none;cursor:default;background-image:none}.markdown-preview-view .block-language-dataview table.calendar .day{font-size:var(--font-adaptive-small)}.git-view-body .opener{text-transform:uppercase;letter-spacing:.05em;font-size:var(--font-adaptive-smallest);font-weight:500;padding:5px 7px 5px 10px;margin-bottom:6px}.git-view-body .file-view .opener{text-transform:none;letter-spacing:normal;font-size:var(--font-adaptive-smallest);font-weight:400;padding:initial;margin-bottom:0}.git-view-body .file-view .opener .collapse-icon{display:flex!important;margin-left:-7px}.git-view-body{margin-top:6px}.git-view-body .file-view{margin-left:4px}.git-view-body .file-view main:hover{color:var(--text-normal)}.git-view-body .file-view .tools .type{display:none!important}.git-view-body .file-view .tools{opacity:0;transition:opacity .1s}.git-view-body .file-view main:hover>.tools{opacity:1}.git-view-body .staged{margin-bottom:12px}.git-view-body .opener.open{color:var(--text-normal)}div[data-type=git-view] .search-input-container{margin-left:0;width:100%}.git-view-body .opener .collapse-icon{display:none!important}.git-view-body main{background-color:var(--background-primary)!important;width:initial!important}.git-view-body .file-view>main:not(.topLevel){margin-left:7px}div[data-type=git-view] .commit-msg{min-height:2.5em!important;height:2.5em!important;padding:6.5px 8px!important}div[data-type=git-view] .search-input-clear-button{bottom:5.5px}.hider-vault .nav-folder.mod-root>.nav-folder-title{height:4px}body.minimal-dark-black.theme-dark,body.minimal-dark-tonal.theme-dark,body.minimal-light-tonal.theme-light,body.minimal-light-white.theme-light,body.theme-dark{--kanban-border:0px}body:not(.is-mobile) .kanban-plugin__grow-wrap>textarea:focus{box-shadow:none}body:not(.minimal-icons-off) .kanban-plugin svg.cross{height:14px;width:14px}body .kanban-plugin__icon>svg,body .kanban-plugin__lane-settings-button svg{width:18px;height:18px}body .kanban-plugin{--kanban-border:var(--border-width);--interactive-accent:var(--text-selection);--interactive-accent-hover:var(--background-modifier-hover);--text-on-accent:var(--text-normal);background-color:var(--background-primary)}body .kanban-plugin__markdown-preview-view{font-family:var(--font-text)}body .kanban-plugin__board>div{margin:0 auto}body .kanban-plugin__checkbox-label{color:var(--text-muted)}body .kanban-plugin__item-markdown ul{margin:0}body .kanban-plugin__item-content-wrapper{box-shadow:none}body .kanban-plugin__grow-wrap::after,body .kanban-plugin__grow-wrap>textarea{padding:0;border:0;border-radius:0}body .kanban-plugin__grow-wrap::after,body .kanban-plugin__grow-wrap>textarea,body .kanban-plugin__item-title p,body .kanban-plugin__markdown-preview-view{font-size:var(--font-ui-medium);line-height:1.3}body .kanban-plugin__item{background-color:var(--background-primary)}body .kanban-plugin__item-title-wrapper{align-items:center}body .kanban-plugin__lane-form-wrapper{border:1px solid var(--background-modifier-border)}body .kanban-plugin__lane-header-wrapper{border-bottom:0}body .kanban-plugin__lane-header-wrapper .kanban-plugin__grow-wrap>textarea,body .kanban-plugin__lane-input-wrapper .kanban-plugin__grow-wrap>textarea,body .kanban-plugin__lane-title p{background:rgba(0,0,0,0);color:var(--text-normal);font-size:var(--font-ui-medium);font-weight:500}body .kanban-plugin__item-input-wrapper .kanban-plugin__grow-wrap>textarea{padding:0;border-radius:0;height:auto}body .kanban-plugin__item-form .kanban-plugin__grow-wrap{background-color:var(--background-primary)}body .kanban-plugin__item-input-wrapper .kanban-plugin__grow-wrap>textarea::placeholder{color:var(--text-faint)}body .kanban-plugin__item .kanban-plugin__item-edit-archive-button,body .kanban-plugin__item button.kanban-plugin__item-edit-button,body .kanban-plugin__item-settings-actions>button,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button.is-enabled,body .kanban-plugin__lane-action-wrapper>button{background:rgba(0,0,0,0);transition:color .1s ease-in-out}body .kanban-plugin__item .kanban-plugin__item-edit-archive-button:hover,body .kanban-plugin__item button.kanban-plugin__item-edit-button.is-enabled,body .kanban-plugin__item button.kanban-plugin__item-edit-button:hover,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button.is-enabled,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button:hover{color:var(--text-normal);transition:color .1s ease-in-out;background:rgba(0,0,0,0)}body .kanban-plugin__new-lane-button-wrapper{position:fixed;bottom:30px}body .kanban-plugin__lane-items>.kanban-plugin__placeholder:only-child{border:1px dashed var(--background-modifier-border);height:2em}body .kanban-plugin__item-postfix-button-wrapper{align-self:flex-start}body .kanban-plugin__item button.kanban-plugin__item-postfix-button.is-enabled,body .kanban-plugin__item button.kanban-plugin__item-prefix-button.is-enabled,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button.is-enabled{color:var(--text-muted)}body .kanban-plugin button{box-shadow:none;cursor:var(--cursor);height:auto}body .kanban-plugin__item button.kanban-plugin__item-postfix-button:hover,body .kanban-plugin__item button.kanban-plugin__item-prefix-button:hover,body .kanban-plugin__lane button.kanban-plugin__lane-settings-button:hover{background-color:var(--background-modifier-hover)}body .kanban-plugin__item-button-wrapper>button{color:var(--text-muted);font-weight:400;background:rgba(0,0,0,0);min-height:calc(var(--input-height) + 8px)}body .kanban-plugin__item-button-wrapper>button:hover{color:var(--text-normal);background:var(--background-modifier-hover)}body .kanban-plugin__item-button-wrapper>button:focus{box-shadow:none}body .kanban-plugin__item-button-wrapper{padding:1px 6px 5px;border-top:none}body .kanban-plugin__lane-setting-wrapper>div:last-child{border:none;margin:0}body .kanban-plugin.something-is-dragging{cursor:grabbing;cursor:-webkit-grabbing}body .kanban-plugin__item.is-dragging{box-shadow:0 5px 30px rgba(0,0,0,.15),0 0 0 2px var(--text-selection)}body .kanban-plugin__lane-items{border:var(--kanban-border) solid var(--background-modifier-border);padding:0 4px;margin:0;background-color:var(--background-secondary)}body .kanban-plugin__lane{background:rgba(0,0,0,0);padding:0;border:var(--border-width) solid transparent}body .kanban-plugin__lane.is-dragging{box-shadow:0 5px 30px rgba(0,0,0,.15);border:1px solid var(--background-modifier-border)}body .kanban-plugin__lane .kanban-plugin__item-button-wrapper{border-top-left-radius:8px;border-top-right-radius:8px;border-top:1px solid var(--background-modifier-border);border-bottom-width:0;padding:4px 4px 0 4px}body .kanban-plugin__lane.will-prepend .kanban-plugin__lane-items{border-radius:8px}body .kanban-plugin__lane.will-prepend .kanban-plugin__item-form{border-top:1px solid var(--background-modifier-border);border-radius:8px 8px 0 0;padding:4px 4px 0;border-bottom-width:0}body .kanban-plugin__lane.will-prepend .kanban-plugin__item-form+.kanban-plugin__lane-items{border-top-width:0;border-radius:0 0 8px 8px}body .kanban-plugin__lane.will-prepend .kanban-plugin__item-button-wrapper+.kanban-plugin__lane-items{border-top-width:0;border-radius:0 0 8px 8px}body .kanban-plugin__lane:not(.will-prepend) .kanban-plugin__item-button-wrapper,body .kanban-plugin__lane:not(.will-prepend) .kanban-plugin__item-form{border-top:none;border-radius:0 0 8px 8px}body .kanban-plugin__lane:not(.will-prepend) .kanban-plugin__item-button-wrapper{padding:0 4px 4px 4px;border-bottom-width:1px}body .kanban-plugin__lane:not(.will-prepend) .kanban-plugin__lane-items{border-bottom:none;border-top-width:1px;border-radius:8px 8px 0 0}body .kanban-plugin__item-form .kanban-plugin__item-input-wrapper{min-height:calc(var(--input-height) + 8px);display:flex;justify-content:center}body .kanban-plugin__item-button-wrapper,body .kanban-plugin__item-form{background-color:var(--background-secondary);border:var(--kanban-border) solid var(--background-modifier-border)}body .kanban-plugin__item-form{padding:0 4px 5px}body .kanban-plugin__markdown-preview-view ol,body .kanban-plugin__markdown-preview-view ol.contains-task-list .contains-task-list,body .kanban-plugin__markdown-preview-view ul,body .kanban-plugin__markdown-preview-view ul.contains-task-list .contains-task-list{padding-inline-start:1.8em!important}@media(max-width:400pt){.kanban-plugin__board{flex-direction:column!important}.kanban-plugin__lane{width:100%!important;margin-bottom:1rem!important}}body .cm-heading-marker{cursor:var(--cursor);padding-left:10px}.theme-light{--leaflet-buttons:var(--bg1);--leaflet-borders:rgba(0,0,0,0.1)}.theme-dark{--leaflet-buttons:var(--bg2);--leaflet-borders:rgba(255,255,255,0.1)}.leaflet-container{--image-radius:0}.leaflet-top{transition:top .1s linear}body .leaflet-container{background-color:var(--background-secondary);font-family:var(--font-interface)}.leaflet-control-attribution{display:none}.leaflet-popup-content{margin:10px}.block-language-leaflet{border-radius:var(--radius-m);overflow:hidden;border:var(--border-width) solid var(--background-modifier-border)}.map-wide .block-language-leaflet{border-radius:var(--radius-l)}.map-max .block-language-leaflet{border-radius:var(--radius-xl)}.workspace-leaf-content[data-type=obsidian-leaflet-map-view] .block-language-leaflet{border-radius:0;border:none}.map-100 .block-language-leaflet{border-radius:0;border-left:none;border-right:none}.block-language-leaflet .leaflet-control-expandable-list .input-container .input-item>input{appearance:none}body .block-language-leaflet .leaflet-bar.disabled>a{background-color:rgba(0,0,0,0);opacity:.3}body .leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}body .leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}body .leaflet-control-layers-toggle{border-radius:4px}body .block-language-leaflet .leaflet-control-expandable,body .block-language-leaflet .leaflet-control-has-actions .control-actions.expanded,body .block-language-leaflet .leaflet-distance-control,body .leaflet-bar,body .leaflet-bar a,body .leaflet-control-layers-expanded,body .leaflet-control-layers-toggle{background-color:var(--leaflet-buttons);color:var(--text-muted);border:none;user-select:none}body .leaflet-bar a.leaflet-disabled,body .leaflet-bar a.leaflet-disabled:hover{background-color:var(--leaflet-buttons);color:var(--text-faint);opacity:.6;cursor:not-allowed}body .leaflet-control a{cursor:var(--cursor);color:var(--text-normal)}body .leaflet-bar a:hover{background-color:var(--background-modifier-hover);color:var(--text-normal);border:none}body .leaflet-touch .leaflet-control-layers{background-color:var(--leaflet-buttons)}body .leaflet-touch .leaflet-bar,body .leaflet-touch .leaflet-control-layers{border-radius:5px;box-shadow:2px 0 8px 0 rgba(0,0,0,.1);border:1px solid var(--ui1)}body .block-language-leaflet .leaflet-control-has-actions .control-actions{box-shadow:0;border:1px solid var(--ui1)}body .leaflet-control-expandable-list .leaflet-bar{box-shadow:none;border-radius:0}body .block-language-leaflet .leaflet-distance-control{padding:4px 10px;height:auto;cursor:var(--cursor)!important}body .block-language-leaflet .leaflet-marker-link-popup>.leaflet-popup-content-wrapper>*{font-size:var(--font-adaptive-small);font-family:var(--font-interface)}body .block-language-leaflet .leaflet-marker-link-popup>.leaflet-popup-content-wrapper{padding:4px 10px!important}.leaflet-marker-icon svg path{stroke:var(--background-primary);stroke-width:18px}body .markdown-preview-view th,body .markdown-source-view.mod-cm6 .dataview.table-view-table thead.table-view-thead tr th,body .table-view-table>thead>tr>th{cursor:var(--cursor);background-image:none}.markdown-source-view.mod-cm6 th{background-repeat:no-repeat;background-position:right}.style-settings-container[data-level="2"]{background:var(--background-secondary);border:1px solid var(--ui1);border-radius:5px;padding:10px 20px;margin:2px 0 2px -20px}.workspace-leaf-content[data-type=style-settings] div[data-id=instructions] .setting-item-name{display:none}.workspace-leaf-content[data-type=style-settings] div[data-id=instructions] .setting-item-description{color:var(--text-normal);font-size:var(--font-adaptive-smaller);padding-bottom:.5em}.workspace-leaf-content[data-type=style-settings] .view-content{padding:var(--size-4-4) 0}.workspace-leaf-content[data-type=style-settings] .view-content>div{width:var(--line-width);max-width:var(--max-width);margin:0 auto}.workspace-leaf-content[data-type=style-settings] .style-settings-heading[data-level="0"] .setting-item-name{padding-left:17px}.workspace-leaf-content[data-type=style-settings] .setting-item{max-width:100%;margin:0 auto}.workspace-leaf-content[data-type=style-settings] .setting-item-name{position:relative}.workspace-leaf-content[data-type=style-settings] .style-settings-collapse-indicator{position:absolute;left:0}.setting-item-heading.style-settings-heading,.style-settings-container .style-settings-heading{cursor:var(--cursor)}.modal.mod-settings .setting-item .pickr button.pcr-button{box-shadow:none;border-radius:40px;height:24px;width:24px}.style-settings-container .setting-item{background-color:rgba(0,0,0,0)}.setting-item .pickr .pcr-button:after,.setting-item .pickr .pcr-button:before{border-radius:40px;box-shadow:none;border:none}.setting-item.setting-item-heading.style-settings-heading.is-collapsed{border-bottom:1px solid var(--background-modifier-border)}.setting-item.setting-item-heading.style-settings-heading{border:0;padding:10px 0 5px;margin-bottom:0;border-radius:0}.setting-item .style-settings-export,.setting-item .style-settings-import{text-decoration:none;font-size:var(--font-ui-small);font-weight:500;color:var(--text-muted);margin:0;padding:2px 8px;border-radius:5px;cursor:var(--cursor)}.setting-item .style-settings-export:hover,.setting-item .style-settings-import:hover{background-color:var(--background-modifier-hover);color:var(--text-normal);cursor:var(--cursor)}.mod-root .workspace-leaf-content[data-type=style-settings] .style-settings-container .setting-item:not(.setting-item-heading){flex-direction:row;align-items:center;padding:.5em 0}.workspace-split:not(.mod-root) .workspace-leaf-content[data-type=style-settings] .setting-item-name{font-size:var(--font-adaptive-smaller)}.themed-color-wrapper>div+div{margin-top:0;margin-left:6px}.theme-light .themed-color-wrapper>.theme-light{background-color:rgba(0,0,0,0)}.theme-light .themed-color-wrapper>.theme-dark{background-color:rgba(0,0,0,.8)}.theme-dark .themed-color-wrapper>.theme-dark{background-color:rgba(0,0,0,0)}@media(max-width:400pt){.workspace-leaf-content[data-type=style-settings] .setting-item-name{font-size:var(--font-adaptive-small)}.workspace-leaf-content[data-type=style-settings] .view-content>.setting-item>.setting-item-info:first-child{width:100%;margin-right:0}}.zoom-plugin-header{--link-color:var(--text-normal);--link-decoration:none;font-size:var(--font-ui-small);padding:0;justify-content:center;margin:var(--size-4-2) auto;max-width:var(--max-width)}.zoom-plugin-header>.zoom-plugin-title{text-decoration:none;max-width:15em;overflow:hidden}.zoom-plugin-header>.zoom-plugin-delimiter{color:var(--text-faint);padding:0 var(--size-4-1)}.theme-dark.minimal-atom-dark{--color-red-rgb:225,109,118;--color-orange-rgb:209,154,102;--color-yellow-rgb:206,193,103;--color-green-rgb:152,195,121;--color-cyan-rgb:88,182,194;--color-blue-rgb:98,175,239;--color-purple-rgb:198,120,222;--color-pink-rgb:225,109,118;--color-red:#e16d76;--color-orange:#d19a66;--color-yellow:#cec167;--color-green:#98c379;--color-cyan:#58b6c2;--color-blue:#62afef;--color-purple:#c678de;--color-pink:#e16d76}.theme-light.minimal-atom-light{--color-red-rgb:228,87,73;--color-orange-rgb:183,107,2;--color-yellow-rgb:193,131,2;--color-green-rgb:80,161,80;--color-cyan-rgb:13,151,179;--color-blue-rgb:98,175,239;--color-purple-rgb:166,38,164;--color-pink-rgb:228,87,73;--color-red:#e45749;--color-orange:#b76b02;--color-yellow:#c18302;--color-green:#50a150;--color-cyan:#0d97b3;--color-blue:#62afef;--color-purple:#a626a4;--color-pink:#e45749}.theme-light.minimal-atom-light{--base-h:106;--base-s:0%;--base-l:98%;--accent-h:231;--accent-s:76%;--accent-l:62%;--bg1:#fafafa;--bg2:#eaeaeb;--bg3:rgba(0,0,0,.1);--ui1:#dbdbdc;--ui2:#d8d8d9;--tx1:#232324;--tx2:#8e8e90;--tx3:#a0a1a8;--hl1:rgba(180,180,183,0.3);--hl2:rgba(209,154,102,0.35)}.theme-light.minimal-atom-light.minimal-light-white{--bg3:#eaeaeb}.theme-dark.minimal-atom-dark,.theme-light.minimal-atom-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-atom-light.minimal-light-contrast .theme-dark,.theme-light.minimal-atom-light.minimal-light-contrast .titlebar,.theme-light.minimal-atom-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-atom-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-atom-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:220;--base-s:12%;--base-l:18%;--accent-h:220;--accent-s:86%;--accent-l:65%;--bg1:#282c34;--bg2:#21252c;--bg3:#3a3f4b;--divider-color:#181a1f;--tab-outline-color:#181a1f;--tx1:#d8dae1;--tx2:#898f9d;--tx3:#5d6370;--hl1:rgba(114,123,141,0.3);--hl2:rgba(209,154,102,0.3);--sp1:#fff}.theme-dark.minimal-atom-dark.minimal-dark-black{--base-d:5%;--bg3:#282c34;--divider-color:#282c34;--tab-outline-color:#282c34}.theme-light.minimal-ayu-light{--color-red-rgb:230,80,80;--color-orange-rgb:250,141,62;--color-yellow-rgb:242,174,73;--color-green-rgb:108,191,67;--color-cyan-rgb:76,191,153;--color-blue-rgb:57,158,230;--color-purple-rgb:163,122,204;--color-pink-rgb:255,115,131;--color-red:#e65050;--color-orange:#fa8d3e;--color-yellow:#f2ae49;--color-green:#6CBF43;--color-cyan:#4cbf99;--color-blue:#399ee6;--color-purple:#a37acc;--color-pink:#ff7383}.theme-dark.minimal-ayu-dark{--color-red-rgb:255,102,102;--color-orange-rgb:250,173,102;--color-yellow-rgb:255,209,55;--color-green-rgb:135,217,108;--color-cyan-rgb:149,230,203;--color-blue-rgb:115,208,255;--color-purple-rgb:223,191,255;--color-pink-rgb:242,121,131;--color-red:#ff6666;--color-orange:#ffad66;--color-yellow:#ffd137;--color-green:#87D96C;--color-cyan:#95e6cb;--color-blue:#73d0ff;--color-purple:#dfbfff;--color-pink:#f27983}.theme-light.minimal-ayu-light{--base-h:210;--base-s:17%;--base-l:98%;--accent-h:36;--accent-s:100%;--accent-l:50%;--bg1:#fff;--bg2:#f8f9fa;--bg3:rgba(209,218,224,0.5);--ui1:#E6EAED;--tx1:#5C6165;--tx2:#8A9199;--tx3:#AAAEB0;--hl1:rgba(3,91,214,0.15)}.theme-dark.minimal-ayu-dark,.theme-light.minimal-ayu-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-ayu-light.minimal-light-contrast .theme-dark,.theme-light.minimal-ayu-light.minimal-light-contrast .titlebar,.theme-light.minimal-ayu-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-ayu-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-ayu-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:222;--base-s:22%;--base-l:15%;--accent-h:35;--accent-s:100%;--accent-l:60%;--bg1:#232937;--bg2:#1E2431;--bg3:rgba(51,61,80,0.5);--ui1:#333C4A;--ui2:#333C4A;--ui3:#333C4A;--tx1:#cccac2;--tx2:#707A8C;--tx3:#495063;--hl1:rgba(64,159,255,0.25)}.theme-dark.minimal-ayu-dark.minimal-dark-black{--accent-h:40;--accent-s:75%;--accent-l:61%;--bg3:#0E1017;--tx1:#BFBDB6;--divider-color:#11151C;--tab-outline-color:#11151C}.theme-light.minimal-catppuccin-light{--color-red-rgb:230,69,83;--color-orange-rgb:254,100,12;--color-yellow-rgb:223,142,29;--color-green-rgb:64,160,43;--color-cyan-rgb:23,146,154;--color-blue-rgb:33,102,246;--color-purple-rgb:137,56,239;--color-pink-rgb:234,119,203;--color-red:#E64553;--color-orange:#FE640C;--color-yellow:#DF8E1D;--color-green:#40A02B;--color-cyan:#17929A;--color-blue:#2166F6;--color-purple:#8938EF;--color-pink:#EA77CB}.theme-dark.minimal-catppuccin-dark{--color-red-rgb:235,153,156;--color-orange-rgb:239,160,118;--color-yellow-rgb:229,200,144;--color-green-rgb:166,209,138;--color-cyan-rgb:129,200,190;--color-blue-rgb:140,170,238;--color-purple-rgb:202,158,230;--color-pink-rgb:244,185,229;--color-red:#EB999C;--color-orange:#EFA076;--color-yellow:#E5C890;--color-green:#A6D18A;--color-cyan:#81C8BE;--color-blue:#8CAAEE;--color-purple:#CA9EE6;--color-pink:#F4B9E5}.theme-light.minimal-catppuccin-light{--base-h:228;--base-s:20%;--base-l:95%;--accent-h:11;--accent-s:59%;--accent-l:67%;--bg1:#F0F1F5;--bg2:#DCE0E8;--bg3:hsla(228,11%,65%,.25);--ui1:#CCD0DA;--ui2:#BCC0CC;--ui3:#ACB0BE;--tx1:#4D4F69;--tx2:#5D5F77;--tx3:#8D8FA2;--hl1:rgba(172,176,190,.3);--hl2:rgba(223,142,29,.3)}.theme-light.minimal-catppuccin-light.minimal-light-tonal{--bg2:#DCE0E8}.theme-light.minimal-catppuccin-light.minimal-light-white{--bg3:#F0F1F5;--ui1:#DCE0E8}.theme-dark.minimal-catppuccin-dark,.theme-light.minimal-catppuccin-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-catppuccin-light.minimal-light-contrast .theme-dark,.theme-light.minimal-catppuccin-light.minimal-light-contrast .titlebar,.theme-light.minimal-catppuccin-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-catppuccin-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-catppuccin-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:229;--base-s:19%;--base-l:23%;--accent-h:10;--accent-s:57%;--accent-l:88%;--bg1:#303446;--bg2:#242634;--bg3:hsla(229,13%,52%,0.25);--ui1:#41455A;--ui2:#51576D;--ui3:#626880;--tx1:#C6D0F5;--tx2:#A6ADCE;--tx3:#848BA7;--sp1:#242634;--hl1:rgba(98,104,128,.5);--hl2:rgba(223,142,29,.4)}.theme-dark.minimal-catppuccin-dark.minimal-dark-black{--ui1:#303446;--hl2:rgba(223,142,29,.5)}.theme-dark.minimal-dracula-dark{--color-red-rgb:255,85,85;--color-orange-rgb:255,184,108;--color-yellow-rgb:241,250,140;--color-green-rgb:80,250,123;--color-cyan-rgb:139,233,253;--color-blue-rgb:98,114,164;--color-purple-rgb:189,147,249;--color-pink-rgb:255,121,198;--color-red:#ff5555;--color-orange:#ffb86c;--color-yellow:#f1fa8c;--color-green:#50fa7b;--color-cyan:#8be9fd;--color-blue:#6272a4;--color-purple:#bd93f9;--color-pink:#ff79c6}.theme-dark.minimal-dracula-dark,.theme-light.minimal-dracula-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-dracula-light.minimal-light-contrast .theme-dark,.theme-light.minimal-dracula-light.minimal-light-contrast .titlebar,.theme-light.minimal-dracula-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-dracula-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-dracula-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:232;--base-s:16%;--base-l:19%;--accent-h:265;--accent-s:89%;--accent-l:78%;--bg1:#282a37;--bg2:#21222c;--ui2:#44475a;--ui3:#6272a4;--tx1:#f8f8f2;--tx2:#949FBE;--tx3:#6272a4;--hl1:rgba(134, 140, 170, 0.3);--hl2:rgba(189, 147, 249, 0.35)}.theme-dark.minimal-dracula-dark.minimal-dark-black{--ui1:#282a36}.theme-dark.minimal-eink-dark,.theme-light.minimal-eink-light{--collapse-icon-color:var(--text-normal);--icon-color-active:var(--bg1);--icon-color-hover:var(--bg1);--icon-color-focused:var(--bg1);--icon-opacity:1;--indentation-guide-color:var(--tx1);--indentation-guide-color-active:var(--tx1);--indentation-guide-width-active:3px;--interactive-normal:var(--bg1);--input-shadow:0 0 0 1px var(--tx1);--link-unresolved-opacity:1;--link-unresolved-decoration-style:dashed;--link-unresolved-decoration-color:var(--tx1);--metadata-label-background-active:var(--bg1);--metadata-input-background-active:var(--bg1);--modal-border-color:var(--tx1);--modal-border-width:2px;--prompt-border-color:var(--tx1);--prompt-border-width:2px;--calendar-dot-active:var(--bg1);--calendar-dot-today:var(--bg1);--calendar-text-active:var(--bg1);--tag-border-width:1.25px;--tag-background:transparent;--tag-background-hover:transparent;--tag-border-color:var(--tx1);--tag-border-color-hover:var(--tx1);--text-on-accent:var(--bg1);--text-on-accent-inverted:var(--bg1);--text-selection:var(--tx1);--vault-profile-color:var(--tx1);--nav-item-color-hover:var(--bg1)}.theme-dark.minimal-eink-dark ::selection,.theme-dark.minimal-eink-dark button:hover,.theme-light.minimal-eink-light ::selection,.theme-light.minimal-eink-light button:hover{color:var(--bg1)}.theme-dark.minimal-eink-dark .nav-files-container,.theme-light.minimal-eink-light .nav-files-container{--nav-item-color-active:var(--bg1)}.theme-dark.minimal-eink-dark .tree-item-self:hover,.theme-light.minimal-eink-light .tree-item-self:hover{--nav-collapse-icon-color:var(--bg1)}.theme-dark.minimal-eink-dark.is-focused .mod-active .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.theme-dark.minimal-eink-dark.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active,.theme-dark.minimal-eink-dark.tabs-modern,.theme-light.minimal-eink-light.is-focused .mod-active .workspace-tab-header.is-active .workspace-tab-header-inner-icon,.theme-light.minimal-eink-light.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active,.theme-light.minimal-eink-light.tabs-modern{--minimal-tab-text-color-active:var(--bg1);--tab-text-color-focused:var(--bg1);--tab-text-color-focused-active-current:var(--bg1)}.theme-dark.minimal-eink-dark .setting-hotkey,.theme-light.minimal-eink-light .setting-hotkey{background-color:rgba(0,0,0,0);border:1px solid var(--tx1)}.theme-dark.minimal-eink-dark .suggestion-container,.theme-light.minimal-eink-light .suggestion-container{border-width:3px}.theme-dark.minimal-eink-dark .cm-s-obsidian span.cm-inline-code,.theme-dark.minimal-eink-dark .markdown-rendered code,.theme-light.minimal-eink-light .cm-s-obsidian span.cm-inline-code,.theme-light.minimal-eink-light .markdown-rendered code{font-weight:600}.theme-dark.minimal-eink-dark .tree-item-self.is-active,.theme-dark.minimal-eink-dark .tree-item-self:hover,.theme-light.minimal-eink-light .tree-item-self.is-active,.theme-light.minimal-eink-light .tree-item-self:hover{--icon-color:var(--bg1)}.theme-dark.minimal-eink-dark .metadata-property-icon,.theme-light.minimal-eink-light .metadata-property-icon{--icon-color-focused:var(--tx1)}.theme-dark.minimal-eink-dark .checkbox-container,.theme-light.minimal-eink-light .checkbox-container{background-color:var(--bg1);box-shadow:0 0 0 1px var(--tx1);--toggle-thumb-color:var(--tx1)}.theme-dark.minimal-eink-dark .checkbox-container.is-enabled,.theme-light.minimal-eink-light .checkbox-container.is-enabled{background-color:var(--tx1);--toggle-thumb-color:var(--bg1)}.theme-dark.minimal-eink-dark.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active:not(:hover),.theme-dark.minimal-eink-dark.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active,.theme-light.minimal-eink-light.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active:not(:hover),.theme-light.minimal-eink-light.tabs-modern .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active{background-color:var(--tx1)}.theme-dark.minimal-eink-dark #calendar-container .reset-button:hover,.theme-dark.minimal-eink-dark .cm-s-obsidian span.cm-formatting-highlight,.theme-dark.minimal-eink-dark .cm-s-obsidian span.cm-highlight,.theme-dark.minimal-eink-dark .community-item .suggestion-highlight,.theme-dark.minimal-eink-dark .dropdown:hover,.theme-dark.minimal-eink-dark .horizontal-tab-nav-item:hover,.theme-dark.minimal-eink-dark .markdown-rendered mark,.theme-dark.minimal-eink-dark .mod-root .workspace-tab-header-status-icon,.theme-dark.minimal-eink-dark .mod-root .workspace-tab-header:hover,.theme-dark.minimal-eink-dark .search-result-file-match:hover,.theme-dark.minimal-eink-dark .search-result-file-matched-text,.theme-dark.minimal-eink-dark .status-bar .plugin-sync:hover .sync-status-icon.mod-success,.theme-dark.minimal-eink-dark .status-bar .plugin-sync:hover .sync-status-icon.mod-working,.theme-dark.minimal-eink-dark .status-bar-item.mod-clickable:hover,.theme-dark.minimal-eink-dark .suggestion-item.is-selected,.theme-dark.minimal-eink-dark .text-icon-button:hover,.theme-dark.minimal-eink-dark .vertical-tab-nav-item:hover,.theme-dark.minimal-eink-dark button.mod-cta,.theme-dark.minimal-eink-dark select:hover,.theme-dark.minimal-eink-dark.is-focused.tabs-modern .mod-active .workspace-tab-header.is-active .workspace-tab-header-inner-title,.theme-dark.minimal-eink-dark.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active,.theme-dark.minimal-eink-dark.labeled-nav .mod-left-split .mod-top .workspace-tab-header:hover,.theme-dark.minimal-eink-dark:not(.colorful-active) .horizontal-tab-nav-item.is-active,.theme-dark.minimal-eink-dark:not(.colorful-active) .vertical-tab-nav-item.is-active,.theme-light.minimal-eink-light #calendar-container .reset-button:hover,.theme-light.minimal-eink-light .cm-s-obsidian span.cm-formatting-highlight,.theme-light.minimal-eink-light .cm-s-obsidian span.cm-highlight,.theme-light.minimal-eink-light .community-item .suggestion-highlight,.theme-light.minimal-eink-light .dropdown:hover,.theme-light.minimal-eink-light .horizontal-tab-nav-item:hover,.theme-light.minimal-eink-light .markdown-rendered mark,.theme-light.minimal-eink-light .mod-root .workspace-tab-header-status-icon,.theme-light.minimal-eink-light .mod-root .workspace-tab-header:hover,.theme-light.minimal-eink-light .search-result-file-match:hover,.theme-light.minimal-eink-light .search-result-file-matched-text,.theme-light.minimal-eink-light .status-bar .plugin-sync:hover .sync-status-icon.mod-success,.theme-light.minimal-eink-light .status-bar .plugin-sync:hover .sync-status-icon.mod-working,.theme-light.minimal-eink-light .status-bar-item.mod-clickable:hover,.theme-light.minimal-eink-light .suggestion-item.is-selected,.theme-light.minimal-eink-light .text-icon-button:hover,.theme-light.minimal-eink-light .vertical-tab-nav-item:hover,.theme-light.minimal-eink-light button.mod-cta,.theme-light.minimal-eink-light select:hover,.theme-light.minimal-eink-light.is-focused.tabs-modern .mod-active .workspace-tab-header.is-active .workspace-tab-header-inner-title,.theme-light.minimal-eink-light.labeled-nav .mod-left-split .mod-top .workspace-tab-header.is-active,.theme-light.minimal-eink-light.labeled-nav .mod-left-split .mod-top .workspace-tab-header:hover,.theme-light.minimal-eink-light:not(.colorful-active) .horizontal-tab-nav-item.is-active,.theme-light.minimal-eink-light:not(.colorful-active) .vertical-tab-nav-item.is-active{color:var(--bg1)}.theme-dark.minimal-eink-dark .is-flashing,.theme-light.minimal-eink-light .is-flashing{--text-highlight-bg:#999}.theme-dark.minimal-eink-dark #calendar-container .day:hover,.theme-light.minimal-eink-light #calendar-container .day:hover{--color-dot:var(--bg1)}.theme-light.minimal-eink-light{--base-h:0;--base-s:0%;--base-l:100%;--accent-h:0;--accent-s:0%;--accent-l:0%;--ax3:#000;--bg1:#fff;--bg2:#fff;--bg3:#000;--ui1:#000;--ui2:#000;--ui3:#000;--tx1:#000;--tx2:#000;--tx3:#000;--hl1:#000;--hl2:#000;--sp1:#fff;--text-on-accent:#fff;--background-modifier-cover:rgba(235,235,235,1)}.theme-dark.minimal-eink-dark,.theme-light.minimal-eink-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-eink-light.minimal-light-contrast .theme-dark,.theme-light.minimal-eink-light.minimal-light-contrast .titlebar,.theme-light.minimal-eink-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-eink-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-eink-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:0;--base-s:0%;--base-l:0%;--accent-h:0;--accent-s:0%;--accent-l:100%;--ax3:#fff;--bg1:#000;--bg2:#000;--bg3:#fff;--ui1:#fff;--ui2:#fff;--ui3:#fff;--tx1:#fff;--tx2:#fff;--tx3:#fff;--hl1:#fff;--hl2:#fff;--sp1:#000;--background-modifier-cover:rgba(20,20,20,1);--vault-profile-color:var(--tx1);--vault-profile-color-hover:var(--bg1);--nav-item-color-hover:var(--bg1);--nav-item-color-active:var(--bg1)}.theme-light.minimal-eink-light.minimal-light-tonal{--bg3:#bbb;--ui1:#bbb;--tx3:#999}.theme-dark.minimal-eink-dark.minimal-dark-tonal{--bg3:#444;--ui1:#444;--tx3:#999}.theme-dark.minimal-eink-dark.minimal-dark-tonal,.theme-light.minimal-eink-light.minimal-light-tonal{--hl2:var(--bg3);--modal-border-color:var(--ui1);--prompt-border-color:var(--ui1);--tag-border-color:var(--ui1);--text-selection:var(--bg3);--icon-color-active:var(--tx1);--icon-color-focused:var(--tx1);--nav-item-color-active:var(--tx1);--nav-item-color-hover:var(--tx1);--minimal-tab-text-color-active:var(--tx1)}.theme-dark.minimal-eink-dark.minimal-dark-tonal .is-flashing,.theme-dark.minimal-eink-dark.minimal-dark-tonal .search-result-file-matched-text,.theme-light.minimal-eink-light.minimal-light-tonal .is-flashing,.theme-light.minimal-eink-light.minimal-light-tonal .search-result-file-matched-text{background-color:var(--bg3);color:var(--tx1)}.theme-dark.minimal-eink-dark.minimal-dark-tonal #calendar-container .reset-button:hover,.theme-dark.minimal-eink-dark.minimal-dark-tonal ::selection,.theme-dark.minimal-eink-dark.minimal-dark-tonal:not(.colorful-active) .vertical-tab-nav-item.is-active,.theme-dark.minimal-eink-dark.minimal-dark-tonal:not(.colorful-active) .vertical-tab-nav-item:hover,.theme-light.minimal-eink-light.minimal-light-tonal #calendar-container .reset-button:hover,.theme-light.minimal-eink-light.minimal-light-tonal ::selection,.theme-light.minimal-eink-light.minimal-light-tonal:not(.colorful-active) .vertical-tab-nav-item.is-active,.theme-light.minimal-eink-light.minimal-light-tonal:not(.colorful-active) .vertical-tab-nav-item:hover{color:var(--tx1)}.theme-light.minimal-everforest-light{--color-red-rgb:248,85,82;--color-orange-rgb:245,125,38;--color-yellow-rgb:223,160,0;--color-green-rgb:141,161,1;--color-cyan-rgb:53,167,124;--color-blue-rgb:56,148,196;--color-purple-rgb:223,105,186;--color-pink-rgb:223,105,186;--color-red:#f85552;--color-orange:#f57d26;--color-yellow:#dfa000;--color-green:#8da101;--color-cyan:#35a77c;--color-blue:#3795C5;--color-purple:#df69ba;--color-pink:#df69ba}.theme-dark.minimal-everforest-dark{--color-red-rgb:230,126,128;--color-orange-rgb:230,152,117;--color-yellow-rgb:219,188,127;--color-green-rgb:167,192,128;--color-cyan-rgb:131,192,146;--color-blue-rgb:127,187,179;--color-purple-rgb:223,105,186;--color-pink-rgb:223,105,186;--color-red:#e67e80;--color-orange:#e69875;--color-yellow:#dbbc7f;--color-green:#a7c080;--color-cyan:#83c092;--color-blue:#7fbbb3;--color-purple:#d699b6;--color-pink:#d699b6}.theme-light.minimal-everforest-light{--base-h:44;--base-s:87%;--base-l:94%;--accent-h:83;--accent-s:36%;--accent-l:53%;--bg1:#fdf6e3;--bg2:#efebd4;--bg3:rgba(226,222,198,.5);--ui1:#e0dcc7;--ui2:#bec5b2;--ui3:#bec5b2;--tx1:#5C6A72;--tx2:#829181;--tx3:#a6b0a0;--hl1:rgba(198,214,152,.4);--hl2:rgba(222,179,51,.3)}.theme-light.minimal-everforest-light.minimal-light-tonal{--bg2:#fdf6e3}.theme-light.minimal-everforest-light.minimal-light-white{--bg3:#f3efda;--ui1:#edead5}.theme-dark.minimal-everforest-dark,.theme-light.minimal-everforest-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-everforest-light.minimal-light-contrast .theme-dark,.theme-light.minimal-everforest-light.minimal-light-contrast .titlebar,.theme-light.minimal-everforest-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-everforest-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-everforest-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:203;--base-s:15%;--base-l:23%;--accent-h:81;--accent-s:34%;--accent-l:63%;--bg1:#2d353b;--bg2:#232a2e;--bg3:rgba(71,82,88,0.5);--ui1:#475258;--ui2:#4f585e;--ui3:#525c62;--tx1:#d3c6aa;--tx2:#9da9a0;--tx3:#7a8478;--hl1:rgba(134,70,93,.5);--hl2:rgba(147,185,96,.3)}.theme-dark.minimal-everforest-dark.minimal-dark-black{--hl1:rgba(134,70,93,.4);--ui1:#2b3339}.theme-light.minimal-flexoki-light{--color-red-rgb:175,48,41;--color-orange-rgb:188,82,21;--color-yellow-rgb:173,131,1;--color-green-rgb:102,128,11;--color-cyan-rgb:36,131,123;--color-blue-rgb:32,94,166;--color-purple-rgb:94,64,157;--color-pink-rgb:160,47,111;--color-red:#AF3029;--color-orange:#BC5215;--color-yellow:#AD8301;--color-green:#66800B;--color-cyan:#24837B;--color-blue:#205EA6;--color-purple:#5E409D;--color-pink:#A02F6F}.theme-dark.minimal-flexoki-dark{--color-red-rgb:209,77,65;--color-orange-rgb:218,112,44;--color-yellow-rgb:208,162,21;--color-green-rgb:135,154,57;--color-cyan-rgb:58,169,159;--color-blue-rgb:67,133,190;--color-purple-rgb:139,126,200;--color-pink-rgb:206,93,151;--color-red:#D14D41;--color-orange:#DA702C;--color-yellow:#D0A215;--color-green:#879A39;--color-cyan:#3AA99F;--color-blue:#4385BE;--color-purple:#8B7EC8;--color-pink:#CE5D97}.theme-light.minimal-flexoki-light{--base-h:48;--base-s:100%;--base-l:97%;--accent-h:175;--accent-s:57%;--accent-l:33%;--bg1:#FFFCF0;--bg2:#F2F0E5;--bg3:rgba(16,15,15,0.05);--ui1:#E6E4D9;--ui2:#DAD8CE;--ui3:#CECDC3;--tx1:#100F0F;--tx2:#6F6E69;--tx3:#B7B5AC;--hl1:rgba(187,220,206,0.3);--hl2:rgba(247,209,61,0.3)}.theme-light.minimal-flexoki-light.minimal-light-tonal{--bg2:#FFFCF0}.theme-dark.minimal-flexoki-dark,.theme-light.minimal-flexoki-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-flexoki-light.minimal-light-contrast .theme-dark,.theme-light.minimal-flexoki-light.minimal-light-contrast .titlebar,.theme-light.minimal-flexoki-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-flexoki-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-flexoki-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:360;--base-s:3%;--base-l:6%;--accent-h:175;--accent-s:49%;--accent-l:45%;--bg1:#100F0F;--bg2:#1C1B1A;--bg3:rgba(254,252,240,0.05);--ui1:#282726;--ui2:#343331;--ui3:#403E3C;--tx1:#CECDC3;--tx2:#878580;--tx3:#575653;--hl1:rgba(30,95,91,0.3);--hl2:rgba(213,159,17,0.3)}.theme-dark.minimal-flexoki-dark.minimal-dark-black{--ui1:#1C1B1A}.theme-dark.minimal-gruvbox-dark,.theme-light.minimal-gruvbox-light{--color-red-rgb:204,36,29;--color-orange-rgb:214,93,14;--color-yellow-rgb:215,153,33;--color-green-rgb:152,151,26;--color-cyan-rgb:104,157,106;--color-blue-rgb:69,133,136;--color-purple-rgb:177,98,134;--color-pink-rgb:177,98,134;--color-red:#cc241d;--color-orange:#d65d0e;--color-yellow:#d79921;--color-green:#98971a;--color-cyan:#689d6a;--color-blue:#458588;--color-purple:#b16286;--color-pink:#b16286}.theme-light.minimal-gruvbox-light{--base-h:49;--base-s:92%;--base-l:89%;--accent-h:24;--accent-s:88%;--accent-l:45%;--bg1:#fcf2c7;--bg2:#f2e6bd;--bg3:#ebd9b3;--ui1:#ebdbb2;--ui2:#d5c4a1;--ui3:#bdae93;--tx1:#282828;--tx2:#7c7065;--tx3:#a89a85;--hl1:rgba(192,165,125,.3);--hl2:rgba(215,153,33,.4)}.theme-light.minimal-gruvbox-light.minimal-light-tonal{--bg2:#fcf2c7}.theme-light.minimal-gruvbox-light.minimal-light-white{--bg3:#faf5d7;--ui1:#f2e6bd}.theme-dark.minimal-gruvbox-dark,.theme-light.minimal-gruvbox-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-gruvbox-light.minimal-light-contrast .theme-dark,.theme-light.minimal-gruvbox-light.minimal-light-contrast .titlebar,.theme-light.minimal-gruvbox-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-gruvbox-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-gruvbox-light.minimal-light-contrast.minimal-status-off .status-bar{--accent-h:24;--accent-s:88%;--accent-l:45%;--bg1:#282828;--bg2:#1e2021;--bg3:#3d3836;--bg3:rgba(62,57,55,0.5);--ui1:#3c3836;--ui2:#504945;--ui3:#665c54;--tx1:#fbf1c7;--tx2:#bdae93;--tx3:#7c6f64;--hl1:rgba(173,149,139,0.3);--hl2:rgba(215,153,33,.4)}.theme-dark.minimal-gruvbox-dark.minimal-dark-black{--hl1:rgba(173,149,139,0.4);--ui1:#282828}.theme-dark.minimal-macos-dark,.theme-light.minimal-macos-light{--color-red-rgb:255,59,49;--color-orange-rgb:255,149,2;--color-yellow-rgb:255,204,0;--color-green-rgb:42,205,65;--color-cyan-rgb:2,199,190;--color-blue-rgb:2,122,255;--color-purple-rgb:176,81,222;--color-pink-rgb:255,46,85;--color-red:#ff3b31;--color-orange:#ff9502;--color-yellow:#ffcc00;--color-green:#2acd41;--color-cyan:#02c7be;--color-blue:#027aff;--color-purple:#b051de;--color-pink:#ff2e55}.theme-light.minimal-macos-light{--base-h:106;--base-s:0%;--base-l:94%;--accent-h:212;--accent-s:100%;--accent-l:50%;--bg1:#fff;--bg2:#f0f0f0;--bg3:rgba(0,0,0,.1);--ui1:#e7e7e7;--tx1:#454545;--tx2:#808080;--tx3:#b0b0b0;--hl1:#b3d7ff}.theme-light.minimal-macos-light.minimal-light-tonal{--bg1:#f0f0f0;--bg2:#f0f0f0}.theme-dark.minimal-macos-dark,.theme-light.minimal-macos-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-macos-light.minimal-light-contrast .theme-dark,.theme-light.minimal-macos-light.minimal-light-contrast .titlebar,.theme-light.minimal-macos-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-macos-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-macos-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:106;--base-s:0%;--base-l:12%;--accent-h:212;--accent-s:100%;--accent-l:50%;--bg1:#1e1e1e;--bg2:#282828;--bg3:rgba(255,255,255,0.11);--divider-color:#000;--tab-outline-color:#000;--ui1:#373737;--ui2:#515151;--ui3:#595959;--tx1:#dcdcdc;--tx2:#8c8c8c;--tx3:#686868;--hl1:rgba(98,169,252,0.5);--sp1:#fff}.theme-dark.minimal-macos-dark.minimal-dark-black{--divider-color:#1e1e1e;--tab-outline-color:#1e1e1e}.theme-dark.minimal-nord-dark,.theme-light.minimal-nord-light{--color-red-rgb:191,97,106;--color-orange-rgb:208,138,112;--color-yellow-rgb:235,203,139;--color-green-rgb:163,190,140;--color-cyan-rgb:136,192,208;--color-blue-rgb:129,161,193;--color-purple-rgb:180,142,173;--color-pink-rgb:180,142,173;--color-red:#BF616A;--color-orange:#D08770;--color-yellow:#EBCB8B;--color-green:#A3BE8C;--color-cyan:#88C0D0;--color-blue:#81A1C1;--color-purple:#B48EAD;--color-pink:#B48EAD}.theme-light.minimal-nord-light{--base-h:221;--base-s:27%;--base-l:94%;--accent-h:213;--accent-s:32%;--accent-l:52%;--bg1:#fff;--bg2:#eceff4;--bg3:rgba(157,174,206,0.25);--ui1:#d8dee9;--ui2:#BBCADC;--ui3:#81a1c1;--tx1:#2e3440;--tx2:#7D8697;--tx3:#ADB1B8;--hl2:rgba(208, 135, 112, 0.35)}.theme-dark.minimal-nord-dark,.theme-light.minimal-nord-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-nord-light.minimal-light-contrast .theme-dark,.theme-light.minimal-nord-light.minimal-light-contrast .titlebar,.theme-light.minimal-nord-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-nord-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-nord-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:220;--base-s:16%;--base-l:22%;--accent-h:213;--accent-s:32%;--accent-l:52%;--bg1:#2e3440;--bg2:#3b4252;--bg3:rgba(135,152,190,0.15);--ui1:#434c5e;--ui2:#58647b;--ui3:#58647b;--tx1:#d8dee9;--tx2:#9eafcc;--tx3:#4c566a;--hl1:rgba(129,142,180,0.3);--hl2:rgba(208, 135, 112, 0.35)}.theme-dark.minimal-nord-dark.minimal-dark-black{--ui1:#2e3440}.theme-light.minimal-notion-light{--base-h:39;--base-s:18%;--base-d:96%;--accent-h:197;--accent-s:71%;--accent-l:52%;--bg2:#f7f6f4;--bg3:#e8e7e4;--ui1:#ededec;--ui2:#dbdbda;--ui3:#aaa9a5;--tx1:#37352f;--tx2:#72706c;--tx3:#aaa9a5;--hl1:rgba(131,201,229,0.3)}.theme-dark.minimal-notion-dark,.theme-light.minimal-notion-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-notion-light.minimal-light-contrast .theme-dark,.theme-light.minimal-notion-light.minimal-light-contrast .titlebar,.theme-light.minimal-notion-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-notion-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-notion-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:203;--base-s:8%;--base-d:20%;--accent-h:197;--accent-s:71%;--accent-l:52%;--bg1:#2f3437;--bg2:#373c3f;--bg3:#4b5053;--ui1:#3e4245;--ui2:#585d5f;--ui3:#585d5f;--tx1:#ebebeb;--tx2:#909295;--tx3:#585d5f;--hl1:rgba(57,134,164,0.3)}.theme-dark.minimal-notion-dark.minimal-dark-black{--base-d:5%;--bg3:#232729;--ui1:#2f3437}.theme-light.minimal-rose-pine-light{--color-red-rgb:180,99,122;--color-orange-rgb:215,130,125;--color-yellow-rgb:234,157,53;--color-green-rgb:40,105,131;--color-cyan-rgb:87,147,159;--color-blue-rgb:87,147,159;--color-purple-rgb:144,122,169;--color-pink-rgb:144,122,169;--color-red:#b4637a;--color-orange:#d7827e;--color-yellow:#ea9d34;--color-green:#286983;--color-cyan:#56949f;--color-blue:#56949f;--color-purple:#907aa9;--color-pink:#907aa9}.theme-dark.minimal-rose-pine-dark{--color-red-rgb:234,111,146;--color-orange-rgb:233,155,151;--color-yellow-rgb:246,193,119;--color-green-rgb:47,116,143;--color-cyan-rgb:157,207,215;--color-blue-rgb:157,207,215;--color-purple-rgb:196,167,231;--color-pink-rgb:196,167,231;--color-red:#eb6f92;--color-orange:#ea9a97;--color-yellow:#f6c177;--color-green:#31748f;--color-cyan:#9ccfd8;--color-blue:#9ccfd8;--color-purple:#c4a7e7;--color-pink:#c4a7e7}.theme-light.minimal-rose-pine-light{--base-h:32;--base-s:57%;--base-l:95%;--accent-h:3;--accent-s:53%;--accent-l:67%;--bg1:#fffaf3;--bg2:#faf4ed;--bg3:rgba(233,223,218,0.5);--ui1:#EAE3E1;--ui2:#dfdad9;--ui3:#cecacd;--tx1:#575279;--tx2:#797593;--tx3:#9893a5;--hl1:rgba(191,180,181,0.35)}.theme-dark.minimal-rose-pine-dark,.theme-light.minimal-rose-pine-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-rose-pine-light.minimal-light-contrast .theme-dark,.theme-light.minimal-rose-pine-light.minimal-light-contrast .titlebar,.theme-light.minimal-rose-pine-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-rose-pine-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-rose-pine-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:247;--base-s:23%;--base-l:15%;--accent-h:2;--accent-s:55%;--accent-l:83%;--bg1:#1f1d2e;--bg2:#191724;--bg3:rgba(68,66,86,0.5);--ui1:#312F41;--ui2:#403d52;--ui3:#524f67;--tx1:#e0def4;--tx2:#908caa;--tx3:#6e6a86;--hl1:rgba(126,121,155,0.35)}.theme-dark.minimal-rose-pine-dark.minimal-dark-black{--ui1:#21202e}.theme-dark.minimal-solarized-dark,.theme-light.minimal-solarized-light{--color-red-rgb:220,50,47;--color-orange-rgb:203,77,22;--color-yellow-rgb:181,137,0;--color-green-rgb:133,153,0;--color-cyan-rgb:42,161,152;--color-blue-rgb:38,139,210;--color-purple-rgb:108,113,196;--color-pink-rgb:211,54,130;--color-red:#dc322f;--color-orange:#cb4b16;--color-yellow:#b58900;--color-green:#859900;--color-cyan:#2aa198;--color-blue:#268bd2;--color-purple:#6c71c4;--color-pink:#d33682}.theme-light.minimal-solarized-light{--base-h:44;--base-s:87%;--base-l:94%;--accent-h:205;--accent-s:70%;--accent-l:48%;--bg1:#fdf6e3;--bg2:#eee8d5;--bg3:rgba(0,0,0,0.062);--ui1:#e9e1c8;--ui2:#d0cab8;--ui3:#d0cab8;--tx1:#073642;--tx2:#586e75;--tx3:#ABB2AC;--tx4:#586e75;--hl1:rgba(202,197,182,0.3);--hl2:rgba(203,75,22,0.3)}.theme-light.minimal-solarized-light.minimal-light-tonal{--bg2:#fdf6e3}.theme-dark.minimal-solarized-dark,.theme-light.minimal-solarized-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-solarized-light.minimal-light-contrast .theme-dark,.theme-light.minimal-solarized-light.minimal-light-contrast .titlebar,.theme-light.minimal-solarized-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-solarized-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-solarized-light.minimal-light-contrast.minimal-status-off .status-bar{--accent-h:205;--accent-s:70%;--accent-l:48%;--base-h:193;--base-s:98%;--base-l:11%;--bg1:#002b36;--bg2:#073642;--bg3:rgba(255,255,255,0.062);--ui1:#19414B;--ui2:#274850;--ui3:#31535B;--tx1:#93a1a1;--tx2:#657b83;--tx3:#31535B;--tx4:#657b83;--hl1:rgba(15,81,98,0.3);--hl2:rgba(203, 75, 22, 0.35)}.theme-dark.minimal-solarized-dark.minimal-dark-black{--hl1:rgba(15,81,98,0.55);--ui1:#002b36}.theme-dark.minimal-things-dark,.theme-light.minimal-things-light{--color-red-rgb:255,48,108;--color-orange-rgb:255,149,2;--color-yellow-rgb:255,213,0;--color-green-rgb:75,191,94;--color-cyan-rgb:73,174,164;--color-purple-rgb:176,81,222;--color-pink-rgb:255,46,85;--color-red:#FF306C;--color-orange:#ff9502;--color-yellow:#FFD500;--color-green:#4BBF5E;--color-cyan:#49AEA4;--color-purple:#b051de;--color-pink:#ff2e55}.theme-light.minimal-things-light{--color-blue-rgb:27,97,194;--color-blue:#1b61c2}.theme-dark.minimal-things-dark{--color-blue-rgb:77,149,247;--color-blue:#4d95f7}.theme-light.minimal-things-light{--accent-h:215;--accent-s:76%;--accent-l:43%;--bg1:white;--bg2:#f5f6f8;--bg3:rgba(162,177,187,0.25);--ui1:#eef0f4;--ui2:#D8DADD;--ui3:#c1c3c6;--tx1:#26272b;--tx2:#7D7F84;--tx3:#a9abb0;--hl1:#cae2ff}.theme-light.minimal-things-light.minimal-light-tonal{--ui1:#e6e8ec}.theme-light.minimal-things-light.minimal-light-white{--bg3:#f5f6f8}.theme-dark.minimal-things-dark,.theme-light.minimal-things-light.minimal-light-contrast .mod-left-split,.theme-light.minimal-things-light.minimal-light-contrast .theme-dark,.theme-light.minimal-things-light.minimal-light-contrast .titlebar,.theme-light.minimal-things-light.minimal-light-contrast .workspace-drawer.mod-left,.theme-light.minimal-things-light.minimal-light-contrast .workspace-ribbon.mod-left:not(.is-collapsed),.theme-light.minimal-things-light.minimal-light-contrast.minimal-status-off .status-bar{--base-h:218;--base-s:9%;--base-l:15%;--accent-h:215;--accent-s:91%;--accent-l:64%;--bg1:#24262a;--bg2:#202225;--bg3:#3d3f41;--divider-color:#17191c;--tab-outline-color:#17191c;--ui1:#3A3B3F;--ui2:#45464a;--ui3:#6c6e70;--tx1:#fbfbfb;--tx2:#CBCCCD;--tx3:#6c6e70;--hl1:rgba(40,119,236,0.35);--sp1:#fff}.theme-dark.minimal-things-dark.minimal-dark-black{--base-d:5%;--bg3:#24262a;--divider-color:#24262a;--tab-outline-color:#24262a} -/* Plugin compatibility */ - -/* @plugins -core: -- backlink -- command-palette -- daily-notes -- file-explorer -- file-recovery -- global-search -- graph -- outgoing-link -- outline -- page-preview -- publish -- random-note -- starred -- switcher -- sync -- tag-pane -- word-count -community: -- buttons -- dataview -- calendar -- obsidian-charts -- obsidian-checklist-plugin -- obsidian-codemirror-options -- obsidian-dictionary-plugin -- obsidian-embedded-note-titles -- obsidian-excalidraw-plugin -- obsidian-git -- obsidian-hider -- obsidian-hover-editor -- obsidian-kanban -- obsidian-metatable -- obsidian-minimal-settings -- obsidian-outliner -- obsidian-system-dark-mode -- obsidian-style-settings -- quickadd -- sliding-panes-obsidian -- todoist-sync-plugin -*/ -/* @settings - -name: Minimal -id: minimal-style -settings: - - - id: instructions - title: Documentation - type: heading - level: 2 - collapsed: true - description: Use the Minimal Theme Settings plugin to set hotkeys, adjust features, select fonts, and choose from preset color schemes. Use the settings below for more granular customization. Go to https://minimal.guide for documentation. - - - id: interface - title: Interface colors - type: heading - level: 2 - collapsed: true - - - id: base - title: Base color - description: Defines all background and border colors unless overridden in more granular settings - type: variable-themed-color - format: hsl-split - default-light: '#' - default-dark: '#' - - - id: bg1 - title: Primary background - description: Background color for the main window - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: bg2 - title: Secondary background - description: Background color for left sidebar and menus - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: bg3 - title: Active background - description: Background color for hovered buttons and currently selected file - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: ui1 - title: Border color - type: variable-themed-color - description: For buttons, divider lines, and outlined elements - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: ui2 - title: Highlighted border color - description: Used when hovering over buttons, dividers, and outlined elements - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: ui3 - title: Active border color - description: Used when clicking buttons and outlined elements - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: accent-color - title: Accent color - type: heading - level: 2 - collapsed: true - - - id: ax1 - title: Accent color - type: variable-themed-color - description: Used primarily for links - format: hex - default-light: '#' - default-dark: '#' - - - id: ax2 - title: Accent color (hover) - type: variable-themed-color - description: Used primarily for hovered links - format: hex - default-light: '#' - default-dark: '#' - - - id: ax3 - title: Accent color interactive - type: variable-themed-color - description: Used for buttons, checklists, toggles - format: hex - default-light: '#' - default-dark: '#' - - - id: sp1 - title: Text on accent - type: variable-themed-color - description: Used primarily for text on accented buttons - format: hex - default-light: '#' - default-dark: '#' - - - id: extended-palette - title: Extended colors - type: heading - level: 2 - collapsed: true - - - id: color-red - title: Red - description: Extended palette colors are defaults used for progress bar status, syntax highlighting, colorful headings, and graph nodes - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-orange - title: Orange - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-yellow - title: Yellow - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-green - title: Green - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-cyan - title: Cyan - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-blue - title: Blue - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-purple - title: Purple - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: color-pink - title: Pink - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: bases - title: Bases - type: heading - level: 2 - collapsed: true - - - id: bases-toolbar-opacity - title: Toolbar opacity - type: variable-number-slider - default: 1 - min: 0 - max: 1 - step: 0.05 - - - id: bases-table-header-icon-display - title: Table header icons - type: variable-select - allowEmpty: false - default: flex - options: - - - label: Visible - value: flex - - - label: Hidden - value: none - - - id: bases-table-row-height - title: Table row height - type: variable-number - default: 30 - format: px - - - id: blockquotes - title: Blockquotes - type: heading - level: 2 - collapsed: true - - - id: blockquote-color - title: Blockquote text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: blockquote-background-color - title: Blockquote background color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: blockquote-border-color - title: Blockquote border color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: blockquote-border-thickness - title: Blockquote border thickness - type: variable-number-slider - format: px - default: 1 - min: 0 - max: 5 - step: 1 - - - id: blockquote-size - title: Blockquote font size - description: Accepts any CSS font-size value - type: variable-text - default: '' - - - id: blockquote-font-style - title: Blockquote font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: callouts - title: Callouts - type: heading - level: 2 - collapsed: true - - - id: callouts-style - title: Callout style - type: class-select - allowEmpty: false - default: callouts-default - options: - - - label: Filled - value: callouts-default - - - label: Outlined - value: callouts-outlined - - - id: callout-blend-mode - title: Color blending - description: Blend the color of nested callouts - type: variable-select - allowEmpty: false - default: var(--highlight-mix-blend-mode) - options: - - - label: On - value: var(--highlight-mix-blend-mode) - - - label: Off - value: normal - - - id: canvas - title: Canvas - type: heading - level: 2 - collapsed: true - - - id: canvas-dot-pattern - title: Canvas dot pattern - description: Color for background dot pattern - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-blocks - title: Code blocks - type: heading - level: 2 - collapsed: true - - - id: code-size - title: Code font size - description: Accepts any CSS font-size value - type: variable-text - default: 0.8em - - - id: minimal-code-scroll - title: Scroll long lines - description: Turns off line wrap for code - type: class-toggle - default: false - - - id: code-background - title: Code background color - description: Background for code blocks - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-normal - title: Code text color - description: Color of code when syntax highlighting is not present - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: syntax-highlighting - title: Syntax highlighting - type: heading - level: 3 - collapsed: false - - - id: code-comment - title: "Syntax: comments" - description: Syntax highlighting for comments - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-function - title: "Syntax: functions" - description: Syntax highlighting for functions - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-keyword - title: "Syntax: keywords" - description: Syntax highlighting for keywords - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-important - title: "Syntax: important" - description: Syntax highlighting for important text - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-operator - title: "Syntax: operators" - description: Syntax highlighting for operators - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-property - title: "Syntax: properties" - description: Syntax highlighting for properties - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-punctuation - title: "Syntax: punctuation" - description: Syntax highlighting for punctuation - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-string - title: "Syntax: strings" - description: Syntax highlighting for strings - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-tag - title: "Syntax: tags" - description: Syntax highlighting for tags - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: code-value - title: "Syntax: values" - description: Syntax highlighting for values - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: dataview - title: Dataview - type: heading - level: 2 - collapsed: true - - - id: trim-cols - title: Trim Dataview columns - description: Disables word wrapping in table cells, and trims long text - type: class-toggle - default: true - - - id: dataview-inline-lists - title: Force tables lists inline - description: Makes lists inside of table cells inline and comma separated - type: class-toggle - default: false - - - id: max-col-width - title: Dataview maximum column width - description: Maximum width for Dataview columns, accepts any CSS width value - type: variable-text - default: 18em - - - id: embed-blocks - title: Embeds and transclusions - type: heading - level: 2 - collapsed: true - - - id: embed-strict - title: Use strict embed style globally - description: Transclusions appear seamlessly in the flow of text. Can be enabled per file using the embed-strict helper class - type: class-toggle - default: false - - - id: embed-hide-title - title: Hide embed titles - description: Hide title of the transcluded file (if strict embed is off) - type: class-toggle - default: false - - - id: embed-underline - title: Underline embedded text - description: Transcluded text is underlined. Can be enabled per file using the embed-underline helper class - type: class-toggle - default: false - - - id: embed-max-height - title: Maximum height of embeds - type: variable-text - description: For transcluded text, accepts valid CSS units - default: '' - - - id: embed-decoration-style - title: Embedded text underline style - type: variable-select - description: Requires underlines to be enabled - allowEmpty: true - default: solid - options: - - - label: Solid - value: solid - - - label: Dashed - value: dashed - - - label: Dotted - value: dotted - - - label: Double - value: double - - - label: Wavy - value: wavy - - - id: embed-decoration-color - title: Embedded text underline color - type: variable-themed-color - description: Requires underlines to be enabled - format: hex - default-light: '#' - default-dark: '#' - - - id: embed-background - title: Embed background - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: graphs - title: Graphs - type: heading - level: 2 - collapsed: true - - - id: graph-line - title: Line color - description: Changing graph colors requires closing and reopening graph panes or restarting Obsidian - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: graph-node - title: Node color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: graph-node-focused - title: Active node color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: graph-node-tag - title: Tag node color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: graph-node-attachment - title: Attachment node color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: graph-node-unresolved - title: Unresolved node color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: headings - title: Headings - type: heading - level: 2 - collapsed: true - - - id: level-1-headings - title: Level 1 Headings - type: heading - level: 3 - collapsed: true - - - id: h1-font - title: H1 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h1-size - title: H1 font size - description: Accepts any CSS font-size value - type: variable-text - default: 1.125em - - - id: h1-weight - title: H1 font weight - type: variable-number-slider - default: 600 - min: 100 - max: 900 - step: 100 - - - id: h1-color - title: H1 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h1-variant - title: H1 font variant - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h1-style - title: H1 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h1-l - title: H1 divider line - description: Adds a border below the heading - type: class-toggle - default: false - - - id: level-2-headings - title: Level 2 Headings - type: heading - level: 3 - collapsed: true - - - id: h2-font - title: H2 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h2-size - title: H2 font size - description: Accepts any CSS font-size value - type: variable-text - default: 1em - - - id: h2-weight - title: H2 font weight - type: variable-number-slider - default: 600 - min: 100 - max: 900 - step: 100 - - - id: h2-color - title: H2 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h2-variant - title: H2 font variant - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h2-style - title: H2 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h2-l - title: H2 divider line - description: Adds a border below the heading - type: class-toggle - default: false - - - id: level-3-headings - title: Level 3 Headings - type: heading - level: 3 - collapsed: true - - - id: h3-font - title: H3 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h3-size - title: H3 font size - description: Accepts any CSS font-size value - type: variable-text - default: 1em - - - id: h3-weight - title: H3 font weight - type: variable-number-slider - default: 600 - min: 100 - max: 900 - step: 100 - - - id: h3-color - title: H3 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h3-variant - title: H3 font variant - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h3-style - title: H3 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h3-l - title: H3 divider line - description: Adds a border below the heading - type: class-toggle - default: false - - - id: level-4-headings - title: Level 4 Headings - type: heading - level: 3 - collapsed: true - - - id: h4-font - title: H4 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h4-size - title: H4 font size - description: Accepts any CSS font-size value - type: variable-text - default: 0.9em - - - id: h4-weight - title: H4 font weight - type: variable-number-slider - default: 500 - min: 100 - max: 900 - step: 100 - - - id: h4-color - title: H4 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h4-variant - title: H4 font variant - type: variable-select - allowEmpty: false - default: small-caps - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h4-style - title: H4 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h4-l - title: H4 divider line - description: Adds a border below the heading - type: class-toggle - default: false - - - id: level-5-headings - title: Level 5 Headings - type: heading - level: 3 - collapsed: true - - - id: h5-font - title: H5 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h5-size - title: H5 font size - description: Accepts any CSS font-size value - type: variable-text - default: 0.85em - - - id: h5-weight - title: H5 font weight - type: variable-number-slider - default: 500 - min: 100 - max: 900 - step: 100 - - - id: h5-color - title: H5 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h5-variant - title: H5 font variant - type: variable-select - allowEmpty: false - default: small-caps - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h5-style - title: H5 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h5-l - title: H5 divider line - description: Adds a border below the heading - type: class-toggle - default: false - - - id: level-6-headings - title: Level 6 Headings - type: heading - level: 3 - collapsed: true - - - id: h6-font - title: H6 font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: h6-size - title: H6 font size - description: Accepts any CSS font-size value - type: variable-text - default: 0.85em - - - id: h6-weight - title: H6 font weight - type: variable-number-slider - default: 400 - min: 100 - max: 900 - step: 100 - - - id: h6-color - title: H6 text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: h6-variant - title: H6 font variant - type: variable-select - allowEmpty: false - default: small-caps - options: - - - label: Normal - value: normal - - - label: Small caps - value: small-caps - - - label: All small caps - value: all-small-caps - - - id: h6-style - title: H6 font style - type: variable-select - allowEmpty: false - default: normal - options: - - - label: Normal - value: normal - - - label: Italic - value: italic - - - id: h6-l - title: H6 divider line - type: class-toggle - description: Adds a border below the heading - default: false - - - id: icons - title: Icons - type: heading - level: 2 - collapsed: true - - - id: icon-muted - title: Icon opacity (inactive) - type: variable-number-slider - default: 0.5 - min: 0.25 - max: 1 - step: 0.05 - - - id: icon-color - title: Icon color - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: icon-color-hover - title: Icon color (hover) - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: icon-color-active - title: Icon color (active) - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: icon-color-focused - title: Icon color (focused) - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: images - title: Images - type: heading - level: 2 - collapsed: true - - - id: image-muted - title: Image opacity in dark mode - description: Level of fading for images in dark mode. Hover over images to display at full brightness. - type: variable-number-slider - default: 0.7 - min: 0.25 - max: 1 - step: 0.05 - - - id: image-radius - title: Image radius - description: Rounded corners for images - type: variable-number-slider - default: 4 - min: 0 - max: 16 - step: 1 - format: px - - - id: image-blend-light - title: Blend images in light mode - description: Allow images to blend into the color scheme background color - type: class-toggle - default: false - - - id: zoom-off - title: Disable image zoom - description: Turns off click + hold to zoom images - type: class-toggle - - - id: image-grid-fit - title: Image grid crop - description: Sets how images get cropped in a grid - type: variable-select - default: cover - options: - - - label: Crop to fit - value: cover - - - label: Show full image - value: contain - - - id: image-grid-background - title: Image grid background - description: Background of images in cells, useful when images are not cropped to fit - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: indentation-guides - title: Indentation guides - type: heading - level: 2 - collapsed: true - - - id: indentation-guide-color - title: Indentation guide color - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: indentation-guide-color-active - title: Indentation guide color (active) - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: links - title: Links - type: heading - level: 2 - collapsed: true - - - id: links-internal - title: Internal links - type: heading - level: 3 - collapsed: true - - - id: link-color - title: Internal link color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: link-color-hover - title: Internal link color (hover) - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: link-unresolved-opacity - title: Unresolved link opacity - type: variable-number-slider - default: 0.7 - min: 0.25 - max: 1 - step: 0.05 - - - id: link-unresolved-color - title: Unresolved link color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: link-unresolved-decoration-color - title: Unresolved link underline color - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: links-external - title: External links - type: heading - level: 3 - collapsed: true - - - id: link-external-color - title: External link color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: link-external-color-hover - title: External link color (hover) - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: active-line - title: Line numbers - type: heading - level: 2 - collapsed: true - - - id: active-line-on - title: Highlight active line - description: Adds a background to current line in editor - type: class-toggle - default: false - - - id: folding-offset - title: Gutter offset - description: Width of the file margin used for gutter - type: variable-number-slider - default: 32 - min: 0 - max: 60 - step: 1 - format: px - - - id: gutter-background - title: Gutter background - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: line-number-color - title: Line number color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: line-number-color-active - title: Active line number color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: active-line-bg - title: Active line background - description: Using a low opacity color is recommended to avoid conflicting with highlights - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: lists - title: Lists and tasks - type: heading - level: 2 - collapsed: true - - - id: checkbox-color - title: Checkbox color - description: Background color for completed tasks - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: checkbox-shape - title: Checkbox shape - type: class-select - allowEmpty: false - default: checkbox-circle - options: - - - label: Circle - value: checkbox-circle - - - label: Square - value: checkbox-square - - - id: minimal-strike-lists - title: Strike completed tasks - description: Adds strikethrough line and greyed text for completed tasks - type: class-toggle - default: false - - - id: list-spacing - title: List item spacing - description: Vertical space between list items in em units - type: variable-number-slider - default: 0.075 - min: 0 - max: 0.3 - step: 0.005 - format: em - - - id: list-indent - title: Nested list indentation - description: Horizontal space from left in em units - type: variable-number-slider - default: 2 - min: 1 - max: 3.5 - step: 0.1 - format: em - - - id: pdf - title: PDFs - type: heading - level: 2 - collapsed: true - - - id: pdf-page-style - title: PDF page style - description: Borders and shadows around pages - type: class-select - allowEmpty: false - default: pdf-seamless-on - options: - - - label: Seamless - value: pdf-seamless-on - - - label: Shadows - value: pdf-shadows-on - - - id: pdf-invert-dark - title: Invert PDFs in dark mode - description: Best for working with black text on white pages - type: class-toggle - default: true - - - id: pdf-blend-light - title: Blend PDFs in light mode - description: Allow PDFs to blend into the color scheme background color - type: class-toggle - default: true - - - id: pdf-dark-opacity - title: PDF opacity in dark mode - description: Fade PDF pages in dark mode - type: variable-number-slider - default: 1 - min: 0.25 - max: 1 - step: 0.05 - - - id: progress - title: Progress bars - type: heading - level: 2 - collapsed: true - - - id: progress-complete - title: Completed progress bar color - description: Defaults to your accent color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: properties - title: Properties - type: heading - level: 2 - collapsed: true - - - id: metadata-heading-off - title: Hide properties heading - description: Hide "Properties" heading above properties - type: class-toggle - default: false - - - id: metadata-add-property-off - title: Hide "Add property" button - description: Hide "Add property" button below properties - type: class-toggle - default: false - - - id: metadata-icons-off - title: Hide property icons - description: Hide icons next to property names - type: class-toggle - default: false - - - id: metadata-dividers - title: Property row lines - description: Display borders between properties - type: class-toggle - default: false - - - id: metadata-label-width-multiplier - title: Property name width - description: Width for the name of the property - type: variable-number-slider - default: 9 - min: 4 - max: 12 - step: 0.25 - - - id: sidebars - title: Sidebars - type: heading - level: 2 - collapsed: true - - - id: sidebar-tabs-style - title: Sidebar tab style - type: class-select - allowEmpty: false - default: sidebar-tabs-default - options: - - - label: Index round - value: sidebar-tabs-index - - - label: Index square - value: sidebar-tabs-square - - - label: Modern compact - value: sidebar-tabs-default - - - label: Modern wide - value: sidebar-tabs-wide - - - label: Square - value: sidebar-tabs-plain-square - - - label: Underline - value: sidebar-tabs-underline - - - id: sidebar-tabs-names - title: Sidebar tab names - type: class-select - allowEmpty: false - default: tab-names-off - options: - - - label: Hidden - value: tab-names-off - - - label: Visible - value: tab-names-on - - - label: Single tab only - value: tab-names-single - - - id: vault-profile-display - title: Vault profile position - type: class-select - allowEmpty: false - default: vault-profile-default - options: - - - label: Bottom - value: vault-profile-default - - - label: Top - value: vault-profile-top - - - id: hide-help - title: Hide help button - description: - type: class-toggle - default: false - - - id: hide-settings - title: Hide settings button - description: - type: class-toggle - default: false - - - id: mobile-left-sidebar-width - title: Mobile left sidebar width - description: Maximum width for pinned left sidebar on mobile - type: variable-number - default: 280 - format: pt - - - id: mobile-right-sidebar-width - title: Mobile right sidebar width - description: Maximum width for pinned right sidebar on mobile - type: variable-number - default: 240 - format: pt - - - id: ribbon - title: Ribbon - type: heading - level: 2 - collapsed: true - - - id: ribbon-style - title: Ribbon style - description: Display options for ribbon menu. Ribbon must be turned on in Obsidian Appearance settings for these options to work. - type: class-select - allowEmpty: false - default: ribbon-hidden - options: - - - label: Default - value: ribbon-hidden - - - label: Expand (vertical) - value: ribbon-vertical-expand - - - label: Hover (vertical) - value: ribbon-bottom-left-hover-vertical - - - label: Hover (horizontal) - value: ribbon-bottom-left-hover - - - id: tables - title: Tables - type: heading - level: 2 - collapsed: true - - - id: table-text-size - title: Table font size - description: All of the following settings apply to all tables globally. To turn on these features on a per-note basis use helper classes. See documentation. - type: variable-text - default: 1em - - - id: table-column-min-width - title: Minimum column width - type: variable-text - default: 6ch - - - id: table-column-max-width - title: Maximum column width - type: variable-text - default: none - - - id: maximize-tables-off - title: Maximize table width - description: Determines how wide tables should behave when they become wider than the line width - type: class-select - allowEmpty: false - default: maximize-tables-off - options: - - - label: Fit to line width - value: maximize-tables-off - - - label: Overflow line width - value: maximize-tables-auto - - - label: Always fill - value: maximize-tables - - - id: row-lines - title: Row lines - description: Display borders between table rows globally - type: class-toggle - default: false - - - id: col-lines - title: Column lines - description: Display borders between table columns globally - type: class-toggle - default: false - - - id: table-lines - title: Cell lines - description: Display borders around all table cells globally - type: class-toggle - default: false - - - id: row-alt - title: Striped rows - description: Display striped background in alternating table rows globally - type: class-toggle - default: false - - - id: col-alt - title: Striped columns - description: Display striped background in alternating table columns globally - type: class-toggle - default: false - - - id: table-tabular - title: Tabular figures - description: Use fixed width numbers in tables globally - type: class-toggle - default: false - - - id: table-numbers - title: Row numbers - description: Display row numbers in tables globally - type: class-toggle - default: false - - - id: table-center - title: Center small tables - description: Make small tables centered - type: class-toggle - default: false - - - id: table-nowrap - title: Disable line wrap - description: Turn off line wrapping in table cells globally - type: class-toggle - default: false - - - id: row-hover - title: Highlight active row - description: Highlight rows on hover - type: class-toggle - default: false - - - id: table-row-background-hover - title: Active row background - description: Background color for hovered tables rows - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: tabs - title: Tabs - type: heading - level: 2 - collapsed: true - - - id: header-height - title: Tab bar height - type: variable-text - default: 40px - - - id: tabs-style - title: Tab style - type: class-select - allowEmpty: false - default: tabs-default - options: - - - label: Index round - value: tabs-default - - - label: Index square - value: tabs-square - - - label: Modern - value: tabs-modern - - - label: Square - value: tabs-plain-square - - - label: Underline - value: tabs-underline - - - id: minimal-tab-text-color - title: Tab text color - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: minimal-tab-text-color-active - title: Tab text color (active) - type: variable-themed-color - format: hex - opacity: true - default-light: '#' - default-dark: '#' - - - id: tab-stacks - title: Tab stacks - type: heading - level: 2 - collapsed: true - - - id: tab-stacked-pane-width - title: Stacked width - type: variable-number - description: Width of a stacked tab in pixels - default: 700 - format: px - - - id: tab-stacked-header-width - title: Spine width - type: variable-number - description: Width of the spine in pixels - default: 40 - format: px - - - id: tab-stacked-spine-orientation - title: Spine text orientation - type: class-select - default: tab-stack-top - options: - - - label: Top - value: tab-stack-top - - - label: Top flipped - value: tab-stack-top-flipped - - - label: Bottom - value: tab-stack-bottom - - - label: Bottom flipped - value: tab-stack-bottom-flipped - - - label: Center - value: tab-stack-center - - - label: Center flipped - value: tab-stack-center-flipped - - - id: tab-stacked-spine-order - title: Spine element order - type: variable-select - default: row - options: - - - label: Default - value: row - - - label: Reversed - value: row-reverse - - - id: tags - title: Tags - type: heading - level: 2 - collapsed: true - - - id: minimal-unstyled-tags - title: Plain tags - description: Tags will render as normal text, overrides settings below - type: class-toggle - default: false - - - id: tag-radius - title: Tag shape - type: variable-select - default: 14px - options: - - - label: Pill - value: 14px - - - label: Rounded - value: 4px - - - label: Square - value: 0px - - - id: tag-border-width - title: Tag border width - type: variable-select - default: 1px - options: - - - label: None - value: 0 - - - label: Thin - value: 1px - - - label: Thick - value: 2px - - - id: tag-color - title: Tag text color - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: tag-background - title: Tag background color - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: tag-background-hover - title: Tag background color (hover) - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: text - title: Text - type: heading - level: 2 - collapsed: true - - - id: tx1 - title: Normal text color - type: variable-themed-color - description: Primary text color used by default across all elements - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: hl1 - title: Selected text background - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: hl2 - title: Highlighted text background - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: tx2 - title: Muted text color - description: Secondary text such as sidebar note titles and table headings - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: tx3 - title: Faint text color - description: tertiary text such as input placeholders, empty checkboxes, and disabled statuses - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: text-formatting - title: Markdown syntax color - description: Markdown formatting syntax text color - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: italic-color - title: Italic text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: bold-color - title: Bold text color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: bold-modifier - title: Bold text weight - type: variable-number-slider - default: 200 - min: 100 - max: 500 - step: 100 - - - id: p-spacing - title: Paragraph spacing - description: Space between paragraphs in reading mode (Obsidian 1.3.7+) - type: variable-text - default: 1.75rem - - - id: heading-spacing - title: Heading spacing - description: Space between paragraphs and headings in reading mode (Obsidian 1.3.7+) - type: variable-text - default: 2em - - - id: titles - title: Titles - type: heading - level: 2 - collapsed: true - - - id: tab-title-bar - title: Tab title bar - description: Tab title bar must be turned on in Appearance settings - type: heading - level: 3 - collapsed: true - - - id: file-header-visibility - title: Tab title visibility - description: Visibility of the tab title text - type: class-select - default: minimal-tab-title-hover - options: - - - label: Hover only - value: minimal-tab-title-hover - - - label: Hidden - value: minimal-tab-title-hidden - - - label: Visible - value: minimal-tab-title-visible - - - id: file-header-font-size - title: Tab title font size - description: Accepts any CSS font-size value - type: variable-text - default: 0.9em - - - id: file-header-font-weight - title: Tab title font weight - type: variable-number-slider - default: 400 - min: 100 - max: 900 - step: 100 - - - id: file-header-justify - title: Tab title alignment - type: variable-select - default: center - options: - - - label: Center - value: center - - - label: Left - value: left - - - id: title-color - title: Tab title text color (active) - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: title-color-inactive - title: Tab title text color (inactive) - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: inline-title - title: Inline title - description: Inline titles must be turned on in Appearance settings - type: heading - level: 3 - collapsed: true - - - id: inline-title-font - title: Inline title font - description: Name of the font as it appears on your system - type: variable-text - default: '' - - - id: inline-title-size - title: Inline title font size - description: Accepts any CSS font-size value - type: variable-text - default: 1.125em - - - id: inline-title-weight - title: Inline title font weight - type: variable-number-slider - default: 600 - min: 100 - max: 900 - step: 100 - - - id: inline-title-color - title: Inline title text color (active) - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: translucency - title: Translucency - type: heading - level: 2 - collapsed: true - - - id: workspace-background-translucent - title: Translucent background color - type: variable-themed-color - opacity: true - format: hex - default-light: '#' - default-dark: '#' - - - id: window-frame - title: Window frame - type: heading - level: 2 - collapsed: true - - - id: window-title-off - title: Hide window frame title - description: Hide title in the custom title bar - type: class-toggle - - - id: frame-background - title: Frame background - description: Requires colorful window frame - type: variable-themed-color - opacity: true - format: hsl-split - default-light: '#' - default-dark: '#' - - - id: frame-icon-color - title: Frame icon color - description: Requires colorful frame - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: titlebar-text-color-focused - title: Frame title color (focused) - description: Requires custom title bar - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: titlebar-text-color - title: Frame title color (inactive) - description: Requires custom title bar - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: titlebar-text-weight - title: Frame title font weight - description: Requires custom title bar - type: variable-number-slider - default: 600 - min: 100 - max: 900 - step: 100 -*/ - -/* @settings -name: Minimal Cards -id: minimal-cards-style -settings: - - - id: cards-min-width - title: Card minimum width - type: variable-text - default: 180px - - - id: cards-max-width - title: Card maximum width - description: Default fills the available width, accepts valid CSS units - type: variable-text - default: 1fr - - - id: cards-mobile-width - title: Card minimum width on mobile - type: variable-text - default: 120px - - - id: cards-padding - title: Card padding - type: variable-text - default: 1.2em - - - id: cards-image-height - title: Card maximum image height - type: variable-text - default: 400px - - - id: cards-border-width - title: Card border width - type: variable-text - default: 1px - - - id: cards-background - title: Card background color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - - - id: cards-background-hover (hover) - title: Card background color - type: variable-themed-color - format: hex - default-light: '#' - default-dark: '#' - -*/ - -/* @settings -name: Minimal Advanced Settings -id: minimal-advanced -settings: - - - id: hide-markdown - title: Hide Markdown syntax - description: WARNING — This may be confusing because the characters still exist they are just hidden. - type: class-toggle - - - id: hide-settings-desc - title: Hide setting descriptions - description: Press and hold setting names to see their description. - type: class-toggle - - - id: animations - title: Animation speed - type: class-select - default: default - options: - - - label: Normal - value: default - - - label: Disabled - value: disable-animations - - - label: Fast - value: fast-animations - - - id: cursor - title: Cursor style - description: The cursor style for UI elements - type: variable-select - default: default - options: - - - label: Default - value: default - - - label: Pointer - value: pointer - - - label: Crosshair - value: crosshair - - - id: font-ui-small - title: Small font size - description: Font size in px of smaller text - type: variable-number - default: 13 - format: px - - - id: font-ui-smaller - title: Smaller font size - description: Font size in px of smallest text - type: variable-number - default: 11 - format: px - - - id: mobile-toolbar-off - title: Disable mobile toolbar - description: Turns off toolbar in editor on mobile - type: class-toggle - -*/ diff --git a/astro-site/.obsidian/workspace.json b/astro-site/.obsidian/workspace.json deleted file mode 100644 index 40d79cdf..00000000 --- a/astro-site/.obsidian/workspace.json +++ /dev/null @@ -1,278 +0,0 @@ -{ - "main": { - "id": "7d8d60d7d8872abb", - "type": "split", - "children": [ - { - "id": "c3d52329092e69c6", - "type": "tabs", - "children": [ - { - "id": "a69ee6a789446d23", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "src/content/work/sahabat-jiva-redesign/index.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "index" - } - }, - { - "id": "fa64cf4b0f3b9451", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "src/content/writing/vibe-coding/index.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "index" - } - }, - { - "id": "3bd3bf7ae225732c", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "src/content/work/gobiz-inbox/index.md", - "mode": "source", - "source": true - }, - "icon": "lucide-file", - "title": "index" - } - }, - { - "id": "d811aba10c4e31a3", - "type": "leaf", - "state": { - "type": "release-notes", - "state": { - "currentVersion": "1.11.5" - }, - "icon": "lucide-book-up", - "title": "Release Notes 1.11.5" - } - } - ], - "currentTab": 2 - } - ], - "direction": "vertical" - }, - "left": { - "id": "4befb94f5d67d465", - "type": "split", - "children": [ - { - "id": "2a30cd6bce2e284f", - "type": "tabs", - "children": [ - { - "id": "9be13d8b3a9ff2b0", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": { - "sortOrder": "alphabetical", - "autoReveal": false - }, - "icon": "lucide-folder-closed", - "title": "Files" - } - }, - { - "id": "328d336c6fb2bb0a", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - }, - "icon": "lucide-search", - "title": "Search" - } - }, - { - "id": "cd3acad12b379d92", - "type": "leaf", - "state": { - "type": "bookmarks", - "state": {}, - "icon": "lucide-bookmark", - "title": "Bookmarks" - } - } - ] - } - ], - "direction": "horizontal", - "width": 300 - }, - "right": { - "id": "14620212e994941e", - "type": "split", - "children": [ - { - "id": "a78547f38e4f8759", - "type": "tabs", - "children": [ - { - "id": "af7092be2bef668f", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "Untitled.canvas", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-coming-in", - "title": "Backlinks for Untitled" - } - }, - { - "id": "2eeddfbffecdc861", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "file": "Untitled.canvas", - "linksCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-going-out", - "title": "Outgoing links from Untitled" - } - }, - { - "id": "b3f571beea952805", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-tags", - "title": "Tags" - } - }, - { - "id": "287628c548ea53f6", - "type": "leaf", - "state": { - "type": "all-properties", - "state": { - "sortOrder": "frequency", - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-archive", - "title": "All properties" - } - }, - { - "id": "290610341bb0b188", - "type": "leaf", - "state": { - "type": "outline", - "state": { - "file": "Untitled.canvas", - "followCursor": false, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-list", - "title": "Outline of Untitled" - } - } - ] - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "left-ribbon": { - "hiddenItems": { - "switcher:Open quick switcher": false, - "graph:Open graph view": false, - "canvas:Create new canvas": false, - "daily-notes:Open today's daily note": false, - "templates:Insert template": false, - "command-palette:Open command palette": false, - "bases:Create new base": false, - "templater-obsidian:Templater": false - } - }, - "active": "3bd3bf7ae225732c", - "lastOpenFiles": [ - "src/content/work/international/launch-thai.png", - "src/content/work/international/image (17).png", - "src/content/work/sahabat-jiva-redesign/index.md", - "src/content/writing/data-vizard/index.md", - "src/content/writing/data-vizard/plugin-workflow.jpg", - "src/content/writing/data-vizard/plugin.jpg", - "src/content/writing/how-i-build-with-ai/index.md", - "src/content/writing/data-vizard/plugin-workflow.png.sb-99176dc3-I4Xvvn", - "src/content/writing/data-vizard/plugin-workflow.png", - "src/content/writing/data-vizard/Screenshot 2026-07-14 at 5.12.58 PM.png", - "src/content/writing/data-vizard/plugin.png.sb-99176dc3-tvc4k3", - "src/content/writing/data-vizard/plugin.png", - "src/content/writing/data-vizard/Screenshot 2026-07-02 at 7.46.59 PM.png", - "node_modules/url-extras/index.d.ts", - "node_modules/url-extras/readme.md", - "node_modules/url-extras/package.json", - "node_modules/url-extras/index.js", - "node_modules/url-extras/license", - "node_modules/expressive-code/LICENSE", - "node_modules/expressive-code/README.md", - "node_modules/expressive-code/package.json", - "node_modules/expressive-code/dist/index.js.map", - "node_modules/expressive-code/dist/index.js", - "node_modules/rehype-expressive-code/README.md", - "node_modules/@ctrl/tinycolor/README.md", - "node_modules/@expressive-code/plugin-text-markers/README.md", - "node_modules/@expressive-code/plugin-shiki/README.md", - "node_modules/@expressive-code/plugin-frames/README.md", - "node_modules/@expressive-code/core/README.md", - "node_modules/astro-expressive-code/README.md", - "node_modules/util-deprecate/History.md", - "node_modules/util-deprecate/README.md", - "node_modules/postcss-selector-parser/README.md", - "node_modules/postcss-selector-parser/CHANGELOG.md", - "node_modules/postcss-selector-parser/API.md", - "node_modules/hast-util-to-string/readme.md", - "node_modules/cssesc/README.md", - "node_modules/bcp-47-match/readme.md", - "node_modules/hast-util-has-property/readme.md", - "node_modules/direction/readme.md", - "node_modules/postcss-nested/README.md", - "node_modules/hast-util-select/readme.md", - "src/content/writing/data-vizard/vizc-4.jpeg", - "src/content/writing/data-vizard/DSC05438.jpeg", - "src/content/work/gobiz-inbox/index.md", - "src/content/writing/data-vizard/sonnet46.png", - "Untitled.canvas" - ] -} \ No newline at end of file diff --git a/astro-site/public/images/gobiz-prototype-1.webp b/astro-site/public/images/gobiz-prototype-1.webp new file mode 100644 index 00000000..e9b49e3b Binary files /dev/null and b/astro-site/public/images/gobiz-prototype-1.webp differ diff --git a/astro-site/public/images/gobiz-prototype-2.webp b/astro-site/public/images/gobiz-prototype-2.webp new file mode 100644 index 00000000..659743ba Binary files /dev/null and b/astro-site/public/images/gobiz-prototype-2.webp differ diff --git a/astro-site/public/images/gojek-workshop-1.webp b/astro-site/public/images/gojek-workshop-1.webp new file mode 100644 index 00000000..a9ef1656 Binary files /dev/null and b/astro-site/public/images/gojek-workshop-1.webp differ diff --git a/astro-site/public/images/gojek-workshop-2.webp b/astro-site/public/images/gojek-workshop-2.webp new file mode 100644 index 00000000..f70950e5 Binary files /dev/null and b/astro-site/public/images/gojek-workshop-2.webp differ diff --git a/astro-site/public/images/jiva-workshop-1.webp b/astro-site/public/images/jiva-workshop-1.webp new file mode 100644 index 00000000..b438ef8d Binary files /dev/null and b/astro-site/public/images/jiva-workshop-1.webp differ diff --git a/astro-site/public/images/jiva-workshop-2.webp b/astro-site/public/images/jiva-workshop-2.webp new file mode 100644 index 00000000..46d71cc2 Binary files /dev/null and b/astro-site/public/images/jiva-workshop-2.webp differ diff --git a/astro-site/public/images/practo-workshop-1.webp b/astro-site/public/images/practo-workshop-1.webp new file mode 100644 index 00000000..be007e1b Binary files /dev/null and b/astro-site/public/images/practo-workshop-1.webp differ diff --git a/astro-site/public/images/practo-workshop-2.webp b/astro-site/public/images/practo-workshop-2.webp new file mode 100644 index 00000000..26ed178e Binary files /dev/null and b/astro-site/public/images/practo-workshop-2.webp differ diff --git a/astro-site/public/images/vizchitra-workshop-1.webp b/astro-site/public/images/vizchitra-workshop-1.webp new file mode 100644 index 00000000..bd55a2bd Binary files /dev/null and b/astro-site/public/images/vizchitra-workshop-1.webp differ diff --git a/astro-site/public/images/vizchitra-workshop-2.webp b/astro-site/public/images/vizchitra-workshop-2.webp new file mode 100644 index 00000000..72e56b6f Binary files /dev/null and b/astro-site/public/images/vizchitra-workshop-2.webp differ diff --git a/astro-site/src/content/work/akar-design-system/index.md b/astro-site/src/content/work/akar-design-system/index.md index 068039c0..0c25aa8e 100644 --- a/astro-site/src/content/work/akar-design-system/index.md +++ b/astro-site/src/content/work/akar-design-system/index.md @@ -1,5 +1,5 @@ --- -title: "Building the Akar Design System" +title: "Jiva's Akar Design System" description: "The philosophy and design principles behind Jiva’s scalable design system" year: "2023-2024" company: "Jiva" diff --git a/astro-site/src/content/work/claim-profile/index.md b/astro-site/src/content/work/claim-profile/index.md index aea16334..0c10ea24 100644 --- a/astro-site/src/content/work/claim-profile/index.md +++ b/astro-site/src/content/work/claim-profile/index.md @@ -11,68 +11,48 @@ status: 'draft' ## Overview -Practo has around 100k doctor profiles and another 70k clinic profiles currently live on its marketplace. -This accounts for barely 50% of coverage in our T6 cities. So during the Q3-Q4 of 2016-17, the primary -objective of the unified app; Practo Partner, was to get more profiles published and live. - -Around November 2016, to get a profile live on Practo.com, a doctor needed to fill in 20 fields which -were separated into 2 forms. We had taken the approach as an informational option but realized that -lot of profiles were not being completed and we did not communicate what was necessary to go live to -a doctor within the app. +Practo is an Indian healthcare startup that helps patients find doctors, and helps clinics and hospitals manage their patients and health records securely. In 2016-17 when I was working at Practo, they had around 100k doctor profiles and another 70k clinic profiles live on their marketplace. This accounted for barely 50% of coverage in our top T6 cities. So during the Q3-Q4 of 2016-17, the primary objective of the unified app; Practo Partner (Practo Pro), was to get more profiles published and live. +Around November 2016, to get a profile live on Practo.com, a doctor needed to fill in 20 fields which were separated into 2 forms. We had taken the approach as an informational option but realized that lot of profiles were not being completed and we did not communicate what was necessary to go live to a doctor within the app. [before we began] +## Role + +As lead designer for the Practo Pro app, I lead the design for this project. Normally this would have been picked up by the Practo Profile team but they were busy with designing this for the web so our team picked this up as it was an important company objective for the quarter. We worked closely with the profiles product team whenever we had to make a decision, since they knew best about the way profile claim worked. + ## Understanding the problem -As seen above, we did communicate that a profile was incomplete but the interface didn't -communicate what was necessary for a doctor to go live. Our completion data showed us that major -dropoffs occurred during profile completion, proof upload and clinic profile addition. +As seen above, we did inform the user that a profile was incomplete but the interface didn't communicate what was necessary for a doctor to go live. Our completion data showed us that major dropoffs occurred during profile completion, proof upload and clinic profile addition. -We studied onboarding flows of other applications like Airbnb and Gyroscope which deal with filling lot -of mandatory data as well as Doximity which deals with the claiming of doctor profiles to get started. -Exploring a solution +We studied onboarding flows of other applications like Airbnb and Gyroscope which deal with filling lot of mandatory data as well as Doximity which deals with the claiming of doctor profiles to get started. -After some discussions with the stakeholders, we decided the best way to deliver impact was if we -break this project into phases. For the first phase, we designed and shipped out with an intent page -and a quick fix stitching the two forms together. At the same time, the app was going through the new -brand implementation which explains the choice of color palette and the change in typography. +## Exploring a solution + +After some discussions with the stakeholders, we decided the best way to deliver impact was if we break this project into phases. For the first phase, we designed and shipped out with an intent page and a quick fix stitching the two forms together. At the same time, the app was going through the new brand implementation which explains the choice of color palette and the change in typography. [designs from phase 1] -Post this change, we saw an increase(approx 34%) in the profiles going towards completion in the -month of March vs February and January numbers. This validated the brief and the direction that we -were going towards. +Post this change, we saw an increase (approx 34%) in the profiles going towards completion in the month of March vs February and January numbers. This validated the brief and the direction that we were going towards. -As part of the feet-on-street model adopted by Practo, we had several profiles that had been created -by the salesguy, however those profiles were not being used by the doctor and instead the doctor -would create a new profile when they logged in leading to duplicates which would be an overhead for -operations and decreased efficiency. We also needed doctors to keep their profile data fresh. So with -this in mind, Claim profile became a company objective so the next phase was integrating this into the -onboarding +## Phase two -The various usecases and catering to both new and existing users kept us busy for almost a month -where we iterated on various designs before narrowing down on one. We worked closely with the -profiles product team whenever we had to make a decision, since they knew best about the way profile -claim worked. +As part of the feet-on-street model adopted by Practo, we had several profiles that had been created by the salesguy, however those profiles were not being used by the doctor and instead the doctor would create a new profile when they logged in leading to duplicates which would be an overhead for operations and decreased efficiency. We also needed doctors to keep their profile data fresh. So with this in mind, 'Claim profile' feature became a company objective so the next phase was integrating this into the onboarding for new doctors. +For almost a month, we tackled various use-cases that new and existing users would face. Iterating on various designs before narrowing down on one to the final design. [early explorations] -Based on all these inputs, we were able to narrow down on the direction that we wanted to take for the -project. +Based on all these inputs, we were able to narrow down on the direction that we wanted to take for the project. evolution of the ‘checkout’ screen - ### Things we are trying out with this -– The design accommodated for problems with the flow with keeping a way to access our hotline on all -the decision making pages. -– Users dropping off would be asked if they would want to be reminded to fill the form at a later time. -The form needs document proofs to be complete and these would not always be at hand. +- The design accommodated for problems with the flow with keeping a way to access our hotline on all the decision making pages. +- Users dropping off would be asked if they would want to be reminded to fill the form at a later time. +- The form needs document proofs to be complete and these would not always be at hand. ## Final screens -**Footnote:** -Thanks to Sonal, Suhas, Preet, Rafiq, Pramod, Rachit and the rest of the Practo Pro team for their -inputs and help in making this design come true \ No newline at end of file +#### Footnote: +Thanks to Sonal, Suhas, Preet, Rafiq, Pramod, Rachit and the rest of the Practo Pro team for their inputs and help in making this design come true \ No newline at end of file diff --git a/astro-site/src/content/work/gobiz-inbox/chat-doc.png b/astro-site/src/content/work/gobiz-inbox/chat-doc.png new file mode 100644 index 00000000..84c2c860 Binary files /dev/null and b/astro-site/src/content/work/gobiz-inbox/chat-doc.png differ diff --git a/astro-site/src/content/work/gobiz-inbox/chat-today-vs-future.webp b/astro-site/src/content/work/gobiz-inbox/chat-today-vs-future.webp new file mode 100644 index 00000000..5de1eb68 Binary files /dev/null and b/astro-site/src/content/work/gobiz-inbox/chat-today-vs-future.webp differ diff --git a/astro-site/src/content/work/gobiz-inbox/inbox-entry-points.webp b/astro-site/src/content/work/gobiz-inbox/inbox-entry-points.webp new file mode 100644 index 00000000..8d863706 Binary files /dev/null and b/astro-site/src/content/work/gobiz-inbox/inbox-entry-points.webp differ diff --git a/astro-site/src/content/work/gobiz-inbox/index.md b/astro-site/src/content/work/gobiz-inbox/index.md index 57171815..50cb57fd 100644 --- a/astro-site/src/content/work/gobiz-inbox/index.md +++ b/astro-site/src/content/work/gobiz-inbox/index.md @@ -2,63 +2,45 @@ title: Designing the Inbox experience for GoBiz description: How we designed the in-app comms channel year: "2021" -company: "Gojek" -status: 'draft' +company: Gojek +status: draft --- -The Gojek Chat SDK was built to support products wanting to integrate chat into their flows. However like many other platformized products, they end up being looked as solutions for use cases they were not designed for. The GoBiz inbox requirement wasn't my first experience with dog fooding, but it was one that I was able to influence positively for the benefit of the users. +GoBiz is the superapp for Gojek's merchant partners. Gojek's +1 million+ merchants used it daily to interact with their customers; food merchants accepted incoming orders, micro-merchants viewed their incoming payments, businesses setup their ads, managed their offline orders using the POS, etc. -We wanted to build an Inbox, an in-app channel for notifying our users. We just needed one-way communication. I do not understand the reason behind why product pushed to use the SDK, despite the arguments that the SDK wasn't able to support our web product and wasn't designed to communicate business updates. +### Building a communication layer -### Chat is chat, not inbox: +Our merchant marketing team historically relied on emails, and youtube to communicate to the customers. However most of our merchants weren't 'email' users and may not even have access to the emails they had used to signup anymore. Without a reliable communication channel, getting adoption to our newer features was difficult. So one of the important platform features we wanted to build to support this was a in-app notification centre. -I created a document to explain what that decision meant for the app. -If we use the chat sdk, then in the future as other teams build on the chat platform, we should plan to group all kinds of chat in a single space. This would align with the mental model of the user. This space would be the go-to place to follow up on your "conversations", whether its about onboarding a new outlet or following up about your GoFresh order. +The main Gojek app had adopted a Chat-like interface to be it's communication layer along with the Shuffle card framework. However like many other platformised products, the GoChat SDK ended up being promoted for integration across other Gojek apps. We wanted to build an Inbox, an in-app channel for notifying our users. We just needed one-way communication. The Chat SDK was built for two-way communication for the Gojek mobile app. It didn't have a web equivalent while GoBiz needed the Inbox to work on web as well due to our quest for platform parity. Our bigger customers and business owners tended to only use the web interface. We needed a solution that had a plan to scale beyond the mobile and we found that the current implementation of the GoChat SDK lacking. -_Decision:_ We decided that all chats will show up in Inbox but we will need to visually separate them from the business chats. This is something that the Chat team had not yet designed for. +### Why this project? -### Where should Inbox/chat go? +As a platform designer on the B2B side, this wasn't my first experience with dog-fooding, but it was one that I was able to influence positively for the benefit of the users. That's why I chose to include project in my portfolio so that I can illustrate my approach when I encounter such decisions. -Given that Inbox is something we are considering for communication, it should be easily accessible and indicate unread chats. Given the current structure of the GoBiz app, we could only think of 2 possible positions for the Inbox. +### Visualize your argument -However neither of these positions fulfill the conditions of +Decisions like this are often taken in isolation without understanding how they impact the product or its users. They are taken by leadership because of internal OKRs, a new business strategy or pivot in company positioning. I've seen rebrands being approved, new apps being created, internal tooling being exposed to customers, and so many more situations where the product vision takes a side-line. -1. Visibility of new messages: The red dot on Lainnya can't showcase a number since there are several other modules which have a no-number indication. +As a design owner for a product, I would want what is best for it and it's users. My strength lies in creating visual assets that can help communicate this. I make mockups and use them to create a document of possible directions and it's impact on the product in the future. -2. Accessible from various parts of our app: A gofood merchant would jump right to the Orders inbox when they open the app and has no need to aware of this "notification' +![First draft of the document I created for this project](chat-doc.png) -_Decision:_ However without the redesign being prioritized, we decided to keep the entry point on the top right of the 'Lainnya' page. +### Align stakeholders -### Shuffle vs Inbox: +Share the document with them and invite them for a meeting where you can discuss the PRD. The format of this meeting depends on the problem you have at hand. Raise concerns on the decision's impact, offer them alternatives from your document. If you can get buy-in from other product and engineering peers prior to the meeting, you will help. -1. Currently there can be overlaps. Overlaps may lead to reduction in importance of Inbox content. +![Today vs Future: as other teams adopt the Chat SDK, all conversation channels would eventually live together in a single Inbox](chat-today-vs-future.webp) -2. Can 'Promo' channel in Inbox be completely replaced by a shuffle card channel on lainnya? because promos need segmentation. Inbox may not work that way. +### Prototype and Test -_Decision:_ No decision yet +Even with this, you will need data for your argument which you won't have at hand. If you have a robust research set up, then the next step is to conduct user research. We created 2 prototypes to run the test with our merchants. -### Design iterations +
+ Prototype 1: a simple list of channels, where users need an additional click to see the full message + Prototype 2: a richer chat window that surfaces the latest message and CTAs upfront, without an extra click +
-The Inbox requirement wasn't a new one. 11 months ago, Saneef had worked on how we could introduce communication channels(banner and inbox) in our /existing/ app. [(Aside: His redesign had 'Inbox' as a tab on the bottom navigation)](https://share.goabstract.com/8af61eee-de93-4f63-b0f8-64922742a29e?mode=design&sha=875263ee629f633ddd9229602605e3870884c3da) +Our research showed us that the SDK implementation wouldn't meet our user's needs and was complex for them. The research supported moving to a simpler version and we were able to align the SDK team to provide a view that would let us create that experience for our users. -What was good about this iteration was that latest messages would be visible on the Lainnya page with a way for users to filter different kinds of messages. However this design wouldn't scale well if there were many channels. Think how filters work on Gojek Home's shuffles. Same problem. - -When we decided to adopt the Chat SDK, it came with a constraint that the view would be a chat window. - -So this constraint causes us to have limited explorations for the channel view. Based on this, here are two iterations that could be possible. - -#### Iteration 1: - -Iteration 1 is having a list of channels on the second page, but without the full message so users would need to make an additional click through to get the full message. - -#### Iteration 2: - -This exploration attempts to use a notifier informing user about a new message. It could include the text of the message or a generic '1 new message'. In the chat window, we can see the latest message of a channel up front without clicking again to see the message. Even CTAs could be visible here. - -So we went ahead with user-testing with both these iterations, and 'Iteration 2' came out successful. - -#### Key Learnings from the research - -1. People may ignore the position of the Inbox because of its proximity to the logout button - -2. The inbox icon was not understood, so we switched to the envelope icon and called it 'Kotak Pesan' diff --git a/astro-site/src/content/work/gojek/index.md b/astro-site/src/content/work/gojek/index.md index d074fd0d..7f40dadd 100644 --- a/astro-site/src/content/work/gojek/index.md +++ b/astro-site/src/content/work/gojek/index.md @@ -7,7 +7,7 @@ status: published image: QRIS-gobiz.webp --- -### Role +## Role From 2019-2022, I worked on the merchant side of Gojek. GoBiz, Gojek's merchant platform, catered to 1M+ merchants across Indonesia, Vietnam(closed down in Sep 2024) and Thailand (sold to AirAsia in July 2021). The GoBiz Platform served GoFood merchants, GoPay Micro-merchants, as well as Enterprise merchants. I started off as the designer tasked with redesigning the GoBiz Android app and eventually moved to lead the design on the GoBiz Platform contributing towards the design of the GoBiz app and website, the Spots app and the Midtrans website. Over this period of time, the design team at GoBiz grew to 12 designers with the mergers and acquisitions of Midtrans, Kartuku and Moka POS before eventually breaking up pre-IPO. @@ -89,13 +89,13 @@ The SPOTS app was a point of sales app on a Landi device. We were selling these The app they were using was a reskinned version of the default app provided by Landi(image on the left). -I was asked to help out with it and I worked on a refresh for the app on a short timeline(image on the right) +I was asked to help out with it and I worked on a refresh for the app on a short timeline(image on the right). The design is inspired from Square's POS app and styled by Gojek's Asphalt design system components. ![](QRIS-gobiz.webp) -We later integrated this into the POS application on the GoBiz app. + This design was the foundation on top of which our POS SDK was built. We sold this to our enterprise customers (you may still see it at a McD self-serve kiosk in Jakarta) and also integrated it into the GoBiz app for small businesses to use it. -# Midtrans +## Midtrans In 2020, the Midtrans merchant onboarding was prioritized due to an external collaboration with Whatsapp. ![](midtrans-old.png) @@ -111,7 +111,7 @@ So we shipped the new onboarding and saw lot of reduction in the drop offs. ![](midtrans-onboarding-impact.png) -### Outcome: +#### Outcome: This project exposed most of the team to the ‘merchant onboarding’ problem space and a surprising side-effect of this was that project handover of the ‘corporate onboarding’ project could be handled by Hendri when Riyadhi was affected by Covid-19. #### Miscellaneous: diff --git a/astro-site/src/content/work/international/index.md b/astro-site/src/content/work/international/index.md index c2f22046..e265ca45 100644 --- a/astro-site/src/content/work/international/index.md +++ b/astro-site/src/content/work/international/index.md @@ -12,14 +12,17 @@ By 2015, we began rolling out the Practo Ray app to Malaysia, Indonesia, the Phi Scaling the GoBiz app to Thailand, Vietnam, and Singapore was completely different. Just translating the interface was not an option. We did research to understand local restaurant workflows (e.g., Hawker Centres in Singapore), worked with the local team to understand local terminologies and cultural nuances, and studied how food ordering worked. -### Collaboration and Organization +## Role +As the design owner for the GoBiz Platform, I led the design, managed the project, took part in research and built re-usable checklists for all the three country launches for the GoBiz mobile app. + +## Collaboration and Organization But first, every project needs a start. GoBiz functioned as a platform with multiple teams contributing to it. So when we prepared for a new country launch, it became crucial to have a transparent and collaborative approach. That's where Asana came in. I created the 'GoBiz International Design' template and assigned tasks to the different designers. This functioned as our team's design tracker and was referenced during the weekly SOS meetings (Scrum of Scrums) run by the program managers. ![The GoBiz International Design template in Asana](./asana.png) For the design work itself, we set up a new Sketch file in Abstract for every country launch instead of adding changes to the existing files. This kept file sizes manageable and reduced merge conflicts in the Master branch. It also made it much easier for other teams to locate the relevant designs without needing to check with us. -### Typography +## Typography Designing for languages that use only Latin characters is fairly straightforward because most fonts support them. But when you need to support non-latin scripts like Thai, Vietnamese, and Simplified Chinese, things get a little complicated typographically. Our brand typeface, Maison Neue, did not support these scripts, so the app fell back to system fonts. In Thailand, this caused visible inconsistencies in size and styling. This led to many merchants using their device accessibility settings to increase their font size, which caused our layouts to break. @@ -43,7 +46,7 @@ We chose Noto Sans, which is free, widely supported, and covered all the scripts -### Managing Copy +## Managing Copy Managing design files is relatively easy compared to managing multi-country copy. When we started supporting multiple languages, tools like Lokalise did not exist in our workflow. We relied entirely on Google Docs and Google Sheets. ![How we managed copy in Google Docs](./copy-doc.png) @@ -59,13 +62,13 @@ Gojek eventually moved to using [Lokalise](https://lokalise.com) for its copy ma [^1]: You can read more about their International copy process on the blog by the Thai and Viet UX writer https://www.gojek.io/blog/language-no-bar-how-we-localise-ux-copies-at-gojek -### Learnings +## Learnings - Scaling GoBiz across Thailand, Vietnam, and Singapore taught me that localisation is never something you add after the product is built. Even after launch, every new feature needs to be evaluated through the lens of each country. The same care you put into the initial rollout has to continue, otherwise the product quietly drifts back toward the needs of the base market. - There's also an organizational reality that often gets ignored. Supporting multiple markets properly sometimes requires reshaping how teams work, how decisions are made, and who is involved in the roadmap. But these shifts take time, and they rarely get prioritised unless there is a clear business outcome tied to them. At Gojek, this misalignment became clear. Each international market operated under its own brand and leadership, which meant we couldn’t consistently involve those teams in product planning. As a result, our roadmaps naturally skewed toward Indonesia, and we only built out some must-have features for other countries. -### Closing thoughts +## Closing thoughts Gojek eventually exited Thailand and Vietnam, and its presence in Singapore today is minimal. Looking back, designing GoBiz for other countries was a highly rewarding and learning experience. I got to experience new cultures and work with people from different nationalities. Those lessons stayed with us long after the product lines, org charts, and roadmaps changed. diff --git a/astro-site/src/content/work/practo-pro/index.md b/astro-site/src/content/work/practo-pro/index.md index c0a9a166..e6315207 100644 --- a/astro-site/src/content/work/practo-pro/index.md +++ b/astro-site/src/content/work/practo-pro/index.md @@ -1,111 +1,75 @@ --- -title: "Practo Pro v1" -description: "Designing a unified mobile experience for -providers using Practo products" -year: "2015-2016" -company: "Practo" -image: "./practo-pro.png" -status: 'draft' +title: 'Practo Pro' +description: How we merged multiple apps to create a unified mobile experience for healthcare providers using Practo's products +year: 2015-2016 +company: Practo +image: ./practo-pro.png +status: draft --- ## Overview -Around Dec 2015, Practo had 3 mobile apps (Profile, Ray and Qikwell Pulse), each of which served a -particular purpose and worked independent of each other. Ray had been the mainstay app for most of -Practo’s existence, while Profile was created to onboard doctors easily to the marketplace. The Qikwell -app entered into this mix when we acquired their company earlier in 2015. Maintaining 3 separate -mobile applications was an overhead for our internal teams as well as for our users. Thus **Project -Singularity** was born. +Practo is an Indian healthcare startup that helps patients find doctors, and helps clinics and hospitals manage their patients and health records securely. Around Dec 2015, Practo had 3 mobile apps (Profile, Ray and Qikwell Pulse), each of which served a particular purpose and worked independent of each other. Ray had been the mainstay app for most of Practo’s existence, while Profile was created to onboard doctors easily to the marketplace. The Qikwell app entered into this mix when we acquired their company earlier in 2015. Maintaining 3 separate mobile applications was an overhead for our internal teams as well as for our users. Thus '**Project +Singularity**' was born. ## Understanding the problem -I was not involved in the user research phase of this project. I started work on this project at the -conceptualisation stage. I worked with Jonathan during this phase. The three apps had different visual -styles and interactions and were structured as per their workflows. We needed to integrate these -together without alienating their existing user base while also providing a scalable structure for the -future. +I started work on this project at the conceptualisation stage. I worked with Jonathan during this phase. The three apps had different visual styles and interactions and were structured as per their workflows. We needed to integrate these together without alienating their existing user base while also providing a scalable structure for the future. ->Our vision was to build one app which needs to become the defacto app for doctors and eventually -other provider segments +>Our vision was to build one app which needs to become the defacto app for doctors and eventually other provider segments -Based on the research conducted, it was understood that a healthcare professional had the following -needs; Reputation, Productivity, Marketing, Money and Networking. +Based on the research conducted, it was understood that a healthcare professional had the following needs; Reputation, Productivity, Marketing, Money and Networking. [Personas for the unified app] -The new application had to cater to these needs if it had to be a central point of their life. However, -these needs vary as per the standing of the doctor. For e.g., a just graduated doctor would seek to -learn more from experienced doctors and would rarely have their own clinic while a doctor with 10 -years of experience would be focussing on setting up her own business and getting more patients. -First we needed to figure out the information architecture. We started putting all the existing parts -of the various apps into an excel sheet to get an idea of what the pieces were and we also listed out -features that we felt could be integrated into the app at a later stage. +The new application had to cater to these needs if it had to be a central point of their life. However, these needs vary as per the standing of the doctor. For e.g., a just graduated doctor would seek to learn more from experienced doctors and would rarely have their own clinic while a doctor with 10 years of experience would be focussing on setting up her own business and getting more patients. + +First we needed to figure out the information architecture. We started putting all the existing parts of the various apps into an excel sheet to get an idea of what the pieces were and we also listed out features that we felt could be integrated into the app at a later stage. [arriving at the information architecture] -We then started organising this based on how the users would be interacting with them. This is when -we started realising that some features seemed redundant while others were incomplete. We then -looked at how these various features would be impacted with respect to our user roles. -We looked at what are the requirements for a user to access our products as well as how the app -would be for users of any of the apps. Thus we were able to finalise the information architecture of the app. +We then started organising this based on how the users would be interacting with them. This is when we started realising that some features seemed redundant while others were incomplete. We then looked at how these various features would be impacted with respect to our user roles. + +We looked at what are the requirements for a user to access our products as well as how the app would be for users of any of the apps. Thus we were able to finalise the information architecture of the app. [final information architecture] ## Concepts -Based on this information architecture, I created few app concepts which we evaluated before -finalising on the one we would present to the stakeholders. The final concept was presented as an -InVision prototype. +Based on this information architecture, I created few app concepts which we evaluated before finalising on the one we would present to the stakeholders. The final concept was presented as an InVision prototype. [final information architecture] Notifications, Summary and Settings were concepts that we proposed as part of the new app. **Notifications:** -At that point of time, we did not have a single in-product channel of communication. Most -communication happened either by emails, message bars or blocking dialogs. We wanted to change -this so we proposed a Notification Drawer. Further, we categorised as notifications as promotional and -transactional and provided users with a way to customise what kind of notifications they would like to -receive. +At that point of time, we did not have a single in-product channel of communication. Most communication happened either by emails, message bars or blocking dialogs. We wanted to change this so we proposed a Notification Drawer. Further, we categorised as notifications as promotional and transactional and provided users with a way to customise what kind of notifications they would like to receive. **Summary:** -The Summary section was conceived as the newsfeed that would be the landing page for returning -users to jump directly into their workflow. It was comprised of stationary widgets and a refreshing -infinite newsfeed. The widgets were devised only for transactional products like Ray and Consult. The -rest of the feed was to be powered by content from our other products like Healthfeed, Synapse and +The Summary section was conceived as the newsfeed that would be the landing page for returning users to jump directly into their workflow. It was comprised of stationary widgets and a refreshing infinite newsfeed. The widgets were devised only for transactional products like Ray and Consult. The rest of the feed was to be powered by content from our other products like Healthfeed, Synapse and Consult. **Settings:** -Just like notifications, this did not exist but was an obvious thing to build. We didn't want the user to -experience the internal product separations that existed. -There were many many meetings and back and forth before we could get everyone to agree that this -was the way we should go ahead. During the final discussion with the stakeholders, It was decided -that the workflow based structure was too futuristic and we would need to have an interface that lets -our users understand our offerings. So we shifted to an app grid and widget landing as shown below -instead of a feed based landing. +Just like notifications, this did not exist but was an obvious thing to build. We didn't want the user to experience the internal product separations that existed. +There were many many meetings and back and forth before we could get everyone to agree that this was the way we should go ahead. During the final discussion with the stakeholders, It was decided that the workflow based structure was too futuristic and we would need to have an interface that lets our users understand our offerings. So we shifted to an app grid and widget landing as shown below instead of a feed based landing. + [final app navigation] -## Detailing -I led this effort with a team of 3 other designers. Hetang, Akshay and me worked to create the various -product screens while Saloni was responsible for the theme and illustrations. Jonathan was overseeing -the entire operation and he gradually transitioned the responsibility to me. -We chose a clean content first approach that was becoming popular at that time. It was decided to -make the android and iOS apps similar in experience and independent of platforms. I set down the core -guidelines that we would need to follow to align the various parts of the products. We decided to use -the system fonts i.e., Roboto on Android and SF on iOS, when available, for the design. To finalise on -the elements, we mocked up key screens within the product to understand and added to our -guidelines when we found a component that was being used in multiple places. +## Role +As designer of Practo Ray mobile app, I led this effort with a team of 3 other designers. Hetang, Akshay and me worked to create the various product screens while Saloni was responsible for the theme and illustrations. + + +### Laying the foundation +We chose a clean content first approach that was becoming popular at that time. It was decided to make the android and iOS apps similar in experience and independent of platforms. I set down the core guidelines that we would need to follow to align the various parts of the products. We decided to use the system fonts i.e., Roboto on Android and SF on iOS, when available, for the design. + +To finalise on the elements, we mocked up key screens within the product to understand and added to our guidelines when we found a component that was being used in multiple places. + [singularity stickersheet] -I created a stickersheet which functioned as a Master file for all the designers. We used a primitive -peer review process so that the various parts would be consistent and present a coherent experience. -Our core files would reside within Google Drive and we would work on our versions separately before I -would go through everyone’s files before replacing the versions in our core Drive folder. +I created a stickersheet which functioned as a Master file for all the designers. We used a primitive peer review process so that the various parts would be consistent and present a coherent experience. -## Final screens +Our core files would reside within Google Drive and we would work on our versions separately before I would go through everyone’s files before replacing the versions in our core Drive folder. -During the implementation, I was the only designer assigned to the project and worked closely with the -developers to get things right which was how I earned the moniker ‘ceo’ from them. The android app -shipped on June 25th, 2016 to 100% while the iOS app took another month before it was ready for -release. +## Final screens +During the implementation, I was the only designer assigned to the project and worked closely with the developers to get things right which was how I earned the moniker ‘ceo’ from them. The android app shipped on June 25th, 2016 to 100% while the iOS app took another month before it was ready for release. -Thanks to Jonathan, Hetang, Akshay, Saloni and the rest of the Practo Partner team for coming -together to bring this once-in-a-lifetime project to life. \ No newline at end of file +#### Footnote: +Thanks to Jonathan, Hetang, Akshay, Saloni and the rest of the Practo Partner team for coming together to bring this once-in-a-lifetime project to life. \ No newline at end of file diff --git a/astro-site/src/content/work/sahabat-jiva-redesign/index.md b/astro-site/src/content/work/sahabat-jiva-redesign/index.md index 5b2f9bed..a71aa768 100644 --- a/astro-site/src/content/work/sahabat-jiva-redesign/index.md +++ b/astro-site/src/content/work/sahabat-jiva-redesign/index.md @@ -1,5 +1,5 @@ --- -title: Fixing the Information Architecture of the Sahabat Jiva app +title: Sahabat Jiva app; IA overhaul description: Redesigning the Sahabat Jiva Android app to fit the user's mental model and making it an intuitive experience year: 2022-2023 company: Jiva diff --git a/astro-site/src/content/writing/death-rebirth/comb-designer.png b/astro-site/src/content/writing/death-rebirth/comb-designer.png new file mode 100644 index 00000000..2553e9fe Binary files /dev/null and b/astro-site/src/content/writing/death-rebirth/comb-designer.png differ diff --git a/astro-site/src/content/writing/death-rebirth/index.md b/astro-site/src/content/writing/death-rebirth/index.md new file mode 100644 index 00000000..d873e34b --- /dev/null +++ b/astro-site/src/content/writing/death-rebirth/index.md @@ -0,0 +1,38 @@ +--- +title: Death and rebirth of the product designer +description: What is next for the product designer archetype? +date: 08/08/2026 +status: draft +image: rebirth.png +--- +A few months ago, there was a time where you couldn't go a week without a new company (or influencer) proclaiming that ‘design is dead’ and touting their product or workflow as the one that killed design. [I don’t think design is dying](http://kenneth.dsouza.im/writing/long-live-design-process/), but the role of the designer in the org is undergoing its next evolution. + +As models and scaffolds improve, AI will slowly improve in it’s capability to generate product design assets at a level that exceeds what most non-designers can achieve with a design system. The way I see it, there seem to be *three* possible directions for product designers to evolve in. + +### 1. Rise of the brand designer: +A few years ago, it would be hard to find a brand designer in-house. Most brand work was outsourced to agencies but we are seeing this change with the focus on taste. Almost every startup JD you see these days expect a product designer who can also do brand or brand deisgners who can do product design (and even videos). This holds true even in the B2B space, where previously no one cared for brand or product design. + +### 2. The prototyper and gate-keeper: +Meanwhile within big orgs, the adoption of AI has been unstructured. From my conversations, we see designers being expected to use AI to make their design prototypes and in some cases being expected to draft PRs to fix UI bugs. The role of the designer within such orgs does not seem to have changed. The same work is being done, the processes move a bit faster and a lot of tokens being burned. So in the short term, the [layoffs may continue](https://x.com/championswimmer/status/2051807284691612099?s=20) in the big orgs and in the mid-term I see the designers in these orgs moving towards a role of a gate-keeper of quality rather than the creator of experiences. + +### 3. The builder designer: +Personally, I find this role as the spiritual successor for the product designer. The builder is one that can own far more than the design of the feature while partnering with other departments to deliver outcomes. Though it was touted as a way ahead, we have seen less adoption as it would need folks and orgs to re-look at their ways of working and not enough orgs have the incentive to do so yet. ([Razorpay](https://razorpay.com/ai-builders/) is one such org that’s been championing this role in Bangalore.) + +--- +### The "Comb-Shaped" Designer +One thing common in all these three directions is the expectation that the designer is now expected to do more, in less time, while the bar for quality is only moves higher. These tasks used to be done by a small team of designers but the marketing around AI tooling seems to expect that this is possible by a team of one. Of course, there are talented designers who can probably churn out high quality work that’s expected but they are rare and they don’t come cheap. Each of these new role-directions have several new skills that a designer would need to master to be good at. Expecting the designer you hire to excel at everything is setting them up to fail. + +![](comb-designer.png) + +### Combing over AI's bald spots +Another thing that is common in these three directions is that these are all tasks that AI isn’t able to perform[^1]. So the industry expects that product designers can step in to comb over the bald spots that AI is showing. + +>AI can generate assets but not define a brand, AI can create visualizations but not craft an immersive narrative, AI can create prototypes but not ensure coherence. + +But working on these tasks expects you to switch between different cognitive states. Doing this over a course of a workday can get mentally draining as your brain struggles to keep up. Add to this that there are new developments ever other week in the field of AI. That's a [recipe for burnout](https://www.hkdca.com/wp-content/uploads/2026/02/ai-doesent-reduce-work-it-intensifies-it-harvard.pdf)). + + + +[^1]: as of August 2026 + +

Attribution: Both images have been generated using Midjourney 8.2

diff --git a/astro-site/src/content/writing/death-rebirth/rebirth.png b/astro-site/src/content/writing/death-rebirth/rebirth.png new file mode 100644 index 00000000..f6c49b08 Binary files /dev/null and b/astro-site/src/content/writing/death-rebirth/rebirth.png differ diff --git a/astro-site/src/layouts/BaseLayout.astro b/astro-site/src/layouts/BaseLayout.astro index e7cfe522..5a30e227 100644 --- a/astro-site/src/layouts/BaseLayout.astro +++ b/astro-site/src/layouts/BaseLayout.astro @@ -9,6 +9,7 @@ interface Props { imageType?: string; imageWidth?: number; imageHeight?: number; + wide?: boolean; } const { @@ -17,7 +18,8 @@ const { image = "/images/profile.png", imageType, imageWidth, - imageHeight + imageHeight, + wide = false } = Astro.props; const siteUrl = "https://kenneth.dsouza.im"; @@ -98,7 +100,7 @@ const resolvedImageType = imageType ?? inferMimeType(image); -
+