@design.estate/dees-catalog 3.90.1 → 3.92.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.
Files changed (231) hide show
  1. package/dist_bundle/bundle.js +10399 -4790
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-appui/dees-appui/dees-appui.js +5 -4
  4. package/dist_ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.js +6 -7
  5. package/dist_ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.js +4 -6
  6. package/dist_ts_web/elements/00group-button/dees-button/dees-button.d.ts +7 -1
  7. package/dist_ts_web/elements/00group-button/dees-button/dees-button.demo.js +16 -2
  8. package/dist_ts_web/elements/00group-button/dees-button/dees-button.js +65 -25
  9. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.js +1 -1
  10. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.d.ts +69 -0
  11. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.js +342 -0
  12. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +48 -3
  13. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.js +128 -39
  14. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +663 -190
  15. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.d.ts +1 -0
  16. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.js +2 -1
  17. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.d.ts +3 -0
  18. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.js +48 -30
  19. package/dist_ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.js +1 -1
  20. package/dist_ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.js +1 -2
  21. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.js +1 -1
  22. package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +1 -1
  23. package/dist_ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.js +9 -9
  24. package/dist_ts_web/elements/00group-form/dees-form-submit/dees-form-submit.d.ts +1 -1
  25. package/dist_ts_web/elements/00group-form/dees-form-submit/dees-form-submit.js +1 -1
  26. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +55 -0
  27. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.d.ts +1 -0
  28. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.js +183 -0
  29. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +412 -0
  30. package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.d.ts +1 -0
  31. package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.js +2 -0
  32. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +65 -0
  33. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.d.ts +1 -0
  34. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +55 -0
  35. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +589 -0
  36. package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.d.ts +1 -0
  37. package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.js +2 -0
  38. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.d.ts +21 -0
  39. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.d.ts +1 -0
  40. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.js +41 -0
  41. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.js +215 -0
  42. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.d.ts +1 -0
  43. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.js +2 -0
  44. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.d.ts +58 -0
  45. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.d.ts +1 -0
  46. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.js +126 -0
  47. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.js +551 -0
  48. package/dist_ts_web/elements/00group-harness/dees-harness-message/index.d.ts +1 -0
  49. package/dist_ts_web/elements/00group-harness/dees-harness-message/index.js +2 -0
  50. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +50 -0
  51. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.d.ts +1 -0
  52. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.js +101 -0
  53. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +424 -0
  54. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.d.ts +1 -0
  55. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.js +2 -0
  56. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.d.ts +27 -0
  57. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.d.ts +1 -0
  58. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.js +46 -0
  59. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.js +282 -0
  60. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.d.ts +1 -0
  61. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.js +2 -0
  62. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.d.ts +24 -0
  63. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.d.ts +1 -0
  64. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.js +32 -0
  65. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.js +241 -0
  66. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.d.ts +1 -0
  67. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.js +2 -0
  68. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +28 -0
  69. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +1 -0
  70. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +56 -0
  71. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +279 -0
  72. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.d.ts +1 -0
  73. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.js +2 -0
  74. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.d.ts +30 -0
  75. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.d.ts +1 -0
  76. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.js +35 -0
  77. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.js +235 -0
  78. package/dist_ts_web/elements/00group-harness/dees-harness-status/index.d.ts +1 -0
  79. package/dist_ts_web/elements/00group-harness/dees-harness-status/index.js +2 -0
  80. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.d.ts +27 -0
  81. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.d.ts +1 -0
  82. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.js +41 -0
  83. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.js +258 -0
  84. package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.d.ts +1 -0
  85. package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.js +2 -0
  86. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +35 -0
  87. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.d.ts +1 -0
  88. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.js +162 -0
  89. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +368 -0
  90. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.d.ts +2 -0
  91. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.js +3 -0
  92. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.d.ts +5 -0
  93. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +183 -0
  94. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.d.ts +19 -0
  95. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.d.ts +1 -0
  96. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.js +25 -0
  97. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.js +148 -0
  98. package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.d.ts +1 -0
  99. package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.js +2 -0
  100. package/dist_ts_web/elements/00group-harness/harness.demodata.d.ts +22 -0
  101. package/dist_ts_web/elements/00group-harness/harness.demodata.js +94 -0
  102. package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +37 -0
  103. package/dist_ts_web/elements/00group-harness/harness.helpers.js +221 -0
  104. package/dist_ts_web/elements/00group-harness/harness.markdown.d.ts +25 -0
  105. package/dist_ts_web/elements/00group-harness/harness.markdown.js +147 -0
  106. package/dist_ts_web/elements/00group-harness/harness.styles.d.ts +9 -0
  107. package/dist_ts_web/elements/00group-harness/harness.styles.js +94 -0
  108. package/dist_ts_web/elements/00group-harness/index.d.ts +18 -0
  109. package/dist_ts_web/elements/00group-harness/index.js +22 -0
  110. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +210 -0
  111. package/dist_ts_web/elements/00group-harness/interfaces.js +11 -0
  112. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +76 -0
  113. package/dist_ts_web/elements/00group-harness/toolregistry.js +210 -0
  114. package/dist_ts_web/elements/00group-input/dees-input-code/dees-input-code.js +30 -18
  115. package/dist_ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.js +73 -46
  116. package/dist_ts_web/elements/00group-input/dees-input-datepicker/styles.js +15 -16
  117. package/dist_ts_web/elements/00group-input/dees-input-list/dees-input-list.js +2 -4
  118. package/dist_ts_web/elements/00group-input/dees-input-tags/dees-input-tags.js +36 -15
  119. package/dist_ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.js +5 -4
  120. package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.js +10 -89
  121. package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js +12 -8
  122. package/dist_ts_web/elements/00group-layout/dees-chips/dees-chips.js +1 -1
  123. package/dist_ts_web/elements/00group-layout/dees-pagination/dees-pagination.js +27 -12
  124. package/dist_ts_web/elements/00group-layout/dees-settings/dees-settings.js +1 -1
  125. package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.js +14 -18
  126. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +6 -7
  127. package/dist_ts_web/elements/00group-overlay/dees-modal/dees-modal.js +6 -21
  128. package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.d.ts +2 -1
  129. package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.js +10 -4
  130. package/dist_ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.js +1 -1
  131. package/dist_ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.js +9 -8
  132. package/dist_ts_web/elements/00group-workspace/dees-workspace/dees-workspace.js +1 -1
  133. package/dist_ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.js +3 -4
  134. package/dist_ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.js +8 -78
  135. package/dist_ts_web/elements/00syntax.d.ts +28 -0
  136. package/dist_ts_web/elements/00syntax.js +98 -0
  137. package/dist_ts_web/elements/00theme.js +26 -14
  138. package/dist_ts_web/elements/index.d.ts +1 -0
  139. package/dist_ts_web/elements/index.js +2 -1
  140. package/dist_watch/bundle.js +233948 -0
  141. package/dist_watch/bundle.js.map +7 -0
  142. package/dist_watch/index.html +28 -0
  143. package/package.json +2 -2
  144. package/readme.hints.md +7 -1
  145. package/readme.md +116 -9
  146. package/readme.playbook.md +10 -0
  147. package/ts_web/00_commitinfo_data.ts +1 -1
  148. package/ts_web/elements/00group-appui/dees-appui/dees-appui.ts +4 -3
  149. package/ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.ts +5 -6
  150. package/ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.ts +3 -5
  151. package/ts_web/elements/00group-button/dees-button/dees-button.demo.ts +15 -1
  152. package/ts_web/elements/00group-button/dees-button/dees-button.ts +59 -24
  153. package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.ts +1 -1
  154. package/ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.ts +401 -0
  155. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.ts +132 -38
  156. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +649 -187
  157. package/ts_web/elements/00group-dataview/dees-dataview-codebox/index.ts +1 -0
  158. package/ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.ts +45 -30
  159. package/ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.ts +1 -1
  160. package/ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.ts +0 -1
  161. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts +1 -1
  162. package/ts_web/elements/00group-dataview/dees-table/styles.ts +1 -1
  163. package/ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.ts +9 -9
  164. package/ts_web/elements/00group-form/dees-form-submit/dees-form-submit.ts +1 -1
  165. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +193 -0
  166. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +301 -0
  167. package/ts_web/elements/00group-harness/dees-harness-chat/index.ts +1 -0
  168. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +56 -0
  169. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +514 -0
  170. package/ts_web/elements/00group-harness/dees-harness-composer/index.ts +1 -0
  171. package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.ts +44 -0
  172. package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.ts +172 -0
  173. package/ts_web/elements/00group-harness/dees-harness-content-blocks/index.ts +1 -0
  174. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.ts +129 -0
  175. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.ts +498 -0
  176. package/ts_web/elements/00group-harness/dees-harness-message/index.ts +1 -0
  177. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.ts +105 -0
  178. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +342 -0
  179. package/ts_web/elements/00group-harness/dees-harness-message-list/index.ts +1 -0
  180. package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.ts +47 -0
  181. package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.ts +225 -0
  182. package/ts_web/elements/00group-harness/dees-harness-permission-card/index.ts +1 -0
  183. package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.ts +32 -0
  184. package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.ts +195 -0
  185. package/ts_web/elements/00group-harness/dees-harness-reasoning/index.ts +1 -0
  186. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +59 -0
  187. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +222 -0
  188. package/ts_web/elements/00group-harness/dees-harness-session-list/index.ts +1 -0
  189. package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.ts +35 -0
  190. package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.ts +187 -0
  191. package/ts_web/elements/00group-harness/dees-harness-status/index.ts +1 -0
  192. package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.ts +43 -0
  193. package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.ts +206 -0
  194. package/ts_web/elements/00group-harness/dees-harness-todos/index.ts +1 -0
  195. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.ts +166 -0
  196. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +315 -0
  197. package/ts_web/elements/00group-harness/dees-harness-tool-card/index.ts +2 -0
  198. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +205 -0
  199. package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.ts +25 -0
  200. package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.ts +96 -0
  201. package/ts_web/elements/00group-harness/dees-harness-usage/index.ts +1 -0
  202. package/ts_web/elements/00group-harness/harness.demodata.ts +113 -0
  203. package/ts_web/elements/00group-harness/harness.helpers.ts +227 -0
  204. package/ts_web/elements/00group-harness/harness.markdown.ts +151 -0
  205. package/ts_web/elements/00group-harness/harness.styles.ts +96 -0
  206. package/ts_web/elements/00group-harness/index.ts +22 -0
  207. package/ts_web/elements/00group-harness/interfaces.ts +203 -0
  208. package/ts_web/elements/00group-harness/toolregistry.ts +264 -0
  209. package/ts_web/elements/00group-input/dees-input-code/dees-input-code.ts +29 -17
  210. package/ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.ts +72 -45
  211. package/ts_web/elements/00group-input/dees-input-datepicker/styles.ts +14 -15
  212. package/ts_web/elements/00group-input/dees-input-list/dees-input-list.ts +1 -3
  213. package/ts_web/elements/00group-input/dees-input-tags/dees-input-tags.ts +35 -14
  214. package/ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.ts +4 -3
  215. package/ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.ts +9 -88
  216. package/ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.ts +11 -7
  217. package/ts_web/elements/00group-layout/dees-chips/dees-chips.ts +1 -1
  218. package/ts_web/elements/00group-layout/dees-pagination/dees-pagination.ts +26 -11
  219. package/ts_web/elements/00group-layout/dees-settings/dees-settings.ts +1 -1
  220. package/ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts +13 -17
  221. package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +5 -6
  222. package/ts_web/elements/00group-overlay/dees-modal/dees-modal.ts +5 -20
  223. package/ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.ts +10 -3
  224. package/ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.ts +1 -1
  225. package/ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.ts +8 -7
  226. package/ts_web/elements/00group-workspace/dees-workspace/dees-workspace.ts +1 -1
  227. package/ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.ts +2 -3
  228. package/ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.ts +7 -77
  229. package/ts_web/elements/00syntax.ts +124 -0
  230. package/ts_web/elements/00theme.ts +25 -13
  231. package/ts_web/elements/index.ts +1 -0
