minerva-design 1.17.2 → 1.18.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 (69) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/angular/fesm2022/minerva-angular.mjs +27 -25
  3. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  4. package/dist/angular/types/minerva-angular.d.ts +1 -1
  5. package/dist/charts/engine/chart.cjs +1 -1
  6. package/dist/charts/engine/chart.cjs.map +1 -1
  7. package/dist/charts/engine/chart.js +309 -301
  8. package/dist/charts/engine/chart.js.map +1 -1
  9. package/dist/charts/engine/overlay.cjs +1 -1
  10. package/dist/charts/engine/overlay.cjs.map +1 -1
  11. package/dist/charts/engine/overlay.d.cts +5 -0
  12. package/dist/charts/engine/overlay.d.ts +5 -0
  13. package/dist/charts/engine/overlay.js +87 -69
  14. package/dist/charts/engine/overlay.js.map +1 -1
  15. package/dist/charts/engine/scene.cjs +1 -1
  16. package/dist/charts/engine/scene.cjs.map +1 -1
  17. package/dist/charts/engine/scene.d.cts +5 -0
  18. package/dist/charts/engine/scene.d.ts +5 -0
  19. package/dist/charts/engine/scene.js +32 -32
  20. package/dist/charts/engine/scene.js.map +1 -1
  21. package/dist/charts/engine/types.d.cts +14 -0
  22. package/dist/charts/engine/types.d.ts +14 -0
  23. package/dist/charts/react/Chart.cjs +1 -1
  24. package/dist/charts/react/Chart.cjs.map +1 -1
  25. package/dist/charts/react/Chart.d.cts +4 -2
  26. package/dist/charts/react/Chart.d.ts +4 -2
  27. package/dist/charts/react/Chart.js +42 -42
  28. package/dist/charts/react/Chart.js.map +1 -1
  29. package/dist/charts/react/charts.cjs +1 -1
  30. package/dist/charts/react/charts.cjs.map +1 -1
  31. package/dist/charts/react/charts.js +320 -231
  32. package/dist/charts/react/charts.js.map +1 -1
  33. package/dist/charts/react/types.d.cts +8 -2
  34. package/dist/charts/react/types.d.ts +8 -2
  35. package/dist/core/contracts.cjs +1 -1
  36. package/dist/core/contracts.cjs.map +1 -1
  37. package/dist/core/contracts.js +1 -1
  38. package/dist/core/contracts.js.map +1 -1
  39. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  40. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  41. package/dist/native/charts/src/engine/overlay.js +82 -65
  42. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  43. package/dist/native/charts/src/engine/scene.cjs +1 -1
  44. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  45. package/dist/native/charts/src/engine/scene.js +32 -32
  46. package/dist/native/charts/src/engine/scene.js.map +1 -1
  47. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.cjs +1 -1
  48. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.cjs.map +1 -1
  49. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.js +14 -8
  50. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.js.map +1 -1
  51. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.cjs +1 -1
  52. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.cjs.map +1 -1
  53. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.js +16 -15
  54. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.js.map +1 -1
  55. package/dist/react/style.css +1 -1
  56. package/dist/react/styles/quadrant-task-board.css +1 -1
  57. package/dist/taro/index.js +1514 -1496
  58. package/dist/taro/style.css +22 -0
  59. package/dist/uni/style.css +22 -0
  60. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue.js.map +1 -1
  61. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js +14 -8
  62. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/weapp/charts/canvas.js +35 -7
  64. package/dist/weapp/controls.wxss +22 -0
  65. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js +7 -7
  66. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js.map +1 -1
  67. package/dist/web-components/styles/QuadrantTaskBoard/quadrantTaskBoard.css.js +1 -1
  68. package/dist/web-components/styles/QuadrantTaskBoard/quadrantTaskBoard.css.js.map +1 -1
  69. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"quadrant-task-board.js","names":["styles","_decorate","__decorate","quadrantTaskBoard_module_default","INTERNAL_EVENTS","stop","event","DOT","emptyBox","deepActiveElement","active","icon","QUADRANT_TASK_ICONS","kind","MinervaQuadrantTaskBoard","MinervaElement","_args","LocaleController","AriaController","target","panel","removeQuadrantTask","selectionAfterRemove","board","b","quadrant","moveQuadrantTask","index","MinervaQuadrantChart","MinervaIconButton","MinervaInput","MinervaButton","hostStyles","sharedStyles","root","type","points","corner","quadrantLabels","cached","locale","ariaLabel","value","el","box","next","newQuadrantTaskDraft","at","draft","editQuadrantTaskDraft","change","saved","applyQuadrantTaskDraft","changed","placed","child","anchor","place","placeQuadrantTaskPanel","on","badge","QUADRANT_HEADER_SLOTS","nothing","count","addLabel","expanded","texts","QUADRANT_CORNERS","styleMap","quadrantTaskColor","canSaveQuadrantTask","quadrantTaskDeleteText","quadrantTaskLabels","groups","quadrantGroups","adding","selected","quadrantCountText","property","state"],"sources":["../../../../../web-components/src/components/quadrant-task-board/quadrant-task-board.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport styles from \"@react-styles/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss?inline\";\nimport {\n QUADRANT_CORNERS,\n QUADRANT_TASK_ICONS,\n applyQuadrantTaskDraft,\n canSaveQuadrantTask,\n editQuadrantTaskDraft,\n moveQuadrantTask,\n newQuadrantTaskDraft,\n placeQuadrantTaskPanel,\n quadrantCountText,\n quadrantGroups,\n quadrantLabels,\n quadrantTaskColor,\n quadrantTaskDeleteText,\n quadrantTaskLabels,\n removeQuadrantTask,\n selectionAfterRemove,\n type ChartOptions,\n type QuadrantAxisLabels,\n type QuadrantCorner,\n type QuadrantPoint,\n type QuadrantRegions,\n type QuadrantTaskBox,\n type QuadrantTaskDraft,\n type QuadrantTaskGeometry,\n type QuadrantTaskLabels,\n} from \"minerva-design/charts/core\";\nimport { MinervaButton } from \"../button/button\";\nimport { MinervaQuadrantChart, QUADRANT_HEADER_SLOTS } from \"../chart/charts\";\nimport { MinervaIconButton } from \"../icon-button/icon-button\";\nimport { MinervaInput } from \"../input/input\";\nimport { AriaController } from \"../../internal/aria\";\nimport { LocaleController } from \"../../internal/locale\";\nimport { MinervaElement, hostStyles } from \"../../internal/minerva-element\";\nimport { sharedStyles } from \"../../internal/styles\";\n\nexport type { QuadrantTaskLabels };\n\n/** Detail of `minerva-points-change` */\nexport interface QuadrantTaskBoardChangeDetail {\n /** The next list of tasks (pass it back as `points`) */\n points: QuadrantPoint[];\n}\n\n/**\n * Events of the inner chart and of the fields of the panel that the board\n * consumes: they stop at its shadow root (the board fires\n * `minerva-points-change`). `minerva-hover`, `minerva-point-click`,\n * `minerva-point-drag`, `minerva-zoom` and `minerva-renderer-change` of the\n * chart go through.\n */\nconst INTERNAL_EVENTS = [\n \"minerva-input\",\n \"minerva-change\",\n \"minerva-clear\",\n \"minerva-point-drop\",\n \"minerva-quadrant-click\",\n \"minerva-point-double-click\",\n \"input\",\n \"change\",\n];\n\nconst stop = (event: Event) => event.stopPropagation();\n\n/** The inline panel: the add / edit form, or the delete confirmation */\ntype Panel =\n | { kind: \"draft\"; draft: QuadrantTaskDraft; anchor: QuadrantTaskBox }\n | { kind: \"delete\"; index: number; anchor: QuadrantTaskBox };\n\n/** A panel whose position and focus were set: its anchor and kind */\ninterface Placed {\n anchor: QuadrantTaskBox;\n kind: Panel[\"kind\"];\n}\n\n/** Half the size of the box around a task the panel keeps clear */\nconst DOT = 10;\n\nconst emptyBox = (): QuadrantTaskBox => ({ x: 0, y: 0, width: 0, height: 0 });\n\n/** The focused element, looking into open shadow roots */\nfunction deepActiveElement(): HTMLElement | null {\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement)\n active = active.shadowRoot.activeElement;\n return active instanceof HTMLElement ? active : null;\n}\n\nconst icon = (kind: keyof typeof QUADRANT_TASK_ICONS) =>\n html`<svg\nwidth=\"16\"\nheight=\"16\"\nviewBox=\"0 0 24 24\"\nfill=\"none\"\nstroke=\"currentColor\"\nstroke-width=\"1.8\"\nstroke-linecap=\"round\"\nstroke-linejoin=\"round\"\naria-hidden=\"true\"\n>\n<path d=${QUADRANT_TASK_ICONS[kind]}></path>\n</svg>`;\n\n/**\n * Task board on a four-quadrant matrix (`<QuadrantTaskBoard>` of React),\n * built on `<minerva-quadrant-chart>`: each quadrant header shows its\n * title, the number of tasks and an add button; the active task (hovered,\n * keyboard-focused or selected) shows edit and delete buttons; an inline\n * panel, anchored inside the board at the button or the task, names a task\n * and picks its quadrant, or confirms a delete (Escape or a press outside\n * closes it). Tasks can be dragged to another quadrant, or moved with\n * Shift + arrows once focused; a double click edits a task, a click on an\n * empty area adds one there.\n *\n * Controlled, like `<minerva-dashboard-columns>`: the board never changes its\n * own `points`. It fires `minerva-points-change` with the next list after\n * an add, an edit, a delete, a drag and drop or a keyboard move; set it\n * back as `points` to apply it (or keep the old list to refuse it).\n *\n * Texts are localized (the `locale` attribute, else the library language)\n * and can be overridden with `labels`. The host's `aria-label` names the\n * chart.\n *\n * Published as the optional entry\n * `minerva-design/web-components/quadrant-task-board` (it loads the chart\n * engine, minerva-design/charts/core).\n *\n * @summary Four-quadrant task board: add, edit, delete and drag tasks between quadrants.\n * @tag minerva-quadrant-task-board\n * @csspart root - The box around the chart and the inline panel\n * @csspart chart - The inner `<minerva-quadrant-chart>`\n * @csspart panel - The inline add / edit / delete panel, positioned next to its anchor\n * @fires minerva-points-change - The tasks changed (add, edit, delete, drag and drop, keyboard move); `detail: { points }`, the next list to set back as `points`\n * @fires minerva-point-click - A task was clicked (it becomes the selected one); `detail: { point, index }`\n * @fires minerva-point-drag - A task is being dragged (on every move); `detail: { point, index, x, y, quadrant }`\n * @fires minerva-hover - The hovered (or keyboard-focused) task changed; `detail: { x, xLabel, items }`, `null` when nothing is hovered\n * @fires minerva-zoom - The user zoomed or panned the chart; `detail`: the view\n * @fires minerva-renderer-change - The chart backend is ready (or fell back after a GPU loss); `detail`: the renderer\n */\nexport class MinervaQuadrantTaskBoard extends MinervaElement {\n static override tagName = \"minerva-quadrant-task-board\";\n static override dependencies = [\n MinervaQuadrantChart,\n MinervaIconButton,\n MinervaInput,\n MinervaButton,\n ];\n static override styles = [\n hostStyles,\n css`\n:host{\ndisplay: block;\n\nwidth: 100%;\nmin-inline-size: 0;\n}\n`,\n sharedStyles(styles),\n ];\n\n /** Tasks `{ x, y, label, color, size }`; replace the array to update the board (controlled); property only */\n @property({ attribute: false })\n points?: readonly QuadrantPoint[];\n\n /** Texts of the buttons and panels (`add`, `edit`, `delete`, `deleteConfirm`, `confirmDelete`, `name`, `quadrant`, `save`, `cancel`, `actions`), localized by default; property only */\n @property({ attribute: false })\n labels?: Partial<QuadrantTaskLabels>;\n\n /** Titles, badges and colors of the quadrants (`topLeft`, `topRight`, `bottomLeft`, `bottomRight`); property only */\n @property({ attribute: false })\n quadrants?: QuadrantRegions;\n\n /** Title of the horizontal axis */\n @property({ attribute: \"x-label\" })\n xLabel?: string;\n\n /** Title of the vertical axis */\n @property({ attribute: \"y-label\" })\n yLabel?: string;\n\n /** Texts at the ends of the dividers, drawn inside the plot (`top`, `bottom`, `left`, `right`); property only */\n @property({ attribute: false })\n axisLabels?: QuadrantAxisLabels;\n\n /** Range of the horizontal axis (default [0, 10]); property only */\n @property({ attribute: false })\n xDomain?: [number, number];\n\n /** Range of the vertical axis (default [0, 10]); property only */\n @property({ attribute: false })\n yDomain?: [number, number];\n\n /** X value of the vertical divider (the middle of the x domain by default) */\n @property({ type: Number, attribute: \"x-split\" })\n xSplit?: number;\n\n /** Y value of the horizontal divider (the middle of the y domain by default) */\n @property({ type: Number, attribute: \"y-split\" })\n ySplit?: number;\n\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n @property({ type: Boolean, attribute: \"reverse-x\" })\n reverseX = false;\n\n /** Hides the numeric ticks of the axes (only the matrix remains) */\n @property({ type: Boolean, attribute: \"hide-ticks\" })\n hideTicks = false;\n\n /** Hides the labels next to the tasks */\n @property({ type: Boolean, attribute: \"hide-labels\" })\n hideLabels = false;\n\n /** Hides the number of tasks in the quadrant headers */\n @property({ type: Boolean, attribute: \"hide-counts\" })\n hideCounts = false;\n\n /** Dot diameter in pixels */\n @property({ type: Number, attribute: \"point-size\" })\n pointSize = 12;\n\n /** Index of the selected task, drawn with a ring (`null`: none); by default the board selects the last clicked, moved or saved task */\n @property({ type: Number, attribute: \"selected-index\" })\n selectedIndex?: number | null;\n\n /** Height of the chart: pixels or any CSS length (default 320) */\n @property()\n height?: string | number;\n\n /** Language of the built-in texts, quadrant titles and numbers (e.g. \"fr\"); the library language by default */\n @property()\n locale?: string;\n\n /** Leaves out the visually hidden list of the tasks (keyboard and screen reader access, keyboard moves) */\n @property({ type: Boolean, attribute: \"no-accessible-points\" })\n noAccessiblePoints = false;\n\n /** Other engine options of the chart (legend, tooltip, padding, palette...); property only */\n @property({ attribute: false })\n options?: Omit<ChartOptions, \"series\">;\n\n @state() private panel: Panel | null = null;\n @state() private selection: number | null = null;\n\n /** Last pointer press in the board (anchor of a click on an empty area) */\n private lastPointer: QuadrantTaskBox | null = null;\n /** Focused element before the panel opened (focused again on Escape / Cancel) */\n private returnFocus: HTMLElement | null = null;\n /** Panel whose position and focus were set */\n private placed: Placed | null = null;\n /** Whether the press-outside listener is on the document */\n private listening = false;\n\n private readonly i18n = new LocaleController(this);\n private readonly aria = new AriaController(this);\n /** Options of the chart, kept while their sources do not change (no redraw on unrelated updates) */\n private chartOptions: {\n options: unknown;\n locale: string;\n ariaLabel: string | undefined;\n value: Omit<ChartOptions, \"series\">;\n } | null = null;\n\n protected override createRenderRoot() {\n const root = super.createRenderRoot();\n for (const type of INTERNAL_EVENTS) root.addEventListener(type, stop);\n return root;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.listenOutside(false);\n }\n\n private get language(): string {\n return this.locale ?? this.i18n.language;\n }\n\n private get tasks(): readonly QuadrantPoint[] {\n return this.points ?? [];\n }\n\n private get chart(): MinervaQuadrantChart | null {\n return this.renderRoot.querySelector<MinervaQuadrantChart>(\n MinervaQuadrantChart.tagName,\n );\n }\n\n private get boardElement(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>(\"[part=root]\");\n }\n\n private get panelElement(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>(\"[part=panel]\");\n }\n\n /** The open panel, unless the task it is about is gone */\n private get shownPanel(): Panel | null {\n const panel = this.panel;\n if (!panel) return null;\n const points = this.tasks;\n const shown =\n panel.kind === \"draft\"\n ? panel.draft.index === null || !!points[panel.draft.index]\n : !!points[panel.index];\n return shown ? panel : null;\n }\n\n private geometry(): QuadrantTaskGeometry {\n return {\n xDomain: this.xDomain,\n yDomain: this.yDomain,\n xSplit: this.xSplit,\n ySplit: this.ySplit,\n reverseX: this.reverseX,\n };\n }\n\n private quadrantTitle(corner: QuadrantCorner): string {\n return (\n this.quadrants?.[corner]?.label || quadrantLabels(this.language)[corner]\n );\n }\n\n private engineOptions(\n locale: string,\n ariaLabel: string | undefined,\n ): Omit<ChartOptions, \"series\"> {\n const cached = this.chartOptions;\n if (\n cached &&\n cached.options === this.options &&\n cached.locale === locale &&\n cached.ariaLabel === ariaLabel\n )\n return cached.value;\n const value = {\n ...this.options,\n locale,\n ...(ariaLabel ? { ariaLabel } : {}),\n };\n this.chartOptions = { options: this.options, locale, ariaLabel, value };\n return value;\n }\n\n /** Box of an element, relative to the board */\n private boxOf(el: Element | null | undefined): QuadrantTaskBox | null {\n const board = this.boardElement;\n if (!el || !board) return null;\n const b = board.getBoundingClientRect();\n const r = el.getBoundingClientRect();\n return {\n x: r.left - b.left,\n y: r.top - b.top,\n width: r.width,\n height: r.height,\n };\n }\n\n /** Box around a task (the anchor of its actions in the chart), else the last pointer */\n private pointBox(index: number): QuadrantTaskBox {\n const box = this.boxOf(\n this.chart?.shadowRoot?.querySelector(\n `[part=point-actions][data-point-index=\"${index}\"]`,\n ),\n );\n if (box)\n return {\n x: box.x - DOT,\n y: box.y - DOT,\n width: 2 * DOT,\n height: 2 * DOT,\n };\n return this.lastPointer ? { ...this.lastPointer } : emptyBox();\n }\n\n private change(points: QuadrantPoint[]): void {\n this.emit<QuadrantTaskBoardChangeDetail>(\"minerva-points-change\", {\n points,\n });\n }\n\n private open(next: Panel): void {\n if (!this.panel) this.returnFocus = deepActiveElement();\n this.panel = next;\n }\n\n private readonly close = () => {\n this.panel = null;\n const target = this.returnFocus;\n this.returnFocus = null;\n if (target?.isConnected) target.focus();\n };\n\n private add(\n corner: QuadrantCorner,\n anchor: QuadrantTaskBox,\n at?: { x: number; y: number },\n ): void {\n this.open({\n kind: \"draft\",\n draft: newQuadrantTaskDraft(this.geometry(), corner, at),\n anchor,\n });\n }\n\n private edit(index: number | null): void {\n if (index === null) return;\n const draft = editQuadrantTaskDraft(this.geometry(), this.tasks, index);\n if (draft)\n this.open({ kind: \"draft\", draft, anchor: this.pointBox(index) });\n }\n\n private confirmRemove(index: number | null): void {\n if (index === null) return;\n this.open({ kind: \"delete\", index, anchor: this.pointBox(index) });\n }\n\n private setDraft(change: Partial<QuadrantTaskDraft>): void {\n const panel = this.panel;\n if (panel?.kind === \"draft\")\n this.panel = { ...panel, draft: { ...panel.draft, ...change } };\n }\n\n private save(): void {\n const panel = this.shownPanel;\n const saved = applyQuadrantTaskDraft(\n this.geometry(),\n this.tasks,\n panel?.kind === \"draft\" ? panel.draft : null,\n );\n if (!saved) return;\n this.change(saved.points);\n this.selection = saved.index;\n this.close();\n }\n\n private readonly removeTask = () => {\n const panel = this.shownPanel;\n if (panel?.kind === \"delete\" && this.tasks[panel.index]) {\n this.change(removeQuadrantTask(this.tasks, panel.index));\n this.selection = selectionAfterRemove(this.selection, panel.index);\n }\n this.close();\n };\n\n protected override updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n const panel = this.shownPanel;\n this.listenOutside(panel !== null);\n if (!panel) {\n this.placed = null;\n return;\n }\n const placed = this.placed;\n if (placed?.anchor === panel.anchor && placed.kind === panel.kind) return;\n const next: Placed = { anchor: panel.anchor, kind: panel.kind };\n this.placed = next;\n // next to its anchor, inside the board, before the panel is painted\n this.placePanel();\n void this.settlePanel(next);\n }\n\n /** Places the panel again once its fields rendered, then focuses the first one (or Cancel) */\n private async settlePanel(placed: Placed): Promise<void> {\n const el = this.panelElement;\n if (!el) return;\n await Promise.all(\n Array.from(\n el.querySelectorAll(\"*\"),\n (child) => (child as Partial<MinervaElement>).updateComplete,\n ),\n );\n if (this.placed !== placed || this.panelElement !== el) return;\n this.placePanel();\n el.querySelector<HTMLElement>(\"[data-autofocus]\")?.focus({\n preventScroll: true,\n });\n }\n\n private placePanel(): void {\n const el = this.panelElement;\n const board = this.boardElement;\n const anchor = this.shownPanel?.anchor;\n if (!el || !board || !anchor) return;\n const place = placeQuadrantTaskPanel(\n anchor,\n { width: el.offsetWidth, height: el.offsetHeight },\n { width: board.clientWidth, height: board.clientHeight },\n );\n el.style.left = `${place.x}px`;\n el.style.top = `${place.y}px`;\n el.style.transformOrigin = `${place.origin.x}px ${place.origin.y}px`;\n el.dataset.placement = place.placement;\n }\n\n /** A press outside the panel closes it, like a popover */\n private listenOutside(on: boolean): void {\n if (on === this.listening) return;\n this.listening = on;\n if (on)\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown, true);\n else\n document.removeEventListener(\n \"pointerdown\",\n this.onOutsidePointerDown,\n true,\n );\n }\n\n private readonly onOutsidePointerDown = (event: PointerEvent) => {\n const panel = this.panelElement;\n if (panel && event.composedPath().includes(panel)) return;\n this.returnFocus = null;\n this.panel = null;\n };\n\n private readonly onPanelKeydown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n this.close();\n };\n\n /** Where the last press in the board was (the anchor of a click on an empty area) */\n private readonly trackPointer = {\n capture: true,\n handleEvent: (event: PointerEvent) => {\n const board = this.boardElement;\n if (!board) return;\n const b = board.getBoundingClientRect();\n this.lastPointer = {\n x: event.clientX - b.left,\n y: event.clientY - b.top,\n width: 0,\n height: 0,\n };\n },\n };\n\n private readonly onPointClick = (event: CustomEvent<{ index: number }>) => {\n this.selection = event.detail.index;\n };\n\n private readonly onPointDoubleClick = (\n event: CustomEvent<{ index: number }>,\n ) => this.edit(event.detail.index);\n\n private readonly onQuadrantClick = (\n event: CustomEvent<{ quadrant: QuadrantCorner; x: number; y: number }>,\n ) => {\n const { quadrant, x, y } = event.detail;\n this.add(\n quadrant,\n this.lastPointer ? { ...this.lastPointer } : emptyBox(),\n { x, y },\n );\n };\n\n private readonly onPointDrop = (\n event: CustomEvent<{ index: number; x: number; y: number }>,\n ) => {\n const { index, x, y } = event.detail;\n this.change(moveQuadrantTask(this.tasks, index, { x, y }));\n this.selection = index;\n };\n\n private readonly onSubmit = (event: Event) => {\n event.preventDefault();\n this.save();\n };\n\n private readonly onNameKeydown = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" || event.isComposing) return;\n event.preventDefault();\n this.save();\n };\n\n private renderHeader(\n corner: QuadrantCorner,\n count: string | undefined,\n addLabel: string,\n expanded: boolean,\n ) {\n const badge = this.quadrants?.[corner]?.badge;\n return html`<div\nslot=${QUADRANT_HEADER_SLOTS[corner]}\nclass=\"header\"\ndata-corner=${corner}\n>\n${badge ? html`<span class=\"badge\">${badge}</span>` : nothing}\n<span class=\"title\">${this.quadrantTitle(corner)}</span>\n${\n count === undefined\n ? nothing\n : html`<span class=\"count\">${count}</span>`\n }\n<minerva-icon-button\nclass=\"add\"\nsize=\"xsmall\"\nvariant=\"ghost\"\nlabel=${`${addLabel} · ${this.quadrantTitle(corner)}`}\naria-expanded=${expanded ? \"true\" : \"false\"}\n@click=${(event: MouseEvent) =>\n this.add(\n corner,\n this.boxOf(event.currentTarget as Element) ?? emptyBox(),\n )}\n>${icon(\"add\")}</minerva-icon-button\n>\n</div>`;\n }\n\n private renderDraftPanel(\n draft: QuadrantTaskDraft,\n texts: QuadrantTaskLabels,\n points: readonly QuadrantPoint[],\n ) {\n return html`<div\npart=\"panel\"\nclass=\"panel\"\nrole=\"dialog\"\naria-labelledby=\"panel-title\"\ndata-quadrant-task-panel=${draft.index === null ? \"add\" : \"edit\"}\n@keydown=${this.onPanelKeydown}\n>\n<form class=\"form\" @submit=${this.onSubmit}>\n<h3 id=\"panel-title\" class=\"panelTitle\">\n${draft.index === null ? texts.add : texts.edit}\n</h3>\n<label class=\"field\">\n<span>${texts.name}</span>\n<minerva-input\nrequired\nsize=\"small\"\ndata-autofocus\naria-label=${texts.name}\n.value=${draft.label}\n@minerva-input=${(event: CustomEvent<{ value: string }>) =>\n this.setDraft({ label: event.detail.value })}\n@keydown=${this.onNameKeydown}\n></minerva-input>\n</label>\n<fieldset class=\"quadrants\">\n<legend>${texts.quadrant}</legend>\n<div class=\"quadrantGrid\">\n${QUADRANT_CORNERS.map(\n (corner) =>\n html`<label class=\"quadrant\" data-corner=${corner}>\n<input\ntype=\"radio\"\nname=\"quadrant\"\nvalue=${corner}\n.checked=${draft.quadrant === corner}\n@change=${() => this.setDraft({ quadrant: corner })}\n/>\n<span\nclass=\"swatch\"\nstyle=${styleMap({\n background: quadrantTaskColor(this.quadrants, corner),\n })}\naria-hidden=\"true\"\n></span>\n<span class=\"quadrantName\"\n>${this.quadrantTitle(corner)}</span\n>\n</label>`,\n )}\n</div>\n</fieldset>\n<div class=\"footer\">\n<minerva-button\nsize=\"small\"\ncolor=\"neutral\"\nvariant=\"ghost\"\n@click=${this.close}\n>${texts.cancel}</minerva-button\n>\n<minerva-button\nsize=\"small\"\ntype=\"submit\"\n?disabled=${!canSaveQuadrantTask(draft, points)}\n>${texts.save}</minerva-button\n>\n</div>\n</form>\n</div>`;\n }\n\n private renderDeletePanel(\n index: number,\n texts: QuadrantTaskLabels,\n points: readonly QuadrantPoint[],\n ) {\n return html`<div\npart=\"panel\"\nclass=\"panel\"\nrole=\"alertdialog\"\naria-labelledby=\"panel-title\"\naria-describedby=\"panel-text\"\ndata-quadrant-task-panel=\"delete\"\n@keydown=${this.onPanelKeydown}\n>\n<h3 id=\"panel-title\" class=\"panelTitle\">${texts.delete}</h3>\n<p id=\"panel-text\" class=\"panelText\">\n${quadrantTaskDeleteText(texts, points[index])}\n</p>\n<div class=\"footer\">\n<minerva-button\nsize=\"small\"\ncolor=\"neutral\"\nvariant=\"ghost\"\ndata-autofocus\n@click=${this.close}\n>${texts.cancel}</minerva-button\n>\n<minerva-button size=\"small\" color=\"danger\" @click=${this.removeTask}\n>${texts.confirmDelete}</minerva-button\n>\n</div>\n</div>`;\n }\n\n protected override render() {\n const points = this.tasks;\n const locale = this.language;\n const texts = quadrantTaskLabels(locale, this.labels);\n const groups = quadrantGroups({ ...this.geometry(), points });\n const panel = this.shownPanel;\n const adding =\n panel?.kind === \"draft\" && panel.draft.index === null\n ? panel.draft.quadrant\n : null;\n const selected =\n this.selectedIndex !== undefined ? this.selectedIndex : this.selection;\n const ariaLabel = this.aria.label;\n return html`<div\npart=\"root\"\nclass=\"board\"\ndata-panel=${panel?.kind ?? nothing}\n@pointerdown=${this.trackPointer}\n>\n<minerva-quadrant-chart\npart=\"chart\"\ndrag-points\n.points=${points}\n.quadrants=${this.quadrants}\n.xLabel=${this.xLabel}\n.yLabel=${this.yLabel}\n.axisLabels=${this.axisLabels}\n.xDomain=${this.xDomain}\n.yDomain=${this.yDomain}\n.xSplit=${this.xSplit}\n.ySplit=${this.ySplit}\n.reverseX=${this.reverseX}\n.hideTicks=${this.hideTicks}\n.hideLabels=${this.hideLabels}\n.pointSize=${this.pointSize}\n.selectedIndex=${selected}\n.noAccessiblePoints=${this.noAccessiblePoints}\n.height=${this.height}\n.options=${this.engineOptions(locale, ariaLabel)}\n@minerva-point-click=${this.onPointClick}\n@minerva-point-double-click=${this.onPointDoubleClick}\n@minerva-quadrant-click=${this.onQuadrantClick}\n@minerva-point-drop=${this.onPointDrop}\n>\n${QUADRANT_CORNERS.map((corner) =>\n this.renderHeader(\n corner,\n this.hideCounts\n ? undefined\n : quadrantCountText(true, groups[corner].points, locale),\n texts.add,\n adding === corner,\n ),\n )}\n<div\nslot=\"point-actions\"\nrole=\"toolbar\"\nclass=\"actions\"\naria-label=${texts.actions}\n@pointerdown=${stop}\n>\n<minerva-icon-button\nsize=\"small\"\nvariant=\"ghost\"\nlabel=${texts.edit}\ndata-action=\"edit\"\n@click=${() => this.edit(this.chart?.activeIndex ?? null)}\n>${icon(\"edit\")}</minerva-icon-button\n>\n<minerva-icon-button\nsize=\"small\"\nvariant=\"ghost\"\ncolor=\"danger\"\nlabel=${texts.delete}\ndata-action=\"delete\"\n@click=${() => this.confirmRemove(this.chart?.activeIndex ?? null)}\n>${icon(\"delete\")}</minerva-icon-button\n>\n</div>\n</minerva-quadrant-chart>\n${\n panel?.kind === \"draft\"\n ? this.renderDraftPanel(panel.draft, texts, points)\n : panel?.kind === \"delete\"\n ? this.renderDeletePanel(panel.index, texts, points)\n : nothing\n }\n</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"minerva-quadrant-task-board\": MinervaQuadrantTaskBoard;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"quadrant-task-board.js","names":["styles","_decorate","__decorate","quadrantTaskBoard_module_default","INTERNAL_EVENTS","stop","event","DOT","emptyBox","deepActiveElement","active","icon","size","QUADRANT_TASK_ICONS","kind","MinervaQuadrantTaskBoard","MinervaElement","_args","LocaleController","AriaController","target","panel","removeQuadrantTask","selectionAfterRemove","board","b","quadrant","moveQuadrantTask","index","MinervaQuadrantChart","MinervaIconButton","MinervaInput","MinervaButton","hostStyles","sharedStyles","root","type","points","corner","quadrantLabels","cached","locale","ariaLabel","value","el","box","next","newQuadrantTaskDraft","at","draft","editQuadrantTaskDraft","change","saved","applyQuadrantTaskDraft","changed","placed","child","anchor","place","placeQuadrantTaskPanel","on","badge","QUADRANT_HEADER_SLOTS","nothing","count","addLabel","expanded","texts","QUADRANT_CORNERS","styleMap","quadrantTaskColor","canSaveQuadrantTask","quadrantTaskDeleteText","quadrantTaskLabels","groups","quadrantGroups","adding","selected","quadrantCountText","property","state"],"sources":["../../../../../web-components/src/components/quadrant-task-board/quadrant-task-board.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport styles from \"@react-styles/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss?inline\";\nimport {\n QUADRANT_CORNERS,\n QUADRANT_TASK_ICONS,\n applyQuadrantTaskDraft,\n canSaveQuadrantTask,\n editQuadrantTaskDraft,\n moveQuadrantTask,\n newQuadrantTaskDraft,\n placeQuadrantTaskPanel,\n quadrantCountText,\n quadrantGroups,\n quadrantLabels,\n quadrantTaskColor,\n quadrantTaskDeleteText,\n quadrantTaskLabels,\n removeQuadrantTask,\n selectionAfterRemove,\n type ChartOptions,\n type QuadrantAxisLabels,\n type QuadrantCorner,\n type QuadrantPoint,\n type QuadrantRegions,\n type QuadrantTaskBox,\n type QuadrantTaskDraft,\n type QuadrantTaskGeometry,\n type QuadrantTaskLabels,\n} from \"minerva-design/charts/core\";\nimport { MinervaButton } from \"../button/button\";\nimport { MinervaQuadrantChart, QUADRANT_HEADER_SLOTS } from \"../chart/charts\";\nimport { MinervaIconButton } from \"../icon-button/icon-button\";\nimport { MinervaInput } from \"../input/input\";\nimport { AriaController } from \"../../internal/aria\";\nimport { LocaleController } from \"../../internal/locale\";\nimport { MinervaElement, hostStyles } from \"../../internal/minerva-element\";\nimport { sharedStyles } from \"../../internal/styles\";\n\nexport type { QuadrantTaskLabels };\n\n/** Detail of `minerva-points-change` */\nexport interface QuadrantTaskBoardChangeDetail {\n /** The next list of tasks (pass it back as `points`) */\n points: QuadrantPoint[];\n}\n\n/**\n * Events of the inner chart and of the fields of the panel that the board\n * consumes: they stop at its shadow root (the board fires\n * `minerva-points-change`). `minerva-hover`, `minerva-point-click`,\n * `minerva-point-drag`, `minerva-zoom` and `minerva-renderer-change` of the\n * chart go through.\n */\nconst INTERNAL_EVENTS = [\n \"minerva-input\",\n \"minerva-change\",\n \"minerva-clear\",\n \"minerva-point-drop\",\n \"minerva-quadrant-click\",\n \"minerva-point-double-click\",\n \"input\",\n \"change\",\n];\n\nconst stop = (event: Event) => event.stopPropagation();\n\n/** The inline panel: the add / edit form, or the delete confirmation */\ntype Panel =\n | { kind: \"draft\"; draft: QuadrantTaskDraft; anchor: QuadrantTaskBox }\n | { kind: \"delete\"; index: number; anchor: QuadrantTaskBox };\n\n/** A panel whose position and focus were set: its anchor and kind */\ninterface Placed {\n anchor: QuadrantTaskBox;\n kind: Panel[\"kind\"];\n}\n\n/** Half the size of the box around a task the panel keeps clear */\nconst DOT = 10;\n\nconst emptyBox = (): QuadrantTaskBox => ({ x: 0, y: 0, width: 0, height: 0 });\n\n/** The focused element, looking into open shadow roots */\nfunction deepActiveElement(): HTMLElement | null {\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement)\n active = active.shadowRoot.activeElement;\n return active instanceof HTMLElement ? active : null;\n}\n\nconst icon = (kind: keyof typeof QUADRANT_TASK_ICONS, size = 16) =>\n html`<svg\nwidth=${size}\nheight=${size}\nviewBox=\"0 0 24 24\"\nfill=\"none\"\nstroke=\"currentColor\"\nstroke-width=\"1.8\"\nstroke-linecap=\"round\"\nstroke-linejoin=\"round\"\naria-hidden=\"true\"\n>\n<path d=${QUADRANT_TASK_ICONS[kind]}></path>\n</svg>`;\n\n/**\n * Task board on a four-quadrant matrix (`<QuadrantTaskBoard>` of React),\n * built on `<minerva-quadrant-chart>`: each quadrant header shows its\n * title, the number of tasks and an add button; the active task (hovered,\n * keyboard-focused or selected) shows edit and delete buttons; an inline\n * panel, anchored inside the board at the button or the task, names a task\n * and picks its quadrant, or confirms a delete (Escape or a press outside\n * closes it). Tasks can be dragged to another quadrant, or moved with\n * Shift + arrows once focused; a double click edits a task, a click on an\n * empty area adds one there.\n *\n * Controlled, like `<minerva-dashboard-columns>`: the board never changes its\n * own `points`. It fires `minerva-points-change` with the next list after\n * an add, an edit, a delete, a drag and drop or a keyboard move; set it\n * back as `points` to apply it (or keep the old list to refuse it).\n *\n * Texts are localized (the `locale` attribute, else the library language)\n * and can be overridden with `labels`. The host's `aria-label` names the\n * chart.\n *\n * Published as the optional entry\n * `minerva-design/web-components/quadrant-task-board` (it loads the chart\n * engine, minerva-design/charts/core).\n *\n * @summary Four-quadrant task board: add, edit, delete and drag tasks between quadrants.\n * @tag minerva-quadrant-task-board\n * @csspart root - The box around the chart and the inline panel\n * @csspart chart - The inner `<minerva-quadrant-chart>`\n * @csspart panel - The inline add / edit / delete panel, positioned next to its anchor\n * @fires minerva-points-change - The tasks changed (add, edit, delete, drag and drop, keyboard move); `detail: { points }`, the next list to set back as `points`\n * @fires minerva-point-click - A task was clicked (it becomes the selected one); `detail: { point, index }`\n * @fires minerva-point-drag - A task is being dragged (on every move); `detail: { point, index, x, y, quadrant }`\n * @fires minerva-hover - The hovered (or keyboard-focused) task changed; `detail: { x, xLabel, items }`, `null` when nothing is hovered\n * @fires minerva-zoom - The user zoomed or panned the chart; `detail`: the view\n * @fires minerva-renderer-change - The chart backend is ready (or fell back after a GPU loss); `detail`: the renderer\n */\nexport class MinervaQuadrantTaskBoard extends MinervaElement {\n static override tagName = \"minerva-quadrant-task-board\";\n static override dependencies = [\n MinervaQuadrantChart,\n MinervaIconButton,\n MinervaInput,\n MinervaButton,\n ];\n static override styles = [\n hostStyles,\n css`\n:host{\ndisplay: block;\n\nwidth: 100%;\nmin-inline-size: 0;\n}\n`,\n sharedStyles(styles),\n ];\n\n /** Tasks `{ x, y, label, color, size }`; replace the array to update the board (controlled); property only */\n @property({ attribute: false })\n points?: readonly QuadrantPoint[];\n\n /** Texts of the buttons and panels (`add`, `edit`, `delete`, `deleteConfirm`, `confirmDelete`, `name`, `quadrant`, `save`, `cancel`, `actions`), localized by default; property only */\n @property({ attribute: false })\n labels?: Partial<QuadrantTaskLabels>;\n\n /** Titles, badges and colors of the quadrants (`topLeft`, `topRight`, `bottomLeft`, `bottomRight`); property only */\n @property({ attribute: false })\n quadrants?: QuadrantRegions;\n\n /** Title of the horizontal axis */\n @property({ attribute: \"x-label\" })\n xLabel?: string;\n\n /** Title of the vertical axis */\n @property({ attribute: \"y-label\" })\n yLabel?: string;\n\n /** Texts at the ends of the dividers, drawn inside the plot (`top`, `bottom`, `left`, `right`); property only */\n @property({ attribute: false })\n axisLabels?: QuadrantAxisLabels;\n\n /** Range of the horizontal axis (default [0, 10]); property only */\n @property({ attribute: false })\n xDomain?: [number, number];\n\n /** Range of the vertical axis (default [0, 10]); property only */\n @property({ attribute: false })\n yDomain?: [number, number];\n\n /** X value of the vertical divider (the middle of the x domain by default) */\n @property({ type: Number, attribute: \"x-split\" })\n xSplit?: number;\n\n /** Y value of the horizontal divider (the middle of the y domain by default) */\n @property({ type: Number, attribute: \"y-split\" })\n ySplit?: number;\n\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n @property({ type: Boolean, attribute: \"reverse-x\" })\n reverseX = false;\n\n /** Hides the numeric ticks of the axes (only the matrix remains) */\n @property({ type: Boolean, attribute: \"hide-ticks\" })\n hideTicks = false;\n\n /** Hides the labels next to the tasks */\n @property({ type: Boolean, attribute: \"hide-labels\" })\n hideLabels = false;\n\n /** Hides the number of tasks in the quadrant headers */\n @property({ type: Boolean, attribute: \"hide-counts\" })\n hideCounts = false;\n\n /** Dot diameter in pixels */\n @property({ type: Number, attribute: \"point-size\" })\n pointSize = 12;\n\n /** Index of the selected task, drawn with a ring (`null`: none); by default the board selects the last clicked, moved or saved task */\n @property({ type: Number, attribute: \"selected-index\" })\n selectedIndex?: number | null;\n\n /** Height of the chart: pixels or any CSS length (default 320) */\n @property()\n height?: string | number;\n\n /** Language of the built-in texts, quadrant titles and numbers (e.g. \"fr\"); the library language by default */\n @property()\n locale?: string;\n\n /** Leaves out the visually hidden list of the tasks (keyboard and screen reader access, keyboard moves) */\n @property({ type: Boolean, attribute: \"no-accessible-points\" })\n noAccessiblePoints = false;\n\n /** Other engine options of the chart (legend, tooltip, padding, palette...); property only */\n @property({ attribute: false })\n options?: Omit<ChartOptions, \"series\">;\n\n @state() private panel: Panel | null = null;\n @state() private selection: number | null = null;\n\n /** Last pointer press in the board (anchor of a click on an empty area) */\n private lastPointer: QuadrantTaskBox | null = null;\n /** Focused element before the panel opened (focused again on Escape / Cancel) */\n private returnFocus: HTMLElement | null = null;\n /** Panel whose position and focus were set */\n private placed: Placed | null = null;\n /** Whether the press-outside listener is on the document */\n private listening = false;\n\n private readonly i18n = new LocaleController(this);\n private readonly aria = new AriaController(this);\n /** Options of the chart, kept while their sources do not change (no redraw on unrelated updates) */\n private chartOptions: {\n options: unknown;\n locale: string;\n ariaLabel: string | undefined;\n value: Omit<ChartOptions, \"series\">;\n } | null = null;\n\n protected override createRenderRoot() {\n const root = super.createRenderRoot();\n for (const type of INTERNAL_EVENTS) root.addEventListener(type, stop);\n return root;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.listenOutside(false);\n }\n\n private get language(): string {\n return this.locale ?? this.i18n.language;\n }\n\n private get tasks(): readonly QuadrantPoint[] {\n return this.points ?? [];\n }\n\n private get chart(): MinervaQuadrantChart | null {\n return this.renderRoot.querySelector<MinervaQuadrantChart>(\n MinervaQuadrantChart.tagName,\n );\n }\n\n private get boardElement(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>(\"[part=root]\");\n }\n\n private get panelElement(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>(\"[part=panel]\");\n }\n\n /** The open panel, unless the task it is about is gone */\n private get shownPanel(): Panel | null {\n const panel = this.panel;\n if (!panel) return null;\n const points = this.tasks;\n const shown =\n panel.kind === \"draft\"\n ? panel.draft.index === null || !!points[panel.draft.index]\n : !!points[panel.index];\n return shown ? panel : null;\n }\n\n private geometry(): QuadrantTaskGeometry {\n return {\n xDomain: this.xDomain,\n yDomain: this.yDomain,\n xSplit: this.xSplit,\n ySplit: this.ySplit,\n reverseX: this.reverseX,\n };\n }\n\n private quadrantTitle(corner: QuadrantCorner): string {\n return (\n this.quadrants?.[corner]?.label || quadrantLabels(this.language)[corner]\n );\n }\n\n private engineOptions(\n locale: string,\n ariaLabel: string | undefined,\n ): Omit<ChartOptions, \"series\"> {\n const cached = this.chartOptions;\n if (\n cached &&\n cached.options === this.options &&\n cached.locale === locale &&\n cached.ariaLabel === ariaLabel\n )\n return cached.value;\n const value = {\n ...this.options,\n locale,\n ...(ariaLabel ? { ariaLabel } : {}),\n };\n this.chartOptions = { options: this.options, locale, ariaLabel, value };\n return value;\n }\n\n /** Box of an element, relative to the board */\n private boxOf(el: Element | null | undefined): QuadrantTaskBox | null {\n const board = this.boardElement;\n if (!el || !board) return null;\n const b = board.getBoundingClientRect();\n const r = el.getBoundingClientRect();\n return {\n x: r.left - b.left,\n y: r.top - b.top,\n width: r.width,\n height: r.height,\n };\n }\n\n /** Box around a task (the anchor of its actions in the chart), else the last pointer */\n private pointBox(index: number): QuadrantTaskBox {\n const box = this.boxOf(\n this.chart?.shadowRoot?.querySelector(\n `[part=point-actions][data-point-index=\"${index}\"]`,\n ),\n );\n if (box)\n return {\n x: box.x - DOT,\n y: box.y - DOT,\n width: 2 * DOT,\n height: 2 * DOT,\n };\n return this.lastPointer ? { ...this.lastPointer } : emptyBox();\n }\n\n private change(points: QuadrantPoint[]): void {\n this.emit<QuadrantTaskBoardChangeDetail>(\"minerva-points-change\", {\n points,\n });\n }\n\n private open(next: Panel): void {\n if (!this.panel) this.returnFocus = deepActiveElement();\n this.panel = next;\n }\n\n private readonly close = () => {\n this.panel = null;\n const target = this.returnFocus;\n this.returnFocus = null;\n if (target?.isConnected) target.focus();\n };\n\n private add(\n corner: QuadrantCorner,\n anchor: QuadrantTaskBox,\n at?: { x: number; y: number },\n ): void {\n this.open({\n kind: \"draft\",\n draft: newQuadrantTaskDraft(this.geometry(), corner, at),\n anchor,\n });\n }\n\n private edit(index: number | null): void {\n if (index === null) return;\n const draft = editQuadrantTaskDraft(this.geometry(), this.tasks, index);\n if (draft)\n this.open({ kind: \"draft\", draft, anchor: this.pointBox(index) });\n }\n\n private confirmRemove(index: number | null): void {\n if (index === null) return;\n this.open({ kind: \"delete\", index, anchor: this.pointBox(index) });\n }\n\n private setDraft(change: Partial<QuadrantTaskDraft>): void {\n const panel = this.panel;\n if (panel?.kind === \"draft\")\n this.panel = { ...panel, draft: { ...panel.draft, ...change } };\n }\n\n private save(): void {\n const panel = this.shownPanel;\n const saved = applyQuadrantTaskDraft(\n this.geometry(),\n this.tasks,\n panel?.kind === \"draft\" ? panel.draft : null,\n );\n if (!saved) return;\n this.change(saved.points);\n this.selection = saved.index;\n this.close();\n }\n\n private readonly removeTask = () => {\n const panel = this.shownPanel;\n if (panel?.kind === \"delete\" && this.tasks[panel.index]) {\n this.change(removeQuadrantTask(this.tasks, panel.index));\n this.selection = selectionAfterRemove(this.selection, panel.index);\n }\n this.close();\n };\n\n protected override updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n const panel = this.shownPanel;\n this.listenOutside(panel !== null);\n if (!panel) {\n this.placed = null;\n return;\n }\n const placed = this.placed;\n if (placed?.anchor === panel.anchor && placed.kind === panel.kind) return;\n const next: Placed = { anchor: panel.anchor, kind: panel.kind };\n this.placed = next;\n // next to its anchor, inside the board, before the panel is painted\n this.placePanel();\n void this.settlePanel(next);\n }\n\n /** Places the panel again once its fields rendered, then focuses the first one (or Cancel) */\n private async settlePanel(placed: Placed): Promise<void> {\n const el = this.panelElement;\n if (!el) return;\n await Promise.all(\n Array.from(\n el.querySelectorAll(\"*\"),\n (child) => (child as Partial<MinervaElement>).updateComplete,\n ),\n );\n if (this.placed !== placed || this.panelElement !== el) return;\n this.placePanel();\n el.querySelector<HTMLElement>(\"[data-autofocus]\")?.focus({\n preventScroll: true,\n });\n }\n\n private placePanel(): void {\n const el = this.panelElement;\n const board = this.boardElement;\n const anchor = this.shownPanel?.anchor;\n if (!el || !board || !anchor) return;\n const place = placeQuadrantTaskPanel(\n anchor,\n { width: el.offsetWidth, height: el.offsetHeight },\n { width: board.clientWidth, height: board.clientHeight },\n );\n el.style.left = `${place.x}px`;\n el.style.top = `${place.y}px`;\n el.style.transformOrigin = `${place.origin.x}px ${place.origin.y}px`;\n el.dataset.placement = place.placement;\n }\n\n /** A press outside the panel closes it, like a popover */\n private listenOutside(on: boolean): void {\n if (on === this.listening) return;\n this.listening = on;\n if (on)\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown, true);\n else\n document.removeEventListener(\n \"pointerdown\",\n this.onOutsidePointerDown,\n true,\n );\n }\n\n private readonly onOutsidePointerDown = (event: PointerEvent) => {\n const panel = this.panelElement;\n if (panel && event.composedPath().includes(panel)) return;\n this.returnFocus = null;\n this.panel = null;\n };\n\n private readonly onPanelKeydown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n this.close();\n };\n\n /** Where the last press in the board was (the anchor of a click on an empty area) */\n private readonly trackPointer = {\n capture: true,\n handleEvent: (event: PointerEvent) => {\n const board = this.boardElement;\n if (!board) return;\n const b = board.getBoundingClientRect();\n this.lastPointer = {\n x: event.clientX - b.left,\n y: event.clientY - b.top,\n width: 0,\n height: 0,\n };\n },\n };\n\n private readonly onPointClick = (event: CustomEvent<{ index: number }>) => {\n this.selection = event.detail.index;\n };\n\n private readonly onPointDoubleClick = (\n event: CustomEvent<{ index: number }>,\n ) => this.edit(event.detail.index);\n\n private readonly onQuadrantClick = (\n event: CustomEvent<{ quadrant: QuadrantCorner; x: number; y: number }>,\n ) => {\n const { quadrant, x, y } = event.detail;\n this.add(\n quadrant,\n this.lastPointer ? { ...this.lastPointer } : emptyBox(),\n { x, y },\n );\n };\n\n private readonly onPointDrop = (\n event: CustomEvent<{ index: number; x: number; y: number }>,\n ) => {\n const { index, x, y } = event.detail;\n this.change(moveQuadrantTask(this.tasks, index, { x, y }));\n this.selection = index;\n };\n\n private readonly onSubmit = (event: Event) => {\n event.preventDefault();\n this.save();\n };\n\n private readonly onNameKeydown = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" || event.isComposing) return;\n event.preventDefault();\n this.save();\n };\n\n private renderHeader(\n corner: QuadrantCorner,\n count: string | undefined,\n addLabel: string,\n expanded: boolean,\n ) {\n const badge = this.quadrants?.[corner]?.badge;\n return html`<div\nslot=${QUADRANT_HEADER_SLOTS[corner]}\nclass=\"header\"\ndata-corner=${corner}\n>\n${badge ? html`<span class=\"badge\">${badge}</span>` : nothing}\n<span class=\"title\">${this.quadrantTitle(corner)}</span>\n${\n count === undefined\n ? nothing\n : html`<span class=\"count\">${count}</span>`\n }\n<minerva-icon-button\nclass=\"add\"\nsize=\"xsmall\"\nvariant=\"ghost\"\nlabel=${`${addLabel} · ${this.quadrantTitle(corner)}`}\naria-expanded=${expanded ? \"true\" : \"false\"}\n@click=${(event: MouseEvent) =>\n this.add(\n corner,\n this.boxOf(event.currentTarget as Element) ?? emptyBox(),\n )}\n>${icon(\"add\")}</minerva-icon-button\n>\n</div>`;\n }\n\n private renderDraftPanel(\n draft: QuadrantTaskDraft,\n texts: QuadrantTaskLabels,\n points: readonly QuadrantPoint[],\n ) {\n return html`<div\npart=\"panel\"\nclass=\"panel\"\nrole=\"dialog\"\naria-labelledby=\"panel-title\"\ndata-quadrant-task-panel=${draft.index === null ? \"add\" : \"edit\"}\n@keydown=${this.onPanelKeydown}\n>\n<form class=\"form\" @submit=${this.onSubmit}>\n<h3 id=\"panel-title\" class=\"panelTitle\">\n${draft.index === null ? texts.add : texts.edit}\n</h3>\n<label class=\"field\">\n<span>${texts.name}</span>\n<minerva-input\nrequired\nsize=\"small\"\ndata-autofocus\naria-label=${texts.name}\n.value=${draft.label}\n@minerva-input=${(event: CustomEvent<{ value: string }>) =>\n this.setDraft({ label: event.detail.value })}\n@keydown=${this.onNameKeydown}\n></minerva-input>\n</label>\n<fieldset class=\"quadrants\">\n<legend>${texts.quadrant}</legend>\n<div class=\"quadrantGrid\">\n${QUADRANT_CORNERS.map(\n (corner) =>\n html`<label class=\"quadrant\" data-corner=${corner}>\n<input\ntype=\"radio\"\nname=\"quadrant\"\nvalue=${corner}\n.checked=${draft.quadrant === corner}\n@change=${() => this.setDraft({ quadrant: corner })}\n/>\n<span\nclass=\"swatch\"\nstyle=${styleMap({\n background: quadrantTaskColor(this.quadrants, corner),\n })}\naria-hidden=\"true\"\n></span>\n<span class=\"quadrantName\"\n>${this.quadrantTitle(corner)}</span\n>\n</label>`,\n )}\n</div>\n</fieldset>\n<div class=\"footer\">\n<minerva-button\nsize=\"small\"\ncolor=\"neutral\"\nvariant=\"ghost\"\n@click=${this.close}\n>${texts.cancel}</minerva-button\n>\n<minerva-button\nsize=\"small\"\ntype=\"submit\"\n?disabled=${!canSaveQuadrantTask(draft, points)}\n>${texts.save}</minerva-button\n>\n</div>\n</form>\n</div>`;\n }\n\n private renderDeletePanel(\n index: number,\n texts: QuadrantTaskLabels,\n points: readonly QuadrantPoint[],\n ) {\n return html`<div\npart=\"panel\"\nclass=\"panel\"\nrole=\"alertdialog\"\naria-labelledby=\"panel-title\"\naria-describedby=\"panel-text\"\ndata-quadrant-task-panel=\"delete\"\n@keydown=${this.onPanelKeydown}\n>\n<h3 id=\"panel-title\" class=\"panelTitle\">${texts.delete}</h3>\n<p id=\"panel-text\" class=\"panelText\">\n${quadrantTaskDeleteText(texts, points[index])}\n</p>\n<div class=\"footer\">\n<minerva-button\nsize=\"small\"\ncolor=\"neutral\"\nvariant=\"ghost\"\ndata-autofocus\n@click=${this.close}\n>${texts.cancel}</minerva-button\n>\n<minerva-button size=\"small\" color=\"danger\" @click=${this.removeTask}\n>${texts.confirmDelete}</minerva-button\n>\n</div>\n</div>`;\n }\n\n protected override render() {\n const points = this.tasks;\n const locale = this.language;\n const texts = quadrantTaskLabels(locale, this.labels);\n const groups = quadrantGroups({ ...this.geometry(), points });\n const panel = this.shownPanel;\n const adding =\n panel?.kind === \"draft\" && panel.draft.index === null\n ? panel.draft.quadrant\n : null;\n const selected =\n this.selectedIndex !== undefined ? this.selectedIndex : this.selection;\n const ariaLabel = this.aria.label;\n return html`<div\npart=\"root\"\nclass=\"board\"\ndata-panel=${panel?.kind ?? nothing}\n@pointerdown=${this.trackPointer}\n>\n<minerva-quadrant-chart\npart=\"chart\"\ndrag-points\n.points=${points}\n.quadrants=${this.quadrants}\n.xLabel=${this.xLabel}\n.yLabel=${this.yLabel}\n.axisLabels=${this.axisLabels}\n.xDomain=${this.xDomain}\n.yDomain=${this.yDomain}\n.xSplit=${this.xSplit}\n.ySplit=${this.ySplit}\n.reverseX=${this.reverseX}\n.hideTicks=${this.hideTicks}\n.hideLabels=${this.hideLabels}\n.pointSize=${this.pointSize}\n.selectedIndex=${selected}\n.noAccessiblePoints=${this.noAccessiblePoints}\n.height=${this.height}\n.options=${this.engineOptions(locale, ariaLabel)}\n@minerva-point-click=${this.onPointClick}\n@minerva-point-double-click=${this.onPointDoubleClick}\n@minerva-quadrant-click=${this.onQuadrantClick}\n@minerva-point-drop=${this.onPointDrop}\n>\n${QUADRANT_CORNERS.map((corner) =>\n this.renderHeader(\n corner,\n this.hideCounts\n ? undefined\n : quadrantCountText(true, groups[corner].points, locale),\n texts.add,\n adding === corner,\n ),\n )}\n<div\nslot=\"point-actions\"\nrole=\"toolbar\"\nclass=\"actions\"\naria-label=${texts.actions}\n@pointerdown=${stop}\n>\n<minerva-icon-button\nsize=\"xsmall\"\nvariant=\"ghost\"\nlabel=${texts.edit}\ndata-action=\"edit\"\n@click=${() => this.edit(this.chart?.activeIndex ?? null)}\n>${icon(\"edit\", 14)}</minerva-icon-button\n>\n<minerva-icon-button\nsize=\"xsmall\"\nvariant=\"ghost\"\ncolor=\"danger\"\nlabel=${texts.delete}\ndata-action=\"delete\"\n@click=${() => this.confirmRemove(this.chart?.activeIndex ?? null)}\n>${icon(\"delete\", 14)}</minerva-icon-button\n>\n</div>\n</minerva-quadrant-chart>\n${\n panel?.kind === \"draft\"\n ? this.renderDraftPanel(panel.draft, texts, points)\n : panel?.kind === \"delete\"\n ? this.renderDeletePanel(panel.index, texts, points)\n : nothing\n }\n</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"minerva-quadrant-task-board\": MinervaQuadrantTaskBoard;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  //#region ../react/src/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss?inline
2
- var e = ".board{box-sizing:border-box;width:100%;min-width:0;position:relative}.board[data-panel] .minerva-chart-quadrant-card{display:none}.header{align-items:center;gap:var(--space-1,4px);min-width:0;max-width:100%;padding:2px 2px 2px var(--space-2,8px);background:var(--quadrant-task-board-header-background,color-mix(in srgb, var(--surface-color,#fff) 72%, transparent));-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:var(--quadrant-task-board-header-color,var(--text-color));font-size:var(--font-size-xs,12px);white-space:nowrap;pointer-events:auto;border-radius:999px;font-weight:600;line-height:20px;display:inline-flex}.title{text-overflow:ellipsis;min-width:0;overflow:hidden}.badge{color:var(--text-secondary-color);font-weight:500}.count{background:var(--quadrant-task-board-count-background,var(--surface-muted-color,#0000000f));min-width:20px;color:var(--quadrant-task-board-count-color,var(--text-secondary-color));font-variant-numeric:tabular-nums;text-align:center;border-radius:999px;flex:none;padding:0 6px;font-size:11px;font-weight:500;line-height:18px}.add{flex:none}.actions{border:1px solid var(--border-color);border-radius:var(--quadrant-task-board-actions-radius,var(--radius-md,8px));background:var(--quadrant-task-board-actions-background,var(--surface-elevated-color,var(--surface-color,#fff)));pointer-events:auto;gap:2px;padding:3px;animation:.14s cubic-bezier(.2,0,0,1) actions-in;display:flex;position:absolute;transform:translate(-50%,calc(-100% - 16px));box-shadow:0 6px 20px #0f172a29}@media (prefers-reduced-motion:reduce){.actions{animation:none}}@keyframes actions-in{0%{opacity:0;transform:translate(-50%,calc(-100% - 10px))scale(.96)}}.form{gap:var(--space-3,12px);margin:0;display:grid}.field{gap:var(--space-1,4px);font-size:var(--font-size-xs,12px);color:var(--text-secondary-color);font-weight:500;display:grid}.panel{z-index:20;box-sizing:border-box;width:min(var(--quadrant-task-board-panel-width,288px), 100%);padding:var(--space-3,12px) var(--space-4,16px);border:1px solid var(--quadrant-task-board-panel-border,color-mix(in srgb, var(--border-color,#e5e7eb) 70%, transparent));border-radius:var(--quadrant-task-board-panel-radius,var(--radius-lg,12px));background:var(--quadrant-task-board-panel-background,color-mix(in srgb, var(--surface-elevated-color,var(--surface-color,#fff)) 80%, transparent));-webkit-backdrop-filter:blur(12px)saturate(160%);backdrop-filter:blur(12px)saturate(160%);color:var(--text-color);text-align:start;animation:.14s cubic-bezier(.2,0,0,1) panel-in;position:absolute;top:0;left:0;box-shadow:0 12px 32px -8px #0f172a33,0 4px 10px -4px #0f172a1a}@media (prefers-reduced-motion:reduce){.panel{animation:none}}@keyframes panel-in{0%{opacity:0;transform:scale(.96)}}.panelTitle{font-size:var(--font-size-sm,14px);margin:0;font-weight:600;line-height:20px}.panelText{margin:var(--space-1,4px) 0 var(--space-3,12px);color:var(--text-secondary-color);font-size:var(--font-size-sm,14px);overflow-wrap:anywhere;line-height:20px}.quadrants{border:0;min-width:0;margin:0;padding:0}.quadrants legend{margin-bottom:var(--space-1,4px);color:var(--text-secondary-color);font-size:var(--font-size-xs,12px);padding:0;font-weight:500}.quadrantGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.quadrant{border:1px solid color-mix(in srgb, var(--border-color,#e5e7eb) 80%, transparent);border-radius:var(--radius-md,8px);background:color-mix(in srgb, var(--surface-color,#fff) 40%, transparent);min-width:0;color:var(--text-color);font-size:var(--font-size-xs,12px);cursor:pointer;align-items:center;gap:6px;padding:5px 8px;line-height:18px;transition:background-color .12s ease-out,border-color .12s ease-out;display:flex;position:relative}.quadrant input{opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}.quadrant:hover{background:color-mix(in srgb, var(--text-color) 6%, transparent)}.quadrant:has(input:checked){border-color:color-mix(in srgb, var(--primary-color) 70%, transparent);background:color-mix(in srgb, var(--primary-color) 12%, transparent);font-weight:600}.quadrant:has(input:focus-visible){box-shadow:0 0 0 3px var(--focus-ring-color)}.swatch{border-radius:50%;flex:none;width:8px;height:8px}.quadrantName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.footer{justify-content:flex-end;gap:var(--space-2,8px);display:flex}";
2
+ var e = ".board{box-sizing:border-box;width:100%;min-width:0;position:relative}.board[data-panel] .minerva-chart-quadrant-card{display:none}.header{align-items:center;gap:var(--space-1,4px);min-width:0;max-width:100%;padding:2px 2px 2px var(--space-2,8px);background:var(--quadrant-task-board-header-background,color-mix(in srgb, var(--surface-color,#fff) 72%, transparent));-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:var(--quadrant-task-board-header-color,var(--text-color));font-size:var(--font-size-xs,12px);white-space:nowrap;pointer-events:auto;border-radius:999px;font-weight:600;line-height:20px;display:inline-flex}.title{text-overflow:ellipsis;min-width:0;overflow:hidden}.badge{color:var(--text-secondary-color);font-weight:500}.count{background:var(--quadrant-task-board-count-background,var(--surface-muted-color,#0000000f));min-width:20px;color:var(--quadrant-task-board-count-color,var(--text-secondary-color));font-variant-numeric:tabular-nums;text-align:center;border-radius:999px;flex:none;padding:0 6px;font-size:11px;font-weight:500;line-height:18px}.add{flex:none}.actions{border:1px solid var(--border-color);border-radius:var(--quadrant-task-board-actions-radius,var(--radius-md,8px));background:var(--quadrant-task-board-actions-background,var(--surface-elevated-color,var(--surface-color,#fff)));pointer-events:auto;gap:0;padding:2px;animation:.14s cubic-bezier(.2,0,0,1) actions-in;display:flex;position:absolute;transform:translate(-50%,calc(-100% - 12px));box-shadow:0 4px 14px #0f172a24}@media (prefers-reduced-motion:reduce){.actions{animation:none}}@keyframes actions-in{0%{opacity:0;transform:translate(-50%,calc(-100% - 8px))scale(.96)}}.cardActions{align-items:center;gap:0;display:flex}.form{gap:var(--space-3,12px);margin:0;display:grid}.field{gap:var(--space-1,4px);font-size:var(--font-size-xs,12px);color:var(--text-secondary-color);font-weight:500;display:grid}.panel{z-index:20;box-sizing:border-box;width:min(var(--quadrant-task-board-panel-width,288px), 100%);padding:var(--space-3,12px) var(--space-4,16px);border:1px solid var(--quadrant-task-board-panel-border,color-mix(in srgb, var(--border-color,#e5e7eb) 70%, transparent));border-radius:var(--quadrant-task-board-panel-radius,var(--radius-lg,12px));background:var(--quadrant-task-board-panel-background,color-mix(in srgb, var(--surface-elevated-color,var(--surface-color,#fff)) 80%, transparent));-webkit-backdrop-filter:blur(12px)saturate(160%);backdrop-filter:blur(12px)saturate(160%);color:var(--text-color);text-align:start;animation:.14s cubic-bezier(.2,0,0,1) panel-in;position:absolute;top:0;left:0;box-shadow:0 12px 32px -8px #0f172a33,0 4px 10px -4px #0f172a1a}@media (prefers-reduced-motion:reduce){.panel{animation:none}}@keyframes panel-in{0%{opacity:0;transform:scale(.96)}}.panelTitle{font-size:var(--font-size-sm,14px);margin:0;font-weight:600;line-height:20px}.panelText{margin:var(--space-1,4px) 0 var(--space-3,12px);color:var(--text-secondary-color);font-size:var(--font-size-sm,14px);overflow-wrap:anywhere;line-height:20px}.quadrants{border:0;min-width:0;margin:0;padding:0}.quadrants legend{margin-bottom:var(--space-1,4px);color:var(--text-secondary-color);font-size:var(--font-size-xs,12px);padding:0;font-weight:500}.quadrantGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.quadrant{border:1px solid color-mix(in srgb, var(--border-color,#e5e7eb) 80%, transparent);border-radius:var(--radius-md,8px);background:color-mix(in srgb, var(--surface-color,#fff) 40%, transparent);min-width:0;color:var(--text-color);font-size:var(--font-size-xs,12px);cursor:pointer;align-items:center;gap:6px;padding:5px 8px;line-height:18px;transition:background-color .12s ease-out,border-color .12s ease-out;display:flex;position:relative}.quadrant input{opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}.quadrant:hover{background:color-mix(in srgb, var(--text-color) 6%, transparent)}.quadrant:has(input:checked){border-color:color-mix(in srgb, var(--primary-color) 70%, transparent);background:color-mix(in srgb, var(--primary-color) 12%, transparent);font-weight:600}.quadrant:has(input:focus-visible){box-shadow:0 0 0 3px var(--focus-ring-color)}.swatch{border-radius:50%;flex:none;width:8px;height:8px}.quadrantName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.footer{justify-content:flex-end;gap:var(--space-2,8px);display:flex}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"quadrantTaskBoard.css.js","names":["quadrantTaskBoard_module_default"],"sources":["../../../../../react/src/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss?inline"],"sourcesContent":["// Public CSS variables (set them on the board or any ancestor):\n// @css-var --quadrant-task-board-header-color Text color of the quadrant titles (defaults to --text-color)\n// @css-var --quadrant-task-board-header-background Background of the quadrant headers (defaults to a translucent surface)\n// @css-var --quadrant-task-board-count-background Background of the task count chips (defaults to --surface-muted-color)\n// @css-var --quadrant-task-board-count-color Text color of the task count chips (defaults to --text-secondary-color)\n// @css-var --quadrant-task-board-actions-background Background of the toolbar of the active task (defaults to --surface-elevated-color)\n// @css-var --quadrant-task-board-actions-radius Corner radius of the toolbar of the active task (defaults to --radius-md)\n// @css-var --quadrant-task-board-panel-background Background of the inline add / edit / delete panel (defaults to a translucent elevated surface)\n// @css-var --quadrant-task-board-panel-border Border color of the inline panel (defaults to a translucent --border-color)\n// @css-var --quadrant-task-board-panel-radius Corner radius of the inline panel (defaults to --radius-lg)\n// @css-var --quadrant-task-board-panel-width Width of the inline panel (defaults to 288px)\n\n.board {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n\n // the panel names the task: no info card of the chart beside it\n &[data-panel] :global(.minerva-chart-quadrant-card) {\n display: none;\n }\n}\n\n// title, count and add button in the outer corner of a quadrant\n.header {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1, 4px);\n max-width: 100%;\n min-width: 0;\n padding: 2px 2px 2px var(--space-2, 8px);\n border-radius: 999px;\n background: var(--quadrant-task-board-header-background, color-mix(in srgb, var(--surface-color, #fff) 72%, transparent));\n backdrop-filter: blur(6px);\n color: var(--quadrant-task-board-header-color, var(--text-color));\n font-size: var(--font-size-xs, 12px);\n font-weight: 600;\n line-height: 20px;\n white-space: nowrap;\n pointer-events: auto;\n}\n\n.title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.badge {\n color: var(--text-secondary-color);\n font-weight: 500;\n}\n\n.count {\n flex: none;\n min-width: 20px;\n padding: 0 6px;\n border-radius: 999px;\n background: var(--quadrant-task-board-count-background, var(--surface-muted-color, rgb(0 0 0 / 6%)));\n color: var(--quadrant-task-board-count-color, var(--text-secondary-color));\n font-size: 11px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n line-height: 18px;\n text-align: center;\n}\n\n.add {\n flex: none;\n}\n\n// edit / delete above the active task\n.actions {\n position: absolute;\n display: flex;\n gap: 2px;\n padding: 3px;\n border: 1px solid var(--border-color);\n border-radius: var(--quadrant-task-board-actions-radius, var(--radius-md, 8px));\n background: var(--quadrant-task-board-actions-background, var(--surface-elevated-color, var(--surface-color, #fff)));\n box-shadow: 0 6px 20px rgb(15 23 42 / 16%);\n transform: translate(-50%, calc(-100% - 16px));\n pointer-events: auto;\n animation: actions-in 140ms cubic-bezier(0.2, 0, 0, 1);\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n}\n\n@keyframes actions-in {\n from {\n opacity: 0;\n transform: translate(-50%, calc(-100% - 10px)) scale(0.96);\n }\n}\n\n.form {\n display: grid;\n gap: var(--space-3, 12px);\n margin: 0;\n}\n\n.field {\n display: grid;\n gap: var(--space-1, 4px);\n font-size: var(--font-size-xs, 12px);\n font-weight: 500;\n color: var(--text-secondary-color);\n}\n\n// add / edit form and delete confirmation, anchored at the + button or the\n// task inside the board: a frosted surface after the theme, like the chart\n// tooltips\n.panel {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 20;\n box-sizing: border-box;\n width: min(var(--quadrant-task-board-panel-width, 288px), 100%);\n padding: var(--space-3, 12px) var(--space-4, 16px);\n border: 1px solid var(--quadrant-task-board-panel-border, color-mix(in srgb, var(--border-color, #e5e7eb) 70%, transparent));\n border-radius: var(--quadrant-task-board-panel-radius, var(--radius-lg, 12px));\n background: var(--quadrant-task-board-panel-background, color-mix(in srgb, var(--surface-elevated-color, var(--surface-color, #fff)) 80%, transparent));\n -webkit-backdrop-filter: blur(12px) saturate(160%);\n backdrop-filter: blur(12px) saturate(160%);\n color: var(--text-color);\n box-shadow:\n 0 12px 32px -8px rgb(15 23 42 / 20%),\n 0 4px 10px -4px rgb(15 23 42 / 10%);\n text-align: start;\n animation: panel-in 140ms cubic-bezier(0.2, 0, 0, 1);\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n}\n\n@keyframes panel-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n.panelTitle {\n margin: 0;\n font-size: var(--font-size-sm, 14px);\n font-weight: 600;\n line-height: 20px;\n}\n\n.panelText {\n margin: var(--space-1, 4px) 0 var(--space-3, 12px);\n color: var(--text-secondary-color);\n font-size: var(--font-size-sm, 14px);\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n// the quadrant picker: the four quadrants laid out like the matrix\n.quadrants {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n\n legend {\n padding: 0;\n margin-bottom: var(--space-1, 4px);\n color: var(--text-secondary-color);\n font-size: var(--font-size-xs, 12px);\n font-weight: 500;\n }\n}\n\n.quadrantGrid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n}\n\n.quadrant {\n position: relative;\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n padding: 5px 8px;\n border: 1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent);\n border-radius: var(--radius-md, 8px);\n background: color-mix(in srgb, var(--surface-color, #fff) 40%, transparent);\n color: var(--text-color);\n font-size: var(--font-size-xs, 12px);\n line-height: 18px;\n cursor: pointer;\n transition:\n background-color 120ms ease-out,\n border-color 120ms ease-out;\n\n input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n }\n\n &:hover {\n background: color-mix(in srgb, var(--text-color) 6%, transparent);\n }\n\n &:has(input:checked) {\n border-color: color-mix(in srgb, var(--primary-color) 70%, transparent);\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n font-weight: 600;\n }\n\n &:has(input:focus-visible) {\n box-shadow: 0 0 0 3px var(--focus-ring-color);\n }\n}\n\n.swatch {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.quadrantName {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2, 8px);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"quadrantTaskBoard.css.js","names":["quadrantTaskBoard_module_default"],"sources":["../../../../../react/src/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss?inline"],"sourcesContent":["// Public CSS variables (set them on the board or any ancestor):\n// @css-var --quadrant-task-board-header-color Text color of the quadrant titles (defaults to --text-color)\n// @css-var --quadrant-task-board-header-background Background of the quadrant headers (defaults to a translucent surface)\n// @css-var --quadrant-task-board-count-background Background of the task count chips (defaults to --surface-muted-color)\n// @css-var --quadrant-task-board-count-color Text color of the task count chips (defaults to --text-secondary-color)\n// @css-var --quadrant-task-board-actions-background Background of the toolbar of the active task (defaults to --surface-elevated-color)\n// @css-var --quadrant-task-board-actions-radius Corner radius of the toolbar of the active task (defaults to --radius-md)\n// @css-var --quadrant-task-board-panel-background Background of the inline add / edit / delete panel (defaults to a translucent elevated surface)\n// @css-var --quadrant-task-board-panel-border Border color of the inline panel (defaults to a translucent --border-color)\n// @css-var --quadrant-task-board-panel-radius Corner radius of the inline panel (defaults to --radius-lg)\n// @css-var --quadrant-task-board-panel-width Width of the inline panel (defaults to 288px)\n\n.board {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n\n // the panel names the task: no info card of the chart beside it\n &[data-panel] :global(.minerva-chart-quadrant-card) {\n display: none;\n }\n}\n\n// title, count and add button in the outer corner of a quadrant\n.header {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1, 4px);\n max-width: 100%;\n min-width: 0;\n padding: 2px 2px 2px var(--space-2, 8px);\n border-radius: 999px;\n background: var(--quadrant-task-board-header-background, color-mix(in srgb, var(--surface-color, #fff) 72%, transparent));\n backdrop-filter: blur(6px);\n color: var(--quadrant-task-board-header-color, var(--text-color));\n font-size: var(--font-size-xs, 12px);\n font-weight: 600;\n line-height: 20px;\n white-space: nowrap;\n pointer-events: auto;\n}\n\n.title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.badge {\n color: var(--text-secondary-color);\n font-weight: 500;\n}\n\n.count {\n flex: none;\n min-width: 20px;\n padding: 0 6px;\n border-radius: 999px;\n background: var(--quadrant-task-board-count-background, var(--surface-muted-color, rgb(0 0 0 / 6%)));\n color: var(--quadrant-task-board-count-color, var(--text-secondary-color));\n font-size: 11px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n line-height: 18px;\n text-align: center;\n}\n\n.add {\n flex: none;\n}\n\n// edit / delete above the active task (renderers without the point card):\n// compact, close to the dot\n.actions {\n position: absolute;\n display: flex;\n gap: 0;\n padding: 2px;\n border: 1px solid var(--border-color);\n border-radius: var(--quadrant-task-board-actions-radius, var(--radius-md, 8px));\n background: var(--quadrant-task-board-actions-background, var(--surface-elevated-color, var(--surface-color, #fff)));\n box-shadow: 0 4px 14px rgb(15 23 42 / 14%);\n transform: translate(-50%, calc(-100% - 12px));\n pointer-events: auto;\n animation: actions-in 140ms cubic-bezier(0.2, 0, 0, 1);\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n}\n\n@keyframes actions-in {\n from {\n opacity: 0;\n transform: translate(-50%, calc(-100% - 8px)) scale(0.96);\n }\n}\n\n// edit / delete in the card of the active task, beside its name\n.cardActions {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.form {\n display: grid;\n gap: var(--space-3, 12px);\n margin: 0;\n}\n\n.field {\n display: grid;\n gap: var(--space-1, 4px);\n font-size: var(--font-size-xs, 12px);\n font-weight: 500;\n color: var(--text-secondary-color);\n}\n\n// add / edit form and delete confirmation, anchored at the + button or the\n// task inside the board: a frosted surface after the theme, like the chart\n// tooltips\n.panel {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 20;\n box-sizing: border-box;\n width: min(var(--quadrant-task-board-panel-width, 288px), 100%);\n padding: var(--space-3, 12px) var(--space-4, 16px);\n border: 1px solid var(--quadrant-task-board-panel-border, color-mix(in srgb, var(--border-color, #e5e7eb) 70%, transparent));\n border-radius: var(--quadrant-task-board-panel-radius, var(--radius-lg, 12px));\n background: var(--quadrant-task-board-panel-background, color-mix(in srgb, var(--surface-elevated-color, var(--surface-color, #fff)) 80%, transparent));\n -webkit-backdrop-filter: blur(12px) saturate(160%);\n backdrop-filter: blur(12px) saturate(160%);\n color: var(--text-color);\n box-shadow:\n 0 12px 32px -8px rgb(15 23 42 / 20%),\n 0 4px 10px -4px rgb(15 23 42 / 10%);\n text-align: start;\n animation: panel-in 140ms cubic-bezier(0.2, 0, 0, 1);\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n}\n\n@keyframes panel-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n.panelTitle {\n margin: 0;\n font-size: var(--font-size-sm, 14px);\n font-weight: 600;\n line-height: 20px;\n}\n\n.panelText {\n margin: var(--space-1, 4px) 0 var(--space-3, 12px);\n color: var(--text-secondary-color);\n font-size: var(--font-size-sm, 14px);\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n// the quadrant picker: the four quadrants laid out like the matrix\n.quadrants {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n\n legend {\n padding: 0;\n margin-bottom: var(--space-1, 4px);\n color: var(--text-secondary-color);\n font-size: var(--font-size-xs, 12px);\n font-weight: 500;\n }\n}\n\n.quadrantGrid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n}\n\n.quadrant {\n position: relative;\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n padding: 5px 8px;\n border: 1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent);\n border-radius: var(--radius-md, 8px);\n background: color-mix(in srgb, var(--surface-color, #fff) 40%, transparent);\n color: var(--text-color);\n font-size: var(--font-size-xs, 12px);\n line-height: 18px;\n cursor: pointer;\n transition:\n background-color 120ms ease-out,\n border-color 120ms ease-out;\n\n input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n }\n\n &:hover {\n background: color-mix(in srgb, var(--text-color) 6%, transparent);\n }\n\n &:has(input:checked) {\n border-color: color-mix(in srgb, var(--primary-color) 70%, transparent);\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n font-weight: 600;\n }\n\n &:has(input:focus-visible) {\n box-shadow: 0 0 0 3px var(--focus-ring-color);\n }\n}\n\n.swatch {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.quadrantName {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2, 8px);\n}\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minerva-design",
3
- "version": "1.17.2",
3
+ "version": "1.18.0",
4
4
  "description": "Minerva Design: React, Vue, Angular, Web Components and native platform components with shared design tokens and contracts",
5
5
  "license": "MIT",
6
6
  "author": "fwx5618177 <fwx5618177@gmail.com>",