minerva-design 1.18.0 → 1.19.1

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 (92) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/custom-elements.json +10 -6
  3. package/dist/angular/fesm2022/minerva-angular.mjs +157 -60
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +40 -22
  6. package/dist/charts/core.cjs +1 -1
  7. package/dist/charts/core.d.cts +1 -0
  8. package/dist/charts/core.d.ts +1 -0
  9. package/dist/charts/core.js +22 -21
  10. package/dist/charts/engine/chart.cjs +1 -1
  11. package/dist/charts/engine/chart.cjs.map +1 -1
  12. package/dist/charts/engine/chart.js +270 -240
  13. package/dist/charts/engine/chart.js.map +1 -1
  14. package/dist/charts/engine/overlay.cjs +1 -1
  15. package/dist/charts/engine/overlay.cjs.map +1 -1
  16. package/dist/charts/engine/overlay.js +23 -16
  17. package/dist/charts/engine/overlay.js.map +1 -1
  18. package/dist/charts/engine/quadrant-card.cjs +2 -0
  19. package/dist/charts/engine/quadrant-card.cjs.map +1 -0
  20. package/dist/charts/engine/quadrant-card.d.cts +83 -0
  21. package/dist/charts/engine/quadrant-card.d.ts +83 -0
  22. package/dist/charts/engine/quadrant-card.js +154 -0
  23. package/dist/charts/engine/quadrant-card.js.map +1 -0
  24. package/dist/charts/index.cjs +1 -1
  25. package/dist/charts/index.js +28 -27
  26. package/dist/charts/react/charts.cjs +1 -1
  27. package/dist/charts/react/charts.cjs.map +1 -1
  28. package/dist/charts/react/charts.js +378 -463
  29. package/dist/charts/react/charts.js.map +1 -1
  30. package/dist/core/contracts.cjs +1 -1
  31. package/dist/core/contracts.cjs.map +1 -1
  32. package/dist/core/contracts.js +1 -1
  33. package/dist/core/contracts.js.map +1 -1
  34. package/dist/core/decimal-places.d.cts +6 -0
  35. package/dist/core/decimal-places.d.ts +6 -0
  36. package/dist/core/index.cjs +21 -21
  37. package/dist/core/index.cjs.map +1 -1
  38. package/dist/core/index.js +590 -580
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/keyboard-navigation.d.cts +14 -0
  41. package/dist/core/keyboard-navigation.d.ts +14 -0
  42. package/dist/core/number-input.d.cts +4 -1
  43. package/dist/core/number-input.d.ts +4 -1
  44. package/dist/core/slider.d.cts +1 -1
  45. package/dist/core/slider.d.ts +1 -1
  46. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  47. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  48. package/dist/native/charts/src/engine/overlay.js +23 -16
  49. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  50. package/dist/react/components/AutoComplete/AutoComplete.cjs +1 -1
  51. package/dist/react/components/AutoComplete/AutoComplete.cjs.map +1 -1
  52. package/dist/react/components/AutoComplete/AutoComplete.js +91 -90
  53. package/dist/react/components/AutoComplete/AutoComplete.js.map +1 -1
  54. package/dist/react/components/DatePicker/DatePicker.cjs +1 -1
  55. package/dist/react/components/DatePicker/DatePicker.cjs.map +1 -1
  56. package/dist/react/components/DatePicker/DatePicker.js +3 -2
  57. package/dist/react/components/DatePicker/DatePicker.js.map +1 -1
  58. package/dist/taro/index.js +23 -16
  59. package/dist/uni/manifest.d.ts +34 -34
  60. package/dist/uni/manifest.js +34 -39
  61. package/dist/vue/components/AutoComplete/AutoComplete.vue.js.map +1 -1
  62. package/dist/vue/components/AutoComplete/AutoComplete.vue_vue_type_script_setup_true_lang.js +58 -57
  63. package/dist/vue/components/AutoComplete/AutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/vue/components/Chart/QuadrantChart.vue.d.ts +4 -3
  65. package/dist/vue/components/Chart/QuadrantChart.vue.js.map +1 -1
  66. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js +186 -142
  67. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/vue/components/Chart/cartesian.d.ts +5 -1
  69. package/dist/vue/components/Chart/cartesian.js +2 -0
  70. package/dist/vue/components/Chart/cartesian.js.map +1 -1
  71. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue.js.map +1 -1
  72. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js +4 -4
  73. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/weapp/charts/canvas.js +13 -4
  75. package/dist/weapp/controls.js +24 -12
  76. package/dist/web-components/cdn/minerva.js +532 -532
  77. package/dist/web-components/cdn/minerva.js.map +1 -1
  78. package/dist/web-components/components/autocomplete/autocomplete.d.ts +7 -1
  79. package/dist/web-components/components/autocomplete/autocomplete.js +29 -24
  80. package/dist/web-components/components/autocomplete/autocomplete.js.map +1 -1
  81. package/dist/web-components/components/chart/chart.d.ts +4 -1
  82. package/dist/web-components/components/chart/chart.js +3 -1
  83. package/dist/web-components/components/chart/chart.js.map +1 -1
  84. package/dist/web-components/components/chart/charts.d.ts +34 -14
  85. package/dist/web-components/components/chart/charts.js +145 -98
  86. package/dist/web-components/components/chart/charts.js.map +1 -1
  87. package/dist/web-components/components/date-picker/date-picker.js +11 -5
  88. package/dist/web-components/components/date-picker/date-picker.js.map +1 -1
  89. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.d.ts +8 -8
  90. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js +9 -5
  91. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js.map +1 -1
  92. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # minerva-design
2
2
 
