@flamingo-stack/openframe-frontend-core 0.0.743 → 0.0.745

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 (84) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-ZP5DFF3Q.cjs → chunk-3LX5AGZO.cjs} +9 -9
  3. package/dist/{chunk-MLZKPDPZ.cjs → chunk-6IQDQQ56.cjs} +25 -25
  4. package/dist/{chunk-NGUJVM6O.cjs → chunk-75BF7YJR.cjs} +7 -7
  5. package/dist/{chunk-6XCQXGQA.cjs → chunk-7KHQHYXL.cjs} +11 -11
  6. package/dist/{chunk-IRWJKVVZ.cjs → chunk-7PQOZLVP.cjs} +9 -9
  7. package/dist/{chunk-7YDF3QBN.cjs → chunk-DJO7YMT3.cjs} +126 -13
  8. package/dist/{chunk-YDFKFLDQ.cjs → chunk-FNIFUCXU.cjs} +3 -3
  9. package/dist/{chunk-YWMUZLU2.cjs → chunk-GEEKJ7SH.cjs} +37 -37
  10. package/dist/{chunk-BM6JZRVD.cjs → chunk-GOTEXQZN.cjs} +40 -16
  11. package/dist/{chunk-TKASH5YC.cjs → chunk-GQ2TRIOV.cjs} +33 -33
  12. package/dist/{chunk-UL6ZZSL4.cjs → chunk-HMSCUL4R.cjs} +4 -4
  13. package/dist/{chunk-MT7ELGCV.cjs → chunk-HVR7DPAY.cjs} +4 -4
  14. package/dist/{chunk-SQHTX5XP.cjs → chunk-M4FKV2U5.cjs} +6 -6
  15. package/dist/{chunk-Y2FN3E32.cjs → chunk-NFINQ7IZ.cjs} +4 -4
  16. package/dist/{chunk-XJO5ZHO6.cjs → chunk-PM5ELQBL.cjs} +17 -17
  17. package/dist/{chunk-WCY35GB5.cjs → chunk-QES5NV4T.cjs} +716 -532
  18. package/dist/{chunk-BNTELSHZ.cjs → chunk-RIGSZEXS.cjs} +66 -66
  19. package/dist/{cloud-tenants-DZC3ACG6.cjs → cloud-tenants-DECPWIYQ.cjs} +4 -4
  20. package/dist/components/case-studies/index.cjs +14 -14
  21. package/dist/components/chat/index.cjs +3 -3
  22. package/dist/components/chat/utils/history-merge.d.ts.map +1 -1
  23. package/dist/components/chat/utils/history-merge.js +25 -1
  24. package/dist/components/contact/index.cjs +5 -5
  25. package/dist/components/docs/index.cjs +8 -8
  26. package/dist/components/embeds/index.cjs +5 -5
  27. package/dist/components/embeds/reddit-embed-client.d.ts +3 -1
  28. package/dist/components/embeds/reddit-embed-client.d.ts.map +1 -1
  29. package/dist/components/embeds/reddit-embed-client.js +5 -3
  30. package/dist/components/embeds/twitter-embed-client.d.ts +3 -1
  31. package/dist/components/embeds/twitter-embed-client.d.ts.map +1 -1
  32. package/dist/components/embeds/twitter-embed-client.js +5 -3
  33. package/dist/components/faq/index.cjs +6 -6
  34. package/dist/components/features/index.cjs +4 -4
  35. package/dist/components/help-center-pages/index.cjs +74 -74
  36. package/dist/components/index.cjs +41 -37
  37. package/dist/components/meeting-scheduler/index.cjs +22 -22
  38. package/dist/components/navigation/index.cjs +7 -7
  39. package/dist/components/onboarding-guides/index.cjs +6 -6
  40. package/dist/components/product-demo/index.cjs +7 -7
  41. package/dist/components/tickets/index.cjs +9 -9
  42. package/dist/components/ui/index.cjs +8 -4
  43. package/dist/components/ui/index.d.ts +1 -0
  44. package/dist/components/ui/index.d.ts.map +1 -1
  45. package/dist/components/ui/index.js +1 -0
  46. package/dist/components/ui/markdown/base-components.d.ts.map +1 -1
  47. package/dist/components/ui/markdown/base-components.js +3 -2
  48. package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +1 -1
  49. package/dist/components/ui/markdown/rich/embed-overrides.js +11 -8
  50. package/dist/components/ui/markdown-editor.d.ts.map +1 -1
  51. package/dist/components/ui/markdown-editor.js +4 -0
  52. package/dist/components/ui/markdown-link-command.d.ts +37 -0
  53. package/dist/components/ui/markdown-link-command.d.ts.map +1 -0
  54. package/dist/components/ui/markdown-link-command.js +180 -0
  55. package/dist/{devices-MFGE2JQV.cjs → devices-HJKDRWQX.cjs} +5 -5
  56. package/dist/{embeddable-chat-7ZEGCDVF.cjs → embeddable-chat-3SKFBO2P.cjs} +64 -64
  57. package/dist/index.cjs +24 -8
  58. package/dist/{knowledge-7VPS2ZBU.cjs → knowledge-NH2CGY2C.cjs} +5 -5
  59. package/dist/{logs-M3QPAUH7.cjs → logs-KZYIDYQK.cjs} +12 -12
  60. package/dist/{policies-UAVE6X62.cjs → policies-UAVTPIKM.cjs} +8 -8
  61. package/dist/{scripts-EDQ3IQKW.cjs → scripts-FRPY43KU.cjs} +9 -9
  62. package/dist/{software-update-B2MZVNPK.cjs → software-update-AEJJNLX5.cjs} +7 -7
  63. package/dist/utils/index.cjs +119 -4
  64. package/dist/utils/index.d.ts +1 -0
  65. package/dist/utils/index.d.ts.map +1 -1
  66. package/dist/utils/index.js +1 -0
  67. package/dist/utils/markdown-link.d.ts +44 -0
  68. package/dist/utils/markdown-link.d.ts.map +1 -0
  69. package/dist/utils/markdown-link.js +83 -0
  70. package/dist/utils/markdown-to-plain.d.ts +3 -16
  71. package/dist/utils/markdown-to-plain.d.ts.map +1 -1
  72. package/dist/utils/markdown-to-plain.js +33 -3
  73. package/package.json +3 -1
  74. package/src/components/chat/utils/history-merge.ts +46 -1
  75. package/src/components/embeds/reddit-embed-client.tsx +7 -3
  76. package/src/components/embeds/twitter-embed-client.tsx +7 -3
  77. package/src/components/ui/index.ts +1 -0
  78. package/src/components/ui/markdown/base-components.tsx +5 -2
  79. package/src/components/ui/markdown/rich/embed-overrides.tsx +12 -9
  80. package/src/components/ui/markdown-editor.tsx +6 -0
  81. package/src/components/ui/markdown-link-command.tsx +252 -0
  82. package/src/utils/index.ts +1 -0
  83. package/src/utils/markdown-link.ts +148 -0
  84. package/src/utils/markdown-to-plain.ts +64 -22