@@ -8,18 +8,31 @@ import {
8
8
  property,
9
9
  state,
10
10
  cssManager,
11
+ unsafeHTML,
11
12
  } from '@design.estate/dees-element';
12
- import { cssGeistFontFamily, cssMonoFontFamily } from '../../00fonts.js';
13
13
  import { themeDefaultStyles } from '../../00theme.js';
14
+ import { syntaxPaletteStyles, syntaxScopeStyles } from '../../00syntax.js';
14
15
 
15
16
  import type { HLJSApi } from 'highlight.js';
16
17
 
17
18
  import * as smartstring from '@push.rocks/smartstring';
18
19
 
19
- import * as domtools from '@design.estate/dees-domtools';
20
20
  import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
21
21
  import { DeesServiceLibLoader } from '../../../services/index.js';
22
22
  import '../../00group-layout/dees-tile/dees-tile.js';
23
+ import '../../00group-utility/dees-icon/dees-icon.js';
24
+ import {
25
+ buildSplitRows,
26
+ computeLineDiff,
27
+ diffStats,
28
+ foldContextRows,
29
+ parseUnifiedDiff,
30
+ toUnifiedDiff,
31
+ type IDiffRow,
32
+ type IDiffSegment,
33
+ type ISplitCell,
34
+ type TDiffDisplayRow,
35
+ } from './codebox.diff.js';
23
36
 