3
+ ## 1.19.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 220d212: Fix five input bugs, on every renderer that has the component.
8
+
9
+ - NumberInput (#5): when `precision` is not set, it now keeps every decimal of `step`. `step={1.25}` steps to 1.25 instead of 1, and `step={0.0000001}` now steps instead of staying at 0.
10
+ - Slider (#9): a step written in scientific notation keeps the decimals of its coefficient. With `step={1.5e-7}`, one key press moves by 1.5e-7 instead of 1e-7, and snapping keeps valid ticks unchanged.
11
+ - AutoComplete (#6): while `loading` hides the options, the arrow keys and Enter no longer pick a hidden old option, and `aria-activedescendant` no longer points to an option that is not shown.
12
+ - AutoComplete (#7): the keyboard highlight now follows the option, not its position. When the options change, the highlight stays on the same option. If that option is gone or disabled, `autoHighlight` moves to the first enabled option, and otherwise nothing is highlighted, so Enter always picks a shown option.
13
+ - DatePicker (#8): in a month partly cut by `minDate` / `maxDate`, the day grid always keeps one enabled day that Tab can reach.
14
+
15
+ ## 1.19.0
16
+
17
+ ### Minor Changes
18
+
19
+ - 734afb1: Quadrant charts: one shared point card on every renderer, and no Playwright.
20
+
21
+ - Fix: after a click, the card of the clicked point no longer stays on the chart and hides the others. A plain chart rings its selected point; only boards (with point actions) keep the card of the selected point. Escape closes the card, and a click beside the points drops a selection the chart made itself.
22
+ - The hovered point is kept while the parent passes new arrays of the same points, and through new data under a still pointer (e.g. the selection ring added by a click).
23
+ - Faster hover: the card is DOM of its own, so hovering renders no React, Vue or Angular component, and showing or hiding a drawn label redraws only the foreground canvas.
24
+ - New in `minerva-design/charts/core`: `createQuadrantPointCard`, `withQuadrantCard` and `QUADRANT_CARD_LINGER_MS`. Vue, Web Components and Angular quadrant charts now show the same card as React (no engine tooltip), with the point actions inside it; `<minerva-quadrant-chart>` adds the `point-card` part.
25
+ - Crowded cells: a label also tries beside its dot half a line up or down before it is skipped.
26
+ - Tests: the browser suites are replaced by Vitest tests with happy-dom.
27
+
3
28
  ## 1.18.0
4
29
 
5
30
  ### Minor Changes
@@ -7635,7 +7635,7 @@
7635
7635
  },
7636
7636
  {
7637
7637
  "kind": "class",
7638
- "description": "Four-quadrant matrix (priority matrix, Eisenhower, BCG...) of\n`minerva-design/charts/core` (the `<QuadrantChart>` of React): tinted\nquadrants with titles, dividers and labelled dots placed without\noverlapping labels. With `drag-points`, dots can be dragged to another\nquadrant (`minerva-point-drop`; update `points` to move them).\n\nA visually hidden list of the dots per quadrant lets screen readers and\nkeyboards reach every dot: arrows move between them, Enter clicks\n(`minerva-point-click`) and, with `drag-points`, Shift + arrows move the\nfocused dot to the neighbouring quadrant (`minerva-point-drop`, announced\nin a live region). The focused dot is drawn with a focus ring and\nreported by `minerva-hover`.\n\nSlotted content is placed over the plot: a header per quadrant (in its\nouter corner, replacing the drawn title, badge, description and count)\nand actions next to the active dot (hovered, keyboard-focused, else\n`selected-index`; read it from `activeIndex`). Both receive pointer\nevents; the rest of the plot stays interactive.\n\nPublished as the optional entry `minerva-design/web-components/chart`.",
7638
+ "description": "Four-quadrant matrix (priority matrix, Eisenhower, BCG...) of\n`minerva-design/charts/core` (the `<QuadrantChart>` of React): tinted\nquadrants with titles, dividers and labelled dots placed without\noverlapping labels. With `drag-points`, dots can be dragged to another\nquadrant (`minerva-point-drop`; update `points` to move them).\n\nA visually hidden list of the dots per quadrant lets screen readers and\nkeyboards reach every dot: arrows move between them, Enter clicks\n(`minerva-point-click`) and, with `drag-points`, Shift + arrows move the\nfocused dot to the neighbouring quadrant (`minerva-point-drop`, announced\nin a live region). The focused dot is drawn with a focus ring and\nreported by `minerva-hover`.\n\nOne glass point card names the hovered, keyboard-focused or dragged dot\n(its name and quadrant) in place of the engine tooltip; with slotted\n`point-actions`, the card also shows them and stays on the\n`selected-index` dot (read the dot they act on from `activeIndex`).\n\nSlotted content is placed over the plot: a header per quadrant (in its\nouter corner, replacing the drawn title, badge, description and count)\nand the actions in the point card. Both receive pointer events; the rest\nof the plot stays interactive.\n\nPublished as the optional entry `minerva-design/web-components/chart`.",
7639
7639
  "name": "MinervaQuadrantChart",
7640
7640
  "cssParts": [
7641
7641
  {
@@ -7647,7 +7647,7 @@
7647
7647
  "name": "surface"
7648
7648
  },
7649
7649
  {
7650
- "description": "The box over the plot holding the slotted headers and actions",
7650
+ "description": "The box over the plot holding the slotted headers and the point card",
7651
7651
  "name": "overlay"
7652
7652
  },
7653
7653
  {
@@ -7655,7 +7655,11 @@
7655
7655
  "name": "quadrant-header"
7656
7656
  },
7657
7657
  {
7658
- "description": "The zero-size box at the active dot holding the `point-actions` slot",
7658
+ "description": "The glass card of the hovered, focused, dragged (or, with actions, selected) dot",
7659
+ "name": "point-card"
7660
+ },
7661
+ {
7662
+ "description": "The actions box in the point card, holding the `point-actions` slot",
7659
7663
  "name": "point-actions"
7660
7664
  }
7661
7665
  ],
@@ -7677,7 +7681,7 @@
7677
7681
  "name": "quadrant-header-bottom-right"
7678
7682
  },
7679
7683
  {
7680
- "description": "Content shown at the active dot (e.g. edit / delete buttons), positioned by the slotted element",
7684
+ "description": "Actions shown in the point card of the active dot, beside its name (e.g. compact edit / delete buttons); the card then also stays on the selected dot",
7681
7685
  "name": "point-actions"
7682
7686
  }
7683
7687
  ],
@@ -7859,7 +7863,7 @@
7859
7863
  "type": {
7860
7864
  "text": "number | null"
7861
7865
  },
7862
- "description": "Index of the active dot, the one showing the `point-actions` slot: the\nhovered dot, else the keyboard-focused one, else `selectedIndex`\n(`null`: none)",
7866
+ "description": "Index of the active dot, the one whose point card shows the\n`point-actions` slot (hovered, keyboard-focused, else `selectedIndex`\nwhen actions are slotted); `null` while no card is shown or during a\ndrag",
7863
7867
  "readonly": true
7864
7868
  },
7865
7869
  {
@@ -31186,7 +31190,7 @@
31186
31190
  "declarations": [
31187
31191
  {
31188
31192
  "kind": "class",
31189
- "description": "Task board on a four-quadrant matrix (`<QuadrantTaskBoard>` of React),\nbuilt on `<minerva-quadrant-chart>`: each quadrant header shows its\ntitle, the number of tasks and an add button; the active task (hovered,\nkeyboard-focused or selected) shows edit and delete buttons; an inline\npanel, anchored inside the board at the button or the task, names a task\nand picks its quadrant, or confirms a delete (Escape or a press outside\ncloses it). Tasks can be dragged to another quadrant, or moved with\nShift + arrows once focused; a double click edits a task, a click on an\nempty area adds one there.\n\nControlled, like `<minerva-dashboard-columns>`: the board never changes its\nown `points`. It fires `minerva-points-change` with the next list after\nan add, an edit, a delete, a drag and drop or a keyboard move; set it\nback as `points` to apply it (or keep the old list to refuse it).\n\nTexts are localized (the `locale` attribute, else the library language)\nand can be overridden with `labels`. The host's `aria-label` names the\nchart.\n\nPublished as the optional entry\n`minerva-design/web-components/quadrant-task-board` (it loads the chart\nengine, minerva-design/charts/core).",
31193
+ "description": "Task board on a four-quadrant matrix (`<QuadrantTaskBoard>` of React),\nbuilt on `<minerva-quadrant-chart>`: each quadrant header shows its\ntitle, the number of tasks and an add button; the point card of the\nactive task (hovered, keyboard-focused or selected) shows edit and delete\nbuttons beside its name; an inline panel, anchored inside the board at\nthe button or the task, names a task and picks its quadrant, or confirms\na delete (Escape or a press outside closes it). Tasks can be dragged to\nanother quadrant, or moved with Shift + arrows once focused; a double\nclick edits a task, a click on an empty area adds one there.\n\nControlled, like `<minerva-dashboard-columns>`: the board never changes its\nown `points`. It fires `minerva-points-change` with the next list after\nan add, an edit, a delete, a drag and drop or a keyboard move; set it\nback as `points` to apply it (or keep the old list to refuse it).\n\nTexts are localized (the `locale` attribute, else the library language)\nand can be overridden with `labels`. The host's `aria-label` names the\nchart.\n\nPublished as the optional entry\n`minerva-design/web-components/quadrant-task-board` (it loads the chart\nengine, minerva-design/charts/core).",
31190
31194
  "name": "MinervaQuadrantTaskBoard",
31191
31195
  "cssParts": [
31192
31196
  {
@@ -1,11 +1,11 @@
1
1
  import { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
2
2
  import * as i0 from "@angular/core";
3
3
  import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, Injectable, InjectionToken, Injector, PLATFORM_ID, SecurityContext, TemplateRef, ViewContainerRef, ViewEncapsulation, afterEveryRender, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
4
- import { CODE_MARK_COLORS, DEFAULT_LANGUAGE, DEFAULT_PLAYBACK_RATES, DEFAULT_SKIP_SECONDS, DEFAULT_TAG_SEPARATORS, MEDIA_ICON_PATHS, PALETTES, RATING_STAR_COUNT, addDays, answerSheetLegend, answerSheetMoveIndex, answerSheetSections, answerSheetSummary, applyCodeMarks, bufferedEnd, captionsPreference, clampMediaTime, clampNumber, clampVolume, closestSliderThumb, cn, codeLanguageLabel, codeMarkBackground, createCheckboxMachine, createRatingMachine, createSwitchMachine, createTypeahead, dashboardAccent, dashboardCount, dashboardLength, dayKey, designAttributes, detectCodeLanguage, findCascaderPath, flattenCascaderOptions, formatDevMessage, formatHasSeconds, formatMediaTime, formatNumberValue, formatPlaybackRate, formatTime, getNextIndex, getPageRange, getRatingKeyValue, getRatingStarFills, getSliderKeyValue, getSliderMarks, getVirtualRange, highlightCode, inferMediaType, inferStepPrecision, invalidPrimaryColorMessage, isPalette, isSliderMarkActive, isSupportedLanguage, localDate, matchesAccept, mediaKeyAction, mediaProgress, messages, monthStart, nextPlaybackRate, normalizeSliderValue, palettes, parseDayKey, parseNumberDraft, parseTimeInput, pickCaptionsTrack, presetPalette, readCaptionsPreference, resolveDesign, resolvePrimaryColor, resolveSize, resolveSpace, resolveTimeFormat, sameMonth, setSliderThumb, sliderPercent, sliderValueFromRatio, sliderValues, sliderValuesEqual, splitBySeparators, splitCodeMarkLines, startOfToday, toggledCaptionsTrack, translate, weekStart, writeCaptionsPreference } from "../../core/index.js";
4
+ import { CODE_MARK_COLORS, DEFAULT_LANGUAGE, DEFAULT_PLAYBACK_RATES, DEFAULT_SKIP_SECONDS, DEFAULT_TAG_SEPARATORS, MEDIA_ICON_PATHS, PALETTES, RATING_STAR_COUNT, addDays, answerSheetLegend, answerSheetMoveIndex, answerSheetSections, answerSheetSummary, applyCodeMarks, bufferedEnd, captionsPreference, clampMediaTime, clampNumber, clampVolume, closestSliderThumb, cn, codeLanguageLabel, codeMarkBackground, createCheckboxMachine, createRatingMachine, createSwitchMachine, createTypeahead, dashboardAccent, dashboardCount, dashboardLength, dayKey, designAttributes, detectCodeLanguage, findCascaderPath, flattenCascaderOptions, formatDevMessage, formatHasSeconds, formatMediaTime, formatNumberValue, formatPlaybackRate, formatTime, getNextIndex, getPageRange, getRatingKeyValue, getRatingStarFills, getSliderKeyValue, getSliderMarks, getVirtualRange, highlightCode, inferMediaType, inferStepPrecision, invalidPrimaryColorMessage, isPalette, isSliderMarkActive, isSupportedLanguage, localDate, matchesAccept, mediaKeyAction, mediaProgress, messages, monthStart, nextPlaybackRate, normalizeSliderValue, palettes, parseDayKey, parseNumberDraft, parseTimeInput, pickCaptionsTrack, presetPalette, readCaptionsPreference, resolveActiveOptionIndex, resolveDesign, resolvePrimaryColor, resolveSize, resolveSpace, resolveTimeFormat, sameMonth, setSliderThumb, sliderPercent, sliderValueFromRatio, sliderValues, sliderValuesEqual, splitBySeparators, splitCodeMarkLines, startOfToday, toggledCaptionsTrack, translate, weekStart, writeCaptionsPreference } from "../../core/index.js";
5
5
  import { FOCUS_SCOPE_UNMOUNT_EVENT, PALETTE_COOKIE_NAME, THEME_COOKIE_NAME, applyDesignAttributes, applyPosition, autoPosition, bindMediaCaptions, centerInScroller, clickedCodeMark, createDashboardDrag, createDismissableLayer, createFocusScope, dashboardDataAdapter, focusElement, generateCSSVariables, getCodeSelectionRange, getDirection, getSystemTheme, getTabbables, hideOthers, isBilingualTheme, isInteractiveEventTarget, lockScroll, logicalArrowKey, nearestInRow, parsePaletteCookie, parsePlacement, parseThemeCookie, primaryColorCss, primaryColorTheme, readCookieValue, resolveTheme, serializeThemeCookie, waitForExitAnimation } from "../../dom/index.js";
6
6
  import { FormGroupDirective, NG_VALUE_ACCESSOR, NgControl, NgForm } from "@angular/forms";
7
7
  import { DomSanitizer } from "@angular/platform-browser";
8
- import { QUADRANT_CORNERS, QUADRANT_TASK_ICONS, applyQuadrantTaskDraft, boxplotData, bubbleSeries, canSaveQuadrantTask, createChart, createChart3D, createDepthChart, createGraphChart, createOrderBook, createOrderBookHeatmap, createQuadrantPointLayer, createShapeChart, createTimeAndSales, createTradingChart, editQuadrantTaskDraft, ganttSeries, heatmapChartOptions, histogramSeries, moveQuadrantTask, newQuadrantTaskDraft, placeQuadrantTaskPanel, quadrantChartOptions, quadrantCountText, quadrantGroups, quadrantLabels, quadrantOf, quadrantTaskColor, quadrantTaskDeleteText, quadrantTaskLabels, removeQuadrantTask, selectionAfterRemove, sparklineOptions, waterfallSeries } from "../../charts/core.js";
8
+ import { QUADRANT_CORNERS, QUADRANT_TASK_ICONS, applyQuadrantTaskDraft, boxplotData, bubbleSeries, canSaveQuadrantTask, createChart, createChart3D, createDepthChart, createGraphChart, createOrderBook, createOrderBookHeatmap, createQuadrantPointCard, createQuadrantPointLayer, createShapeChart, createTimeAndSales, createTradingChart, editQuadrantTaskDraft, ganttSeries, heatmapChartOptions, histogramSeries, moveQuadrantTask, newQuadrantTaskDraft, placeQuadrantTaskPanel, quadrantChartOptions, quadrantCountText, quadrantGroups, quadrantLabels, quadrantOf, quadrantTaskColor, quadrantTaskDeleteText, quadrantTaskLabels, removeQuadrantTask, selectionAfterRemove, sparklineOptions, waterfallSeries, withQuadrantCard } from "../../charts/core.js";
9
9
  import { createIconCanvas, getIcon } from "../../icons/core.js";
10
10
  const injectIsBrowser = () => isPlatformBrowser(inject(PLATFORM_ID));
11
11
  const staticInputs = (config = {}) => ({
@@ -5985,7 +5985,7 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
5985
5985
  this.blocked = computed(() => this.isDisabled() || this.field.readOnly(), ...ngDevMode ? [{ debugName: "blocked" }] : /* istanbul ignore next */ []);
5986
5986
  this.shown = computed(() => this.open() && !this.blocked(), ...ngDevMode ? [{ debugName: "shown" }] : /* istanbul ignore next */ []);
5987
5987
  this.text = computed(() => this.value() ?? this.defaultValue() ?? "", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
5988
- this.focusedIndex = signal(-1, ...ngDevMode ? [{ debugName: "focusedIndex" }] : /* istanbul ignore next */ []);
5988
+ this.focusedValue = signal(null, ...ngDevMode ? [{ debugName: "focusedValue" }] : /* istanbul ignore next */ []);
5989
5989
  this.hoveredIndex = signal(-1, ...ngDevMode ? [{ debugName: "hoveredIndex" }] : /* istanbul ignore next */ []);
5990
5990
  this.composing = false;
5991
5991
  this.layerEscape = null;
@@ -6039,12 +6039,8 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6039
6039
  }));
6040
6040
  }, ...ngDevMode ? [{ debugName: "sections" }] : /* istanbul ignore next */ []);
6041
6041
  this.navigable = computed(() => this.sections().flatMap((section) => section.entries.map((entry) => entry.option)), ...ngDevMode ? [{ debugName: "navigable" }] : /* istanbul ignore next */ []);
6042
- this.activeIndex = computed(() => {
6043
- const focused = this.focusedIndex();
6044
- if (focused >= 0) return focused;
6045
- if (this.autoHighlight() && this.shown()) return this.navigable().findIndex((option) => !option.disabled);
6046
- return -1;
6047
- }, ...ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []);
6042
+ this.interactive = computed(() => this.loading() ? [] : this.navigable(), ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
6043
+ this.activeIndex = computed(() => resolveActiveOptionIndex(this.interactive(), this.focusedValue(), this.autoHighlight() && this.shown()), ...ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []);
6048
6044
  this.activeOptionId = computed(() => this.shown() && this.activeIndex() >= 0 ? this.optionId(this.activeIndex()) : null, ...ngDevMode ? [{ debugName: "activeOptionId" }] : /* istanbul ignore next */ []);
6049
6045
  this.escapeConsumer = computed(() => !this.shown() && this.text() !== "", ...ngDevMode ? [{ debugName: "escapeConsumer" }] : /* istanbul ignore next */ []);
6050
6046
  this.showClear = computed(() => this.clearable() && this.text() !== "" && !this.isDisabled() && !this.field.readOnly(), ...ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []);
@@ -6140,10 +6136,10 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6140
6136
  }
6141
6137
  closeDropdown() {
6142
6138
  this.setOpen(false);
6143
- this.focusedIndex.set(-1);
6139
+ this.focusedValue.set(null);
6144
6140
  }
6145
6141
  moveFocus(step) {
6146
- const options = this.navigable();
6142
+ const options = this.interactive();
6147
6143
  const count = options.length;
6148
6144
  if (count === 0) return;
6149
6145
  const active = this.activeIndex();
@@ -6151,7 +6147,7 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6151
6147
  for (let i = 0; i < count; i += 1) {
6152
6148
  index = (index + step + count) % count;
6153
6149
  if (!options[index].disabled) {
6154
- this.focusedIndex.set(index);
6150
+ this.focusedValue.set(options[index].value);
6155
6151
  return;
6156
6152
  }
6157
6153
  }
@@ -6164,7 +6160,7 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6164
6160
  }
6165
6161
  onInput(next) {
6166
6162
  this.setText(next);
6167
- this.focusedIndex.set(-1);
6163
+ this.focusedValue.set(null);
6168
6164
  this.openDropdown();
6169
6165
  }
6170
6166
  onBlur(event) {
@@ -6186,7 +6182,7 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6186
6182
  this.moveFocus(event.key === "ArrowDown" ? 1 : -1);
6187
6183
  break;
6188
6184
  case "Enter": {
6189
- const option = this.shown() ? this.navigable()[this.activeIndex()] : void 0;
6185
+ const option = this.shown() ? this.interactive()[this.activeIndex()] : void 0;
6190
6186
  const text = this.text().trim();
6191
6187
  if (option) {
6192
6188
  event.preventDefault();
@@ -6201,7 +6197,7 @@ var MnAutoComplete = class MnAutoComplete extends MnFormValueControl {
6201
6197
  case "Escape": if (event !== this.layerEscape && !this.shown() && this.text() !== "") {
6202
6198
  event.preventDefault();
6203
6199
  this.setText("");
6204
- this.focusedIndex.set(-1);
6200
+ this.focusedValue.set(null);
6205
6201
  }
6206
6202
  }
6207
6203
  }
@@ -39634,15 +39630,22 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39634
39630
  this.pointDrop = output();
39635
39631
  this.lastClick = null;
39636
39632
  this.focusedIndex = signal(null, ...ngDevMode ? [{ debugName: "focusedIndex" }] : /* istanbul ignore next */ []);
39637
- this.hoveredIndex = signal(null, ...ngDevMode ? [{ debugName: "hoveredIndex" }] : /* istanbul ignore next */ []);
39638
39633
  this.plot = signal(null, ...ngDevMode ? [{ debugName: "plot" }] : /* istanbul ignore next */ []);
39639
39634
  this.pointsHost = viewChild.required("points", ...ngDevMode ? [{ debugName: "pointsHost" }] : /* istanbul ignore next */ []);
39635
+ this.cardHost = viewChild("cardHost", ...ngDevMode ? [{ debugName: "cardHost" }] : /* istanbul ignore next */ []);
39636
+ this.viewContainer = inject(ViewContainerRef);
39637
+ this.card = null;
39638
+ this.actionsView = null;
39640
39639
  this.destroyed = false;
39641
39640
  this.overlayStyle = computed(() => {
39642
39641
  const rect = this.plot();
39643
- if (!rect || !(this.quadrantHeader() || this.pointActions())) return null;
39642
+ if (!rect) return null;
39644
39643
  return `position:absolute;left:${rect.x}px;top:${rect.y}px;width:${rect.width}px;height:${rect.height}px;pointer-events:none`;
39645
39644
  }, ...ngDevMode ? [{ debugName: "overlayStyle" }] : /* istanbul ignore next */ []);
39645
+ this.cardHostStyle = computed(() => {
39646
+ const rect = this.plot();
39647
+ return `position:absolute;left:0;top:0;width:${rect?.width ?? 0}px;height:${rect?.height ?? 0}px;pointer-events:none`;
39648
+ }, ...ngDevMode ? [{ debugName: "cardHostStyle" }] : /* istanbul ignore next */ []);
39646
39649
  this.headers = computed(() => {
39647
39650
  const rect = this.plot() ?? {
39648
39651
  width: 0,
@@ -39679,20 +39682,6 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39679
39682
  };
39680
39683
  });
39681
39684
  }, ...ngDevMode ? [{ debugName: "headers" }] : /* istanbul ignore next */ []);
39682
- this.activePoint = computed(() => {
39683
- const index = this.hoveredIndex() ?? this.focusedIndex() ?? this.selectedIndex() ?? null;
39684
- const point = index === null ? void 0 : this.points()[index];
39685
- if (index === null || !point || !Number.isFinite(point.x) || !Number.isFinite(point.y)) return [];
39686
- const at = this.visual(point.x, point.y);
39687
- return [{
39688
- context: {
39689
- $implicit: point,
39690
- point,
39691
- index
39692
- },
39693
- style: `position:absolute;left:${100 * at.x}%;top:${100 * at.y}%;width:0;height:0;pointer-events:none`
39694
- }];
39695
- }, ...ngDevMode ? [{ debugName: "activePoint" }] : /* istanbul ignore next */ []);
39696
39685
  const injector = inject(Injector);
39697
39686
  let layer = null;
39698
39687
  afterNextRender(() => {
@@ -39709,12 +39698,91 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39709
39698
  });
39710
39699
  }, { injector });
39711
39700
  });
39701
+ let cardHost = null;
39702
+ afterRenderEffect(() => {
39703
+ const host = this.cardHost()?.nativeElement ?? null;
39704
+ const options = this.cardOptions(this.instance());
39705
+ const focused = this.accessiblePoints() ? this.focusedIndex() : null;
39706
+ this.plot();
39707
+ untracked(() => {
39708
+ if (this.card && cardHost !== host) this.destroyCard();
39709
+ if (!host || !options.chart) return;
39710
+ if (this.card) this.card.update(options);
39711
+ else {
39712
+ cardHost = host;
39713
+ this.card = createQuadrantPointCard(host, options);
39714
+ }
39715
+ this.card.focus(focused);
39716
+ this.renderActions(this.card.index);
39717
+ });
39718
+ });
39712
39719
  inject(DestroyRef).onDestroy(() => {
39713
39720
  this.destroyed = true;
39714
39721
  layer?.destroy();
39715
39722
  layer = null;
39723
+ this.destroyCard();
39716
39724
  });
39717
39725
  }
39726
+ cardOptions(chart) {
39727
+ const actions = !!this.pointActions();
39728
+ return {
39729
+ config: {
39730
+ ...this.geometry(),
39731
+ points: this.points(),
39732
+ quadrants: this.quadrants(),
39733
+ xLabel: this.xLabel(),
39734
+ yLabel: this.yLabel(),
39735
+ name: this.name()
39736
+ },
39737
+ locale: this.locale(),
39738
+ pointSize: this.pointSize(),
39739
+ hover: this.tooltip() !== false,
39740
+ selectedIndex: this.selectedIndex(),
39741
+ showSelected: actions,
39742
+ hasActions: () => actions,
39743
+ chart,
39744
+ onClick: (index) => this.clickPoint(index),
39745
+ onChange: (index) => this.renderActions(index)
39746
+ };
39747
+ }
39748
+ renderActions(index) {
39749
+ const card = this.card;
39750
+ if (!card) return;
39751
+ const tpl = untracked(this.pointActions);
39752
+ const point = index === null ? void 0 : untracked(this.points)[index];
39753
+ const current = this.actionsView;
39754
+ if (current && (!point || current.tpl !== tpl || current.ref.context.index !== index)) {
39755
+ if (!current.ref.destroyed) current.ref.destroy();
39756
+ this.actionsView = null;
39757
+ }
39758
+ if (!tpl || !point || index === null) return;
39759
+ let ref = this.actionsView?.ref;
39760
+ if (ref) {
39761
+ if (ref.context.point === point) return;
39762
+ ref.context.$implicit = point;
39763
+ ref.context.point = point;
39764
+ } else {
39765
+ ref = this.viewContainer.createEmbeddedView(tpl, {
39766
+ $implicit: point,
39767
+ point,
39768
+ index
39769
+ });
39770
+ card.actions.append(...ref.rootNodes);
39771
+ this.actionsView = {
39772
+ tpl,
39773
+ ref
39774
+ };
39775
+ }
39776
+ ref.detectChanges();
39777
+ card.place();
39778
+ }
39779
+ destroyCard() {
39780
+ const view = this.actionsView?.ref;
39781
+ if (view && !view.destroyed) view.destroy();
39782
+ this.actionsView = null;
39783
+ this.card?.destroy();
39784
+ this.card = null;
39785
+ }
39718
39786
  layerOptions() {
39719
39787
  const selectedIndex = this.selectedIndex();
39720
39788
  return {
@@ -39732,6 +39800,7 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39732
39800
  onFocusChange: (index, hover) => {
39733
39801
  if (this.destroyed) return;
39734
39802
  this.focusedIndex.set(index);
39803
+ this.card?.focus(index);
39735
39804
  this.hover.emit(hover);
39736
39805
  },
39737
39806
  onClick: (index) => {
@@ -39762,7 +39831,7 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39762
39831
  }
39763
39832
  engineOptions() {
39764
39833
  const headers = !!this.quadrantHeader();
39765
- const options = quadrantChartOptions({
39834
+ const options = withQuadrantCard(quadrantChartOptions({
39766
39835
  ...this.geometry(),
39767
39836
  points: this.points(),
39768
39837
  quadrants: this.quadrants(),
@@ -39777,7 +39846,7 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39777
39846
  showCounts: headers ? void 0 : this.showCounts(),
39778
39847
  selectedIndex: this.selectedIndex(),
39779
39848
  selectedIndices: this.selectedIndices()
39780
- }, this.commonOptions(), { focusedIndex: this.accessiblePoints() ? this.focusedIndex() : null });
39849
+ }, this.commonOptions(), { focusedIndex: this.accessiblePoints() ? this.focusedIndex() : null }));
39781
39850
  if (headers) options.annotations = options.annotations?.map((a, i) => i < 4 && a.type === "rect" ? {
39782
39851
  ...a,
39783
39852
  label: void 0,
@@ -39790,14 +39859,22 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39790
39859
  bindEngine(chart) {
39791
39860
  return [
39792
39861
  ...super.bindEngine(chart),
39793
- chart.on("hover", (event) => this.hoveredIndex.set(event?.items?.[0]?.index ?? null)),
39794
- chart.on("layout", (rect) => this.plot.set({ ...rect }))
39862
+ chart.on("hover", (event) => this.card?.hover(event?.items?.[0]?.index ?? null)),
39863
+ chart.on("layout", (rect) => this.plot.set({ ...rect })),
39864
+ chart.on("dragStart", (event) => this.card?.drag(event.item.index, {
39865
+ x: event.x,
39866
+ y: event.y
39867
+ })),
39868
+ chart.on("dragEnd", () => this.card?.drag(null))
39795
39869
  ];
39796
39870
  }
39797
39871
  clicked(event) {
39798
39872
  const index = event.items[0]?.index;
39799
- const point = index === void 0 ? void 0 : this.points()[index];
39800
- if (!point || index === void 0) return;
39873
+ if (index !== void 0) this.clickPoint(index);
39874
+ }
39875
+ clickPoint(index) {
39876
+ const point = this.points()[index];
39877
+ if (!point) return;
39801
39878
  const now = Date.now();
39802
39879
  const last = this.lastClick;
39803
39880
  const double = last?.index === index && now - last.time < DOUBLE_CLICK_MS;
@@ -39834,6 +39911,10 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
39834
39911
  };
39835
39912
  }
39836
39913
  dragged(event) {
39914
+ this.card?.move({
39915
+ x: event.x,
39916
+ y: event.y
39917
+ });
39837
39918
  const target = this.dropAt(event);
39838
39919
  if (target) this.pointDrag.emit(target);
39839
39920
  }
@@ -40020,10 +40101,16 @@ var MnQuadrantChart = class MnQuadrantChart extends MnCartesianChartBase {
40020
40101
  predicate: ["points"],
40021
40102
  descendants: true,
40022
40103
  isSignal: true
40104
+ }, {
40105
+ propertyName: "cardHost",
40106
+ first: true,
40107
+ predicate: ["cardHost"],
40108
+ descendants: true,
40109
+ isSignal: true
40023
40110
  }],
40024
40111
  usesInheritance: true,
40025
40112
  ngImport: i0,
40026
- template: "<div #surface style=\"position:absolute;inset:0\"></div>\n @if (overlayStyle(); as style) {\n <div class=\"minerva-chart-overlay\" [style]=\"style\">\n @if (quadrantHeader(); as tpl) {\n @for (header of headers(); track header.corner) {\n <div [style]=\"header.box\">\n <div\n [class]=\"\n 'minerva-chart-quadrant-header minerva-chart-quadrant-header-' +\n header.corner\n \"\n [style]=\"header.style\"\n >\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"header.context\"\n />\n </div>\n </div>\n }\n }\n @if (pointActions(); as tpl) {\n @for (active of activePoint(); track active.context.index) {\n <div\n class=\"minerva-chart-quadrant-point\"\n [attr.data-point-index]=\"active.context.index\"\n [attr.data-label]=\"active.context.point.label ?? null\"\n [style]=\"active.style\"\n >\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"active.context\"\n />\n </div>\n }\n }\n </div>\n }\n <div #points style=\"display:contents\"></div>",
40113
+ template: "<div #surface style=\"position:absolute;inset:0\"></div>\n @if (overlayStyle(); as style) {\n <div class=\"minerva-chart-overlay\" [style]=\"style\">\n @if (quadrantHeader(); as tpl) {\n @for (header of headers(); track header.corner) {\n <div [style]=\"header.box\">\n <div\n [class]=\"\n 'minerva-chart-quadrant-header minerva-chart-quadrant-header-' +\n header.corner\n \"\n [style]=\"header.style\"\n >\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"header.context\"\n />\n </div>\n </div>\n }\n }\n <div #cardHost [style]=\"cardHostStyle()\"></div>\n </div>\n }\n <div #points style=\"display:contents\"></div>",
40027
40114
  isInline: true,
40028
40115
  dependencies: [{
40029
40116
  kind: "directive",
@@ -40071,21 +40158,7 @@ i0.ɵɵngDeclareClassMetadata({
40071
40158
  </div>
40072
40159
  }
40073
40160
  }
40074
- @if (pointActions(); as tpl) {
40075
- @for (active of activePoint(); track active.context.index) {
40076
- <div
40077
- class="minerva-chart-quadrant-point"
40078
- [attr.data-point-index]="active.context.index"
40079
- [attr.data-label]="active.context.point.label ?? null"
40080
- [style]="active.style"
40081
- >
40082
- <ng-container
40083
- [ngTemplateOutlet]="tpl"
40084
- [ngTemplateOutletContext]="active.context"
40085
- />
40086
- </div>
40087
- }
40088
- }
40161
+ <div #cardHost [style]="cardHostStyle()"></div>
40089
40162
  </div>
40090
40163
  }
40091
40164
  <div #points style="display:contents"></div>`
@@ -40284,6 +40357,10 @@ i0.ɵɵngDeclareClassMetadata({
40284
40357
  pointsHost: [{
40285
40358
  type: i0.ViewChild,
40286
40359
  args: ["points", { isSignal: true }]
40360
+ }],
40361
+ cardHost: [{
40362
+ type: i0.ViewChild,
40363
+ args: ["cardHost", { isSignal: true }]
40287
40364
  }]
40288
40365
  }
40289
40366
  });
@@ -46674,6 +46751,10 @@ var MnQuadrantTaskBoard = class MnQuadrantTaskBoard {
46674
46751
  this.corners = QUADRANT_CORNERS;
46675
46752
  this.scope = injectScope();
46676
46753
  this.chart = viewChild.required(MnQuadrantChart, ...ngDevMode ? [{ debugName: "chart" }] : /* istanbul ignore next */ []);
46754
+ this.chartElement = viewChild.required(MnQuadrantChart, {
46755
+ ...ngDevMode ? { debugName: "chartElement" } : /* istanbul ignore next */ {},
46756
+ read: ElementRef
46757
+ });
46677
46758
  this.host = inject(ElementRef).nativeElement;
46678
46759
  this.document = inject(DOCUMENT);
46679
46760
  this.panelRef = viewChild("panel", ...ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []);
@@ -46811,12 +46892,13 @@ var MnQuadrantTaskBoard = class MnQuadrantTaskBoard {
46811
46892
  return this.lastPointer ? { ...this.lastPointer } : emptyBox();
46812
46893
  }
46813
46894
  pointBox(index) {
46814
- const el = this.host.querySelector(`.minerva-chart-quadrant-point[data-point-index="${index}"]`);
46815
- if (!el) return this.pointerBox();
46816
- const box = this.boxOf(el);
46895
+ const point = this.points()[index];
46896
+ const at = point ? this.chart().instance()?.toPixel(point.x, point.y) : null;
46897
+ if (!at) return this.pointerBox();
46898
+ const box = this.boxOf(this.chartElement().nativeElement);
46817
46899
  return {
46818
- x: box.x - DOT,
46819
- y: box.y - DOT,
46900
+ x: box.x + at.x - DOT,
46901
+ y: box.y + at.y - DOT,
46820
46902
  width: 20,
46821
46903
  height: 20
46822
46904
  };
@@ -47181,6 +47263,14 @@ var MnQuadrantTaskBoard = class MnQuadrantTaskBoard {
47181
47263
  descendants: true,
47182
47264
  isSignal: true
47183
47265
  },
47266
+ {
47267
+ propertyName: "chartElement",
47268
+ first: true,
47269
+ predicate: MnQuadrantChart,
47270
+ descendants: true,
47271
+ read: ElementRef,
47272
+ isSignal: true
47273
+ },
47184
47274
  {
47185
47275
  propertyName: "panelRef",
47186
47276
  first: true,
@@ -47206,7 +47296,7 @@ var MnQuadrantTaskBoard = class MnQuadrantTaskBoard {
47206
47296
  ],
47207
47297
  exportAs: ["mnQuadrantTaskBoard"],
47208
47298
  ngImport: i0,
47209
- template: "\n <mn-quadrant-chart\n [points]=\"points()\"\n [locale]=\"language()\"\n [selectedIndex]=\"selected()\"\n [draggable]=\"draggable() ?? true\"\n [height]=\"height()\"\n [width]=\"width()\"\n [renderer]=\"renderer()\"\n [legend]=\"legend()\"\n [tooltip]=\"tooltip()\"\n [crosshair]=\"crosshair()\"\n [annotations]=\"annotations()\"\n [interaction]=\"interaction()\"\n [padding]=\"padding()\"\n [palette]=\"palette()\"\n [ariaLabel]=\"ariaLabel()\"\n [xDomain]=\"xDomain()\"\n [yDomain]=\"yDomain()\"\n [xSplit]=\"xSplit()\"\n [ySplit]=\"ySplit()\"\n [quadrants]=\"quadrants()\"\n [xLabel]=\"xLabel()\"\n [yLabel]=\"yLabel()\"\n [axisLabels]=\"axisLabels()\"\n [showTicks]=\"showTicks()\"\n [reverseX]=\"reverseX()\"\n [showLabels]=\"showLabels()\"\n [pointSize]=\"pointSize()\"\n [name]=\"name()\"\n [selectedIndices]=\"selectedIndices()\"\n [accessiblePoints]=\"accessiblePoints()\"\n [quadrantHeader]=\"header\"\n [pointActions]=\"actions\"\n (hover)=\"hover.emit($event)\"\n (zoom)=\"zoom.emit($event)\"\n (rendererChange)=\"rendererChange.emit($event)\"\n (pointClick)=\"onPointClick($event)\"\n (pointDoubleClick)=\"edit($event.index)\"\n (pointDrag)=\"pointDrag.emit($event)\"\n (pointDrop)=\"onPointDrop($event)\"\n (quadrantClick)=\"add($event.quadrant, pointerBox(), $event)\"\n />\n <ng-template #header let-corner let-info=\"info\">\n <div [class]=\"s.header\" [attr.data-corner]=\"corner\">\n @if (info.region?.badge) {\n <span [class]=\"s.badge\">{{ info.region.badge }}</span>\n }\n <span [class]=\"s.title\">{{ title(corner) }}</span>\n @if (showCounts() !== false) {\n <span [class]=\"s.count\">{{ countText(info.points) }}</span>\n }\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n [class]=\"s.add\"\n [label]=\"texts().add + ' · ' + title(corner)\"\n [attr.aria-expanded]=\"adding() === corner\"\n (click)=\"add(corner, boxOf($event.currentTarget))\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.add\" /></svg>\n </button>\n </div>\n </ng-template>\n <ng-template #actions let-index=\"index\">\n <div\n role=\"toolbar\"\n [attr.aria-label]=\"texts().actions\"\n [class]=\"s.actions\"\n (pointerdown)=\"$event.stopPropagation()\"\n >\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n [label]=\"texts().edit\"\n (click)=\"edit(index)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.edit\" /></svg>\n </button>\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n color=\"danger\"\n [label]=\"texts().delete\"\n (click)=\"confirmRemove(index)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.delete\" /></svg>\n </button>\n </div>\n </ng-template>\n @if (draft(); as current) {\n <div\n #panel\n role=\"dialog\"\n [attr.aria-labelledby]=\"ids.title\"\n [class]=\"s.panel\"\n [attr.data-quadrant-task-panel]=\"\n current.index === null ? 'add' : 'edit'\n \"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <form [class]=\"s.form\" (submit)=\"save($event)\">\n <h3 [id]=\"ids.title\" [class]=\"s.panelTitle\">\n {{ current.index === null ? texts().add : texts().edit }}\n </h3>\n <label [class]=\"s.field\">\n <span>{{ texts().name }}</span>\n <mn-input\n required\n size=\"small\"\n [value]=\"current.label\"\n [aria-label]=\"texts().name\"\n (valueChange)=\"setLabel($event ?? '')\"\n />\n </label>\n <fieldset [class]=\"s.quadrants\">\n <legend>{{ texts().quadrant }}</legend>\n <div [class]=\"s.quadrantGrid\">\n @for (corner of corners; track corner) {\n <label [class]=\"s.quadrant\" [attr.data-corner]=\"corner\">\n <input\n type=\"radio\"\n [name]=\"ids.quadrant\"\n [value]=\"corner\"\n [checked]=\"current.quadrant === corner\"\n (change)=\"setQuadrant(corner)\"\n />\n <span\n [class]=\"s.swatch\"\n [style.background]=\"color(corner)\"\n aria-hidden=\"true\"\n ></span>\n <span [class]=\"s.quadrantName\">{{ title(corner) }}</span>\n </label>\n }\n </div>\n </fieldset>\n <div [class]=\"s.footer\">\n <button\n mnButton\n size=\"small\"\n color=\"neutral\"\n variant=\"ghost\"\n (click)=\"close()\"\n >\n {{ texts().cancel }}\n </button>\n <button mnButton size=\"small\" type=\"submit\" [disabled]=\"!canSave()\">\n {{ texts().save }}\n </button>\n </div>\n </form>\n </div>\n }\n @if (deletingPoint()) {\n <div\n #panel\n role=\"alertdialog\"\n [attr.aria-labelledby]=\"ids.title\"\n [attr.aria-describedby]=\"ids.text\"\n [class]=\"s.panel\"\n data-quadrant-task-panel=\"delete\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <h3 [id]=\"ids.title\" [class]=\"s.panelTitle\">{{ texts().delete }}</h3>\n <p [id]=\"ids.text\" [class]=\"s.panelText\">{{ deleteText() }}</p>\n <div [class]=\"s.footer\">\n <button\n #deleteCancel\n mnButton\n size=\"small\"\n color=\"neutral\"\n variant=\"ghost\"\n (click)=\"close()\"\n >\n {{ texts().cancel }}\n </button>\n <button mnButton size=\"small\" color=\"danger\" (click)=\"remove()\">\n {{ texts().confirmDelete }}\n </button>\n </div>\n </div>\n }\n ",
47299
+ template: "\n <mn-quadrant-chart\n [points]=\"points()\"\n [locale]=\"language()\"\n [selectedIndex]=\"selected()\"\n [draggable]=\"draggable() ?? true\"\n [height]=\"height()\"\n [width]=\"width()\"\n [renderer]=\"renderer()\"\n [legend]=\"legend()\"\n [tooltip]=\"tooltip()\"\n [crosshair]=\"crosshair()\"\n [annotations]=\"annotations()\"\n [interaction]=\"interaction()\"\n [padding]=\"padding()\"\n [palette]=\"palette()\"\n [ariaLabel]=\"ariaLabel()\"\n [xDomain]=\"xDomain()\"\n [yDomain]=\"yDomain()\"\n [xSplit]=\"xSplit()\"\n [ySplit]=\"ySplit()\"\n [quadrants]=\"quadrants()\"\n [xLabel]=\"xLabel()\"\n [yLabel]=\"yLabel()\"\n [axisLabels]=\"axisLabels()\"\n [showTicks]=\"showTicks()\"\n [reverseX]=\"reverseX()\"\n [showLabels]=\"showLabels()\"\n [pointSize]=\"pointSize()\"\n [name]=\"name()\"\n [selectedIndices]=\"selectedIndices()\"\n [accessiblePoints]=\"accessiblePoints()\"\n [quadrantHeader]=\"header\"\n [pointActions]=\"actions\"\n (hover)=\"hover.emit($event)\"\n (zoom)=\"zoom.emit($event)\"\n (rendererChange)=\"rendererChange.emit($event)\"\n (pointClick)=\"onPointClick($event)\"\n (pointDoubleClick)=\"edit($event.index)\"\n (pointDrag)=\"pointDrag.emit($event)\"\n (pointDrop)=\"onPointDrop($event)\"\n (quadrantClick)=\"add($event.quadrant, pointerBox(), $event)\"\n />\n <ng-template #header let-corner let-info=\"info\">\n <div [class]=\"s.header\" [attr.data-corner]=\"corner\">\n @if (info.region?.badge) {\n <span [class]=\"s.badge\">{{ info.region.badge }}</span>\n }\n <span [class]=\"s.title\">{{ title(corner) }}</span>\n @if (showCounts() !== false) {\n <span [class]=\"s.count\">{{ countText(info.points) }}</span>\n }\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n [class]=\"s.add\"\n [label]=\"texts().add + ' · ' + title(corner)\"\n [attr.aria-expanded]=\"adding() === corner\"\n (click)=\"add(corner, boxOf($event.currentTarget))\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.add\" /></svg>\n </button>\n </div>\n </ng-template>\n <ng-template #actions let-index=\"index\">\n <div\n role=\"toolbar\"\n [attr.aria-label]=\"texts().actions\"\n [class]=\"s.cardActions\"\n (pointerdown)=\"$event.stopPropagation()\"\n >\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n [label]=\"texts().edit\"\n (click)=\"edit(index)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.edit\" /></svg>\n </button>\n <button\n mnIconButton\n size=\"xsmall\"\n variant=\"ghost\"\n color=\"danger\"\n [label]=\"texts().delete\"\n (click)=\"confirmRemove(index)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path [attr.d]=\"icons.delete\" /></svg>\n </button>\n </div>\n </ng-template>\n @if (draft(); as current) {\n <div\n #panel\n role=\"dialog\"\n [attr.aria-labelledby]=\"ids.title\"\n [class]=\"s.panel\"\n [attr.data-quadrant-task-panel]=\"\n current.index === null ? 'add' : 'edit'\n \"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <form [class]=\"s.form\" (submit)=\"save($event)\">\n <h3 [id]=\"ids.title\" [class]=\"s.panelTitle\">\n {{ current.index === null ? texts().add : texts().edit }}\n </h3>\n <label [class]=\"s.field\">\n <span>{{ texts().name }}</span>\n <mn-input\n required\n size=\"small\"\n [value]=\"current.label\"\n [aria-label]=\"texts().name\"\n (valueChange)=\"setLabel($event ?? '')\"\n />\n </label>\n <fieldset [class]=\"s.quadrants\">\n <legend>{{ texts().quadrant }}</legend>\n <div [class]=\"s.quadrantGrid\">\n @for (corner of corners; track corner) {\n <label [class]=\"s.quadrant\" [attr.data-corner]=\"corner\">\n <input\n type=\"radio\"\n [name]=\"ids.quadrant\"\n [value]=\"corner\"\n [checked]=\"current.quadrant === corner\"\n (change)=\"setQuadrant(corner)\"\n />\n <span\n [class]=\"s.swatch\"\n [style.background]=\"color(corner)\"\n aria-hidden=\"true\"\n ></span>\n <span [class]=\"s.quadrantName\">{{ title(corner) }}</span>\n </label>\n }\n </div>\n </fieldset>\n <div [class]=\"s.footer\">\n <button\n mnButton\n size=\"small\"\n color=\"neutral\"\n variant=\"ghost\"\n (click)=\"close()\"\n >\n {{ texts().cancel }}\n </button>\n <button mnButton size=\"small\" type=\"submit\" [disabled]=\"!canSave()\">\n {{ texts().save }}\n </button>\n </div>\n </form>\n </div>\n }\n @if (deletingPoint()) {\n <div\n #panel\n role=\"alertdialog\"\n [attr.aria-labelledby]=\"ids.title\"\n [attr.aria-describedby]=\"ids.text\"\n [class]=\"s.panel\"\n data-quadrant-task-panel=\"delete\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <h3 [id]=\"ids.title\" [class]=\"s.panelTitle\">{{ texts().delete }}</h3>\n <p [id]=\"ids.text\" [class]=\"s.panelText\">{{ deleteText() }}</p>\n <div [class]=\"s.footer\">\n <button\n #deleteCancel\n mnButton\n size=\"small\"\n color=\"neutral\"\n variant=\"ghost\"\n (click)=\"close()\"\n >\n {{ texts().cancel }}\n </button>\n <button mnButton size=\"small\" color=\"danger\" (click)=\"remove()\">\n {{ texts().confirmDelete }}\n </button>\n </div>\n </div>\n }\n ",
47210
47300
  isInline: true,
47211
47301
  dependencies: [
47212
47302
  {
@@ -47417,7 +47507,7 @@ i0.ɵɵngDeclareClassMetadata({
47417
47507
  <div
47418
47508
  role="toolbar"
47419
47509
  [attr.aria-label]="texts().actions"
47420
- [class]="s.actions"
47510
+ [class]="s.cardActions"
47421
47511
  (pointerdown)="$event.stopPropagation()"
47422
47512
  >
47423
47513
  <button
@@ -47823,6 +47913,13 @@ i0.ɵɵngDeclareClassMetadata({
47823
47913
  type: i0.ViewChild,
47824
47914
  args: [i0.forwardRef(() => MnQuadrantChart), { isSignal: true }]
47825
47915
  }],
47916
+ chartElement: [{
47917
+ type: i0.ViewChild,
47918
+ args: [i0.forwardRef(() => MnQuadrantChart), {
47919
+ read: ElementRef,
47920
+ isSignal: true
47921
+ }]
47922
+ }],
47826
47923
  panelRef: [{
47827
47924
  type: i0.ViewChild,
47828
47925
  args: ["panel", { isSignal: true }]