@awesome-markdown/board-ui 0.0.0-stage → 2.0.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.
- package/README.md +76 -2
- package/dist/board/Board.d.ts +24 -0
- package/dist/board/Board.d.ts.map +1 -0
- package/dist/board/Board.js +179 -0
- package/dist/board/Board.js.map +1 -0
- package/dist/board/Cell.d.ts +23 -0
- package/dist/board/Cell.d.ts.map +1 -0
- package/dist/board/Cell.js +150 -0
- package/dist/board/Cell.js.map +1 -0
- package/dist/board/ColumnHeader.d.ts +18 -0
- package/dist/board/ColumnHeader.d.ts.map +1 -0
- package/dist/board/ColumnHeader.js +31 -0
- package/dist/board/ColumnHeader.js.map +1 -0
- package/dist/board/HomelessItemCard.d.ts +15 -0
- package/dist/board/HomelessItemCard.d.ts.map +1 -0
- package/dist/board/HomelessItemCard.js +37 -0
- package/dist/board/HomelessItemCard.js.map +1 -0
- package/dist/board/HomelessPanel.d.ts +17 -0
- package/dist/board/HomelessPanel.d.ts.map +1 -0
- package/dist/board/HomelessPanel.js +26 -0
- package/dist/board/HomelessPanel.js.map +1 -0
- package/dist/board/ItemCard.d.ts +21 -0
- package/dist/board/ItemCard.d.ts.map +1 -0
- package/dist/board/ItemCard.js +97 -0
- package/dist/board/ItemCard.js.map +1 -0
- package/dist/board/SwimlaneRow.d.ts +23 -0
- package/dist/board/SwimlaneRow.d.ts.map +1 -0
- package/dist/board/SwimlaneRow.js +30 -0
- package/dist/board/SwimlaneRow.js.map +1 -0
- package/dist/board/dnd/boardDnd.d.ts +15 -0
- package/dist/board/dnd/boardDnd.d.ts.map +1 -0
- package/dist/board/dnd/boardDnd.js +69 -0
- package/dist/board/dnd/boardDnd.js.map +1 -0
- package/dist/board/dnd/dragTypes.d.ts +24 -0
- package/dist/board/dnd/dragTypes.d.ts.map +1 -0
- package/dist/board/dnd/dragTypes.js +22 -0
- package/dist/board/dnd/dragTypes.js.map +1 -0
- package/dist/board/dnd/mutateDragDrop.d.ts +35 -0
- package/dist/board/dnd/mutateDragDrop.d.ts.map +1 -0
- package/dist/board/dnd/mutateDragDrop.js +97 -0
- package/dist/board/dnd/mutateDragDrop.js.map +1 -0
- package/dist/board/dnd/onDragEnd.d.ts +24 -0
- package/dist/board/dnd/onDragEnd.d.ts.map +1 -0
- package/dist/board/dnd/onDragEnd.js +47 -0
- package/dist/board/dnd/onDragEnd.js.map +1 -0
- package/dist/board/layout/AxisBehavior.d.ts +36 -0
- package/dist/board/layout/AxisBehavior.d.ts.map +1 -0
- package/dist/board/layout/AxisBehavior.js +86 -0
- package/dist/board/layout/AxisBehavior.js.map +1 -0
- package/dist/board/layout/AxisDrawer.d.ts +17 -0
- package/dist/board/layout/AxisDrawer.d.ts.map +1 -0
- package/dist/board/layout/AxisDrawer.js +40 -0
- package/dist/board/layout/AxisDrawer.js.map +1 -0
- package/dist/board/layout/BoardDrawer.d.ts +11 -0
- package/dist/board/layout/BoardDrawer.d.ts.map +1 -0
- package/dist/board/layout/BoardDrawer.js +27 -0
- package/dist/board/layout/BoardDrawer.js.map +1 -0
- package/dist/board/layout/Drawer.d.ts +19 -0
- package/dist/board/layout/Drawer.d.ts.map +1 -0
- package/dist/board/layout/Drawer.js +18 -0
- package/dist/board/layout/Drawer.js.map +1 -0
- package/dist/board/layout/FilterEditor.d.ts +12 -0
- package/dist/board/layout/FilterEditor.d.ts.map +1 -0
- package/dist/board/layout/FilterEditor.js +11 -0
- package/dist/board/layout/FilterEditor.js.map +1 -0
- package/dist/board/layout/InlineControls.d.ts +22 -0
- package/dist/board/layout/InlineControls.d.ts.map +1 -0
- package/dist/board/layout/InlineControls.js +39 -0
- package/dist/board/layout/InlineControls.js.map +1 -0
- package/dist/board/layout/SortableAxis.d.ts +28 -0
- package/dist/board/layout/SortableAxis.d.ts.map +1 -0
- package/dist/board/layout/SortableAxis.js +39 -0
- package/dist/board/layout/SortableAxis.js.map +1 -0
- package/dist/board/layout/axis-defaults.d.ts +22 -0
- package/dist/board/layout/axis-defaults.d.ts.map +1 -0
- package/dist/board/layout/axis-defaults.js +37 -0
- package/dist/board/layout/axis-defaults.js.map +1 -0
- package/dist/board/layout/filter-draft.d.ts +21 -0
- package/dist/board/layout/filter-draft.d.ts.map +1 -0
- package/dist/board/layout/filter-draft.js +112 -0
- package/dist/board/layout/filter-draft.js.map +1 -0
- package/dist/board/layout/useBoardLayout.d.ts +27 -0
- package/dist/board/layout/useBoardLayout.d.ts.map +1 -0
- package/dist/board/layout/useBoardLayout.js +92 -0
- package/dist/board/layout/useBoardLayout.js.map +1 -0
- package/dist/breadcrumb.d.ts +22 -0
- package/dist/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb.js +15 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/components/ConflictBanner.d.ts +12 -0
- package/dist/components/ConflictBanner.d.ts.map +1 -0
- package/dist/components/ConflictBanner.js +47 -0
- package/dist/components/ConflictBanner.js.map +1 -0
- package/dist/components/ConflictDiff.d.ts +13 -0
- package/dist/components/ConflictDiff.d.ts.map +1 -0
- package/dist/components/ConflictDiff.js +97 -0
- package/dist/components/ConflictDiff.js.map +1 -0
- package/dist/components/ConflictPanel.d.ts +16 -0
- package/dist/components/ConflictPanel.d.ts.map +1 -0
- package/dist/components/ConflictPanel.js +53 -0
- package/dist/components/ConflictPanel.js.map +1 -0
- package/dist/components/ItemRecovery.d.ts +9 -0
- package/dist/components/ItemRecovery.d.ts.map +1 -0
- package/dist/components/ItemRecovery.js +48 -0
- package/dist/components/ItemRecovery.js.map +1 -0
- package/dist/components/PropertyTree.d.ts +18 -0
- package/dist/components/PropertyTree.d.ts.map +1 -0
- package/dist/components/PropertyTree.js +109 -0
- package/dist/components/PropertyTree.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/derive-summary.d.ts +9 -0
- package/dist/lib/derive-summary.d.ts.map +1 -0
- package/dist/lib/derive-summary.js +27 -0
- package/dist/lib/derive-summary.js.map +1 -0
- package/dist/lib/item-board.d.ts +2 -0
- package/dist/lib/item-board.d.ts.map +1 -0
- package/dist/lib/item-board.js +7 -0
- package/dist/lib/item-board.js.map +1 -0
- package/dist/lib/patch-visible-item.d.ts +4 -0
- package/dist/lib/patch-visible-item.d.ts.map +1 -0
- package/dist/lib/patch-visible-item.js +10 -0
- package/dist/lib/patch-visible-item.js.map +1 -0
- package/dist/lib/property-display.d.ts +17 -0
- package/dist/lib/property-display.d.ts.map +1 -0
- package/dist/lib/property-display.js +86 -0
- package/dist/lib/property-display.js.map +1 -0
- package/dist/lib/property-tree.d.ts +23 -0
- package/dist/lib/property-tree.d.ts.map +1 -0
- package/dist/lib/property-tree.js +109 -0
- package/dist/lib/property-tree.js.map +1 -0
- package/dist/pages/BoardListPage.d.ts +9 -0
- package/dist/pages/BoardListPage.d.ts.map +1 -0
- package/dist/pages/BoardListPage.js +113 -0
- package/dist/pages/BoardListPage.js.map +1 -0
- package/dist/pages/BoardPage.d.ts +7 -0
- package/dist/pages/BoardPage.d.ts.map +1 -0
- package/dist/pages/BoardPage.js +37 -0
- package/dist/pages/BoardPage.js.map +1 -0
- package/dist/pages/ItemEditorPage.d.ts +3 -0
- package/dist/pages/ItemEditorPage.d.ts.map +1 -0
- package/dist/pages/ItemEditorPage.js +236 -0
- package/dist/pages/ItemEditorPage.js.map +1 -0
- package/dist/provider/ProviderContext.d.ts +17 -0
- package/dist/provider/ProviderContext.d.ts.map +1 -0
- package/dist/provider/ProviderContext.js +21 -0
- package/dist/provider/ProviderContext.js.map +1 -0
- package/dist/router/RouterAdapter.d.ts +43 -0
- package/dist/router/RouterAdapter.d.ts.map +1 -0
- package/dist/router/RouterAdapter.js +21 -0
- package/dist/router/RouterAdapter.js.map +1 -0
- package/dist/shell/SyncStatusDot.d.ts +8 -0
- package/dist/shell/SyncStatusDot.d.ts.map +1 -0
- package/dist/shell/SyncStatusDot.js +58 -0
- package/dist/shell/SyncStatusDot.js.map +1 -0
- package/dist/shell/ThemeToggle.d.ts +8 -0
- package/dist/shell/ThemeToggle.d.ts.map +1 -0
- package/dist/shell/ThemeToggle.js +21 -0
- package/dist/shell/ThemeToggle.js.map +1 -0
- package/dist/state/theme-store.d.ts +17 -0
- package/dist/state/theme-store.d.ts.map +1 -0
- package/dist/state/theme-store.js +58 -0
- package/dist/state/theme-store.js.map +1 -0
- package/dist/state/useBoardRender.d.ts +16 -0
- package/dist/state/useBoardRender.d.ts.map +1 -0
- package/dist/state/useBoardRender.js +53 -0
- package/dist/state/useBoardRender.js.map +1 -0
- package/dist/state/useProviderSubscribe.d.ts +22 -0
- package/dist/state/useProviderSubscribe.d.ts.map +1 -0
- package/dist/state/useProviderSubscribe.js +48 -0
- package/dist/state/useProviderSubscribe.js.map +1 -0
- package/dist/sync/conflict-api.d.ts +16 -0
- package/dist/sync/conflict-api.d.ts.map +1 -0
- package/dist/sync/conflict-api.js +35 -0
- package/dist/sync/conflict-api.js.map +1 -0
- package/dist/sync/conflict-store.d.ts +44 -0
- package/dist/sync/conflict-store.d.ts.map +1 -0
- package/dist/sync/conflict-store.js +159 -0
- package/dist/sync/conflict-store.js.map +1 -0
- package/fonts/InterTight-Medium.woff2 +0 -0
- package/fonts/InterTight-Regular.woff2 +0 -0
- package/fonts/JetBrainsMono-Medium.woff2 +0 -0
- package/fonts/JetBrainsMono-Regular.woff2 +0 -0
- package/fonts/LICENSE +14 -0
- package/package.json +59 -3
- package/styles.css +852 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Homeless, Item } from '@awesome-markdown/contracts';
|
|
3
|
+
interface HomelessPanelProps {
|
|
4
|
+
homeless: Homeless;
|
|
5
|
+
/**
|
|
6
|
+
* When provided, overrides `homeless.items` for rendering (e.g. to hide
|
|
7
|
+
* items that have been optimistically moved into a cell).
|
|
8
|
+
*/
|
|
9
|
+
items?: Item[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Collapsible panel listing items that belong to this board but no longer
|
|
13
|
+
* match any column filter. Populated from GET /boards/:slug/homeless.
|
|
14
|
+
*/
|
|
15
|
+
export declare function HomelessPanel({ homeless, items: itemsProp }: HomelessPanelProps): React.ReactElement;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=HomelessPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HomelessPanel.d.ts","sourceRoot":"","sources":["../../src/board/HomelessPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGlE,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAkDpG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { HomelessItemCard } from './HomelessItemCard.js';
|
|
4
|
+
/**
|
|
5
|
+
* Collapsible panel listing items that belong to this board but no longer
|
|
6
|
+
* match any column filter. Populated from GET /boards/:slug/homeless.
|
|
7
|
+
*/
|
|
8
|
+
export function HomelessPanel({ homeless, items: itemsProp }) {
|
|
9
|
+
const [open, setOpen] = useState(true);
|
|
10
|
+
const items = itemsProp ?? homeless.items;
|
|
11
|
+
if (items.length === 0)
|
|
12
|
+
return _jsx(_Fragment, {});
|
|
13
|
+
return (_jsxs("div", { style: { borderTop: '1px solid var(--border)' }, "data-testid": "homeless-panel", children: [_jsxs("button", { type: "button", onClick: () => setOpen((v) => !v), className: "w-full flex items-center justify-between px-4 py-2", style: {
|
|
14
|
+
fontFamily: 'var(--font-mono)',
|
|
15
|
+
fontSize: '11px',
|
|
16
|
+
fontWeight: 500,
|
|
17
|
+
color: 'var(--ink-muted)',
|
|
18
|
+
textTransform: 'uppercase',
|
|
19
|
+
letterSpacing: '0.06em',
|
|
20
|
+
background: 'var(--bg)',
|
|
21
|
+
border: 'none',
|
|
22
|
+
cursor: 'pointer',
|
|
23
|
+
borderBottom: open ? '1px solid var(--border)' : 'none',
|
|
24
|
+
}, "data-testid": "homeless-panel-toggle", "aria-expanded": open, children: [_jsxs("span", { children: ["\u26A0 ", items.length, " homeless item", items.length !== 1 ? 's' : '', " \u2014 \"", homeless.board.title, "\""] }), _jsx("span", { "aria-hidden": "true", children: open ? '▲' : '▼' })] }), open && (_jsx("ul", { className: "px-4 pb-3 flex flex-wrap gap-2", style: { paddingTop: '8px' }, "data-testid": "homeless-item-list", children: items.map((item) => (_jsx(HomelessItemCard, { item: item }, item.slug))) }))] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=HomelessPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HomelessPanel.js","sourceRoot":"","sources":["../../src/board/HomelessPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAWzD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAsB;IAC9E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAK,CAAC;IAErC,OAAO,CACL,eACE,KAAK,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,iBACnC,gBAAgB,aAE5B,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACjC,SAAS,EAAC,oDAAoD,EAC9D,KAAK,EAAE;oBACL,UAAU,EAAE,kBAAkB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,GAAG;oBACf,KAAK,EAAE,kBAAkB;oBACzB,aAAa,EAAE,WAAW;oBAC1B,aAAa,EAAE,QAAQ;oBACvB,UAAU,EAAE,WAAW;oBACvB,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,SAAS;oBACjB,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM;iBACxD,iBACW,uBAAuB,mBACpB,IAAI,aAEnB,sCACK,KAAK,CAAC,MAAM,oBAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,gBAC3D,QAAQ,CAAC,KAAK,CAAC,KAAK,UAChB,EACP,8BAAkB,MAAM,YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,IAC3C,EAER,IAAI,IAAI,CACP,aACE,SAAS,EAAC,gCAAgC,EAC1C,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,iBAChB,oBAAoB,YAE/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,gBAAgB,IAAiB,IAAI,EAAE,IAAI,IAArB,IAAI,CAAC,IAAI,CAAgB,CACjD,CAAC,GACC,CACN,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Board, Item } from '@awesome-markdown/contracts';
|
|
3
|
+
interface ItemCardProps {
|
|
4
|
+
item: Item;
|
|
5
|
+
columnSlug: string;
|
|
6
|
+
swimlaneSlug: string;
|
|
7
|
+
boardSlug: string;
|
|
8
|
+
board: Board;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A draggable item card with three-layer layout:
|
|
12
|
+
* 1. Title (Inter Tight 14px/500)
|
|
13
|
+
* 2. Summary (first prose line from body, 12.5px/400, muted)
|
|
14
|
+
* 3. Tags row (mono uppercase, dot-separated, muted)
|
|
15
|
+
*
|
|
16
|
+
* Clicking the card navigates to /items/:slug (full-page editor).
|
|
17
|
+
* When conflicted: drag disabled, dashed ink-muted border, 🔒 indicator.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ItemCard({ item, columnSlug, swimlaneSlug, boardSlug, board, }: ItemCardProps): React.ReactElement;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ItemCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemCard.d.ts","sourceRoot":"","sources":["../../src/board/ItemCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAQ/D,UAAU,aAAa;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,GACN,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAoJpC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { itemLabel } from '@awesome-markdown/contracts';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { useSortable } from '@dnd-kit/sortable';
|
|
5
|
+
import { CSS } from '@dnd-kit/utilities';
|
|
6
|
+
import { useOptionalConflict } from '../sync/conflict-store.js';
|
|
7
|
+
import { deriveSummary } from '../lib/derive-summary.js';
|
|
8
|
+
import { buildItemEditorHref } from '../lib/item-board.js';
|
|
9
|
+
import { PropertyValueDisplay } from '../lib/property-display.js';
|
|
10
|
+
import { useRouterAdapter } from '../router/RouterAdapter.js';
|
|
11
|
+
/**
|
|
12
|
+
* A draggable item card with three-layer layout:
|
|
13
|
+
* 1. Title (Inter Tight 14px/500)
|
|
14
|
+
* 2. Summary (first prose line from body, 12.5px/400, muted)
|
|
15
|
+
* 3. Tags row (mono uppercase, dot-separated, muted)
|
|
16
|
+
*
|
|
17
|
+
* Clicking the card navigates to /items/:slug (full-page editor).
|
|
18
|
+
* When conflicted: drag disabled, dashed ink-muted border, 🔒 indicator.
|
|
19
|
+
*/
|
|
20
|
+
export function ItemCard({ item, columnSlug, swimlaneSlug, boardSlug, board, }) {
|
|
21
|
+
const { navigate } = useRouterAdapter();
|
|
22
|
+
const conflict = useOptionalConflict();
|
|
23
|
+
const isConflicted = conflict?.isItemAffected(item.slug) ?? false;
|
|
24
|
+
const dragData = {
|
|
25
|
+
type: 'item',
|
|
26
|
+
itemSlug: item.slug,
|
|
27
|
+
columnSlug,
|
|
28
|
+
swimlaneSlug,
|
|
29
|
+
};
|
|
30
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
31
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
32
|
+
id: item.slug,
|
|
33
|
+
data: dragData,
|
|
34
|
+
disabled: isConflicted,
|
|
35
|
+
});
|
|
36
|
+
const borderStyle = isConflicted
|
|
37
|
+
? '1px dashed var(--ink-muted)'
|
|
38
|
+
: isHovered && !isDragging
|
|
39
|
+
? '1px solid var(--accent)'
|
|
40
|
+
: '1px solid var(--border)';
|
|
41
|
+
const style = {
|
|
42
|
+
transform: CSS.Transform.toString(transform),
|
|
43
|
+
transition: transition ?? undefined,
|
|
44
|
+
opacity: isDragging ? 0.4 : 1,
|
|
45
|
+
padding: '10px 12px',
|
|
46
|
+
border: borderStyle,
|
|
47
|
+
borderRadius: 0,
|
|
48
|
+
boxShadow: 'none',
|
|
49
|
+
background: 'transparent',
|
|
50
|
+
cursor: isConflicted ? 'not-allowed' : isDragging ? 'grabbing' : 'grab',
|
|
51
|
+
userSelect: 'none',
|
|
52
|
+
};
|
|
53
|
+
const itemAsMap = item;
|
|
54
|
+
const tags = Array.isArray(itemAsMap['tags'])
|
|
55
|
+
? itemAsMap['tags'].filter((value) => typeof value === 'string')
|
|
56
|
+
: [];
|
|
57
|
+
const summary = item.body !== undefined && item.body.trim() !== '' ? deriveSummary(item.body) : '';
|
|
58
|
+
const handleClick = (e) => {
|
|
59
|
+
// Don't navigate if the user is dragging
|
|
60
|
+
if (isDragging)
|
|
61
|
+
return;
|
|
62
|
+
e.stopPropagation();
|
|
63
|
+
navigate(buildItemEditorHref(item.slug, boardSlug));
|
|
64
|
+
};
|
|
65
|
+
return (_jsxs("div", { ref: setNodeRef, style: style, onClick: isConflicted ? undefined : handleClick, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), "data-testid": `item-card-${item.slug}`, "data-item-slug": item.slug, "data-conflict": isConflicted ? 'true' : undefined, ...attributes, ...(isConflicted ? {} : listeners), children: [_jsxs("div", { className: "flex items-start justify-between gap-1", children: [_jsx("span", { style: {
|
|
66
|
+
fontFamily: 'var(--font-sans)',
|
|
67
|
+
fontSize: '14px',
|
|
68
|
+
fontWeight: 500,
|
|
69
|
+
color: 'var(--ink)',
|
|
70
|
+
lineHeight: 1.3,
|
|
71
|
+
flex: 1,
|
|
72
|
+
minWidth: 0,
|
|
73
|
+
overflow: 'hidden',
|
|
74
|
+
textOverflow: 'ellipsis',
|
|
75
|
+
whiteSpace: 'nowrap',
|
|
76
|
+
}, "data-testid": `item-title-${item.slug}`, children: itemLabel(item) }), isConflicted && (_jsx("span", { style: { flexShrink: 0, fontSize: '12px' }, title: "This item is locked while a merge conflict is being resolved", "aria-label": "Conflict lock", "data-testid": `conflict-lock-${item.slug}`, children: "\uD83D\uDD12" }))] }), summary !== '' && (_jsx("p", { style: {
|
|
77
|
+
fontFamily: 'var(--font-sans)',
|
|
78
|
+
fontSize: '12.5px',
|
|
79
|
+
fontWeight: 400,
|
|
80
|
+
color: 'var(--ink-muted)',
|
|
81
|
+
lineHeight: 1.4,
|
|
82
|
+
marginTop: '4px',
|
|
83
|
+
overflow: 'hidden',
|
|
84
|
+
display: '-webkit-box',
|
|
85
|
+
WebkitLineClamp: 2,
|
|
86
|
+
WebkitBoxOrient: 'vertical',
|
|
87
|
+
}, children: summary })), tags.length > 0 && (_jsx("p", { style: {
|
|
88
|
+
fontFamily: 'var(--font-mono)',
|
|
89
|
+
fontSize: '10.5px',
|
|
90
|
+
fontWeight: 400,
|
|
91
|
+
color: 'var(--ink-muted)',
|
|
92
|
+
textTransform: 'uppercase',
|
|
93
|
+
letterSpacing: '0.06em',
|
|
94
|
+
marginTop: '6px',
|
|
95
|
+
}, children: tags.join(' · ') })), board.cardLayout && board.cardLayout.length > 0 && (_jsx("div", { className: "flex items-center flex-wrap gap-1", style: { marginTop: '6px' }, children: board.cardLayout.map((layout) => (_jsx(PropertyValueDisplay, { item: item, boardSlug: boardSlug, layout: layout }, layout.property))) }))] }));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ItemCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemCard.js","sourceRoot":"","sources":["../../src/board/ItemCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Axis, Cell as CellData, Board } from '@awesome-markdown/contracts';
|
|
3
|
+
interface SwimlaneRowProps {
|
|
4
|
+
swimlane: Axis;
|
|
5
|
+
columns: Axis[];
|
|
6
|
+
cells: CellData[];
|
|
7
|
+
board: Board;
|
|
8
|
+
/** False for the implicit swimlane of a board that declares none. */
|
|
9
|
+
editable: boolean;
|
|
10
|
+
selected: boolean;
|
|
11
|
+
onEdit: () => void;
|
|
12
|
+
onRename: (title: string) => void;
|
|
13
|
+
onError: (msg: string) => void;
|
|
14
|
+
onCreated: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A horizontal row representing one swimlane axis.
|
|
18
|
+
* Renders a label cell followed by one Cell per column. The label is the
|
|
19
|
+
* drag handle for reordering rows.
|
|
20
|
+
*/
|
|
21
|
+
export declare function SwimlaneRow({ swimlane, columns, cells, board, editable, selected, onEdit, onRename, onError, onCreated, }: SwimlaneRowProps): React.ReactElement;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=SwimlaneRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwimlaneRow.d.ts","sourceRoot":"","sources":["../../src/board/SwimlaneRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAKjF,UAAU,gBAAgB;IACxB,QAAQ,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAqEvC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Cell } from './Cell.js';
|
|
4
|
+
import { SortableAxis } from './layout/SortableAxis.js';
|
|
5
|
+
import { filterSummary } from './layout/filter-draft.js';
|
|
6
|
+
/**
|
|
7
|
+
* A horizontal row representing one swimlane axis.
|
|
8
|
+
* Renders a label cell followed by one Cell per column. The label is the
|
|
9
|
+
* drag handle for reordering rows.
|
|
10
|
+
*/
|
|
11
|
+
export function SwimlaneRow({ swimlane, columns, cells, board, editable, selected, onEdit, onRename, onError, onCreated, }) {
|
|
12
|
+
return (_jsx(SortableAxis, { dim: "swimlanes", axis: swimlane, editable: editable, selected: selected, label: editable ? swimlane.title : '', subtitle: editable ? filterSummary(swimlane.filter) : undefined, onEdit: onEdit, onRename: onRename, children: ({ setNodeRef, style, handleProps, handleClassName, title }) => (_jsxs("div", { ref: setNodeRef, className: "flex", style: { ...style, background: 'var(--bg)' }, "data-testid": `swimlane-row-${swimlane.slug}`, "data-swimlane-slug": swimlane.slug, children: [_jsx("div", { ...handleProps, className: `w-28 flex-shrink-0 px-2 py-2 ${handleClassName}`, style: {
|
|
13
|
+
borderRight: '1px solid var(--border)',
|
|
14
|
+
borderBottom: '1px solid var(--border)',
|
|
15
|
+
boxShadow: selected ? 'inset 3px 0 0 var(--accent)' : undefined,
|
|
16
|
+
}, "data-testid": `swimlane-label-${swimlane.slug}`, "data-synthetic": swimlane.synthetic ? 'true' : undefined, children: _jsx("span", { className: "block", style: {
|
|
17
|
+
fontFamily: 'var(--font-mono)',
|
|
18
|
+
fontSize: '10.5px',
|
|
19
|
+
fontWeight: 500,
|
|
20
|
+
color: 'var(--ink-muted)',
|
|
21
|
+
textTransform: 'uppercase',
|
|
22
|
+
letterSpacing: '0.06em',
|
|
23
|
+
}, children: title }) }), columns.map((column) => {
|
|
24
|
+
const cell = cells.find((c) => c.columnSlug === column.slug && c.swimlaneSlug === swimlane.slug);
|
|
25
|
+
if (!cell)
|
|
26
|
+
return null;
|
|
27
|
+
return (_jsx(Cell, { cell: cell, columnAxis: column, swimlaneAxis: swimlane, board: board, onError: onError, onCreated: onCreated }, `${column.slug}-${swimlane.slug}`));
|
|
28
|
+
})] })) }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=SwimlaneRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwimlaneRow.js","sourceRoot":"","sources":["../../src/board/SwimlaneRow.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgBzD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,GACQ;IACjB,OAAO,CACL,KAAC,YAAY,IACX,GAAG,EAAC,WAAW,EACf,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACrC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/D,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,YAEjB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC/D,eACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAC,MAAM,EAChB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAC/B,gBAAgB,QAAQ,CAAC,IAAI,EAAE,wBACxB,QAAQ,CAAC,IAAI,aAGjC,iBACM,WAAW,EACf,SAAS,EAAE,gCAAgC,eAAe,EAAE,EAC5D,KAAK,EAAE;wBACL,WAAW,EAAE,yBAAyB;wBACtC,YAAY,EAAE,yBAAyB;wBACvC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS;qBAChE,iBACY,kBAAkB,QAAQ,CAAC,IAAI,EAAE,oBAC9B,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAEvD,eACE,SAAS,EAAC,OAAO,EACjB,KAAK,EAAE;4BACL,UAAU,EAAE,kBAAkB;4BAC9B,QAAQ,EAAE,QAAQ;4BAClB,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,kBAAkB;4BACzB,aAAa,EAAE,WAAW;4BAC1B,aAAa,EAAE,QAAQ;yBACxB,YAEA,KAAK,GACD,GACH,EAGL,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,CACxE,CAAC;oBACF,IAAI,CAAC,IAAI;wBAAE,OAAO,IAAI,CAAC;oBACvB,OAAO,CACL,KAAC,IAAI,IAEH,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,QAAQ,EACtB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,IANf,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAOtC,CACH,CAAC;gBACJ,CAAC,CAAC,IACE,CACP,GACY,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CollisionDetection, DragEndEvent } from '@dnd-kit/core';
|
|
2
|
+
import type { BoardRender, Cell, Homeless, Mutation } from '@awesome-markdown/contracts';
|
|
3
|
+
/**
|
|
4
|
+
* Items only collide with cells/items; axis headers only with headers of the
|
|
5
|
+
* same dimension — so reordering columns never targets a cell and vice versa.
|
|
6
|
+
*/
|
|
7
|
+
export declare const layoutAwareCollision: CollisionDetection;
|
|
8
|
+
export interface HomelessDropPlan {
|
|
9
|
+
itemSlug: string;
|
|
10
|
+
mutations: Mutation[];
|
|
11
|
+
newCells: Cell[];
|
|
12
|
+
}
|
|
13
|
+
/** Resolve a homeless-item drop into its PATCH mutations and optimistic cells. */
|
|
14
|
+
export declare function planHomelessDrop(event: DragEndEvent, cells: Cell[], render: BoardRender, homeless: Homeless): HomelessDropPlan | null;
|
|
15
|
+
//# sourceMappingURL=boardDnd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boardDnd.d.ts","sourceRoot":"","sources":["../../../src/board/dnd/boardDnd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAQ,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM/F;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBAQlC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,IAAI,EAAE,CAAC;CAClB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,QAAQ,GACjB,gBAAgB,GAAG,IAAI,CAuDzB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { closestCenter } from '@dnd-kit/core';
|
|
2
|
+
import { deriveMutations } from '@awesome-markdown/filter-engine';
|
|
3
|
+
import { buildCellFilter } from './mutateDragDrop.js';
|
|
4
|
+
import { decodeCellId } from './dragTypes.js';
|
|
5
|
+
/**
|
|
6
|
+
* Items only collide with cells/items; axis headers only with headers of the
|
|
7
|
+
* same dimension — so reordering columns never targets a cell and vice versa.
|
|
8
|
+
*/
|
|
9
|
+
export const layoutAwareCollision = (args) => {
|
|
10
|
+
const active = args.active.data.current;
|
|
11
|
+
const droppableContainers = args.droppableContainers.filter((c) => {
|
|
12
|
+
const data = c.data.current;
|
|
13
|
+
if (active?.type === 'axis')
|
|
14
|
+
return data?.type === 'axis' && data.dim === active.dim;
|
|
15
|
+
return data?.type !== 'axis';
|
|
16
|
+
});
|
|
17
|
+
return closestCenter({ ...args, droppableContainers });
|
|
18
|
+
};
|
|
19
|
+
/** Resolve a homeless-item drop into its PATCH mutations and optimistic cells. */
|
|
20
|
+
export function planHomelessDrop(event, cells, render, homeless) {
|
|
21
|
+
if (!event.over)
|
|
22
|
+
return null;
|
|
23
|
+
const { itemSlug } = event.active.data.current;
|
|
24
|
+
const overId = String(event.over.id);
|
|
25
|
+
let dstColumnSlug;
|
|
26
|
+
let dstSwimlaneSlug;
|
|
27
|
+
let insertBeforeSlug;
|
|
28
|
+
const cellDecoded = decodeCellId(overId);
|
|
29
|
+
if (cellDecoded) {
|
|
30
|
+
dstColumnSlug = cellDecoded.columnSlug;
|
|
31
|
+
dstSwimlaneSlug = cellDecoded.swimlaneSlug;
|
|
32
|
+
insertBeforeSlug = null;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const overCell = cells.find((c) => c.items.some((i) => i.slug === overId));
|
|
36
|
+
if (!overCell)
|
|
37
|
+
return null;
|
|
38
|
+
dstColumnSlug = overCell.columnSlug;
|
|
39
|
+
dstSwimlaneSlug = overCell.swimlaneSlug;
|
|
40
|
+
insertBeforeSlug = overId;
|
|
41
|
+
}
|
|
42
|
+
const dstCell = cells.find((c) => c.columnSlug === dstColumnSlug && c.swimlaneSlug === dstSwimlaneSlug);
|
|
43
|
+
if (!dstCell || dstCell.readOnly)
|
|
44
|
+
return null;
|
|
45
|
+
const colAxis = render.axes.columns.find((a) => a.slug === dstColumnSlug);
|
|
46
|
+
const slAxis = render.axes.swimlanes.find((a) => a.slug === dstSwimlaneSlug);
|
|
47
|
+
if (!colAxis || !slAxis)
|
|
48
|
+
return null;
|
|
49
|
+
const filter = buildCellFilter(render.board, colAxis, slAxis);
|
|
50
|
+
const mutations = deriveMutations(filter, { board: render.board.slug }, colAxis.writeOnDrop ?? slAxis.writeOnDrop);
|
|
51
|
+
if (!Array.isArray(mutations))
|
|
52
|
+
return null;
|
|
53
|
+
const movingItem = homeless.items.find((i) => i.slug === itemSlug);
|
|
54
|
+
if (!movingItem)
|
|
55
|
+
return null;
|
|
56
|
+
const newCells = cells.map((cell) => {
|
|
57
|
+
if (cell.columnSlug !== dstColumnSlug || cell.swimlaneSlug !== dstSwimlaneSlug)
|
|
58
|
+
return cell;
|
|
59
|
+
const withoutItem = cell.items.filter((i) => i.slug !== itemSlug);
|
|
60
|
+
const idx = insertBeforeSlug === null ? -1 : withoutItem.findIndex((i) => i.slug === insertBeforeSlug);
|
|
61
|
+
const insertAt = idx >= 0 ? idx : withoutItem.length;
|
|
62
|
+
return {
|
|
63
|
+
...cell,
|
|
64
|
+
items: [...withoutItem.slice(0, insertAt), movingItem, ...withoutItem.slice(insertAt)],
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
return { itemSlug, mutations, newCells };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=boardDnd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boardDnd.js","sourceRoot":"","sources":["../../../src/board/dnd/boardDnd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ItemDragData {
|
|
2
|
+
type: 'item';
|
|
3
|
+
itemSlug: string;
|
|
4
|
+
columnSlug: string;
|
|
5
|
+
swimlaneSlug: string;
|
|
6
|
+
}
|
|
7
|
+
/** Drag payload for items dragged from the HomelessPanel. */
|
|
8
|
+
export interface HomelessItemDragData {
|
|
9
|
+
type: 'homeless-item';
|
|
10
|
+
itemSlug: string;
|
|
11
|
+
}
|
|
12
|
+
/** Discriminated union of all drag data shapes in this app. */
|
|
13
|
+
export type DragData = ItemDragData | HomelessItemDragData;
|
|
14
|
+
/**
|
|
15
|
+
* Cell drop-target IDs are encoded as `${columnSlug}::${swimlaneSlug}`.
|
|
16
|
+
* This format must not appear in item slugs.
|
|
17
|
+
*/
|
|
18
|
+
export declare const CELL_ID_SEPARATOR = "::";
|
|
19
|
+
export declare function encodeCellId(columnSlug: string, swimlaneSlug: string): string;
|
|
20
|
+
export declare function decodeCellId(cellId: string): {
|
|
21
|
+
columnSlug: string;
|
|
22
|
+
swimlaneSlug: string;
|
|
23
|
+
} | null;
|
|
24
|
+
//# sourceMappingURL=dragTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dragTypes.d.ts","sourceRoot":"","sources":["../../../src/board/dnd/dragTypes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,GACb;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOrD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Drag payload attached to each draggable ItemCard via useSortable data
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Cell drop-target IDs are encoded as `${columnSlug}::${swimlaneSlug}`.
|
|
6
|
+
* This format must not appear in item slugs.
|
|
7
|
+
*/
|
|
8
|
+
export const CELL_ID_SEPARATOR = '::';
|
|
9
|
+
export function encodeCellId(columnSlug, swimlaneSlug) {
|
|
10
|
+
return `${columnSlug}${CELL_ID_SEPARATOR}${swimlaneSlug}`;
|
|
11
|
+
}
|
|
12
|
+
export function decodeCellId(cellId) {
|
|
13
|
+
const idx = cellId.indexOf(CELL_ID_SEPARATOR);
|
|
14
|
+
if (idx === -1)
|
|
15
|
+
return null;
|
|
16
|
+
const columnSlug = cellId.slice(0, idx);
|
|
17
|
+
const swimlaneSlug = cellId.slice(idx + CELL_ID_SEPARATOR.length);
|
|
18
|
+
if (!columnSlug || !swimlaneSlug)
|
|
19
|
+
return null;
|
|
20
|
+
return { columnSlug, swimlaneSlug };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=dragTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dragTypes.js","sourceRoot":"","sources":["../../../src/board/dnd/dragTypes.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAkB9E;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,YAAoB;IACnE,OAAO,GAAG,UAAU,GAAG,iBAAiB,GAAG,YAAY,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Board, Axis, Cell, FilterRule, Mutation, Item } from '@awesome-markdown/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Build the combined cell filter (board ∧ column ∧ swimlane).
|
|
4
|
+
* Returns undefined when all three are absent (match-all).
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildCellFilter(board: Board, col: Axis, sl: Axis): FilterRule | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Apply a drag-drop move to a local copy of the cells array.
|
|
9
|
+
* Handles both cross-cell moves and same-cell reorders.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyOptimisticMove(cells: Cell[], item: Item, srcColumnSlug: string, srcSwimlaneSlug: string, dstColumnSlug: string, dstSwimlaneSlug: string, insertBeforeSlug: string | null): Cell[];
|
|
12
|
+
export interface DropMutations {
|
|
13
|
+
mutations: Mutation[];
|
|
14
|
+
type: 'move' | 'reorder';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compute the mutation list for a drag-drop action.
|
|
18
|
+
*
|
|
19
|
+
* Returns null when the destination cell is read-only or when
|
|
20
|
+
* deriveMutations returns `{ readonly: true }` as a belt-and-suspenders check.
|
|
21
|
+
*
|
|
22
|
+
* One drop = one PATCH. Cross-cell placement uses the bound destination
|
|
23
|
+
* rules. Reordering writes only the selected configured ascending string
|
|
24
|
+
* sort target; no implicit membership or per-board order field is invented.
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeDropMutations(params: {
|
|
27
|
+
itemSlug: string;
|
|
28
|
+
srcCell: Cell;
|
|
29
|
+
dstCell: Cell;
|
|
30
|
+
colAxis: Axis;
|
|
31
|
+
slAxis: Axis;
|
|
32
|
+
board: Board;
|
|
33
|
+
insertBeforeSlug: string | null;
|
|
34
|
+
}): DropMutations | null;
|
|
35
|
+
//# sourceMappingURL=mutateDragDrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutateDragDrop.d.ts","sourceRoot":"","sources":["../../../src/board/dnd/mutateDragDrop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAajG;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAEzF;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,IAAI,EAAE,CAyBR;AAMD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GAAG,aAAa,GAAG,IAAI,CAoDvB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { cellFilter, cellMutations, keyBetween, resolvePath, substitutePath, } from '@awesome-markdown/filter-engine';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Filter composition
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Build the combined cell filter (board ∧ column ∧ swimlane).
|
|
7
|
+
* Returns undefined when all three are absent (match-all).
|
|
8
|
+
*/
|
|
9
|
+
export function buildCellFilter(board, col, sl) {
|
|
10
|
+
return cellFilter(board, col, sl);
|
|
11
|
+
}
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Optimistic cell reordering helper
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Apply a drag-drop move to a local copy of the cells array.
|
|
17
|
+
* Handles both cross-cell moves and same-cell reorders.
|
|
18
|
+
*/
|
|
19
|
+
export function applyOptimisticMove(cells, item, srcColumnSlug, srcSwimlaneSlug, dstColumnSlug, dstSwimlaneSlug, insertBeforeSlug) {
|
|
20
|
+
return cells.map((cell) => {
|
|
21
|
+
const isDst = cell.columnSlug === dstColumnSlug && cell.swimlaneSlug === dstSwimlaneSlug;
|
|
22
|
+
const isSrc = cell.columnSlug === srcColumnSlug && cell.swimlaneSlug === srcSwimlaneSlug;
|
|
23
|
+
if (!isDst && !isSrc)
|
|
24
|
+
return cell;
|
|
25
|
+
// Remove item from its current position (handles both src and dst sides)
|
|
26
|
+
const withoutItem = cell.items.filter((i) => i.slug !== item.slug);
|
|
27
|
+
if (isDst) {
|
|
28
|
+
if (insertBeforeSlug === null) {
|
|
29
|
+
return { ...cell, items: [...withoutItem, item] };
|
|
30
|
+
}
|
|
31
|
+
const idx = withoutItem.findIndex((i) => i.slug === insertBeforeSlug);
|
|
32
|
+
const insertAt = idx >= 0 ? idx : withoutItem.length;
|
|
33
|
+
return {
|
|
34
|
+
...cell,
|
|
35
|
+
items: [...withoutItem.slice(0, insertAt), item, ...withoutItem.slice(insertAt)],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// isSrc only (cross-cell move source cleanup)
|
|
39
|
+
return { ...cell, items: withoutItem };
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compute the mutation list for a drag-drop action.
|
|
44
|
+
*
|
|
45
|
+
* Returns null when the destination cell is read-only or when
|
|
46
|
+
* deriveMutations returns `{ readonly: true }` as a belt-and-suspenders check.
|
|
47
|
+
*
|
|
48
|
+
* One drop = one PATCH. Cross-cell placement uses the bound destination
|
|
49
|
+
* rules. Reordering writes only the selected configured ascending string
|
|
50
|
+
* sort target; no implicit membership or per-board order field is invented.
|
|
51
|
+
*/
|
|
52
|
+
export function computeDropMutations(params) {
|
|
53
|
+
const { itemSlug, srcCell, dstCell, colAxis, slAxis, board, insertBeforeSlug } = params;
|
|
54
|
+
if (dstCell.readOnly)
|
|
55
|
+
return null;
|
|
56
|
+
const result = cellMutations(board, colAxis, slAxis);
|
|
57
|
+
if (!Array.isArray(result))
|
|
58
|
+
return null; // ReadOnly from deriveMutations
|
|
59
|
+
// Determine insert position in the destination cell (excluding the moved item)
|
|
60
|
+
const dstItemsWithoutMoved = dstCell.items.filter((i) => i.slug !== itemSlug);
|
|
61
|
+
const rawIdx = insertBeforeSlug === null
|
|
62
|
+
? -1
|
|
63
|
+
: dstItemsWithoutMoved.findIndex((i) => i.slug === insertBeforeSlug);
|
|
64
|
+
const insertAt = rawIdx >= 0 ? rawIdx : dstItemsWithoutMoved.length;
|
|
65
|
+
const prevItem = dstItemsWithoutMoved[insertAt - 1] ?? null;
|
|
66
|
+
const nextItem = dstItemsWithoutMoved[insertAt] ?? null;
|
|
67
|
+
const isReorder = srcCell.columnSlug === dstCell.columnSlug && srcCell.swimlaneSlug === dstCell.swimlaneSlug;
|
|
68
|
+
const order = colAxis.order ?? slAxis.order;
|
|
69
|
+
const ctx = { board: board.slug, axis: colAxis.order ? colAxis.slug : slAxis.slug };
|
|
70
|
+
const prevOrder = prevItem && order ? resolvePath(order.by, prevItem, ctx) : undefined;
|
|
71
|
+
const nextOrder = nextItem && order ? resolvePath(order.by, nextItem, ctx) : undefined;
|
|
72
|
+
const moving = srcCell.items.find((item) => item.slug === itemSlug);
|
|
73
|
+
const currentOrder = moving && order ? resolvePath(order.by, moving, ctx) : undefined;
|
|
74
|
+
const fractional = (value) => typeof value === 'string' && /^[0-9A-Za-z]+$/.test(value);
|
|
75
|
+
const compatible = order?.direction === 'asc' &&
|
|
76
|
+
(currentOrder === undefined || fractional(currentOrder)) &&
|
|
77
|
+
(!prevItem || fractional(prevOrder)) &&
|
|
78
|
+
(!nextItem || fractional(nextOrder));
|
|
79
|
+
let orderWrites = [];
|
|
80
|
+
if (compatible && order) {
|
|
81
|
+
try {
|
|
82
|
+
const key = keyBetween(prevOrder, nextOrder);
|
|
83
|
+
if ((typeof prevOrder !== 'string' || prevOrder < key) &&
|
|
84
|
+
(typeof nextOrder !== 'string' || key < nextOrder)) {
|
|
85
|
+
orderWrites = [{ op: 'set', path: substitutePath(order.by, ctx), value: key }];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* Invalid fractional neighbors disable manual ordering, not cross-cell placement. */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (isReorder && orderWrites.length === 0)
|
|
93
|
+
return null;
|
|
94
|
+
const mutations = isReorder ? orderWrites : [...result, ...orderWrites];
|
|
95
|
+
return mutations.length ? { mutations, type: isReorder ? 'reorder' : 'move' } : null;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=mutateDragDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutateDragDrop.js","sourceRoot":"","sources":["../../../src/board/dnd/mutateDragDrop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DragEndEvent } from '@dnd-kit/core';
|
|
2
|
+
import type { Cell } from '@awesome-markdown/contracts';
|
|
3
|
+
export type DropAction = {
|
|
4
|
+
type: 'noop';
|
|
5
|
+
} | {
|
|
6
|
+
type: 'drop';
|
|
7
|
+
itemSlug: string;
|
|
8
|
+
srcColumnSlug: string;
|
|
9
|
+
srcSwimlaneSlug: string;
|
|
10
|
+
dstColumnSlug: string;
|
|
11
|
+
dstSwimlaneSlug: string;
|
|
12
|
+
/**
|
|
13
|
+
* Slug of the item to insert before, or null to insert at end of cell.
|
|
14
|
+
* When src === dst this is a same-cell reorder.
|
|
15
|
+
*/
|
|
16
|
+
insertBeforeSlug: string | null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Pure function: translates a @dnd-kit DragEndEvent into a drop action.
|
|
20
|
+
* Uses `cells` to locate which cell an item belongs to.
|
|
21
|
+
* No React, no provider calls — fully testable in isolation.
|
|
22
|
+
*/
|
|
23
|
+
export declare function onDragEnd(event: DragEndEvent, cells: Cell[]): DropAction;
|
|
24
|
+
//# sourceMappingURL=onDragEnd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onDragEnd.d.ts","sourceRoot":"","sources":["../../../src/board/dnd/onDragEnd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAQxD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEN;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,CAwCxE"}
|