@@ -138,6 +138,7 @@ export * from './hidden-tags-popup';
138
138
  export * from './tag-search-input';
139
139
  export * from './tag-key-value-filter';
140
140
  export * from './markdown-editor';
141
+ export * from './markdown-link-command';
141
142
  export * from './file-upload';
142
143
  export * from './image-uploader';
143
144
  export * from './ticket-status-tag';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAGA,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAE3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AAEvB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAE1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,SAAS,CAAC;AACxB,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,SAAS,EACT,eAAe,IAAI,qBAAqB,EACxC,KAAK,IAAI,WAAW,EACpB,SAAS,EACT,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,cAAc,EACd,SAAS,EACT,sBAAsB,EACtB,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,6BAA6B,EAC7B,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,cAAc,cAAc,CAAC;AAG7B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,eAAe,CAAC;AAG9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9D,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
@@ -157,6 +157,7 @@ export * from "./hidden-tags-popup.js";
157
157
  export * from "./tag-search-input.js";
158
158
  export * from "./tag-key-value-filter.js";
159
159
  export * from "./markdown-editor.js";
160
+ export * from "./markdown-link-command.js";
160
161
  export * from "./file-upload.js";
161
162
  export * from "./image-uploader.js";
162
163
  export * from "./ticket-status-tag.js";
