@awesome-markdown/board-ui 0.0.0-stage → 1.6.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 +166 -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 +145 -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 +36 -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 +104 -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 +37 -0
- package/dist/board/dnd/mutateDragDrop.d.ts.map +1 -0
- package/dist/board/dnd/mutateDragDrop.js +116 -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 +35 -0
- package/dist/board/layout/AxisBehavior.d.ts.map +1 -0
- package/dist/board/layout/AxisBehavior.js +82 -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 +110 -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/BoardAssigneeField.d.ts +10 -0
- package/dist/components/BoardAssigneeField.d.ts.map +1 -0
- package/dist/components/BoardAssigneeField.js +37 -0
- package/dist/components/BoardAssigneeField.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/DeleteItemConfirmDialog.d.ts +14 -0
- package/dist/components/DeleteItemConfirmDialog.d.ts.map +1 -0
- package/dist/components/DeleteItemConfirmDialog.js +46 -0
- package/dist/components/DeleteItemConfirmDialog.js.map +1 -0
- package/dist/components/ItemEditorActions.d.ts +15 -0
- package/dist/components/ItemEditorActions.d.ts.map +1 -0
- package/dist/components/ItemEditorActions.js +48 -0
- package/dist/components/ItemEditorActions.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 +5 -0
- package/dist/lib/item-board.d.ts.map +1 -0
- package/dist/lib/item-board.js +14 -0
- package/dist/lib/item-board.js.map +1 -0
- package/dist/lib/property-display.d.ts +18 -0
- package/dist/lib/property-display.d.ts.map +1 -0
- package/dist/lib/property-display.js +81 -0
- package/dist/lib/property-display.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 +255 -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 +58 -3
- package/styles.css +232 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { decodeCellId } from './dragTypes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure function: translates a @dnd-kit DragEndEvent into a drop action.
|
|
4
|
+
* Uses `cells` to locate which cell an item belongs to.
|
|
5
|
+
* No React, no provider calls — fully testable in isolation.
|
|
6
|
+
*/
|
|
7
|
+
export function onDragEnd(event, cells) {
|
|
8
|
+
const { active, over } = event;
|
|
9
|
+
if (!over)
|
|
10
|
+
return { type: 'noop' };
|
|
11
|
+
if (active.id === over.id)
|
|
12
|
+
return { type: 'noop' };
|
|
13
|
+
const activeData = active.data.current;
|
|
14
|
+
if (!activeData || activeData.type !== 'item')
|
|
15
|
+
return { type: 'noop' };
|
|
16
|
+
const { columnSlug: srcColumnSlug, swimlaneSlug: srcSwimlaneSlug, itemSlug } = activeData;
|
|
17
|
+
const overId = String(over.id);
|
|
18
|
+
let dstColumnSlug;
|
|
19
|
+
let dstSwimlaneSlug;
|
|
20
|
+
let insertBeforeSlug;
|
|
21
|
+
const cellDecoded = decodeCellId(overId);
|
|
22
|
+
if (cellDecoded) {
|
|
23
|
+
// Dropped directly on a cell container (empty cell or cell border)
|
|
24
|
+
dstColumnSlug = cellDecoded.columnSlug;
|
|
25
|
+
dstSwimlaneSlug = cellDecoded.swimlaneSlug;
|
|
26
|
+
insertBeforeSlug = null;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Dropped on another item — find which cell that item belongs to
|
|
30
|
+
const dstCell = cells.find((c) => c.items.some((i) => i.slug === overId));
|
|
31
|
+
if (!dstCell)
|
|
32
|
+
return { type: 'noop' };
|
|
33
|
+
dstColumnSlug = dstCell.columnSlug;
|
|
34
|
+
dstSwimlaneSlug = dstCell.swimlaneSlug;
|
|
35
|
+
insertBeforeSlug = overId;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
type: 'drop',
|
|
39
|
+
itemSlug,
|
|
40
|
+
srcColumnSlug,
|
|
41
|
+
srcSwimlaneSlug,
|
|
42
|
+
dstColumnSlug,
|
|
43
|
+
dstSwimlaneSlug,
|
|
44
|
+
insertBeforeSlug,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=onDragEnd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onDragEnd.js","sourceRoot":"","sources":["../../../src/board/dnd/onDragEnd.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAsB9C;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAmB,EAAE,KAAa;IAC1D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAE/B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEnD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAmC,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEvE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE/B,IAAI,aAAqB,CAAC;IAC1B,IAAI,eAAuB,CAAC;IAC5B,IAAI,gBAA+B,CAAC;IAEpC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,WAAW,EAAE,CAAC;QAChB,mEAAmE;QACnE,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC;QACvC,eAAe,GAAG,WAAW,CAAC,YAAY,CAAC;QAC3C,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACtC,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;QACnC,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;QACvC,gBAAgB,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,QAAQ;QACR,aAAa;QACb,eAAe;QACf,aAAa;QACb,eAAe;QACf,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AxisOrder, FilterRule, Mutation, WriteOnDrop } from '@awesome-markdown/contracts';
|
|
3
|
+
export interface OrderDraft {
|
|
4
|
+
mode: 'manual' | 'property' | 'updated';
|
|
5
|
+
by: string;
|
|
6
|
+
direction: AxisOrder['direction'];
|
|
7
|
+
}
|
|
8
|
+
export declare function toOrderDraft(order: AxisOrder | undefined): OrderDraft;
|
|
9
|
+
export declare function fromOrderDraft(d: OrderDraft): AxisOrder | null;
|
|
10
|
+
export declare function OrderEditor({ draft, boardSlug, onChange, }: {
|
|
11
|
+
draft: OrderDraft;
|
|
12
|
+
boardSlug: string;
|
|
13
|
+
onChange: (d: OrderDraft) => void;
|
|
14
|
+
}): React.ReactElement;
|
|
15
|
+
type WriteOp = Mutation['op'];
|
|
16
|
+
export interface WriteDraft {
|
|
17
|
+
op: WriteOp;
|
|
18
|
+
path: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DropDraft {
|
|
22
|
+
mode: 'auto' | 'custom' | 'readonly';
|
|
23
|
+
writes: WriteDraft[];
|
|
24
|
+
}
|
|
25
|
+
export declare function toDropDraft(wod: WriteOnDrop | undefined): DropDraft;
|
|
26
|
+
export declare function fromDropDraft(d: DropDraft): WriteOnDrop | null;
|
|
27
|
+
export declare function DropEditor({ draft, filter, boardSlug, noun, onChange, }: {
|
|
28
|
+
draft: DropDraft;
|
|
29
|
+
filter: FilterRule | undefined;
|
|
30
|
+
boardSlug: string;
|
|
31
|
+
noun: string;
|
|
32
|
+
onChange: (d: DropDraft) => void;
|
|
33
|
+
}): React.ReactElement;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=AxisBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxisBehavior.d.ts","sourceRoot":"","sources":["../../../src/board/layout/AxisBehavior.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAShG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;CACnC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAIrE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAK9D;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACnC,GAAG,KAAK,CAAC,YAAY,CA6CrB;AAMD,KAAK,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE9B,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrC,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAWnE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,IAAI,CAW9D;AAMD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CAClC,GAAG,KAAK,CAAC,YAAY,CAgHrB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { analyzeInvertibility, deriveMutations } from '@awesome-markdown/filter-engine';
|
|
4
|
+
import { MANUAL_ORDER } from './axis-defaults.js';
|
|
5
|
+
import { Segmented } from './Drawer.js';
|
|
6
|
+
export function toOrderDraft(order) {
|
|
7
|
+
if (!order)
|
|
8
|
+
return { mode: 'updated', by: '', direction: 'asc' };
|
|
9
|
+
if (order.by === MANUAL_ORDER.by)
|
|
10
|
+
return { mode: 'manual', by: '', direction: 'asc' };
|
|
11
|
+
return { mode: 'property', by: order.by, direction: order.direction };
|
|
12
|
+
}
|
|
13
|
+
export function fromOrderDraft(d) {
|
|
14
|
+
if (d.mode === 'manual')
|
|
15
|
+
return MANUAL_ORDER;
|
|
16
|
+
if (d.mode === 'property' && d.by.trim() !== '')
|
|
17
|
+
return { by: d.by.trim(), direction: d.direction };
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function OrderEditor({ draft, boardSlug, onChange, }) {
|
|
21
|
+
return (_jsxs(_Fragment, { children: [_jsx(Segmented, { value: draft.mode, testId: "axis-order-mode", options: [
|
|
22
|
+
['manual', 'Manual'],
|
|
23
|
+
['property', 'By property'],
|
|
24
|
+
['updated', 'Recently updated'],
|
|
25
|
+
], onChange: (mode) => onChange({ ...draft, mode, by: draft.by || 'priority' }) }), draft.mode === 'manual' && (_jsxs("p", { className: "help", children: ["Cards stay where you drag them. Positions are stored per board as", ' ', _jsxs("code", { children: ["boards.", boardSlug, ".order"] }), "."] })), draft.mode === 'property' && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex gap-2 items-center", children: [_jsx("input", { className: "input flex-1", "aria-label": "Sort property", value: draft.by, onChange: (e) => onChange({ ...draft, by: e.target.value }) }), _jsx(Segmented, { value: draft.direction, options: [
|
|
26
|
+
['asc', '↑ asc'],
|
|
27
|
+
['desc', '↓ desc'],
|
|
28
|
+
], onChange: (direction) => onChange({ ...draft, direction }) })] }), _jsx("p", { className: "help", children: "Values compare as text or numbers. Dragging to reorder has no effect while sorted." })] })), draft.mode === 'updated' && _jsx("p", { className: "help", children: "Most recently updated cards first." })] }));
|
|
29
|
+
}
|
|
30
|
+
export function toDropDraft(wod) {
|
|
31
|
+
if (!wod)
|
|
32
|
+
return { mode: 'auto', writes: [] };
|
|
33
|
+
if (!Array.isArray(wod))
|
|
34
|
+
return { mode: 'readonly', writes: [] };
|
|
35
|
+
return {
|
|
36
|
+
mode: 'custom',
|
|
37
|
+
writes: wod.map((m) => ({
|
|
38
|
+
op: m.op,
|
|
39
|
+
path: m.path,
|
|
40
|
+
value: 'value' in m ? String(m.value ?? '') : '',
|
|
41
|
+
})),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function fromDropDraft(d) {
|
|
45
|
+
if (d.mode === 'readonly')
|
|
46
|
+
return { readonly: true };
|
|
47
|
+
if (d.mode === 'auto')
|
|
48
|
+
return null;
|
|
49
|
+
const writes = d.writes
|
|
50
|
+
.filter((w) => w.path.trim() !== '')
|
|
51
|
+
.map((w) => w.op === 'delete'
|
|
52
|
+
? { op: 'delete', path: w.path.trim() }
|
|
53
|
+
: { op: w.op, path: w.path.trim(), value: w.value });
|
|
54
|
+
return writes.length > 0 ? writes : null;
|
|
55
|
+
}
|
|
56
|
+
function describe(m) {
|
|
57
|
+
return m.op === 'delete' ? `delete ${m.path}` : `${m.op} ${m.path}: ${String(m.value)}`;
|
|
58
|
+
}
|
|
59
|
+
export function DropEditor({ draft, filter, boardSlug, noun, onChange, }) {
|
|
60
|
+
const derived = deriveMutations(filter, { board: boardSlug });
|
|
61
|
+
const setWrite = (i, patch) => onChange({ ...draft, writes: draft.writes.map((w, j) => (j === i ? { ...w, ...patch } : w)) });
|
|
62
|
+
const switchMode = (mode) => {
|
|
63
|
+
const seeded = Array.isArray(derived)
|
|
64
|
+
? toDropDraft(derived.length > 0 ? derived : undefined).writes
|
|
65
|
+
: [];
|
|
66
|
+
const writes = draft.writes.length > 0 ? draft.writes : seeded;
|
|
67
|
+
onChange({
|
|
68
|
+
mode,
|
|
69
|
+
writes: mode === 'custom' && writes.length === 0 ? [{ op: 'set', path: '', value: '' }] : writes,
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
return (_jsxs(_Fragment, { children: [_jsx(Segmented, { value: draft.mode, testId: "axis-drop-mode", options: [
|
|
73
|
+
['auto', 'Automatic'],
|
|
74
|
+
['custom', 'Custom writes'],
|
|
75
|
+
['readonly', 'Read-only'],
|
|
76
|
+
], onChange: switchMode }), draft.mode === 'auto' &&
|
|
77
|
+
(Array.isArray(derived) ? (_jsxs("p", { className: "help", children: ["Worked out from the filter:", ' ', _jsx("code", { children: derived.map(describe).join(', ') || 'no change' })] })) : (_jsxs("p", { className: "warn", children: ["Can't work out what to write (", filter ? analyzeInvertibility(filter).reasons.join('; ') : '', "). Cards can't be dropped in this ", noun, " until you choose custom writes."] }))), draft.mode === 'custom' && (_jsxs(_Fragment, { children: [draft.writes.map((w, i) => (_jsxs("div", { className: "write-row", children: [_jsx("select", { className: "input", "aria-label": "Operation", value: w.op, onChange: (e) => setWrite(i, { op: e.target.value }), children: ['set', 'append', 'remove', 'delete'].map((op) => (_jsx("option", { value: op, children: op }, op))) }), _jsx("input", { className: "input", placeholder: "property", "aria-label": "Write property", value: w.path, onChange: (e) => setWrite(i, { path: e.target.value }) }), w.op === 'delete' ? (_jsx("span", {})) : (_jsx("input", { className: "input", placeholder: "value", "aria-label": "Write value", value: w.value, onChange: (e) => setWrite(i, { value: e.target.value }) })), _jsx("button", { type: "button", className: "icon-btn", "aria-label": "Remove write", onClick: () => onChange({ ...draft, writes: draft.writes.filter((_, j) => j !== i) }), children: "\u2715" })] }, i))), _jsx("div", { children: _jsx("button", { type: "button", className: "link-btn", onClick: () => onChange({
|
|
78
|
+
...draft,
|
|
79
|
+
writes: [...draft.writes, { op: 'set', path: '', value: '' }],
|
|
80
|
+
}), children: "+ write" }) }), _jsx("p", { className: "help", children: "Replaces the automatic writes. A dropped card should end up matching the filter." })] })), draft.mode === 'readonly' && (_jsxs("p", { className: "help", children: ["Cards can't be dropped into this ", noun, "."] }))] }));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=AxisBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxisBehavior.js","sourceRoot":"","sources":["../../../src/board/layout/AxisBehavior.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Axis, PatchAxisRequest } from '@awesome-markdown/contracts';
|
|
3
|
+
import type { AxisDim } from './axis-defaults.js';
|
|
4
|
+
import type { AxisUsage } from './useBoardLayout.js';
|
|
5
|
+
interface AxisDrawerProps {
|
|
6
|
+
axis: Axis;
|
|
7
|
+
dim: AxisDim;
|
|
8
|
+
boardSlug: string;
|
|
9
|
+
usage: AxisUsage[];
|
|
10
|
+
onSave: (patch: PatchAxisRequest) => Promise<boolean>;
|
|
11
|
+
onRemove: () => Promise<boolean>;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
}
|
|
14
|
+
/** Detailed settings for one column / swimlane: title, filter, card order and drop behaviour. */
|
|
15
|
+
export declare function AxisDrawer({ axis, dim, boardSlug, usage, onSave, onRemove, onClose, }: AxisDrawerProps): React.ReactElement;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=AxisDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxisDrawer.d.ts","sourceRoot":"","sources":["../../../src/board/layout/AxisDrawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAa1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,GAAG,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,GACR,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAkItC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { Drawer } from './Drawer.js';
|
|
4
|
+
import { FilterEditor } from './FilterEditor.js';
|
|
5
|
+
import { fromDraft, toDraft, filterSummary } from './filter-draft.js';
|
|
6
|
+
import { DropEditor, OrderEditor, fromDropDraft, fromOrderDraft, toDropDraft, toOrderDraft, } from './AxisBehavior.js';
|
|
7
|
+
/** Detailed settings for one column / swimlane: title, filter, card order and drop behaviour. */
|
|
8
|
+
export function AxisDrawer({ axis, dim, boardSlug, usage, onSave, onRemove, onClose, }) {
|
|
9
|
+
const noun = dim === 'columns' ? 'column' : 'swimlane';
|
|
10
|
+
const [title, setTitle] = useState(axis.title);
|
|
11
|
+
const [filter, setFilter] = useState(() => toDraft(axis.filter));
|
|
12
|
+
const [order, setOrder] = useState(() => toOrderDraft(axis.order));
|
|
13
|
+
const [drop, setDrop] = useState(() => toDropDraft(axis.writeOnDrop));
|
|
14
|
+
const [busy, setBusy] = useState(false);
|
|
15
|
+
const rule = filter ? fromDraft(filter) : axis.filter;
|
|
16
|
+
const save = async () => {
|
|
17
|
+
const patch = {
|
|
18
|
+
title: title.trim() || axis.title,
|
|
19
|
+
writeOnDrop: fromDropDraft(drop),
|
|
20
|
+
};
|
|
21
|
+
if (filter)
|
|
22
|
+
patch.filter = rule ?? null;
|
|
23
|
+
if (dim === 'columns')
|
|
24
|
+
patch.order = fromOrderDraft(order);
|
|
25
|
+
setBusy(true);
|
|
26
|
+
const ok = await onSave(patch);
|
|
27
|
+
setBusy(false);
|
|
28
|
+
if (ok)
|
|
29
|
+
onClose();
|
|
30
|
+
};
|
|
31
|
+
const remove = async () => {
|
|
32
|
+
setBusy(true);
|
|
33
|
+
if (await onRemove())
|
|
34
|
+
onClose();
|
|
35
|
+
else
|
|
36
|
+
setBusy(false);
|
|
37
|
+
};
|
|
38
|
+
return (_jsxs(Drawer, { kind: noun, title: axis.title, testId: "axis-drawer", onClose: onClose, children: [axis.synthetic ? (_jsxs("p", { className: "warn", children: ["No axis file exists for ", _jsx("code", { children: axis.slug }), ", so there is nothing to configure. Remove it from the board or add ", _jsxs("code", { children: [axis.slug, ".md"] }), " to the content folder."] })) : (_jsxs(_Fragment, { children: [usage.length > 0 && (_jsxs("p", { className: "notice", "data-testid": "axis-shared-notice", children: ["Shared: also used on", ' ', usage.map((u, i) => (_jsxs(React.Fragment, { children: [i > 0 && ', ', _jsx("code", { children: u.board }), " as a ", u.dim === 'columns' ? 'column' : 'swimlane'] }, `${u.board}-${u.dim}`))), ". Changes here apply there too."] })), _jsxs("label", { className: "field", children: [_jsxs("span", { className: "field-label", children: ["title \u00B7 content/", axis.slug, ".md"] }), _jsx("input", { className: "input input-sans", value: title, onChange: (e) => setTitle(e.target.value), "data-testid": "axis-title-input" })] }), _jsxs("section", { className: "drawer-section", children: [_jsx("h4", { children: "Filter" }), _jsxs("p", { className: "help", children: ["A card appears in this ", noun, " when it matches:"] }), filter ? (_jsx(FilterEditor, { draft: filter, onChange: setFilter, emptyText: `No conditions — every card on the board appears in this ${noun}.`, testId: "axis-filter-editor" })) : (_jsxs("p", { className: "warn", children: ["This filter uses nested groups (", _jsx("code", { children: filterSummary(axis.filter) }), "). Edit it in ", _jsxs("code", { children: [axis.slug, ".md"] }), "."] }))] }), _jsxs("section", { className: "drawer-section", children: [_jsx("h4", { children: "Card order" }), dim === 'columns' ? (_jsx(OrderEditor, { draft: order, boardSlug: boardSlug, onChange: setOrder })) : (_jsx("p", { className: "help", children: "Swimlanes don't sort cards \u2014 each cell uses its column's order." }))] }), _jsxs("section", { className: "drawer-section", children: [_jsx("h4", { children: "When a card is dropped here" }), _jsx(DropEditor, { draft: drop, filter: rule, boardSlug: boardSlug, noun: noun, onChange: setDrop })] })] })), _jsxs("div", { className: "drawer-footer", children: [_jsx("button", { type: "button", className: "link-btn", disabled: busy, onClick: () => void remove(), "data-testid": "axis-remove", children: "Remove from board" }), _jsx("span", { className: "help", style: { fontSize: '11px' }, children: "the axis file is kept" }), !axis.synthetic && (_jsx("button", { type: "button", className: "btn btn-primary", style: { marginLeft: 'auto' }, disabled: busy, onClick: () => void save(), "data-testid": "axis-save", children: busy ? 'saving…' : 'Save' }))] })] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=AxisDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxisDrawer.js","sourceRoot":"","sources":["../../../src/board/layout/AxisDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Board, PatchBoardRequest } from '@awesome-markdown/contracts';
|
|
3
|
+
interface BoardDrawerProps {
|
|
4
|
+
board: Board;
|
|
5
|
+
onSave: (patch: PatchBoardRequest) => Promise<boolean>;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
}
|
|
8
|
+
/** Board title, description and the candidate-set filter (which cards can appear at all). */
|
|
9
|
+
export declare function BoardDrawer({ board, onSave, onClose }: BoardDrawerProps): React.ReactElement;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=BoardDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoardDrawer.d.ts","sourceRoot":"","sources":["../../../src/board/layout/BoardDrawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAM5E,UAAU,gBAAgB;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAyE5F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { Drawer } from './Drawer.js';
|
|
4
|
+
import { FilterEditor } from './FilterEditor.js';
|
|
5
|
+
import { fromDraft, toDraft, filterSummary } from './filter-draft.js';
|
|
6
|
+
/** Board title, description and the candidate-set filter (which cards can appear at all). */
|
|
7
|
+
export function BoardDrawer({ board, onSave, onClose }) {
|
|
8
|
+
const [title, setTitle] = useState(board.title);
|
|
9
|
+
const [description, setDescription] = useState(board.description ?? '');
|
|
10
|
+
const [filter, setFilter] = useState(() => toDraft(board.filter));
|
|
11
|
+
const [busy, setBusy] = useState(false);
|
|
12
|
+
const save = async () => {
|
|
13
|
+
const patch = {
|
|
14
|
+
title: title.trim() || board.title,
|
|
15
|
+
description: description.trim() || null,
|
|
16
|
+
};
|
|
17
|
+
if (filter)
|
|
18
|
+
patch.filter = fromDraft(filter) ?? null;
|
|
19
|
+
setBusy(true);
|
|
20
|
+
const ok = await onSave(patch);
|
|
21
|
+
setBusy(false);
|
|
22
|
+
if (ok)
|
|
23
|
+
onClose();
|
|
24
|
+
};
|
|
25
|
+
return (_jsxs(Drawer, { kind: "board", title: board.title, testId: "board-drawer", onClose: onClose, children: [_jsxs("label", { className: "field", children: [_jsxs("span", { className: "field-label", children: ["title \u00B7 content/", board.slug, ".md"] }), _jsx("input", { className: "input input-sans", value: title, onChange: (e) => setTitle(e.target.value), "data-testid": "board-title-input" })] }), _jsxs("label", { className: "field", children: [_jsx("span", { className: "field-label", children: "description" }), _jsx("input", { className: "input input-sans", value: description, onChange: (e) => setDescription(e.target.value) })] }), _jsxs("section", { className: "drawer-section", children: [_jsx("h4", { children: "Cards on this board" }), _jsx("p", { className: "help", children: "Only cards matching these conditions appear. Columns and swimlanes then sort them into cells." }), filter ? (_jsx(FilterEditor, { draft: filter, onChange: setFilter, emptyText: "No conditions \u2014 every item is eligible.", testId: "board-filter-editor" })) : (_jsxs("p", { className: "warn", children: ["This filter uses nested groups (", _jsx("code", { children: filterSummary(board.filter) }), "). Edit it in", ' ', _jsxs("code", { children: [board.slug, ".md"] }), "."] }))] }), _jsx("div", { className: "drawer-footer", children: _jsx("button", { type: "button", className: "btn btn-primary", style: { marginLeft: 'auto' }, disabled: busy, onClick: () => void save(), "data-testid": "board-save", children: busy ? 'saving…' : 'Save' }) })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=BoardDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoardDrawer.js","sourceRoot":"","sources":["../../../src/board/layout/BoardDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface DrawerProps {
|
|
3
|
+
kind: string;
|
|
4
|
+
title: string;
|
|
5
|
+
testId: string;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** Right-hand settings panel; Escape closes it. */
|
|
10
|
+
export declare function Drawer({ kind, title, testId, onClose, children, }: DrawerProps): React.ReactElement;
|
|
11
|
+
interface SegmentedProps<T extends string> {
|
|
12
|
+
value: T;
|
|
13
|
+
options: ReadonlyArray<[T, string]>;
|
|
14
|
+
onChange: (value: T) => void;
|
|
15
|
+
testId?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function Segmented<T extends string>({ value, options, onChange, testId, }: SegmentedProps<T>): React.ReactElement;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=Drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../src/board/layout/Drawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,GACT,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA2BlC;AAED,UAAU,cAAc,CAAC,CAAC,SAAS,MAAM;IACvC,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,GACP,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAgBxC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useEffect } from 'react';
|
|
3
|
+
/** Right-hand settings panel; Escape closes it. */
|
|
4
|
+
export function Drawer({ kind, title, testId, onClose, children, }) {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
const onKey = (e) => {
|
|
7
|
+
if (e.key === 'Escape')
|
|
8
|
+
onClose();
|
|
9
|
+
};
|
|
10
|
+
window.addEventListener('keydown', onKey);
|
|
11
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
12
|
+
}, [onClose]);
|
|
13
|
+
return (_jsxs("aside", { className: "drawer", role: "dialog", "aria-label": `${kind} settings`, "data-testid": testId, children: [_jsxs("div", { className: "drawer-header", children: [_jsx("span", { className: "drawer-kind", children: kind }), _jsx("h3", { children: title }), _jsx("button", { type: "button", className: "icon-btn", style: { marginLeft: 'auto' }, "aria-label": "Close", onClick: onClose, children: "\u2715" })] }), _jsx("div", { className: "drawer-body", children: children })] }));
|
|
14
|
+
}
|
|
15
|
+
export function Segmented({ value, options, onChange, testId, }) {
|
|
16
|
+
return (_jsx("div", { className: "segs", role: "group", "data-testid": testId, children: options.map(([v, label]) => (_jsx("button", { type: "button", className: "seg", "aria-pressed": v === value, onClick: () => onChange(v), children: label }, v))) }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","sourceRoot":"","sources":["../../../src/board/layout/Drawer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUzC,mDAAmD;AACnD,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,GACI;IACZ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAQ,EAAE;YACvC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,iBAAO,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,QAAQ,gBAAa,GAAG,IAAI,WAAW,iBAAe,MAAM,aACzF,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAM,SAAS,EAAC,aAAa,YAAE,IAAI,GAAQ,EAC3C,uBAAK,KAAK,GAAM,EAChB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,UAAU,EACpB,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,gBAClB,OAAO,EAClB,OAAO,EAAE,OAAO,uBAGT,IACL,EACN,cAAK,SAAS,EAAC,aAAa,YAAE,QAAQ,GAAO,IACvC,CACT,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,SAAS,CAAmB,EAC1C,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,GACY;IAClB,OAAO,CACL,cAAK,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,iBAAc,MAAM,YACnD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC3B,iBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,KAAK,kBACD,CAAC,KAAK,KAAK,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAEzB,KAAK,IAND,CAAC,CAOC,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FilterDraft } from './filter-draft.js';
|
|
3
|
+
interface FilterEditorProps {
|
|
4
|
+
draft: FilterDraft;
|
|
5
|
+
onChange: (draft: FilterDraft) => void;
|
|
6
|
+
emptyText: string;
|
|
7
|
+
testId: string;
|
|
8
|
+
}
|
|
9
|
+
/** Flat condition builder: property / operator / value rows joined by all or any. */
|
|
10
|
+
export declare function FilterEditor({ draft, onChange, emptyText, testId, }: FilterEditorProps): React.ReactElement;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=FilterEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterEditor.d.ts","sourceRoot":"","sources":["../../../src/board/layout/FilterEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAExE,UAAU,iBAAiB;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,SAAS,EACT,MAAM,GACP,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA4ExC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { COND_OPS } from './filter-draft.js';
|
|
4
|
+
/** Flat condition builder: property / operator / value rows joined by all or any. */
|
|
5
|
+
export function FilterEditor({ draft, onChange, emptyText, testId, }) {
|
|
6
|
+
const setCond = (i, patch) => onChange({ ...draft, conds: draft.conds.map((c, j) => (j === i ? { ...c, ...patch } : c)) });
|
|
7
|
+
const removeCond = (i) => onChange({ ...draft, conds: draft.conds.filter((_, j) => j !== i) });
|
|
8
|
+
const addCond = () => onChange({ ...draft, conds: [...draft.conds, { property: '', op: 'equals', value: '' }] });
|
|
9
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": testId, children: [draft.conds.length > 1 && (_jsxs("label", { className: "help flex items-center gap-2", children: ["Match", _jsxs("select", { className: "input", value: draft.combinator, onChange: (e) => onChange({ ...draft, combinator: e.target.value }), children: [_jsx("option", { value: "all", children: "all" }), _jsx("option", { value: "any", children: "any" })] }), "of these conditions"] })), draft.conds.length === 0 && _jsx("p", { className: "help", children: emptyText }), draft.conds.map((c, i) => (_jsxs("div", { className: "cond-row", children: [_jsx("input", { className: "input", placeholder: "property", "aria-label": "Property", value: c.property, onChange: (e) => setCond(i, { property: e.target.value }) }), _jsx("select", { className: "input", "aria-label": "Operator", value: c.op, onChange: (e) => setCond(i, { op: e.target.value }), children: COND_OPS.map(([op, label]) => (_jsx("option", { value: op, children: label }, op))) }), c.op === 'exists' || c.op === 'missing' ? (_jsx("span", {})) : (_jsx("input", { className: "input", placeholder: c.op === 'in' ? 'a, b, c' : 'value', "aria-label": "Value", value: c.value, onChange: (e) => setCond(i, { value: e.target.value }) })), _jsx("button", { type: "button", className: "icon-btn", "aria-label": "Remove condition", onClick: () => removeCond(i), children: "\u2715" })] }, i))), _jsx("div", { children: _jsx("button", { type: "button", className: "link-btn", onClick: addCond, children: "+ condition" }) })] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=FilterEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterEditor.js","sourceRoot":"","sources":["../../../src/board/layout/FilterEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface InlineTextInputProps {
|
|
3
|
+
initial: string;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
ariaLabel: string;
|
|
6
|
+
testId?: string;
|
|
7
|
+
/** Called with the trimmed value on Enter or blur; skipped when empty. */
|
|
8
|
+
onCommit: (value: string) => void;
|
|
9
|
+
onCancel: () => void;
|
|
10
|
+
}
|
|
11
|
+
/** Autofocused single-line input that commits on Enter/blur and cancels on Escape. */
|
|
12
|
+
export declare function InlineTextInput({ initial, placeholder, ariaLabel, testId, onCommit, onCancel, }: InlineTextInputProps): React.ReactElement;
|
|
13
|
+
export declare function PencilIcon(): React.ReactElement;
|
|
14
|
+
interface AddAxisButtonProps {
|
|
15
|
+
label: 'column' | 'swimlane';
|
|
16
|
+
onAdd: (title: string) => void;
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
}
|
|
19
|
+
/** "+" that turns into a title input; Enter adds the axis with default filter and order. */
|
|
20
|
+
export declare function AddAxisButton({ label, onAdd, style }: AddAxisButtonProps): React.ReactElement;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=InlineControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineControls.d.ts","sourceRoot":"","sources":["../../../src/board/layout/InlineControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA+B3C;AAED,wBAAgB,UAAU,IAAI,KAAK,CAAC,YAAY,CAe/C;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAkC7F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
/** Autofocused single-line input that commits on Enter/blur and cancels on Escape. */
|
|
4
|
+
export function InlineTextInput({ initial, placeholder, ariaLabel, testId, onCommit, onCancel, }) {
|
|
5
|
+
const [value, setValue] = useState(initial);
|
|
6
|
+
const [done, setDone] = useState(false);
|
|
7
|
+
const finish = (commit) => {
|
|
8
|
+
if (done)
|
|
9
|
+
return;
|
|
10
|
+
setDone(true);
|
|
11
|
+
const trimmed = value.trim();
|
|
12
|
+
if (commit && trimmed !== '' && trimmed !== initial)
|
|
13
|
+
onCommit(trimmed);
|
|
14
|
+
else
|
|
15
|
+
onCancel();
|
|
16
|
+
};
|
|
17
|
+
return (_jsx("input", { className: "inline-input", autoFocus: true, value: value, placeholder: placeholder, "aria-label": ariaLabel, "data-testid": testId, onChange: (e) => setValue(e.target.value), onFocus: (e) => e.target.select(), onBlur: () => finish(true), onPointerDown: (e) => e.stopPropagation(), onKeyDown: (e) => {
|
|
18
|
+
e.stopPropagation();
|
|
19
|
+
if (e.key === 'Enter')
|
|
20
|
+
finish(true);
|
|
21
|
+
if (e.key === 'Escape')
|
|
22
|
+
finish(false);
|
|
23
|
+
} }));
|
|
24
|
+
}
|
|
25
|
+
export function PencilIcon() {
|
|
26
|
+
return (_jsxs("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", "aria-hidden": "true", children: [_jsx("path", { d: "M11 2.5l2.5 2.5L5 13.5H2.5V11z" }), _jsx("path", { d: "M9.5 4l2.5 2.5" })] }));
|
|
27
|
+
}
|
|
28
|
+
/** "+" that turns into a title input; Enter adds the axis with default filter and order. */
|
|
29
|
+
export function AddAxisButton({ label, onAdd, style }) {
|
|
30
|
+
const [editing, setEditing] = useState(false);
|
|
31
|
+
if (editing) {
|
|
32
|
+
return (_jsx("div", { style: { ...style, padding: '6px 8px', fontFamily: 'var(--font-mono)', fontSize: '11px' }, children: _jsx(InlineTextInput, { initial: "", placeholder: `${label} title`, ariaLabel: `New ${label} title`, testId: `add-${label}-input`, onCommit: (title) => {
|
|
33
|
+
setEditing(false);
|
|
34
|
+
onAdd(title);
|
|
35
|
+
}, onCancel: () => setEditing(false) }) }));
|
|
36
|
+
}
|
|
37
|
+
return (_jsx("button", { type: "button", className: "plus-btn", style: style, title: `Add ${label}`, "aria-label": `Add ${label}`, "data-testid": `add-${label}-button`, onClick: () => setEditing(true), children: "+" }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=InlineControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineControls.js","sourceRoot":"","sources":["../../../src/board/layout/InlineControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Axis } from '@awesome-markdown/contracts';
|
|
3
|
+
import type { AxisDim } from './axis-defaults.js';
|
|
4
|
+
interface SortableAxisProps {
|
|
5
|
+
dim: AxisDim;
|
|
6
|
+
axis: Axis;
|
|
7
|
+
/** Implicit axes (board declares none) are not sortable or editable. */
|
|
8
|
+
editable: boolean;
|
|
9
|
+
selected: boolean;
|
|
10
|
+
label: string;
|
|
11
|
+
subtitle?: string;
|
|
12
|
+
onEdit: () => void;
|
|
13
|
+
onRename: (title: string) => void;
|
|
14
|
+
children: (parts: {
|
|
15
|
+
setNodeRef: (el: HTMLElement | null) => void;
|
|
16
|
+
style: React.CSSProperties;
|
|
17
|
+
handleProps: React.HTMLAttributes<HTMLElement>;
|
|
18
|
+
handleClassName: string;
|
|
19
|
+
title: React.ReactNode;
|
|
20
|
+
}) => React.ReactElement;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Wires one column header / swimlane row into the axis sortable context and
|
|
24
|
+
* renders its title with double-click rename and the pencil (configure) button.
|
|
25
|
+
*/
|
|
26
|
+
export declare function SortableAxis({ dim, axis, editable, selected, label, subtitle, onEdit, onRename, children, }: SortableAxisProps): React.ReactElement;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=SortableAxis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SortableAxis.d.ts","sourceRoot":"","sources":["../../../src/board/layout/SortableAxis.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,oBAAoB,CAAC;AAGhE,UAAU,iBAAiB;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;QAC7C,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC;QAC3B,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/C,eAAe,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;KACxB,KAAK,KAAK,CAAC,YAAY,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAsExC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { useSortable } from '@dnd-kit/sortable';
|
|
4
|
+
import { CSS } from '@dnd-kit/utilities';
|
|
5
|
+
import { axisDragId } from './axis-defaults.js';
|
|
6
|
+
import { InlineTextInput, PencilIcon } from './InlineControls.js';
|
|
7
|
+
/**
|
|
8
|
+
* Wires one column header / swimlane row into the axis sortable context and
|
|
9
|
+
* renders its title with double-click rename and the pencil (configure) button.
|
|
10
|
+
*/
|
|
11
|
+
export function SortableAxis({ dim, axis, editable, selected, label, subtitle, onEdit, onRename, children, }) {
|
|
12
|
+
const [renaming, setRenaming] = useState(false);
|
|
13
|
+
const data = { type: 'axis', dim, slug: axis.slug };
|
|
14
|
+
const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({
|
|
15
|
+
id: axisDragId(dim, axis.slug),
|
|
16
|
+
data,
|
|
17
|
+
disabled: !editable || renaming,
|
|
18
|
+
});
|
|
19
|
+
const style = {
|
|
20
|
+
transform: CSS.Translate.toString(transform),
|
|
21
|
+
transition,
|
|
22
|
+
opacity: isDragging ? 0.4 : 1,
|
|
23
|
+
position: 'relative',
|
|
24
|
+
zIndex: isDragging ? 20 : undefined,
|
|
25
|
+
};
|
|
26
|
+
const noun = dim === 'columns' ? 'column' : 'swimlane';
|
|
27
|
+
const title = (_jsxs("span", { style: { display: 'flex', alignItems: 'center', gap: '6px', minWidth: 0 }, children: [renaming ? (_jsx(InlineTextInput, { initial: axis.title, ariaLabel: `Rename ${noun}`, testId: `rename-${noun}-${axis.slug}`, onCommit: (t) => {
|
|
28
|
+
setRenaming(false);
|
|
29
|
+
onRename(t);
|
|
30
|
+
}, onCancel: () => setRenaming(false) })) : (_jsx("span", { className: "truncate", style: { flex: 1, minWidth: 0 }, onDoubleClick: editable ? () => setRenaming(true) : undefined, title: editable ? 'Double-click to rename' : undefined, children: label })), editable && (_jsx("button", { type: "button", className: "icon-btn", "aria-pressed": selected, "aria-label": `Configure ${noun} ${axis.title}`, title: `Configure ${noun}`, "data-testid": `edit-${noun}-${axis.slug}`, onPointerDown: (e) => e.stopPropagation(), onClick: onEdit, children: _jsx(PencilIcon, {}) }))] }));
|
|
31
|
+
return children({
|
|
32
|
+
setNodeRef,
|
|
33
|
+
style,
|
|
34
|
+
handleProps: editable ? { ...attributes, ...listeners } : {},
|
|
35
|
+
handleClassName: editable ? 'axis-drag' : '',
|
|
36
|
+
title: (_jsxs(_Fragment, { children: [title, subtitle !== undefined && _jsx("span", { className: "axis-sub truncate", children: subtitle })] })),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=SortableAxis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SortableAxis.js","sourceRoot":"","sources":["../../../src/board/layout/SortableAxis.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AxisOrder, Board, FilterRule } from '@awesome-markdown/contracts';
|
|
2
|
+
export type AxisDim = 'columns' | 'swimlanes';
|
|
3
|
+
/** Manual order — each item's per-board fractional index. */
|
|
4
|
+
export declare const MANUAL_ORDER: AxisOrder;
|
|
5
|
+
/**
|
|
6
|
+
* Filter for a freshly added axis: `boards.$board.column: <slug>` /
|
|
7
|
+
* `boards.$board.row: <slug>`. Scoped per board so the same item can sit in
|
|
8
|
+
* different columns/rows on different boards. It starts empty and stays
|
|
9
|
+
* invertible, so dropping a card writes that property on the board entry.
|
|
10
|
+
*/
|
|
11
|
+
export declare function defaultAxisFilter(dim: AxisDim, slug: string): FilterRule;
|
|
12
|
+
export declare function slugify(title: string, fallback?: string): string;
|
|
13
|
+
export declare function uniqueSlug(base: string, taken: ReadonlySet<string>): string;
|
|
14
|
+
/** Axis slugs the board itself declares (empty when the render uses the implicit axis). */
|
|
15
|
+
export declare function declaredSlugs(board: Board, dim: AxisDim): string[];
|
|
16
|
+
export interface AxisDragData {
|
|
17
|
+
type: 'axis';
|
|
18
|
+
dim: AxisDim;
|
|
19
|
+
slug: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function axisDragId(dim: AxisDim, slug: string): string;
|
|
22
|
+
//# sourceMappingURL=axis-defaults.d.ts.map
|