{"version":3,"sources":["../src/core/orid/model.ts","../src/core/orid/theme.ts","../src/core/orid/transpile.ts"],"names":["FRONTMATTER_RE"],"mappings":";;;AAsDO,IAAM,WAAA,GAAwC;AAAA,EACnD;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,OAAA,EAAS,WAAA;AAAA,IACT,OAAA,EAAS,CAAC,WAAW,CAAA;AAAA,IACrB,OAAA,EAAS,QAAA;AAAA,IACT,EAAA,EAAI,0BAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,YAAA;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,OAAA,EAAS,CAAC,YAAY,CAAA;AAAA,IACtB,OAAA,EAAS,QAAA;AAAA,IACT,EAAA,EAAI,0BAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,OAAA,EAAS,cAAA;AAAA,IACT,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,IACxB,OAAA,EAAS,QAAA;AAAA,IACT,EAAA,EAAI,0BAAA;AAAA,IACJ,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,YAAA;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,OAAA,EAAS,CAAC,YAAY,CAAA;AAAA,IACtB,OAAA,EAAS,QAAA;AAAA,IACT,EAAA,EAAI,0BAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV;AAEA,IAAM,cAAA,uBAAqB,GAAA,EAA2B;AACtD,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,EAAA,KAAA,MAAW,SAAS,IAAA,CAAK,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,IAAI,CAAA;AAClE;AAGO,SAAS,mBAAmB,IAAA,EAAyC;AAC1E,EAAA,OAAO,eAAe,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,CAAE,aAAa,CAAA;AACrD;AAEO,SAAS,cAAc,GAAA,EAAkC;AAE9D,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC9C;AAoBA,IAAM,cAAA,GAAiB,sCAAA;AAEvB,IAAM,SAAA,GAAY,aAAA;AAGX,SAAS,cAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,+BAAA;AAAA,IACP,QAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,CAAC,CAAA,MAAA,EAAI,IAAA,CAAK,EAAE,CAAA,MAAA,CAAG,GAAE,CAAE;AAAA,GAChF;AACF;AAGO,SAAS,cAAc,KAAA,EAA+B;AAC3D,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAA;AACzD,IAAA,IAAI,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,EAAQ;AAC5B,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,KAAQ,CAAA,CAAE,GAAG,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK;AACnC,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,IAAI,MAAM,CAAA,CAAA,GAAK,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,MAAA,EAAM,KAAK,EAAE,CAAA,CAAA;AACvF;AAGO,SAAS,UAAU,IAAA,EAAyB;AACjD,EAAA,MAAM,QAAA,GAAW,IAAA;AACjB,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,WAAA,GAAc,EAAA,CAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AACxC,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,EAAE,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,IAAI,GAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,KAAA;AAGd,EAAA,MAAM,cAAc,MAAiB;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAC,EAAE;AACpC,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG;AACzB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,OAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,EAAC,EAAG,KAAK,QAAA,EAAS;AAAA,IAClD;AAGA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,MAAM,EAAE,IAAA,EAAK;AAChD,MAAA,IAAI,KAAA,EAAO,WAAA,EAAY,CAAE,KAAA,CAAM,KAAK,KAAK,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACnC,IAAA,MAAM,OAAO,UAAA,KAAe,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,UAAU,CAAA;AAChE,IAAA,MAAM,IAAA,GAAO,eAAe,EAAA,GAAK,EAAA,GAAK,KAAK,KAAA,CAAM,UAAU,EAAE,IAAA,EAAK;AAClE,IAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD,IAAA,IAAI,IAAA,EAAM;AAER,MAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,KAAK,GAAG,CAAA;AACtD,MAAA,GAAA,GAAM,YAAY,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,KAAA,EAAO,EAAC,EAAE;AAC7C,MAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC9B,MAAA,IAAI,IAAA,MAAU,OAAA,GAAU,IAAA;AACxB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,GAAA,IAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,EAAE,IAAA,EAAK;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,EAAY,CAAE,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,MAAA,EAAO;AACtC;AAQA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,IAAA;AACrC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAA,CAAQ,UAAA,KAAe,EAAA,GAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,EAAG,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACzF,EAAA,OAAO,kBAAA,CAAmB,IAAI,CAAA,KAAM,MAAA;AACtC;AAGO,SAAS,cAAc,KAAA,EAA0B;AAEtD,EAAA,IAAI,KAAA,CAAM,OAAO,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,IAAK,CAAC,MAAM,KAAA,EAAO;AAC1D,IAAA,OAAO,KAAA,CAAM,GAAA;AAAA,EACf;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,MAAM,WAAW,CAAA;AACnD,EAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,CAAA;AACnF,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAA,GAAK,EAAA;AACrF,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAA,EAAM,OAAA,IAAW,MAAM,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AACxD,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,WAAW,WAAA,CAAY,KAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;;;ACpPO,IAAM,cAAA,GAAiB;AAEvB,IAAM,YAAA,GAAuD;AAAA,EAClE,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe;AAAA;AAEnB;AAGO,IAAM,WAAA,GAA4C;AAAA,EACvD,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,GAAA;AAAA,EACd,UAAA,EAAY;AACd;AAGO,IAAM,gBAAgB,CAAC,GAAA,KAA8B,CAAA,QAAA,EAAW,WAAA,CAAY,GAAG,CAAC,CAAA;AAEhF,IAAM,iBAAiB,CAAC,GAAA,KAA8B,CAAA,SAAA,EAAY,WAAA,CAAY,GAAG,CAAC,CAAA;AAGlF,IAAM,gBAAA,GAAmB;AAEzB,IAAM,gBAAA,GAAmB;AAGzB,SAAS,uBAAuB,OAAA,EAA4D;AACjG,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,KAAA,CAAM,KAAK,OAAO,CAAA;AAClE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAqB;AAC7D,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,GAAG,CAAC,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,GAAG,CAAC,CAAA,EAAG,OAAO,GAAA;AAAA,EACtF;AACA,EAAA,OAAO,MAAA;AACT;;;ACvDO,IAAM,kBAAA,GAAqB;AAElC,IAAMA,eAAAA,GAAiB,wCAAA;AAGhB,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,IAAI,GAAA,GAAA,CAAO,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK;AAC5B,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAClC,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACvC,MAAA,GAAA,GAAM,UAAU,EAAA,GAAK,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAO,CAAA;AAC/D;AAGA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AAC7D;AAOA,SAAS,iBAAiB,KAAA,EAAsC;AAC9D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK;AAChC,EAAA,MAAM,WAAW,KAAA,CAAM,WAAA,EAAa,KAAA,CAAMA,eAAc,IAAI,CAAC,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,KAAA,CAAM,WAAA;AAEzB,EAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,EAAA,EACvB,KAAA,CAAM,IAAI,CAAA,CACV,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAC5C,MAAA,CAAO,CAAC,IAAA,EAAM,CAAA,EAAG,GAAA,KAAQ,EAAE,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,IAAM,CAAA,KAAM,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,CAAA;AACzE,EAAA,MAAM,OAAO,CAAC,GAAG,MAAM,CAAA,OAAA,EAAU,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,EAAE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,OAAW,EAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7F,EAAA,OAAO,CAAA;AAAA,EAAQ,IAAI;AAAA,GAAA,CAAA;AACrB;AAGO,SAAS,UAAA,CAAW,OAAkB,KAAA,EAAuB;AAClE,EAAA,OAAO,GAAG,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAA;AAC9C;AAGO,SAAS,YAAY,KAAA,EAA0B;AACpD,EAAA,OAAO,CAAA,KAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AACvC;AAGO,SAAS,cAAc,KAAA,EAA0B;AACtD,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AACtE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,WAAA,GAAc,iBAAiB,KAAK,CAAA;AAC1C,EAAA,IAAI,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AACvC,EAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAEzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAA,GAAU,YAAY,KAAK,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,OAAO,CAAA,EAAA,EAAK,YAAY,YAAA,CAAa,KAAK,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAC3E,IAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGtB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA,GAAA,EAAM,gBAAgB,CAAA,KAAA,EAAQ,gBAAgB,CAAA,CAAE,CAAA;AAAA,IAC9F,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,CAAA,QAAA,EAAW,UAAA,CAAW,KAAA,EAAO,CAAC,CAAC,CAAA,EAAA,EAAK,WAAA,CAAY,IAAI,CAAC,CAAA,KAAA,EAAQ,aAAA,CAAc,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,SACvF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,kBAAA,EAAoB;AACrE,QAAA,MAAM,GAAA,GAAM,KAAA,CACT,KAAA,CAAM,KAAA,EAAO,QAAQ,kBAAkB,CAAA,CACvC,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC7C,QAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,WAAW,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/D;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EACtB;AAGA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9E;AAIA,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,CAAC,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,aAAA,EAAgB,aAAA,CAAc,IAAA,CAAK,GAAG,CAAC,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,QAAA,EAAW,CAAA,CAAE,UAAU,CAAA,0BAAA,EACnD,cAAc,CAAA;AAAA,KAC9C;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA,EAAG;AACpE,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,gBAAgB,gBAAgB,CAAA,oFAAA;AAAA,KAElC;AAAA,EACF;AACA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,aAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,GAAG,CAAC,SAAS,CAAA,CAAE,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,WAAW,CAAA,mBAAA;AAAA,KACvF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,WAAA,CAAY,KAAK,CAAC,IAAI,cAAA,CAAe,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAOO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,aAAA,CAAc,SAAA,CAAU,IAAI,CAAC,CAAA;AACtC","file":"orid.cjs","sourcesContent":["// ORID(焦點討論法)結構化模型 + 雙向 round-trip(純函式、零 DOM)。\r\n//\r\n// ORID 不是 mermaid 原生圖種,而是本專案自訂的第一個「引導式討論」圖表:\r\n// 四個固定階段 Objective(客觀事實)→ Reflective(感受反應)→\r\n// Interpretive(意義詮釋)→ Decisional(決定行動),每階段各是一串條列項目。\r\n// 渲染時由 orid/transpile.ts 轉成原生 flowchart(見該檔),故所有既有能力\r\n// (主題、pan/zoom、搜尋、匯出、check/tip)全部原封不動繼承。\r\n//\r\n// 語法:\r\n//\r\n//   ---\r\n//   title: 中繼標題            ← frontmatter(逐字保留)\r\n//   ---\r\n//   orid\r\n//       title 上線後回顧        ← 圖表顯示標題\r\n//       objective 客觀事實      ← 階段關鍵字 + 選填的自訂段落標題\r\n//           錯誤率 3.2%         ← 項目(縮排;可加 - / * / • 前綴)\r\n//           - 平均延遲 850ms\r\n//       reflective\r\n//           團隊感到焦慮\r\n//       interpretive\r\n//           監控缺口是根因\r\n//       decisional\r\n//           補上告警 @mark 8/25\r\n//\r\n// 設計:解析永遠成功並降級(保留原文於 raw),序列化永遠輸出合法 ORID。\r\n\r\nexport type OridStageKey = 'objective' | 'reflective' | 'interpretive' | 'decisional';\r\n\r\nexport interface OridStageSpec {\r\n  key: OridStageKey;\r\n  /** 序列化時輸出的正規關鍵字。 */\r\n  keyword: string;\r\n  /**\r\n   * 解析時可接受的別名(全小寫;含正規關鍵字本身)。\r\n   *\r\n   * 刻意不收單字母縮寫(o / r / i / d):英文項目常以 \"I …\" 開頭\r\n   * (「I feel anxious about the rollout」),那會被靜靜地當成一個新的\r\n   * Interpretive 階段,把後面的項目全接到錯的段落去。省四個字母不值這個風險。\r\n   */\r\n  aliases: string[];\r\n  /** 圓圈數字序號,渲染段落標題用。 */\r\n  ordinal: string;\r\n  /** 預設段落標題(作者未自訂時使用)。 */\r\n  zh: string;\r\n  en: string;\r\n  /** 一句話說明(hover / 表單提示 / 空欄位 placeholder 共用)。 */\r\n  hint: string;\r\n}\r\n\r\n/**\r\n * 四階段的單一真相。順序即渲染順序 —— 不論作者用什麼順序書寫,\r\n * 一律以 O → R → I → D 呈現(ORID 的價值就在這個固定推進順序)。\r\n */\r\nexport const ORID_STAGES: readonly OridStageSpec[] = [\r\n  {\r\n    key: 'objective',\r\n    keyword: 'objective',\r\n    aliases: ['objective'],\r\n    ordinal: '①',\r\n    zh: '客觀事實',\r\n    en: 'Objective',\r\n    hint: '看到 / 聽到什麼?只寫可查證的事實與數據,不含評價。',\r\n  },\r\n  {\r\n    key: 'reflective',\r\n    keyword: 'reflective',\r\n    aliases: ['reflective'],\r\n    ordinal: '②',\r\n    zh: '感受反應',\r\n    en: 'Reflective',\r\n    hint: '當下的感覺、直覺反應與情緒,不必先講道理。',\r\n  },\r\n  {\r\n    key: 'interpretive',\r\n    keyword: 'interpretive',\r\n    aliases: ['interpretive'],\r\n    ordinal: '③',\r\n    zh: '意義詮釋',\r\n    en: 'Interpretive',\r\n    hint: '這代表什麼?根因、洞察、學到的事。',\r\n  },\r\n  {\r\n    key: 'decisional',\r\n    keyword: 'decisional',\r\n    aliases: ['decisional'],\r\n    ordinal: '④',\r\n    zh: '決定行動',\r\n    en: 'Decisional',\r\n    hint: '接下來要做什麼?誰負責、何時完成。',\r\n  },\r\n];\r\n\r\nconst STAGE_BY_ALIAS = new Map<string, OridStageSpec>();\r\nfor (const spec of ORID_STAGES) {\r\n  for (const alias of spec.aliases) STAGE_BY_ALIAS.set(alias, spec);\r\n}\r\n\r\n/** 由關鍵字(不分大小寫)取階段規格;非階段關鍵字回 undefined。 */\r\nexport function oridStageByKeyword(word: string): OridStageSpec | undefined {\r\n  return STAGE_BY_ALIAS.get(word.trim().toLowerCase());\r\n}\r\n\r\nexport function oridStageSpec(key: OridStageKey): OridStageSpec {\r\n  // key 為聯集型別,查表必中;findIndex 之後的 ! 由型別保證。\r\n  return ORID_STAGES.find((s) => s.key === key) as OridStageSpec;\r\n}\r\n\r\nexport interface OridStage {\r\n  key: OridStageKey;\r\n  /** 作者自訂的段落標題;未指定 = 渲染時用 `序號 中文 · English`。 */\r\n  heading?: string;\r\n  items: string[];\r\n}\r\n\r\nexport interface OridModel {\r\n  /** 逐字保留的 YAML frontmatter(含 --- 標記),無則 undefined。 */\r\n  frontmatter?: string;\r\n  /** `title X` 顯示標題。 */\r\n  title?: string;\r\n  /** 作者實際宣告的階段(書寫順序);渲染 / 序列化一律照 ORID_STAGES 正規排序。 */\r\n  stages: OridStage[];\r\n  /** 解析無法辨識為合法 ORID 時的完整原文(降級防覆寫用)。 */\r\n  raw?: string;\r\n}\r\n\r\nconst FRONTMATTER_RE = /^---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$)/;\r\n/** 條列項目前綴:- / * / • / ‧ / ・(有前綴就一定是項目,不會被誤判成階段關鍵字)。 */\r\nconst BULLET_RE = /^[-*•‧・]\\s*/;\r\n\r\n/** 空白模型(新建時的起手骨架):四階段齊備,各給一個提示性項目。 */\r\nexport function emptyOridModel(): OridModel {\r\n  return {\r\n    title: 'ORID 焦點討論',\r\n    stages: ORID_STAGES.map((spec) => ({ key: spec.key, items: [`（${spec.zh}）`] })),\r\n  };\r\n}\r\n\r\n/** 依 ORID 正規順序取出階段;未宣告的階段不補。 */\r\nexport function orderedStages(model: OridModel): OridStage[] {\r\n  const out: OridStage[] = [];\r\n  for (const spec of ORID_STAGES) {\r\n    const found = model.stages.find((s) => s.key === spec.key);\r\n    if (found) out.push(found);\r\n  }\r\n  // 保險:理論上 stages 的 key 必在聯集內,萬一有未知 key 也不要吃掉資料。\r\n  for (const s of model.stages) {\r\n    if (!ORID_STAGES.some((spec) => spec.key === s.key)) out.push(s);\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * 段落標題的顯示文字。序號一律保留 —— 四段的推進順序正是 ORID 的重點,\r\n * 只有其中一兩段被自訂就少了編號的話,漏斗會讀不出節奏。\r\n */\r\nexport function stageHeading(stage: OridStage): string {\r\n  const spec = oridStageSpec(stage.key);\r\n  const custom = stage.heading?.trim();\r\n  return custom ? `${spec.ordinal} ${custom}` : `${spec.ordinal} ${spec.zh} · ${spec.en}`;\r\n}\r\n\r\n/** ORID 文字 → 結構化模型。永不拋例外;無法解析時於 raw 保留原文。 */\r\nexport function parseOrid(text: string): OridModel {\r\n  const original = text;\r\n  let frontmatter: string | undefined;\r\n  let body = text;\r\n  const fm = text.match(FRONTMATTER_RE);\r\n  if (fm) {\r\n    frontmatter = fm[0].replace(/\\r?\\n$/, '');\r\n    body = text.slice(fm[0].length);\r\n  }\r\n\r\n  let title: string | undefined;\r\n  const stages: OridStage[] = [];\r\n  let cur: OridStage | null = null;\r\n  let sawOrid = false;\r\n\r\n  /** 取得(或建立)目前階段;項目寫在任何階段關鍵字之前時,隱含開啟 objective。 */\r\n  const ensureStage = (): OridStage => {\r\n    if (!cur) {\r\n      cur = { key: 'objective', items: [] };\r\n      stages.push(cur);\r\n    }\r\n    return cur;\r\n  };\r\n\r\n  for (const rawLine of body.split('\\n')) {\r\n    const line = rawLine.trim();\r\n    if (!line) continue;\r\n    if (line.startsWith('%%')) continue; // 註解 / init 指令\r\n    if (!sawOrid) {\r\n      // 第一個有意義 token 必須是 orid,否則整段視為非 ORID(降級)。\r\n      if (/^orid\\b/i.test(line)) {\r\n        sawOrid = true;\r\n        continue;\r\n      }\r\n      return { frontmatter, stages: [], raw: original };\r\n    }\r\n\r\n    // 有 bullet 前綴 → 一定是項目(使用者強制不走關鍵字判定的逃生口)。\r\n    const bullet = line.match(BULLET_RE);\r\n    if (bullet) {\r\n      const value = line.slice(bullet[0].length).trim();\r\n      if (value) ensureStage().items.push(value);\r\n      continue;\r\n    }\r\n\r\n    // 首 token 是階段關鍵字 → 開新階段,其餘文字為自訂段落標題。\r\n    const firstSpace = line.search(/\\s/);\r\n    const head = firstSpace === -1 ? line : line.slice(0, firstSpace);\r\n    const rest = firstSpace === -1 ? '' : line.slice(firstSpace).trim();\r\n    const spec = oridStageByKeyword(head.replace(/[:：]$/, ''));\r\n    if (spec) {\r\n      // 同一階段重複宣告 → 併入既有階段(不覆蓋已收集的項目)。\r\n      const existing = stages.find((s) => s.key === spec.key);\r\n      cur = existing ?? { key: spec.key, items: [] };\r\n      if (!existing) stages.push(cur);\r\n      if (rest) cur.heading = rest;\r\n      continue;\r\n    }\r\n\r\n    // `title X` 顯示標題(必須在任何階段之前;之後出現的視為項目,避免吃掉名為 title 的項目)。\r\n    if (!cur && /^title\\s+/i.test(line)) {\r\n      title = line.replace(/^title\\s+/i, '').trim();\r\n      continue;\r\n    }\r\n\r\n    ensureStage().items.push(line);\r\n  }\r\n\r\n  return { frontmatter, title, stages };\r\n}\r\n\r\n/**\r\n * 這個項目重新解析時會被誤讀成別的東西嗎?會的話序列化要補 `- ` 前綴。\r\n * 三種情況:首字是階段關鍵字(objective / reflective / …)、本來就以 bullet 字元開頭、\r\n * 或長得像 `title X`。少了這道保護,「objective 這個詞很模糊」這種項目\r\n * 存檔再開就變成一個新階段,資料就這樣被吃掉了。\r\n */\r\nfunction needsBullet(value: string): boolean {\r\n  if (BULLET_RE.test(value)) return true;\r\n  if (/^title\\s+/i.test(value)) return true;\r\n  const firstSpace = value.search(/\\s/);\r\n  const head = (firstSpace === -1 ? value : value.slice(0, firstSpace)).replace(/[:：]$/, '');\r\n  return oridStageByKeyword(head) !== undefined;\r\n}\r\n\r\n/** 結構化模型 → ORID 文字。純函式、永遠合法、階段一律正規排序。 */\r\nexport function serializeOrid(model: OridModel): string {\r\n  // 降級:解析失敗保留的原文逐字回吐,避免覆寫使用者資料。\r\n  if (model.raw && model.stages.length === 0 && !model.title) {\r\n    return model.raw;\r\n  }\r\n  const lines: string[] = [];\r\n  if (model.frontmatter) lines.push(model.frontmatter);\r\n  lines.push('orid');\r\n  if (model.title && model.title.trim()) lines.push(`    title ${model.title.trim()}`);\r\n  for (const stage of orderedStages(model)) {\r\n    const spec = oridStageSpec(stage.key);\r\n    const heading = stage.heading && stage.heading.trim() ? ` ${stage.heading.trim()}` : '';\r\n    lines.push(`    ${spec?.keyword ?? stage.key}${heading}`);\r\n    for (const item of stage.items) {\r\n      const value = item.trim();\r\n      if (!value) continue; // 全空項目略過,避免輸出空行\r\n      lines.push(`        ${needsBullet(value) ? `- ${value}` : value}`);\r\n    }\r\n  }\r\n  return lines.join('\\n') + '\\n';\r\n}\r\n","// ORID 的語意配色與 CSS 類名 —— 轉譯器(產生 classDef)與 colorful 後處理上色器\r\n// (在 SVG 上重畫)兩邊共用的單一真相。\r\n//\r\n// 色相是刻意選的,不是輪播調色盤:\r\n//   O 客觀事實 → 藍(冷靜、可查證的事實)\r\n//   R 感受反應 → 橘(情緒溫度)\r\n//   I 意義詮釋 → 紫(洞察)\r\n//   D 決定行動 → 綠(GO、往前走)\r\n// 四段一眼分得出來,而且顏色本身就在講 ORID 的推進節奏。\r\n\r\nimport type { OridStageKey } from './model';\r\n\r\nexport interface OridPaletteEntry {\r\n  /** 項目方塊的底色 / 邊框。 */\r\n  itemFill: string;\r\n  itemStroke: string;\r\n  /** 階段容器(subgraph)的底色 / 邊框。 */\r\n  stageFill: string;\r\n  stageStroke: string;\r\n  /** 深色主題下的項目底色(colorful 後處理用;classDef 走淺色版即可)。 */\r\n  itemFillDark: string;\r\n  stageFillDark: string;\r\n}\r\n\r\n/** 項目方塊在淺色底上的文字色(對齊 colorize 的 NODE_TEXT)。 */\r\nexport const ORID_ITEM_TEXT = '#1F2937';\r\n\r\nexport const ORID_PALETTE: Record<OridStageKey, OridPaletteEntry> = {\r\n  objective: {\r\n    itemFill: '#DBEAFE',\r\n    itemStroke: '#3B82F6',\r\n    stageFill: '#3B82F61F',\r\n    stageStroke: '#3B82F6',\r\n    itemFillDark: '#1E3A5F',\r\n    stageFillDark: '#3B82F633',\r\n  },\r\n  reflective: {\r\n    itemFill: '#FFEDD5',\r\n    itemStroke: '#F97316',\r\n    stageFill: '#F973161F',\r\n    stageStroke: '#F97316',\r\n    itemFillDark: '#5C3211',\r\n    stageFillDark: '#F9731633',\r\n  },\r\n  interpretive: {\r\n    itemFill: '#F3E8FF',\r\n    itemStroke: '#A855F7',\r\n    stageFill: '#A855F71F',\r\n    stageStroke: '#A855F7',\r\n    itemFillDark: '#432069',\r\n    stageFillDark: '#A855F733',\r\n  },\r\n  decisional: {\r\n    itemFill: '#DCFCE7',\r\n    itemStroke: '#22C55E',\r\n    stageFill: '#22C55E1F',\r\n    stageStroke: '#22C55E',\r\n    itemFillDark: '#14432A',\r\n    stageFillDark: '#22C55E33',\r\n  },\r\n};\r\n\r\n/** 階段代號字母(節點 id 前綴 / CSS 類名字尾):objective → O。 */\r\nexport const ORID_LETTER: Record<OridStageKey, string> = {\r\n  objective: 'O',\r\n  reflective: 'R',\r\n  interpretive: 'I',\r\n  decisional: 'D',\r\n};\r\n\r\n/** 項目方塊的 CSS 類名(mermaid `:::className` → SVG g.node 的 class)。 */\r\nexport const oridItemClass = (key: OridStageKey): string => `oridItem${ORID_LETTER[key]}`;\r\n/** 階段容器的 CSS 類名(mermaid `class ORID_O oridStageO` → SVG g.cluster 的 class)。 */\r\nexport const oridStageClass = (key: OridStageKey): string => `oridStage${ORID_LETTER[key]}`;\r\n\r\n/** 空階段的佔位方塊類名(虛線、淡色,提醒「這段還沒填」)。 */\r\nexport const ORID_EMPTY_CLASS = 'oridEmpty';\r\n/** 空階段佔位方塊的文字。 */\r\nexport const ORID_EMPTY_LABEL = '（待填）';\r\n\r\n/** 由 SVG 上的 class 反查階段;非 ORID 類名回 undefined(colorful 後處理用)。 */\r\nexport function oridStageFromClassList(classes: DOMTokenList | string[]): OridStageKey | undefined {\r\n  const list = Array.isArray(classes) ? classes : Array.from(classes);\r\n  for (const key of Object.keys(ORID_PALETTE) as OridStageKey[]) {\r\n    if (list.includes(oridItemClass(key)) || list.includes(oridStageClass(key))) return key;\r\n  }\r\n  return undefined;\r\n}\r\n","// ORID → 原生 mermaid flowchart 轉譯器(純函式、零 DOM)。\r\n//\r\n// ORID 不是 mermaid 的圖種,mermaid 也不認得 `orid` 關鍵字。與其自己畫一套 SVG\r\n// (那會失去主題、pan/zoom、搜尋、匯出、check/tip 全部既有能力),這裡選擇在\r\n// 「送進 mermaid.render 之前」把 ORID 轉成等價的 flowchart:\r\n//\r\n//   - 每個階段 = 一個 subgraph(縱向 TB 依序往下,箭頭串成漏斗)\r\n//   - 階段內 `direction LR` + `~~~` 隱形連線 = 項目排成橫向網格\r\n//   - classDef / class = 四段語意配色(colorful 主題會再依同一組類名重畫,見 themes/colorize)\r\n//\r\n// 轉譯後就是一張普通 flowchart,所以下游一切照舊 —— 這是本功能能「所有地方都支援」的關鍵。\r\n\r\nimport {\r\n  ORID_STAGES,\r\n  orderedStages,\r\n  oridStageSpec,\r\n  parseOrid,\r\n  stageHeading,\r\n  type OridModel,\r\n  type OridStage,\r\n} from './model';\r\nimport {\r\n  ORID_EMPTY_CLASS,\r\n  ORID_EMPTY_LABEL,\r\n  ORID_ITEM_TEXT,\r\n  ORID_LETTER,\r\n  ORID_PALETTE,\r\n  oridItemClass,\r\n  oridStageClass,\r\n} from './theme';\r\n\r\n/** 一列最多幾個項目;超過就換列(在 LR 階段內形成網格,避免長條圖橫向爆開)。 */\r\nexport const ORID_ITEMS_PER_ROW = 4;\r\n\r\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/;\r\n\r\n/** 首個有意義關鍵字是不是 orid(略過 frontmatter 與 %% 註解)。 */\r\nexport function isOridSource(text: string): boolean {\r\n  let src = (text ?? '').trim();\r\n  if (src.startsWith('---')) {\r\n    const end = src.indexOf('\\n---', 3);\r\n    if (end !== -1) {\r\n      const after = src.indexOf('\\n', end + 1);\r\n      src = after === -1 ? '' : src.slice(after + 1);\r\n    }\r\n  }\r\n  for (const rawLine of src.split('\\n')) {\r\n    const line = rawLine.trim();\r\n    if (!line || line.startsWith('%%')) continue;\r\n    return /^orid\\b/i.test(line);\r\n  }\r\n  return false;\r\n}\r\n\r\n/** 節點標籤跳脫(對齊 flowchart serializer:雙引號轉實體、換行轉 <br/>)。 */\r\nfunction escapeLabel(text: string): string {\r\n  return text.replace(/\"/g, '&quot;').replace(/\\r?\\n/g, '<br/>');\r\n}\r\n\r\n/** YAML 雙引號字串跳脫(frontmatter title 用)。 */\r\nfunction yamlQuote(text: string): string {\r\n  return `\"${text.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\r\n}\r\n\r\n/**\r\n * 產生要放到輸出最前面的 frontmatter。\r\n * ORID 的 `title` 是圖表標題的單一真相:有寫就取代 frontmatter 既有的 title,\r\n * 沒寫則原樣沿用作者的 frontmatter(可能本來就有 title)。\r\n */\r\nfunction buildFrontmatter(model: OridModel): string | undefined {\r\n  const title = model.title?.trim();\r\n  const existing = model.frontmatter?.match(FRONTMATTER_RE)?.[1];\r\n  if (!title) return model.frontmatter;\r\n\r\n  const kept = (existing ?? '')\r\n    .split('\\n')\r\n    .filter((line) => !/^\\s*title\\s*:/.test(line))\r\n    .filter((line, i, arr) => !(line.trim() === '' && i === arr.length - 1));\r\n  const body = [...kept, `title: ${yamlQuote(title)}`].filter((l) => l.trim() !== '').join('\\n');\r\n  return `---\\n${body}\\n---`;\r\n}\r\n\r\n/** 階段內的項目 id:O1 / R2 / I3 …(短、好記,方便 %% @tip / @check 指定)。 */\r\nexport function oridItemId(stage: OridStage, index: number): string {\r\n  return `${ORID_LETTER[stage.key]}${index + 1}`;\r\n}\r\n\r\n/** 階段容器 id:ORID_O / ORID_R / …。 */\r\nexport function oridStageId(stage: OridStage): string {\r\n  return `ORID_${ORID_LETTER[stage.key]}`;\r\n}\r\n\r\n/** 結構化模型 → mermaid flowchart 原始碼。純函式、永遠輸出合法 mermaid。 */\r\nexport function oridToMermaid(model: OridModel): string {\r\n  const stages = orderedStages(model).filter((s) => oridStageSpec(s.key));\r\n  const lines: string[] = [];\r\n  const frontmatter = buildFrontmatter(model);\r\n  if (frontmatter) lines.push(frontmatter);\r\n  lines.push('flowchart TB');\r\n\r\n  for (const stage of stages) {\r\n    const stageId = oridStageId(stage);\r\n    lines.push(`    subgraph ${stageId}[\"${escapeLabel(stageHeading(stage))}\"]`);\r\n    lines.push('        direction LR');\r\n    const items = stage.items.map((t) => t.trim()).filter(Boolean);\r\n    if (items.length === 0) {\r\n      // 空階段:給一個虛線佔位塊。留空的 subgraph mermaid 雖然畫得出來,\r\n      // 但會塌成一條沒有意義的細帶,讀者看不出「這段還沒填」。\r\n      lines.push(`        ${ORID_LETTER[stage.key]}0[\"${ORID_EMPTY_LABEL}\"]:::${ORID_EMPTY_CLASS}`);\r\n    } else {\r\n      items.forEach((text, i) => {\r\n        lines.push(\r\n          `        ${oridItemId(stage, i)}[\"${escapeLabel(text)}\"]:::${oridItemClass(stage.key)}`,\r\n        );\r\n      });\r\n      // 每列以隱形連線串起來 → LR 方向排成一橫列;分列則自然疊成網格。\r\n      for (let start = 0; start < items.length; start += ORID_ITEMS_PER_ROW) {\r\n        const row = items\r\n          .slice(start, start + ORID_ITEMS_PER_ROW)\r\n          .map((_, i) => oridItemId(stage, start + i));\r\n        if (row.length > 1) lines.push(`        ${row.join(' ~~~ ')}`);\r\n      }\r\n    }\r\n    lines.push('    end');\r\n  }\r\n\r\n  // 階段之間的推進箭頭(漏斗的骨幹)。\r\n  for (let i = 1; i < stages.length; i += 1) {\r\n    lines.push(`    ${oridStageId(stages[i - 1])} --> ${oridStageId(stages[i])}`);\r\n  }\r\n\r\n  // 語意配色。colorful 主題會在 SVG 上以同一組類名重畫(見 themes/colorize 的 styleOrid),\r\n  // 這裡的 classDef 則讓 neutral / dark / forest / sketch 等未後處理的主題也有正確顏色。\r\n  for (const spec of ORID_STAGES) {\r\n    if (!stages.some((s) => s.key === spec.key)) continue;\r\n    const p = ORID_PALETTE[spec.key];\r\n    lines.push(\r\n      `    classDef ${oridItemClass(spec.key)} fill:${p.itemFill},stroke:${p.itemStroke},` +\r\n        `stroke-width:1.5px,color:${ORID_ITEM_TEXT}`,\r\n    );\r\n  }\r\n  if (stages.some((s) => s.items.filter((t) => t.trim()).length === 0)) {\r\n    lines.push(\r\n      `    classDef ${ORID_EMPTY_CLASS} fill:transparent,stroke:#94A3B8,stroke-width:1px,` +\r\n        'stroke-dasharray:4 4,color:#94A3B8',\r\n    );\r\n  }\r\n  for (const stage of stages) {\r\n    const p = ORID_PALETTE[stage.key];\r\n    lines.push(\r\n      `    classDef ${oridStageClass(stage.key)} fill:${p.stageFill},stroke:${p.stageStroke},stroke-width:1.5px`,\r\n    );\r\n    lines.push(`    class ${oridStageId(stage)} ${oridStageClass(stage.key)}`);\r\n  }\r\n\r\n  return lines.join('\\n') + '\\n';\r\n}\r\n\r\n/**\r\n * 若 text 是 ORID 就轉成 flowchart,否則原樣回傳。\r\n * 這是所有渲染路徑(lib 的 render-pipeline、VS Code 各 webview、Slack harness)\r\n * 唯一需要呼叫的函式 —— 對非 ORID 原始碼是零成本的直通。\r\n */\r\nexport function transpileOrid(text: string): string {\r\n  if (!isOridSource(text)) return text;\r\n  return oridToMermaid(parseOrid(text));\r\n}\r\n"]}