@agent-native/core 0.41.1 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action.d.ts +13 -1
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +8 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +93 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/app-skill.d.ts +16 -0
- package/dist/cli/app-skill.d.ts.map +1 -1
- package/dist/cli/app-skill.js +33 -3
- package/dist/cli/app-skill.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +14 -3
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +34 -3
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +172 -48
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +2 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +172 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +19 -0
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +5 -57
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.js +116 -7
- package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
- package/dist/client/blocks/library/DataModelBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DataModelBlock.js +75 -9
- package/dist/client/blocks/library/DataModelBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +195 -34
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts +1 -1
- package/dist/client/blocks/library/HighlightedCode.js +1 -1
- package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/client/blocks/library/annotation-rail.d.ts +96 -0
- package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -0
- package/dist/client/blocks/library/annotation-rail.js +120 -0
- package/dist/client/blocks/library/annotation-rail.js.map +1 -0
- package/dist/client/blocks/library/api-endpoint.config.d.ts +31 -6
- package/dist/client/blocks/library/api-endpoint.config.d.ts.map +1 -1
- package/dist/client/blocks/library/api-endpoint.config.js +30 -6
- package/dist/client/blocks/library/api-endpoint.config.js.map +1 -1
- package/dist/client/blocks/library/code.d.ts.map +1 -1
- package/dist/client/blocks/library/code.js +32 -15
- package/dist/client/blocks/library/code.js.map +1 -1
- package/dist/client/blocks/library/columns.d.ts.map +1 -1
- package/dist/client/blocks/library/columns.js +56 -35
- package/dist/client/blocks/library/columns.js.map +1 -1
- package/dist/client/blocks/library/data-model.config.d.ts +17 -0
- package/dist/client/blocks/library/data-model.config.d.ts.map +1 -1
- package/dist/client/blocks/library/data-model.config.js +15 -0
- package/dist/client/blocks/library/data-model.config.js.map +1 -1
- package/dist/client/blocks/library/diff.config.d.ts +28 -6
- package/dist/client/blocks/library/diff.config.d.ts.map +1 -1
- package/dist/client/blocks/library/diff.config.js +30 -6
- package/dist/client/blocks/library/diff.config.js.map +1 -1
- package/dist/client/blocks/types.d.ts +2 -2
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/DragHandle.js +75 -9
- package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +25 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +29 -6
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +5 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +159 -12
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/store.d.ts +21 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +33 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/server/recap-image-route.d.ts.map +1 -1
- package/dist/server/recap-image-route.js +12 -3
- package/dist/server/recap-image-route.js.map +1 -1
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +30 -5
- package/docs/content/plan-plugin.md +107 -0
- package/docs/content/skills-guide.md +8 -0
- package/docs/content/visual-plans.md +2 -0
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +30 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiffBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA2B7E;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,KAAa;IACrD,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhC,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,GAAG,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CACzD,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACX,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;oBACvB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,0EAA0E;IAC1E,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAqC,EAAE,EAAE;QACpE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,QAAQ,GACZ,IAAI;YACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK;gBACL,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBAC1C,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aAC/C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACtB,CAAC,IAAI,CAAC,CAAC;YACP,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACtB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACpB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtB,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpB,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kFAAkF;AAElF,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAWxC,MAAM,gBAAgB,GAA2B;IAC/C,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,UAAU;IACd,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,MAAM;IACb,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,MAAM,iBAAiB,GAA2B;IAChD,eAAe,EAAE,wCAAwC;IACzD,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,cAAc;IAChC,eAAe,EAAE,oCAAoC;IACrD,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,8BAA8B;IAC9C,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,kBAAkB;IACjC,eAAe,EAAE,QAAQ;IACzB,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,WAAW,EAAE,iCAAiC;IAC9C,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,cAAc;IAC3B,kBAAkB,EAAE,wCAAwC;IAC5D,WAAW,EAAE,wCAAwC;IACrD,aAAa,EAAE,cAAc;IAC7B,aAAa,EAAE,cAAc;IAC7B,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,8BAA8B;IAC5C,aAAa,EAAE,wCAAwC;IACvD,cAAc,EAAE,sCAAsC;IACtD,oBAAoB,EAAE,cAAc;IACpC,qBAAqB,EAAE,wCAAwC;IAC/D,kBAAkB,EAAE,wCAAwC;IAC5D,sBAAsB,EAAE,cAAc;IACtC,mBAAmB,EAAE,wCAAwC;IAC7D,aAAa,EAAE,wCAAwC;IACvD,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,kBAAkB;IAChC,aAAa,EAAE,cAAc;IAC7B,UAAU,EAAE,wCAAwC;IACpD,wBAAwB,EAAE,oCAAoC;IAC9D,YAAY,EAAE,sCAAsC;IACpD,WAAW,EAAE,oCAAoC;IACjD,eAAe,EAAE,oCAAoC;IACrD,SAAS,EAAE,oCAAoC;CAChD,CAAC;AAEF,SAAS,iBAAiB,CAAC,KAAqB;IAC9C,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAiB;IAChD,MAAM,QAAQ,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1E,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IACzC,OAAO,CACL,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACtC,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAA6B;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS;YACT,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SACtC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,QAAwB,EAAE,SAAiB;IAC9D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC;YACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM;gBAC5C,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CACL,eAAgB,SAAS,EAAE,SAAS,YACjC,gBAAgB,IADR,GAAG,CAEP,CACR,CAAC;YACJ,CAAC;YACD,OAAO,yBAAiB,gBAAgB,IAAtB,GAAG,CAA2B,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,IAAI,EACJ,QAAQ,GAIT;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAiB,CAAC;YAChE,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,OAAO,4BAAG,WAAW,IAAI,IAAI,GAAI,CAAC;AACpC,CAAC;AAuBD,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,kEAAkE;AAClE,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,SAAS,SAAS,CAAC,OAAiB;IAClC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,CAAC;gBACX,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAe;IAClC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,0CAA0C;QAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,CAAC,GAAG,CAAC,CAAC;IACR,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kFAAkF;AAElF,MAAM,MAAM,GAAgC;IAC1C,KAAK,EAAE,0CAA0C;IACjD,OAAO,EAAE,mBAAmB;IAC5B,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF,MAAM,SAAS,GAAgC;IAC7C,KAAK,EAAE,0CAA0C;IACjD,OAAO,EAAE,mBAAmB;IAC5B,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,MAAM,UAAU,GAAgC;IAC9C,KAAK,EAAE,wCAAwC;IAC/C,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,uBAAuB;CACjC,CAAC;AAEF,MAAM,IAAI,GAAgC;IACxC,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;CACb,CAAC;AAEF,MAAM,aAAa,GACjB,qGAAqG,CAAC;AAExG,MAAM,eAAe,GACnB,iGAAiG,CAAC;AAEpG,MAAM,0BAA0B,GAAG,EAAE,CAAC;AACtC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC,SAAS,iBAAiB,CAAC,QAAiB;IAI1C,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;IACxD,MAAM,SAAS,GACb,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAsC;IAC1E,MAAM,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC;IACzB,OAAO,CACL,eAAM,SAAS,EAAE,eAAe,YAC9B,KAAC,qBAAqB,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,GACpD,CACR,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAA4B;IAC3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IACnE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EACnD,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAC1B,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAC/B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC/B,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EACtC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAC;IACF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC;IAC7C,MAAM,qBAAqB,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9E,MAAM,eAAe,GAAG,qBAAqB,GAAG,0BAA0B,CAAC;IAC3E,MAAM,QAAQ,GACZ,CAAC,WAAW,IAAI,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,aAAa,GACjB,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAElE,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;YACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,OAAO,CACL,mBAAS,SAAS,EAAC,6BAA6B,mBAAgB,OAAO,aACpE,KAAK,IAAI,cAAK,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAO,EACzD,eAAK,SAAS,EAAC,+DAA+D,aAE5E,eAAK,SAAS,EAAC,2FAA2F,aACxG,KAAC,YAAY,IAAC,SAAS,EAAC,uCAAuC,GAAG,EAClE,gBACE,SAAS,EAAC,sDAAsD,EAChE,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,aAEjC,eAAM,SAAS,EAAC,oFAAoF,YACjG,SAAS,CAAC,QAAQ,GACd,EACN,SAAS,CAAC,SAAS,IAAI,CACtB,eAAM,SAAS,EAAC,wEAAwE,YACrF,SAAS,CAAC,SAAS,GACf,CACR,IACI,EACP,gBAAM,SAAS,EAAC,yDAAyD,aACvE,gBAAM,SAAS,EAAC,wCAAwC,kBACpD,KAAK,IACF,EACP,gBAAM,SAAS,EAAC,kBAAkB,uBAAG,OAAO,IAAQ,IAC/C,EACP,eAAK,SAAS,EAAC,6TAA6T,aAC1U,KAAC,UAAU,IACT,MAAM,EAAE,IAAI,KAAK,SAAS,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EACjC,IAAI,EAAE,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACvC,KAAK,EAAC,SAAS,GACf,EACF,KAAC,UAAU,IACT,MAAM,EAAE,IAAI,KAAK,OAAO,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE,KAAC,WAAW,IAAC,SAAS,EAAC,UAAU,GAAG,EAC1C,KAAK,EAAC,OAAO,GACb,IACE,IACF,EAGL,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,+DAA+D,2BAExE,CACP,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CACrB,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAClE,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IACV,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,GACtB,CACH,EACA,CAAC,SAAS,IAAI,eAAe,IAAI,CAChC,kBACE,IAAI,EAAC,QAAQ,kDAEE,WAAW,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EACpD,SAAS,EAAC,uMAAuM,aAEjN,KAAC,gBAAgB,IACf,SAAS,EAAE,EAAE,CACX,sCAAsC,EACtC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CACzC,GACD,EACD,WAAW;gCACV,CAAC,CAAC,YAAY;gCACd,CAAC,CAAC,YAAY,qBAAqB,QAAQ,IACtC,CACV,IACG,EACL,OAAO,IAAI,YAAG,SAAS,EAAC,sBAAsB,YAAE,OAAO,GAAK,IACrD,CACX,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAClB,MAAM,EACN,OAAO,EACP,IAAI,EACJ,KAAK,GAMN;IACC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,iCAEb,OAAO,EAAE,OAAO,kBACF,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,wFAAwF,EACxF,MAAM;YACJ,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,+DAA+D,CACpE,aAEA,IAAI,EACJ,KAAK,IACC,CACV,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,SAAS,WAAW,CAAC,EACnB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,WAAW,GAMZ;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,YAC9B,cAAK,SAAS,EAAC,kDAAkD,YAC9D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;gBAC7B,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/B,OAAO,CACL,0BACE,KAAC,YAAY,IACX,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAC1B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAC/B,EACD,IAAI;gCACH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAC5B,KAAC,UAAU,IAET,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,IAFb,OAAO,GAAG,IAAI,EAAE,EAAE,CAGvB,CACH,CAAC,KAbI,OAAO,GAAG,EAAE,CAchB,CACP,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAC,UAAU,IAAW,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAArC,GAAG,CAAsC,CAAC;YACpE,CAAC,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAsC;IACvE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAC7D,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,YAAG,GAAG,CAAC,KAAK,IAAI,EAAE,GAAQ,EACxE,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,YAAG,GAAG,CAAC,KAAK,IAAI,EAAE,GAAQ,EACxE,eACE,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EACnB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CACrB,YAEA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GACV,EACP,KAAC,YAAY,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAChD,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,OAAO,GAKR;IACC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,iCAEb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,2LAA2L,aAErM,KAAC,gBAAgB,IAAC,SAAS,EAAC,mBAAmB,GAAG,EAClD,2BACG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAG,KAAK,qBAC9B,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAClB,IACA,CACV,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAe;IACpC,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACpC,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,yDAAyD;QACzD,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAClD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,QAAQ,EACR,QAAQ,EACR,IAAI,GAKL;IACC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,OAAO,CACL,eAAK,SAAS,EAAC,2DAA2D,aACxE,cAAK,SAAS,EAAC,uDAAuD,YACpE,cAAK,SAAS,EAAC,yBAAyB,YACrC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CACjC,KAAC,SAAS,IAER,GAAG,EAAE,IAAI,CAAC,IAAI,EACd,IAAI,EAAC,KAAK,EACV,QAAQ,EAAE,QAAQ,IAHb,OAAO,GAAG,EAAE,CAIjB,CACH,CAAC,GACE,GACF,EACN,cAAK,SAAS,EAAC,gCAAgC,YAC7C,cAAK,SAAS,EAAC,yBAAyB,YACrC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CACjC,KAAC,SAAS,IAER,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,IAAI,EAAC,KAAK,EACV,QAAQ,EAAE,QAAQ,IAHb,OAAO,GAAG,EAAE,CAIjB,CACH,CAAC,GACE,GACF,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,QAAQ,EACR,GAAG,EACH,IAAI,GAKL;IACC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CACL,eAAK,SAAS,EAAC,gDAAgD,aAC7D,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,GAAI,EAClD,eAAM,SAAS,EAAC,0BAA0B,GAAG,EAC7C,eAAM,SAAS,EAAE,eAAe,kBAAU,IACtC,CACP,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;IACxC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAC7D,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,YAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAClD,EACP,eACE,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EACnB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CACrB,YAEA,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GACjB,EACP,KAAC,YAAY,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAChD,CACP,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,aAAa,GAAG,2CAA2C,CAAC;AAElE,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAA4B;IACtE,MAAM,KAAK,GAAG,CAAC,IAAuB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAa,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAE9C,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,4CAClC,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,QAAQ,IAAC,OAAO,EAAC,eAAe,EAAC,SAAS,EAAC,SAAS,yBAE1C,EACX,KAAC,QAAQ,IACP,EAAE,EAAC,eAAe,EAClB,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAC1B,WAAW,EAAC,YAAY,EACxB,QAAQ,EAAE,CAAC,QAAQ,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,GAEtD,IACE,EACN,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,QAAQ,IAAC,OAAO,EAAC,eAAe,EAAC,SAAS,EAAC,SAAS,yBAE1C,EACX,KAAC,QAAQ,IACP,EAAE,EAAC,eAAe,EAClB,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAC1B,WAAW,EAAC,IAAI,EAChB,QAAQ,EAAE,CAAC,QAAQ,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,GAEtD,IACE,IACF,EAEN,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,uBAAkB,EAC/C,KAAC,SAAS,IACR,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,QAAQ,EACnB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAiB,EAAE,CAAC,EAC5D,OAAO,EAAE;4BACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;4BACtC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE;yBAClD,GACD,IACE,EAEN,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,QAAQ,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,SAAS,uBAExC,EACX,KAAC,WAAW,IACV,EAAE,EAAC,aAAa,EAChB,UAAU,EAAE,KAAK,EACjB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,IAAI,CAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,QAAQ,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAC1D,IACE,EAEN,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,QAAQ,IAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,sBAEvC,EACX,KAAC,WAAW,IACV,EAAE,EAAC,YAAY,EACf,UAAU,EAAE,KAAK,EACjB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,QAAQ,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GACzD,IACE,IACF,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport {\n IconChevronRight,\n IconColumns,\n IconDotsVertical,\n IconFileDiff,\n IconList,\n} from \"@tabler/icons-react\";\nimport { common, createLowlight } from \"lowlight\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type { DiffData, DiffMode } from \"./diff.config.js\";\nimport { DevInput, DevLabel, DevTextarea, DevSelect } from \"./dev-doc-ui.js\";\n\n/**\n * GitHub-style before/after diff block. The read renderer computes a line-level\n * diff, then renders it either unified (one column, `+`/`−` gutters) or split\n * (side-by-side). Long unchanged runs collapse into an expandable \"N unchanged\n * lines\" row (progressive disclosure). The read surface keeps the GitHub diff\n * shape while using the framework Tailwind theme tokens, so it follows each\n * host app's light/dark appearance instead of bringing its own palette.\n *\n * Lives in core so any app can register the dev-doc block. The line differ is\n * inlined (a small LCS-based `diffLines`) rather than pulling the `diff` package\n * into core; the output shape (`{ value, added, removed }` change records) is\n * identical to what the read renderer consumed before.\n *\n * Editing is panel-driven (config-style, like the HTML block): two monospace\n * textareas (Before / After) plus filename, language, and mode controls.\n */\n\n/* ── Inline line differ (LCS) — replaces jsdiff `diffLines` ─────────────────── */\n\ninterface Change {\n value: string;\n added?: boolean;\n removed?: boolean;\n}\n\n/**\n * Split text into lines, each KEEPING its trailing newline (so the change\n * `value`s concatenate back to the original and `splitLines` below behaves the\n * same as it did against jsdiff output).\n */\nfunction toLineTokens(text: string): string[] {\n if (text === \"\") return [];\n const out: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (text[i] === \"\\n\") {\n out.push(text.slice(start, i + 1));\n start = i + 1;\n }\n }\n if (start < text.length) out.push(text.slice(start));\n return out;\n}\n\n/**\n * A minimal line-level diff producing jsdiff-compatible `Change[]` records\n * (`{ value }` for context, `{ value, added: true }`, `{ value, removed: true }`).\n * Uses a classic LCS table over line tokens; the inputs here are short code\n * snippets so the O(n·m) table is fine. Removed lines are emitted before added\n * lines within a change region, matching jsdiff's ordering.\n */\nexport function diffLines(before: string, after: string): Change[] {\n const a = toLineTokens(before);\n const b = toLineTokens(after);\n const n = a.length;\n const m = b.length;\n const cells = (n + 1) * (m + 1);\n\n if (cells > MAX_DIFF_LCS_CELLS) {\n return [\n ...(before ? [{ value: before, removed: true }] : []),\n ...(after ? [{ value: after, added: true }] : []),\n ];\n }\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n new Array<number>(m + 1).fill(0),\n );\n for (let i = n - 1; i >= 0; i -= 1) {\n for (let j = m - 1; j >= 0; j -= 1) {\n lcs[i][j] =\n a[i] === b[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n const changes: Change[] = [];\n // Push a token onto the last change if same kind, else open a new change.\n const push = (value: string, kind: \"context\" | \"added\" | \"removed\") => {\n const last = changes[changes.length - 1];\n const sameKind =\n last &&\n Boolean(last.added) === (kind === \"added\") &&\n Boolean(last.removed) === (kind === \"removed\");\n if (sameKind) {\n last.value += value;\n } else {\n changes.push({\n value,\n added: kind === \"added\" ? true : undefined,\n removed: kind === \"removed\" ? true : undefined,\n });\n }\n };\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n push(a[i], \"context\");\n i += 1;\n j += 1;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n push(a[i], \"removed\");\n i += 1;\n } else {\n push(b[j], \"added\");\n j += 1;\n }\n }\n while (i < n) {\n push(a[i], \"removed\");\n i += 1;\n }\n while (j < m) {\n push(b[j], \"added\");\n j += 1;\n }\n return changes;\n}\n\n/* ── Syntax highlighting ───────────────────────────────────────────────────── */\n\nconst lowlight = createLowlight(common);\n\ntype LowlightNode = {\n type: string;\n value?: string;\n properties?: {\n className?: string[] | string;\n };\n children?: LowlightNode[];\n};\n\nconst LANGUAGE_ALIASES: Record<string, string> = {\n cjs: \"javascript\",\n cts: \"typescript\",\n htm: \"html\",\n js: \"javascript\",\n jsonc: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n mdx: \"markdown\",\n mjs: \"javascript\",\n mts: \"typescript\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n tsx: \"tsx\",\n yml: \"yaml\",\n zsh: \"bash\",\n};\n\nconst TOKEN_CLASS_NAMES: Record<string, string> = {\n \"hljs-addition\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-attr\": \"text-primary\",\n \"hljs-attribute\": \"text-primary\",\n \"hljs-built_in\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-bullet\": \"text-primary\",\n \"hljs-comment\": \"text-muted-foreground italic\",\n \"hljs-deletion\": \"text-destructive\",\n \"hljs-doctag\": \"text-destructive\",\n \"hljs-emphasis\": \"italic\",\n \"hljs-formula\": \"text-destructive\",\n \"hljs-keyword\": \"text-destructive\",\n \"hljs-link\": \"text-primary underline-offset-2\",\n \"hljs-literal\": \"text-primary\",\n \"hljs-meta\": \"text-primary\",\n \"hljs-meta-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-name\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-number\": \"text-primary\",\n \"hljs-params\": \"text-primary\",\n \"hljs-property\": \"text-primary\",\n \"hljs-quote\": \"text-muted-foreground italic\",\n \"hljs-regexp\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-section\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-selector-attr\": \"text-primary\",\n \"hljs-selector-class\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-id\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-pseudo\": \"text-primary\",\n \"hljs-selector-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-strong\": \"font-semibold\",\n \"hljs-subst\": \"text-destructive\",\n \"hljs-symbol\": \"text-primary\",\n \"hljs-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-template-variable\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-title\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-type\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-variable\": \"text-amber-700 dark:text-amber-300\",\n language_: \"text-amber-700 dark:text-amber-300\",\n};\n\nfunction normalizeLanguage(value?: string | null): string | null {\n const raw = value?.trim().toLowerCase();\n if (!raw) return null;\n const normalized = LANGUAGE_ALIASES[raw] ?? raw;\n return lowlight.registered(normalized) ? normalized : null;\n}\n\nfunction getLanguageFromFilename(filename?: string): string | null {\n const basename = filename?.split(\"/\").pop()?.toLowerCase();\n if (!basename) return null;\n if (basename === \"dockerfile\") return normalizeLanguage(\"bash\");\n if (basename === \"makefile\") return normalizeLanguage(\"makefile\");\n const ext = basename.includes(\".\") ? basename.split(\".\").pop() : basename;\n return normalizeLanguage(ext);\n}\n\nfunction resolveDiffLanguage(data: DiffData): string {\n return (\n normalizeLanguage(data.language) ??\n getLanguageFromFilename(data.filename) ??\n \"plaintext\"\n );\n}\n\nfunction tokenClassName(className?: string[] | string): string | undefined {\n const classes = Array.isArray(className)\n ? className\n : className\n ? className.split(/\\s+/)\n : [];\n const mapped = classes\n .map((name) => TOKEN_CLASS_NAMES[name])\n .filter(Boolean)\n .join(\" \");\n return mapped || undefined;\n}\n\nfunction hastToReact(children: LowlightNode[], keyPrefix: string): ReactNode[] {\n return children.map((node, index) => {\n if (node.type === \"text\") return node.value ?? \"\";\n if (node.type === \"element\") {\n const key = `${keyPrefix}${index}`;\n const renderedChildren = node.children?.length\n ? hastToReact(node.children, `${key}-`)\n : null;\n const className = tokenClassName(node.properties?.className);\n if (className) {\n return (\n <span key={key} className={className}>\n {renderedChildren}\n </span>\n );\n }\n return <span key={key}>{renderedChildren}</span>;\n }\n return null;\n });\n}\n\nfunction SyntaxHighlightedLine({\n code,\n language,\n}: {\n code: string;\n language: string;\n}) {\n const highlighted = useMemo(() => {\n if (!code.trim() || language === \"plaintext\" || language === \"text\") {\n return null;\n }\n try {\n const tree = lowlight.highlight(language, code) as LowlightNode;\n return hastToReact(tree.children ?? [], `${language}-`);\n } catch {\n return null;\n }\n }, [code, language]);\n\n return <>{highlighted ?? code}</>;\n}\n\n/* ── Diff model ────────────────────────────────────────────────────────────── */\n\ntype DiffRowKind = \"context\" | \"added\" | \"removed\";\n\ninterface DiffRow {\n kind: DiffRowKind;\n /** Line number in the OLD file (omitted for added rows). */\n oldNo?: number;\n /** Line number in the NEW file (omitted for removed rows). */\n newNo?: number;\n text: string;\n}\n\n/** A contiguous run of context lines collapsed when longer than the threshold. */\ninterface CollapsedRun {\n collapsed: true;\n rows: DiffRow[];\n}\n\ntype DiffSegment = DiffRow | CollapsedRun;\n\n/** Number of context lines above which an unchanged run is collapsed. */\nconst COLLAPSE_THRESHOLD = 6;\n/** Context lines kept visible at each edge of a collapsed run. */\nconst CONTEXT_EDGE = 3;\n\n/**\n * Split a change `value` into individual lines. Most hunks carry a trailing\n * newline; drop the empty final element it produces so a 2-line change does not\n * render a phantom 3rd blank line.\n */\nfunction splitLines(value: string): string[] {\n const lines = value.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/** Flatten change objects into numbered diff rows. */\nfunction buildRows(changes: Change[]): DiffRow[] {\n const rows: DiffRow[] = [];\n let oldNo = 0;\n let newNo = 0;\n for (const change of changes) {\n const lines = splitLines(change.value);\n for (const text of lines) {\n if (change.added) {\n newNo += 1;\n rows.push({ kind: \"added\", newNo, text });\n } else if (change.removed) {\n oldNo += 1;\n rows.push({ kind: \"removed\", oldNo, text });\n } else {\n oldNo += 1;\n newNo += 1;\n rows.push({ kind: \"context\", oldNo, newNo, text });\n }\n }\n }\n return rows;\n}\n\n/**\n * Group rows into segments, collapsing interior runs of >COLLAPSE_THRESHOLD\n * context rows (keeping CONTEXT_EDGE visible at each side). Leading/trailing runs\n * collapse too, but keep only the inner edge visible.\n */\nfunction segmentRows(rows: DiffRow[]): DiffSegment[] {\n const segments: DiffSegment[] = [];\n let i = 0;\n while (i < rows.length) {\n if (rows[i].kind !== \"context\") {\n segments.push(rows[i]);\n i += 1;\n continue;\n }\n // Gather the full contiguous context run.\n let j = i;\n while (j < rows.length && rows[j].kind === \"context\") j += 1;\n const run = rows.slice(i, j);\n if (run.length <= COLLAPSE_THRESHOLD) {\n for (const row of run) segments.push(row);\n } else {\n const atStart = i === 0;\n const atEnd = j === rows.length;\n const head = atStart ? [] : run.slice(0, CONTEXT_EDGE);\n const tail = atEnd ? [] : run.slice(run.length - CONTEXT_EDGE);\n const hidden = run.slice(head.length, run.length - tail.length);\n for (const row of head) segments.push(row);\n if (hidden.length > 0) segments.push({ collapsed: true, rows: hidden });\n for (const row of tail) segments.push(row);\n }\n i = j;\n }\n return segments;\n}\n\n/* ── Theme-aware row styling (light + dark) ────────────────────────────────── */\n\nconst ROW_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/10 dark:bg-emerald-500/15\",\n removed: \"bg-destructive/10\",\n context: \"bg-background\",\n};\n\nconst GUTTER_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/15 dark:bg-emerald-500/20\",\n removed: \"bg-destructive/15\",\n context: \"bg-muted/60\",\n};\n\nconst SIGN_COLOR: Record<DiffRowKind, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n removed: \"text-destructive\",\n context: \"text-muted-foreground\",\n};\n\nconst SIGN: Record<DiffRowKind, string> = {\n added: \"+\",\n removed: \"−\",\n context: \" \",\n};\n\nconst LINE_NO_CLASS =\n \"select-none px-2 py-0 text-right font-mono text-[12px] leading-5 text-muted-foreground tabular-nums\";\n\nconst DIFF_LINE_CLASS =\n \"block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono text-[12px] leading-5 text-foreground\";\n\nconst DEFAULT_VISIBLE_DIFF_LINES = 15;\nconst MAX_DIFF_LCS_CELLS = 1_000_000;\n\nfunction splitDiffFilename(filename?: string): {\n basename: string;\n directory: string | null;\n} {\n const value = filename?.trim() || \"diff\";\n const segments = value.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? value;\n const directory =\n segments.length > 1 ? segments.slice(0, -1).join(\"/\") : null;\n return { basename, directory };\n}\n\nfunction DiffLineText({ language, text }: { language: string; text: string }) {\n const code = text || \" \";\n return (\n <span className={DIFF_LINE_CLASS}>\n <SyntaxHighlightedLine code={code} language={language} />\n </span>\n );\n}\n\n/* ── Read ──────────────────────────────────────────────────────────────────── */\n\nfunction DiffRead({ data, blockId, title, summary }: BlockReadProps<DiffData>) {\n const [mode, setMode] = useState<DiffMode>(data.mode ?? \"unified\");\n const [expanded, setExpanded] = useState<Set<number>>(() => new Set());\n const [showAllRows, setShowAllRows] = useState(false);\n\n const rows = useMemo(\n () => buildRows(diffLines(data.before, data.after)),\n [data.before, data.after],\n );\n const language = useMemo(\n () => resolveDiffLanguage(data),\n [data.filename, data.language],\n );\n const fileParts = useMemo(\n () => splitDiffFilename(data.filename),\n [data.filename],\n );\n const splitLineCount = useMemo(() => pairSplitRows(rows).length, [rows]);\n\n const added = rows.filter((r) => r.kind === \"added\").length;\n const removed = rows.filter((r) => r.kind === \"removed\").length;\n const unchanged = data.before === data.after;\n const totalVisibleLineCount = mode === \"split\" ? splitLineCount : rows.length;\n const shouldLimitRows = totalVisibleLineCount > DEFAULT_VISIBLE_DIFF_LINES;\n const rowLimit =\n !showAllRows && shouldLimitRows ? DEFAULT_VISIBLE_DIFF_LINES : undefined;\n const displayedRows =\n mode === \"unified\" && rowLimit ? rows.slice(0, rowLimit) : rows;\n\n const toggleRun = (index: number) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n\n return (\n <section className=\"plan-block group/diff-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\n {/* Header: filename, path, +/− counts, mode toggle. */}\n <div className=\"flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5\">\n <IconFileDiff className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 font-mono\"\n title={data.filename || undefined}\n >\n <span className=\"min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground\">\n {fileParts.basename}\n </span>\n {fileParts.directory && (\n <span className=\"min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70\">\n {fileParts.directory}\n </span>\n )}\n </span>\n <span className=\"ml-1 flex shrink-0 items-center gap-2 font-mono text-xs\">\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n +{added}\n </span>\n <span className=\"text-destructive\">−{removed}</span>\n </span>\n <div className=\"pointer-events-none ml-auto flex shrink-0 items-center overflow-hidden rounded-md border border-border bg-background opacity-0 transition-opacity group-hover/diff-block:pointer-events-auto group-hover/diff-block:opacity-100 group-focus-within/diff-block:pointer-events-auto group-focus-within/diff-block:opacity-100\">\n <ModeButton\n active={mode === \"unified\"}\n onClick={() => setMode(\"unified\")}\n icon={<IconList className=\"size-3.5\" />}\n label=\"Unified\"\n />\n <ModeButton\n active={mode === \"split\"}\n onClick={() => setMode(\"split\")}\n icon={<IconColumns className=\"size-3.5\" />}\n label=\"Split\"\n />\n </div>\n </div>\n\n {/* Body. */}\n {unchanged ? (\n <div className=\"px-4 py-6 text-center font-mono text-sm text-muted-foreground\">\n No changes\n </div>\n ) : mode === \"split\" ? (\n <SplitView rows={rows} language={language} rowLimit={rowLimit} />\n ) : (\n <UnifiedView\n rows={displayedRows}\n language={language}\n expanded={expanded}\n onToggleRun={toggleRun}\n />\n )}\n {!unchanged && shouldLimitRows && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={showAllRows}\n onClick={() => setShowAllRows((current) => !current)}\n className=\"flex h-7 w-full items-center justify-center gap-1.5 border-t border-border bg-background px-2 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/70 hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3 shrink-0 transition-transform\",\n showAllRows ? \"-rotate-90\" : \"rotate-90\",\n )}\n />\n {showAllRows\n ? \"Show fewer\"\n : `Show all ${totalVisibleLineCount} lines`}\n </button>\n )}\n </div>\n {summary && <p className=\"mt-5 text-plan-muted\">{summary}</p>}\n </section>\n );\n}\n\nfunction ModeButton({\n active,\n onClick,\n icon,\n label,\n}: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"flex cursor-pointer items-center gap-1 px-2 py-1 text-xs font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted/80 hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\n/* ── Unified view ──────────────────────────────────────────────────────────── */\n\nfunction UnifiedView({\n rows,\n language,\n expanded,\n onToggleRun,\n}: {\n rows: DiffRow[];\n language: string;\n expanded: Set<number>;\n onToggleRun: (index: number) => void;\n}) {\n const segments = useMemo(() => segmentRows(rows), [rows]);\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\">\n <div className=\"w-max min-w-full font-mono text-[13px] leading-5\">\n {segments.map((segment, idx) => {\n if (\"collapsed\" in segment) {\n const key = runIndex++;\n const open = expanded.has(key);\n return (\n <div key={`run-${key}`}>\n <CollapsedRow\n count={segment.rows.length}\n open={open}\n onClick={() => onToggleRun(key)}\n />\n {open &&\n segment.rows.map((row, ri) => (\n <UnifiedRow\n key={`run-${key}-${ri}`}\n row={row}\n language={language}\n />\n ))}\n </div>\n );\n }\n return <UnifiedRow key={idx} row={segment} language={language} />;\n })}\n </div>\n </div>\n );\n}\n\nfunction UnifiedRow({ language, row }: { language: string; row: DiffRow }) {\n return (\n <div className={cn(\"flex min-h-5 min-w-full\", ROW_BG[row.kind])}>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.oldNo ?? \"\"}</span>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.newNo ?? \"\"}</span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {SIGN[row.kind]}\n </span>\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\nfunction CollapsedRow({\n count,\n open,\n onClick,\n}: {\n count: number;\n open: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n className=\"flex w-full cursor-pointer items-center gap-2 border-y border-border bg-muted/70 px-3 py-1 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconDotsVertical className=\"size-3.5 shrink-0\" />\n <span>\n {open ? \"Hide\" : \"Show\"} {count} unchanged line\n {count === 1 ? \"\" : \"s\"}\n </span>\n </button>\n );\n}\n\n/* ── Split (side-by-side) view ─────────────────────────────────────────────── */\n\ninterface SplitRow {\n left?: DiffRow;\n right?: DiffRow;\n}\n\n/**\n * Pair removed lines (left) with added lines (right) so a modification shows the\n * old and new side by side; context lines mirror on both columns. Leftover adds\n * or removes fall through as half-empty rows (GitHub split behavior).\n */\nfunction pairSplitRows(rows: DiffRow[]): SplitRow[] {\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n const row = rows[i];\n if (row.kind === \"context\") {\n out.push({ left: row, right: row });\n i += 1;\n continue;\n }\n // Collect a contiguous block of removed-then-added rows.\n const removed: DiffRow[] = [];\n const added: DiffRow[] = [];\n while (i < rows.length && rows[i].kind === \"removed\")\n removed.push(rows[i++]);\n while (i < rows.length && rows[i].kind === \"added\") added.push(rows[i++]);\n const max = Math.max(removed.length, added.length);\n for (let k = 0; k < max; k += 1) {\n out.push({ left: removed[k], right: added[k] });\n }\n }\n return out;\n}\n\nfunction SplitView({\n language,\n rowLimit,\n rows,\n}: {\n language: string;\n rowLimit?: number;\n rows: DiffRow[];\n}) {\n const pairs = useMemo(() => pairSplitRows(rows), [rows]);\n const displayedPairs = rowLimit ? pairs.slice(0, rowLimit) : pairs;\n return (\n <div className=\"flex w-full bg-background font-mono text-[12px] leading-5\">\n <div className=\"min-w-0 flex-1 overflow-x-auto border-r border-border\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`old-${idx}`}\n row={pair.left}\n side=\"old\"\n language={language}\n />\n ))}\n </div>\n </div>\n <div className=\"min-w-0 flex-1 overflow-x-auto\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`new-${idx}`}\n row={pair.right}\n side=\"new\"\n language={language}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SplitCell({\n language,\n row,\n side,\n}: {\n language: string;\n row?: DiffRow;\n side: \"old\" | \"new\";\n}) {\n if (!row) {\n return (\n <div className=\"flex min-h-5 min-w-full bg-muted/40 opacity-70\">\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")} />\n <span className=\"w-6 shrink-0 bg-muted/60\" />\n <span className={DIFF_LINE_CLASS}> </span>\n </div>\n );\n }\n const sign = side === \"old\" ? \"−\" : \"+\";\n const showSign = row.kind !== \"context\";\n return (\n <div className={cn(\"flex min-h-5 min-w-full\", ROW_BG[row.kind])}>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>\n {side === \"old\" ? (row.oldNo ?? \"\") : (row.newNo ?? \"\")}\n </span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {showSign ? sign : \" \"}\n </span>\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/* ── Edit (panel) ──────────────────────────────────────────────────────────── */\n\nconst codeAreaClass = \"min-h-[140px] font-mono text-xs leading-5\";\n\nfunction DiffEdit({ data, onChange, editable }: BlockEditProps<DiffData>) {\n const patch = (next: Partial<DiffData>) => onChange({ ...data, ...next });\n const mode: DiffMode = data.mode ?? \"unified\";\n\n return (\n <div className=\"flex flex-col gap-3\" data-plan-interactive>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-filename\" className=\"text-xs\">\n Filename\n </DevLabel>\n <DevInput\n id=\"diff-filename\"\n value={data.filename ?? \"\"}\n placeholder=\"src/add.ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ filename: event.target.value || undefined })\n }\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-language\" className=\"text-xs\">\n Language\n </DevLabel>\n <DevInput\n id=\"diff-language\"\n value={data.language ?? \"\"}\n placeholder=\"ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ language: event.target.value || undefined })\n }\n />\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel className=\"text-xs\">Layout</DevLabel>\n <DevSelect\n value={mode}\n disabled={!editable}\n onValueChange={(value) => patch({ mode: value as DiffMode })}\n options={[\n { value: \"unified\", label: \"Unified\" },\n { value: \"split\", label: \"Split (side-by-side)\" },\n ]}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-before\" className=\"text-xs\">\n Before\n </DevLabel>\n <DevTextarea\n id=\"diff-before\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.before}\n disabled={!editable}\n onChange={(event) => patch({ before: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-after\" className=\"text-xs\">\n After\n </DevLabel>\n <DevTextarea\n id=\"diff-after\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.after}\n disabled={!editable}\n onChange={(event) => patch({ after: event.target.value })}\n />\n </div>\n </div>\n );\n}\n\nexport { DiffRead, DiffEdit };\n"]}
|
|
1
|
+
{"version":3,"file":"DiffBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport {\n IconChevronRight,\n IconColumns,\n IconDotsVertical,\n IconFileDiff,\n IconList,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { common, createLowlight } from \"lowlight\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type { DiffAnnotation, DiffData, DiffMode } from \"./diff.config.js\";\nimport {\n AnnotationGutterMarker,\n AnnotationNoteRail,\n buildLineMarkerMap,\n hasRailAnnotations,\n resolveAnnotations,\n type ResolvedAnnotation,\n} from \"./annotation-rail.js\";\nimport { DevInput, DevLabel, DevTextarea, DevSelect } from \"./dev-doc-ui.js\";\n\n/**\n * GitHub-style before/after diff block. The read renderer computes a line-level\n * diff, then renders it either unified (one column, `+`/`−` gutters) or split\n * (side-by-side). Long unchanged runs collapse into an expandable \"N unchanged\n * lines\" row (progressive disclosure). The read surface keeps the GitHub diff\n * shape while using the framework Tailwind theme tokens, so it follows each\n * host app's light/dark appearance instead of bringing its own palette.\n *\n * Lives in core so any app can register the dev-doc block. The line differ is\n * inlined (a small LCS-based `diffLines`) rather than pulling the `diff` package\n * into core; the output shape (`{ value, added, removed }` change records) is\n * identical to what the read renderer consumed before.\n *\n * Editing is panel-driven (config-style, like the HTML block): two monospace\n * textareas (Before / After) plus filename, language, and mode controls.\n */\n\n/* ── Inline line differ (LCS) — replaces jsdiff `diffLines` ─────────────────── */\n\ninterface Change {\n value: string;\n added?: boolean;\n removed?: boolean;\n}\n\n/**\n * Split text into lines, each KEEPING its trailing newline (so the change\n * `value`s concatenate back to the original and `splitLines` below behaves the\n * same as it did against jsdiff output).\n */\nfunction toLineTokens(text: string): string[] {\n if (text === \"\") return [];\n const out: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (text[i] === \"\\n\") {\n out.push(text.slice(start, i + 1));\n start = i + 1;\n }\n }\n if (start < text.length) out.push(text.slice(start));\n return out;\n}\n\n/**\n * A minimal line-level diff producing jsdiff-compatible `Change[]` records\n * (`{ value }` for context, `{ value, added: true }`, `{ value, removed: true }`).\n * Uses a classic LCS table over line tokens; the inputs here are short code\n * snippets so the O(n·m) table is fine. Removed lines are emitted before added\n * lines within a change region, matching jsdiff's ordering.\n */\nexport function diffLines(before: string, after: string): Change[] {\n const a = toLineTokens(before);\n const b = toLineTokens(after);\n const n = a.length;\n const m = b.length;\n const cells = (n + 1) * (m + 1);\n\n if (cells > MAX_DIFF_LCS_CELLS) {\n return [\n ...(before ? [{ value: before, removed: true }] : []),\n ...(after ? [{ value: after, added: true }] : []),\n ];\n }\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n new Array<number>(m + 1).fill(0),\n );\n for (let i = n - 1; i >= 0; i -= 1) {\n for (let j = m - 1; j >= 0; j -= 1) {\n lcs[i][j] =\n a[i] === b[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n const changes: Change[] = [];\n // Push a token onto the last change if same kind, else open a new change.\n const push = (value: string, kind: \"context\" | \"added\" | \"removed\") => {\n const last = changes[changes.length - 1];\n const sameKind =\n last &&\n Boolean(last.added) === (kind === \"added\") &&\n Boolean(last.removed) === (kind === \"removed\");\n if (sameKind) {\n last.value += value;\n } else {\n changes.push({\n value,\n added: kind === \"added\" ? true : undefined,\n removed: kind === \"removed\" ? true : undefined,\n });\n }\n };\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n push(a[i], \"context\");\n i += 1;\n j += 1;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n push(a[i], \"removed\");\n i += 1;\n } else {\n push(b[j], \"added\");\n j += 1;\n }\n }\n while (i < n) {\n push(a[i], \"removed\");\n i += 1;\n }\n while (j < m) {\n push(b[j], \"added\");\n j += 1;\n }\n return changes;\n}\n\n/* ── Syntax highlighting ───────────────────────────────────────────────────── */\n\nconst lowlight = createLowlight(common);\n\ntype LowlightNode = {\n type: string;\n value?: string;\n properties?: {\n className?: string[] | string;\n };\n children?: LowlightNode[];\n};\n\nconst LANGUAGE_ALIASES: Record<string, string> = {\n cjs: \"javascript\",\n cts: \"typescript\",\n htm: \"html\",\n js: \"javascript\",\n jsonc: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n mdx: \"markdown\",\n mjs: \"javascript\",\n mts: \"typescript\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n tsx: \"tsx\",\n yml: \"yaml\",\n zsh: \"bash\",\n};\n\nconst TOKEN_CLASS_NAMES: Record<string, string> = {\n \"hljs-addition\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-attr\": \"text-primary\",\n \"hljs-attribute\": \"text-primary\",\n \"hljs-built_in\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-bullet\": \"text-primary\",\n \"hljs-comment\": \"text-muted-foreground italic\",\n \"hljs-deletion\": \"text-destructive\",\n \"hljs-doctag\": \"text-destructive\",\n \"hljs-emphasis\": \"italic\",\n \"hljs-formula\": \"text-destructive\",\n \"hljs-keyword\": \"text-destructive\",\n \"hljs-link\": \"text-primary underline-offset-2\",\n \"hljs-literal\": \"text-primary\",\n \"hljs-meta\": \"text-primary\",\n \"hljs-meta-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-name\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-number\": \"text-primary\",\n \"hljs-params\": \"text-primary\",\n \"hljs-property\": \"text-primary\",\n \"hljs-quote\": \"text-muted-foreground italic\",\n \"hljs-regexp\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-section\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-selector-attr\": \"text-primary\",\n \"hljs-selector-class\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-id\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-pseudo\": \"text-primary\",\n \"hljs-selector-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-strong\": \"font-semibold\",\n \"hljs-subst\": \"text-destructive\",\n \"hljs-symbol\": \"text-primary\",\n \"hljs-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-template-variable\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-title\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-type\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-variable\": \"text-amber-700 dark:text-amber-300\",\n language_: \"text-amber-700 dark:text-amber-300\",\n};\n\nfunction normalizeLanguage(value?: string | null): string | null {\n const raw = value?.trim().toLowerCase();\n if (!raw) return null;\n const normalized = LANGUAGE_ALIASES[raw] ?? raw;\n return lowlight.registered(normalized) ? normalized : null;\n}\n\nfunction getLanguageFromFilename(filename?: string): string | null {\n const basename = filename?.split(\"/\").pop()?.toLowerCase();\n if (!basename) return null;\n if (basename === \"dockerfile\") return normalizeLanguage(\"bash\");\n if (basename === \"makefile\") return normalizeLanguage(\"makefile\");\n const ext = basename.includes(\".\") ? basename.split(\".\").pop() : basename;\n return normalizeLanguage(ext);\n}\n\nfunction resolveDiffLanguage(data: DiffData): string {\n return (\n normalizeLanguage(data.language) ??\n getLanguageFromFilename(data.filename) ??\n \"plaintext\"\n );\n}\n\nfunction tokenClassName(className?: string[] | string): string | undefined {\n const classes = Array.isArray(className)\n ? className\n : className\n ? className.split(/\\s+/)\n : [];\n const mapped = classes\n .map((name) => TOKEN_CLASS_NAMES[name])\n .filter(Boolean)\n .join(\" \");\n return mapped || undefined;\n}\n\nfunction hastToReact(children: LowlightNode[], keyPrefix: string): ReactNode[] {\n return children.map((node, index) => {\n if (node.type === \"text\") return node.value ?? \"\";\n if (node.type === \"element\") {\n const key = `${keyPrefix}${index}`;\n const renderedChildren = node.children?.length\n ? hastToReact(node.children, `${key}-`)\n : null;\n const className = tokenClassName(node.properties?.className);\n if (className) {\n return (\n <span key={key} className={className}>\n {renderedChildren}\n </span>\n );\n }\n return <span key={key}>{renderedChildren}</span>;\n }\n return null;\n });\n}\n\nfunction SyntaxHighlightedLine({\n code,\n language,\n}: {\n code: string;\n language: string;\n}) {\n const highlighted = useMemo(() => {\n if (!code.trim() || language === \"plaintext\" || language === \"text\") {\n return null;\n }\n try {\n const tree = lowlight.highlight(language, code) as LowlightNode;\n return hastToReact(tree.children ?? [], `${language}-`);\n } catch {\n return null;\n }\n }, [code, language]);\n\n return <>{highlighted ?? code}</>;\n}\n\n/* ── Diff model ────────────────────────────────────────────────────────────── */\n\ntype DiffRowKind = \"context\" | \"added\" | \"removed\";\n\ninterface DiffRow {\n kind: DiffRowKind;\n /** Line number in the OLD file (omitted for added rows). */\n oldNo?: number;\n /** Line number in the NEW file (omitted for removed rows). */\n newNo?: number;\n text: string;\n}\n\n/** A contiguous run of context lines collapsed when longer than the threshold. */\ninterface CollapsedRun {\n collapsed: true;\n rows: DiffRow[];\n}\n\ntype DiffSegment = DiffRow | CollapsedRun;\n\n/** Which column a split-view row belongs to (the unified view passes nothing). */\ntype RowSide = \"old\" | \"new\";\n\n/**\n * Resolve the markers landing on a row. `side` scopes the lookup to one column\n * in the split view (so a left cell only lights from `before` annotations and a\n * right cell from `after`); the unified view omits it to merge both sides.\n */\ntype MarkersForRow = (\n row: DiffRow,\n side?: RowSide,\n) => ResolvedAnnotation<DiffAnnotation>[];\n\n/** The default side an annotation targets when `side` is omitted. */\nfunction annotationSide(annotation: DiffAnnotation): \"before\" | \"after\" {\n return annotation.side === \"before\" ? \"before\" : \"after\";\n}\n\n/**\n * Count 1-based source lines in a side's text, matching how `buildRows` numbers\n * `oldNo`/`newNo`: a trailing newline does not add a phantom final line.\n */\nfunction countLines(text: string): number {\n if (text === \"\") return 0;\n return splitLines(text).length;\n}\n\n/** Number of context lines above which an unchanged run is collapsed. */\nconst COLLAPSE_THRESHOLD = 6;\n/** Context lines kept visible at each edge of a collapsed run. */\nconst CONTEXT_EDGE = 3;\n\n/**\n * Split a change `value` into individual lines. Most hunks carry a trailing\n * newline; drop the empty final element it produces so a 2-line change does not\n * render a phantom 3rd blank line.\n */\nfunction splitLines(value: string): string[] {\n const lines = value.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/** Flatten change objects into numbered diff rows. */\nfunction buildRows(changes: Change[]): DiffRow[] {\n const rows: DiffRow[] = [];\n let oldNo = 0;\n let newNo = 0;\n for (const change of changes) {\n const lines = splitLines(change.value);\n for (const text of lines) {\n if (change.added) {\n newNo += 1;\n rows.push({ kind: \"added\", newNo, text });\n } else if (change.removed) {\n oldNo += 1;\n rows.push({ kind: \"removed\", oldNo, text });\n } else {\n oldNo += 1;\n newNo += 1;\n rows.push({ kind: \"context\", oldNo, newNo, text });\n }\n }\n }\n return rows;\n}\n\n/**\n * Group rows into segments, collapsing interior runs of >COLLAPSE_THRESHOLD\n * context rows (keeping CONTEXT_EDGE visible at each side). Leading/trailing runs\n * collapse too, but keep only the inner edge visible.\n *\n * `isAnchored` marks context rows that carry an annotation (or sit adjacent to\n * one): an anchored row is NEVER hidden inside a collapsed run, so a note that\n * targets an unchanged line stays reachable. An anchor splits its run into the\n * separately-collapsible spans on either side of it, with CONTEXT_EDGE rows kept\n * visible around the anchor.\n */\nfunction segmentRows(\n rows: DiffRow[],\n isAnchored?: (row: DiffRow) => boolean,\n): DiffSegment[] {\n const segments: DiffSegment[] = [];\n\n // Collapse one contiguous context run [from, to) that contains NO anchors.\n const collapseRun = (run: DiffRow[], atStart: boolean, atEnd: boolean) => {\n if (run.length <= COLLAPSE_THRESHOLD) {\n for (const row of run) segments.push(row);\n return;\n }\n const head = atStart ? [] : run.slice(0, CONTEXT_EDGE);\n const tail = atEnd ? [] : run.slice(run.length - CONTEXT_EDGE);\n const hidden = run.slice(head.length, run.length - tail.length);\n for (const row of head) segments.push(row);\n if (hidden.length > 0) segments.push({ collapsed: true, rows: hidden });\n for (const row of tail) segments.push(row);\n };\n\n let i = 0;\n while (i < rows.length) {\n if (rows[i].kind !== \"context\") {\n segments.push(rows[i]);\n i += 1;\n continue;\n }\n // Gather the full contiguous context run.\n let j = i;\n while (j < rows.length && rows[j].kind === \"context\") j += 1;\n const fullRun = rows.slice(i, j);\n const runAtStart = i === 0;\n const runAtEnd = j === rows.length;\n\n if (!isAnchored || !fullRun.some(isAnchored)) {\n collapseRun(fullRun, runAtStart, runAtEnd);\n } else {\n // Walk the run, emitting anchored rows verbatim and collapsing the\n // unanchored spans between them. An anchored row is always visible; the\n // spans on each side of it collapse independently.\n let spanStart = 0;\n for (let k = 0; k <= fullRun.length; k += 1) {\n const atAnchor = k < fullRun.length && isAnchored(fullRun[k]);\n if (atAnchor || k === fullRun.length) {\n const span = fullRun.slice(spanStart, k);\n if (span.length > 0) {\n collapseRun(\n span,\n runAtStart && spanStart === 0,\n runAtEnd && k === fullRun.length,\n );\n }\n if (k < fullRun.length) segments.push(fullRun[k]);\n spanStart = k + 1;\n }\n }\n }\n i = j;\n }\n return segments;\n}\n\n/* ── Theme-aware row styling (light + dark) ────────────────────────────────── */\n\nconst ROW_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/10 dark:bg-emerald-500/15\",\n removed: \"bg-destructive/10\",\n context: \"bg-background\",\n};\n\nconst GUTTER_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/15 dark:bg-emerald-500/20\",\n removed: \"bg-destructive/15\",\n context: \"bg-muted/60\",\n};\n\nconst SIGN_COLOR: Record<DiffRowKind, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n removed: \"text-destructive\",\n context: \"text-muted-foreground\",\n};\n\nconst SIGN: Record<DiffRowKind, string> = {\n added: \"+\",\n removed: \"−\",\n context: \" \",\n};\n\nconst LINE_NO_CLASS =\n \"select-none px-2 py-0 text-right font-mono text-[12px] leading-5 text-muted-foreground tabular-nums\";\n\nconst DIFF_LINE_CLASS =\n \"block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono text-[12px] leading-5 text-foreground\";\n\nconst DEFAULT_VISIBLE_DIFF_LINES = 15;\nconst MAX_DIFF_LCS_CELLS = 1_000_000;\n\nfunction splitDiffFilename(filename?: string): {\n basename: string;\n directory: string | null;\n} {\n const value = filename?.trim() || \"diff\";\n const segments = value.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? value;\n const directory =\n segments.length > 1 ? segments.slice(0, -1).join(\"/\") : null;\n return { basename, directory };\n}\n\nfunction DiffLineText({ language, text }: { language: string; text: string }) {\n const code = text || \" \";\n return (\n <span className={DIFF_LINE_CLASS}>\n <SyntaxHighlightedLine code={code} language={language} />\n </span>\n );\n}\n\n/* ── Read ──────────────────────────────────────────────────────────────────── */\n\nfunction DiffRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<DiffData>) {\n const [mode, setMode] = useState<DiffMode>(data.mode ?? \"unified\");\n const [expanded, setExpanded] = useState<Set<number>>(() => new Set());\n const [showAllRows, setShowAllRows] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n const rows = useMemo(\n () => buildRows(diffLines(data.before, data.after)),\n [data.before, data.after],\n );\n const language = useMemo(\n () => resolveDiffLanguage(data),\n [data.filename, data.language],\n );\n const fileParts = useMemo(\n () => splitDiffFilename(data.filename),\n [data.filename],\n );\n const splitLineCount = useMemo(() => pairSplitRows(rows).length, [rows]);\n\n // Resolve annotations against the side they target. A `before` annotation's\n // `lines` ref is clamped to the OLD file's line count and matched on `oldNo`;\n // an `after` (default) ref to the NEW file and matched on `newNo`. Markers are\n // authoring-order across BOTH sides so a note ↔ row ↔ rail card share one id.\n const beforeLineCount = useMemo(() => countLines(data.before), [data.before]);\n const afterLineCount = useMemo(() => countLines(data.after), [data.after]);\n const resolved = useMemo(\n () =>\n resolveAnnotations(data.annotations, (annotation) =>\n annotationSide(annotation) === \"before\"\n ? beforeLineCount\n : afterLineCount,\n ),\n [data.annotations, beforeLineCount, afterLineCount],\n );\n const hasAnnotations = hasRailAnnotations(resolved);\n // Side-scoped line → markers maps so a row only lights from its own side.\n const beforeMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) === \"before\"),\n ),\n [resolved],\n );\n const afterMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) !== \"before\"),\n ),\n [resolved],\n );\n const markersForRow = useMemo<MarkersForRow>(() => {\n return (row, side) => {\n const out: ResolvedAnnotation<DiffAnnotation>[] = [];\n if (\n (side === undefined || side === \"old\") &&\n row.oldNo != null &&\n row.kind !== \"added\"\n ) {\n out.push(...(beforeMarkers.get(row.oldNo) ?? []));\n }\n if (\n (side === undefined || side === \"new\") &&\n row.newNo != null &&\n row.kind !== \"removed\"\n ) {\n out.push(...(afterMarkers.get(row.newNo) ?? []));\n }\n return out;\n };\n }, [beforeMarkers, afterMarkers]);\n // A context row that carries a marker is an anchor: never collapse it away.\n const anchoredRow = useMemo(() => {\n if (!hasAnnotations) return undefined;\n return (row: DiffRow) => markersForRow(row).length > 0;\n }, [hasAnnotations, markersForRow]);\n\n const added = rows.filter((r) => r.kind === \"added\").length;\n const removed = rows.filter((r) => r.kind === \"removed\").length;\n const unchanged = data.before === data.after;\n const totalVisibleLineCount = mode === \"split\" ? splitLineCount : rows.length;\n const shouldLimitRows = totalVisibleLineCount > DEFAULT_VISIBLE_DIFF_LINES;\n // Never truncate away an annotated row: extend the window past the last one.\n const effectiveRowLimit = useMemo(() => {\n if (showAllRows || !shouldLimitRows) return undefined;\n let limit = DEFAULT_VISIBLE_DIFF_LINES;\n if (hasAnnotations) {\n for (let idx = rows.length - 1; idx >= limit; idx -= 1) {\n if (markersForRow(rows[idx]).length > 0) {\n limit = idx + 1;\n break;\n }\n }\n }\n return limit;\n }, [showAllRows, shouldLimitRows, hasAnnotations, rows, markersForRow]);\n const rowLimit = effectiveRowLimit;\n const displayedRows =\n mode === \"unified\" && rowLimit ? rows.slice(0, rowLimit) : rows;\n\n const toggleRun = (index: number) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n\n return (\n <section className=\"plan-block group/diff-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n {summary && (\n <p className=\"mb-3 text-sm leading-relaxed text-plan-muted\">\n {summary}\n </p>\n )}\n <div\n className={cn(\n hasAnnotations &&\n \"grid items-start gap-3 md:grid-cols-[minmax(0,1fr)_minmax(190px,250px)]\",\n )}\n >\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\n {/* Header: filename, path, +/− counts, mode toggle. */}\n <div className=\"flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5\">\n <IconFileDiff className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 font-mono\"\n title={data.filename || undefined}\n >\n <span className=\"min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground\">\n {fileParts.basename}\n </span>\n {fileParts.directory && (\n <span className=\"min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70\">\n {fileParts.directory}\n </span>\n )}\n </span>\n <span className=\"ml-1 flex shrink-0 items-center gap-2 font-mono text-xs\">\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n +{added}\n </span>\n <span className=\"text-destructive\">−{removed}</span>\n </span>\n <div className=\"pointer-events-none ml-auto flex shrink-0 items-center overflow-hidden rounded-md border border-border bg-background opacity-0 transition-opacity group-hover/diff-block:pointer-events-auto group-hover/diff-block:opacity-100 group-focus-within/diff-block:pointer-events-auto group-focus-within/diff-block:opacity-100\">\n <ModeButton\n active={mode === \"unified\"}\n onClick={() => setMode(\"unified\")}\n icon={<IconList className=\"size-3.5\" />}\n label=\"Unified\"\n />\n <ModeButton\n active={mode === \"split\"}\n onClick={() => setMode(\"split\")}\n icon={<IconColumns className=\"size-3.5\" />}\n label=\"Split\"\n />\n </div>\n </div>\n\n {/* Body. */}\n {unchanged ? (\n <div className=\"px-4 py-6 text-center font-mono text-sm text-muted-foreground\">\n No changes\n </div>\n ) : mode === \"split\" ? (\n <SplitView\n rows={rows}\n language={language}\n rowLimit={rowLimit}\n markersForRow={markersForRow}\n activeIndex={activeIndex}\n onActiveChange={setActiveIndex}\n />\n ) : (\n <UnifiedView\n rows={displayedRows}\n language={language}\n expanded={expanded}\n onToggleRun={toggleRun}\n markersForRow={markersForRow}\n anchoredRow={anchoredRow}\n activeIndex={activeIndex}\n onActiveChange={setActiveIndex}\n />\n )}\n {!unchanged && shouldLimitRows && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={showAllRows}\n onClick={() => setShowAllRows((current) => !current)}\n className=\"flex h-7 w-full items-center justify-center gap-1.5 border-t border-border bg-background px-2 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/70 hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3 shrink-0 transition-transform\",\n showAllRows ? \"-rotate-90\" : \"rotate-90\",\n )}\n />\n {showAllRows\n ? \"Show fewer\"\n : `Show all ${totalVisibleLineCount} lines`}\n </button>\n )}\n </div>\n {hasAnnotations && (\n <AnnotationNoteRail\n items={resolved}\n activeIndex={activeIndex}\n onActiveChange={setActiveIndex}\n ctx={ctx}\n showMarker\n />\n )}\n </div>\n </section>\n );\n}\n\nfunction ModeButton({\n active,\n onClick,\n icon,\n label,\n}: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"flex cursor-pointer items-center gap-1 px-2 py-1 text-xs font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted/80 hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\n/* ── Annotation wiring shared by both views ────────────────────────────────── */\n\n/** Marker + hover props threaded into the unified/split rows. */\ninterface RowAnnotationProps {\n markersForRow: MarkersForRow;\n anchoredRow?: (row: DiffRow) => boolean;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => void;\n}\n\n/**\n * The numbered marker pip(s) for a row plus the active-state it derives. Returns\n * `null` when the row carries no annotation so unannotated diffs render an empty\n * marker column (or no column at all when the whole diff is unannotated).\n */\nfunction rowMarkerInfo(\n markers: ResolvedAnnotation<DiffAnnotation>[],\n activeIndex: number | null,\n): { isActive: boolean; primaryIndex: number } | null {\n if (markers.length === 0) return null;\n const isActive = markers.some((m) => m.index === activeIndex);\n return { isActive, primaryIndex: markers[0].index };\n}\n\n/** Shared amber wash for an annotated row, brighter when active. */\nfunction annotatedRowBg(info: { isActive: boolean } | null): string | null {\n if (!info) return null;\n return info.isActive\n ? \"bg-amber-400/20 dark:bg-amber-300/15\"\n : \"bg-amber-400/[0.07] dark:bg-amber-300/[0.07]\";\n}\n\n/* ── Unified view ──────────────────────────────────────────────────────────── */\n\nfunction UnifiedView({\n rows,\n language,\n expanded,\n onToggleRun,\n markersForRow,\n anchoredRow,\n activeIndex,\n onActiveChange,\n}: {\n rows: DiffRow[];\n language: string;\n expanded: Set<number>;\n onToggleRun: (index: number) => void;\n} & RowAnnotationProps) {\n const segments = useMemo(\n () => segmentRows(rows, anchoredRow),\n [rows, anchoredRow],\n );\n // Any annotation present ⇒ reserve the marker column so rows stay aligned.\n const showMarkerColumn = useMemo(\n () => rows.some((row) => markersForRow(row).length > 0),\n [rows, markersForRow],\n );\n const rowProps = {\n language,\n markersForRow,\n activeIndex,\n onActiveChange,\n showMarkerColumn,\n };\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\">\n <div className=\"w-max min-w-full font-mono text-[13px] leading-5\">\n {segments.map((segment, idx) => {\n if (\"collapsed\" in segment) {\n const key = runIndex++;\n const open = expanded.has(key);\n return (\n <div key={`run-${key}`}>\n <CollapsedRow\n count={segment.rows.length}\n open={open}\n onClick={() => onToggleRun(key)}\n />\n {open &&\n segment.rows.map((row, ri) => (\n <UnifiedRow\n key={`run-${key}-${ri}`}\n row={row}\n {...rowProps}\n />\n ))}\n </div>\n );\n }\n return <UnifiedRow key={idx} row={segment} {...rowProps} />;\n })}\n </div>\n </div>\n );\n}\n\nfunction UnifiedRow({\n language,\n row,\n markersForRow,\n activeIndex,\n onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row: DiffRow;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => void;\n showMarkerColumn: boolean;\n}) {\n const markers = markersForRow(row);\n const info = rowMarkerInfo(markers, activeIndex);\n return (\n <div\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.oldNo ?? \"\"}</span>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.newNo ?? \"\"}</span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {SIGN[row.kind]}\n </span>\n {showMarkerColumn && (\n <MarkerCell marker={markers[0]?.marker} info={info} />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/**\n * The fixed-width marker column rendered between the sign gutter and the code.\n * When `marker` is undefined the cell is an empty spacer so every row in a diff\n * with annotations keeps its code text aligned.\n */\nfunction MarkerCell({\n marker,\n info,\n}: {\n marker?: number;\n info: { isActive: boolean } | null;\n}) {\n return (\n <span className=\"flex w-6 shrink-0 select-none items-center justify-center py-0\">\n {marker != null && info != null && (\n <AnnotationGutterMarker marker={marker} active={info.isActive} />\n )}\n </span>\n );\n}\n\nfunction CollapsedRow({\n count,\n open,\n onClick,\n}: {\n count: number;\n open: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n className=\"flex w-full cursor-pointer items-center gap-2 border-y border-border bg-muted/70 px-3 py-1 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconDotsVertical className=\"size-3.5 shrink-0\" />\n <span>\n {open ? \"Hide\" : \"Show\"} {count} unchanged line\n {count === 1 ? \"\" : \"s\"}\n </span>\n </button>\n );\n}\n\n/* ── Split (side-by-side) view ─────────────────────────────────────────────── */\n\ninterface SplitRow {\n left?: DiffRow;\n right?: DiffRow;\n}\n\n/**\n * Pair removed lines (left) with added lines (right) so a modification shows the\n * old and new side by side; context lines mirror on both columns. Leftover adds\n * or removes fall through as half-empty rows (GitHub split behavior).\n */\nfunction pairSplitRows(rows: DiffRow[]): SplitRow[] {\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n const row = rows[i];\n if (row.kind === \"context\") {\n out.push({ left: row, right: row });\n i += 1;\n continue;\n }\n // Collect a contiguous block of removed-then-added rows.\n const removed: DiffRow[] = [];\n const added: DiffRow[] = [];\n while (i < rows.length && rows[i].kind === \"removed\")\n removed.push(rows[i++]);\n while (i < rows.length && rows[i].kind === \"added\") added.push(rows[i++]);\n const max = Math.max(removed.length, added.length);\n for (let k = 0; k < max; k += 1) {\n out.push({ left: removed[k], right: added[k] });\n }\n }\n return out;\n}\n\nfunction SplitView({\n language,\n rowLimit,\n rows,\n markersForRow,\n activeIndex,\n onActiveChange,\n}: {\n language: string;\n rowLimit?: number;\n rows: DiffRow[];\n} & Omit<RowAnnotationProps, \"anchoredRow\">) {\n const pairs = useMemo(() => pairSplitRows(rows), [rows]);\n const displayedPairs = rowLimit ? pairs.slice(0, rowLimit) : pairs;\n // Reserve the marker column on a side only if any visible row there has one.\n const showOldMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.left && markersForRow(pair.left, \"old\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const showNewMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.right && markersForRow(pair.right, \"new\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const cellProps = { language, markersForRow, activeIndex, onActiveChange };\n return (\n <div className=\"flex w-full bg-background font-mono text-[12px] leading-5\">\n <div className=\"min-w-0 flex-1 overflow-x-auto border-r border-border\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`old-${idx}`}\n row={pair.left}\n side=\"old\"\n showMarkerColumn={showOldMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n <div className=\"min-w-0 flex-1 overflow-x-auto\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`new-${idx}`}\n row={pair.right}\n side=\"new\"\n showMarkerColumn={showNewMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SplitCell({\n language,\n row,\n side,\n markersForRow,\n activeIndex,\n onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row?: DiffRow;\n side: RowSide;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => void;\n showMarkerColumn: boolean;\n}) {\n if (!row) {\n return (\n <div className=\"flex min-h-5 min-w-full bg-muted/40 opacity-70\">\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")} />\n <span className=\"w-6 shrink-0 bg-muted/60\" />\n {showMarkerColumn && <span className=\"w-6 shrink-0\" />}\n <span className={DIFF_LINE_CLASS}> </span>\n </div>\n );\n }\n const sign = side === \"old\" ? \"−\" : \"+\";\n const showSign = row.kind !== \"context\";\n const markers = markersForRow(row, side);\n const info = rowMarkerInfo(markers, activeIndex);\n return (\n <div\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>\n {side === \"old\" ? (row.oldNo ?? \"\") : (row.newNo ?? \"\")}\n </span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {showSign ? sign : \" \"}\n </span>\n {showMarkerColumn && (\n <MarkerCell marker={markers[0]?.marker} info={info} />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/* ── Edit (panel) ──────────────────────────────────────────────────────────── */\n\nconst codeAreaClass = \"min-h-[140px] font-mono text-xs leading-5\";\n\nfunction DiffEdit({ data, onChange, editable }: BlockEditProps<DiffData>) {\n const patch = (next: Partial<DiffData>) => onChange({ ...data, ...next });\n const mode: DiffMode = data.mode ?? \"unified\";\n const annotations = data.annotations ?? [];\n\n const updateAnnotation = (index: number, next: Partial<DiffAnnotation>) =>\n patch({\n annotations: annotations.map((annotation, i) =>\n i === index ? { ...annotation, ...next } : annotation,\n ),\n });\n\n const removeAnnotation = (index: number) =>\n patch({ annotations: annotations.filter((_, i) => i !== index) });\n\n const addAnnotation = () => {\n if (annotations.length >= 80) return; // schema max\n patch({\n annotations: [\n ...annotations,\n { side: \"after\", lines: \"1\", label: \"\", note: \"\" },\n ],\n });\n };\n\n return (\n <div className=\"flex flex-col gap-3\" data-plan-interactive>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-filename\" className=\"text-xs\">\n Filename\n </DevLabel>\n <DevInput\n id=\"diff-filename\"\n value={data.filename ?? \"\"}\n placeholder=\"src/add.ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ filename: event.target.value || undefined })\n }\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-language\" className=\"text-xs\">\n Language\n </DevLabel>\n <DevInput\n id=\"diff-language\"\n value={data.language ?? \"\"}\n placeholder=\"ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ language: event.target.value || undefined })\n }\n />\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel className=\"text-xs\">Layout</DevLabel>\n <DevSelect\n value={mode}\n disabled={!editable}\n onValueChange={(value) => patch({ mode: value as DiffMode })}\n options={[\n { value: \"unified\", label: \"Unified\" },\n { value: \"split\", label: \"Split (side-by-side)\" },\n ]}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-before\" className=\"text-xs\">\n Before\n </DevLabel>\n <DevTextarea\n id=\"diff-before\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.before}\n disabled={!editable}\n onChange={(event) => patch({ before: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-after\" className=\"text-xs\">\n After\n </DevLabel>\n <DevTextarea\n id=\"diff-after\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.after}\n disabled={!editable}\n onChange={(event) => patch({ after: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <DevLabel className=\"text-xs\">Annotations</DevLabel>\n {editable && annotations.length < 80 && (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={addAnnotation}\n className=\"flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-plan-muted transition-colors hover:bg-plan-block/60 hover:text-plan-text\"\n >\n <IconPlus className=\"size-3.5\" />\n Add annotation\n </button>\n )}\n </div>\n {annotations.length === 0 && (\n <p className=\"text-xs text-plan-muted\">\n No annotations yet. Add one to anchor a note to a line range on the\n before or after side.\n </p>\n )}\n {annotations.map((annotation, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-plan-line bg-plan-block/30 p-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-[110px_110px_minmax(0,1fr)_auto]\">\n <DevSelect\n aria-label={`Annotation ${index + 1} side`}\n value={annotation.side ?? \"after\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateAnnotation(index, {\n side: value as DiffAnnotation[\"side\"],\n })\n }\n options={[\n { value: \"after\", label: \"After\" },\n { value: \"before\", label: \"Before\" },\n ]}\n />\n <DevInput\n aria-label={`Annotation ${index + 1} lines`}\n value={annotation.lines}\n placeholder=\"3-5\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { lines: event.target.value })\n }\n />\n <DevInput\n aria-label={`Annotation ${index + 1} label`}\n value={annotation.label ?? \"\"}\n placeholder=\"Label (optional)\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, {\n label: event.target.value || undefined,\n })\n }\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={`Remove annotation ${index + 1}`}\n onClick={() => removeAnnotation(index)}\n className=\"flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-md text-plan-muted transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <DevTextarea\n aria-label={`Annotation ${index + 1} note`}\n className=\"min-h-[60px] text-sm\"\n value={annotation.note}\n placeholder=\"Explain what these lines do…\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { note: event.target.value })\n }\n />\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport { DiffRead, DiffEdit };\n"]}
|
|
@@ -9,7 +9,7 @@ export declare function HighlightedCode({ code, language, }: {
|
|
|
9
9
|
* stay scannable instead of dominating the document, matching the rest of the
|
|
10
10
|
* plan's progressively-disclosed surfaces.
|
|
11
11
|
*/
|
|
12
|
-
export declare const DEFAULT_CODE_MAX_LINES =
|
|
12
|
+
export declare const DEFAULT_CODE_MAX_LINES = 40;
|
|
13
13
|
/**
|
|
14
14
|
* Read-only code surface used across the plan blocks (code tabs, API specs) and
|
|
15
15
|
* the markdown read view. Syntax-highlights via {@link HighlightedCode} (Shiki,
|
|
@@ -145,7 +145,7 @@ export function HighlightedCode({ code, language, }) {
|
|
|
145
145
|
* stay scannable instead of dominating the document, matching the rest of the
|
|
146
146
|
* plan's progressively-disclosed surfaces.
|
|
147
147
|
*/
|
|
148
|
-
export const DEFAULT_CODE_MAX_LINES =
|
|
148
|
+
export const DEFAULT_CODE_MAX_LINES = 40;
|
|
149
149
|
/**
|
|
150
150
|
* Read-only code surface used across the plan blocks (code tabs, API specs) and
|
|
151
151
|
* the markdown read view. Syntax-highlights via {@link HighlightedCode} (Shiki,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightedCode.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/HighlightedCode.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAcpC,IAAI,iBAAiB,GAAqC,IAAI,CAAC;AAC/D,SAAS,eAAe;IACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,GAC1D,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,MAAM,CAAC,YAAY,CAAC;gBACpB,MAAM,CAAC,wBAAwB,CAAC;aACjC,CAAC,CAAC;YACL,OAAO,qBAAqB,CAAC;gBAC3B,MAAM,EAAE;oBACN,MAAM,CAAC,uCAAuC,CAAC;oBAC/C,MAAM,CAAC,sCAAsC,CAAC;iBAC/C;gBACD,KAAK,EAAE;oBACL,MAAM,CAAC,4BAA4B,CAAC;oBACpC,MAAM,CAAC,4BAA4B,CAAC;oBACpC,MAAM,CAAC,qBAAqB,CAAC;oBAC7B,MAAM,CAAC,qBAAqB,CAAC;oBAC7B,MAAM,CAAC,sBAAsB,CAAC;oBAC9B,MAAM,CAAC,qBAAqB,CAAC;oBAC7B,MAAM,CAAC,sBAAsB,CAAC;oBAC9B,MAAM,CAAC,0BAA0B,CAAC;oBAClC,MAAM,CAAC,sBAAsB,CAAC;oBAC9B,MAAM,CAAC,6BAA6B,CAAC;oBACrC,MAAM,CAAC,wBAAwB,CAAC;oBAChC,MAAM,CAAC,sBAAsB,CAAC;oBAC9B,MAAM,CAAC,qBAAqB,CAAC;iBAC9B;gBACD,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;aACpD,CAAyC,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,iBAAiB,GAAG,IAAI,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,YAAY,GAA2B;IAC3C,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,QAAQ;IACZ,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,KAAK;IACT,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAA2B;IAC9C,UAAU,EAAE,YAAY;IACxB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,YAAY;IACxB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,QAAQ;IAChB,EAAE,EAAE,QAAQ;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,UAAU;IACpB,EAAE,EAAE,UAAU;IACd,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,CAAC,EAAE,GAAG;IACN,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IACzD,MAAM,GAAG,GAAG,QAAQ;QAClB,EAAE,IAAI,EAAE;SACP,WAAW,EAAE;SACb,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,GAIT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,eAAe,EAAE;aACd,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACpB,MAAM,SAAS,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;YACtD,MAAM,MAAM,GAAG,WAAW,CAAC,kBAAkB,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE;gBAClC,IAAI;gBACJ,MAAM,EAAE;oBACN,KAAK,EAAE,sBAAsB;oBAC7B,IAAI,EAAE,qBAAqB;iBAC5B;gBACD,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,GAAa,CAAC,CAAC;QACzC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CACL,cAAK,SAAS,EAAC,YAAY,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,CACL,wBACE,eAAM,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,YAC3D,IAAI,GACA,GACH,CACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,QAAQ,GAAG,sBAAsB,EACjC,SAAS,GAMV;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7D,CAAC,IAAI,CAAC,CACP,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG,CAAC;IACnD,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,QAAQ,CAAC;IAC3C,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,IAAI,MAAM,CAAC,oBACvC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAE7C,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,uBAAuB,YACpC,eAAM,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAQ,GACnD,CACP,EACD,eACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EACH,SAAS;oBACP,CAAC,CAAE,EAAE,uBAAuB,EAAE,GAAG,EAAoB;oBACrD,CAAC,CAAC,SAAS,aAGf,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,EAClD,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,wBAAwB,iBAAa,MAAM,GAAG,CAC9D,IACG,EACL,WAAW,IAAI,CACd,iBACE,IAAI,EAAC,QAAQ,iCAEb,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,YAE5C,SAAS;oBACR,CAAC,CAAC,QAAQ,WAAW,aAAa,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;oBAChE,CAAC,CAAC,WAAW,GACR,CACV,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useEffect, useMemo, useState, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils.js\";\n\ntype ShikiHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n};\n\nlet highlighterLoader: Promise<ShikiHighlighter> | null = null;\nfunction loadHighlighter(): Promise<ShikiHighlighter> {\n if (!highlighterLoader) {\n highlighterLoader = (async () => {\n const [{ createHighlighterCore }, { createOnigurumaEngine }] =\n await Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/oniguruma\"),\n ]);\n return createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light-default.mjs\"),\n import(\"shiki/themes/github-dark-default.mjs\"),\n ],\n langs: [\n import(\"shiki/langs/javascript.mjs\"),\n import(\"shiki/langs/typescript.mjs\"),\n import(\"shiki/langs/jsx.mjs\"),\n import(\"shiki/langs/tsx.mjs\"),\n import(\"shiki/langs/json.mjs\"),\n import(\"shiki/langs/css.mjs\"),\n import(\"shiki/langs/html.mjs\"),\n import(\"shiki/langs/markdown.mjs\"),\n import(\"shiki/langs/bash.mjs\"),\n import(\"shiki/langs/shellscript.mjs\"),\n import(\"shiki/langs/python.mjs\"),\n import(\"shiki/langs/yaml.mjs\"),\n import(\"shiki/langs/sql.mjs\"),\n ],\n engine: createOnigurumaEngine(import(\"shiki/wasm\")),\n }) as unknown as Promise<ShikiHighlighter>;\n })().catch((error) => {\n highlighterLoader = null;\n throw error;\n });\n }\n return highlighterLoader;\n}\n\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\n/**\n * Human-facing label for a code language hint (the value stored on a code block\n * / code tab). Returns `null` for empty / unknown / plain hints so callers can\n * keep the surface clean (no \"Plain text\" chrome) when the language is unknown\n * or auto-detected. Web languages lead because plans skew that way.\n */\nconst LANGUAGE_LABELS: Record<string, string> = {\n typescript: \"TypeScript\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n jsx: \"JSX\",\n json: \"JSON\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n bash: \"Bash\",\n sh: \"Bash\",\n shell: \"Shell\",\n zsh: \"Bash\",\n python: \"Python\",\n py: \"Python\",\n sql: \"SQL\",\n yaml: \"YAML\",\n yml: \"YAML\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n graphql: \"GraphQL\",\n go: \"Go\",\n rust: \"Rust\",\n ruby: \"Ruby\",\n java: \"Java\",\n c: \"C\",\n cpp: \"C++\",\n csharp: \"C#\",\n php: \"PHP\",\n swift: \"Swift\",\n kotlin: \"Kotlin\",\n diff: \"Diff\",\n dockerfile: \"Dockerfile\",\n xml: \"XML\",\n};\n\nexport function prettyLanguageName(language?: string | null): string | null {\n const raw = language\n ?.trim()\n .toLowerCase()\n .replace(/^language-/, \"\");\n if (!raw || raw === \"text\" || raw === \"plaintext\" || raw === \"plain\") {\n return null;\n }\n return LANGUAGE_LABELS[raw] ?? raw;\n}\n\nexport function HighlightedCode({\n code,\n language,\n}: {\n code: string;\n language?: string;\n}) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadHighlighter()\n .then((highlighter) => {\n const requested = (language || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const lang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelled) setHtml(out as string);\n })\n .catch(() => {\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n if (html) {\n return (\n <div className=\"plan-shiki\" dangerouslySetInnerHTML={{ __html: html }} />\n );\n }\n return (\n <pre>\n <code className={language ? `language-${language}` : undefined}>\n {code}\n </code>\n </pre>\n );\n}\n\n/**\n * Default number of code lines shown before a code surface collapses behind a\n * \"Show N more lines\" toggle. Long code panes (read view, code tabs, API specs)\n * stay scannable instead of dominating the document, matching the rest of the\n * plan's progressively-disclosed surfaces.\n */\nexport const DEFAULT_CODE_MAX_LINES = 30;\n\n/**\n * Read-only code surface used across the plan blocks (code tabs, API specs) and\n * the markdown read view. Syntax-highlights via {@link HighlightedCode} (Shiki,\n * client-only with a plain `<pre>` SSR fallback), follows the current\n * light/dark `--plan-code` palette, and collapses to `maxLines` with an\n * expand/collapse toggle so long snippets do not run away.\n *\n * `maxLines` of `0` / `null` disables collapsing (show everything). The default\n * is {@link DEFAULT_CODE_MAX_LINES}; the surface only collapses when the code is\n * actually longer than that.\n */\nexport function CodeSurface({\n code,\n language,\n maxLines = DEFAULT_CODE_MAX_LINES,\n className,\n}: {\n code: string;\n language?: string;\n maxLines?: number | null;\n className?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const lineCount = useMemo(\n () => (code ? code.replace(/\\n$/, \"\").split(\"\\n\").length : 0),\n [code],\n );\n const cap = typeof maxLines === \"number\" && maxLines > 0 ? maxLines : null;\n const collapsible = cap != null && lineCount > cap;\n const collapsed = collapsible && !expanded;\n const hiddenLines = collapsible ? lineCount - cap : 0;\n const label = prettyLanguageName(language);\n\n return (\n <div\n className={cn(\"plan-code-surface\", className ?? \"mt-5\")}\n data-collapsed={collapsed ? \"true\" : undefined}\n >\n {label && (\n <div className=\"plan-code-surface-bar\">\n <span className=\"plan-code-surface-lang\">{label}</span>\n </div>\n )}\n <div\n className=\"plan-code-surface-scroll\"\n style={\n collapsed\n ? ({ \"--plan-code-max-lines\": cap } as CSSProperties)\n : undefined\n }\n >\n <HighlightedCode code={code} language={language} />\n {collapsed && (\n <div className=\"plan-code-surface-fade\" aria-hidden=\"true\" />\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"plan-code-surface-toggle\"\n onClick={() => setExpanded((value) => !value)}\n >\n {collapsed\n ? `Show ${hiddenLines} more line${hiddenLines === 1 ? \"\" : \"s\"}`\n : \"Show less\"}\n </button>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HighlightedCode.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/HighlightedCode.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils.js\";\n\ntype ShikiHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n};\n\nlet highlighterLoader: Promise<ShikiHighlighter> | null = null;\nfunction loadHighlighter(): Promise<ShikiHighlighter> {\n if (!highlighterLoader) {\n highlighterLoader = (async () => {\n const [{ createHighlighterCore }, { createOnigurumaEngine }] =\n await Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/oniguruma\"),\n ]);\n return createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light-default.mjs\"),\n import(\"shiki/themes/github-dark-default.mjs\"),\n ],\n langs: [\n import(\"shiki/langs/javascript.mjs\"),\n import(\"shiki/langs/typescript.mjs\"),\n import(\"shiki/langs/jsx.mjs\"),\n import(\"shiki/langs/tsx.mjs\"),\n import(\"shiki/langs/json.mjs\"),\n import(\"shiki/langs/css.mjs\"),\n import(\"shiki/langs/html.mjs\"),\n import(\"shiki/langs/markdown.mjs\"),\n import(\"shiki/langs/bash.mjs\"),\n import(\"shiki/langs/shellscript.mjs\"),\n import(\"shiki/langs/python.mjs\"),\n import(\"shiki/langs/yaml.mjs\"),\n import(\"shiki/langs/sql.mjs\"),\n ],\n engine: createOnigurumaEngine(import(\"shiki/wasm\")),\n }) as unknown as Promise<ShikiHighlighter>;\n })().catch((error) => {\n highlighterLoader = null;\n throw error;\n });\n }\n return highlighterLoader;\n}\n\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\n/**\n * Human-facing label for a code language hint (the value stored on a code block\n * / code tab). Returns `null` for empty / unknown / plain hints so callers can\n * keep the surface clean (no \"Plain text\" chrome) when the language is unknown\n * or auto-detected. Web languages lead because plans skew that way.\n */\nconst LANGUAGE_LABELS: Record<string, string> = {\n typescript: \"TypeScript\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n jsx: \"JSX\",\n json: \"JSON\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n bash: \"Bash\",\n sh: \"Bash\",\n shell: \"Shell\",\n zsh: \"Bash\",\n python: \"Python\",\n py: \"Python\",\n sql: \"SQL\",\n yaml: \"YAML\",\n yml: \"YAML\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n graphql: \"GraphQL\",\n go: \"Go\",\n rust: \"Rust\",\n ruby: \"Ruby\",\n java: \"Java\",\n c: \"C\",\n cpp: \"C++\",\n csharp: \"C#\",\n php: \"PHP\",\n swift: \"Swift\",\n kotlin: \"Kotlin\",\n diff: \"Diff\",\n dockerfile: \"Dockerfile\",\n xml: \"XML\",\n};\n\nexport function prettyLanguageName(language?: string | null): string | null {\n const raw = language\n ?.trim()\n .toLowerCase()\n .replace(/^language-/, \"\");\n if (!raw || raw === \"text\" || raw === \"plaintext\" || raw === \"plain\") {\n return null;\n }\n return LANGUAGE_LABELS[raw] ?? raw;\n}\n\nexport function HighlightedCode({\n code,\n language,\n}: {\n code: string;\n language?: string;\n}) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadHighlighter()\n .then((highlighter) => {\n const requested = (language || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const lang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelled) setHtml(out as string);\n })\n .catch(() => {\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n if (html) {\n return (\n <div className=\"plan-shiki\" dangerouslySetInnerHTML={{ __html: html }} />\n );\n }\n return (\n <pre>\n <code className={language ? `language-${language}` : undefined}>\n {code}\n </code>\n </pre>\n );\n}\n\n/**\n * Default number of code lines shown before a code surface collapses behind a\n * \"Show N more lines\" toggle. Long code panes (read view, code tabs, API specs)\n * stay scannable instead of dominating the document, matching the rest of the\n * plan's progressively-disclosed surfaces.\n */\nexport const DEFAULT_CODE_MAX_LINES = 40;\n\n/**\n * Read-only code surface used across the plan blocks (code tabs, API specs) and\n * the markdown read view. Syntax-highlights via {@link HighlightedCode} (Shiki,\n * client-only with a plain `<pre>` SSR fallback), follows the current\n * light/dark `--plan-code` palette, and collapses to `maxLines` with an\n * expand/collapse toggle so long snippets do not run away.\n *\n * `maxLines` of `0` / `null` disables collapsing (show everything). The default\n * is {@link DEFAULT_CODE_MAX_LINES}; the surface only collapses when the code is\n * actually longer than that.\n */\nexport function CodeSurface({\n code,\n language,\n maxLines = DEFAULT_CODE_MAX_LINES,\n className,\n}: {\n code: string;\n language?: string;\n maxLines?: number | null;\n className?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const lineCount = useMemo(\n () => (code ? code.replace(/\\n$/, \"\").split(\"\\n\").length : 0),\n [code],\n );\n const cap = typeof maxLines === \"number\" && maxLines > 0 ? maxLines : null;\n const collapsible = cap != null && lineCount > cap;\n const collapsed = collapsible && !expanded;\n const hiddenLines = collapsible ? lineCount - cap : 0;\n const label = prettyLanguageName(language);\n\n return (\n <div\n className={cn(\"plan-code-surface\", className ?? \"mt-5\")}\n data-collapsed={collapsed ? \"true\" : undefined}\n >\n {label && (\n <div className=\"plan-code-surface-bar\">\n <span className=\"plan-code-surface-lang\">{label}</span>\n </div>\n )}\n <div\n className=\"plan-code-surface-scroll\"\n style={\n collapsed\n ? ({ \"--plan-code-max-lines\": cap } as CSSProperties)\n : undefined\n }\n >\n <HighlightedCode code={code} language={language} />\n {collapsed && (\n <div className=\"plan-code-surface-fade\" aria-hidden=\"true\" />\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"plan-code-surface-toggle\"\n onClick={() => setExpanded((value) => !value)}\n >\n {collapsed\n ? `Show ${hiddenLines} more line${hiddenLines === 1 ? \"\" : \"s\"}`\n : \"Show less\"}\n </button>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { BlockRenderContext } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shared line-anchored annotation UI for the `annotated-code` and `diff` blocks.
|
|
5
|
+
*
|
|
6
|
+
* Both blocks render a numbered code surface plus a side "rail" of notes, where
|
|
7
|
+
* each note targets a 1-based `lines` ref (`"3"` or `"3-5"`) and hovering a code
|
|
8
|
+
* line ↔ its note cross-highlights. This module owns the pure pieces that were
|
|
9
|
+
* identical between them so neither block forks the behavior:
|
|
10
|
+
*
|
|
11
|
+
* - `parseLineRange` — the forgiving 1-based `lines` range parser.
|
|
12
|
+
* - `resolveAnnotations` / `buildLineMarkerMap` — turn a raw annotation list
|
|
13
|
+
* into stable, marker-numbered, range-resolved records and a line→markers map.
|
|
14
|
+
* - `rangeLabel` — the human "Line 8" / "Lines 3–6" label.
|
|
15
|
+
* - `AnnotationGutterMarker` — the numbered amber pip placed on an annotated row
|
|
16
|
+
* (used by the diff grid; the annotated-code surface uses its own rail bar).
|
|
17
|
+
* - `AnnotationNoteRail` — the responsive list of note cards with two-way hover.
|
|
18
|
+
* `showMarker` opts the diff block into a leading numbered pip on each card so
|
|
19
|
+
* a note can be matched to its `①`/`②` row marker; annotated-code omits it to
|
|
20
|
+
* keep its original card chrome.
|
|
21
|
+
*
|
|
22
|
+
* `AnnotatedCodeBlock` annotates a single code surface; `DiffBlock` annotates a
|
|
23
|
+
* before/after grid (each annotation also carries a `side`). The shared types
|
|
24
|
+
* here are intentionally minimal — callers pass their own `side` handling and
|
|
25
|
+
* decide which rows a marker lands on; this module only owns the parsing, the
|
|
26
|
+
* resolved-record shape, and the rendered marker + rail chrome.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Parse a 1-based `lines` ref (`"3"` or `"3-5"`) into an inclusive `[start,end]`
|
|
30
|
+
* pair, clamped to `[1, lineCount]`. Returns `null` for malformed or fully
|
|
31
|
+
* out-of-range refs so callers can ignore them gracefully. A reversed range
|
|
32
|
+
* (`"5-3"`) is normalized; a partially out-of-range range is clamped.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseLineRange(ref: string, lineCount: number): {
|
|
35
|
+
start: number;
|
|
36
|
+
end: number;
|
|
37
|
+
} | null;
|
|
38
|
+
/** The minimal annotation shape the rail needs (a superset works too). */
|
|
39
|
+
export interface RailAnnotation {
|
|
40
|
+
lines: string;
|
|
41
|
+
label?: string;
|
|
42
|
+
note: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ResolvedAnnotation<A extends RailAnnotation = RailAnnotation> {
|
|
45
|
+
/** Index in the original `annotations` array (stable hover key). */
|
|
46
|
+
index: number;
|
|
47
|
+
/** 1-based marker number (authoring order). */
|
|
48
|
+
marker: number;
|
|
49
|
+
annotation: A;
|
|
50
|
+
range: {
|
|
51
|
+
start: number;
|
|
52
|
+
end: number;
|
|
53
|
+
} | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a raw annotation list into stable, marker-numbered records, parsing
|
|
57
|
+
* each `lines` ref against `lineCount`. `lineCountFor` lets the diff block pick a
|
|
58
|
+
* per-annotation line count (before-side vs after-side); annotated-code passes a
|
|
59
|
+
* single constant. Markers are authoring-order, 1-based, and assigned to ALL
|
|
60
|
+
* annotations (even unresolved ones) so numbering is stable regardless of which
|
|
61
|
+
* refs happen to match.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveAnnotations<A extends RailAnnotation>(annotations: A[] | undefined, lineCountFor: (annotation: A) => number): ResolvedAnnotation<A>[];
|
|
64
|
+
/** Map a 1-based line number → the resolved annotations covering it. */
|
|
65
|
+
export declare function buildLineMarkerMap<A extends RailAnnotation>(resolved: ResolvedAnnotation<A>[]): Map<number, ResolvedAnnotation<A>[]>;
|
|
66
|
+
/** Human label for a resolved annotation's line span ("Line 8" / "Lines 3–6"). */
|
|
67
|
+
export declare function rangeLabel(item: ResolvedAnnotation): string;
|
|
68
|
+
/**
|
|
69
|
+
* The numbered amber pip rendered on an annotated code row's gutter. `active`
|
|
70
|
+
* brightens it when its note (or a co-located row) is hovered.
|
|
71
|
+
*/
|
|
72
|
+
export declare function AnnotationGutterMarker({ marker, active, className, }: {
|
|
73
|
+
marker: number;
|
|
74
|
+
active: boolean;
|
|
75
|
+
className?: string;
|
|
76
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
77
|
+
/**
|
|
78
|
+
* The responsive list of line-anchored note cards. Each card shows its marker
|
|
79
|
+
* pip, the resolved line span ("Line 8"), an optional label, and the markdown
|
|
80
|
+
* `note` (via `ctx.renderMarkdown`). Hovering a card sets the active index;
|
|
81
|
+
* `activeIndex` driven from outside lets a hovered code row light its card and
|
|
82
|
+
* vice-versa. Only annotations whose `range` resolved are listed.
|
|
83
|
+
*/
|
|
84
|
+
export declare function AnnotationNoteRail<A extends RailAnnotation>({ items, activeIndex, onActiveChange, ctx, className, showMarker, }: {
|
|
85
|
+
items: ResolvedAnnotation<A>[];
|
|
86
|
+
activeIndex: number | null;
|
|
87
|
+
onActiveChange: (index: number | null) => void;
|
|
88
|
+
ctx: BlockRenderContext;
|
|
89
|
+
className?: string;
|
|
90
|
+
/** Show a leading numbered pip on each card (diff block). */
|
|
91
|
+
showMarker?: boolean;
|
|
92
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
93
|
+
/** Whether a resolved list has at least one note worth rendering a rail for. */
|
|
94
|
+
export declare function hasRailAnnotations(items: ResolvedAnnotation[]): boolean;
|
|
95
|
+
export type AnnotationRailChildren = ReactNode;
|
|
96
|
+
//# sourceMappingURL=annotation-rail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation-rail.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/annotation-rail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUvC;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAC3E,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,CAAC;IACd,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,cAAc,EACzD,WAAW,EAAE,CAAC,EAAE,GAAG,SAAS,EAC5B,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,MAAM,GACtC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAOzB;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,cAAc,EACzD,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAChC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAWtC;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAK3D;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAeA;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,cAAc,EAAE,EAC3D,KAAK,EACL,WAAW,EACX,cAAc,EACd,GAAG,EACH,SAAS,EACT,UAAkB,GACnB,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,GAAG,EAAE,kBAAkB,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,2CAsDA;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAEvE;AAED,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC"}
|