@platforma-sdk/ui-vue 1.41.17 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/.turbo/turbo-build.log +36 -71
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +18 -0
  4. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js +3 -3
  5. package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts +2 -2
  6. package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts.map +1 -1
  7. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +11 -11
  8. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +8 -8
  9. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +12 -6
  10. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts.map +1 -1
  11. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +80 -65
  12. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +1 -1
  13. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +14 -12
  14. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +1 -1
  15. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +36 -1
  16. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts.map +1 -1
  17. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +146 -111
  18. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  19. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +2 -0
  20. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts.map +1 -1
  21. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +71 -68
  22. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +1 -1
  23. package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +42 -6
  24. package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts.map +1 -1
  25. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +96 -130
  26. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +1 -1
  27. package/dist/components/PlMultiSequenceAlignment/data.d.ts +3 -9
  28. package/dist/components/PlMultiSequenceAlignment/data.d.ts.map +1 -1
  29. package/dist/components/PlMultiSequenceAlignment/data.js +198 -212
  30. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  31. package/dist/components/PlMultiSequenceAlignment/markup.d.ts +7 -5
  32. package/dist/components/PlMultiSequenceAlignment/markup.d.ts.map +1 -1
  33. package/dist/components/PlMultiSequenceAlignment/markup.js +47 -26
  34. package/dist/components/PlMultiSequenceAlignment/markup.js.map +1 -1
  35. package/dist/components/PlMultiSequenceAlignment/types.d.ts +1 -1
  36. package/dist/components/PlMultiSequenceAlignment/types.d.ts.map +1 -1
  37. package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js +2 -4
  38. package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js.map +1 -1
  39. package/dist/lib/ui/uikit/dist/components/DataTable/index.js +2 -2
  40. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createGridlines.js +6 -8
  41. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createGridlines.js.map +1 -1
  42. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createLabels.js.map +1 -1
  43. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createSvgContainer.js +5 -7
  44. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createSvgContainer.js.map +1 -1
  45. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/drawBins.js +3 -5
  46. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/drawBins.js.map +1 -1
  47. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/histogram.js +19 -21
  48. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/histogram.js.map +1 -1
  49. package/dist/lib/ui/uikit/dist/components/PlChartHistogram/normalizeBins.js.map +1 -1
  50. package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js +2 -4
  51. package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
  52. package/dist/lib/ui/uikit/dist/index.js +78 -80
  53. package/dist/lib/ui/uikit/dist/index.js.map +1 -1
  54. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js.map +1 -1
  55. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js +7 -7
  56. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js.map +1 -1
  57. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js +9 -9
  58. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js.map +1 -1
  59. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selection/index.js +51 -55
  60. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selection/index.js.map +1 -1
  61. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +1 -1
  62. package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/core/index.js +111 -165
  63. package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/core/index.js.map +1 -1
  64. package/dist/node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js +1 -1
  65. package/dist/sdk/model/dist/index.js +1 -1
  66. package/package.json +6 -6
  67. package/src/components/PlMultiSequenceAlignment/Legend.vue +4 -3
  68. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +66 -46
  69. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +85 -34
  70. package/src/components/PlMultiSequenceAlignment/README.md +10 -8
  71. package/src/components/PlMultiSequenceAlignment/Toolbar.vue +4 -1
  72. package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +154 -161
  73. package/src/components/PlMultiSequenceAlignment/data.ts +65 -85
  74. package/src/components/PlMultiSequenceAlignment/markup.ts +47 -15
  75. package/src/components/PlMultiSequenceAlignment/types.ts +1 -1
  76. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-dispatch@3.0.1/node_modules/d3-dispatch/src/dispatch.js +0 -65
  77. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-dispatch@3.0.1/node_modules/d3-dispatch/src/dispatch.js.map +0 -1
  78. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-ease@3.0.1/node_modules/d3-ease/src/cubic.js +0 -7
  79. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-ease@3.0.1/node_modules/d3-ease/src/cubic.js.map +0 -1
  80. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/decompose.js +0 -24
  81. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/decompose.js.map +0 -1
  82. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/index.js +0 -38
  83. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/index.js.map +0 -1
  84. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/parse.js +0 -14
  85. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/parse.js.map +0 -1
  86. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timeout.js +0 -11
  87. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timeout.js.map +0 -1
  88. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timer.js +0 -63
  89. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timer.js.map +0 -1
  90. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/interrupt.js +0 -19
  91. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/interrupt.js.map +0 -1
  92. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js +0 -6
  93. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js.map +0 -1
  94. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/interrupt.js +0 -10
  95. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/interrupt.js.map +0 -1
  96. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/transition.js +0 -29
  97. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/transition.js.map +0 -1
  98. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attr.js +0 -50
  99. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attr.js.map +0 -1
  100. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attrTween.js +0 -39
  101. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attrTween.js.map +0 -1
  102. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/delay.js +0 -19
  103. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/delay.js.map +0 -1
  104. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/duration.js +0 -19
  105. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/duration.js.map +0 -1
  106. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/ease.js +0 -15
  107. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/ease.js.map +0 -1
  108. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/easeVarying.js +0 -16
  109. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/easeVarying.js.map +0 -1
  110. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/end.js +0 -17
  111. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/end.js.map +0 -1
  112. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/filter.js +0 -13
  113. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/filter.js.map +0 -1
  114. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/index.js +0 -66
  115. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/index.js.map +0 -1
  116. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/interpolate.js +0 -12
  117. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/interpolate.js.map +0 -1
  118. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/merge.js +0 -14
  119. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/merge.js.map +0 -1
  120. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/on.js +0 -22
  121. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/on.js.map +0 -1
  122. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/remove.js +0 -14
  123. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/remove.js.map +0 -1
  124. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/schedule.js +0 -86
  125. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/schedule.js.map +0 -1
  126. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/select.js +0 -15
  127. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/select.js.map +0 -1
  128. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selectAll.js +0 -19
  129. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selectAll.js.map +0 -1
  130. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selection.js +0 -9
  131. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selection.js.map +0 -1
  132. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/style.js +0 -46
  133. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/style.js.map +0 -1
  134. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/styleTween.js +0 -24
  135. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/styleTween.js.map +0 -1
  136. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/text.js +0 -19
  137. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/text.js.map +0 -1
  138. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/textTween.js +0 -24
  139. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/textTween.js.map +0 -1
  140. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/transition.js +0 -20
  141. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/transition.js.map +0 -1
  142. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/tween.js +0 -57
  143. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/tween.js.map +0 -1
  144. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js +0 -44
  145. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport {\n chemicalPropertiesColorMap,\n colorizeSequencesByChemicalProperties,\n} from './chemical-properties';\nimport {\n colorizeSequencesByMarkup,\n type Markup,\n markupAlignedSequence,\n markupColors,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { ColorMap, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n value: columnId,\n }));\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(sequenceColumnIds.flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }));\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabelled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: Array.from(\n sequenceColumnsAxes.keys(),\n (axisIdJson) => parseJson(axisIdJson),\n ),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n }\n\n const options = Array.from(optionMap).map(\n ([value, label]) => ({ label, value: parseJson(value) }),\n );\n\n const defaults = options\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n }));\n}\n\nasync function getMultipleAlignmentData({\n pframe,\n sequenceColumnIds,\n labelColumnIds,\n markupColumnId,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n markupColumnId: PObjectId | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pframe || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pframe);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (markupColumnId) {\n secondaryEntry.push({ type: 'column', column: markupColumnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(sequenceColumnIds.flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n })),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pframe,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const markupColumn = markupColumnId\n && table.find(({ spec }) => spec.id === markupColumnId);\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelsRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (markupColumn) {\n const labels = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n const data = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n result.markup = { labels, data };\n }\n\n if (colorScheme.type === 'chemical-properties') {\n const colorMap = chemicalPropertiesColorMap;\n result.highlightImage = {\n blob: await colorizeSequencesByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n colorMap,\n }),\n colorMap,\n };\n } else if (colorScheme.type === 'markup') {\n const colorMap = Object.fromEntries(\n Object.entries(\n result.markup?.labels ?? {},\n ).map(([id, label], index) => [\n id,\n { label, color: markupColors[index % markupColors.length] },\n ]),\n );\n result.highlightImage = {\n blob: await colorizeSequencesByMarkup({\n markupRows: result.markup?.data ?? [],\n colorMap,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n }),\n colorMap,\n };\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelsRows: string[][];\n residueCounts: ResidueCounts;\n markup?: {\n labels: Record<string, string>;\n data: Markup[];\n };\n highlightImage?: {\n blob: Blob;\n colorMap: ColorMap;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","pframe","labelColumnIds","markupColumnId","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","markupColumn","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","data","markup","parseMarkup","markupAlignedSequence","colorMap","chemicalPropertiesColorMap","colorizeSequencesByChemicalProperties","index","markupColors","colorizeSequencesByMarkup","_d","cb","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabelled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pframe,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pframe || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pframe);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pframe,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels: Record<string, string> = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","pframe","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ColorMap } from './types';