24
37
  declare global {
25
38
  interface HTMLElementTagNameMap {
@@ -35,244 +48,693 @@ export class DeesDataviewCodebox extends DeesElement {
35
48
  @property()
36
49
  accessor progLang: string = 'typescript';
37
50
 
38
- @property({
39
- type: String,
40
- reflect: true,
41
- })
51
+ /** Shown centered in the title bar; empty hides the title. */
52
+ @property()
53
+ accessor filename: string = '';
54
+
55
+ @property({ type: String })
42
56
  accessor codeToDisplay: string = '';
43
57
 
58
+ /**
59
+ * Diff mode inputs: set `codeBefore` (compared against `codeToDisplay` as
60
+ * the after state) OR a pre-computed `unifiedDiff` patch. Either activates
61
+ * diff rendering; `diffView` picks the layout and can force diff mode on
62
+ * its own (e.g. new-file diffs where `codeBefore` is empty).
63
+ */
64
+ @property({ type: String })
65
+ accessor codeBefore: string = '';
66
+
67
+ @property({ type: String })
68
+ accessor unifiedDiff: string = '';
69
+
70
+ /** '' = regular code view; 'inline' = unified rows; 'split' = side by side */
71
+ @property({ type: String })
72
+ accessor diffView: '' | 'inline' | 'split' = '';
73
+
74
+ @state()
75
+ accessor highlightedCode: string = '';
76
+
77
+ @state()
78
+ accessor copied: boolean = false;
79
+
80
+ @state()
81
+ accessor expandedFolds: ReadonlySet<number> = new Set<number>();
82
+
83
+ @state()
84
+ accessor highlightVersion: number = 0;
85
+
44
86
  public static styles = [
45
87
  themeDefaultStyles,
46
88
  cssManager.defaultStyles,
47
- ];
89
+ css`
90
+ :host {
91
+ position: relative;
92
+ display: block;
93
+ text-align: left;
94
+ font-family: var(--dees-font-family);
95
+ box-sizing: border-box;
96
+ }
48
97
 
49
- constructor() {
50
- super();
51
- }
98
+ dees-tile {
99
+ height: 100%;
100
+ color: var(--dees-color-text-primary);
101
+ }
52
102
 
53
- render(): TemplateResult {
54
- return html`
55
- ${domtools.elementBasic.styles}
56
- <style>
57
- :host {
58
- position: relative;
59
- display: block;
60
- text-align: left;
61
- font-size: 16px;
62
- /* syntax palette (dark defaults, gobright overrides below) */
63
- --codebox-syntax-green: #10b981;
64
- --codebox-syntax-purple: #a78bfa;
65
- --codebox-syntax-cyan: #06b6d4;
66
- --codebox-syntax-orange: #fb923c;
67
- font-family: ${cssGeistFontFamily};
68
- box-sizing: border-box;
69
- }
103
+ /* --- Title bar --- */
104
+ .appbar {
105
+ height: var(--dees-control-height-sm);
106
+ display: grid;
107
+ grid-template-columns: 1fr auto 1fr;
108
+ align-items: center;
109
+ padding: 0 var(--dees-spacing-sm) 0 var(--dees-spacing-lg);
110
+ }
70
111
 
71
- :host([gobright]) {
72
- --codebox-syntax-green: #059669;
73
- --codebox-syntax-purple: #8b5cf6;
74
- --codebox-syntax-cyan: #0891b2;
75
- --codebox-syntax-orange: #ea580c;
76
- }
77
- dees-tile {
78
- color: var(--dees-color-text-primary);
79
- }
112
+ .appbar .fileName {
113
+ grid-column: 2;
114
+ font-size: var(--dees-font-control-size-sm);
115
+ font-weight: 500;
116
+ letter-spacing: -0.01em;
117
+ color: var(--dees-color-text-secondary);
118
+ white-space: nowrap;
119
+ overflow: hidden;
120
+ text-overflow: ellipsis;
121
+ }
80
122
 
81
- .appbar {
82
- color: var(--dees-color-text-muted);
83
- height: 32px;
84
- display: flex;
85
- font-size: 13px;
86
- line-height: 32px;
87
- justify-content: center;
88
- align-items: center;
89
- padding: 0 16px;
90
- }
123
+ .appbar .actions {
124
+ grid-column: 3;
125
+ display: flex;
126
+ justify-content: flex-end;
127
+ }
91
128
 
92
- .appbar .fileName {
93
- line-height: inherit;
94
- position: relative;
95
- flex: 1;
96
- text-align: center;
97
- }
129
+ .copyButton {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ width: 24px;
134
+ height: 24px;
135
+ border-radius: var(--dees-radius-sm);
136
+ color: var(--dees-color-text-muted);
137
+ cursor: pointer;
138
+ transition:
139
+ background-color var(--dees-transition-fast) var(--dees-ease-standard),
140
+ color var(--dees-transition-fast) var(--dees-ease-standard);
141
+ }
98
142
 
99
- .bottomBar {
100
- color: var(--dees-color-text-muted);
101
- height: 28px;
102
- font-size: 11px;
103
- line-height: 28px;
104
- display: flex;
105
- justify-content: flex-end;
106
- align-items: center;
107
- padding: 0 16px;
108
- width: 100%;
109
- box-sizing: border-box;
110
- }
143
+ .copyButton:hover {
144
+ background: var(--dees-color-hover);
145
+ color: var(--dees-color-text-secondary);
146
+ }
111
147
 
112
- .spacesLabel {
113
- padding: 0 16px;
114
- display: flex;
115
- align-items: center;
116
- }
148
+ .copyButton:active {
149
+ background: var(--dees-color-active);
150
+ }
117
151
 
118
- .languageLabel {
119
- color: var(--dees-color-accent-primary);
120
- font-size: 12px;
121
- line-height: 28px;
122
- background: color-mix(in srgb, var(--dees-color-accent-primary) 10%, transparent);
123
- padding: 0px 16px;
124
- font-weight: 500;
125
- display: flex;
126
- align-items: center;
127
- }
152
+ .copyButton.copied {
153
+ color: var(--dees-color-text-success);
154
+ }
128
155
 
129
- .hljs-keyword {
130
- color: var(--dees-color-text-error);
131
- }
156
+ /* --- Code area --- */
157
+ .codegrid {
158
+ display: grid;
159
+ grid-template-columns: auto minmax(0, 1fr);
160
+ }
132
161
 
133
- .codegrid {
134
- display: grid;
135
- grid-template-columns: 50px auto;
136
- overflow: auto;
137
- }
162
+ .lineNumbers {
163
+ padding: var(--dees-spacing-lg) var(--dees-spacing-md) var(--dees-spacing-lg) var(--dees-spacing-lg);
164
+ text-align: right;
165
+ color: var(--dees-color-text-muted);
166
+ border-right: 1px solid var(--dees-color-border-subtle);
167
+ user-select: none;
168
+ min-width: 24px;
169
+ }
138
170
 
139
- .lineNumbers {
140
- color: var(--dees-color-text-muted);
141
- padding: 24px 16px 0px 0px;
142
- text-align: right;
143
- border-right: 1px solid var(--dees-color-border-default);
144
- }
171
+ pre {
172
+ margin: 0;
173
+ padding: var(--dees-spacing-lg) var(--dees-spacing-xl);
174
+ overflow-x: auto;
175
+ scrollbar-width: thin;
176
+ scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
177
+ }
145
178
 
146
- .lineCounter:last-child {
147
- opacity: 50%;
148
- }
179
+ code {
180
+ padding: 0;
181
+ margin: 0;
182
+ color: var(--dees-color-text-primary);
183
+ }
149
184
 
150
- pre {
151
- overflow-x: auto;
152
- margin: 0px;
153
- padding: 24px 24px;
154
- }
185
+ code,
186
+ code *,
187
+ .lineNumbers {
188
+ font-family: var(--dees-font-family-mono);
189
+ font-size: var(--dees-font-control-size-sm);
190
+ font-weight: 400;
191
+ line-height: 1.6;
192
+ }
155
193
 
156
- code {
157
- font-weight: 400;
158
- padding: 0px;
159
- margin: 0px;
160
- }
194
+ /* --- Bottom bar --- */
195
+ .bottomBar {
196
+ height: 28px;
197
+ display: flex;
198
+ align-items: center;
199
+ gap: var(--dees-spacing-sm);
200
+ padding: 0 var(--dees-spacing-md) 0 var(--dees-spacing-lg);
201
+ font-size: var(--dees-font-caption2-size);
202
+ color: var(--dees-color-text-muted);
203
+ box-sizing: border-box;
204
+ }
161
205
 
162
- code,
163
- code *,
164
- .lineNumbers {
165
- line-height: 1.4em;
166
- font-weight: 200;
167
- font-family: ${cssMonoFontFamily};
168
- }
206
+ .lineCount {
207
+ margin-right: auto;
208
+ font-weight: 500;
209
+ }
169
210
 
170
- .hljs-string {
171
- color: var(--codebox-syntax-green);
172
- }
211
+ .languageLabel {
212
+ font-size: var(--dees-font-caption2-size);
213
+ font-weight: 500;
214
+ color: var(--dees-color-accent-primary);
215
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 12%, transparent);
216
+ padding: 2px 8px;
217
+ border-radius: var(--dees-radius-full);
218
+ }
173
219
 
174
- .hljs-built_in {
175
- color: var(--codebox-syntax-purple);
176
- }
220
+ `,
221
+ /* Shared system syntax palette + highlight.js scope mapping */
222
+ syntaxPaletteStyles,
223
+ syntaxScopeStyles,
224
+ // --- Diff rendering ---
225
+ css`
226
+ :host {
227
+ --codebox-diff-add-bg: color-mix(in srgb, var(--dees-color-accent-success) 14%, transparent);
228
+ --codebox-diff-add-intra: color-mix(in srgb, var(--dees-color-accent-success) 34%, transparent);
229
+ --codebox-diff-remove-bg: color-mix(in srgb, var(--dees-color-accent-error) 13%, transparent);
230
+ --codebox-diff-remove-intra: color-mix(in srgb, var(--dees-color-accent-error) 32%, transparent);
231
+ }
177
232
 
178
- .hljs-function {
179
- color: var(--dees-color-link);
180
- }
233
+ .diffScroll {
234
+ overflow-x: auto;
235
+ scrollbar-width: thin;
236
+ scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
237
+ padding: var(--dees-spacing-sm) 0;
238
+ }
181
239
 
182
- .hljs-params {
183
- color: var(--codebox-syntax-cyan);
184
- }
240
+ .diffGrid {
241
+ display: grid;
242
+ min-width: max-content;
243
+ width: 100%;
244
+ }
185
245
 
186
- .hljs-comment {
187
- color: var(--dees-color-text-muted);
188
- }
246
+ .diffGrid.inline {
247
+ grid-template-columns: minmax(3ch, auto) minmax(3ch, auto) 2ch minmax(0, 1fr);
248
+ }
189
249
 
190
- .hljs-number {
191
- color: var(--codebox-syntax-orange);
192
- }
250
+ .diffGrid.split {
251
+ grid-template-columns: minmax(3ch, auto) 2ch minmax(24ch, 1fr) minmax(3ch, auto) 2ch minmax(24ch, 1fr);
252
+ }
193
253
 
194
- .hljs-literal {
195
- color: var(--dees-color-text-error);
196
- }
254
+ .diffGrid > div {
255
+ font-family: var(--dees-font-family-mono);
256
+ font-size: var(--dees-font-control-size-sm);
257
+ line-height: 1.6;
258
+ white-space: pre;
259
+ }
197
260
 
198
- .hljs-attr {
199
- color: var(--codebox-syntax-purple);
200
- }
261
+ .diffNum {
262
+ padding: 0 var(--dees-spacing-sm);
263
+ text-align: right;
264
+ color: var(--dees-color-text-muted);
265
+ user-select: none;
266
+ }
201
267
 
202
- .hljs-variable {
203
- color: var(--dees-color-text-primary);
204
- }
205
- </style>
268
+ .diffSign {
269
+ text-align: center;
270
+ user-select: none;
271
+ color: var(--dees-color-text-muted);
272
+ }
273
+
274
+ .diffText {
275
+ padding-right: var(--dees-spacing-lg);
276
+ }
277
+
278
+ .diffGrid .row-add {
279
+ background: var(--codebox-diff-add-bg);
280
+ }
281
+
282
+ .diffGrid .row-add.diffSign {
283
+ color: var(--dees-color-accent-success);
284
+ font-weight: 600;
285
+ }
286
+
287
+ .diffGrid .row-remove {
288
+ background: var(--codebox-diff-remove-bg);
289
+ }
290
+
291
+ .diffGrid .row-remove.diffSign {
292
+ color: var(--dees-color-accent-error);
293
+ font-weight: 600;
294
+ }
295
+
296
+ .diffGrid .row-filler {
297
+ background: color-mix(in srgb, var(--dees-color-text-muted) 5%, transparent);
298
+ }
299
+
300
+ .intra-add {
301
+ background: var(--codebox-diff-add-intra);
302
+ border-radius: 2px;
303
+ }
304
+
305
+ .intra-remove {
306
+ background: var(--codebox-diff-remove-intra);
307
+ border-radius: 2px;
308
+ }
309
+
310
+ .diffHunk {
311
+ grid-column: 1 / -1;
312
+ padding: 2px var(--dees-spacing-lg);
313
+ background: var(--dees-color-bg-tertiary);
314
+ color: var(--dees-color-text-secondary);
315
+ font-size: var(--dees-font-caption2-size);
316
+ user-select: none;
317
+ }
318
+
319
+ .diffFold {
320
+ grid-column: 1 / -1;
321
+ display: flex;
322
+ align-items: center;
323
+ gap: var(--dees-spacing-sm);
324
+ padding: 2px var(--dees-spacing-lg);
325
+ border: 0;
326
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 7%, transparent);
327
+ color: var(--dees-color-link);
328
+ cursor: pointer;
329
+ font-family: var(--dees-font-family-mono);
330
+ font-size: var(--dees-font-caption1-size, 11px);
331
+ text-align: left;
332
+ }
333
+
334
+ .diffFold:hover {
335
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 13%, transparent);
336
+ color: var(--dees-color-link-hover);
337
+ }
338
+
339
+ .diffSplitSep {
340
+ border-left: 1px solid var(--dees-color-border-subtle);
341
+ }
342
+
343
+ .diffStat {
344
+ font-weight: 600;
345
+ }
346
+
347
+ .diffStat.added {
348
+ color: var(--dees-color-accent-success);
349
+ }
350
+
351
+ .diffStat.removed {
352
+ color: var(--dees-color-accent-error);
353
+ }
354
+ `,
355
+ ];
356
+
357
+ render(): TemplateResult {
358
+ const contextMenuOptions = [
359
+ {
360
+ name: 'Copy Code',
361
+ iconName: 'lucide:Copy',
362
+ action: async () => {
363
+ await this.copyCode();
364
+ },
365
+ },
366
+ ...(this.isDiffActive
367
+ ? [{
368
+ name: 'Copy Unified Diff',
369
+ iconName: 'lucide:GitCompareArrows',
370
+ action: async () => {
371
+ await this.copyUnifiedDiff();
372
+ },
373
+ }]
374
+ : []),
375
+ ];
376
+ return html`
206
377
  <dees-tile
