@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 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictDiff.js","sourceRoot":"","sources":["../../src/components/ConflictDiff.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ConflictPanelProps {
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Modal panel for resolving merge conflicts.
|
|
7
|
+
*
|
|
8
|
+
* Lists each conflicting path with a side-by-side diff and two action buttons:
|
|
9
|
+
* - "Use mine" → 'ours'
|
|
10
|
+
* - "Use remote" → 'theirs'
|
|
11
|
+
*
|
|
12
|
+
* The Submit button is enabled only when every path has a decision.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ConflictPanel({ onClose }: ConflictPanelProps): React.ReactElement | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ConflictPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictPanel.d.ts","sourceRoot":"","sources":["../../src/components/ConflictPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAKrD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAkKxF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useCallback } from 'react';
|
|
3
|
+
import { useConflict } from '../sync/conflict-store.js';
|
|
4
|
+
import { ConflictDiff } from './ConflictDiff.js';
|
|
5
|
+
/**
|
|
6
|
+
* Modal panel for resolving merge conflicts.
|
|
7
|
+
*
|
|
8
|
+
* Lists each conflicting path with a side-by-side diff and two action buttons:
|
|
9
|
+
* - "Use mine" → 'ours'
|
|
10
|
+
* - "Use remote" → 'theirs'
|
|
11
|
+
*
|
|
12
|
+
* The Submit button is enabled only when every path has a decision.
|
|
13
|
+
*/
|
|
14
|
+
export function ConflictPanel({ onClose }) {
|
|
15
|
+
const { activeConflict, submitting, resolve } = useConflict();
|
|
16
|
+
const [decisions, setDecisions] = useState(() => {
|
|
17
|
+
const init = {};
|
|
18
|
+
for (const entry of activeConflict?.paths ?? []) {
|
|
19
|
+
if (entry.decision === 'ours' || entry.decision === 'theirs') {
|
|
20
|
+
init[entry.path] = entry.decision;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return init;
|
|
24
|
+
});
|
|
25
|
+
const [submitError, setSubmitError] = useState(null);
|
|
26
|
+
if (!activeConflict)
|
|
27
|
+
return null;
|
|
28
|
+
const setDecision = useCallback((filePath, decision) => {
|
|
29
|
+
setDecisions((prev) => ({ ...prev, [filePath]: decision }));
|
|
30
|
+
}, []);
|
|
31
|
+
const canSubmit = activeConflict.paths.every((entry) => decisions[entry.path] === 'ours' || decisions[entry.path] === 'theirs') && !submitting;
|
|
32
|
+
const handleSubmit = useCallback(async () => {
|
|
33
|
+
setSubmitError(null);
|
|
34
|
+
try {
|
|
35
|
+
await resolve(decisions);
|
|
36
|
+
onClose();
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
setSubmitError(err instanceof Error ? err.message : 'Submit failed');
|
|
40
|
+
}
|
|
41
|
+
}, [decisions, resolve, onClose]);
|
|
42
|
+
return (_jsx("div", { role: "dialog", "aria-modal": "true", "aria-label": "Resolve merge conflicts", className: "fixed inset-0 z-50 flex items-center justify-center bg-black/40", "data-testid": "conflict-panel", children: _jsxs("div", { className: "bg-white rounded-xl shadow-xl w-full max-w-6xl mx-4 max-h-[90vh] flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-gray-200 flex-shrink-0", children: [_jsx("h2", { className: "text-lg font-semibold text-gray-800", children: "Resolve Merge Conflicts" }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close conflict panel", className: "text-gray-400 hover:text-gray-600 text-xl leading-none", "data-testid": "conflict-panel-close", children: "\u2715" })] }), _jsx("div", { className: "flex-1 overflow-y-auto px-6 py-4 space-y-6", children: activeConflict.paths.map((entry) => {
|
|
43
|
+
const decision = decisions[entry.path];
|
|
44
|
+
return (_jsxs("div", { className: "border border-gray-200 rounded-lg overflow-hidden", "data-testid": `conflict-path-${entry.path.replace(/\//g, '-')}`, children: [_jsxs("div", { className: "flex items-center justify-between gap-2 px-4 py-2 bg-gray-50 border-b border-gray-200", children: [_jsx("code", { className: "text-sm font-mono text-gray-700 break-all", children: entry.path }), _jsx("span", { className: "text-xs text-gray-400 flex-shrink-0", "data-testid": `conflict-status-${entry.path}`, children: decision === 'ours' ? '✓ Use mine'
|
|
45
|
+
: decision === 'theirs' ? '✓ Use remote'
|
|
46
|
+
: '⬜ Unresolved' })] }), _jsx("div", { className: "p-3", children: _jsx(ConflictDiff, { path: entry.path, oursLabel: entry.oursLabel, theirsLabel: entry.theirsLabel, oursContent: entry.oursContent, theirsContent: entry.theirsContent, oursTruncated: entry.oursTruncated, theirsTruncated: entry.theirsTruncated }) }), _jsxs("div", { className: "flex gap-2 px-4 pb-4", children: [_jsxs("button", { type: "button", onClick: () => setDecision(entry.path, 'ours'), disabled: submitting, className: `text-xs px-3 py-1.5 rounded border font-medium transition-colors ${decision === 'ours'
|
|
47
|
+
? 'bg-blue-600 text-white border-blue-600'
|
|
48
|
+
: 'border-gray-300 text-gray-600 hover:bg-gray-50'}`, "data-testid": `conflict-ours-${entry.path}`, children: ["Use mine (", entry.oursLabel, ")"] }), _jsxs("button", { type: "button", onClick: () => setDecision(entry.path, 'theirs'), disabled: submitting, className: `text-xs px-3 py-1.5 rounded border font-medium transition-colors ${decision === 'theirs'
|
|
49
|
+
? 'bg-green-600 text-white border-green-600'
|
|
50
|
+
: 'border-gray-300 text-gray-600 hover:bg-gray-50'}`, "data-testid": `conflict-theirs-${entry.path}`, children: ["Use remote (", entry.theirsLabel, ")"] })] })] }, entry.path));
|
|
51
|
+
}) }), _jsxs("div", { className: "px-6 py-4 border-t border-gray-200 flex-shrink-0 space-y-2", children: [submitError && (_jsx("p", { className: "text-sm text-red-600", "data-testid": "conflict-submit-error", children: submitError })), _jsxs("div", { className: "flex justify-end gap-3", children: [_jsx("button", { type: "button", onClick: onClose, disabled: submitting, className: "px-4 py-2 text-sm rounded-lg border border-gray-300 hover:bg-gray-50 disabled:opacity-50", "data-testid": "conflict-panel-cancel", children: "Cancel" }), _jsx("button", { type: "button", onClick: () => void handleSubmit(), disabled: !canSubmit, className: "px-4 py-2 text-sm rounded-lg bg-blue-600 text-white font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors", "data-testid": "conflict-submit-btn", children: submitting ? 'Resolving…' : 'Resolve conflicts' })] })] })] }) }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ConflictPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictPanel.js","sourceRoot":"","sources":["../../src/components/ConflictPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface DeleteItemConfirmDialogProps {
|
|
3
|
+
deleting: boolean;
|
|
4
|
+
error: string | null;
|
|
5
|
+
onCancel: () => void;
|
|
6
|
+
onConfirm: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Modal confirmation dialog shown before permanently deleting an item from
|
|
10
|
+
* the item detail page (ItemEditorPage).
|
|
11
|
+
*/
|
|
12
|
+
export declare function DeleteItemConfirmDialog({ deleting, error, onCancel, onConfirm, }: DeleteItemConfirmDialogProps): React.ReactElement;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=DeleteItemConfirmDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteItemConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/components/DeleteItemConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,4BAA4B;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE,4BAA4B,GAAG,KAAK,CAAC,YAAY,CAwEnD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Modal confirmation dialog shown before permanently deleting an item from
|
|
5
|
+
* the item detail page (ItemEditorPage).
|
|
6
|
+
*/
|
|
7
|
+
export function DeleteItemConfirmDialog({ deleting, error, onCancel, onConfirm, }) {
|
|
8
|
+
return (_jsx("div", { style: {
|
|
9
|
+
position: 'fixed',
|
|
10
|
+
inset: 0,
|
|
11
|
+
background: 'rgba(0, 0, 0, 0.4)',
|
|
12
|
+
display: 'flex',
|
|
13
|
+
alignItems: 'center',
|
|
14
|
+
justifyContent: 'center',
|
|
15
|
+
zIndex: 100,
|
|
16
|
+
}, "data-testid": "item-editor-delete-confirm", children: _jsxs("div", { style: {
|
|
17
|
+
background: 'var(--bg)',
|
|
18
|
+
border: '1px solid var(--border)',
|
|
19
|
+
borderRadius: 0,
|
|
20
|
+
padding: '24px',
|
|
21
|
+
maxWidth: '360px',
|
|
22
|
+
display: 'flex',
|
|
23
|
+
flexDirection: 'column',
|
|
24
|
+
gap: '16px',
|
|
25
|
+
fontFamily: 'var(--font-mono)',
|
|
26
|
+
}, children: [_jsx("div", { style: { fontSize: '13px', color: 'var(--ink)' }, children: "Delete this item? This cannot be undone." }), error && _jsx("div", { style: { fontSize: '12px', color: 'var(--ink)' }, children: error }), _jsxs("div", { style: { display: 'flex', gap: '12px', justifyContent: 'flex-end' }, children: [_jsx("button", { type: "button", onClick: onCancel, disabled: deleting, style: {
|
|
27
|
+
fontFamily: 'var(--font-mono)',
|
|
28
|
+
fontSize: '12px',
|
|
29
|
+
color: 'var(--ink-muted)',
|
|
30
|
+
background: 'none',
|
|
31
|
+
border: 'none',
|
|
32
|
+
borderRadius: 0,
|
|
33
|
+
padding: '6px 8px',
|
|
34
|
+
cursor: deleting ? 'not-allowed' : 'pointer',
|
|
35
|
+
}, "data-testid": "item-editor-delete-cancel", children: "cancel" }), _jsx("button", { type: "button", onClick: onConfirm, disabled: deleting, style: {
|
|
36
|
+
fontFamily: 'var(--font-mono)',
|
|
37
|
+
fontSize: '12px',
|
|
38
|
+
background: 'var(--ink)',
|
|
39
|
+
color: 'var(--bg)',
|
|
40
|
+
border: 'none',
|
|
41
|
+
borderRadius: 0,
|
|
42
|
+
padding: '6px 16px',
|
|
43
|
+
cursor: deleting ? 'not-allowed' : 'pointer',
|
|
44
|
+
}, "data-testid": "item-editor-delete-confirm-button", children: deleting ? 'deleting…' : 'delete' })] })] }) }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=DeleteItemConfirmDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteItemConfirmDialog.js","sourceRoot":"","sources":["../../src/components/DeleteItemConfirmDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,GACoB;IAC7B,OAAO,CACL,cACE,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,oBAAoB;YAChC,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,MAAM,EAAE,GAAG;SACZ,iBACW,4BAA4B,YAExC,eACE,KAAK,EAAE;gBACL,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE,yBAAyB;gBACjC,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,GAAG,EAAE,MAAM;gBACX,UAAU,EAAE,kBAAkB;aAC/B,aAED,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,yDAE/C,EACL,KAAK,IAAI,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,YAAG,KAAK,GAAO,EAC9E,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aACtE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE;gCACL,UAAU,EAAE,kBAAkB;gCAC9B,QAAQ,EAAE,MAAM;gCAChB,KAAK,EAAE,kBAAkB;gCACzB,UAAU,EAAE,MAAM;gCAClB,MAAM,EAAE,MAAM;gCACd,YAAY,EAAE,CAAC;gCACf,OAAO,EAAE,SAAS;gCAClB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;6BAC7C,iBACW,2BAA2B,uBAGhC,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE;gCACL,UAAU,EAAE,kBAAkB;gCAC9B,QAAQ,EAAE,MAAM;gCAChB,UAAU,EAAE,YAAY;gCACxB,KAAK,EAAE,WAAW;gCAClB,MAAM,EAAE,MAAM;gCACd,YAAY,EAAE,CAAC;gCACf,OAAO,EAAE,UAAU;gCACnB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;6BAC7C,iBACW,mCAAmC,YAE9C,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,GAC3B,IACL,IACF,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ItemEditorActionsProps {
|
|
3
|
+
saving: boolean;
|
|
4
|
+
deleting: boolean;
|
|
5
|
+
dirty: boolean;
|
|
6
|
+
onSave: () => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
onDeleteRequest: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Save / cancel / delete action bar for the item detail page (ItemEditorPage).
|
|
12
|
+
*/
|
|
13
|
+
export declare function ItemEditorActions({ saving, deleting, dirty, onSave, onCancel, onDeleteRequest, }: ItemEditorActionsProps): React.ReactElement;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=ItemEditorActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemEditorActions.d.ts","sourceRoot":"","sources":["../../src/components/ItemEditorActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,EAAE,sBAAsB,GAAG,KAAK,CAAC,YAAY,CA8E7C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Save / cancel / delete action bar for the item detail page (ItemEditorPage).
|
|
5
|
+
*/
|
|
6
|
+
export function ItemEditorActions({ saving, deleting, dirty, onSave, onCancel, onDeleteRequest, }) {
|
|
7
|
+
return (_jsxs("div", { style: {
|
|
8
|
+
display: 'flex',
|
|
9
|
+
gap: '12px',
|
|
10
|
+
alignItems: 'center',
|
|
11
|
+
borderTop: '1px solid var(--border)',
|
|
12
|
+
paddingTop: '16px',
|
|
13
|
+
}, children: [_jsx("button", { type: "button", onClick: onSave, disabled: saving || !dirty, style: {
|
|
14
|
+
fontFamily: 'var(--font-mono)',
|
|
15
|
+
fontSize: '12px',
|
|
16
|
+
background: dirty && !saving ? 'var(--ink)' : 'var(--border)',
|
|
17
|
+
color: dirty && !saving ? 'var(--bg)' : 'var(--ink-muted)',
|
|
18
|
+
border: 'none',
|
|
19
|
+
borderRadius: 0,
|
|
20
|
+
padding: '6px 16px',
|
|
21
|
+
cursor: saving || !dirty ? 'not-allowed' : 'pointer',
|
|
22
|
+
transition: 'opacity 0.1s',
|
|
23
|
+
}, "data-testid": "item-editor-save", children: saving ? 'saving…' : 'save' }), _jsx("button", { type: "button", onClick: onCancel, disabled: saving, style: {
|
|
24
|
+
fontFamily: 'var(--font-mono)',
|
|
25
|
+
fontSize: '12px',
|
|
26
|
+
color: 'var(--ink-muted)',
|
|
27
|
+
background: 'none',
|
|
28
|
+
border: 'none',
|
|
29
|
+
borderRadius: 0,
|
|
30
|
+
padding: '6px 8px',
|
|
31
|
+
cursor: saving ? 'not-allowed' : 'pointer',
|
|
32
|
+
}, "data-testid": "item-editor-cancel", children: "cancel" }), _jsx("button", { type: "button", onClick: onDeleteRequest, disabled: saving || deleting, style: {
|
|
33
|
+
fontFamily: 'var(--font-mono)',
|
|
34
|
+
fontSize: '12px',
|
|
35
|
+
color: 'var(--ink-muted)',
|
|
36
|
+
background: 'none',
|
|
37
|
+
border: 'none',
|
|
38
|
+
borderRadius: 0,
|
|
39
|
+
padding: '6px 8px',
|
|
40
|
+
cursor: saving || deleting ? 'not-allowed' : 'pointer',
|
|
41
|
+
}, "data-testid": "item-editor-delete", children: "delete" }), _jsx("span", { style: {
|
|
42
|
+
fontFamily: 'var(--font-mono)',
|
|
43
|
+
fontSize: '11px',
|
|
44
|
+
color: 'var(--ink-muted)',
|
|
45
|
+
marginLeft: 'auto',
|
|
46
|
+
}, children: saving ? '' : '⌘S to save · Esc to cancel' })] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ItemEditorActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemEditorActions.js","sourceRoot":"","sources":["../../src/components/ItemEditorActions.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,QAAQ,EACR,eAAe,GACQ;IACvB,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,MAAM;YACX,UAAU,EAAE,QAAQ;YACpB,SAAS,EAAE,yBAAyB;YACpC,UAAU,EAAE,MAAM;SACnB,aAED,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,EAC1B,KAAK,EAAE;oBACL,UAAU,EAAE,kBAAkB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe;oBAC7D,KAAK,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB;oBAC1D,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;oBACpD,UAAU,EAAE,cAAc;iBAC3B,iBACW,kBAAkB,YAE7B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GACrB,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;oBACL,UAAU,EAAE,kBAAkB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,UAAU,EAAE,MAAM;oBAClB,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,SAAS;oBAClB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;iBAC3C,iBACW,oBAAoB,uBAGzB,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAC5B,KAAK,EAAE;oBACL,UAAU,EAAE,kBAAkB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,UAAU,EAAE,MAAM;oBAClB,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,SAAS;oBAClB,MAAM,EAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;iBACvD,iBACW,oBAAoB,uBAGzB,EACT,eACE,KAAK,EAAE;oBACL,UAAU,EAAE,kBAAkB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,UAAU,EAAE,MAAM;iBACnB,YAEA,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B,GACtC,IACH,CACP,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @awesome-markdown/board-ui — the awesome-markdown board surface as a
|
|
3
|
+
* router-agnostic React library.
|
|
4
|
+
*
|
|
5
|
+
* Host apps provide three things:
|
|
6
|
+
* 1. `RouterAdapterProvider` — maps board-relative paths onto the host router.
|
|
7
|
+
* 2. `ProviderContextProvider` — the `PersistenceProvider` to read/write through.
|
|
8
|
+
* 3. `import '@awesome-markdown/board-ui/styles.css'` — tokens, fonts, utilities.
|
|
9
|
+
* Optionally: `BreadcrumbContext.Provider` (shell breadcrumb) and
|
|
10
|
+
* `ConflictProvider` + `ConflictBanner` (sync-engine conflict resolution).
|
|
11
|
+
*/
|
|
12
|
+
export { RouterAdapterProvider, RouterLink, useRouterAdapter } from './router/RouterAdapter.js';
|
|
13
|
+
export type { RouterAdapter, RouterLinkProps } from './router/RouterAdapter.js';
|
|
14
|
+
export { BreadcrumbContext, useBreadcrumb } from './breadcrumb.js';
|
|
15
|
+
export type { BreadcrumbContextValue, BreadcrumbSegment } from './breadcrumb.js';
|
|
16
|
+
export { ProviderContextProvider, useProvider } from './provider/ProviderContext.js';
|
|
17
|
+
export { BoardListPage } from './pages/BoardListPage.js';
|
|
18
|
+
export { BoardPage } from './pages/BoardPage.js';
|
|
19
|
+
export { ItemEditorPage } from './pages/ItemEditorPage.js';
|
|
20
|
+
export { Board } from './board/Board.js';
|
|
21
|
+
export { HomelessPanel } from './board/HomelessPanel.js';
|
|
22
|
+
export { useBoardRender } from './state/useBoardRender.js';
|
|
23
|
+
export type { BoardRenderState, BoardRenderStatus } from './state/useBoardRender.js';
|
|
24
|
+
export { useProviderSubscribe } from './state/useProviderSubscribe.js';
|
|
25
|
+
export { useTheme } from './state/theme-store.js';
|
|
26
|
+
export { ConflictProvider, useConflict, useOptionalConflict } from './sync/conflict-store.js';
|
|
27
|
+
export type { ConflictStoreState } from './sync/conflict-store.js';
|
|
28
|
+
export { ConflictBanner } from './components/ConflictBanner.js';
|
|
29
|
+
export { SyncStatusDot } from './shell/SyncStatusDot.js';
|
|
30
|
+
export { ThemeToggle } from './shell/ThemeToggle.js';
|
|
31
|
+
export { buildItemEditorHref } from './lib/item-board.js';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAChG,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGhF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGjF,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAGrF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @awesome-markdown/board-ui — the awesome-markdown board surface as a
|
|
3
|
+
* router-agnostic React library.
|
|
4
|
+
*
|
|
5
|
+
* Host apps provide three things:
|
|
6
|
+
* 1. `RouterAdapterProvider` — maps board-relative paths onto the host router.
|
|
7
|
+
* 2. `ProviderContextProvider` — the `PersistenceProvider` to read/write through.
|
|
8
|
+
* 3. `import '@awesome-markdown/board-ui/styles.css'` — tokens, fonts, utilities.
|
|
9
|
+
* Optionally: `BreadcrumbContext.Provider` (shell breadcrumb) and
|
|
10
|
+
* `ConflictProvider` + `ConflictBanner` (sync-engine conflict resolution).
|
|
11
|
+
*/
|
|
12
|
+
// Routing seam
|
|
13
|
+
export { RouterAdapterProvider, RouterLink, useRouterAdapter } from './router/RouterAdapter.js';
|
|
14
|
+
// Breadcrumb channel (optional; no-op default)
|
|
15
|
+
export { BreadcrumbContext, useBreadcrumb } from './breadcrumb.js';
|
|
16
|
+
// Persistence provider binding
|
|
17
|
+
export { ProviderContextProvider, useProvider } from './provider/ProviderContext.js';
|
|
18
|
+
// Pages (render under the host's `/`, `/boards/:slug`, `/items/:slug` routes)
|
|
19
|
+
export { BoardListPage } from './pages/BoardListPage.js';
|
|
20
|
+
export { BoardPage } from './pages/BoardPage.js';
|
|
21
|
+
export { ItemEditorPage } from './pages/ItemEditorPage.js';
|
|
22
|
+
// Board building blocks
|
|
23
|
+
export { Board } from './board/Board.js';
|
|
24
|
+
export { HomelessPanel } from './board/HomelessPanel.js';
|
|
25
|
+
// State hooks
|
|
26
|
+
export { useBoardRender } from './state/useBoardRender.js';
|
|
27
|
+
export { useProviderSubscribe } from './state/useProviderSubscribe.js';
|
|
28
|
+
export { useTheme } from './state/theme-store.js';
|
|
29
|
+
// Sync-engine conflict handling
|
|
30
|
+
export { ConflictProvider, useConflict, useOptionalConflict } from './sync/conflict-store.js';
|
|
31
|
+
export { ConflictBanner } from './components/ConflictBanner.js';
|
|
32
|
+
// Shell widgets reusable by host top bars
|
|
33
|
+
export { SyncStatusDot } from './shell/SyncStatusDot.js';
|
|
34
|
+
export { ThemeToggle } from './shell/ThemeToggle.js';
|
|
35
|
+
// Helpers
|
|
36
|
+
export { buildItemEditorHref } from './lib/item-board.js';
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAe;AACf,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGhG,+CAA+C;AAC/C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGnE,+BAA+B;AAC/B,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAErF,8EAA8E;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,wBAAwB;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,gCAAgC;AAChC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,0CAA0C;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,UAAU;AACV,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives a plain-text summary from a markdown body string.
|
|
3
|
+
*
|
|
4
|
+
* Returns the first non-empty, non-heading line of the body with inline
|
|
5
|
+
* markdown (images, links, bold, italic, code spans) stripped to plain text.
|
|
6
|
+
* Returns an empty string if no such line exists.
|
|
7
|
+
*/
|
|
8
|
+
export declare function deriveSummary(body: string): string;
|
|
9
|
+
//# sourceMappingURL=derive-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-summary.d.ts","sourceRoot":"","sources":["../../src/lib/derive-summary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBlD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives a plain-text summary from a markdown body string.
|
|
3
|
+
*
|
|
4
|
+
* Returns the first non-empty, non-heading line of the body with inline
|
|
5
|
+
* markdown (images, links, bold, italic, code spans) stripped to plain text.
|
|
6
|
+
* Returns an empty string if no such line exists.
|
|
7
|
+
*/
|
|
8
|
+
export function deriveSummary(body) {
|
|
9
|
+
const lines = body.split('\n');
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
const trimmed = line.trim();
|
|
12
|
+
if (trimmed === '' || trimmed.startsWith('#'))
|
|
13
|
+
continue;
|
|
14
|
+
let cleaned = trimmed;
|
|
15
|
+
// Remove images: 
|
|
16
|
+
cleaned = cleaned.replace(/!\[([^\]]*)\]\([^)]*\)/g, '');
|
|
17
|
+
// Convert links: [text](url) → text
|
|
18
|
+
cleaned = cleaned.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1');
|
|
19
|
+
// Remove bold/italic/code markers
|
|
20
|
+
cleaned = cleaned.replace(/\*\*|__|\*|_|`/g, '');
|
|
21
|
+
const result = cleaned.trim();
|
|
22
|
+
if (result !== '')
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=derive-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-summary.js","sourceRoot":"","sources":["../../src/lib/derive-summary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACxD,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,6BAA6B;QAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACzD,oCAAoC;QACpC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QAC1D,kCAAkC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Item } from '@awesome-markdown/contracts';
|
|
2
|
+
export declare function getBoardEntry(item: Item, boardSlug: string): Record<string, unknown> | undefined;
|
|
3
|
+
export declare function getBoardScopedString(item: Item, boardSlug: string, property: string): string;
|
|
4
|
+
export declare function buildItemEditorHref(itemSlug: string, boardSlug?: string): string;
|
|
5
|
+
//# sourceMappingURL=item-board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-board.d.ts","sourceRoot":"","sources":["../../src/lib/item-board.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAEhG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5F;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function getBoardEntry(item, boardSlug) {
|
|
2
|
+
return item.boards?.find((entry) => entry.board === boardSlug);
|
|
3
|
+
}
|
|
4
|
+
export function getBoardScopedString(item, boardSlug, property) {
|
|
5
|
+
const value = getBoardEntry(item, boardSlug)?.[property];
|
|
6
|
+
return typeof value === 'string' ? value : '';
|
|
7
|
+
}
|
|
8
|
+
export function buildItemEditorHref(itemSlug, boardSlug) {
|
|
9
|
+
if (!boardSlug)
|
|
10
|
+
return `/items/${itemSlug}`;
|
|
11
|
+
const search = new URLSearchParams({ board: boardSlug });
|
|
12
|
+
return `/items/${itemSlug}?${search.toString()}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=item-board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-board.js","sourceRoot":"","sources":["../../src/lib/item-board.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,SAAiB;IACzD,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAwC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAU,EAAE,SAAiB,EAAE,QAAgB;IAClF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,SAAkB;IACtE,IAAI,CAAC,SAAS;QAAE,OAAO,UAAU,QAAQ,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,OAAO,UAAU,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Item, PropertyDisplay } from '@awesome-markdown/contracts';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a property's value for an item on a given board.
|
|
5
|
+
*
|
|
6
|
+
* Per-board entries (`item.boards[].<property>`) take precedence over the
|
|
7
|
+
* item's top-level property of the same name.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveItemProperty(item: Item, boardSlug: string, property: string): unknown;
|
|
10
|
+
interface PropertyValueProps {
|
|
11
|
+
item: Item;
|
|
12
|
+
boardSlug: string;
|
|
13
|
+
layout: PropertyDisplay;
|
|
14
|
+
}
|
|
15
|
+
/** Renders a single configured property according to its `visualStyle`. */
|
|
16
|
+
export declare function PropertyValueDisplay({ item, boardSlug, layout }: PropertyValueProps): React.ReactElement | null;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=property-display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-display.d.ts","sourceRoot":"","sources":["../../src/lib/property-display.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGzE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI5F;AAcD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAsF/G"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { getBoardEntry } from './item-board.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a property's value for an item on a given board.
|
|
6
|
+
*
|
|
7
|
+
* Per-board entries (`item.boards[].<property>`) take precedence over the
|
|
8
|
+
* item's top-level property of the same name.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveItemProperty(item, boardSlug, property) {
|
|
11
|
+
const boardEntry = getBoardEntry(item, boardSlug);
|
|
12
|
+
if (boardEntry && property in boardEntry)
|
|
13
|
+
return boardEntry[property];
|
|
14
|
+
return item[property];
|
|
15
|
+
}
|
|
16
|
+
function formatValue(value) {
|
|
17
|
+
if (value === undefined || value === null)
|
|
18
|
+
return '';
|
|
19
|
+
if (Array.isArray(value))
|
|
20
|
+
return value.map(String).join(', ');
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
function initials(value) {
|
|
24
|
+
const parts = value.trim().split(/[\s_-]+/).filter(Boolean);
|
|
25
|
+
const chars = parts.length > 1 ? [parts[0][0], parts[1][0]] : [value.slice(0, 2)];
|
|
26
|
+
return chars.join('').toUpperCase();
|
|
27
|
+
}
|
|
28
|
+
/** Renders a single configured property according to its `visualStyle`. */
|
|
29
|
+
export function PropertyValueDisplay({ item, boardSlug, layout }) {
|
|
30
|
+
const raw = resolveItemProperty(item, boardSlug, layout.property);
|
|
31
|
+
const text = formatValue(raw);
|
|
32
|
+
if (text === '')
|
|
33
|
+
return null;
|
|
34
|
+
const label = layout.label ?? layout.property;
|
|
35
|
+
const testId = `property-${layout.property}-${item.slug}`;
|
|
36
|
+
if (layout.visualStyle === 'badge') {
|
|
37
|
+
return (_jsx("span", { title: label, "data-testid": testId, style: {
|
|
38
|
+
fontFamily: 'var(--font-mono)',
|
|
39
|
+
fontSize: '10.5px',
|
|
40
|
+
fontWeight: 500,
|
|
41
|
+
color: 'var(--ink)',
|
|
42
|
+
background: 'var(--accent)',
|
|
43
|
+
padding: '1px 6px',
|
|
44
|
+
borderRadius: 0,
|
|
45
|
+
display: 'inline-block',
|
|
46
|
+
}, children: text }));
|
|
47
|
+
}
|
|
48
|
+
if (layout.visualStyle === 'tag') {
|
|
49
|
+
return (_jsx("span", { title: label, "data-testid": testId, style: {
|
|
50
|
+
fontFamily: 'var(--font-mono)',
|
|
51
|
+
fontSize: '10.5px',
|
|
52
|
+
fontWeight: 400,
|
|
53
|
+
color: 'var(--ink-muted)',
|
|
54
|
+
textTransform: 'uppercase',
|
|
55
|
+
letterSpacing: '0.06em',
|
|
56
|
+
}, children: text }));
|
|
57
|
+
}
|
|
58
|
+
if (layout.visualStyle === 'avatar') {
|
|
59
|
+
return (_jsx("span", { title: `${label}: ${text}`, "data-testid": testId, style: {
|
|
60
|
+
fontFamily: 'var(--font-sans)',
|
|
61
|
+
fontSize: '10px',
|
|
62
|
+
fontWeight: 600,
|
|
63
|
+
color: 'var(--bg)',
|
|
64
|
+
background: 'var(--ink)',
|
|
65
|
+
width: '18px',
|
|
66
|
+
height: '18px',
|
|
67
|
+
borderRadius: '50%',
|
|
68
|
+
display: 'inline-flex',
|
|
69
|
+
alignItems: 'center',
|
|
70
|
+
justifyContent: 'center',
|
|
71
|
+
}, children: initials(text) }));
|
|
72
|
+
}
|
|
73
|
+
// 'text' (default)
|
|
74
|
+
return (_jsxs("span", { "data-testid": testId, style: {
|
|
75
|
+
fontFamily: 'var(--font-sans)',
|
|
76
|
+
fontSize: '11.5px',
|
|
77
|
+
fontWeight: 400,
|
|
78
|
+
color: 'var(--ink-muted)',
|
|
79
|
+
}, children: [_jsxs("span", { style: { fontWeight: 500, color: 'var(--ink)' }, children: [label, ":"] }), " ", text] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=property-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-display.js","sourceRoot":"","sources":["../../src/lib/property-display.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Board list page — rendered at route `/`.
|
|
4
|
+
* Lists all boards from the current provider; each links to `/boards/:slug`.
|
|
5
|
+
* "+ add board" asks for a title, creates an empty board and opens it —
|
|
6
|
+
* columns and swimlanes are then added on the board itself.
|
|
7
|
+
*/
|
|
8
|
+
export declare function BoardListPage(): React.ReactElement;
|
|
9
|
+
//# sourceMappingURL=BoardListPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoardListPage.d.ts","sourceRoot":"","sources":["../../src/pages/BoardListPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAQxE;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,KAAK,CAAC,YAAY,CAiMlD"}
|