@ni/nimble-components 30.0.6 → 30.0.8

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 (112) hide show
  1. package/dist/all-components-bundle.js +19 -14
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +1195 -1191
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/anchor-menu-item/index.js.map +1 -1
  6. package/dist/esm/anchor-tabs/index.js.map +1 -1
  7. package/dist/esm/anchor-tree-item/index.js.map +1 -1
  8. package/dist/esm/combobox/index.js.map +1 -1
  9. package/dist/esm/combobox/testing/combobox.pageobject.js +1 -1
  10. package/dist/esm/combobox/testing/combobox.pageobject.js.map +1 -1
  11. package/dist/esm/dialog/index.js.map +1 -1
  12. package/dist/esm/drawer/index.js.map +1 -1
  13. package/dist/esm/label-provider/base/index.js.map +1 -1
  14. package/dist/esm/list-option/index.js.map +1 -1
  15. package/dist/esm/list-option-group/index.js.map +1 -1
  16. package/dist/esm/mapping/icon/index.js.map +1 -1
  17. package/dist/esm/menu-button/index.js.map +1 -1
  18. package/dist/esm/menu-button/testing/menu-button.pageobject.js +1 -1
  19. package/dist/esm/menu-button/testing/menu-button.pageobject.js.map +1 -1
  20. package/dist/esm/rich-text/base/index.js.map +1 -1
  21. package/dist/esm/rich-text/editor/index.js.map +1 -1
  22. package/dist/esm/rich-text/editor/models/create-tiptap-editor.js.map +1 -1
  23. package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js.map +1 -1
  24. package/dist/esm/rich-text/mention-listbox/index.js.map +1 -1
  25. package/dist/esm/rich-text/models/markdown-parser.js +12 -12
  26. package/dist/esm/rich-text/models/markdown-parser.js.map +1 -1
  27. package/dist/esm/rich-text/models/rich-text-tracker.js.map +1 -1
  28. package/dist/esm/rich-text/models/testing/markdown-parser-utils.js.map +1 -1
  29. package/dist/esm/rich-text/viewer/index.js.map +1 -1
  30. package/dist/esm/rich-text/viewer/testing/rich-text-viewer.pageobject.js.map +1 -1
  31. package/dist/esm/rich-text-mention/base/index.js.map +1 -1
  32. package/dist/esm/rich-text-mention/base/models/mention-validator.js.map +1 -1
  33. package/dist/esm/rich-text-mention/users/index.js.map +1 -1
  34. package/dist/esm/select/index.js.map +1 -1
  35. package/dist/esm/select/testing/select.pageobject.js.map +1 -1
  36. package/dist/esm/table/components/group-row/index.js.map +1 -1
  37. package/dist/esm/table/components/header/index.js.map +1 -1
  38. package/dist/esm/table/components/row/index.js.map +1 -1
  39. package/dist/esm/table/index.js.map +1 -1
  40. package/dist/esm/table/models/array-to-tree.js.map +1 -1
  41. package/dist/esm/table/models/data-hierarchy-manager.js.map +1 -1
  42. package/dist/esm/table/models/expansion-manager.js.map +1 -1
  43. package/dist/esm/table/models/interactive-selection-manager.js.map +1 -1
  44. package/dist/esm/table/models/keyboard-navigation-manager.js.map +1 -1
  45. package/dist/esm/table/models/selection-managers/multi-selection-manager.js.map +1 -1
  46. package/dist/esm/table/models/selection-managers/selection-manager-base.js.map +1 -1
  47. package/dist/esm/table/models/sort-operations.js.map +1 -1
  48. package/dist/esm/table/models/table-layout-manager.js.map +1 -1
  49. package/dist/esm/table/models/table-update-tracker.js.map +1 -1
  50. package/dist/esm/table/models/table-validator.js.map +1 -1
  51. package/dist/esm/table/models/virtualizer.js.map +1 -1
  52. package/dist/esm/table/testing/table.pageobject.js.map +1 -1
  53. package/dist/esm/table-column/anchor/cell-view/index.js.map +1 -1
  54. package/dist/esm/table-column/anchor/cell-view/template.js.map +1 -1
  55. package/dist/esm/table-column/base/cell-view/index.js.map +1 -1
  56. package/dist/esm/table-column/base/cell-view/template.js.map +1 -1
  57. package/dist/esm/table-column/base/group-header-view/template.js.map +1 -1
  58. package/dist/esm/table-column/base/models/column-internals.js.map +1 -1
  59. package/dist/esm/table-column/base/models/column-validator.js.map +1 -1
  60. package/dist/esm/table-column/date-text/cell-view/index.js.map +1 -1
  61. package/dist/esm/table-column/date-text/group-header-view/index.js.map +1 -1
  62. package/dist/esm/table-column/date-text/index.js.map +1 -1
  63. package/dist/esm/table-column/date-text/models/format-helper.js.map +1 -1
  64. package/dist/esm/table-column/date-text/testing/table-column-date-text.pageobject.js.map +1 -1
  65. package/dist/esm/table-column/duration-text/group-header-view/index.js.map +1 -1
  66. package/dist/esm/table-column/duration-text/models/duration-formatter.js.map +1 -1
  67. package/dist/esm/table-column/duration-text/testing/table-column-duration-text.pageobject.js.map +1 -1
  68. package/dist/esm/table-column/enum-base/index.js.map +1 -1
  69. package/dist/esm/table-column/enum-base/models/mapping-key-resolver.js.map +1 -1
  70. package/dist/esm/table-column/mapping/cell-view/index.js.map +1 -1
  71. package/dist/esm/table-column/mapping/group-header-view/index.js.map +1 -1
  72. package/dist/esm/table-column/mapping/index.js.map +1 -1
  73. package/dist/esm/table-column/mapping/testing/table-column-mapping.pageobject.js.map +1 -1
  74. package/dist/esm/table-column/menu-button/cell-view/index.js.map +1 -1
  75. package/dist/esm/table-column/menu-button/index.js.map +1 -1
  76. package/dist/esm/table-column/mixins/custom-sort-order.js.map +1 -1
  77. package/dist/esm/table-column/mixins/sortable-column.js.map +1 -1
  78. package/dist/esm/table-column/number-text/index.js.map +1 -1
  79. package/dist/esm/table-column/number-text/models/number-text-unit-format.js.map +1 -1
  80. package/dist/esm/table-column/text-base/cell-view/index.js.map +1 -1
  81. package/dist/esm/table-column/text-base/group-header-view/index.js.map +1 -1
  82. package/dist/esm/text-area/index.js.map +1 -1
  83. package/dist/esm/theme-provider/design-tokens.js.map +1 -1
  84. package/dist/esm/theme-provider/index.js.map +1 -1
  85. package/dist/esm/tree-view/index.js.map +1 -1
  86. package/dist/esm/utilities/models/converter.js.map +1 -1
  87. package/dist/esm/utilities/models/document-element-lang.js.map +1 -1
  88. package/dist/esm/utilities/models/tracker.js.map +1 -1
  89. package/dist/esm/utilities/style/direction.js.map +1 -1
  90. package/dist/esm/utilities/style/multivalue-property-stylesheet-behavior.js.map +1 -1
  91. package/dist/esm/utilities/style/theme.js.map +1 -1
  92. package/dist/esm/utilities/testing/component.d.ts +20 -0
  93. package/dist/esm/utilities/testing/component.js +68 -0
  94. package/dist/esm/utilities/testing/component.js.map +1 -0
  95. package/dist/esm/utilities/unit-format/decimal-unit-format.js.map +1 -1
  96. package/dist/esm/utilities/unit-format/default-unit-format.js.map +1 -1
  97. package/dist/esm/utilities/unit-format/scaled-unit-format/manually-translated-scaled-unit-format.js.map +1 -1
  98. package/dist/esm/utilities/unit-format/unit-format.js.map +1 -1
  99. package/dist/esm/utilities/unit-format/unit-scale/unit-scale.js.map +1 -1
  100. package/dist/esm/wafer-map/experimental/computations.js.map +1 -1
  101. package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -1
  102. package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -1
  103. package/dist/esm/wafer-map/index.js.map +1 -1
  104. package/dist/esm/wafer-map/modules/computations.js.map +1 -1
  105. package/dist/esm/wafer-map/modules/create-matrix-renderer.js.map +1 -1
  106. package/dist/esm/wafer-map/modules/hover-handler.js.map +1 -1
  107. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  108. package/dist/esm/wafer-map/modules/rendering.js.map +1 -1
  109. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
  110. package/dist/esm/wafer-map/modules/wafer-map-validator.js.map +1 -1
  111. package/dist/esm/wafer-map/modules/zoom-handler.js.map +1 -1
  112. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-editor.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/testing/rich-text-editor.pageobject.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACZ,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,EAGH,aAAa,EAEhB,MAAM,SAAS,CAAC;AACjB,OAAO,EACH,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC/B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAmB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,kCAAkC,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAC;AAChG,OAAO,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAE1H;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YACqB,qBAAqC;QAArC,0BAAqB,GAArB,qBAAqB,CAAgB;IACvD,CAAC;IAEG,0BAA0B;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,OAAO,aAAc,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC;IAEM,0CAA0C;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,OAAO,aAAc,CAAC,iBAAkB,CAAC,SAAS,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAChC,WAAmB,EACnB,UAAmB;QAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,qBAAqB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,sBAAsB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAC9B,WAA2B;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,2BAA2B;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,eAAe,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACjD,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACtC,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,mBAAmB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG,EAAE,MAAM;YACX,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,yBAAyB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YAC/C,GAAG,EAAE,MAAM;YACX,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,kBAAkB,CAC3B,MAAqB,EACrB,KAAe;QAEf,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,YAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,YAAa,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CACxC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAuB,CAAC,KAAK,MAAM,CAC3D,CAAC;QACF,oGAAoG;QACpG,kFAAkF;QAClF,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,MAAM,GAAG,QAAQ,CAAC;SACrB;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE;YACnC,IACI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAO,CAAC;oBACrD,KAAK,EACX;gBACE,YAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnC,YAAa,CAAC,KAAK,EAAE,CAAC;aACzB;SACJ;QACD,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,sBAAsB;QAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACtD,iBAAkB,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,oBAAoB,CAAC,WAAmB;QAC3C,MAAM,OAAO,GAAa,IAAI,CAAC,iBAAiB,EAAG,CAAC;QACpD,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC;IAC5D,CAAC;IAEM,qBAAqB,CAAC,WAAmB;QAC5C,MAAM,OAAO,GAAa,IAAI,CAAC,iBAAiB,EAAG,CAAC;QACpD,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7D,CAAC;IAEM,qBAAqB,CAAC,WAAmB;QAC5C,MAAM,OAAO,GAAa,IAAI,CAAC,iBAAiB,EAAG,CAAC;QACpD,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACjD,CAAC;IAEM,qBAAqB,CAAC,MAAqB;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,YAAa,CAAC,OAAO,CAAC;IACjC,CAAC;IAEM,iBAAiB,CAAC,MAAqB;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,YAAa,CAAC,QAAQ,CAAC;IAClC,CAAC;IAEM,uBAAuB,CAAC,MAAqB;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAE,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,EAAE;YACxC,GAAG,EAAE,QAAQ;SACK,CAAC,CAAC;QACxB,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEM,uBAAuB,CAAC,MAAqB;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAE,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,EAAE;YACxC,GAAG,EAAE,QAAQ;SACK,CAAC,CAAC;QACxB,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEM,aAAa,CAAC,IAAY;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE;YAC3C,aAAa,EAAE,IAAI,YAAY,EAAE;SACpC,CAAC,CAAC;QACH,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,oIAAoI;IACpI,gGAAgG;IAChG,4JAA4J;IACrJ,iBAAiB,CAAC,UAAkB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE;YAC3C,aAAa,EAAE,IAAI,YAAY,EAAE;SACpC,CAAC,CAAC;QACH,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3D,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,KAAa;QAC3C,IAAI,CAAC,qBAAqB,CAAC,YAAY;aAClC,KAAK,EAAE;aACP,KAAK,EAAE;aACP,aAAa,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,KAAK;SACd,CAAC;aACD,GAAG,EAAE,CAAC;QACX,MAAM,mBAAmB,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;YAC/B,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzD,MAAM,mBAAmB,EAAE,CAAC;SAC/B;IACL,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QAC3C,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAC7D,QAAQ,CACX,CAAC;QACF,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,KAAa;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrD,WAAW,CAAC,aAAc,CAAC,WAAW,GAAG,KAAK,CAAC;QAC/C,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,EAAU;QACpD,IAAI,CAAC,qBAAqB,CAAC,YAAY;aAClC,KAAK,EAAE;aACP,KAAK,EAAE;aACP,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;aACzB,GAAG,EAAE,CAAC;QACX,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,2BAA2B,CAAC,SAAiB;QAChD,OAAO,4BAA4B,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEM,sBAAsB;QACzB,OAAO,CACH,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACrB,EAAE,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC;YAC9C,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,KAAK,CACxC,CAAC;IACN,CAAC;IAEM,mCAAmC,CAAC,SAAiB;QACxD,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CACvE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAEM,0BAA0B;QAC7B,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,iBAAiB,EAAE,OAAO,IAAI,EAAE,CAAC;IACnE,CAAC;IAEM,8BAA8B;QACjC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,iBAAiB,EAAE,WAAW,IAAI,EAAE,CAAC;IACvE,CAAC;IAEM,qBAAqB;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAC/D,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAC7B,CAAC;IACN,CAAC;IAEM,iBAAiB;QACpB,OAAO,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,2HAA2H;IAC3H,qEAAqE;IAC9D,2BAA2B;QAC9B,OAAO,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CACpD,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,KAAK,CACvB,CAAC;IACN,CAAC;IAEM,qBAAqB;QACxB,OAAO,0BAA0B,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9D,CAAC;IAEM,gCAAgC;QACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAe,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAE1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEnC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QAEF,IAAI,YAAY,EAAE;YACd,WAAW,CAAC,YAAY,CAAC,CAAC;SAC7B;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAEM,8BAA8B,CACjC,aAA4B;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACvD,OAAO,MAAO,CAAC,WAAY,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAEM,wBAAwB,CAAC,aAA4B;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACvD,OAAO,MAAO,CAAC,KAAK,CAAC;IACzB,CAAC;IAEM,6BAA6B;QAChC,OAAO,CACH,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,qBAAqB;eAClD,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa;oBAC5C,IAAI,CAAC,eAAe,EAAE,CACjC,CAAC;IACN,CAAC;IAEM,iBAAiB;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,YAAqB;QAC9C,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;SAChE;aAAM;YACH,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;SAC/D;QACD,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,cAAc;QACjB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAG,CAAC;QACxC,OAAO,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,QAAiB;QACtC,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3D;aAAM;YACH,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;SAC1D;QACD,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,gBAAgB,CAAC,MAAqB;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAE,CAAC;QACvD,OAAO,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAEM,mBAAmB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAC5E,CAAC;IAEM,yBAAyB,CAC5B,QAAgB,EAChB,QAAiC;QAEjC,MAAM,0BAA0B,GAAG,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,sBAAsB,CAAC,kBAAkB,CACzD,QAAQ,EACR,CAAC,0BAA0B,CAAC,CAC/B,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,iBAAiB,CAC7D,WAAW,CAAC,QAAQ,CACvB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,0BAA0B;QAC7B,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,CAAC,2BAA2B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO,aAAa,CAAC;IACzB,CAAC;IAEM,iBAAiB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACpD,OAAO,CACH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACrB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CACxD,EAAE,WAAW,IAAI,EAAE,CACvB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAC,KAAa;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7D,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,mBAAmB,EAAE,CAAC;IAChC,CAAC;IAEM,iBAAiB;QACpB,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;IAEM,iBAAiB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IAC1E,CAAC;IAEO,gBAAgB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAEO,SAAS;QACb,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAW,CAAC,aAAa,CACvD,iBAAiB,CACpB,CAAC;IACN,CAAC;IAEO,eAAe;QACnB,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAW,CAAC,aAAa,CACvD,cAAc,CAChB,CAAC;IACP,CAAC;IAEO,mBAAmB,CACvB,MAAqB;QAErB,MAAM,OAAO,GAA6B,IAAI,CAAC,qBAAqB,CAAC,UAAW,CAAC,gBAAgB,CAC7F,sBAAsB,CACzB,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAEO,oBAAoB;QACxB,MAAM,OAAO,GAAa,IAAI,CAAC,iBAAiB,EAAG,CAAC;QACpD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,iBAAiB;QACrB,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,qBAAqB,CAAC,UAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CACrE,CAAC;IACN,CAAC;IAEO,iBAAiB;QACrB,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAW,CAAC,aAAa,CACvD,yBAAyB,CAC5B,CAAC;IACN,CAAC;IAEO,2BAA2B;QAC/B,OAAO,IAAI,CAAC,iBAAiB,EAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC;IAEO,yBAAyB;QAC7B,OAAO,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAE,CAAC;IACxD,CAAC;IAEO,6BAA6B,CACjC,WAAmC,EAAE;QAErC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CACzC;YACI,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,2BAA2B;YACxC,SAAS,EAAE,IAAI,6BAA6B,EAAE;SACjD,EACD,GAAG,EAAE,GAAE,CAAC,CACX,CAAC;QACF,gBAAgB,CAAC,OAAO,GAAG,YAAY,CAAC;QACxC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACvB,MAAM,aAAa,GAAG,IAAI,iBAAiB,CACvC,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,WAAW,CACtB,CAAC;YACF,gBAAgB,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,CAC3C,OAAO,CAAC,GAAG,EACX,aAAa,CAChB,CAAC;QACN,CAAC,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,IAAI,kCAAkC,CAC9D,gBAAgB,CACnB,CAAC;QACF,OAAO,mBAAmB,CAAC;IAC/B,CAAC;CACJ","sourcesContent":["import {\n keySpace,\n keyEnter,\n keyTab,\n keyEscape\n} from '@microsoft/fast-web-utilities';\nimport type { RichTextEditor } from '..';\nimport { waitForUpdatesAsync } from '../../../testing/async-helpers';\nimport type { ToggleButton } from '../../../toggle-button';\nimport {\n ArrowKeyButton,\n MappingConfiguration,\n ToolbarButton,\n ToolbarButtonKey\n} from './types';\nimport {\n getTagsFromElement,\n getLeafContentsFromElement,\n getLastChildElement,\n getLastChildElementAttribute\n} from '../../models/testing/markdown-parser-utils';\nimport { richTextMentionUsersViewTag } from '../../../rich-text-mention/users/view';\nimport { RichTextMarkdownParser } from '../../models/markdown-parser';\nimport { buttonTag, type Button } from '../../../button';\nimport { richTextMentionListboxTag } from '../../mention-listbox';\nimport { listOptionTag, type ListOption } from '../../../list-option';\nimport { anchoredRegionTag } from '../../../anchored-region';\nimport { iconAtTag } from '../../../icons/at';\nimport { MarkdownParserMentionConfiguration } from '../../models/markdown-parser-mention-configuration';\nimport { MentionInternals } from '../../../rich-text-mention/base/models/mention-internals';\nimport { MappingUserConfig } from '../../../rich-text-mention/users/models/mapping-user-config';\nimport { RichTextMentionUsersValidator } from '../../../rich-text-mention/users/models/rich-text-mention-users-validator';\n\n/**\n * Page object for the `nimble-rich-text-editor` component.\n */\nexport class RichTextEditorPageObject {\n public constructor(\n private readonly richTextEditorElement: RichTextEditor\n ) {}\n\n public editorSectionHasChildNodes(): boolean {\n const editorSection = this.getEditorSection();\n return editorSection!.hasChildNodes();\n }\n\n public getEditorSectionFirstElementChildClassName(): string {\n const editorSection = this.getEditorSection();\n return editorSection!.firstElementChild!.className;\n }\n\n public async clickEditorShortcutKeys(\n shortcutKey: string,\n isShiftKey: boolean\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: shortcutKey,\n ctrlKey: true,\n shiftKey: isShiftKey,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEnterKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEnter,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEscapeKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEscape,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressArrowKeyInEditor(\n arrowButton: ArrowKeyButton\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: arrowButton,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftEnterKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftEnterEvent = new KeyboardEvent('keydown', {\n key: keyEnter,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftEnterEvent);\n await waitForUpdatesAsync();\n }\n\n public async pressTabKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyTab,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftTabKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftTabEvent = new KeyboardEvent('keydown', {\n key: keyTab,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftTabEvent);\n await waitForUpdatesAsync();\n }\n\n /**\n * In testing environment, when clicking on the footer button, it may not persist in the same state if any editor transaction occurs in between.\n * This behavior is likely due to dynamic modifications of formatting button states based on cursor positions during editor transactions.\n * Setting the \"force\" parameter to true activates the formatting button state; when set to false, it deactivates the state.\n * If unset, the state toggles by interacting with it once.\n */\n public async toggleFooterButton(\n button: ToolbarButton,\n force?: boolean\n ): Promise<void> {\n const toggleButton = this.getFormattingButton(button);\n const event = new Event('mousedown', { bubbles: true });\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n let format = Object.keys(ToolbarButton).find(\n key => ToolbarButton[key as ToolbarButtonKey] === button\n );\n // In the editor, the isActive() method expects the format name to be 'italic' instead of 'italics.'\n // As it was consistently represent it as 'italics' elsewhere just updated it here\n if (format === 'italics') {\n format = 'italic';\n }\n if (force === true || force === false) {\n if (\n this.richTextEditorElement.tiptapEditor.isActive(format!)\n !== force\n ) {\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n }\n }\n await waitForUpdatesAsync();\n }\n\n public async clickUserMentionButton(): Promise<void> {\n const userMentionButton = this.getUserMentionButton();\n userMentionButton!.click();\n await waitForUpdatesAsync();\n }\n\n public getMentionButtonIcon(buttonIndex: number): string | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.firstElementChild?.tagName;\n }\n\n public getMentionButtonTitle(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.getAttribute('title') ?? '';\n }\n\n public getMentionButtonLabel(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.innerText ?? '';\n }\n\n public getButtonCheckedState(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.checked;\n }\n\n public getButtonTabIndex(button: ToolbarButton): number {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.tabIndex;\n }\n\n public spaceKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keySpace\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public enterKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keyEnter\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public pasteToEditor(text: string): void {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/plain', text);\n editor.dispatchEvent(pasteEvent);\n }\n\n // Simulate the actual pasting of content by passing the extracted HTML string as an argument and setting the format to 'text/html',\n // as in the [DataFormat](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\n // For example, when copying a link, the clipboard stores information that includes the anchor tag, href attribute value etc, and paste it as an HTML string\n public pasteHTMLToEditor(htmlString: string): void {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/html', htmlString);\n editor.dispatchEvent(pasteEvent);\n }\n\n public async setEditorTextContent(value: string): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: value\n })\n .run();\n await waitForUpdatesAsync();\n\n if (this.isMentionListboxOpened()) {\n this.richTextEditorElement.tiptapEditor.commands.focus();\n await waitForUpdatesAsync();\n }\n }\n\n public async setCursorPosition(position: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor.commands.setTextSelection(\n position\n );\n await waitForUpdatesAsync();\n }\n\n public async replaceEditorContent(value: string): Promise<void> {\n const lastElement = this.getEditorLastChildElement();\n lastElement.parentElement!.textContent = value;\n await waitForUpdatesAsync();\n }\n\n public async sliceEditorContent(from: number, to: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .deleteRange({ from, to })\n .run();\n await waitForUpdatesAsync();\n }\n\n public getEditorLastChildAttribute(attribute: string): string {\n return getLastChildElementAttribute(attribute, this.getTiptapEditor());\n }\n\n public isMentionListboxOpened(): boolean {\n return (\n !this.getMentionListbox()\n ?.shadowRoot?.querySelector(anchoredRegionTag)\n ?.hasAttribute('hidden') ?? false\n );\n }\n\n public getEditorMentionViewAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getTiptapEditor().querySelectorAll(richTextMentionUsersViewTag)\n ).map(el => el.getAttribute(attribute) || '');\n }\n\n public getEditorFirstChildTagName(): string {\n return this.getTiptapEditor().firstElementChild?.tagName ?? '';\n }\n\n public getEditorFirstChildTextContent(): string {\n return this.getTiptapEditor().firstElementChild?.textContent ?? '';\n }\n\n public getEditorTextContents(): string[] {\n return Array.from(this.getTiptapEditor().querySelectorAll('*')).map(\n el => el.textContent || ''\n );\n }\n\n public getEditorTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor());\n }\n\n // Return list of tags, excluding those such as 'IMG' (prosemirror-separator) that do not affect the UI or markdown output.\n // These tags are considered extraneous and are added by prosemirror.\n public getMarkdownRenderedTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor()).filter(\n tag => tag !== 'IMG'\n );\n }\n\n public getEditorLeafContents(): string[] {\n return getLeafContentsFromElement(this.getTiptapEditor());\n }\n\n public getEditorTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const tiptapEditor = this.getTiptapEditor();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n if (tiptapEditor) {\n processNode(tiptapEditor);\n }\n\n return tagNames.slice(1, -1);\n }\n\n public getFormattingButtonTextContent(\n toolbarButton: ToolbarButton\n ): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.textContent!.trim();\n }\n\n public getFormattingButtonTitle(toolbarButton: ToolbarButton): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.title;\n }\n\n public isRichTextEditorActiveElement(): boolean {\n return (\n document.activeElement === this.richTextEditorElement\n && document.activeElement?.shadowRoot?.activeElement\n === this.getTiptapEditor()\n );\n }\n\n public getEditorTabIndex(): string {\n return this.getTiptapEditor().getAttribute('tabindex') ?? '';\n }\n\n public async setFooterHidden(footerHidden: boolean): Promise<void> {\n if (footerHidden) {\n this.richTextEditorElement.setAttribute('footer-hidden', '');\n } else {\n this.richTextEditorElement.removeAttribute('footer-hidden');\n }\n await waitForUpdatesAsync();\n }\n\n public isFooterHidden(): boolean {\n const footerSection = this.getFooter()!;\n return window.getComputedStyle(footerSection).display === 'none';\n }\n\n public async setDisabled(disabled: boolean): Promise<void> {\n if (disabled) {\n this.richTextEditorElement.setAttribute('disabled', '');\n } else {\n this.richTextEditorElement.removeAttribute('disabled');\n }\n await waitForUpdatesAsync();\n }\n\n public isButtonDisabled(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button)!;\n return toggleButton.hasAttribute('disabled');\n }\n\n public getPlaceholderValue(): string {\n const editor = this.getTiptapEditor();\n return editor.firstElementChild?.getAttribute('data-placeholder') ?? '';\n }\n\n public getParsedHtmlFromMarkdown(\n markdown: string,\n mappings?: MappingConfiguration[]\n ): string {\n const parserMentionConfigForUser = this.getParserMentionConfigForUser(mappings);\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n [parserMentionConfigForUser]\n );\n return this.richTextEditorElement.xmlSerializer.serializeToString(\n parseResult.fragment\n );\n }\n\n public async focusOutEditor(): Promise<void> {\n const focusout = new FocusEvent('focusout');\n this.richTextEditorElement.dispatchEvent(focusout);\n await waitForUpdatesAsync();\n }\n\n public getMentionListboxItemsName(): string[] {\n const listItemsName: string[] = [];\n this.getAllListItemsInMentionBox().forEach(item => (item.hidden ? null : listItemsName.push(item.textContent!)));\n return listItemsName;\n }\n\n public getSelectedOption(): string {\n const nodeList = this.getAllListItemsInMentionBox();\n return (\n Array.from(nodeList).find(\n item => item.selected && !item.hasAttribute('hidden')\n )?.textContent ?? ''\n );\n }\n\n public async clickMentionListboxOption(index: number): Promise<void> {\n const listOption = this.getAllListItemsInMentionBox()[index];\n listOption?.click();\n await waitForUpdatesAsync();\n }\n\n public moveCursorToStart(): void {\n this.richTextEditorElement.tiptapEditor.commands.focus('start');\n }\n\n public getCursorPosition(): number {\n return this.richTextEditorElement.tiptapEditor.state.selection.anchor;\n }\n\n private getEditorSection(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot?.querySelector('.editor');\n }\n\n private getFooter(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n '.footer-section'\n );\n }\n\n private getTiptapEditor(): HTMLDivElement {\n return this.richTextEditorElement.shadowRoot!.querySelector<HTMLDivElement>(\n '.ProseMirror'\n )!;\n }\n\n private getFormattingButton(\n button: ToolbarButton\n ): ToggleButton | null | undefined {\n const buttons: NodeListOf<ToggleButton> = this.richTextEditorElement.shadowRoot!.querySelectorAll(\n 'nimble-toggle-button'\n );\n return buttons[button];\n }\n\n private getUserMentionButton(): Button | null | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons.find(button => button.querySelector(iconAtTag));\n }\n\n private getMentionButtons(): Button[] | null | undefined {\n return Array.from(\n this.richTextEditorElement.shadowRoot!.querySelectorAll(buttonTag)\n );\n }\n\n private getMentionListbox(): Element | null {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n richTextMentionListboxTag\n );\n }\n\n private getAllListItemsInMentionBox(): NodeListOf<ListOption> {\n return this.getMentionListbox()!.querySelectorAll(listOptionTag);\n }\n\n private getEditorLastChildElement(): Element {\n return getLastChildElement(this.getTiptapEditor())!;\n }\n\n private getParserMentionConfigForUser(\n mappings: MappingConfiguration[] = []\n ): MarkdownParserMentionConfiguration {\n const mentionInternals = new MentionInternals(\n {\n character: '',\n icon: '',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n },\n () => {}\n );\n mentionInternals.pattern = '^user:(.*)';\n mappings.forEach(mapping => {\n const mappingConfig = new MappingUserConfig(\n mapping.key,\n mapping.displayName\n );\n mentionInternals.mappingConfigs = new Map().set(\n mapping.key,\n mappingConfig\n );\n });\n const parserMentionConfig = new MarkdownParserMentionConfiguration(\n mentionInternals\n );\n return parserMentionConfig;\n }\n}\n"]}
1
+ {"version":3,"file":"rich-text-editor.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/testing/rich-text-editor.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n keySpace,\n keyEnter,\n keyTab,\n keyEscape\n} from '@microsoft/fast-web-utilities';\nimport type { RichTextEditor } from '..';\nimport { waitForUpdatesAsync } from '../../../testing/async-helpers';\nimport type { ToggleButton } from '../../../toggle-button';\nimport {\n ArrowKeyButton,\n MappingConfiguration,\n ToolbarButton,\n ToolbarButtonKey\n} from './types';\nimport {\n getTagsFromElement,\n getLeafContentsFromElement,\n getLastChildElement,\n getLastChildElementAttribute\n} from '../../models/testing/markdown-parser-utils';\nimport { richTextMentionUsersViewTag } from '../../../rich-text-mention/users/view';\nimport { RichTextMarkdownParser } from '../../models/markdown-parser';\nimport { buttonTag, type Button } from '../../../button';\nimport { richTextMentionListboxTag } from '../../mention-listbox';\nimport { listOptionTag, type ListOption } from '../../../list-option';\nimport { anchoredRegionTag } from '../../../anchored-region';\nimport { iconAtTag } from '../../../icons/at';\nimport { MarkdownParserMentionConfiguration } from '../../models/markdown-parser-mention-configuration';\nimport { MentionInternals } from '../../../rich-text-mention/base/models/mention-internals';\nimport { MappingUserConfig } from '../../../rich-text-mention/users/models/mapping-user-config';\nimport { RichTextMentionUsersValidator } from '../../../rich-text-mention/users/models/rich-text-mention-users-validator';\n\n/**\n * Page object for the `nimble-rich-text-editor` component.\n */\nexport class RichTextEditorPageObject {\n public constructor(\n private readonly richTextEditorElement: RichTextEditor\n ) {}\n\n public editorSectionHasChildNodes(): boolean {\n const editorSection = this.getEditorSection();\n return editorSection!.hasChildNodes();\n }\n\n public getEditorSectionFirstElementChildClassName(): string {\n const editorSection = this.getEditorSection();\n return editorSection!.firstElementChild!.className;\n }\n\n public async clickEditorShortcutKeys(\n shortcutKey: string,\n isShiftKey: boolean\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: shortcutKey,\n ctrlKey: true,\n shiftKey: isShiftKey,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEnterKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEnter,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEscapeKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEscape,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressArrowKeyInEditor(\n arrowButton: ArrowKeyButton\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: arrowButton,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftEnterKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftEnterEvent = new KeyboardEvent('keydown', {\n key: keyEnter,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftEnterEvent);\n await waitForUpdatesAsync();\n }\n\n public async pressTabKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyTab,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftTabKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftTabEvent = new KeyboardEvent('keydown', {\n key: keyTab,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftTabEvent);\n await waitForUpdatesAsync();\n }\n\n /**\n * In testing environment, when clicking on the footer button, it may not persist in the same state if any editor transaction occurs in between.\n * This behavior is likely due to dynamic modifications of formatting button states based on cursor positions during editor transactions.\n * Setting the \"force\" parameter to true activates the formatting button state; when set to false, it deactivates the state.\n * If unset, the state toggles by interacting with it once.\n */\n public async toggleFooterButton(\n button: ToolbarButton,\n force?: boolean\n ): Promise<void> {\n const toggleButton = this.getFormattingButton(button);\n const event = new Event('mousedown', { bubbles: true });\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n let format = Object.keys(ToolbarButton).find(\n key => ToolbarButton[key as ToolbarButtonKey] === button\n );\n // In the editor, the isActive() method expects the format name to be 'italic' instead of 'italics.'\n // As it was consistently represent it as 'italics' elsewhere just updated it here\n if (format === 'italics') {\n format = 'italic';\n }\n if (force === true || force === false) {\n if (\n this.richTextEditorElement.tiptapEditor.isActive(format!)\n !== force\n ) {\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n }\n }\n await waitForUpdatesAsync();\n }\n\n public async clickUserMentionButton(): Promise<void> {\n const userMentionButton = this.getUserMentionButton();\n userMentionButton!.click();\n await waitForUpdatesAsync();\n }\n\n public getMentionButtonIcon(buttonIndex: number): string | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.firstElementChild?.tagName;\n }\n\n public getMentionButtonTitle(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.getAttribute('title') ?? '';\n }\n\n public getMentionButtonLabel(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.innerText ?? '';\n }\n\n public getButtonCheckedState(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.checked;\n }\n\n public getButtonTabIndex(button: ToolbarButton): number {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.tabIndex;\n }\n\n public spaceKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keySpace\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public enterKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keyEnter\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public pasteToEditor(text: string): void {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/plain', text);\n editor.dispatchEvent(pasteEvent);\n }\n\n // Simulate the actual pasting of content by passing the extracted HTML string as an argument and setting the format to 'text/html',\n // as in the [DataFormat](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\n // For example, when copying a link, the clipboard stores information that includes the anchor tag, href attribute value etc, and paste it as an HTML string\n public pasteHTMLToEditor(htmlString: string): void {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/html', htmlString);\n editor.dispatchEvent(pasteEvent);\n }\n\n public async setEditorTextContent(value: string): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: value\n })\n .run();\n await waitForUpdatesAsync();\n\n if (this.isMentionListboxOpened()) {\n this.richTextEditorElement.tiptapEditor.commands.focus();\n await waitForUpdatesAsync();\n }\n }\n\n public async setCursorPosition(position: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor.commands.setTextSelection(\n position\n );\n await waitForUpdatesAsync();\n }\n\n public async replaceEditorContent(value: string): Promise<void> {\n const lastElement = this.getEditorLastChildElement();\n lastElement.parentElement!.textContent = value;\n await waitForUpdatesAsync();\n }\n\n public async sliceEditorContent(from: number, to: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .deleteRange({ from, to })\n .run();\n await waitForUpdatesAsync();\n }\n\n public getEditorLastChildAttribute(attribute: string): string {\n return getLastChildElementAttribute(attribute, this.getTiptapEditor());\n }\n\n public isMentionListboxOpened(): boolean {\n return (\n !this.getMentionListbox()\n ?.shadowRoot?.querySelector(anchoredRegionTag)\n ?.hasAttribute('hidden') ?? false\n );\n }\n\n public getEditorMentionViewAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getTiptapEditor().querySelectorAll(richTextMentionUsersViewTag)\n ).map(el => el.getAttribute(attribute) || '');\n }\n\n public getEditorFirstChildTagName(): string {\n return this.getTiptapEditor().firstElementChild?.tagName ?? '';\n }\n\n public getEditorFirstChildTextContent(): string {\n return this.getTiptapEditor().firstElementChild?.textContent ?? '';\n }\n\n public getEditorTextContents(): string[] {\n return Array.from(this.getTiptapEditor().querySelectorAll('*')).map(\n el => el.textContent || ''\n );\n }\n\n public getEditorTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor());\n }\n\n // Return list of tags, excluding those such as 'IMG' (prosemirror-separator) that do not affect the UI or markdown output.\n // These tags are considered extraneous and are added by prosemirror.\n public getMarkdownRenderedTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor()).filter(\n tag => tag !== 'IMG'\n );\n }\n\n public getEditorLeafContents(): string[] {\n return getLeafContentsFromElement(this.getTiptapEditor());\n }\n\n public getEditorTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const tiptapEditor = this.getTiptapEditor();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n if (tiptapEditor) {\n processNode(tiptapEditor);\n }\n\n return tagNames.slice(1, -1);\n }\n\n public getFormattingButtonTextContent(\n toolbarButton: ToolbarButton\n ): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.textContent!.trim();\n }\n\n public getFormattingButtonTitle(toolbarButton: ToolbarButton): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.title;\n }\n\n public isRichTextEditorActiveElement(): boolean {\n return (\n document.activeElement === this.richTextEditorElement\n && document.activeElement?.shadowRoot?.activeElement\n === this.getTiptapEditor()\n );\n }\n\n public getEditorTabIndex(): string {\n return this.getTiptapEditor().getAttribute('tabindex') ?? '';\n }\n\n public async setFooterHidden(footerHidden: boolean): Promise<void> {\n if (footerHidden) {\n this.richTextEditorElement.setAttribute('footer-hidden', '');\n } else {\n this.richTextEditorElement.removeAttribute('footer-hidden');\n }\n await waitForUpdatesAsync();\n }\n\n public isFooterHidden(): boolean {\n const footerSection = this.getFooter()!;\n return window.getComputedStyle(footerSection).display === 'none';\n }\n\n public async setDisabled(disabled: boolean): Promise<void> {\n if (disabled) {\n this.richTextEditorElement.setAttribute('disabled', '');\n } else {\n this.richTextEditorElement.removeAttribute('disabled');\n }\n await waitForUpdatesAsync();\n }\n\n public isButtonDisabled(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button)!;\n return toggleButton.hasAttribute('disabled');\n }\n\n public getPlaceholderValue(): string {\n const editor = this.getTiptapEditor();\n return editor.firstElementChild?.getAttribute('data-placeholder') ?? '';\n }\n\n public getParsedHtmlFromMarkdown(\n markdown: string,\n mappings?: MappingConfiguration[]\n ): string {\n const parserMentionConfigForUser = this.getParserMentionConfigForUser(mappings);\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n [parserMentionConfigForUser]\n );\n return this.richTextEditorElement.xmlSerializer.serializeToString(\n parseResult.fragment\n );\n }\n\n public async focusOutEditor(): Promise<void> {\n const focusout = new FocusEvent('focusout');\n this.richTextEditorElement.dispatchEvent(focusout);\n await waitForUpdatesAsync();\n }\n\n public getMentionListboxItemsName(): string[] {\n const listItemsName: string[] = [];\n this.getAllListItemsInMentionBox().forEach(item => (item.hidden ? null : listItemsName.push(item.textContent!)));\n return listItemsName;\n }\n\n public getSelectedOption(): string {\n const nodeList = this.getAllListItemsInMentionBox();\n return (\n Array.from(nodeList).find(\n item => item.selected && !item.hasAttribute('hidden')\n )?.textContent ?? ''\n );\n }\n\n public async clickMentionListboxOption(index: number): Promise<void> {\n const listOption = this.getAllListItemsInMentionBox()[index];\n listOption?.click();\n await waitForUpdatesAsync();\n }\n\n public moveCursorToStart(): void {\n this.richTextEditorElement.tiptapEditor.commands.focus('start');\n }\n\n public getCursorPosition(): number {\n return this.richTextEditorElement.tiptapEditor.state.selection.anchor;\n }\n\n private getEditorSection(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot?.querySelector('.editor');\n }\n\n private getFooter(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n '.footer-section'\n );\n }\n\n private getTiptapEditor(): HTMLDivElement {\n return this.richTextEditorElement.shadowRoot!.querySelector<HTMLDivElement>(\n '.ProseMirror'\n )!;\n }\n\n private getFormattingButton(\n button: ToolbarButton\n ): ToggleButton | null | undefined {\n const buttons: NodeListOf<ToggleButton> = this.richTextEditorElement.shadowRoot!.querySelectorAll(\n 'nimble-toggle-button'\n );\n return buttons[button];\n }\n\n private getUserMentionButton(): Button | null | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons.find(button => button.querySelector(iconAtTag));\n }\n\n private getMentionButtons(): Button[] | null | undefined {\n return Array.from(\n this.richTextEditorElement.shadowRoot!.querySelectorAll(buttonTag)\n );\n }\n\n private getMentionListbox(): Element | null {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n richTextMentionListboxTag\n );\n }\n\n private getAllListItemsInMentionBox(): NodeListOf<ListOption> {\n return this.getMentionListbox()!.querySelectorAll(listOptionTag);\n }\n\n private getEditorLastChildElement(): Element {\n return getLastChildElement(this.getTiptapEditor())!;\n }\n\n private getParserMentionConfigForUser(\n mappings: MappingConfiguration[] = []\n ): MarkdownParserMentionConfiguration {\n const mentionInternals = new MentionInternals(\n {\n character: '',\n icon: '',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n },\n () => {}\n );\n mentionInternals.pattern = '^user:(.*)';\n mappings.forEach(mapping => {\n const mappingConfig = new MappingUserConfig(\n mapping.key,\n mapping.displayName\n );\n mentionInternals.mappingConfigs = new Map().set(\n mapping.key,\n mappingConfig\n );\n });\n const parserMentionConfig = new MarkdownParserMentionConfiguration(\n mentionInternals\n );\n return parserMentionConfig;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/mention-listbox/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Notifier, Observable, observable } from '@microsoft/fast-element';\nimport {\n DesignSystem,\n ListboxElement as FoundationListbox,\n ListboxOption\n} from '@microsoft/fast-foundation';\nimport { keyEnter, keyEscape, keyTab } from '@microsoft/fast-web-utilities';\nimport type { MentionDetail } from '../editor/types';\nimport { styles } from './styles';\nimport { template } from './template';\nimport type { AnchoredRegion } from '../../anchored-region';\nimport { diacriticInsensitiveStringNormalizer } from '../../utilities/models/string-normalizers';\nimport type { ListOption } from '../../list-option';\nimport type { MentionListboxShowOptions } from './types';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-mention-listbox': RichTextMentionListbox;\n }\n}\n\n/**\n * A rich text mention listbox which acts as a popup for \"@mention\" support in editor\n */\nexport class RichTextMentionListbox extends FoundationListbox {\n /**\n * @internal\n */\n @observable\n public open?: boolean;\n\n /**\n * @internal\n */\n @observable\n public region?: AnchoredRegion;\n\n /**\n * The space available in the viewport for the listbox when opened.\n *\n * @internal\n */\n @observable\n public availableViewportHeight = 0;\n\n /**\n * @internal\n */\n public filter = '';\n\n /**\n * The collection of currently filtered options.\n * The approach is defined based on the `Combobox.filteredOptions` implementation.\n *\n * @internal\n */\n public filteredOptions: ListboxOption[] = [];\n\n /**\n * Reference to the internal listbox element.\n *\n * @internal\n */\n public listbox!: HTMLDivElement;\n\n @observable\n private anchorElement?: HTMLElement;\n\n private regionNotifier?: Notifier;\n\n private readonly anchorElementIntersectionObserver: IntersectionObserver = new IntersectionObserver(\n entries => {\n if (!entries[0]?.isIntersecting) {\n this.setOpen(false);\n }\n },\n { threshold: 1.0, root: document }\n );\n\n /**\n * @public\n */\n public close(): void {\n this.setOpen(false);\n }\n\n /**\n * The list of options.\n *\n * @public\n * @remarks\n * Overrides `Listbox.options`.\n */\n public override get options(): ListboxOption[] {\n Observable.track(this, 'options');\n return this.filteredOptions?.length ? this.filteredOptions : [];\n }\n\n public override set options(value: ListboxOption[]) {\n this._options = value;\n Observable.notify(this, 'options');\n }\n\n /**\n * Triggers when the mention plugin is activated upon pressing the `key`\n *\n * @public\n */\n public show(options: MentionListboxShowOptions): void {\n const listboxTop = options.anchorNode.getBoundingClientRect().bottom;\n this.availableViewportHeight = Math.trunc(\n window.innerHeight - listboxTop\n );\n this.filter = options.filter;\n this.anchorElement = options.anchorNode;\n this.setOpen(true);\n this.filterOptions();\n }\n\n /**\n * Handle keydown actions for listbox navigation and selection.\n *\n * @param e - the keyboard event\n * @public\n */\n public override keydownHandler(event: KeyboardEvent): boolean {\n if (!this.open) {\n return false;\n }\n switch (event.key) {\n case keyTab:\n case keyEnter: {\n if (!this.hasSelectableOptions) {\n return false;\n }\n const mentionDetail: MentionDetail = {\n href: this.firstSelectedOption.value,\n displayName: this.firstSelectedOption.text\n };\n this.$emit('mention-selected', mentionDetail);\n this.setOpen(false);\n return true;\n }\n case keyEscape: {\n this.setOpen(false);\n return false;\n }\n default: {\n super.keydownHandler(event);\n return false;\n }\n }\n }\n\n /**\n * Filter available options by filter value.\n * The method is defined based on the `Combobox.filterOptions` and `Combobox.inputHandler` implementation.\n *\n * @internal\n */\n public filterOptions(): void {\n if (!this.filter) {\n this.filteredOptions = this._options;\n } else {\n const normalizedFilter = diacriticInsensitiveStringNormalizer(\n this.filter\n );\n this.filteredOptions = this._options.filter(o => diacriticInsensitiveStringNormalizer(o.text).includes(\n normalizedFilter\n ));\n }\n\n this._options.forEach(o => {\n o.hidden = !this.filteredOptions.includes(o);\n });\n\n if (this.filteredOptions.length) {\n this.selectedOptions = [this.filteredOptions[0]!];\n this.selectedIndex = this.options.indexOf(this.firstSelectedOption);\n } else {\n this.selectedOptions = [];\n this.selectedIndex = -1;\n }\n }\n\n /**\n * Synchronize the form-associated proxy and update the value property of the element.\n *\n * @param prev - the previous collection of slotted option elements\n * @param next - the next collection of slotted option elements\n *\n * @internal\n */\n public override slottedOptionsChanged(\n prev: Element[] | undefined,\n next: Element[]\n ): void {\n super.slottedOptionsChanged(prev, next);\n this.filterOptions();\n }\n\n /**\n * Triggers the `suggestionProps` command to notify the tiptap editor to select the option.\n * The method is defined based on the `Listbox.clickHandler` implementation.\n *\n * @internal\n */\n public override clickHandler(e: MouseEvent): boolean {\n const capturedElement = (e.target as HTMLElement).closest(\n 'option,[role=option]'\n );\n\n const capturedListOption = capturedElement as ListOption | null;\n\n if (!capturedListOption || capturedListOption.disabled) {\n return false;\n }\n const mentionDetail: MentionDetail = {\n href: capturedListOption.value,\n displayName: capturedListOption.text\n };\n this.$emit('mention-selected', mentionDetail);\n this.setOpen(false);\n return true;\n }\n\n /**\n * Observes the anchor element using intersection observer.\n * Once the anchor element intersects, the anchor region will be closed.\n *\n * @internal\n */\n public anchorElementChanged(prev: HTMLElement, next: HTMLElement): void {\n if (prev) {\n this.anchorElementIntersectionObserver.unobserve(prev);\n }\n if (this.region && this.anchorElement) {\n this.region.anchorElement = this.anchorElement;\n this.region.update();\n this.anchorElementIntersectionObserver.observe(next);\n }\n }\n\n /**\n * Observes the anchor region.\n *\n * @internal\n */\n public regionChanged(): void {\n if (this.regionNotifier) {\n this.regionNotifier.unsubscribe(this);\n }\n this.regionNotifier = Observable.getNotifier(this.region);\n this.regionNotifier.subscribe(this);\n }\n\n /**\n * Handles the events of the anchored region.\n * Repositions the listbox scroll bar when the `initialLayoutComplete` event is triggered.\n * Other events will be passed to the base class.\n *\n * @internal\n */\n public override handleChange(source: unknown, args: string): void {\n super.handleChange(source, args);\n if (args === 'initialLayoutComplete') {\n this.focusAndScrollOptionIntoView();\n }\n }\n\n /**\n * Focus the control and scroll the first selected option into view.\n *\n * @internal\n * @remarks\n * Overrides: `Listbox.focusAndScrollOptionIntoView`\n */\n protected override focusAndScrollOptionIntoView(): void {\n if (this.open && this.firstSelectedOption) {\n requestAnimationFrame(() => {\n this.firstSelectedOption?.scrollIntoView({ block: 'nearest' });\n });\n }\n }\n\n private setOpen(value: boolean): void {\n this.open = value;\n }\n}\n\nconst nimbleRichTextMentionListbox = RichTextMentionListbox.compose({\n baseName: 'rich-text-mention-listbox',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextMentionListbox());\nexport const richTextMentionListboxTag = 'nimble-rich-text-mention-listbox';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/mention-listbox/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Notifier, Observable, observable } from '@microsoft/fast-element';\nimport {\n DesignSystem,\n ListboxElement as FoundationListbox,\n ListboxOption\n} from '@microsoft/fast-foundation';\nimport { keyEnter, keyEscape, keyTab } from '@microsoft/fast-web-utilities';\nimport type { MentionDetail } from '../editor/types';\nimport { styles } from './styles';\nimport { template } from './template';\nimport type { AnchoredRegion } from '../../anchored-region';\nimport { diacriticInsensitiveStringNormalizer } from '../../utilities/models/string-normalizers';\nimport type { ListOption } from '../../list-option';\nimport type { MentionListboxShowOptions } from './types';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-mention-listbox': RichTextMentionListbox;\n }\n}\n\n/**\n * A rich text mention listbox which acts as a popup for \"@mention\" support in editor\n */\nexport class RichTextMentionListbox extends FoundationListbox {\n /**\n * @internal\n */\n @observable\n public open?: boolean;\n\n /**\n * @internal\n */\n @observable\n public region?: AnchoredRegion;\n\n /**\n * The space available in the viewport for the listbox when opened.\n *\n * @internal\n */\n @observable\n public availableViewportHeight = 0;\n\n /**\n * @internal\n */\n public filter = '';\n\n /**\n * The collection of currently filtered options.\n * The approach is defined based on the `Combobox.filteredOptions` implementation.\n *\n * @internal\n */\n public filteredOptions: ListboxOption[] = [];\n\n /**\n * Reference to the internal listbox element.\n *\n * @internal\n */\n public listbox!: HTMLDivElement;\n\n @observable\n private anchorElement?: HTMLElement;\n\n private regionNotifier?: Notifier;\n\n private readonly anchorElementIntersectionObserver: IntersectionObserver = new IntersectionObserver(\n entries => {\n if (!entries[0]?.isIntersecting) {\n this.setOpen(false);\n }\n },\n { threshold: 1.0, root: document }\n );\n\n /**\n * @public\n */\n public close(): void {\n this.setOpen(false);\n }\n\n /**\n * The list of options.\n *\n * @public\n * @remarks\n * Overrides `Listbox.options`.\n */\n public override get options(): ListboxOption[] {\n Observable.track(this, 'options');\n return this.filteredOptions?.length ? this.filteredOptions : [];\n }\n\n public override set options(value: ListboxOption[]) {\n this._options = value;\n Observable.notify(this, 'options');\n }\n\n /**\n * Triggers when the mention plugin is activated upon pressing the `key`\n *\n * @public\n */\n public show(options: MentionListboxShowOptions): void {\n const listboxTop = options.anchorNode.getBoundingClientRect().bottom;\n this.availableViewportHeight = Math.trunc(\n window.innerHeight - listboxTop\n );\n this.filter = options.filter;\n this.anchorElement = options.anchorNode;\n this.setOpen(true);\n this.filterOptions();\n }\n\n /**\n * Handle keydown actions for listbox navigation and selection.\n *\n * @param e - the keyboard event\n * @public\n */\n public override keydownHandler(event: KeyboardEvent): boolean {\n if (!this.open) {\n return false;\n }\n switch (event.key) {\n case keyTab:\n case keyEnter: {\n if (!this.hasSelectableOptions) {\n return false;\n }\n const mentionDetail: MentionDetail = {\n href: this.firstSelectedOption.value,\n displayName: this.firstSelectedOption.text\n };\n this.$emit('mention-selected', mentionDetail);\n this.setOpen(false);\n return true;\n }\n case keyEscape: {\n this.setOpen(false);\n return false;\n }\n default: {\n super.keydownHandler(event);\n return false;\n }\n }\n }\n\n /**\n * Filter available options by filter value.\n * The method is defined based on the `Combobox.filterOptions` and `Combobox.inputHandler` implementation.\n *\n * @internal\n */\n public filterOptions(): void {\n if (!this.filter) {\n this.filteredOptions = this._options;\n } else {\n const normalizedFilter = diacriticInsensitiveStringNormalizer(\n this.filter\n );\n this.filteredOptions = this._options.filter(o => diacriticInsensitiveStringNormalizer(o.text).includes(\n normalizedFilter\n ));\n }\n\n this._options.forEach(o => {\n o.hidden = !this.filteredOptions.includes(o);\n });\n\n if (this.filteredOptions.length) {\n this.selectedOptions = [this.filteredOptions[0]!];\n this.selectedIndex = this.options.indexOf(this.firstSelectedOption);\n } else {\n this.selectedOptions = [];\n this.selectedIndex = -1;\n }\n }\n\n /**\n * Synchronize the form-associated proxy and update the value property of the element.\n *\n * @param prev - the previous collection of slotted option elements\n * @param next - the next collection of slotted option elements\n *\n * @internal\n */\n public override slottedOptionsChanged(\n prev: Element[] | undefined,\n next: Element[]\n ): void {\n super.slottedOptionsChanged(prev, next);\n this.filterOptions();\n }\n\n /**\n * Triggers the `suggestionProps` command to notify the tiptap editor to select the option.\n * The method is defined based on the `Listbox.clickHandler` implementation.\n *\n * @internal\n */\n public override clickHandler(e: MouseEvent): boolean {\n const capturedElement = (e.target as HTMLElement).closest(\n 'option,[role=option]'\n );\n\n const capturedListOption = capturedElement as ListOption | null;\n\n if (!capturedListOption || capturedListOption.disabled) {\n return false;\n }\n const mentionDetail: MentionDetail = {\n href: capturedListOption.value,\n displayName: capturedListOption.text\n };\n this.$emit('mention-selected', mentionDetail);\n this.setOpen(false);\n return true;\n }\n\n /**\n * Observes the anchor element using intersection observer.\n * Once the anchor element intersects, the anchor region will be closed.\n *\n * @internal\n */\n public anchorElementChanged(prev: HTMLElement, next: HTMLElement): void {\n if (prev) {\n this.anchorElementIntersectionObserver.unobserve(prev);\n }\n if (this.region && this.anchorElement) {\n this.region.anchorElement = this.anchorElement;\n this.region.update();\n this.anchorElementIntersectionObserver.observe(next);\n }\n }\n\n /**\n * Observes the anchor region.\n *\n * @internal\n */\n public regionChanged(): void {\n if (this.regionNotifier) {\n this.regionNotifier.unsubscribe(this);\n }\n this.regionNotifier = Observable.getNotifier(this.region);\n this.regionNotifier.subscribe(this);\n }\n\n /**\n * Handles the events of the anchored region.\n * Repositions the listbox scroll bar when the `initialLayoutComplete` event is triggered.\n * Other events will be passed to the base class.\n *\n * @internal\n */\n public override handleChange(source: unknown, args: string): void {\n super.handleChange(source, args);\n if (args === 'initialLayoutComplete') {\n this.focusAndScrollOptionIntoView();\n }\n }\n\n /**\n * Focus the control and scroll the first selected option into view.\n *\n * @internal\n * @remarks\n * Overrides: `Listbox.focusAndScrollOptionIntoView`\n */\n protected override focusAndScrollOptionIntoView(): void {\n if (this.open && this.firstSelectedOption) {\n requestAnimationFrame(() => {\n this.firstSelectedOption?.scrollIntoView({ block: 'nearest' });\n });\n }\n }\n\n private setOpen(value: boolean): void {\n this.open = value;\n }\n}\n\nconst nimbleRichTextMentionListbox = RichTextMentionListbox.compose({\n baseName: 'rich-text-mention-listbox',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextMentionListbox());\nexport const richTextMentionListboxTag = 'nimble-rich-text-mention-listbox';\n"]}
@@ -13,21 +13,21 @@ export class RichTextMarkdownParser {
13
13
  */
14
14
  static parseMarkdownToDOM(value, markdownParserMentionConfig) {
15
15
  try {
16
- RichTextMarkdownParser.setup(markdownParserMentionConfig);
16
+ _a.setup(markdownParserMentionConfig);
17
17
  const parsedMarkdownContent = this.markdownParser.parse(value);
18
18
  if (parsedMarkdownContent === null) {
19
19
  return {
20
20
  fragment: document.createDocumentFragment(),
21
- mentionedHrefs: Array.from(RichTextMarkdownParser.mentionedHrefs)
21
+ mentionedHrefs: Array.from(_a.mentionedHrefs)
22
22
  };
23
23
  }
24
24
  return {
25
25
  fragment: this.domSerializer.serializeFragment(parsedMarkdownContent.content),
26
- mentionedHrefs: Array.from(RichTextMarkdownParser.mentionedHrefs)
26
+ mentionedHrefs: Array.from(_a.mentionedHrefs)
27
27
  };
28
28
  }
29
29
  finally {
30
- RichTextMarkdownParser.cleanup();
30
+ _a.cleanup();
31
31
  }
32
32
  }
33
33
  static initializeMarkdownParser() {
@@ -79,10 +79,10 @@ export class RichTextMarkdownParser {
79
79
  excludes: '_',
80
80
  toDOM(node) {
81
81
  const href = node.attrs.href;
82
- const currentMention = RichTextMarkdownParser.mentionConfigs?.find(mention => mention.isValidMentionHref(href));
82
+ const currentMention = _a.mentionConfigs?.find(mention => mention.isValidMentionHref(href));
83
83
  const displayName = currentMention?.getDisplayName(href);
84
84
  if (currentMention && displayName) {
85
- RichTextMarkdownParser.mentionedHrefs.add(href);
85
+ _a.mentionedHrefs.add(href);
86
86
  return [
87
87
  currentMention.viewElement,
88
88
  {
@@ -101,7 +101,7 @@ export class RichTextMarkdownParser {
101
101
  * scheme and no matching mention pattern will be rendered as plain text (anchor with no href).
102
102
  * With this, the user can click the links only when the scheme is HTTP/HTTPS
103
103
  */
104
- href: RichTextMarkdownParser.startsWithHttpOrHttps(href)
104
+ href: _a.startsWithHttpOrHttps(href)
105
105
  ? href
106
106
  : null,
107
107
  rel: node.attrs.rel,
@@ -109,7 +109,7 @@ export class RichTextMarkdownParser {
109
109
  // This attribute can be removed when the below issue is resolved
110
110
  // https://github.com/ni/nimble/issues/1707
111
111
  class: href,
112
- 'underline-hidden': RichTextMarkdownParser.startsWithHttpOrHttps(href)
112
+ 'underline-hidden': _a.startsWithHttpOrHttps(href)
113
113
  ? null
114
114
  : true
115
115
  }
@@ -122,12 +122,12 @@ export class RichTextMarkdownParser {
122
122
  });
123
123
  }
124
124
  static setup(markdownParserMentionConfig) {
125
- RichTextMarkdownParser.mentionConfigs = markdownParserMentionConfig;
126
- RichTextMarkdownParser.mentionedHrefs.clear();
125
+ _a.mentionConfigs = markdownParserMentionConfig;
126
+ _a.mentionedHrefs.clear();
127
127
  }
128
128
  static cleanup() {
129
- RichTextMarkdownParser.mentionConfigs = undefined;
130
- RichTextMarkdownParser.mentionedHrefs.clear();
129
+ _a.mentionConfigs = undefined;
130
+ _a.mentionedHrefs.clear();
131
131
  }
132
132
  static startsWithHttpOrHttps(href) {
133
133
  return /^https?:\/\//i.test(href);
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../../src/rich-text/models/markdown-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n schema,\n defaultMarkdownParser,\n MarkdownParser\n} from 'prosemirror-markdown';\nimport { DOMSerializer, Schema } from 'prosemirror-model';\nimport { anchorTag } from '../../anchor';\nimport type { MarkdownParserMentionConfiguration } from './markdown-parser-mention-configuration';\n\nexport interface ParseResult {\n fragment: HTMLElement | DocumentFragment;\n mentionedHrefs: string[];\n}\n\n/**\n * Provides markdown parser for rich text components\n */\nexport class RichTextMarkdownParser {\n private static readonly mentionedHrefs: Set<string> = new Set();\n private static readonly updatedSchema = this.getCustomSchemaConfiguration();\n\n private static readonly markdownParser = this.initializeMarkdownParser();\n private static readonly domSerializer = DOMSerializer.fromSchema(\n this.updatedSchema\n );\n\n /**\n * The markdown parser is static (shared across all rich text components) because it is expensive to create.\n * To configure parse calls with the mention configurations which can be unique per component instance\n * we store static configuration in this member and access it from Prosemirror callbacks.\n */\n private static mentionConfigs?: MarkdownParserMentionConfiguration[];\n\n /**\n * This function takes a markdown string, parses it using the ProseMirror MarkdownParser, serializes the parsed content into a\n * DOM structure using a DOMSerializer, and returns the serialized result.\n * If the markdown parser returns null, it will clear the viewer component by creating an empty document fragment.\n */\n public static parseMarkdownToDOM(\n value: string,\n markdownParserMentionConfig?: MarkdownParserMentionConfiguration[]\n ): ParseResult {\n try {\n RichTextMarkdownParser.setup(markdownParserMentionConfig);\n const parsedMarkdownContent = this.markdownParser.parse(value);\n if (parsedMarkdownContent === null) {\n return {\n fragment: document.createDocumentFragment(),\n mentionedHrefs: Array.from(\n RichTextMarkdownParser.mentionedHrefs\n )\n };\n }\n return {\n fragment: this.domSerializer.serializeFragment(\n parsedMarkdownContent.content\n ),\n mentionedHrefs: Array.from(\n RichTextMarkdownParser.mentionedHrefs\n )\n };\n } finally {\n RichTextMarkdownParser.cleanup();\n }\n }\n\n private static initializeMarkdownParser(): MarkdownParser {\n /**\n * It configures the tokenizer of the default Markdown parser with the 'zero' preset.\n * The 'zero' preset is a configuration with no rules enabled by default to selectively enable specific rules.\n * https://github.com/markdown-it/markdown-it/blob/2b6cac25823af011ff3bc7628bc9b06e483c5a08/lib/presets/zero.js#L1\n *\n */\n const zeroTokenizerConfiguration = defaultMarkdownParser.tokenizer.configure('zero');\n\n // The detailed information of the supported rules were provided in the below CommonMark spec document.\n // https://spec.commonmark.org/0.30/\n const supportedTokenizerRules = zeroTokenizerConfiguration.enable([\n 'emphasis',\n 'list',\n 'escape',\n 'autolink',\n 'newline'\n ]);\n\n /**\n * In order to display encoded characters, non-ASCII characters, emojis, and other special characters in their original form,\n * we bypass the default normalization of link text in markdown-it. This is done because we support only \"AutoLink\" feature in CommonMark flavor.\n * \"normalizeLinkText\" method reference in markdown-it: https://github.com/markdown-it/markdown-it/blob/2b6cac25823af011ff3bc7628bc9b06e483c5a08/lib/index.js#L67C1-L86C2\n *\n * We can use the default normalization once hyperlink support is added.\n * See: https://github.com/ni/nimble/issues/1527\n */\n supportedTokenizerRules.normalizeLinkText = url => url;\n\n return new MarkdownParser(\n this.updatedSchema,\n supportedTokenizerRules,\n defaultMarkdownParser.tokens\n );\n }\n\n private static getCustomSchemaConfiguration(): Schema {\n return new Schema({\n nodes: schema.spec.nodes,\n marks: {\n link: {\n attrs: {\n href: {},\n rel: { default: 'noopener noreferrer' },\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: { default: '' }\n },\n // Inclusive can be updated when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n inclusive: false,\n // Excludes can be removed/enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n excludes: '_',\n toDOM(node) {\n const href = node.attrs.href as string;\n const currentMention = RichTextMarkdownParser.mentionConfigs?.find(\n mention => mention.isValidMentionHref(href)\n );\n const displayName = currentMention?.getDisplayName(href);\n\n if (currentMention && displayName) {\n RichTextMarkdownParser.mentionedHrefs.add(href);\n\n return [\n currentMention.viewElement,\n {\n 'mention-href': href,\n 'mention-label': displayName\n }\n ];\n }\n\n return [\n anchorTag,\n {\n /**\n * Both mention and absolute link markdown share the autolink format in CommonMark flavor.\n * Absolute links with HTTP/HTTPS will be rendered as links. Absolute links that match the\n * mention pattern will be rendered as mention view element. Absolute links without HTTP/HTTPS\n * scheme and no matching mention pattern will be rendered as plain text (anchor with no href).\n * With this, the user can click the links only when the scheme is HTTP/HTTPS\n */\n href: RichTextMarkdownParser.startsWithHttpOrHttps(\n href\n )\n ? href\n : null,\n rel: node.attrs.rel as Attr,\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: href,\n 'underline-hidden':\n RichTextMarkdownParser.startsWithHttpOrHttps(\n href\n )\n ? null\n : true\n }\n ];\n }\n },\n em: schema.spec.marks.get('em')!,\n strong: schema.spec.marks.get('strong')!\n }\n });\n }\n\n private static setup(\n markdownParserMentionConfig:\n | MarkdownParserMentionConfiguration[]\n | undefined\n ): void {\n RichTextMarkdownParser.mentionConfigs = markdownParserMentionConfig;\n RichTextMarkdownParser.mentionedHrefs.clear();\n }\n\n private static cleanup(): void {\n RichTextMarkdownParser.mentionConfigs = undefined;\n RichTextMarkdownParser.mentionedHrefs.clear();\n }\n\n private static startsWithHttpOrHttps(href: string): boolean {\n return /^https?:\\/\\//i.test(href);\n }\n}\n"]}
1
+ {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../../src/rich-text/models/markdown-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n schema,\n defaultMarkdownParser,\n MarkdownParser\n} from 'prosemirror-markdown';\nimport { DOMSerializer, Schema } from 'prosemirror-model';\nimport { anchorTag } from '../../anchor';\nimport type { MarkdownParserMentionConfiguration } from './markdown-parser-mention-configuration';\n\nexport interface ParseResult {\n fragment: HTMLElement | DocumentFragment;\n mentionedHrefs: string[];\n}\n\n/**\n * Provides markdown parser for rich text components\n */\nexport class RichTextMarkdownParser {\n private static readonly mentionedHrefs: Set<string> = new Set();\n private static readonly updatedSchema = this.getCustomSchemaConfiguration();\n\n private static readonly markdownParser = this.initializeMarkdownParser();\n private static readonly domSerializer = DOMSerializer.fromSchema(\n this.updatedSchema\n );\n\n /**\n * The markdown parser is static (shared across all rich text components) because it is expensive to create.\n * To configure parse calls with the mention configurations which can be unique per component instance\n * we store static configuration in this member and access it from Prosemirror callbacks.\n */\n private static mentionConfigs?: MarkdownParserMentionConfiguration[];\n\n /**\n * This function takes a markdown string, parses it using the ProseMirror MarkdownParser, serializes the parsed content into a\n * DOM structure using a DOMSerializer, and returns the serialized result.\n * If the markdown parser returns null, it will clear the viewer component by creating an empty document fragment.\n */\n public static parseMarkdownToDOM(\n value: string,\n markdownParserMentionConfig?: MarkdownParserMentionConfiguration[]\n ): ParseResult {\n try {\n RichTextMarkdownParser.setup(markdownParserMentionConfig);\n const parsedMarkdownContent = this.markdownParser.parse(value);\n if (parsedMarkdownContent === null) {\n return {\n fragment: document.createDocumentFragment(),\n mentionedHrefs: Array.from(\n RichTextMarkdownParser.mentionedHrefs\n )\n };\n }\n return {\n fragment: this.domSerializer.serializeFragment(\n parsedMarkdownContent.content\n ),\n mentionedHrefs: Array.from(\n RichTextMarkdownParser.mentionedHrefs\n )\n };\n } finally {\n RichTextMarkdownParser.cleanup();\n }\n }\n\n private static initializeMarkdownParser(): MarkdownParser {\n /**\n * It configures the tokenizer of the default Markdown parser with the 'zero' preset.\n * The 'zero' preset is a configuration with no rules enabled by default to selectively enable specific rules.\n * https://github.com/markdown-it/markdown-it/blob/2b6cac25823af011ff3bc7628bc9b06e483c5a08/lib/presets/zero.js#L1\n *\n */\n const zeroTokenizerConfiguration = defaultMarkdownParser.tokenizer.configure('zero');\n\n // The detailed information of the supported rules were provided in the below CommonMark spec document.\n // https://spec.commonmark.org/0.30/\n const supportedTokenizerRules = zeroTokenizerConfiguration.enable([\n 'emphasis',\n 'list',\n 'escape',\n 'autolink',\n 'newline'\n ]);\n\n /**\n * In order to display encoded characters, non-ASCII characters, emojis, and other special characters in their original form,\n * we bypass the default normalization of link text in markdown-it. This is done because we support only \"AutoLink\" feature in CommonMark flavor.\n * \"normalizeLinkText\" method reference in markdown-it: https://github.com/markdown-it/markdown-it/blob/2b6cac25823af011ff3bc7628bc9b06e483c5a08/lib/index.js#L67C1-L86C2\n *\n * We can use the default normalization once hyperlink support is added.\n * See: https://github.com/ni/nimble/issues/1527\n */\n supportedTokenizerRules.normalizeLinkText = url => url;\n\n return new MarkdownParser(\n this.updatedSchema,\n supportedTokenizerRules,\n defaultMarkdownParser.tokens\n );\n }\n\n private static getCustomSchemaConfiguration(): Schema {\n return new Schema({\n nodes: schema.spec.nodes,\n marks: {\n link: {\n attrs: {\n href: {},\n rel: { default: 'noopener noreferrer' },\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: { default: '' }\n },\n // Inclusive can be updated when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n inclusive: false,\n // Excludes can be removed/enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n excludes: '_',\n toDOM(node) {\n const href = node.attrs.href as string;\n const currentMention = RichTextMarkdownParser.mentionConfigs?.find(\n mention => mention.isValidMentionHref(href)\n );\n const displayName = currentMention?.getDisplayName(href);\n\n if (currentMention && displayName) {\n RichTextMarkdownParser.mentionedHrefs.add(href);\n\n return [\n currentMention.viewElement,\n {\n 'mention-href': href,\n 'mention-label': displayName\n }\n ];\n }\n\n return [\n anchorTag,\n {\n /**\n * Both mention and absolute link markdown share the autolink format in CommonMark flavor.\n * Absolute links with HTTP/HTTPS will be rendered as links. Absolute links that match the\n * mention pattern will be rendered as mention view element. Absolute links without HTTP/HTTPS\n * scheme and no matching mention pattern will be rendered as plain text (anchor with no href).\n * With this, the user can click the links only when the scheme is HTTP/HTTPS\n */\n href: RichTextMarkdownParser.startsWithHttpOrHttps(\n href\n )\n ? href\n : null,\n rel: node.attrs.rel as Attr,\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: href,\n 'underline-hidden':\n RichTextMarkdownParser.startsWithHttpOrHttps(\n href\n )\n ? null\n : true\n }\n ];\n }\n },\n em: schema.spec.marks.get('em')!,\n strong: schema.spec.marks.get('strong')!\n }\n });\n }\n\n private static setup(\n markdownParserMentionConfig:\n | MarkdownParserMentionConfiguration[]\n | undefined\n ): void {\n RichTextMarkdownParser.mentionConfigs = markdownParserMentionConfig;\n RichTextMarkdownParser.mentionedHrefs.clear();\n }\n\n private static cleanup(): void {\n RichTextMarkdownParser.mentionConfigs = undefined;\n RichTextMarkdownParser.mentionedHrefs.clear();\n }\n\n private static startsWithHttpOrHttps(href: string): boolean {\n return /^https?:\\/\\//i.test(href);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-tracker.js","sourceRoot":"","sources":["../../../../src/rich-text/models/rich-text-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAGtE,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAU,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAkC;IAGzE,YAAoC,QAAkB;QAClD,KAAK,CAAC,YAAY,CAAC,CAAC;QADY,aAAQ,GAAR,QAAQ,CAAU;QAF9C,iBAAY,GAAG,KAAK,CAAC;IAI7B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,IAAW,oBAAoB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAEM,oCAAoC,CACvC,+BAAuC;QAEvC,QAAQ,+BAA+B,EAAE;YACrC,KAAK,gBAAgB;gBACjB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC7B,MAAM;YACV,KAAK,SAAS;gBACV,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACtB,MAAM;YACV,KAAK,aAAa;gBACd,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC1B,MAAM;YACV;gBACI,MAAM;SACb;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,oCAAoC;QACvC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEkB,WAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE;YAC5C,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;gBACjB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC9B,CAAC,CAAC,CAAC;SACN;IACL,CAAC;CACJ","sourcesContent":["import { DOM } from '@microsoft/fast-element';\nimport { UpdateTracker } from '../../utilities/models/update-tracker';\nimport type { RichText } from '../base';\n\nconst trackedItems = ['pattern', 'mappingConfigs', 'buttonLabel'] as const;\n\n/**\n * Helper class to track what updates are needed to the rich text components based on configuration\n * changes.\n */\nexport class RichTextUpdateTracker extends UpdateTracker<typeof trackedItems> {\n private updateQueued = false;\n\n public constructor(private readonly richText: RichText) {\n super(trackedItems);\n }\n\n public get updatePattern(): boolean {\n return this.isTracked('pattern');\n }\n\n public get updateMappingConfigs(): boolean {\n return this.isTracked('mappingConfigs');\n }\n\n public get updateButtonLabel(): boolean {\n return this.isTracked('buttonLabel');\n }\n\n public trackMentionInternalsPropertyChanged(\n changedMentionInternalsProperty: string\n ): void {\n switch (changedMentionInternalsProperty) {\n case 'mappingConfigs':\n this.track('mappingConfigs');\n break;\n case 'pattern':\n this.track('pattern');\n break;\n case 'buttonLabel':\n this.track('buttonLabel');\n break;\n default:\n break;\n }\n this.queueUpdate();\n }\n\n public trackMentionElementsInstancesChanged(): void {\n this.track('pattern');\n this.track('mappingConfigs');\n this.track('buttonLabel');\n this.queueUpdate();\n }\n\n protected override queueUpdate(): void {\n if (!this.richText.$fastController.isConnected) {\n return;\n }\n\n if (!this.updateQueued) {\n this.updateQueued = true;\n DOM.queueUpdate(() => {\n this.richText.createConfig();\n this.untrackAll();\n this.updateQueued = false;\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"rich-text-tracker.js","sourceRoot":"","sources":["../../../../src/rich-text/models/rich-text-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAGtE,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAU,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAkC;IAGzE,YAAoC,QAAkB;QAClD,KAAK,CAAC,YAAY,CAAC,CAAC;QADY,aAAQ,GAAR,QAAQ,CAAU;QAF9C,iBAAY,GAAG,KAAK,CAAC;IAI7B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,IAAW,oBAAoB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAEM,oCAAoC,CACvC,+BAAuC;QAEvC,QAAQ,+BAA+B,EAAE,CAAC;YACtC,KAAK,gBAAgB;gBACjB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC7B,MAAM;YACV,KAAK,SAAS;gBACV,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACtB,MAAM;YACV,KAAK,aAAa;gBACd,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC1B,MAAM;YACV;gBACI,MAAM;QACd,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,oCAAoC;QACvC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEkB,WAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;gBACjB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC9B,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ","sourcesContent":["import { DOM } from '@microsoft/fast-element';\nimport { UpdateTracker } from '../../utilities/models/update-tracker';\nimport type { RichText } from '../base';\n\nconst trackedItems = ['pattern', 'mappingConfigs', 'buttonLabel'] as const;\n\n/**\n * Helper class to track what updates are needed to the rich text components based on configuration\n * changes.\n */\nexport class RichTextUpdateTracker extends UpdateTracker<typeof trackedItems> {\n private updateQueued = false;\n\n public constructor(private readonly richText: RichText) {\n super(trackedItems);\n }\n\n public get updatePattern(): boolean {\n return this.isTracked('pattern');\n }\n\n public get updateMappingConfigs(): boolean {\n return this.isTracked('mappingConfigs');\n }\n\n public get updateButtonLabel(): boolean {\n return this.isTracked('buttonLabel');\n }\n\n public trackMentionInternalsPropertyChanged(\n changedMentionInternalsProperty: string\n ): void {\n switch (changedMentionInternalsProperty) {\n case 'mappingConfigs':\n this.track('mappingConfigs');\n break;\n case 'pattern':\n this.track('pattern');\n break;\n case 'buttonLabel':\n this.track('buttonLabel');\n break;\n default:\n break;\n }\n this.queueUpdate();\n }\n\n public trackMentionElementsInstancesChanged(): void {\n this.track('pattern');\n this.track('mappingConfigs');\n this.track('buttonLabel');\n this.queueUpdate();\n }\n\n protected override queueUpdate(): void {\n if (!this.richText.$fastController.isConnected) {\n return;\n }\n\n if (!this.updateQueued) {\n this.updateQueued = true;\n DOM.queueUpdate(() => {\n this.richText.createConfig();\n this.untrackAll();\n this.updateQueued = false;\n });\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-parser-utils.js","sourceRoot":"","sources":["../../../../../src/rich-text/models/testing/markdown-parser-utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACtC,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC;SACD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC7B,EAAE;IACR,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC5B,EAAE;IACT,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAC/B,GAAmC;IAEnC,IAAI,WAAW,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAEvC,OAAO,WAAW,EAAE,gBAAgB,EAAE;QAClC,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC;KAC9C;IACD,OAAO,WAAW,CAAC;AACvB,CAAC","sourcesContent":["export const getTagsFromElement = (\n doc: DocumentFragment | HTMLElement\n): string[] => {\n const nodes = Array.from(doc.querySelectorAll('*')).map(el => el.tagName);\n return nodes;\n};\n\nexport const getLeafContentsFromElement = (\n doc: DocumentFragment | HTMLElement\n): string[] => {\n const nodes = Array.from(doc.querySelectorAll('*'))\n .filter((el, _) => {\n return el.children.length === 0;\n })\n .map(el => el.textContent || '');\n return nodes;\n};\n\nexport const getLastChildElementAttribute = (\n attribute: string,\n doc: DocumentFragment | HTMLElement\n): string => {\n return getLastChildElement(doc)?.getAttribute(attribute) ?? '';\n};\n\nexport const lastChildElementHasAttribute = (\n attribute: string,\n doc: DocumentFragment | HTMLElement\n): boolean => {\n return getLastChildElement(doc)?.hasAttribute(attribute) ?? false;\n};\n\nexport function getLastChildElement(\n doc: DocumentFragment | HTMLElement\n): Element | null | undefined {\n let lastElement = doc.lastElementChild;\n\n while (lastElement?.lastElementChild) {\n lastElement = lastElement.lastElementChild;\n }\n return lastElement;\n}\n"]}
1
+ {"version":3,"file":"markdown-parser-utils.js","sourceRoot":"","sources":["../../../../../src/rich-text/models/testing/markdown-parser-utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACtC,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC;SACD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC7B,EAAE;IACR,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC5B,EAAE;IACT,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAC/B,GAAmC;IAEnC,IAAI,WAAW,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAEvC,OAAO,WAAW,EAAE,gBAAgB,EAAE,CAAC;QACnC,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC;IAC/C,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC","sourcesContent":["export const getTagsFromElement = (\n doc: DocumentFragment | HTMLElement\n): string[] => {\n const nodes = Array.from(doc.querySelectorAll('*')).map(el => el.tagName);\n return nodes;\n};\n\nexport const getLeafContentsFromElement = (\n doc: DocumentFragment | HTMLElement\n): string[] => {\n const nodes = Array.from(doc.querySelectorAll('*'))\n .filter((el, _) => {\n return el.children.length === 0;\n })\n .map(el => el.textContent || '');\n return nodes;\n};\n\nexport const getLastChildElementAttribute = (\n attribute: string,\n doc: DocumentFragment | HTMLElement\n): string => {\n return getLastChildElement(doc)?.getAttribute(attribute) ?? '';\n};\n\nexport const lastChildElementHasAttribute = (\n attribute: string,\n doc: DocumentFragment | HTMLElement\n): boolean => {\n return getLastChildElement(doc)?.hasAttribute(attribute) ?? false;\n};\n\nexport function getLastChildElement(\n doc: DocumentFragment | HTMLElement\n): Element | null | undefined {\n let lastElement = doc.lastElementChild;\n\n while (lastElement?.lastElementChild) {\n lastElement = lastElement.lastElementChild;\n }\n return lastElement;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQnC;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAA5C;;QACI;;;;WAIG;QAEI,aAAQ,GAAG,EAAE,CAAC;QAOb,mBAAc,GAAa,EAAE,CAAC;IA4C1C,CAAC;IA1CG;;OAEG;IACa,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,eAAe;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,oBAAoB;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEM,iBAAiB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAEO,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;YACnC,OAAO;SACV;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,WAAW,GAAG,sBAAsB,CAAC,kBAAkB,CACzD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAC1C,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC;SACpD;aAAM;YACH,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;SAC5B;IACL,CAAC;CACJ;AAnDU;IADN,UAAU;gDACU;AAqDzB,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC;IAChD,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport { observable } from '@microsoft/fast-element';\nimport { template } from './template';\nimport { styles } from './styles';\nimport { RichTextMarkdownParser } from '../models/markdown-parser';\nimport { RichText } from '../base';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-viewer': RichTextViewer;\n }\n}\n\n/**\n * A nimble styled rich text viewer\n */\nexport class RichTextViewer extends RichText {\n /**\n *\n * @public\n * Markdown string to render its corresponding rich text content in the component.\n */\n @observable\n public markdown = '';\n\n /**\n * @internal\n */\n public viewer!: HTMLDivElement;\n\n private mentionedHrefs: string[] = [];\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n this.updateView();\n }\n\n /**\n * @internal\n */\n public markdownChanged(): void {\n this.updateView();\n }\n\n /**\n * @internal\n */\n public configurationChanged(): void {\n this.updateView();\n }\n\n public getMentionedHrefs(): string[] {\n return Array.from(this.mentionedHrefs);\n }\n\n private updateView(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n if (this.markdown) {\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n this.markdown,\n this.configuration?.parserMentionConfig\n );\n this.viewer.replaceChildren(parseResult.fragment);\n this.mentionedHrefs = parseResult.mentionedHrefs;\n } else {\n this.viewer.innerHTML = '';\n this.mentionedHrefs = [];\n }\n }\n}\n\nconst nimbleRichTextViewer = RichTextViewer.compose({\n baseName: 'rich-text-viewer',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextViewer());\nexport const richTextViewerTag = 'nimble-rich-text-viewer';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQnC;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAA5C;;QACI;;;;WAIG;QAEI,aAAQ,GAAG,EAAE,CAAC;QAOb,mBAAc,GAAa,EAAE,CAAC;IA4C1C,CAAC;IA1CG;;OAEG;IACa,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,eAAe;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,oBAAoB;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEM,iBAAiB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAEO,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,sBAAsB,CAAC,kBAAkB,CACzD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAC1C,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;CACJ;AAnDU;IADN,UAAU;gDACU;AAqDzB,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC;IAChD,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport { observable } from '@microsoft/fast-element';\nimport { template } from './template';\nimport { styles } from './styles';\nimport { RichTextMarkdownParser } from '../models/markdown-parser';\nimport { RichText } from '../base';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-viewer': RichTextViewer;\n }\n}\n\n/**\n * A nimble styled rich text viewer\n */\nexport class RichTextViewer extends RichText {\n /**\n *\n * @public\n * Markdown string to render its corresponding rich text content in the component.\n */\n @observable\n public markdown = '';\n\n /**\n * @internal\n */\n public viewer!: HTMLDivElement;\n\n private mentionedHrefs: string[] = [];\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n this.updateView();\n }\n\n /**\n * @internal\n */\n public markdownChanged(): void {\n this.updateView();\n }\n\n /**\n * @internal\n */\n public configurationChanged(): void {\n this.updateView();\n }\n\n public getMentionedHrefs(): string[] {\n return Array.from(this.mentionedHrefs);\n }\n\n private updateView(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n if (this.markdown) {\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n this.markdown,\n this.configuration?.parserMentionConfig\n );\n this.viewer.replaceChildren(parseResult.fragment);\n this.mentionedHrefs = parseResult.mentionedHrefs;\n } else {\n this.viewer.innerHTML = '';\n this.mentionedHrefs = [];\n }\n }\n}\n\nconst nimbleRichTextViewer = RichTextViewer.compose({\n baseName: 'rich-text-viewer',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextViewer());\nexport const richTextViewerTag = 'nimble-rich-text-viewer';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-viewer.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/viewer/testing/rich-text-viewer.pageobject.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YACqB,qBAAqC;QAArC,0BAAqB,GAArB,qBAAqB,CAAgB;IACvD,CAAC;IAEG,oCAAoC;QACvC,OAAO,IAAI,CAAC,mCAAmC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;IACzE,CAAC;IAEM,qCAAqC,CAAC,SAAiB;QAC1D,OAAO,CACH,IAAI,CAAC,mCAAmC,EAAE,EAAE,YAAY,CACpD,SAAS,CACZ,IAAI,EAAE,CACV,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,2BAA2B;QAC9B,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,0CAA0C;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAE1D,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAe,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAE1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEnC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QAEF,IAAI,eAAe,EAAE;YACjB,WAAW,CAAC,eAAe,CAAC,CAAC;SAChC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,+BAA+B;QAClC,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAEM,kCAAkC,CAAC,SAAiB;QACvD,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAEO,0BAA0B;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAEO,mCAAmC;QACvC,IAAI,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE,EAAE,gBAAgB,CAAC;QAEtE,OAAO,WAAW,EAAE,gBAAgB,EAAE;YAClC,WAAW,GAAG,WAAW,EAAE,gBAAgB,CAAC;SAC/C;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type { RichTextViewer } from '..';\n\n/**\n * Page object for the `nimble-rich-text-viewer` component.\n */\nexport class RichTextViewerPageObject {\n public constructor(\n private readonly richTextViewerElement: RichTextViewer\n ) {}\n\n public getRenderedMarkdownLastChildContents(): string {\n return this.getLastChildMarkdownRenderedElement()?.textContent || '';\n }\n\n public getRenderedMarkdownLastChildAttribute(attribute: string): string {\n return (\n this.getLastChildMarkdownRenderedElement()?.getAttribute(\n attribute\n ) || ''\n );\n }\n\n /**\n * Retrieves tag names for the rendered markdown content in document order\n * @returns An array of tag names in document order\n */\n public getRenderedMarkdownTagNames(): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n ).map(el => el.tagName);\n }\n\n /**\n * @returns An array of tag names with the closing tags (eg: '/P') in a document order\n */\n public getRenderedMarkdownTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const renderedElement = this.getMarkdownRenderedElement();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n if (renderedElement) {\n processNode(renderedElement);\n }\n\n return tagNames.slice(1, -1);\n }\n\n /**\n * Retrieves text contents for the rendered markdown content in document order\n * @returns An array of text contents of last elements in a tree\n */\n public getRenderedMarkdownLeafContents(): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n )\n .filter((el, _) => el.children.length === 0)\n .map(el => el.textContent || '');\n }\n\n public getRenderedMarkdownAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n )\n .filter((el, _) => el.children.length === 0)\n .map(el => el.getAttribute(attribute) || '');\n }\n\n private getMarkdownRenderedElement(): Element | null | undefined {\n return this.richTextViewerElement.shadowRoot?.querySelector('.viewer');\n }\n\n private getLastChildMarkdownRenderedElement(): Element | null | undefined {\n let lastElement = this.getMarkdownRenderedElement()?.lastElementChild;\n\n while (lastElement?.lastElementChild) {\n lastElement = lastElement?.lastElementChild;\n }\n return lastElement;\n }\n}\n"]}
1
+ {"version":3,"file":"rich-text-viewer.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/viewer/testing/rich-text-viewer.pageobject.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YACqB,qBAAqC;QAArC,0BAAqB,GAArB,qBAAqB,CAAgB;IACvD,CAAC;IAEG,oCAAoC;QACvC,OAAO,IAAI,CAAC,mCAAmC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;IACzE,CAAC;IAEM,qCAAqC,CAAC,SAAiB;QAC1D,OAAO,CACH,IAAI,CAAC,mCAAmC,EAAE,EAAE,YAAY,CACpD,SAAS,CACZ,IAAI,EAAE,CACV,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,2BAA2B;QAC9B,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,0CAA0C;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAE1D,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAe,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAE1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEnC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,eAAe,EAAE,CAAC;YAClB,WAAW,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,+BAA+B;QAClC,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAEM,kCAAkC,CAAC,SAAiB;QACvD,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAEO,0BAA0B;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAEO,mCAAmC;QACvC,IAAI,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE,EAAE,gBAAgB,CAAC;QAEtE,OAAO,WAAW,EAAE,gBAAgB,EAAE,CAAC;YACnC,WAAW,GAAG,WAAW,EAAE,gBAAgB,CAAC;QAChD,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type { RichTextViewer } from '..';\n\n/**\n * Page object for the `nimble-rich-text-viewer` component.\n */\nexport class RichTextViewerPageObject {\n public constructor(\n private readonly richTextViewerElement: RichTextViewer\n ) {}\n\n public getRenderedMarkdownLastChildContents(): string {\n return this.getLastChildMarkdownRenderedElement()?.textContent || '';\n }\n\n public getRenderedMarkdownLastChildAttribute(attribute: string): string {\n return (\n this.getLastChildMarkdownRenderedElement()?.getAttribute(\n attribute\n ) || ''\n );\n }\n\n /**\n * Retrieves tag names for the rendered markdown content in document order\n * @returns An array of tag names in document order\n */\n public getRenderedMarkdownTagNames(): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n ).map(el => el.tagName);\n }\n\n /**\n * @returns An array of tag names with the closing tags (eg: '/P') in a document order\n */\n public getRenderedMarkdownTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const renderedElement = this.getMarkdownRenderedElement();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n if (renderedElement) {\n processNode(renderedElement);\n }\n\n return tagNames.slice(1, -1);\n }\n\n /**\n * Retrieves text contents for the rendered markdown content in document order\n * @returns An array of text contents of last elements in a tree\n */\n public getRenderedMarkdownLeafContents(): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n )\n .filter((el, _) => el.children.length === 0)\n .map(el => el.textContent || '');\n }\n\n public getRenderedMarkdownAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getMarkdownRenderedElement()!.querySelectorAll('*')\n )\n .filter((el, _) => el.children.length === 0)\n .map(el => el.getAttribute(attribute) || '');\n }\n\n private getMarkdownRenderedElement(): Element | null | undefined {\n return this.richTextViewerElement.shadowRoot?.querySelector('.viewer');\n }\n\n private getLastChildMarkdownRenderedElement(): Element | null | undefined {\n let lastElement = this.getMarkdownRenderedElement()?.lastElementChild;\n\n while (lastElement?.lastElementChild) {\n lastElement = lastElement?.lastElementChild;\n }\n return lastElement;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/base/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,IAAI,EAEJ,UAAU,EACV,UAAU,EAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAM/D,OAAO,EACH,gBAAgB,EAEnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C;;GAEG;AACH,MAAM,OAAgB,eAGlB,SAAQ,iBAAiB;IAH7B;;QAKI;;WAEG;QACa,qBAAgB,GAAqB,IAAI,gBAAgB,CACrE,IAAI,CAAC,0BAA0B,EAAE,EACjC,CAAC,MAAc,EAAQ,EAAE;YACrB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CACJ,CAAC;QAcF,gBAAgB;QACT,qBAAgB,GAAe,EAAE,CAAC;QAEzC,gBAAgB;QAET,oBAAe,GAAuB,EAAE,CAAC;IAyGpD,CAAC;IAvGG;;OAEG;IACI,aAAa;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,MAAc;QACnC,MAAM,yBAAyB,GAA6B;YACxD,MAAM;SACT,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAe,EAAE,IAAa;QAC9C,IACI,MAAM,YAAY,OAAO;eACtB,OAAO,IAAI,KAAK,QAAQ;eACxB,IAAI,CAAC,0BAA0B,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACrD;YACE,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC/B;IACL,CAAC;IAUO,iBAAiB;QACrB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC;YACtC,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAChD,MAAM,KAAK,CACP,0EAA0E,CAC7E,CAAC;aACL;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IAC1B,CAAC;IAEO,oBAAoB;QACxB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CACpC,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,CACf,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE;YAC5E,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC1B,CAAC,CAAC,SAAS,CAAC;IACpB,CAAC;IAEO,sBAAsB;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAEO,cAAc;QAClB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CACpC,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,CACf,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACjD,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACzD,CAAC;IAEO,6BAA6B;QACjC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACrC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,sBAAsB;QAC1B,IAAI,CAAC,6BAA6B,EAAE,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;YACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACL,CAAC;CACJ;AAtHU;IADN,IAAI;gDACmB;AAMjB;IADN,IAAI,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;oDACR;AAOrB;IADN,UAAU;wDACqC","sourcesContent":["import {\n attr,\n Notifier,\n Observable,\n observable,\n Subscriber\n} from '@microsoft/fast-element';\nimport { FoundationElement } from '@microsoft/fast-foundation';\nimport type { MappingConfig } from './models/mapping-config';\nimport type {\n RichTextMentionValidator,\n RichTextMentionValidity\n} from './models/mention-validator';\nimport {\n MentionInternals,\n MentionInternalsOptions\n} from './models/mention-internals';\nimport { Mapping } from '../../mapping/base';\nimport type { MappingConfigs, MentionUpdateEventDetail } from './types';\n\n/**\n * The base class for Mention configuration\n */\nexport abstract class RichTextMention<\n TValidator extends RichTextMentionValidator = RichTextMentionValidator\n>\n extends FoundationElement\n implements Subscriber {\n /**\n * @internal\n */\n public readonly mentionInternals: MentionInternals = new MentionInternals(\n this.getMentionInternalsOptions(),\n (filter: string): void => {\n this.emitMentionUpdate(filter);\n }\n );\n\n /**\n * A regex used to extract user ID from user key (url) while parsing and serializing a markdown.\n */\n @attr\n public pattern?: string;\n\n /**\n * @public\n */\n @attr({ attribute: 'button-label' })\n public buttonLabel?: string;\n\n /** @internal */\n public mappingNotifiers: Notifier[] = [];\n\n /** @internal */\n @observable\n public mappingElements: Mapping<unknown>[] = [];\n\n /**\n * @public\n */\n public checkValidity(): boolean {\n return this.mentionInternals.validator.isValid();\n }\n\n /**\n * @public\n */\n public get validity(): RichTextMentionValidity {\n return this.mentionInternals.validator.getValidity();\n }\n\n /**\n * @internal\n */\n public emitMentionUpdate(filter: string): void {\n const mentionUpdateEventDetails: MentionUpdateEventDetail = {\n filter\n };\n this.$emit('mention-update', mentionUpdateEventDetails);\n }\n\n /**\n * @internal\n */\n public handleChange(source: unknown, args: unknown): void {\n if (\n source instanceof Mapping\n && typeof args === 'string'\n && this.getObservedMappingProperty().includes(args)\n ) {\n this.updateMappingConfigs();\n }\n }\n\n protected abstract getObservedMappingProperty(): string[];\n\n protected abstract getMentionInternalsOptions(): MentionInternalsOptions<TValidator>;\n\n protected abstract createMappingConfig(\n mapping: Mapping<unknown>\n ): MappingConfig;\n\n private getMappingConfigs(): MappingConfigs {\n const mappingConfigs = new Map<string, MappingConfig>();\n this.mappingElements.forEach(mapping => {\n const href = mapping.key ?? undefined;\n if (href === undefined || typeof href !== 'string') {\n throw Error(\n 'mentionHref was invalid for type. Validation should have prevented this.'\n );\n }\n const mappingConfig = this.createMappingConfig(mapping);\n mappingConfigs.set(href, mappingConfig);\n });\n return mappingConfigs;\n }\n\n private updateMappingConfigs(): void {\n this.mentionInternals.validator.validate(\n this.mappingElements,\n this.pattern\n );\n this.mentionInternals.mappingConfigs = this.mentionInternals.validator.isValid()\n ? this.getMappingConfigs()\n : undefined;\n }\n\n private mappingElementsChanged(): void {\n this.updateMappingConfigs();\n this.observeMappingElements();\n }\n\n private patternChanged(): void {\n this.mentionInternals.validator.validate(\n this.mappingElements,\n this.pattern\n );\n this.mentionInternals.pattern = this.pattern;\n }\n\n private buttonLabelChanged(): void {\n this.mentionInternals.buttonLabel = this.buttonLabel;\n }\n\n private removeMappingElementObservers(): void {\n this.mappingNotifiers.forEach(notifier => {\n notifier.unsubscribe(this);\n });\n this.mappingNotifiers = [];\n }\n\n private observeMappingElements(): void {\n this.removeMappingElementObservers();\n\n for (const mapping of this.mappingElements) {\n const notifier = Observable.getNotifier(mapping);\n notifier.subscribe(this);\n this.mappingNotifiers.push(notifier);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/base/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n attr,\n Notifier,\n Observable,\n observable,\n Subscriber\n} from '@microsoft/fast-element';\nimport { FoundationElement } from '@microsoft/fast-foundation';\nimport type { MappingConfig } from './models/mapping-config';\nimport type {\n RichTextMentionValidator,\n RichTextMentionValidity\n} from './models/mention-validator';\nimport {\n MentionInternals,\n MentionInternalsOptions\n} from './models/mention-internals';\nimport { Mapping } from '../../mapping/base';\nimport type { MappingConfigs, MentionUpdateEventDetail } from './types';\n\n/**\n * The base class for Mention configuration\n */\nexport abstract class RichTextMention<\n TValidator extends RichTextMentionValidator = RichTextMentionValidator\n>\n extends FoundationElement\n implements Subscriber {\n /**\n * @internal\n */\n public readonly mentionInternals: MentionInternals = new MentionInternals(\n this.getMentionInternalsOptions(),\n (filter: string): void => {\n this.emitMentionUpdate(filter);\n }\n );\n\n /**\n * A regex used to extract user ID from user key (url) while parsing and serializing a markdown.\n */\n @attr\n public pattern?: string;\n\n /**\n * @public\n */\n @attr({ attribute: 'button-label' })\n public buttonLabel?: string;\n\n /** @internal */\n public mappingNotifiers: Notifier[] = [];\n\n /** @internal */\n @observable\n public mappingElements: Mapping<unknown>[] = [];\n\n /**\n * @public\n */\n public checkValidity(): boolean {\n return this.mentionInternals.validator.isValid();\n }\n\n /**\n * @public\n */\n public get validity(): RichTextMentionValidity {\n return this.mentionInternals.validator.getValidity();\n }\n\n /**\n * @internal\n */\n public emitMentionUpdate(filter: string): void {\n const mentionUpdateEventDetails: MentionUpdateEventDetail = {\n filter\n };\n this.$emit('mention-update', mentionUpdateEventDetails);\n }\n\n /**\n * @internal\n */\n public handleChange(source: unknown, args: unknown): void {\n if (\n source instanceof Mapping\n && typeof args === 'string'\n && this.getObservedMappingProperty().includes(args)\n ) {\n this.updateMappingConfigs();\n }\n }\n\n protected abstract getObservedMappingProperty(): string[];\n\n protected abstract getMentionInternalsOptions(): MentionInternalsOptions<TValidator>;\n\n protected abstract createMappingConfig(\n mapping: Mapping<unknown>\n ): MappingConfig;\n\n private getMappingConfigs(): MappingConfigs {\n const mappingConfigs = new Map<string, MappingConfig>();\n this.mappingElements.forEach(mapping => {\n const href = mapping.key ?? undefined;\n if (href === undefined || typeof href !== 'string') {\n throw Error(\n 'mentionHref was invalid for type. Validation should have prevented this.'\n );\n }\n const mappingConfig = this.createMappingConfig(mapping);\n mappingConfigs.set(href, mappingConfig);\n });\n return mappingConfigs;\n }\n\n private updateMappingConfigs(): void {\n this.mentionInternals.validator.validate(\n this.mappingElements,\n this.pattern\n );\n this.mentionInternals.mappingConfigs = this.mentionInternals.validator.isValid()\n ? this.getMappingConfigs()\n : undefined;\n }\n\n private mappingElementsChanged(): void {\n this.updateMappingConfigs();\n this.observeMappingElements();\n }\n\n private patternChanged(): void {\n this.mentionInternals.validator.validate(\n this.mappingElements,\n this.pattern\n );\n this.mentionInternals.pattern = this.pattern;\n }\n\n private buttonLabelChanged(): void {\n this.mentionInternals.buttonLabel = this.buttonLabel;\n }\n\n private removeMappingElementObservers(): void {\n this.mappingNotifiers.forEach(notifier => {\n notifier.unsubscribe(this);\n });\n this.mappingNotifiers = [];\n }\n\n private observeMappingElements(): void {\n this.removeMappingElementObservers();\n\n for (const mapping of this.mappingElements) {\n const notifier = Observable.getNotifier(mapping);\n notifier.subscribe(this);\n this.mappingNotifiers.push(notifier);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mention-validator.js","sourceRoot":"","sources":["../../../../../src/rich-text-mention/base/models/mention-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mapping } from '../../../mapping/base';\nimport { Validator, ValidityObject } from '../../../utilities/models/validator';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface RichTextMentionValidity extends ValidityObject {}\n\ntype FlagNames<T> = T extends readonly (infer U)[] ? U : never;\n\nexport const baseValidityFlagNames = [\n 'duplicateMappingMentionHref',\n 'missingMentionHrefValue',\n 'mentionHrefNotValidUrl',\n 'mentionHrefDoesNotMatchPattern',\n 'missingPatternAttribute',\n 'unsupportedPatternValue'\n] as const;\n\n/**\n * Validator for RichTextMention\n */\nexport class RichTextMentionValidator<\n ValidityFlagNames extends readonly string[] = typeof baseValidityFlagNames\n> extends Validator<typeof baseValidityFlagNames | ValidityFlagNames> {\n public constructor(configValidityKeys: ValidityFlagNames) {\n super(configValidityKeys);\n }\n\n public validate(\n mappings: Mapping<unknown>[],\n pattern: string | undefined\n ): void {\n this.untrackAll();\n const mentionHrefs = mappings.map(mapping => mapping.key);\n this.validateNoMissingMentionHref(mentionHrefs);\n this.validateUniqueMentionHref(mentionHrefs);\n this.validateMissingPattern(pattern);\n this.validatePattern(pattern);\n this.validateHrefForPattern(mentionHrefs, pattern);\n this.validateHrefForUrl(mentionHrefs);\n }\n\n /**\n * @returns an object containing flags for various ways the configuation can be invalid\n */\n public getValidity(): RichTextMentionValidity {\n return this.getValidationFlags();\n }\n\n /**\n * Sets a particular validity condition flag's value, e.g. \"hasInvalidFooValue\" = true\n */\n protected setConditionValue(\n name: FlagNames<typeof baseValidityFlagNames | ValidityFlagNames>,\n isInvalid: boolean\n ): void {\n if (isInvalid) {\n this.track(name);\n } else {\n this.untrack(name);\n }\n }\n\n private validateMissingPattern(pattern: string | undefined): void {\n this.setConditionValue(\n 'missingPatternAttribute',\n pattern === undefined\n );\n }\n\n private validatePattern(pattern: string | undefined): void {\n this.setConditionValue(\n 'unsupportedPatternValue',\n pattern === undefined || this.isInvalidRegex(pattern)\n );\n }\n\n private validateUniqueMentionHref(\n mentionHref: (string | undefined | unknown)[]\n ): void {\n const invalid = new Set(mentionHref).size !== mentionHref.length;\n this.setConditionValue('duplicateMappingMentionHref', invalid);\n }\n\n private validateNoMissingMentionHref(mentionHrefs: unknown[]): void {\n const invalid = mentionHrefs.some(href => href === undefined);\n this.setConditionValue('missingMentionHrefValue', invalid);\n }\n\n private validateHrefForUrl(mentionHrefs: unknown[]): void {\n const invalid = mentionHrefs.some(href => {\n return (\n href === undefined\n || typeof href !== 'string'\n || this.isInvalidUrl(href)\n );\n });\n this.setConditionValue('mentionHrefNotValidUrl', invalid);\n }\n\n private validateHrefForPattern(\n mentionHrefs: unknown[],\n pattern: string | undefined\n ): void {\n const invalid = pattern === undefined || this.isInvalidRegex(pattern)\n ? true\n : mentionHrefs.some(href => {\n return (\n href === undefined\n || typeof href !== 'string'\n || !new RegExp(pattern).test(href)\n );\n });\n this.setConditionValue('mentionHrefDoesNotMatchPattern', invalid);\n }\n\n private isInvalidUrl(url: string): boolean {\n try {\n // Check whether the constructor throws an error for an Invalid URL.\n // eslint-disable-next-line no-new\n new URL(url);\n return false;\n } catch (error) {\n return true;\n }\n }\n\n private isInvalidRegex(pattern: string): boolean {\n try {\n // Check whether the constructor throws an error when it cannot be parsed as a valid regular expression.\n // eslint-disable-next-line no-new\n new RegExp(pattern);\n return false;\n } catch (error) {\n return true;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mention-validator.js","sourceRoot":"","sources":["../../../../../src/rich-text-mention/base/models/mention-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mapping } from '../../../mapping/base';\nimport { Validator, ValidityObject } from '../../../utilities/models/validator';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface RichTextMentionValidity extends ValidityObject {}\n\ntype FlagNames<T> = T extends readonly (infer U)[] ? U : never;\n\nexport const baseValidityFlagNames = [\n 'duplicateMappingMentionHref',\n 'missingMentionHrefValue',\n 'mentionHrefNotValidUrl',\n 'mentionHrefDoesNotMatchPattern',\n 'missingPatternAttribute',\n 'unsupportedPatternValue'\n] as const;\n\n/**\n * Validator for RichTextMention\n */\nexport class RichTextMentionValidator<\n ValidityFlagNames extends readonly string[] = typeof baseValidityFlagNames\n> extends Validator<typeof baseValidityFlagNames | ValidityFlagNames> {\n public constructor(configValidityKeys: ValidityFlagNames) {\n super(configValidityKeys);\n }\n\n public validate(\n mappings: Mapping<unknown>[],\n pattern: string | undefined\n ): void {\n this.untrackAll();\n const mentionHrefs = mappings.map(mapping => mapping.key);\n this.validateNoMissingMentionHref(mentionHrefs);\n this.validateUniqueMentionHref(mentionHrefs);\n this.validateMissingPattern(pattern);\n this.validatePattern(pattern);\n this.validateHrefForPattern(mentionHrefs, pattern);\n this.validateHrefForUrl(mentionHrefs);\n }\n\n /**\n * @returns an object containing flags for various ways the configuation can be invalid\n */\n public getValidity(): RichTextMentionValidity {\n return this.getValidationFlags();\n }\n\n /**\n * Sets a particular validity condition flag's value, e.g. \"hasInvalidFooValue\" = true\n */\n protected setConditionValue(\n name: FlagNames<typeof baseValidityFlagNames | ValidityFlagNames>,\n isInvalid: boolean\n ): void {\n if (isInvalid) {\n this.track(name);\n } else {\n this.untrack(name);\n }\n }\n\n private validateMissingPattern(pattern: string | undefined): void {\n this.setConditionValue(\n 'missingPatternAttribute',\n pattern === undefined\n );\n }\n\n private validatePattern(pattern: string | undefined): void {\n this.setConditionValue(\n 'unsupportedPatternValue',\n pattern === undefined || this.isInvalidRegex(pattern)\n );\n }\n\n private validateUniqueMentionHref(\n mentionHref: (string | undefined | unknown)[]\n ): void {\n const invalid = new Set(mentionHref).size !== mentionHref.length;\n this.setConditionValue('duplicateMappingMentionHref', invalid);\n }\n\n private validateNoMissingMentionHref(mentionHrefs: unknown[]): void {\n const invalid = mentionHrefs.some(href => href === undefined);\n this.setConditionValue('missingMentionHrefValue', invalid);\n }\n\n private validateHrefForUrl(mentionHrefs: unknown[]): void {\n const invalid = mentionHrefs.some(href => {\n return (\n href === undefined\n || typeof href !== 'string'\n || this.isInvalidUrl(href)\n );\n });\n this.setConditionValue('mentionHrefNotValidUrl', invalid);\n }\n\n private validateHrefForPattern(\n mentionHrefs: unknown[],\n pattern: string | undefined\n ): void {\n const invalid = pattern === undefined || this.isInvalidRegex(pattern)\n ? true\n : mentionHrefs.some(href => {\n return (\n href === undefined\n || typeof href !== 'string'\n || !new RegExp(pattern).test(href)\n );\n });\n this.setConditionValue('mentionHrefDoesNotMatchPattern', invalid);\n }\n\n private isInvalidUrl(url: string): boolean {\n try {\n // Check whether the constructor throws an error for an Invalid URL.\n // eslint-disable-next-line no-new\n new URL(url);\n return false;\n } catch (error) {\n return true;\n }\n }\n\n private isInvalidRegex(pattern: string): boolean {\n try {\n // Check whether the constructor throws an error when it cannot be parsed as a valid regular expression.\n // eslint-disable-next-line no-new\n new RegExp(pattern);\n return false;\n } catch (error) {\n return true;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/users/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAQxC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,eAA8C;IACjE,0BAA0B;QACzC,OAAO;YACH,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,2BAA2B;YACxC,SAAS,EAAE,IAAI,6BAA6B,EAAE;SACjD,CAAC;IACN,CAAC;IAEkB,0BAA0B;QACzC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAClC,CAAC;IAES,mBAAmB,CACzB,OAAgC;QAEhC,IAAI,OAAO,YAAY,WAAW,EAAE;YAChC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;SAClE;QACD,+EAA+E;QAC/E,mEAAmE;QACnE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;CACJ;AACD,MAAM,0BAA0B,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAC5D,QAAQ,EAAE,yBAAyB;IACnC,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,gCAAgC,CAAC","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport type { MentionInternalsOptions } from '../base/models/mention-internals';\nimport { RichTextMention } from '../base';\nimport type { MappingConfig } from '../base/models/mapping-config';\nimport { MappingUserConfig } from './models/mapping-user-config';\nimport { template } from '../base/template';\nimport { iconAtTag } from '../../icons/at';\nimport { MappingUser } from '../../mapping/user';\nimport type { Mapping } from '../../mapping/base';\nimport type { MappingUserKey } from '../../mapping/base/types';\nimport { RichTextMentionUsersValidator } from './models/rich-text-mention-users-validator';\nimport { richTextMentionUsersViewTag } from './view';\nimport { styles } from '../base/styles';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-mention-users': RichTextMentionUsers;\n }\n}\n\n/**\n * Rich Text user mention configuration element which will have MappingMentionUser elements as children\n */\nexport class RichTextMentionUsers extends RichTextMention<RichTextMentionUsersValidator> {\n protected override getMentionInternalsOptions(): MentionInternalsOptions<RichTextMentionUsersValidator> {\n return {\n icon: iconAtTag,\n character: '@',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n };\n }\n\n protected override getObservedMappingProperty(): string[] {\n return ['key', 'displayName'];\n }\n\n protected createMappingConfig(\n mapping: Mapping<MappingUserKey>\n ): MappingConfig {\n if (mapping instanceof MappingUser) {\n return new MappingUserConfig(mapping.key, mapping.displayName);\n }\n // Getting here would indicate a programming error, b/c validation will prevent\n // this function from running when there is an unsupported mapping.\n throw new Error('Unsupported mapping');\n }\n}\nconst nimbleRichTextMentionUsers = RichTextMentionUsers.compose({\n baseName: 'rich-text-mention-users',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextMentionUsers());\nexport const richTextMentionUsersTag = 'nimble-rich-text-mention-users';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/users/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAQxC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,eAA8C;IACjE,0BAA0B;QACzC,OAAO;YACH,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,2BAA2B;YACxC,SAAS,EAAE,IAAI,6BAA6B,EAAE;SACjD,CAAC;IACN,CAAC;IAEkB,0BAA0B;QACzC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAClC,CAAC;IAES,mBAAmB,CACzB,OAAgC;QAEhC,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACnE,CAAC;QACD,+EAA+E;QAC/E,mEAAmE;QACnE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;CACJ;AACD,MAAM,0BAA0B,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAC5D,QAAQ,EAAE,yBAAyB;IACnC,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,gCAAgC,CAAC","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport type { MentionInternalsOptions } from '../base/models/mention-internals';\nimport { RichTextMention } from '../base';\nimport type { MappingConfig } from '../base/models/mapping-config';\nimport { MappingUserConfig } from './models/mapping-user-config';\nimport { template } from '../base/template';\nimport { iconAtTag } from '../../icons/at';\nimport { MappingUser } from '../../mapping/user';\nimport type { Mapping } from '../../mapping/base';\nimport type { MappingUserKey } from '../../mapping/base/types';\nimport { RichTextMentionUsersValidator } from './models/rich-text-mention-users-validator';\nimport { richTextMentionUsersViewTag } from './view';\nimport { styles } from '../base/styles';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-mention-users': RichTextMentionUsers;\n }\n}\n\n/**\n * Rich Text user mention configuration element which will have MappingMentionUser elements as children\n */\nexport class RichTextMentionUsers extends RichTextMention<RichTextMentionUsersValidator> {\n protected override getMentionInternalsOptions(): MentionInternalsOptions<RichTextMentionUsersValidator> {\n return {\n icon: iconAtTag,\n character: '@',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n };\n }\n\n protected override getObservedMappingProperty(): string[] {\n return ['key', 'displayName'];\n }\n\n protected createMappingConfig(\n mapping: Mapping<MappingUserKey>\n ): MappingConfig {\n if (mapping instanceof MappingUser) {\n return new MappingUserConfig(mapping.key, mapping.displayName);\n }\n // Getting here would indicate a programming error, b/c validation will prevent\n // this function from running when there is an unsupported mapping.\n throw new Error('Unsupported mapping');\n }\n}\nconst nimbleRichTextMentionUsers = RichTextMentionUsers.compose({\n baseName: 'rich-text-mention-users',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextMentionUsers());\nexport const richTextMentionUsersTag = 'nimble-rich-text-mention-users';\n"]}