@@ -1 +1 @@
1
- {"version":3,"file":"base-components.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/base-components.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAU7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAMnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,CAAC,GAAG,SAAS,MAAM,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAC5G,UAAU,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;IAC3D,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;CAC1D;AAoCD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAE5D;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,GACV,EAAE;IACD,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C,GAAG,qBAAqB,CA4DxB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,WAAW,EAAE,eAAe,EAC5B,mBAAmB,EACnB,aAAa,GACd,EAAE,0BAA0B,GAAG,UAAU,CAuOzC"}
1
+ {"version":3,"file":"base-components.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/base-components.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAU7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAOnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,CAAC,GAAG,SAAS,MAAM,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAC5G,UAAU,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;IAC3D,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;CAC1D;AAoCD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAE5D;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,GACV,EAAE;IACD,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C,GAAG,qBAAqB,CA4DxB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,WAAW,EAAE,eAAe,EAC5B,mBAAmB,EACnB,aAAa,GACd,EAAE,0BAA0B,GAAG,UAAU,CAyOzC"}
@@ -5,6 +5,7 @@ import Link from "../../../embed-shims/next-link.js";
5
5
  import { useAuthedImageSrc } from "../../../hooks/use-authed-image-src.js";
6
6
  import { cn } from "../../../utils/cn.js";
7
7
  import { slugifyHeadingText } from "../../../utils/markdown-heading-id.js";
8
+ import { renderedLinkRel } from "../../../utils/markdown-link.js";
8
9
  import { getHashTargetElement, navigateSamePageHash, HUB_HEADER_OFFSET_PX } from "../../../utils/same-page-hash-nav.js";
9
10
  import { extractText, resolveFallbackHeadingId, useAssignedHeadingIds, useHeadingId } from "./heading-ids.js";
10
11
  import { MermaidDiagram } from "./mermaid-diagram.js";