207
378
  @contextmenu="${(eventArg: MouseEvent) => {
208
- DeesContextmenu.openContextMenuWithOptions(eventArg, [
209
- {
210
- name: 'About',
211
- iconName: 'circleInfo',
212
- action: async () => {
213
- return null;
214
- },
215
- },
216
- ]);
379
+ DeesContextmenu.openContextMenuWithOptions(eventArg, contextMenuOptions);
217
380
  }}"
218
381
  >
219
382
  <div slot="header" class="appbar">
220
- <div class="fileName">index.ts</div>
221
- </div>
222
- <div class="codegrid">
223
- <div class="lineNumbers">
224
- ${(() => {
225
- let lineCounter = 0;
226
- return this.codeToDisplay.split('\n').map((lineArg) => {
227
- lineCounter++;
228
- return html`<div class="lineCounter">${lineCounter}</div>`;
229
- });
230
- })()}
383
+ <div class="fileName">${this.filename}</div>
384
+ <div class="actions">
385
+ <div
386
+ class="copyButton ${this.copied ? 'copied' : ''}"
387
+ title="Copy code"
388
+ @click=${this.copyCode}
389
+ >
390
+ <dees-icon .icon=${this.copied ? 'lucide:Check' : 'lucide:Copy'} iconSize="14"></dees-icon>
391
+ </div>
231
392
  </div>