1
+ import { HighlightLegend } from './types';
2
2
  export type Markup = {
3
3
  id: string;
4
4
  start: number;
@@ -6,10 +6,12 @@ export type Markup = {
6
6
  }[];
7
7
  export declare function parseMarkup(row: string): Markup;
8
8
  export declare function markupAlignedSequence(alignedSequence: string, markup: Markup): Markup;
9
- export declare function colorizeSequencesByMarkup({ markupRows, columnCount, colorMap }: {
9
+ export declare function highlightByMarkup({ markupRows, columnCount, labels }: {
10
10
  markupRows: Markup[];
11
11
  columnCount: number;
12
- colorMap: ColorMap;
13
- }): Promise<Blob>;
14
- export declare const markupColors: string[];
12
+ labels: Record<string, string>;
13
+ }): {
14
+ blob: Blob;
15
+ legend: HighlightLegend;
16
+ };
15
17
  //# sourceMappingURL=markup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC;AAErE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,MAAM,CAkBR;AAED,wBAAgB,yBAAyB,CACvC,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,eAAO,MAAM,YAAY,UAiBxB,CAAC"}
1
+ {"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC;AAErE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,MAAM,CAkBR;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,GACA;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CA4CzC"}
@@ -1,40 +1,62 @@
1
- function l(e) {
2
- return Array.from(e.matchAll(
1
+ function E(o) {
2
+ return Array.from(o.matchAll(
3
3
  /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\+(?<length>[0-9A-Za-z]*))?\|?/g
4
- )).map((o) => {
5
- const n = o.groups, s = Number.parseInt(n.start, 36), t = n.length ? Number.parseInt(n.length, 36) : 0;
4
+ )).map((l) => {
5
+ const r = l.groups, n = Number.parseInt(r.start, 36), t = r.length ? Number.parseInt(r.length, 36) : 0;
6
6
  return {
7
- id: n.id,
8
- start: s,
7
+ id: r.id,
8
+ start: n,
9
9
  length: t
10
10
  };
11
11
  });
12
12
  }
13
- function i(e, o) {
14
- const n = e.split("").reduce(
15
- (t, r, F) => (r !== "-" && t.push(F), t),
13
+ function f(o, l) {
14
+ const r = o.split("").reduce(
15
+ (t, a, e) => (a !== "-" && t.push(e), t),
16
16
  []
17
17
  );
18
- return o.map((t) => {
19
- const r = n[t.start], F = n[t.start + t.length - 1] + 1;
18
+ return l.map((t) => {
19
+ const a = r[t.start], e = r[t.start + t.length - 1] + 1;
20
20
  return {
21
21
  id: t.id,
22
- start: r,
23
- length: F - r
22
+ start: a,
23
+ length: e - a
24
24
  };
25
25
  });
26
26
  }
27
- function E({ markupRows: e, columnCount: o, colorMap: n }) {
28
- var r;
29
- const s = new OffscreenCanvas(o, e.length), t = s.getContext("2d");
30
- for (const [F, u] of e.entries())
31
- for (const c of u) {
32
- const a = (r = n[c.id]) == null ? void 0 : r.color;
33
- a && (t.fillStyle = a, t.fillRect(c.start, F, c.length, 1));
27
+ function C({ markupRows: o, columnCount: l, labels: r }) {
28
+ const n = /* @__PURE__ */ new Map();
29
+ for (const [e, F] of o.entries())
30
+ for (const { id: s, start: u, length: c } of F) {
31
+ let i = n.get(s);
32
+ i || n.set(s, i = []), i.push({ row: e, start: u, length: c });
34
33
  }
35
- return s.convertToBlob();
34
+ const t = Object.fromEntries(
35
+ Object.entries(r).filter(([e]) => n.has(e)).map(([e, F], s) => [
36
+ e,
37
+ {
38
+ label: F,
39
+ color: g[s % g.length]
40
+ }
41
+ ])
42
+ );
43
+ return { blob: new Blob(
44
+ function* () {
45
+ yield `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${`0 0 ${l} ${o.length * 2}`}" stroke-width="2" preserveAspectRatio="none">`;
46
+ for (const [F, s] of n) {
47
+ const { color: u } = t[F];
48
+ yield `<path stroke="${u}" d="`;
49
+ let c = 0, i = 0;
50
+ for (const { row: d, start: p, length: h } of s)
51
+ yield `m${p - c},${d * 2 + 1 - i}h${h}`, c = p + h, i = d * 2 + 1;
52
+ yield '"/>';
53
+ }
54
+ yield "</svg>";
55
+ }().toArray(),
56
+ { type: "image/svg+xml" }
57
+ ), legend: t };
36
58
  }
37
- const C = [
59
+ const g = [
38
60
  "#E5F2FF",
39
61
  "#FFE8E8",
40
62
  "#F0EBFF",
@@ -53,9 +75,8 @@ const C = [
53
75
  "#DEEEEF"
54
76
  ];
55
77
  export {
56
- E as colorizeSequencesByMarkup,
57
- i as markupAlignedSequence,
58
- C as markupColors,
59
- l as parseMarkup
78
+ C as highlightByMarkup,
79
+ f as markupAlignedSequence,
80
+ E as parseMarkup
60
81
  };
61
82
  //# sourceMappingURL=markup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.js","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"sourcesContent":["import type { ColorMap } from './types';\n\nexport type Markup = { id: string; start: number; length: number }[];\n\nexport function parseMarkup(row: string): Markup {\n return Array.from(row.matchAll(\n /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\\+(?<length>[0-9A-Za-z]*))?\\|?/g,\n )).map((match) => {\n const matchGroups = match.groups as {\n id: string;\n start: string;\n length: string | undefined;\n };\n const start = Number.parseInt(matchGroups.start, 36);\n const length = matchGroups.length\n ? Number.parseInt(matchGroups.length, 36)\n : 0;\n return {\n id: matchGroups.id,\n start,\n length,\n };\n });\n}\n\nexport function markupAlignedSequence(\n alignedSequence: string,\n markup: Markup,\n): Markup {\n const indexMap = alignedSequence.split('').reduce<number[]>(\n (acc, char, index) => {\n if (char !== '-') acc.push(index);\n return acc;\n },\n [],\n );\n const adjusted = markup.map((segment) => {\n const start = indexMap[segment.start];\n const end = indexMap[segment.start + segment.length - 1] + 1;\n return {\n id: segment.id,\n start: start,\n length: end - start,\n };\n });\n return adjusted;\n}\n\nexport function colorizeSequencesByMarkup(\n { markupRows, columnCount, colorMap }: {\n markupRows: Markup[];\n columnCount: number;\n colorMap: ColorMap;\n },\n): Promise<Blob> {\n const canvas = new OffscreenCanvas(columnCount, markupRows.length);\n const context = canvas.getContext('2d')!;\n for (const [rowIndex, markup] of markupRows.entries()) {\n for (const segment of markup) {\n const color = colorMap[segment.id]?.color;\n if (!color) continue;\n context.fillStyle = color;\n context.fillRect(segment.start, rowIndex, segment.length, 1);\n }\n }\n return canvas.convertToBlob();\n}\n\nexport const markupColors = [\n '#E5F2FF',\n '#FFE8E8',\n '#F0EBFF',\n '#FFFFE3',\n '#E5F7E5',\n '#FEEAFE',\n '#FDEED6',\n '#E8FDFE',\n '#CCDFF2',\n '#F2CCCD',\n '#D5CCF2',\n '#F2F2CC',\n '#CCF2CC',\n '#F2CCF2',\n '#EFDDBF',\n '#DEEEEF',\n];\n\nif (import.meta.vitest) {\n const { test, expect } = import.meta.vitest;\n test('annotateAlignedRow', () => {\n const alignedSequence\n = 'EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCAR------------GRAV----D---QWGQGTLVTVSS';\n // 0 10 20 30 40 50 60 70 80 90 100 110 120 130\n // EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCARGRAVDQWGQGTLVTVSS\n const markup = [\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 99, length: 3 },\n { id: '3', start: 102, length: 14 },\n ];\n const alignedMarkup = markupAlignedSequence(alignedSequence, markup);\n expect(alignedMarkup).toEqual([\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 111, length: 3 },\n { id: '3', start: 114, length: 21 },\n ]);\n });\n}\n"],"names":["parseMarkup","row","match","matchGroups","start","length","markupAlignedSequence","alignedSequence","markup","indexMap","acc","char","index","segment","end","colorizeSequencesByMarkup","markupRows","columnCount","colorMap","_a","canvas","context","rowIndex","color","markupColors"],"mappings":"AAIO,SAASA,EAAYC,GAAqB;AACxC,SAAA,MAAM,KAAKA,EAAI;AAAA,IACpB;AAAA,EAAA,CACD,EAAE,IAAI,CAACC,MAAU;AAChB,UAAMC,IAAcD,EAAM,QAKpBE,IAAQ,OAAO,SAASD,EAAY,OAAO,EAAE,GAC7CE,IAASF,EAAY,SACvB,OAAO,SAASA,EAAY,QAAQ,EAAE,IACtC;AACG,WAAA;AAAA,MACL,IAAIA,EAAY;AAAA,MAChB,OAAAC;AAAA,MACA,QAAAC;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEgB,SAAAC,EACdC,GACAC,GACQ;AACR,QAAMC,IAAWF,EAAgB,MAAM,EAAE,EAAE;AAAA,IACzC,CAACG,GAAKC,GAAMC,OACND,MAAS,OAASD,EAAA,KAAKE,CAAK,GACzBF;AAAA,IAET,CAAA;AAAA,EACF;AAUO,SATUF,EAAO,IAAI,CAACK,MAAY;AACjC,UAAAT,IAAQK,EAASI,EAAQ,KAAK,GAC9BC,IAAML,EAASI,EAAQ,QAAQA,EAAQ,SAAS,CAAC,IAAI;AACpD,WAAA;AAAA,MACL,IAAIA,EAAQ;AAAA,MACZ,OAAAT;AAAA,MACA,QAAQU,IAAMV;AAAA,IAChB;AAAA,EAAA,CACD;AAEH;AAEO,SAASW,EACd,EAAE,YAAAC,GAAY,aAAAC,GAAa,UAAAC,KAKZ;AAlDV,MAAAC;AAmDL,QAAMC,IAAS,IAAI,gBAAgBH,GAAaD,EAAW,MAAM,GAC3DK,IAAUD,EAAO,WAAW,IAAI;AACtC,aAAW,CAACE,GAAUd,CAAM,KAAKQ,EAAW;AAC1C,eAAWH,KAAWL,GAAQ;AAC5B,YAAMe,KAAQJ,IAAAD,EAASL,EAAQ,EAAE,MAAnB,gBAAAM,EAAsB;AACpC,MAAKI,MACLF,EAAQ,YAAYE,GACpBF,EAAQ,SAASR,EAAQ,OAAOS,GAAUT,EAAQ,QAAQ,CAAC;AAAA,IAAA;AAG/D,SAAOO,EAAO,cAAc;AAC9B;AAEO,MAAMI,IAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
1
+ {"version":3,"file":"markup.js","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"sourcesContent":["import type { HighlightLegend } from './types';\n\nexport type Markup = { id: string; start: number; length: number }[];\n\nexport function parseMarkup(row: string): Markup {\n return Array.from(row.matchAll(\n /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\\+(?<length>[0-9A-Za-z]*))?\\|?/g,\n )).map((match) => {\n const matchGroups = match.groups as {\n id: string;\n start: string;\n length: string | undefined;\n };\n const start = Number.parseInt(matchGroups.start, 36);\n const length = matchGroups.length\n ? Number.parseInt(matchGroups.length, 36)\n : 0;\n return {\n id: matchGroups.id,\n start,\n length,\n };\n });\n}\n\nexport function markupAlignedSequence(\n alignedSequence: string,\n markup: Markup,\n): Markup {\n const indexMap = alignedSequence.split('').reduce<number[]>(\n (acc, char, index) => {\n if (char !== '-') acc.push(index);\n return acc;\n },\n [],\n );\n const adjusted = markup.map((segment) => {\n const start = indexMap[segment.start];\n const end = indexMap[segment.start + segment.length - 1] + 1;\n return {\n id: segment.id,\n start: start,\n length: end - start,\n };\n });\n return adjusted;\n}\n\nexport function highlightByMarkup(\n { markupRows, columnCount, labels }: {\n markupRows: Markup[];\n columnCount: number;\n labels: Record<string, string>;\n },\n): { blob: Blob; legend: HighlightLegend } {\n const linesById: Map<string, {\n row: number;\n start: number;\n length: number;\n }[]> = new Map();\n for (const [row, markup] of markupRows.entries()) {\n for (const { id, start, length } of markup) {\n let bucket = linesById.get(id);\n if (!bucket) linesById.set(id, bucket = []);\n bucket.push({ row, start, length });\n }\n }\n const legend: HighlightLegend = Object.fromEntries(\n Object.entries(labels)\n .filter(([id]) => linesById.has(id))\n .map(([id, label], index) => [\n id,\n {\n label,\n color: markupColors[index % markupColors.length],\n },\n ]),\n );\n const blob = new Blob(\n (function*() {\n const viewBox = `0 0 ${columnCount} ${markupRows.length * 2}`;\n yield `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" stroke-width=\"2\" preserveAspectRatio=\"none\">`;\n for (const [id, lines] of linesById) {\n const { color } = legend[id];\n yield `<path stroke=\"${color}\" d=\"`;\n let x = 0, y = 0;\n for (const { row, start, length } of lines) {\n yield `m${start - x},${row * 2 + 1 - y}h${length}`;\n x = start + length;\n y = row * 2 + 1;\n }\n yield '\"/>';\n }\n yield '</svg>';\n })().toArray(),\n { type: 'image/svg+xml' },\n );\n return { blob, legend };\n}\n\nconst markupColors = [\n '#E5F2FF',\n '#FFE8E8',\n '#F0EBFF',\n '#FFFFE3',\n '#E5F7E5',\n '#FEEAFE',\n '#FDEED6',\n '#E8FDFE',\n '#CCDFF2',\n '#F2CCCD',\n '#D5CCF2',\n '#F2F2CC',\n '#CCF2CC',\n '#F2CCF2',\n '#EFDDBF',\n '#DEEEEF',\n];\n\nif (import.meta.vitest) {\n const { test, expect } = import.meta.vitest;\n test('annotateAlignedRow', () => {\n const alignedSequence\n = 'EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCAR------------GRAV----D---QWGQGTLVTVSS';\n // 0 10 20 30 40 50 60 70 80 90 100 110 120 130\n // EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCARGRAVDQWGQGTLVTVSS\n const markup = [\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 99, length: 3 },\n { id: '3', start: 102, length: 14 },\n ];\n const alignedMarkup = markupAlignedSequence(alignedSequence, markup);\n expect(alignedMarkup).toEqual([\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 111, length: 3 },\n { id: '3', start: 114, length: 21 },\n ]);\n });\n}\n"],"names":["parseMarkup","row","match","matchGroups","start","length","markupAlignedSequence","alignedSequence","markup","indexMap","acc","char","index","segment","end","highlightByMarkup","markupRows","columnCount","labels","linesById","id","bucket","legend","label","markupColors","lines","color","x","y"],"mappings":"AAIO,SAASA,EAAYC,GAAqB;AACxC,SAAA,MAAM,KAAKA,EAAI;AAAA,IACpB;AAAA,EAAA,CACD,EAAE,IAAI,CAACC,MAAU;AAChB,UAAMC,IAAcD,EAAM,QAKpBE,IAAQ,OAAO,SAASD,EAAY,OAAO,EAAE,GAC7CE,IAASF,EAAY,SACvB,OAAO,SAASA,EAAY,QAAQ,EAAE,IACtC;AACG,WAAA;AAAA,MACL,IAAIA,EAAY;AAAA,MAChB,OAAAC;AAAA,MACA,QAAAC;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEgB,SAAAC,EACdC,GACAC,GACQ;AACR,QAAMC,IAAWF,EAAgB,MAAM,EAAE,EAAE;AAAA,IACzC,CAACG,GAAKC,GAAMC,OACND,MAAS,OAASD,EAAA,KAAKE,CAAK,GACzBF;AAAA,IAET,CAAA;AAAA,EACF;AAUO,SATUF,EAAO,IAAI,CAACK,MAAY;AACjC,UAAAT,IAAQK,EAASI,EAAQ,KAAK,GAC9BC,IAAML,EAASI,EAAQ,QAAQA,EAAQ,SAAS,CAAC,IAAI;AACpD,WAAA;AAAA,MACL,IAAIA,EAAQ;AAAA,MACZ,OAAAT;AAAA,MACA,QAAQU,IAAMV;AAAA,IAChB;AAAA,EAAA,CACD;AAEH;AAEO,SAASW,EACd,EAAE,YAAAC,GAAY,aAAAC,GAAa,QAAAC,KAKc;AACnC,QAAAC,wBAIK,IAAI;AACf,aAAW,CAAClB,GAAKO,CAAM,KAAKQ,EAAW;AACrC,eAAW,EAAE,IAAAI,GAAI,OAAAhB,GAAO,QAAAC,EAAA,KAAYG,GAAQ;AACtC,UAAAa,IAASF,EAAU,IAAIC,CAAE;AAC7B,MAAKC,KAAQF,EAAU,IAAIC,GAAIC,IAAS,EAAE,GAC1CA,EAAO,KAAK,EAAE,KAAApB,GAAK,OAAAG,GAAO,QAAAC,GAAQ;AAAA,IAAA;AAGtC,QAAMiB,IAA0B,OAAO;AAAA,IACrC,OAAO,QAAQJ,CAAM,EAClB,OAAO,CAAC,CAACE,CAAE,MAAMD,EAAU,IAAIC,CAAE,CAAC,EAClC,IAAI,CAAC,CAACA,GAAIG,CAAK,GAAGX,MAAU;AAAA,MAC3BQ;AAAA,MACA;AAAA,QACE,OAAAG;AAAA,QACA,OAAOC,EAAaZ,IAAQY,EAAa,MAAM;AAAA,MAAA;AAAA,IAElD,CAAA;AAAA,EACL;AAoBO,SAAA,EAAE,MAnBI,IAAI;AAAA,IACd,aAAY;AAEX,YAAM,oDADU,OAAOP,CAAW,IAAID,EAAW,SAAS,CAAC,EACM;AACjE,iBAAW,CAACI,GAAIK,CAAK,KAAKN,GAAW;AACnC,cAAM,EAAE,OAAAO,EAAA,IAAUJ,EAAOF,CAAE;AAC3B,cAAM,iBAAiBM,CAAK;AACxB,YAAAC,IAAI,GAAGC,IAAI;AACf,mBAAW,EAAE,KAAA3B,GAAK,OAAAG,GAAO,QAAAC,EAAA,KAAYoB;AAC7B,gBAAA,IAAIrB,IAAQuB,CAAC,IAAI1B,IAAM,IAAI,IAAI2B,CAAC,IAAIvB,CAAM,IAChDsB,IAAIvB,IAAQC,GACZuB,IAAI3B,IAAM,IAAI;AAEV,cAAA;AAAA,MAAA;AAEF,YAAA;AAAA,IACR,EAAA,EAAK,QAAQ;AAAA,IACb,EAAE,MAAM,gBAAgB;AAAA,EAC1B,GACe,QAAAqB,EAAO;AACxB;AAEA,MAAME,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
@@ -1,4 +1,4 @@
1
- export type ColorMap = Record<string, {
1
+ export type HighlightLegend = Record<string, {
2
2
  label: string;
3
3
  color: string;
4
4
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC"}
@@ -17,8 +17,6 @@ import "../../global/resizeObserver.js";
17
17
  import "../../layout/PlBlockPage/PlBlockPageTitleTeleportId.js";
18
18
  import "../PlSvg/registry.js";
19
19
  import "../../sdk/model/dist/index.js";
20
- import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
21
- import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
22
20
  import "../../colors/color.js";
23
21
  import "../../colors/gradient.js";
24
22
  (function() {
@@ -75,7 +73,7 @@ import "../../colors/gradient.js";
75
73
  const q = { class: "command-menu__container" }, _ = {
76
74
  key: 0,
77
75
  class: "table-body__no-data"
78
- }, $ = { class: "carets" }, YA = /* @__PURE__ */ H({
76
+ }, $ = { class: "carets" }, MA = /* @__PURE__ */ H({
79
77
  __name: "TableComponent",
80
78
  props: {
81
79
  settings: {}
@@ -172,6 +170,6 @@ const q = { class: "command-menu__container" }, _ = {
172
170
  }
173
171
  });
174
172
  export {
175
- YA as default
173
+ MA as default
176
174
  };
177
175
  //# sourceMappingURL=TableComponent.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableComponent.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableComponent.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import a from "./TableComponent.vue.js";
2
2
  import { h as s, computed as o, unref as n, reactive as f } from "vue";
3
3
  import { RawData as m } from "./adapters/RawData.js";
4
- import { AsyncData as h } from "./adapters/AsyncData.js";
4
+ import { AsyncData as d } from "./adapters/AsyncData.js";
5
5
  function y(t) {
6
6
  return Object.freeze(t);
7
7
  }
@@ -28,7 +28,7 @@ function v(t, r) {
28
28
  return o(() => s(a, c));
29
29
  }
30
30
  export {
31
- h as AsyncData,
31
+ d as AsyncData,
32
32
  a as Component,
33
33
  D as factory,
34
34
  u as rawDataSettings,
@@ -1,18 +1,16 @@
1
- import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
2
- import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
3
1
  import c from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selectAll.js";
4
2
  import { axisLeft as f, axisBottom as l } from "../../node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js";
5
- function g(t, i, r, s) {
6
- const { width: o, height: a } = i;
7
- function n() {
3
+ function d(t, i, r, s) {
4
+ const { width: n, height: a } = i;
5
+ function e() {
8
6
  return f(r.y).ticks(6);
9
7
  }
10
- function e() {
8
+ function o() {
11
9
  return s(l(r.x));
12
10
  }
13
- t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").call(n().tickSize(-o).tickFormat(() => "")), t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").attr("transform", `translate(0,${a})`).call(e().tickSize(-a).tickFormat(() => "")), c(".grid line").style("stroke", "#E1E3EB").style("opacity", 0.7);
11
+ t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").call(e().tickSize(-n).tickFormat(() => "")), t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").attr("transform", `translate(0,${a})`).call(o().tickSize(-a).tickFormat(() => "")), c(".grid line").style("stroke", "#E1E3EB").style("opacity", 0.7);
14
12
  }
15
13
  export {
16
- g as createGridlines
14
+ d as createGridlines
17
15
  };
18
16
  //# sourceMappingURL=createGridlines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createGridlines.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createGridlines.ts"],"sourcesContent":["import * as d3 from 'd3';\nimport type { ChartOptions, Scales } from './types';\n\nexport function createGridlines(\n svg: d3.Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n scales: Scales,\n xTicks: (d: d3.Axis<d3.NumberValue>) => d3.Axis<d3.NumberValue>,\n) {\n const { width, height } = options;\n\n function makeYGridlines() {\n return d3.axisLeft(scales.y) // Use the y-scale for horizontal gridlines\n .ticks(6); // Adjust the number of gridlines\n }\n\n function makeXGridlines() {\n return xTicks(d3.axisBottom(scales.x));\n }\n // Append horizontal gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif') // Doesn't work\n .call(makeYGridlines()\n .tickSize(-width) // Extend gridlines across the chart width\n .tickFormat(() => '')); // Remove tick labels\n\n // Append vertical gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif')\n .attr('transform', `translate(0,${height})`) // Position at the bottom of the chart\n .call(makeXGridlines()\n .tickSize(-height) // Extend gridlines across the chart height\n .tickFormat(() => '')); // Remove tick labels\n\n // Style the gridlines using CSS (or inline styles)\n d3.selectAll('.grid line')\n .style('stroke', '#E1E3EB') // Light gray gridlines\n // .style('stroke-dasharray', '2,2') // Dashed gridlines\n .style('opacity', 0.7); // Slightly transparent\n}\n"],"names":["createGridlines","svg","options","scales","xTicks","width","height","makeYGridlines","d3.axisLeft","makeXGridlines","d3.axisBottom","d3.selectAll"],"mappings":";;;;AAGO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,OAAAC,GAAO,QAAAC,EAAWJ,IAAAA;AAE1B,WAASK,IAAiB;AACxB,WAAOC,EAAYL,EAAO,CAAC,EACxB,MAAM,CAAC;AAAA,EAAA;AAGZ,WAASM,IAAiB;AACxB,WAAOL,EAAOM,EAAcP,EAAO,CAAC,CAAC;AAAA,EAAA;AAGnCF,IAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAKM,EACH,EAAA,SAAS,CAACF,CAAK,EACf,WAAW,MAAM,EAAE,CAAC,GAGrBJ,EAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAK,aAAa,eAAeK,CAAM,GAAG,EAC1C,KAAKG,EAAA,EACH,SAAS,CAACH,CAAM,EAChB,WAAW,MAAM,EAAE,CAAC,GAGtBK,EAAU,YAAY,EACtB,MAAM,UAAU,SAAS,EAEzB,MAAM,WAAW,GAAG;AACzB;"}
1
+ {"version":3,"file":"createGridlines.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createGridlines.ts"],"sourcesContent":["import type { ChartOptions, Scales } from './types';\nimport type { Selection } from 'd3-selection';\nimport type { Axis } from 'd3-axis';\nimport type { NumberValue } from 'd3-scale';\nimport { selectAll } from 'd3-selection';\nimport { axisBottom, axisLeft } from 'd3-axis';\n\nexport function createGridlines(\n svg: Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n scales: Scales,\n xTicks: (d: Axis<NumberValue>) => Axis<NumberValue>,\n) {\n const { width, height } = options;\n\n function makeYGridlines() {\n return axisLeft(scales.y) // Use the y-scale for horizontal gridlines\n .ticks(6); // Adjust the number of gridlines\n }\n\n function makeXGridlines() {\n return xTicks(axisBottom(scales.x));\n }\n // Append horizontal gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif') // Doesn't work\n .call(makeYGridlines()\n .tickSize(-width) // Extend gridlines across the chart width\n .tickFormat(() => '')); // Remove tick labels\n\n // Append vertical gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif')\n .attr('transform', `translate(0,${height})`) // Position at the bottom of the chart\n .call(makeXGridlines()\n .tickSize(-height) // Extend gridlines across the chart height\n .tickFormat(() => '')); // Remove tick labels\n\n // Style the gridlines using CSS (or inline styles)\n selectAll('.grid line')\n .style('stroke', '#E1E3EB') // Light gray gridlines\n // .style('stroke-dasharray', '2,2') // Dashed gridlines\n .style('opacity', 0.7); // Slightly transparent\n}\n"],"names":["createGridlines","svg","options","scales","xTicks","width","height","makeYGridlines","axisLeft","makeXGridlines","axisBottom","selectAll"],"mappings":";;AAOO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,OAAAC,GAAO,QAAAC,EAAWJ,IAAAA;AAE1B,WAASK,IAAiB;AACxB,WAAOC,EAASL,EAAO,CAAC,EACrB,MAAM,CAAC;AAAA,EAAA;AAGZ,WAASM,IAAiB;AACxB,WAAOL,EAAOM,EAAWP,EAAO,CAAC,CAAC;AAAA,EAAA;AAGhCF,IAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAKM,EACH,EAAA,SAAS,CAACF,CAAK,EACf,WAAW,MAAM,EAAE,CAAC,GAGrBJ,EAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAK,aAAa,eAAeK,CAAM,GAAG,EAC1C,KAAKG,EAAA,EACH,SAAS,CAACH,CAAM,EAChB,WAAW,MAAM,EAAE,CAAC,GAGfK,EAAA,YAAY,EACnB,MAAM,UAAU,SAAS,EAEzB,MAAM,WAAW,GAAG;AACzB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"createLabels.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createLabels.ts"],"sourcesContent":["import type * as d3 from 'd3';\nimport type { ChartOptions } from './types';\n\nexport function createLabels(\n svg: d3.Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n) {\n const { height, width, margin, xAxisLabel, yAxisLabel, compact } = options;\n\n if (compact) {\n return;\n }\n\n // X-axis label\n svg.append('text')\n .attr('class', 'x-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', width / 2) // Center horizontally\n .attr('y', height + margin.bottom - 5) // Position below the X-axis\n .text(xAxisLabel ?? 'Value Range'); // Set your custom label text\n\n // Y-axis label\n svg.append('text')\n .attr('class', 'y-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', -height / 2) // Center vertically (rotated axis)\n .attr('y', -margin.left + 15) // Position to the left of the Y-axis\n .attr('transform', 'rotate(-90)') // Rotate text 90 degrees counter-clockwise\n .text(yAxisLabel ?? 'Frequency'); // Set your custom label text\n}\n"],"names":["createLabels","svg","options","height","width","margin","xAxisLabel","yAxisLabel","compact"],"mappings":"AAGgB,SAAAA,EACdC,GACAC,GACA;AACA,QAAM,EAAE,QAAAC,GAAQ,OAAAC,GAAO,QAAAC,GAAQ,YAAAC,GAAY,YAAAC,GAAY,SAAAC,EAAYN,IAAAA;AAE/DM,EAAAA,MAKJP,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAKG,IAAQ,CAAC,EACnB,KAAK,KAAKD,IAASE,EAAO,SAAS,CAAC,EACpC,KAAKC,KAAc,aAAa,GAGnCL,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAACE,IAAS,CAAC,EACrB,KAAK,KAAK,CAACE,EAAO,OAAO,EAAE,EAC3B,KAAK,aAAa,aAAa,EAC/B,KAAKE,KAAc,WAAW;AACnC;"}
1
+ {"version":3,"file":"createLabels.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createLabels.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\nimport type { ChartOptions } from './types';\n\nexport function createLabels(\n svg: Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n) {\n const { height, width, margin, xAxisLabel, yAxisLabel, compact } = options;\n\n if (compact) {\n return;\n }\n\n // X-axis label\n svg.append('text')\n .attr('class', 'x-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', width / 2) // Center horizontally\n .attr('y', height + margin.bottom - 5) // Position below the X-axis\n .text(xAxisLabel ?? 'Value Range'); // Set your custom label text\n\n // Y-axis label\n svg.append('text')\n .attr('class', 'y-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', -height / 2) // Center vertically (rotated axis)\n .attr('y', -margin.left + 15) // Position to the left of the Y-axis\n .attr('transform', 'rotate(-90)') // Rotate text 90 degrees counter-clockwise\n .text(yAxisLabel ?? 'Frequency'); // Set your custom label text\n}\n"],"names":["createLabels","svg","options","height","width","margin","xAxisLabel","yAxisLabel","compact"],"mappings":"AAGgB,SAAAA,EACdC,GACAC,GACA;AACA,QAAM,EAAE,QAAAC,GAAQ,OAAAC,GAAO,QAAAC,GAAQ,YAAAC,GAAY,YAAAC,GAAY,SAAAC,EAAYN,IAAAA;AAE/DM,EAAAA,MAKJP,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAKG,IAAQ,CAAC,EACnB,KAAK,KAAKD,IAASE,EAAO,SAAS,CAAC,EACpC,KAAKC,KAAc,aAAa,GAGnCL,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAACE,IAAS,CAAC,EACrB,KAAK,KAAK,CAACE,EAAO,OAAO,EAAE,EAC3B,KAAK,aAAa,aAAa,EAC/B,KAAKE,KAAc,WAAW;AACnC;"}
@@ -1,11 +1,9 @@
1
- import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
2
- import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
3
- import n from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js";
4
- function l(r, i) {
5
- const { width: o, height: e, margin: t, compact: a } = i;
6
- return r.replaceChildren(), a && (r.style.height = e + "px", r.style.lineHeight = e + "px"), n(r).append("svg").attr("width", o + t.left + t.right).attr("height", e + t.top + t.bottom).append("g").attr("transform", `translate(${t.left},${t.top})`);
1
+ import h from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js";
2
+ function p(r, a) {
3
+ const { width: n, height: e, margin: t, compact: i } = a;
4
+ return r.replaceChildren(), i && (r.style.height = e + "px", r.style.lineHeight = e + "px"), h(r).append("svg").attr("width", n + t.left + t.right).attr("height", e + t.top + t.bottom).append("g").attr("transform", `translate(${t.left},${t.top})`);
7
5
  }
8
6
  export {
9
- l as createSvgContainer
7
+ p as createSvgContainer
10
8
  };
11
9
  //# sourceMappingURL=createSvgContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSvgContainer.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createSvgContainer.ts"],"sourcesContent":["import * as d3 from 'd3';\nimport type { ChartOptions } from './types';\n\nexport function createSvgContainer(el: HTMLElement, options: ChartOptions) {\n const { width, height, margin, compact } = options;\n\n el.replaceChildren();\n\n if (compact) {\n el.style.height = height + 'px';\n el.style.lineHeight = height + 'px';\n }\n\n const svg = d3\n .select(el) // Append the SVG element to the body\n .append('svg')\n .attr('width', width + margin.left + margin.right) // Set the total width\n .attr('height', height + margin.top + margin.bottom) // Set the total height\n .append('g') // Append a group to handle margins\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n return svg;\n}\n"],"names":["createSvgContainer","el","options","width","height","margin","compact","d3.select"],"mappings":";;;AAGgB,SAAAA,EAAmBC,GAAiBC,GAAuB;AACnE,QAAA,EAAE,OAAAC,GAAO,QAAAC,GAAQ,QAAAC,GAAQ,SAAAC,EAAAA,IAAYJ;AAE3CD,SAAAA,EAAG,mBAECK,MACCL,EAAA,MAAM,SAASG,IAAS,MACxBH,EAAA,MAAM,aAAaG,IAAS,OAGrBG,EACFN,CAAE,EACT,OAAO,KAAK,EACZ,KAAK,SAASE,IAAQE,EAAO,OAAOA,EAAO,KAAK,EAChD,KAAK,UAAUD,IAASC,EAAO,MAAMA,EAAO,MAAM,EAClD,OAAO,GAAG,EACV,KAAK,aAAa,aAAaA,EAAO,IAAI,IAAIA,EAAO,GAAG,GAAG;AAGhE;"}
1
+ {"version":3,"file":"createSvgContainer.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createSvgContainer.ts"],"sourcesContent":["import type { ChartOptions } from './types';\nimport { select } from 'd3-selection';\n\nexport function createSvgContainer(el: HTMLElement, options: ChartOptions) {\n const { width, height, margin, compact } = options;\n\n el.replaceChildren();\n\n if (compact) {\n el.style.height = height + 'px';\n el.style.lineHeight = height + 'px';\n }\n\n const svg = select(el) // Append the SVG element to the body\n .append('svg')\n .attr('width', width + margin.left + margin.right) // Set the total width\n .attr('height', height + margin.top + margin.bottom) // Set the total height\n .append('g') // Append a group to handle margins\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n return svg;\n}\n"],"names":["createSvgContainer","el","options","width","height","margin","compact","select"],"mappings":";AAGgB,SAAAA,EAAmBC,GAAiBC,GAAuB;AACnE,QAAA,EAAE,OAAAC,GAAO,QAAAC,GAAQ,QAAAC,GAAQ,SAAAC,EAAAA,IAAYJ;AAE3CD,SAAAA,EAAG,mBAECK,MACCL,EAAA,MAAM,SAASG,IAAS,MACxBH,EAAA,MAAM,aAAaG,IAAS,OAGrBG,EAAON,CAAE,EAClB,OAAO,KAAK,EACZ,KAAK,SAASE,IAAQE,EAAO,OAAOA,EAAO,KAAK,EAChD,KAAK,UAAUD,IAASC,EAAO,MAAMA,EAAO,MAAM,EAClD,OAAO,GAAG,EACV,KAAK,aAAa,aAAaA,EAAO,IAAI,IAAIA,EAAO,GAAG,GAAG;AAGhE;"}
@@ -1,8 +1,6 @@
1
- import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
2
- import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
3
1
  import c from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js";
4
- function g(l, n, r, a) {
5
- const { height: p } = r, { x: e, y: s } = a, i = c("body").append("div").attr("class", "svg-tooltip").style("position", "absolute").style("visibility", "hidden"), x = function(t, o) {
2
+ function f(l, n, a, r) {
3
+ const { height: p } = a, { x: e, y: s } = r, i = c("body").append("div").attr("class", "svg-tooltip").style("position", "absolute").style("visibility", "hidden"), x = function(t, o) {
6
4
  i.style("visibility", "visible").text(`count: ${o.length}
7
5
  x0: ${o.x0}
8
6
  x1: ${o.x1}`);
@@ -16,6 +14,6 @@ x1: ${o.x1}`);
16
14
  `);
17
15
  }
18
16
  export {
19
- g as drawBins
17
+ f as drawBins
20
18
  };
21
19
  //# sourceMappingURL=drawBins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"drawBins.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/drawBins.ts"],"sourcesContent":["import type { BinLike, ChartOptions, Scales, SVG } from './types';\nimport * as d3 from 'd3';\n\nexport function drawBins(\n svg: SVG,\n bins: BinLike[],\n dimension: ChartOptions,\n scales: Scales,\n) {\n const { height } = dimension;\n\n const { x, y } = scales;\n\n const tooltip = d3\n .select('body')\n .append('div')\n .attr('class', 'svg-tooltip')\n .style('position', 'absolute')\n .style('visibility', 'hidden');\n\n // Three function that change the tooltip when user hover / move / leave a cell\n const mouseover = function (_event: MouseEvent, d: BinLike) {\n tooltip\n .style('visibility', 'visible')\n .text(`count: ${d.length}\\nx0: ${d.x0}\\nx1: ${d.x1}`);\n };\n\n const mousemove = function (event: MouseEvent) {\n tooltip\n .style('top', event.pageY - 10 + 'px')\n .style('left', event.pageX + 10 + 'px');\n };\n\n const mouseout = function () {\n tooltip.style('visibility', 'hidden');\n };\n\n // Add rectangles for the histogram bars\n svg.selectAll('rect')\n .data(bins)\n .enter()\n .append('rect')\n .attr('x', (d) => x(d.x0!)) // Position the bar based on the bin start\n .attr('y', (d) => y(d.length)) // Height based on bin count\n .attr('width', (d) => x(d.x1!) - x(d.x0!)) // Bar width based on logarithmic intervals\n .attr('height', (d) => height - y(d.length)) // Invert height to fit SVG coordinate system\n .style('fill', '#929BAD')\n .attr('stroke', '#fff') // Border color\n .attr('stroke-opacity', 0.2)\n .attr('stroke-width', 0.5)\n .on('mouseover', mouseover)\n .on('mousemove', mousemove)\n .on('mouseout', mouseout)\n .append('title').text((d) => `[${d.x0}, ${d.x1}]\\n` + d.length + '\\n'); // Set bar color\n}\n"],"names":["drawBins","svg","bins","dimension","scales","height","x","y","tooltip","d3.select","mouseover","_event","d","mousemove","event","mouseout"],"mappings":";;;AAGO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,QAAAC,EAAWF,IAAAA,GAEb,EAAE,GAAAG,GAAG,GAAAC,EAAAA,IAAMH,GAEXI,IAAUC,EACN,MAAM,EACb,OAAO,KAAK,EACZ,KAAK,SAAS,aAAa,EAC3B,MAAM,YAAY,UAAU,EAC5B,MAAM,cAAc,QAAQ,GAGzBC,IAAY,SAAUC,GAAoBC,GAAY;AAC1DJ,IAAAA,EACG,MAAM,cAAc,SAAS,EAC7B,KAAK,UAAUI,EAAE,MAAM;AAAA,MAASA,EAAE,EAAE;AAAA,MAASA,EAAE,EAAE,EAAE;AAAA,EAAA,GAGlDC,IAAY,SAAUC,GAAmB;AAC7CN,IAAAA,EACG,MAAM,OAAOM,EAAM,QAAQ,KAAK,IAAI,EACpC,MAAM,QAAQA,EAAM,QAAQ,KAAK,IAAI;AAAA,EAC1C,GAEMC,IAAW,WAAY;AACnBP,IAAAA,EAAA,MAAM,cAAc,QAAQ;AAAA,EACtC;AAGAP,EAAAA,EAAI,UAAU,MAAM,EACjB,KAAKC,CAAI,EACT,MACA,EAAA,OAAO,MAAM,EACb,KAAK,KAAK,CAACU,MAAMN,EAAEM,EAAE,EAAG,CAAC,EACzB,KAAK,KAAK,CAACA,MAAML,EAAEK,EAAE,MAAM,CAAC,EAC5B,KAAK,SAAS,CAACA,MAAMN,EAAEM,EAAE,EAAG,IAAIN,EAAEM,EAAE,EAAG,CAAC,EACxC,KAAK,UAAU,CAACA,MAAMP,IAASE,EAAEK,EAAE,MAAM,CAAC,EAC1C,MAAM,QAAQ,SAAS,EACvB,KAAK,UAAU,MAAM,EACrB,KAAK,kBAAkB,GAAG,EAC1B,KAAK,gBAAgB,GAAG,EACxB,GAAG,aAAaF,CAAS,EACzB,GAAG,aAAaG,CAAS,EACzB,GAAG,YAAYE,CAAQ,EACvB,OAAO,OAAO,EAAE,KAAK,CAACH,MAAM,IAAIA,EAAE,EAAE,KAAKA,EAAE,EAAE;AAAA,IAAQA,EAAE,SAAS;AAAA,CAAI;AACzE;"}
1
+ {"version":3,"file":"drawBins.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/drawBins.ts"],"sourcesContent":["import type { BinLike, ChartOptions, Scales, SVG } from './types';\nimport { select } from 'd3-selection';\n\nexport function drawBins(\n svg: SVG,\n bins: BinLike[],\n dimension: ChartOptions,\n scales: Scales,\n) {\n const { height } = dimension;\n\n const { x, y } = scales;\n\n const tooltip = select('body')\n .append('div')\n .attr('class', 'svg-tooltip')\n .style('position', 'absolute')\n .style('visibility', 'hidden');\n\n // Three function that change the tooltip when user hover / move / leave a cell\n const mouseover = function (_event: MouseEvent, d: BinLike) {\n tooltip\n .style('visibility', 'visible')\n .text(`count: ${d.length}\\nx0: ${d.x0}\\nx1: ${d.x1}`);\n };\n\n const mousemove = function (event: MouseEvent) {\n tooltip\n .style('top', event.pageY - 10 + 'px')\n .style('left', event.pageX + 10 + 'px');\n };\n\n const mouseout = function () {\n tooltip.style('visibility', 'hidden');\n };\n\n // Add rectangles for the histogram bars\n svg.selectAll('rect')\n .data(bins)\n .enter()\n .append('rect')\n .attr('x', (d) => x(d.x0!)) // Position the bar based on the bin start\n .attr('y', (d) => y(d.length)) // Height based on bin count\n .attr('width', (d) => x(d.x1!) - x(d.x0!)) // Bar width based on logarithmic intervals\n .attr('height', (d) => height - y(d.length)) // Invert height to fit SVG coordinate system\n .style('fill', '#929BAD')\n .attr('stroke', '#fff') // Border color\n .attr('stroke-opacity', 0.2)\n .attr('stroke-width', 0.5)\n .on('mouseover', mouseover)\n .on('mousemove', mousemove)\n .on('mouseout', mouseout)\n .append('title').text((d) => `[${d.x0}, ${d.x1}]\\n` + d.length + '\\n'); // Set bar color\n}\n"],"names":["drawBins","svg","bins","dimension","scales","height","x","y","tooltip","select","mouseover","_event","d","mousemove","event","mouseout"],"mappings":";AAGO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,QAAAC,EAAWF,IAAAA,GAEb,EAAE,GAAAG,GAAG,GAAAC,EAAAA,IAAMH,GAEXI,IAAUC,EAAO,MAAM,EAC1B,OAAO,KAAK,EACZ,KAAK,SAAS,aAAa,EAC3B,MAAM,YAAY,UAAU,EAC5B,MAAM,cAAc,QAAQ,GAGzBC,IAAY,SAAUC,GAAoBC,GAAY;AAC1DJ,IAAAA,EACG,MAAM,cAAc,SAAS,EAC7B,KAAK,UAAUI,EAAE,MAAM;AAAA,MAASA,EAAE,EAAE;AAAA,MAASA,EAAE,EAAE,EAAE;AAAA,EAAA,GAGlDC,IAAY,SAAUC,GAAmB;AAC7CN,IAAAA,EACG,MAAM,OAAOM,EAAM,QAAQ,KAAK,IAAI,EACpC,MAAM,QAAQA,EAAM,QAAQ,KAAK,IAAI;AAAA,EAC1C,GAEMC,IAAW,WAAY;AACnBP,IAAAA,EAAA,MAAM,cAAc,QAAQ;AAAA,EACtC;AAGAP,EAAAA,EAAI,UAAU,MAAM,EACjB,KAAKC,CAAI,EACT,MACA,EAAA,OAAO,MAAM,EACb,KAAK,KAAK,CAACU,MAAMN,EAAEM,EAAE,EAAG,CAAC,EACzB,KAAK,KAAK,CAACA,MAAML,EAAEK,EAAE,MAAM,CAAC,EAC5B,KAAK,SAAS,CAACA,MAAMN,EAAEM,EAAE,EAAG,IAAIN,EAAEM,EAAE,EAAG,CAAC,EACxC,KAAK,UAAU,CAACA,MAAMP,IAASE,EAAEK,EAAE,MAAM,CAAC,EAC1C,MAAM,QAAQ,SAAS,EACvB,KAAK,UAAU,MAAM,EACrB,KAAK,kBAAkB,GAAG,EAC1B,KAAK,gBAAgB,GAAG,EACxB,GAAG,aAAaF,CAAS,EACzB,GAAG,aAAaG,CAAS,EACzB,GAAG,YAAYE,CAAQ,EACvB,OAAO,OAAO,EAAE,KAAK,CAACH,MAAM,IAAIA,EAAE,EAAE,KAAKA,EAAE,EAAE;AAAA,IAAQA,EAAE,SAAS;AAAA,CAAI;AACzE;"}
@@ -1,8 +1,6 @@
1
- import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
2
- import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
3
- import { createSvgContainer as x } from "./createSvgContainer.js";
4
- import { drawBins as y } from "./drawBins.js";
5
- import { createGridlines as $ } from "./createGridlines.js";
1
+ import { createSvgContainer as $ } from "./createSvgContainer.js";
2
+ import { drawBins as x } from "./drawBins.js";
3
+ import { createGridlines as y } from "./createGridlines.js";
6
4
  import { logspace as b } from "./logspace.js";
7
5
  import { createLabels as k } from "./createLabels.js";
8
6
  import { drawThreshold as u } from "./drawThreshold.js";
@@ -10,30 +8,30 @@ import { normalizeBins as z } from "./normalizeBins.js";
10
8
  import w from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
11
9
  import p from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
12
10
  import F from "../../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/symlog.js";
11
+ import { axisBottom as B, axisLeft as S } from "../../node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js";
13
12
  import q from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/bin.js";
14
13
  import C from "../../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js";
15
- import { axisBottom as B, axisLeft as S } from "../../node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js";
16
- const L = (e, i) => e.append("g").style("font-size", "14px").style("font-weight", "500").attr("transform", `translate(0,${i})`), M = (e) => e.append("g").style("font-size", "14px").style("font-weight", "500"), V = (e, i) => C().domain([0, p(e, (r) => r.length)]).range([i, 0]);
17
- function Q(e, i, r) {
18
- const { width: h, height: l, nBins: s = 10 } = i, o = x(e, i), f = w(r), c = p(r), t = C().domain([f, c]).range([0, h]), m = z(q().domain(t.domain()).thresholds(t.ticks(s))(r)), n = V(m, l);
19
- $(o, i, { x: t, y: n }, (a) => a.ticks(6)), y(o, m, i, { x: t, y: n }), u(o, { x: t, y: n }, i), L(o, l).call(B(t).tickSize(0)), M(o).call(S(n).tickSize(0)), k(o, i);
14
+ const L = (t, i) => t.append("g").style("font-size", "14px").style("font-weight", "500").attr("transform", `translate(0,${i})`), M = (t) => t.append("g").style("font-size", "14px").style("font-weight", "500"), V = (t, i) => C().domain([0, p(t, (r) => r.length)]).range([i, 0]);
15
+ function O(t, i, r) {
16
+ const { width: h, height: l, nBins: s = 10 } = i, o = $(t, i), f = w(r), c = p(r), a = C().domain([f, c]).range([0, h]), m = z(q().domain(a.domain()).thresholds(a.ticks(s))(r)), n = V(m, l);
17
+ y(o, i, { x: a, y: n }, (e) => e.ticks(6)), x(o, m, i, { x: a, y: n }), u(o, { x: a, y: n }, i), L(o, l).call(B(a).tickSize(0)), M(o).call(S(n).tickSize(0)), k(o, i);
20
18
  }
21
- function R(e, i, r) {
22
- const { width: h, height: l, nBins: s = 10 } = i, o = x(e, i), f = w(r), c = p(r), t = F().domain([f, c]).range([0, h]).nice(), m = (g) => {
19
+ function P(t, i, r) {
20
+ const { width: h, height: l, nBins: s = 10 } = i, o = $(t, i), f = w(r), c = p(r), a = F().domain([f, c]).range([0, h]).nice(), m = (g) => {
23
21
  const H = [];
24
22
  for (let d = 0; d <= g; d++)
25
- H.push(Number(t.invert(h * (d / g)).toFixed(2)));
23
+ H.push(Number(a.invert(h * (d / g)).toFixed(2)));
26
24
  return H;
27
- }, n = z(q().domain(t.domain()).thresholds(m(s))(r)), a = V(n, l), v = b(0, Math.ceil(Math.log10(c)), 6);
28
- $(o, i, { x: t, y: a }, (g) => g.tickValues(v)), y(o, n, i, { x: t, y: a }), u(o, { x: t, y: a }, i), L(o, l).call(B(t).tickValues(v).tickSize(0)), M(o).call(S(a).tickSize(0)), k(o, i);
25
+ }, n = z(q().domain(a.domain()).thresholds(m(s))(r)), e = V(n, l), v = b(0, Math.ceil(Math.log10(c)), 6);
26
+ y(o, i, { x: a, y: e }, (g) => g.tickValues(v)), x(o, n, i, { x: a, y: e }), u(o, { x: a, y: e }, i), L(o, l).call(B(a).tickValues(v).tickSize(0)), M(o).call(S(e).tickSize(0)), k(o, i);
29
27
  }
30
- function Y(e, i, r) {
31
- const { width: h, height: l } = i, s = x(e, i), o = z(r), f = w(o, (a) => a.x0), c = p(o, (a) => a.x1), t = F().domain([f, c]).range([0, h]).nice(), m = V(o, l), n = b(0, Math.ceil(Math.log10(c)), 6);
32
- $(s, i, { x: t, y: m }, (a) => a.tickValues(n)), y(s, o, i, { x: t, y: m }), u(s, { x: t, y: m }, i), L(s, l).call(B(t).tickValues(n).tickSize(0)), M(s).call(S(m).tickSize(0)), k(s, i);
28
+ function W(t, i, r) {
29
+ const { width: h, height: l } = i, s = $(t, i), o = z(r), f = w(o, (e) => e.x0), c = p(o, (e) => e.x1), a = F().domain([f, c]).range([0, h]).nice(), m = V(o, l), n = b(0, Math.ceil(Math.log10(c)), 6);
30
+ y(s, i, { x: a, y: m }, (e) => e.tickValues(n)), x(s, o, i, { x: a, y: m }), u(s, { x: a, y: m }, i), L(s, l).call(B(a).tickValues(n).tickSize(0)), M(s).call(S(m).tickSize(0)), k(s, i);
33
31
  }
34
32
  export {
35
- Y as createHistogramFromBins,
36
- Q as createHistogramLinear,
37
- R as createHistogramLog
33
+ W as createHistogramFromBins,
34
+ O as createHistogramLinear,
35
+ P as createHistogramLog
38
36
  };
39
37
  //# sourceMappingURL=histogram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"histogram.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/histogram.ts"],"sourcesContent":["import * as d3 from 'd3';\nimport { createSvgContainer } from './createSvgContainer';\nimport { drawBins } from './drawBins';\nimport { createGridlines } from './createGridlines';\nimport { logspace } from './logspace';\nimport { createLabels } from './createLabels';\nimport type { AnyBin, BinLike, ChartOptions } from './types';\nimport { drawThreshold } from './drawThreshold';\nimport { normalizeBins } from './normalizeBins';\n\nconst gx = (svg: d3.Selection<SVGGElement, unknown, null, undefined>, height: number) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .attr('transform', `translate(0,${height})`);\n};\n\nconst gy = (svg: d3.Selection<SVGGElement, unknown, null, undefined>) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500');\n};\n\nconst createYScale = (bins: BinLike[], height: number) => {\n return d3.scaleLinear()\n .domain([0, d3.max(bins, (d) => d.length)!]) // Max bin count for the domain\n .range([height, 0]); // Map to chart height (invert to match SVG coordinates)\n};\n\nexport function createHistogramLinear(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3.min(data) as number;\n const max = d3.max(data) as number;\n\n const x = d3.scaleLinear()\n .domain([min, max])\n .range([0, width]);\n\n const bins: BinLike[] = normalizeBins(d3.bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(x.ticks(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n createGridlines(svg, options, { x, y }, (x) => x.ticks(6));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(d3.axisBottom(x).tickSize(0));\n\n gy(svg).call(d3.axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramLog(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3.min(data) as number;\n const max = d3.max(data) as number;\n\n const x = d3.scaleSymlog()\n .domain([min, max]) // Input range (min and max values of the data)\n .range([0, width])\n .nice() // Output range (width of the chart)\n ;\n\n const createThresholds = (n: number) => {\n const res = [];\n\n for (let i = 0; i <= n; i++) {\n res.push(Number(x.invert(width * (i / n)).toFixed(2)));\n }\n\n return res;\n };\n\n const bins = normalizeBins(d3.bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(createThresholds(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(d3.axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(d3.axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramFromBins(el: HTMLElement, options: ChartOptions, _bins: AnyBin[]) {\n const { width, height } = options;\n\n const svg = createSvgContainer(el, options);\n\n const bins = normalizeBins(_bins);\n\n const min = d3.min(bins, (b) => b.x0) as number;\n const max = d3.max(bins, (b) => b.x1) as number;\n\n const x = d3.scaleSymlog()\n .domain([min, max])\n .range([0, width])\n .nice();\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(d3.axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(d3.axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n"],"names":["gx","svg","height","gy","createYScale","bins","d3.scaleLinear","d3.max","d","createHistogramLinear","el","options","data","width","nBins","createSvgContainer","min","d3.min","max","x","normalizeBins","d3.bin","y","createGridlines","drawBins","drawThreshold","d3.axisBottom","d3.axisLeft","createLabels","createHistogramLog","d3.scaleSymlog","createThresholds","n","res","i","tickValues","logspace","createHistogramFromBins","_bins","b"],"mappings":"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"}
1
+ {"version":3,"file":"histogram.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/histogram.ts"],"sourcesContent":["import { createSvgContainer } from './createSvgContainer';\nimport { drawBins } from './drawBins';\nimport { createGridlines } from './createGridlines';\nimport { logspace } from './logspace';\nimport { createLabels } from './createLabels';\nimport type { AnyBin, BinLike, ChartOptions } from './types';\nimport { drawThreshold } from './drawThreshold';\nimport { normalizeBins } from './normalizeBins';\nimport type { Selection } from 'd3-selection';\nimport { bin, max as d3max, min as d3min } from 'd3-array';\nimport { scaleLinear, scaleSymlog } from 'd3-scale';\nimport { axisBottom, axisLeft } from 'd3-axis';\n\nconst gx = (svg: Selection<SVGGElement, unknown, null, undefined>, height: number) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .attr('transform', `translate(0,${height})`);\n};\n\nconst gy = (svg: Selection<SVGGElement, unknown, null, undefined>) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500');\n};\n\nconst createYScale = (bins: BinLike[], height: number) => {\n return scaleLinear()\n .domain([0, d3max(bins, (d) => d.length)!]) // Max bin count for the domain\n .range([height, 0]); // Map to chart height (invert to match SVG coordinates)\n};\n\nexport function createHistogramLinear(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3min(data) as number;\n const max = d3max(data) as number;\n\n const x = scaleLinear()\n .domain([min, max])\n .range([0, width]);\n\n const bins: BinLike[] = normalizeBins(bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(x.ticks(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n createGridlines(svg, options, { x, y }, (x) => x.ticks(6));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramLog(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3min(data) as number;\n const max = d3max(data) as number;\n\n const x = scaleSymlog()\n .domain([min, max]) // Input range (min and max values of the data)\n .range([0, width])\n .nice() // Output range (width of the chart)\n ;\n\n const createThresholds = (n: number) => {\n const res = [];\n\n for (let i = 0; i <= n; i++) {\n res.push(Number(x.invert(width * (i / n)).toFixed(2)));\n }\n\n return res;\n };\n\n const bins = normalizeBins(bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(createThresholds(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramFromBins(el: HTMLElement, options: ChartOptions, _bins: AnyBin[]) {\n const { width, height } = options;\n\n const svg = createSvgContainer(el, options);\n\n const bins = normalizeBins(_bins);\n\n const min = d3min(bins, (b) => b.x0) as number;\n const max = d3max(bins, (b) => b.x1) as number;\n\n const x = scaleSymlog()\n .domain([min, max])\n .range([0, width])\n .nice();\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n"],"names":["gx","svg","height","gy","createYScale","bins","scaleLinear","d3max","d","createHistogramLinear","el","options","data","width","nBins","createSvgContainer","min","d3min","max","x","normalizeBins","bin","y","createGridlines","drawBins","drawThreshold","axisBottom","axisLeft","createLabels","createHistogramLog","scaleSymlog","createThresholds","n","res","i","tickValues","logspace","createHistogramFromBins","_bins","b"],"mappings":"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"}