@@ -105,7 +106,7 @@ function buildBaseComponents({
105
106
  // --- paragraph ---
106
107
  p: ({ children }) => /* @__PURE__ */ jsx("p", { className: cn("mb-4 leading-relaxed text-ods-text-primary first:mt-0 last:mb-0", textSizes.p), children }),
107
108
  // --- links ---
108
- a: ({ href, children, className: linkClassName }) => {
109
+ a: ({ href, children, className: linkClassName, rel: authoredRel }) => {
109
110
  const isBroken = href !== void 0 && brokenLinks.includes(href);
110
111
  const isInternalDocLink = propCurrentPath !== void 0 && propCurrentPath !== null && !!href && !href.startsWith("http") && !href.startsWith("#");
111
112
  if (isBroken) {
@@ -168,7 +169,7 @@ function buildBaseComponents({
168
169
  href,
169
170
  className: `relative text-ods-accent no-underline transition-colors duration-200 after:absolute after:-bottom-0.5 after:left-0 after:h-0.5 after:w-0 after:bg-ods-accent after:transition-all after:duration-300 after:content-[''] hover:after:w-full ${linkClassName || ""}`,
170
171
  target: href?.startsWith("http") ? "_blank" : void 0,
171
- rel: href?.startsWith("http") ? "noopener noreferrer" : void 0,
172
+ rel: renderedLinkRel(authoredRel, href?.startsWith("http") ?? false),
172
173
  onClick: inPageAnchorId !== null ? handleAnchorClick : void 0,
173
174
  children
174
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embed-overrides.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/markdown/rich/embed-overrides.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA+BpD,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,cAAc,EACd,SAAS,GACV,EAAE,8BAA8B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwKtD"}
1
+ {"version":3,"file":"embed-overrides.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/markdown/rich/embed-overrides.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAkCpD,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,cAAc,EACd,SAAS,GACV,EAAE,8BAA8B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwKtD"}
@@ -9,14 +9,17 @@ import { RedditEmbedClient } from "../../../embeds/reddit-embed-client.js";
9
9
  import { TwitterEmbedClient } from "../../../embeds/twitter-embed-client.js";
10
10
  import { Video } from "../../../features/video.js";
11
11
  import { buildStandardLeafRenderers, hasRenderableSrc } from "../base-components.js";
12
- function findFirstHref(node, hostRe) {
12
+ function findFirstLink(node, hostRe) {
13
13
  if (!node || node.type !== "element") return null;
14
14
  if (node.tagName === "a") {
15
- const href = node.properties.href;
16
- if (typeof href === "string" && hostRe.test(href)) return href;
15
+ const { href, rel } = node.properties;
16
+ if (typeof href === "string" && hostRe.test(href)) {
17
+ const relText = Array.isArray(rel) ? rel.join(" ") : typeof rel === "string" ? rel : void 0;
18
+ return { href, rel: relText };
19
+ }
17
20
  }
18
21
  for (const child of node.children) {
19
- const found = findFirstHref(child, hostRe);
22
+ const found = findFirstLink(child, hostRe);
20
23
  if (found) return found;
21
24
  }
22
25
  return null;
@@ -149,12 +152,12 @@ function buildRichEmbedOverrides({
149
152
  const { node, className } = bqProps;
150
153
  const classNames = Array.isArray(className) ? className.join(" ") : className ?? "";
151
154
  if (classNames.includes("reddit-embed-bq")) {
152
- const postUrl = findFirstHref(node, /reddit\.com/);
153
- if (postUrl) return /* @__PURE__ */ jsx(RedditEmbedClient, { url: postUrl });
155
+ const post = findFirstLink(node, /reddit\.com/);
156
+ if (post) return /* @__PURE__ */ jsx(RedditEmbedClient, { url: post.href, rel: post.rel });
154
157
  }
155
158
  if (classNames.includes("twitter-tweet")) {
156
- const tweetUrl = findFirstHref(node, /(?:twitter\.com|x\.com)\/[^/]+\/status\//);
157
- if (tweetUrl) return /* @__PURE__ */ jsx(TwitterEmbedClient, { url: tweetUrl });
159
+ const tweet = findFirstLink(node, /(?:twitter\.com|x\.com)\/[^/]+\/status\//);
160
+ if (tweet) return /* @__PURE__ */ jsx(TwitterEmbedClient, { url: tweet.href, rel: tweet.rel });
158
161
  }
159
162
  return standard.blockquote(bqProps);
160
163
  },
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-editor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA2F/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAgB,EAChB,QAAgB,EAChB,MAAY,EACZ,SAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,GACd,EAAE,mBAAmB,qBAoQrB"}
1
+ {"version":3,"file":"markdown-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-editor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA4F/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAgB,EAChB,QAAgB,EAChB,MAAY,EACZ,SAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,GACd,EAAE,mBAAmB,qBAyQrB"}
@@ -5,6 +5,7 @@ import { useRef, useCallback, useState, useEffect } from "react";
5
5
  import dynamic from "../../embed-shims/next-dynamic.js";
6
6
  import { cn } from "../../utils/cn.js";
7
7
  import { IMAGE_FILE_ACCEPT, fileMediaType } from "../../utils/media-type.js";
8
+ import { useMarkdownLinkCommand } from "./markdown-link-command.js";
8
9
  const MDEditor = dynamic(() => import("@uiw/react-md-editor"), { ssr: false });
9
10
  const MARKDOWN_EDITOR_STYLE_ID = "ods-markdown-editor-styles";
10
11
  const mdEditorCSS = `
@@ -102,6 +103,7 @@ function MarkdownEditor({
102
103
  const [isUploading, setIsUploading] = useState(false);
103
104
  const [uploadProgress, setUploadProgress] = useState("");
104
105
  const [defaultExtraCommands, setDefaultExtraCommands] = useState([]);
106
+ const { commands: toolbarCommands, linkDialog } = useMarkdownLinkCommand();
105
107
  useEffect(() => {
106
108
  let cancelled = false;
107
109
  void (async () => {
@@ -287,6 +289,7 @@ function MarkdownEditor({
287
289
  visibleDragbar: true,
288
290
  height,
289
291
  minHeight,
292
+ commands: toolbarCommands,
290
293
  extraCommands,
291
294
  style: {
292
295
  "--md-editor-text-color": "var(--color-text-primary)",
@@ -314,6 +317,7 @@ function MarkdownEditor({
314
317
  }
315
318
  ),
316
319
  uploadProgress && /* @__PURE__ */ jsx("p", { className: "mt-1 text-ods-text-secondary text-h6", children: uploadProgress }),
320
+ linkDialog,
317
321
  /* @__PURE__ */ jsx(MarkdownEditorStyles, {})
318
322
  ] });
319
323
  }
@@ -0,0 +1,37 @@
1
+ import type { ICommand } from '@uiw/react-md-editor';
2
+ import { type ReactNode } from 'react';
3
+ import { type MarkdownLinkFields } from '../../utils/markdown-link';
4
+ export interface MarkdownLinkDialogProps {
5
+ isOpen: boolean;
6
+ /** The link being edited, or the selection a new link starts from. */
7
+ initial: MarkdownLinkFields;
8
+ /** True when `initial` is a link already in the text: the dialog then offers to remove it. */
9
+ editing: boolean;
10
+ onSubmit: (link: MarkdownLinkFields) => void;
11
+ /** Replaces the link with its text. */
12
+ onRemove: () => void;
13
+ onClose: () => void;
14
+ }
15
+ /**
16
+ * The link dialog of the markdown editors: the link's text, its address, and what it tells search
17
+ * engines: Follow (the default), Nofollow, Sponsored or UGC. Any choice but Follow writes the link
18
+ * as `<a rel="…">`. A link that carries several values (`rel="ugc nofollow"`) keeps them all until
19
+ * the choice is changed.
20
+ */
21
+ export declare function MarkdownLinkDialog({ isOpen, initial, editing, onSubmit, onRemove, onClose }: MarkdownLinkDialogProps): import("react").JSX.Element;
22
+ export interface MarkdownLinkCommand {
23
+ /**
24
+ * The editor's toolbar: the vendor's commands with its `link` command replaced by this dialog.
25
+ * `undefined` until the vendor's commands have loaded (the editor then shows its own defaults).
26
+ */
27
+ commands: ICommand[] | undefined;
28
+ /** The dialog. Render it beside the editor. */
29
+ linkDialog: ReactNode;
30
+ }
31
+ /**
32
+ * The link command every markdown editor uses: the toolbar's link button and Ctrl/Cmd+L open
33
+ * {@link MarkdownLinkDialog} on the link under the caret (markdown or HTML), or on the selection
34
+ * for a new link, and write the result back as one undoable edit.
35
+ */
36
+ export declare function useMarkdownLinkCommand(): MarkdownLinkCommand;
37
+ //# sourceMappingURL=markdown-link-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-link-command.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-link-command.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAA8B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,SAAS,EAAuC,MAAM,OAAO,CAAC;AAC5E,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,2BAA2B,CAAC;AAkCnC,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,OAAO,EAAE,kBAAkB,CAAC;IAC5B,8FAA8F;IAC9F,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,uCAAuC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,uBAAuB,+BAiFpH;AAkBD,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,UAAU,EAAE,SAAS,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CA4E5D"}
@@ -0,0 +1,180 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useMemo, useState } from "react";
4
+ import {
5
+ findMarkdownLinkAt,
6
+ formatMarkdownLink
7
+ } from "../../utils/markdown-link.js";
8
+ import { Button } from "./button/index.js";
9
+ import { Input } from "./input.js";
10
+ import { ModalV2, ModalV2Footer, ModalV2Header, ModalV2Title } from "./modal-v2.js";
11
+ import { TabSelector } from "./tab-selector.js";
12
+ const LINK_REL_CHOICES = [
13
+ { id: "follow", label: "Follow", hint: "Search engines follow this link. This is the default." },
14
+ {
15
+ id: "nofollow",
16
+ label: "Nofollow",
17
+ hint: 'Search engines are asked not to follow this link (rel="nofollow").'
18
+ },
19
+ {
20
+ id: "sponsored",
21
+ label: "Sponsored",
22
+ hint: 'For ads, paid placements and sponsorships (rel="sponsored").'
23
+ },
24
+ { id: "ugc", label: "UGC", hint: 'For links in content written by users, such as comments (rel="ugc").' }
25
+ ];
26
+ const LINK_REL_ITEMS = LINK_REL_CHOICES.map(({ id, label }) => ({ id, label }));
27
+ function choiceOf(rel) {
28
+ if (rel.includes("sponsored")) return "sponsored";
29
+ if (rel.includes("ugc")) return "ugc";
30
+ if (rel.includes("nofollow")) return "nofollow";
31
+ return "follow";
32
+ }
33
+ function MarkdownLinkDialog({ isOpen, initial, editing, onSubmit, onRemove, onClose }) {
34
+ const formId = useId();
35
+ const [text, setText] = useState(initial.text);
36
+ const [url, setUrl] = useState(initial.url);
37
+ const [rel, setRel] = useState(initial.rel);
38
+ const [seededWith, setSeededWith] = useState({ isOpen, initial });
39
+ if (seededWith.isOpen !== isOpen || seededWith.initial !== initial) {
40
+ setSeededWith({ isOpen, initial });
41
+ if (isOpen) {
42
+ setText(initial.text);
43
+ setUrl(initial.url);
44
+ setRel(initial.rel);
45
+ }
46
+ }
47
+ const choice = choiceOf(rel);
48
+ const trimmedUrl = url.trim();
49
+ const submit = () => {
50
+ if (!trimmedUrl) return;
51
+ onSubmit({ text: text.trim(), url: trimmedUrl, rel });
52
+ };
53
+ return /* @__PURE__ */ jsxs(ModalV2, { isOpen, onClose, className: "text-left md:max-w-[560px]", children: [
54
+ /* @__PURE__ */ jsx(ModalV2Header, { children: /* @__PURE__ */ jsx(ModalV2Title, { children: editing ? "Edit link" : "Add link" }) }),
55
+ /* @__PURE__ */ jsxs(
56
+ "form",
57
+ {
58
+ id: formId,
59
+ className: "flex w-full flex-col gap-[var(--spacing-system-l)]",
60
+ onSubmit: (event) => {
61
+ event.preventDefault();
62
+ submit();
63
+ },
64
+ children: [
65
+ /* @__PURE__ */ jsx(Input, { label: "Text", value: text, onChange: (event) => setText(event.target.value), placeholder: "Link text" }),
66
+ /* @__PURE__ */ jsx(
67
+ Input,
68
+ {
69
+ label: "URL",
70
+ value: url,
71
+ onChange: (event) => setUrl(event.target.value),
72
+ placeholder: "https://",
73
+ autoFocus: true,
74
+ inputMode: "url"
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-xsf)]", children: [
78
+ /* @__PURE__ */ jsx(
79
+ TabSelector,
80
+ {
81
+ label: "Search engines",
82
+ value: choice,
83
+ onValueChange: (value) => {
84
+ const next = LINK_REL_CHOICES.find((option) => option.id === value)?.id ?? "follow";
85
+ setRel(next === "follow" ? [] : [next]);
86
+ },
87
+ items: LINK_REL_ITEMS,
88
+ variant: "secondary"
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx("p", { className: "text-ods-text-secondary text-h6", children: LINK_REL_CHOICES.find((option) => option.id === choice)?.hint })
92
+ ] })
93
+ ]
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxs(ModalV2Footer, { children: [
97
+ editing ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: onRemove, className: "flex-1", children: "Remove link" }) : /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: onClose, className: "flex-1", children: "Cancel" }),
98
+ /* @__PURE__ */ jsx(Button, { type: "submit", form: formId, variant: "accent", disabled: !trimmedUrl, className: "flex-1", children: editing ? "Save" : "Add link" })
99
+ ] })
100
+ ] });
101
+ }
102
+ const EMPTY_LINK = { text: "", url: "", rel: [] };
103
+ const LOOKS_LIKE_URL = /^(?:https?:\/\/|www\.|mailto:|\/|#)\S*$/i;
104
+ function initialFieldsFromSelection(selectedText) {
105
+ const selected = selectedText.trim();
106
+ return LOOKS_LIKE_URL.test(selected) ? { text: "", url: selected, rel: [] } : { text: selected, url: "", rel: [] };
107
+ }
108
+ function useMarkdownLinkCommand() {
109
+ const [vendorCommands, setVendorCommands] = useState(void 0);
110
+ const [pending, setPending] = useState(null);
111
+ useEffect(() => {
112
+ let cancelled = false;
113
+ void (async () => {
114
+ try {
115
+ const mod = await import("@uiw/react-md-editor");
116
+ if (!cancelled && mod.commands?.getCommands) setVendorCommands(mod.commands.getCommands());
117
+ } catch (error) {
118
+ console.error("Failed to load markdown editor toolbar commands:", error);
119
+ }
120
+ })();
121
+ return () => {
122
+ cancelled = true;
123
+ };
124
+ }, []);
125
+ const commands = useMemo(() => {
126
+ if (!vendorCommands) return void 0;
127
+ return vendorCommands.map((command) => {
128
+ if (command.name !== "link") return command;
129
+ const linkCommand = {
130
+ name: "link",
131
+ keyCommand: "link",
132
+ shortcuts: "ctrlcmd+l",
133
+ buttonProps: { "aria-label": "Add or edit a link (ctrl + l)", title: "Add or edit a link (ctrl + l)" },
134
+ icon: command.icon,
135
+ execute: (state, api) => {
136
+ const existing = findMarkdownLinkAt(state.text, state.selection.start, state.selection.end);
137
+ setPending(
138
+ existing ? {
139
+ api,
140
+ range: { start: existing.start, end: existing.end },
141
+ initial: { text: existing.text, url: existing.url, rel: existing.rel },
142
+ editing: true
143
+ } : {
144
+ api,
145
+ range: state.selection,
146
+ initial: initialFieldsFromSelection(state.selectedText),
147
+ editing: false
148
+ }
149
+ );
150
+ }
151
+ };
152
+ return linkCommand;
153
+ });
154
+ }, [vendorCommands]);
155
+ const write = (current, text) => {
156
+ setPending(null);
157
+ current.api.setSelectionRange(current.range);
158
+ current.api.replaceSelection(text);
159
+ };
160
+ const linkDialog = /* @__PURE__ */ jsx(
161
+ MarkdownLinkDialog,
162
+ {
163
+ isOpen: pending !== null,
164
+ initial: pending?.initial ?? EMPTY_LINK,
165
+ editing: pending?.editing ?? false,
166
+ onSubmit: (link) => {
167
+ if (pending) write(pending, formatMarkdownLink(link));
168
+ },
169
+ onRemove: () => {
170
+ if (pending) write(pending, pending.initial.text);
171
+ },
172
+ onClose: () => setPending(null)
173
+ }
174
+ );
175
+ return { commands, linkDialog };
176
+ }
177
+ export {
178
+ MarkdownLinkDialog,
179
+ useMarkdownLinkCommand
180
+ };
@@ -11,7 +11,7 @@ require('./chunk-DKOLQPE7.cjs');
11
11
 
12
12
 
13
13
 
14
- var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
14
+ var _chunkQES5NV4Tcjs = require('./chunk-QES5NV4T.cjs');
15
15
  require('./chunk-URVIPSAJ.cjs');
16
16
  require('./chunk-NTGIQP7O.cjs');
17
17
  require('./chunk-U2O5YQRP.cjs');
@@ -24,8 +24,8 @@ require('./chunk-A6P6DHEZ.cjs');
24
24
  require('./chunk-MZ4KBSH7.cjs');
25
25
  require('./chunk-GAGNKWOC.cjs');
26
26
  require('./chunk-YUMFVQIN.cjs');
27
- require('./chunk-BM6JZRVD.cjs');
28
- require('./chunk-7YDF3QBN.cjs');
27
+ require('./chunk-GOTEXQZN.cjs');
28
+ require('./chunk-DJO7YMT3.cjs');
29
29
  require('./chunk-OWGLRE74.cjs');
30
30
  require('./chunk-3RFQPQ7Z.cjs');
31
31
  require('./chunk-5TCIRWHL.cjs');
@@ -1865,14 +1865,14 @@ require('./chunk-3ATAYP36.cjs');
1865
1865
  // src/components/product-demo/screens/devices.tsx
1866
1866
  var _react = require('react');
1867
1867
  var _jsxruntime = require('react/jsx-runtime');
1868
- var TOOLBAR = { ..._chunkWCY35GB5cjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunk7AM3AFM4cjs.DEVICES_SEARCH_QUERY };
1868
+ var TOOLBAR = { ..._chunkQES5NV4Tcjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunk7AM3AFM4cjs.DEVICES_SEARCH_QUERY };
1869
1869
  var NO_HEADER = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {});
1870
1870
  var HIDDEN_WHEN_COMPACT = ["organization"];
1871
1871
  function DevicesScreen({ compact = false }) {
1872
1872
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1873
1873
  const fixture = _react.useMemo.call(void 0, () => _chunk7AM3AFM4cjs.buildWindowsDevicesFixture.call(void 0, cast), [cast]);
1874
1874
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1875
- _chunkWCY35GB5cjs.DevicesPanelView,
1875
+ _chunkQES5NV4Tcjs.DevicesPanelView,
1876
1876
  {
1877
1877
  className: "p-[var(--spacing-system-l)]",
1878
1878
  headerSlot: NO_HEADER,