232
- <pre><code></code></pre>
233
393
  </div>
394
+ ${this.isDiffActive ? this.renderDiff() : this.renderCode()}
234
395
  <div slot="footer" class="bottomBar">
235
- <div class="spacesLabel">Spaces: 2</div>
396
+ ${this.isDiffActive ? this.renderDiffFooter() : this.renderCodeFooter()}
236
397
  <div class="languageLabel">${this.progLang}</div>
237
398
  </div>
238
399
  </dees-tile>
239
400
  `;
240
401
  }
241
402
 
242
- private codeToDisplayStore = '';
403
+ private renderCode(): TemplateResult {
404
+ const codeLines = this.processedCode ? this.processedCode.split('\n') : [];
405
+ return html`
406
+ <div class="codegrid">
407
+ <div class="lineNumbers">
408
+ ${codeLines.map((_, index) => html`<div class="lineCounter">${index + 1}</div>`)}
409
+ </div>
410
+ <pre><code>${this.highlightedCode
411
+ ? unsafeHTML(this.highlightedCode)
412
+ : this.processedCode}</code></pre>
413
+ </div>
414
+ `;
415
+ }
416
+
417
+ private renderCodeFooter(): TemplateResult {
418
+ const codeLines = this.processedCode ? this.processedCode.split('\n') : [];
419
+ return html`<div class="lineCount">${codeLines.length} ${codeLines.length === 1 ? 'line' : 'lines'}</div>`;
420
+ }
421
+
422
+ private renderDiffFooter(): TemplateResult {
423
+ const stats = diffStats(this.diffRows);
424
+ return html`
425
+ <div class="lineCount">
426
+ <span class="diffStat added">+${stats.added}</span>
427
+ <span class="diffStat removed">−${stats.removed}</span>
428
+ </div>
429
+ `;
430
+ }
431
+
432
+ private renderDiff(): TemplateResult {
433
+ const displayRows = this.displayRowsWithFolds();
434
+ return html`
435
+ <div class="diffScroll">
436
+ ${this.effectiveDiffView === 'split'
437
+ ? this.renderSplitGrid(displayRows)
438
+ : this.renderInlineGrid(displayRows)}
439
+ </div>
440
+ `;
441
+ }
442
+
443
+ private renderInlineGrid(displayRows: TDiffDisplayRow[]): TemplateResult {
444
+ return html`
445
+ <div class="diffGrid inline">
446
+ ${displayRows.map((displayRow) => {
447
+ if (displayRow.kind === 'fold') {
448
+ return this.renderFoldRow(displayRow.rows.length, displayRow.ordinal ?? 0);
449
+ }
450
+ if (displayRow.kind === 'hunk') {
451
+ return html`<div class="diffHunk">${displayRow.text}</div>`;
452
+ }
453
+ const rowClass = displayRow.kind === 'add' ? 'row-add' : displayRow.kind === 'remove' ? 'row-remove' : '';
454
+ return html`
455
+ <div class="diffNum ${rowClass}">${displayRow.oldLine ?? ''}</div>
456
+ <div class="diffNum ${rowClass}">${displayRow.newLine ?? ''}</div>
457
+ <div class="diffSign ${rowClass}">${displayRow.kind === 'add' ? '+' : displayRow.kind === 'remove' ? '−' : ''}</div>
458
+ <div class="diffText ${rowClass}">${this.renderDiffLine(displayRow.text, displayRow.segments, displayRow.kind)}</div>
459
+ `;
460
+ })}
461
+ </div>
462
+ `;
463
+ }
464
+
465
+ private renderSplitGrid(displayRows: TDiffDisplayRow[]): TemplateResult {
466
+ // pair each contiguous non-fold run; folds render as full-width rows
467
+ const rendered: TemplateResult[] = [];
468
+ let run: IDiffRow[] = [];
469
+ const flushRun = () => {
470
+ for (const splitRow of buildSplitRows(run)) {
471
+ if (splitRow.kind === 'hunk') {
472
+ rendered.push(html`<div class="diffHunk">${splitRow.text}</div>`);
473
+ } else {
474
+ rendered.push(html`
475
+ ${this.renderSplitCell(splitRow.left, 'left')}
476
+ ${this.renderSplitCell(splitRow.right, 'right')}
477
+ `);
478
+ }
479
+ }
480
+ run = [];
481
+ };
482
+ for (const displayRow of displayRows) {
483
+ if (displayRow.kind === 'fold') {
484
+ flushRun();
485
+ rendered.push(this.renderFoldRow(displayRow.rows.length, displayRow.ordinal ?? 0));
486
+ } else {
487
+ run.push(displayRow);
488
+ }
489
+ }
490
+ flushRun();
491
+ return html`<div class="diffGrid split">${rendered}</div>`;
492
+ }
493
+
494
+ private renderSplitCell(cell: ISplitCell | undefined, side: 'left' | 'right'): TemplateResult {
495
+ const separatorClass = side === 'right' ? 'diffSplitSep' : '';
496
+ if (!cell) {
497
+ return html`
498
+ <div class="diffNum row-filler ${separatorClass}"></div>
499
+ <div class="diffSign row-filler"></div>
500
+ <div class="diffText row-filler"></div>
501
+ `;
502
+ }
503
+ const rowClass = cell.kind === 'add' ? 'row-add' : cell.kind === 'remove' ? 'row-remove' : '';
504
+ return html`
505
+ <div class="diffNum ${rowClass} ${separatorClass}">${cell.line || ''}</div>
506
+ <div class="diffSign ${rowClass}">${cell.kind === 'add' ? '+' : cell.kind === 'remove' ? '−' : ''}</div>
507
+ <div class="diffText ${rowClass}">${this.renderDiffLine(cell.text, cell.segments, cell.kind)}</div>
508
+ `;
509
+ }
510
+
511
+ private renderFoldRow(hiddenCount: number, foldOrdinal: number): TemplateResult {
512
+ return html`
513
+ <button
514
+ class="diffFold"
515
+ type="button"
516
+ @click=${() => {
517
+ const expanded = new Set(this.expandedFolds);
518
+ expanded.add(foldOrdinal);
519
+ this.expandedFolds = expanded;
520
+ }}
521
+ >
522
+ <dees-icon icon="lucide:UnfoldVertical" iconSize="12"></dees-icon>
523
+ ${hiddenCount} unchanged ${hiddenCount === 1 ? 'line' : 'lines'}
524
+ </button>
525
+ `;
526
+ }
527
+
528
+ private renderDiffLine(
529
+ text: string,
530
+ segments: IDiffSegment[] | undefined,
531
+ kind: 'context' | 'add' | 'remove',
532
+ ): TemplateResult {
533
+ if (segments?.length) {
534
+ const intraClass = kind === 'add' ? 'intra-add' : 'intra-remove';
535
+ return html`${segments.map((segment) =>
536
+ segment.changed ? html`<span class=${intraClass}>${segment.text}</span>` : segment.text,
537
+ )}`;
538
+ }
539
+ const highlighted = this.diffHighlightCache.get(text);
540
+ return highlighted ? html`${unsafeHTML(highlighted)}` : html`${text || ' '}`;
541
+ }
542
+
543
+ private processedCode = '';
243
544
  private highlightJs: HLJSApi | null = null;
545
+ private highlightToken = 0;
546
+ private copiedResetTimeout: ReturnType<typeof setTimeout> | null = null;
547
+ private diffRows: IDiffRow[] = [];
548
+ private diffHighlightCache = new Map<string, string>();
549
+
550
+ /** Diff mode is active when a diff input or an explicit diffView is set. */
551
+ public get isDiffActive(): boolean {
552
+ return Boolean(this.unifiedDiff || this.codeBefore || this.diffView);
553
+ }
554
+
555
+ public get effectiveDiffView(): 'inline' | 'split' {
556
+ return this.diffView === 'split' ? 'split' : 'inline';
557
+ }
244
558
 
245
- public async updated(_changedProperties: Map<string, any>) {
246
- super.updated(_changedProperties);
247
- console.log('highlighting now');
248
- console.log(this.childNodes);
249
- const slottedCodeNodes: Text[] = [];
250
- this.childNodes.forEach((childNode) => {
251
- if (childNode.nodeName === '#text') {
252
- slottedCodeNodes.push(childNode as Text);
559
+ public willUpdate(changedProperties: Map<string, any>) {
560
+ super.willUpdate(changedProperties);
561
+ if (changedProperties.has('codeToDisplay')) {
562
+ this.processedCode = this.codeToDisplay
563
+ ? smartstring.indent.normalize(this.codeToDisplay).trim()
564
+ : '';
565
+ // drop the stale highlight so the new code renders plain until re-highlighted
566
+ this.highlightedCode = '';
567
+ }
568
+ if (
569
+ changedProperties.has('codeToDisplay')
570
+ || changedProperties.has('codeBefore')
571
+ || changedProperties.has('unifiedDiff')
572
+ || changedProperties.has('diffView')
573
+ ) {
574
+ if (this.isDiffActive) {
575
+ this.diffRows = this.unifiedDiff
576
+ ? parseUnifiedDiff(this.unifiedDiff)
577
+ : computeLineDiff(this.codeBefore, this.codeToDisplay);
578
+ } else {
579
+ this.diffRows = [];
253
580
  }
254
- });
255
- if (this.codeToDisplay && this.codeToDisplay !== this.codeToDisplayStore) {
256
- this.codeToDisplayStore = smartstring.indent.normalize(this.codeToDisplay).trimStart();
581
+ this.diffHighlightCache.clear();
582
+ this.expandedFolds = new Set<number>();
257
583
  }
258
- if (slottedCodeNodes[0] && slottedCodeNodes[0].wholeText && !this.codeToDisplay) {
259
- this.codeToDisplayStore = smartstring.indent
260
- .normalize(slottedCodeNodes[0].wholeText)
261
- .trimStart();
262
- this.codeToDisplay = this.codeToDisplayStore;
584
+ // language switch invalidates cached per-line highlights
585
+ if (changedProperties.has('progLang')) {
586
+ this.diffHighlightCache.clear();
263
587
  }
264
- await domtools.plugins.smartdelay.delayFor(0);
588
+ }
589
+
590
+ private displayRowsWithFolds(): TDiffDisplayRow[] {
591
+ const folded = foldContextRows(this.diffRows);
592
+ const result: TDiffDisplayRow[] = [];
593
+ let foldOrdinal = 0;
594
+ for (const row of folded) {
595
+ if (row.kind === 'fold') {
596
+ if (this.expandedFolds.has(foldOrdinal)) {
597
+ result.push(...row.rows);
598
+ } else {
599
+ result.push({ ...row, ordinal: foldOrdinal });
600
+ }
601
+ foldOrdinal++;
602
+ } else {
603
+ result.push(row);
604
+ }
605
+ }
606
+ return result;
607
+ }
265
608
 
266
- // Load highlight.js from CDN if not already loaded
609
+ public async updated(changedProperties: Map<string, any>) {
610
+ super.updated(changedProperties);
611
+ // adopt slotted text content as code source once (regular mode only)
612
+ if (!this.codeToDisplay && !this.isDiffActive) {
613
+ const slottedText = Array.from(this.childNodes).find(
614
+ (childNode) => childNode.nodeName === '#text' && (childNode as Text).wholeText.trim(),
615
+ ) as Text | undefined;
616
+ if (slottedText) {
617
+ this.codeToDisplay = slottedText.wholeText;
618
+ return;
619
+ }
620
+ }
621
+ if (this.isDiffActive) {
622
+ if (
623
+ changedProperties.has('codeToDisplay')
624
+ || changedProperties.has('codeBefore')
625
+ || changedProperties.has('unifiedDiff')
626
+ || changedProperties.has('diffView')
627
+ || changedProperties.has('expandedFolds')
628
+ || changedProperties.has('progLang')
629
+ ) {
630
+ await this.highlightDiffLines();
631
+ }
632
+ return;
633
+ }
634
+ if (changedProperties.has('codeToDisplay') || changedProperties.has('progLang')) {
635
+ await this.highlightCode();
636
+ }
637
+ }
638
+
639
+ /**
640
+ * Highlights visible diff lines per-line (full-text highlighting cannot be
641
+ * split across rows because hljs spans may cross line boundaries). Results
642
+ * are cached by line text; intraline-segmented rows skip highlighting —
643
+ * their change tint carries the information.
644
+ */
645
+ private async highlightDiffLines() {
646
+ const token = ++this.highlightToken;
267
647
  if (!this.highlightJs) {
268
648
  this.highlightJs = await DeesServiceLibLoader.getInstance().loadHighlightJs();
269
649
  }
650
+ if (token !== this.highlightToken) return;
651
+ const pendingLines = new Set<string>();
652
+ for (const displayRow of this.displayRowsWithFolds()) {
653
+ if (displayRow.kind === 'fold' || displayRow.kind === 'hunk') continue;
654
+ if (displayRow.segments?.length) continue;
655
+ if (displayRow.text && !this.diffHighlightCache.has(displayRow.text)) {
656
+ pendingLines.add(displayRow.text);
657
+ }
658
+ }
659
+ if (!pendingLines.size) return;
660
+ for (const line of pendingLines) {
661
+ try {
662
+ this.diffHighlightCache.set(
663
+ line,
664
+ this.highlightJs.highlight(line, { language: this.progLang, ignoreIllegals: true }).value,
665
+ );
666
+ } catch {
667
+ this.diffHighlightCache.set(line, '');
668
+ }
669
+ }
670
+ if (token === this.highlightToken) {
671
+ this.highlightVersion++;
672
+ }
673
+ }
270
674
 
271
- const localCodeNode = this.shadowRoot!.querySelector('code');
272
- const highlightedHtml = this.highlightJs.highlight(this.codeToDisplayStore, {
273
- language: this.progLang,
274
- ignoreIllegals: true,
675
+ private async highlightCode() {
676
+ if (!this.processedCode) {
677
+ return;
678
+ }
679
+ const token = ++this.highlightToken;
680
+ if (!this.highlightJs) {
681
+ this.highlightJs = await DeesServiceLibLoader.getInstance().loadHighlightJs();
682
+ }
683
+ if (token !== this.highlightToken) {
684
+ return;
685
+ }
686
+ try {
687
+ this.highlightedCode = this.highlightJs.highlight(this.processedCode, {
688
+ language: this.progLang,
689
+ ignoreIllegals: true,
690
+ }).value;
691
+ } catch (error) {
692
+ // unknown language — keep the plain-text rendering
693
+ console.warn(`dees-dataview-codebox: could not highlight as '${this.progLang}'`, error);
694
+ }
695
+ }
696
+
697
+ private copyCode = async () => {
698
+ // in diff mode the copy button yields the after-state text
699
+ const textToCopy = this.isDiffActive
700
+ ? this.diffRows
701
+ .filter((row) => row.kind === 'context' || row.kind === 'add')
702
+ .map((row) => row.text)
703
+ .join('\n')
704
+ : this.processedCode;
705
+ try {
706
+ await navigator.clipboard.writeText(textToCopy);
707
+ } catch (error) {
708
+ console.error('dees-dataview-codebox: copy failed', error);
709
+ return;
710
+ }
711
+ this.copied = true;
712
+ if (this.copiedResetTimeout) {
713
+ clearTimeout(this.copiedResetTimeout);
714
+ }
715
+ this.copiedResetTimeout = setTimeout(() => {
716
+ this.copied = false;
717
+ this.copiedResetTimeout = null;
718
+ }, 1500);
719
+ };
720
+
721
+ private copyUnifiedDiff = async () => {
722
+ const patch = this.unifiedDiff || toUnifiedDiff(this.diffRows, {
723
+ fileNameBefore: this.filename ? `a/${this.filename}` : undefined,
724
+ fileNameAfter: this.filename ? `b/${this.filename}` : undefined,
275
725
  });
276
- localCodeNode!.innerHTML = highlightedHtml.value;
726
+ try {
727
+ await navigator.clipboard.writeText(patch);
728
+ } catch (error) {
729
+ console.error('dees-dataview-codebox: copy unified diff failed', error);
730
+ }
731
+ };
732
+
733
+ public async disconnectedCallback() {
734
+ if (this.copiedResetTimeout) {
735
+ clearTimeout(this.copiedResetTimeout);
736
+ this.copiedResetTimeout = null;
737
+ }
738
+ await super.disconnectedCallback();
277
739
  }
278
740
  }