@awesome-markdown/board-ui 0.0.0-stage → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +76 -2
  2. package/dist/board/Board.d.ts +24 -0
  3. package/dist/board/Board.d.ts.map +1 -0
  4. package/dist/board/Board.js +179 -0
  5. package/dist/board/Board.js.map +1 -0
  6. package/dist/board/Cell.d.ts +23 -0
  7. package/dist/board/Cell.d.ts.map +1 -0
  8. package/dist/board/Cell.js +150 -0
  9. package/dist/board/Cell.js.map +1 -0
  10. package/dist/board/ColumnHeader.d.ts +18 -0
  11. package/dist/board/ColumnHeader.d.ts.map +1 -0
  12. package/dist/board/ColumnHeader.js +31 -0
  13. package/dist/board/ColumnHeader.js.map +1 -0
  14. package/dist/board/HomelessItemCard.d.ts +15 -0
  15. package/dist/board/HomelessItemCard.d.ts.map +1 -0
  16. package/dist/board/HomelessItemCard.js +37 -0
  17. package/dist/board/HomelessItemCard.js.map +1 -0
  18. package/dist/board/HomelessPanel.d.ts +17 -0
  19. package/dist/board/HomelessPanel.d.ts.map +1 -0
  20. package/dist/board/HomelessPanel.js +26 -0
  21. package/dist/board/HomelessPanel.js.map +1 -0
  22. package/dist/board/ItemCard.d.ts +21 -0
  23. package/dist/board/ItemCard.d.ts.map +1 -0
  24. package/dist/board/ItemCard.js +97 -0
  25. package/dist/board/ItemCard.js.map +1 -0
  26. package/dist/board/SwimlaneRow.d.ts +23 -0
  27. package/dist/board/SwimlaneRow.d.ts.map +1 -0
  28. package/dist/board/SwimlaneRow.js +30 -0
  29. package/dist/board/SwimlaneRow.js.map +1 -0
  30. package/dist/board/dnd/boardDnd.d.ts +15 -0
  31. package/dist/board/dnd/boardDnd.d.ts.map +1 -0
  32. package/dist/board/dnd/boardDnd.js +69 -0
  33. package/dist/board/dnd/boardDnd.js.map +1 -0
  34. package/dist/board/dnd/dragTypes.d.ts +24 -0
  35. package/dist/board/dnd/dragTypes.d.ts.map +1 -0
  36. package/dist/board/dnd/dragTypes.js +22 -0
  37. package/dist/board/dnd/dragTypes.js.map +1 -0
  38. package/dist/board/dnd/mutateDragDrop.d.ts +35 -0
  39. package/dist/board/dnd/mutateDragDrop.d.ts.map +1 -0
  40. package/dist/board/dnd/mutateDragDrop.js +97 -0
  41. package/dist/board/dnd/mutateDragDrop.js.map +1 -0
  42. package/dist/board/dnd/onDragEnd.d.ts +24 -0
  43. package/dist/board/dnd/onDragEnd.d.ts.map +1 -0
  44. package/dist/board/dnd/onDragEnd.js +47 -0
  45. package/dist/board/dnd/onDragEnd.js.map +1 -0
  46. package/dist/board/layout/AxisBehavior.d.ts +36 -0
  47. package/dist/board/layout/AxisBehavior.d.ts.map +1 -0
  48. package/dist/board/layout/AxisBehavior.js +86 -0
  49. package/dist/board/layout/AxisBehavior.js.map +1 -0
  50. package/dist/board/layout/AxisDrawer.d.ts +17 -0
  51. package/dist/board/layout/AxisDrawer.d.ts.map +1 -0
  52. package/dist/board/layout/AxisDrawer.js +40 -0
  53. package/dist/board/layout/AxisDrawer.js.map +1 -0
  54. package/dist/board/layout/BoardDrawer.d.ts +11 -0
  55. package/dist/board/layout/BoardDrawer.d.ts.map +1 -0
  56. package/dist/board/layout/BoardDrawer.js +27 -0
  57. package/dist/board/layout/BoardDrawer.js.map +1 -0
  58. package/dist/board/layout/Drawer.d.ts +19 -0
  59. package/dist/board/layout/Drawer.d.ts.map +1 -0
  60. package/dist/board/layout/Drawer.js +18 -0
  61. package/dist/board/layout/Drawer.js.map +1 -0
  62. package/dist/board/layout/FilterEditor.d.ts +12 -0
  63. package/dist/board/layout/FilterEditor.d.ts.map +1 -0
  64. package/dist/board/layout/FilterEditor.js +11 -0
  65. package/dist/board/layout/FilterEditor.js.map +1 -0
  66. package/dist/board/layout/InlineControls.d.ts +22 -0
  67. package/dist/board/layout/InlineControls.d.ts.map +1 -0
  68. package/dist/board/layout/InlineControls.js +39 -0
  69. package/dist/board/layout/InlineControls.js.map +1 -0
  70. package/dist/board/layout/SortableAxis.d.ts +28 -0
  71. package/dist/board/layout/SortableAxis.d.ts.map +1 -0
  72. package/dist/board/layout/SortableAxis.js +39 -0
  73. package/dist/board/layout/SortableAxis.js.map +1 -0
  74. package/dist/board/layout/axis-defaults.d.ts +22 -0
  75. package/dist/board/layout/axis-defaults.d.ts.map +1 -0
  76. package/dist/board/layout/axis-defaults.js +37 -0
  77. package/dist/board/layout/axis-defaults.js.map +1 -0
  78. package/dist/board/layout/filter-draft.d.ts +21 -0
  79. package/dist/board/layout/filter-draft.d.ts.map +1 -0
  80. package/dist/board/layout/filter-draft.js +112 -0
  81. package/dist/board/layout/filter-draft.js.map +1 -0
  82. package/dist/board/layout/useBoardLayout.d.ts +27 -0
  83. package/dist/board/layout/useBoardLayout.d.ts.map +1 -0
  84. package/dist/board/layout/useBoardLayout.js +92 -0
  85. package/dist/board/layout/useBoardLayout.js.map +1 -0
  86. package/dist/breadcrumb.d.ts +22 -0
  87. package/dist/breadcrumb.d.ts.map +1 -0
  88. package/dist/breadcrumb.js +15 -0
  89. package/dist/breadcrumb.js.map +1 -0
  90. package/dist/components/ConflictBanner.d.ts +12 -0
  91. package/dist/components/ConflictBanner.d.ts.map +1 -0
  92. package/dist/components/ConflictBanner.js +47 -0
  93. package/dist/components/ConflictBanner.js.map +1 -0
  94. package/dist/components/ConflictDiff.d.ts +13 -0
  95. package/dist/components/ConflictDiff.d.ts.map +1 -0
  96. package/dist/components/ConflictDiff.js +97 -0
  97. package/dist/components/ConflictDiff.js.map +1 -0
  98. package/dist/components/ConflictPanel.d.ts +16 -0
  99. package/dist/components/ConflictPanel.d.ts.map +1 -0
  100. package/dist/components/ConflictPanel.js +53 -0
  101. package/dist/components/ConflictPanel.js.map +1 -0
  102. package/dist/components/ItemRecovery.d.ts +9 -0
  103. package/dist/components/ItemRecovery.d.ts.map +1 -0
  104. package/dist/components/ItemRecovery.js +48 -0
  105. package/dist/components/ItemRecovery.js.map +1 -0
  106. package/dist/components/PropertyTree.d.ts +18 -0
  107. package/dist/components/PropertyTree.d.ts.map +1 -0
  108. package/dist/components/PropertyTree.js +109 -0
  109. package/dist/components/PropertyTree.js.map +1 -0
  110. package/dist/index.d.ts +32 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +37 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/derive-summary.d.ts +9 -0
  115. package/dist/lib/derive-summary.d.ts.map +1 -0
  116. package/dist/lib/derive-summary.js +27 -0
  117. package/dist/lib/derive-summary.js.map +1 -0
  118. package/dist/lib/item-board.d.ts +2 -0
  119. package/dist/lib/item-board.d.ts.map +1 -0
  120. package/dist/lib/item-board.js +7 -0
  121. package/dist/lib/item-board.js.map +1 -0
  122. package/dist/lib/patch-visible-item.d.ts +4 -0
  123. package/dist/lib/patch-visible-item.d.ts.map +1 -0
  124. package/dist/lib/patch-visible-item.js +10 -0
  125. package/dist/lib/patch-visible-item.js.map +1 -0
  126. package/dist/lib/property-display.d.ts +17 -0
  127. package/dist/lib/property-display.d.ts.map +1 -0
  128. package/dist/lib/property-display.js +86 -0
  129. package/dist/lib/property-display.js.map +1 -0
  130. package/dist/lib/property-tree.d.ts +23 -0
  131. package/dist/lib/property-tree.d.ts.map +1 -0
  132. package/dist/lib/property-tree.js +109 -0
  133. package/dist/lib/property-tree.js.map +1 -0
  134. package/dist/pages/BoardListPage.d.ts +9 -0
  135. package/dist/pages/BoardListPage.d.ts.map +1 -0
  136. package/dist/pages/BoardListPage.js +113 -0
  137. package/dist/pages/BoardListPage.js.map +1 -0
  138. package/dist/pages/BoardPage.d.ts +7 -0
  139. package/dist/pages/BoardPage.d.ts.map +1 -0
  140. package/dist/pages/BoardPage.js +37 -0
  141. package/dist/pages/BoardPage.js.map +1 -0
  142. package/dist/pages/ItemEditorPage.d.ts +3 -0
  143. package/dist/pages/ItemEditorPage.d.ts.map +1 -0
  144. package/dist/pages/ItemEditorPage.js +236 -0
  145. package/dist/pages/ItemEditorPage.js.map +1 -0
  146. package/dist/provider/ProviderContext.d.ts +17 -0
  147. package/dist/provider/ProviderContext.d.ts.map +1 -0
  148. package/dist/provider/ProviderContext.js +21 -0
  149. package/dist/provider/ProviderContext.js.map +1 -0
  150. package/dist/router/RouterAdapter.d.ts +43 -0
  151. package/dist/router/RouterAdapter.d.ts.map +1 -0
  152. package/dist/router/RouterAdapter.js +21 -0
  153. package/dist/router/RouterAdapter.js.map +1 -0
  154. package/dist/shell/SyncStatusDot.d.ts +8 -0
  155. package/dist/shell/SyncStatusDot.d.ts.map +1 -0
  156. package/dist/shell/SyncStatusDot.js +58 -0
  157. package/dist/shell/SyncStatusDot.js.map +1 -0
  158. package/dist/shell/ThemeToggle.d.ts +8 -0
  159. package/dist/shell/ThemeToggle.d.ts.map +1 -0
  160. package/dist/shell/ThemeToggle.js +21 -0
  161. package/dist/shell/ThemeToggle.js.map +1 -0
  162. package/dist/state/theme-store.d.ts +17 -0
  163. package/dist/state/theme-store.d.ts.map +1 -0
  164. package/dist/state/theme-store.js +58 -0
  165. package/dist/state/theme-store.js.map +1 -0
  166. package/dist/state/useBoardRender.d.ts +16 -0
  167. package/dist/state/useBoardRender.d.ts.map +1 -0
  168. package/dist/state/useBoardRender.js +53 -0
  169. package/dist/state/useBoardRender.js.map +1 -0
  170. package/dist/state/useProviderSubscribe.d.ts +22 -0
  171. package/dist/state/useProviderSubscribe.d.ts.map +1 -0
  172. package/dist/state/useProviderSubscribe.js +48 -0
  173. package/dist/state/useProviderSubscribe.js.map +1 -0
  174. package/dist/sync/conflict-api.d.ts +16 -0
  175. package/dist/sync/conflict-api.d.ts.map +1 -0
  176. package/dist/sync/conflict-api.js +35 -0
  177. package/dist/sync/conflict-api.js.map +1 -0
  178. package/dist/sync/conflict-store.d.ts +44 -0
  179. package/dist/sync/conflict-store.d.ts.map +1 -0
  180. package/dist/sync/conflict-store.js +159 -0
  181. package/dist/sync/conflict-store.js.map +1 -0
  182. package/fonts/InterTight-Medium.woff2 +0 -0
  183. package/fonts/InterTight-Regular.woff2 +0 -0
  184. package/fonts/JetBrainsMono-Medium.woff2 +0 -0
  185. package/fonts/JetBrainsMono-Regular.woff2 +0 -0
  186. package/fonts/LICENSE +14 -0
  187. package/package.json +59 -3
  188. package/styles.css +852 -0
@@ -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,9 @@
1
+ import React from 'react';
2
+ import type { Item } from '@awesome-markdown/contracts';
3
+ export declare function recoveryFilename(slug: string, extension: string): string;
4
+ export declare function ItemRecovery({ item, invalid, announce, }: {
5
+ item: Item | null;
6
+ invalid: string;
7
+ announce: (message: string) => void;
8
+ }): React.ReactElement;
9
+ //# sourceMappingURL=ItemRecovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemRecovery.d.ts","sourceRoot":"","sources":["../../src/components/ItemRecovery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGxE;AACD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GAAG,KAAK,CAAC,YAAY,CAmErB"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from 'react';
3
+ import { itemYaml, itemMarkdown } from '@awesome-markdown/contracts';
4
+ export function recoveryFilename(slug, extension) {
5
+ const safe = slug.replace(/[^A-Za-z0-9_-]/g, '-').replace(/^-+|-+$/g, '');
6
+ return `${safe || 'item'}.${extension}`;
7
+ }
8
+ export function ItemRecovery({ item, invalid, announce, }) {
9
+ const [error, setError] = useState('');
10
+ const yaml = item && !invalid ? itemYaml(item) : '';
11
+ const download = (extension) => {
12
+ if (!item || invalid)
13
+ return;
14
+ let url = '';
15
+ try {
16
+ url = URL.createObjectURL(new Blob([extension === 'yaml' ? yaml : itemMarkdown(item)], {
17
+ type: 'text/plain;charset=utf-8',
18
+ }));
19
+ const link = document.createElement('a');
20
+ link.href = url;
21
+ link.download = recoveryFilename(item.slug, extension);
22
+ document.body.append(link);
23
+ link.click();
24
+ link.remove();
25
+ announce(`Downloaded ${extension === 'yaml' ? 'YAML properties' : 'full Markdown draft'}. This does not save the item.`);
26
+ }
27
+ catch (reason) {
28
+ setError(`Download failed: ${reason instanceof Error ? reason.message : String(reason)}`);
29
+ }
30
+ finally {
31
+ if (url)
32
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
33
+ }
34
+ };
35
+ return (_jsxs("details", { className: "item-recovery", children: [_jsx("summary", { children: "YAML preview and recovery" }), invalid ? (_jsxs("p", { role: "status", children: [invalid, " Complete or remove invalid input before previewing or exporting."] })) : (_jsx("pre", { "data-testid": "yaml-preview", "aria-label": "YAML properties", children: _jsx("code", { className: "language-yaml", children: yaml }) })), _jsxs("div", { className: "item-actions", children: [_jsx("button", { type: "button", disabled: Boolean(invalid) || !item, onClick: () => {
36
+ setError('');
37
+ void (async () => {
38
+ try {
39
+ await navigator.clipboard.writeText(yaml);
40
+ announce('Copied YAML properties. Document text is excluded.');
41
+ }
42
+ catch (reason) {
43
+ setError(`Copy failed: ${String(reason)}`);
44
+ }
45
+ })();
46
+ }, children: "Copy YAML" }), _jsx("button", { type: "button", disabled: Boolean(invalid) || !item, onClick: () => download('yaml'), children: "Download YAML" }), _jsx("button", { type: "button", disabled: Boolean(invalid) || !item, onClick: () => download('md'), children: "Download Markdown" })] }), error && _jsx("p", { role: "alert", children: error })] }));
47
+ }
48
+ //# sourceMappingURL=ItemRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemRecovery.js","sourceRoot":"","sources":["../../src/components/ItemRecovery.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import type { PropertyValue } from '@awesome-markdown/contracts';
3
+ import type { ValueNode } from '../lib/property-tree.js';
4
+ export declare function PropertyRead({ value, label, }: {
5
+ value: PropertyValue;
6
+ label: string;
7
+ }): React.ReactElement;
8
+ interface TreeProps {
9
+ node: ValueNode;
10
+ label: string;
11
+ root?: boolean;
12
+ change: (id: string, change: (value: ValueNode) => ValueNode) => void;
13
+ pending: (id: string, value: boolean) => void;
14
+ announce: (message: string) => void;
15
+ }
16
+ export declare function PropertyEdit(props: TreeProps): React.ReactElement;
17
+ export {};
18
+ //# sourceMappingURL=PropertyTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropertyTree.d.ts","sourceRoot":"","sources":["../../src/components/PropertyTree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkC,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,yBAAyB,CAAC;AAYpE,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,KAAK,CAAC,YAAY,CA+BrB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS,KAAK,IAAI,CAAC;IACtE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AA8FD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC,YAAY,CAuJjE"}
@@ -0,0 +1,109 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useId, useRef, useState } from 'react';
3
+ import { defaultNode, numericValue, validName } from '../lib/property-tree.js';
4
+ const types = ['text', 'number', 'boolean', 'group', 'list', 'null'];
5
+ const typeOf = (value) => value === null
6
+ ? 'null'
7
+ : Array.isArray(value)
8
+ ? 'list'
9
+ : typeof value === 'object'
10
+ ? 'group'
11
+ : typeof value;
12
+ export function PropertyRead({ value, label, }) {
13
+ const type = typeOf(value);
14
+ if (value !== null && typeof value === 'object') {
15
+ const entries = Object.entries(value);
16
+ return (_jsxs("details", { className: "property-container", open: true, children: [_jsxs("summary", { children: [_jsx("strong", { children: label }), ' ', _jsxs("span", { className: "property-type", children: [type, " \u00B7 ", entries.length, " ", entries.length === 1 ? 'entry' : 'entries'] })] }), _jsx("div", { className: "property-children", children: entries.map(([key, child], index) => (_jsx(PropertyRead, { label: Array.isArray(value) ? `Entry ${index + 1}` : key, value: child }, key))) })] }));
17
+ }
18
+ return (_jsxs("div", { className: "property-scalar", children: [_jsx("strong", { children: label }), _jsx("span", { className: "property-type", children: type }), _jsx("code", { children: typeof value === 'string' ? JSON.stringify(value) : String(value) })] }));
19
+ }
20
+ function AddValue({ node, label, root, change, pending, announce }) {
21
+ const [adding, setAdding] = useState(false);
22
+ const [name, setName] = useState('');
23
+ const [type, setType] = useState('text');
24
+ const [error, setError] = useState('');
25
+ const trigger = useRef(null);
26
+ const id = useId();
27
+ const close = () => {
28
+ setAdding(false);
29
+ setName('');
30
+ setError('');
31
+ pending(node.id, false);
32
+ requestAnimationFrame(() => trigger.current?.focus());
33
+ };
34
+ return (_jsx("div", { className: "property-add", children: !adding ? (_jsxs("button", { ref: trigger, type: "button", onClick: () => {
35
+ setAdding(true);
36
+ pending(node.id, true);
37
+ }, children: ["Add ", node.type === 'list' ? 'entry' : 'property', " to ", label] })) : (_jsxs("div", { role: "group", "aria-label": `Add to ${label}`, className: "property-add-form", children: [_jsxs("span", { children: ["Adding to ", label] }), node.type !== 'list' && (_jsxs("label", { htmlFor: `${id}-name`, children: ["Name", _jsx("input", { id: `${id}-name`, autoFocus: true, value: name, "aria-invalid": Boolean(error), "aria-describedby": error ? `${id}-error` : undefined, onChange: (event) => {
38
+ setName(event.target.value);
39
+ setError('');
40
+ } })] })), _jsxs("label", { htmlFor: `${id}-type`, children: ["Type", _jsx("select", { id: `${id}-type`, autoFocus: node.type === 'list', value: type, onChange: (event) => setType(event.target.value), children: types.map((t) => (_jsx("option", { children: t }, t))) })] }), _jsx("button", { type: "button", onClick: () => {
41
+ try {
42
+ const key = node.type === 'list' ? '' : validName(name, node, Boolean(root));
43
+ change(node.id, (current) => ({
44
+ ...current,
45
+ entries: [...current.entries, { key, node: defaultNode(type) }],
46
+ }));
47
+ announce(`Added ${node.type === 'list' ? 'entry' : key} to ${label}.`);
48
+ close();
49
+ }
50
+ catch (reason) {
51
+ setError(reason instanceof Error ? reason.message : String(reason));
52
+ document.getElementById(`${id}-name`)?.focus();
53
+ }
54
+ }, children: "Confirm addition" }), _jsx("button", { type: "button", onClick: close, children: "Cancel addition" }), error && (_jsx("span", { id: `${id}-error`, role: "alert", children: error }))] })) }));
55
+ }
56
+ export function PropertyEdit(props) {
57
+ const { node, label, root, change, pending, announce } = props;
58
+ const id = useId();
59
+ const containerRef = useRef(null);
60
+ if (node.type === 'group' || node.type === 'list') {
61
+ const content = (_jsxs(_Fragment, { children: [_jsx("div", { className: "property-children", children: node.entries.map((entry, index) => {
62
+ const childLabel = node.type === 'list' ? `Entry ${index + 1}` : entry.key;
63
+ return (_jsxs("div", { className: "property-edit-entry", children: [_jsx(PropertyEdit, { ...props, root: false, node: entry.node, label: childLabel }), _jsx("button", { type: "button", "aria-label": `Remove ${childLabel}`, onClick: (event) => {
64
+ if (entry.node.entries.length &&
65
+ !window.confirm(`Remove ${childLabel} and all its contents?`))
66
+ return;
67
+ const group = event.currentTarget.closest('.property-children');
68
+ change(node.id, (current) => ({
69
+ ...current,
70
+ entries: current.entries.filter((child) => child.node.id !== entry.node.id),
71
+ }));
72
+ const clearPending = (child) => {
73
+ pending(child.id, false);
74
+ child.entries.forEach((e) => clearPending(e.node));
75
+ };
76
+ clearPending(entry.node);
77
+ announce(`Removed ${childLabel}. Save to persist this change.`);
78
+ requestAnimationFrame(() => group?.parentElement?.querySelector('.property-add button')?.focus());
79
+ }, children: "Remove" })] }, entry.node.id));
80
+ }) }), _jsx(AddValue, { ...props })] }));
81
+ if (root)
82
+ return _jsx("div", { className: "property-root", children: content });
83
+ return (_jsxs("details", { ref: containerRef, className: "property-container", open: true, onInvalidCapture: () => {
84
+ if (containerRef.current)
85
+ containerRef.current.open = true;
86
+ }, children: [_jsxs("summary", { children: [_jsx("strong", { children: label }), ' ', _jsxs("span", { className: "property-type", children: [node.type, " \u00B7 ", node.entries.length, " entries"] })] }), content] }));
87
+ }
88
+ let numericError = '';
89
+ if (node.type === 'number') {
90
+ try {
91
+ numericValue(node.text);
92
+ }
93
+ catch (error) {
94
+ numericError = error instanceof Error ? error.message : String(error);
95
+ }
96
+ }
97
+ return (_jsxs("div", { className: "property-field", children: [node.type === 'null' ? (_jsxs("div", { children: [label, " ", _jsx("span", { className: "property-type", children: "null" })] })) : (_jsxs("label", { htmlFor: id, children: [label, " ", _jsx("span", { className: "property-type", children: node.type })] })), node.type === 'text' && (_jsx("textarea", { id: id, rows: Math.min(6, Math.max(1, node.text.split('\n').length)), value: node.text, onChange: (event) => change(node.id, (n) => ({ ...n, text: event.target.value })) })), node.type === 'number' && (_jsxs(_Fragment, { children: [_jsx("input", { id: id, inputMode: "decimal", value: node.text, "aria-invalid": Boolean(numericError), "aria-describedby": numericError ? `${id}-error` : undefined, onChange: (event) => change(node.id, (n) => ({ ...n, text: event.target.value })) }), numericError && (_jsx("span", { id: `${id}-error`, role: "alert", children: numericError }))] })), node.type === 'boolean' && (_jsx("input", { id: id, type: "checkbox", checked: node.checked, onChange: (event) => change(node.id, (n) => ({ ...n, checked: event.target.checked })) })), node.type === 'null' && (_jsxs(_Fragment, { children: [_jsx("span", { id: id, children: "null" }), _jsxs("label", { children: ["Replace ", label, " (null) with", _jsxs("select", { defaultValue: "", onChange: (event) => {
98
+ if (!event.target.value)
99
+ return;
100
+ change(node.id, (n) => ({
101
+ ...defaultNode(event.target.value),
102
+ id: n.id,
103
+ }));
104
+ announce(`Replaced null in ${label}.`);
105
+ }, children: [_jsx("option", { value: "", children: "Choose type" }), types
106
+ .filter((t) => t !== 'null')
107
+ .map((t) => (_jsx("option", { children: t }, t)))] })] })] }))] }));
108
+ }
109
+ //# sourceMappingURL=PropertyTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropertyTree.js","sourceRoot":"","sources":["../../src/components/PropertyTree.tsx"],"names":[],"mappings":"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"}
@@ -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: ![alt](url)
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,2 @@
1
+ export declare function buildItemEditorHref(itemSlug: string, boardSlug?: string): string;
2
+ //# 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,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhF"}
@@ -0,0 +1,7 @@
1
+ export function buildItemEditorHref(itemSlug, boardSlug) {
2
+ if (!boardSlug)
3
+ return `/items/${itemSlug}`;
4
+ const search = new URLSearchParams({ board: boardSlug });
5
+ return `/items/${itemSlug}?${search.toString()}`;
6
+ }
7
+ //# sourceMappingURL=item-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-board.js","sourceRoot":"","sources":["../../src/lib/item-board.ts"],"names":[],"mappings":"AAAA,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,4 @@
1
+ import type { Item, Mutation, PersistenceProvider } from '@awesome-markdown/contracts';
2
+ /** Acquire an opaque revision only if the visible source is still authoritative. */
3
+ export declare function patchVisibleItem(provider: PersistenceProvider, visible: Item, mutations: Mutation[]): Promise<void>;
4
+ //# sourceMappingURL=patch-visible-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-visible-item.d.ts","sourceRoot":"","sources":["../../src/lib/patch-visible-item.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvF,oFAAoF;AACpF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,10 @@
1
+ /** Acquire an opaque revision only if the visible source is still authoritative. */
2
+ export async function patchVisibleItem(provider, visible, mutations) {
3
+ const current = await provider.getItem(visible.slug);
4
+ if (!current)
5
+ throw new Error('Item was deleted. Reload the board.');
6
+ if (JSON.stringify(current.item) !== JSON.stringify(visible))
7
+ throw new Error('Item changed. Reload the board before moving it.');
8
+ await provider.patchItem(visible.slug, { revision: current.revision, mutations });
9
+ }
10
+ //# sourceMappingURL=patch-visible-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-visible-item.js","sourceRoot":"","sources":["../../src/lib/patch-visible-item.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA6B,EAC7B,OAAa,EACb,SAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,17 @@
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
+ * Card layouts name explicit configuration paths; property names impose no schema.
7
+ */
8
+ export declare function resolveItemProperty(item: Item, boardSlug: string, property: string): unknown;
9
+ interface PropertyValueProps {
10
+ item: Item;
11
+ boardSlug: string;
12
+ layout: PropertyDisplay;
13
+ }
14
+ /** Renders a single configured property according to its `visualStyle`. */
15
+ export declare function PropertyValueDisplay({ item, boardSlug, layout, }: PropertyValueProps): React.ReactElement | null;
16
+ export {};
17
+ //# 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;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE5F;AAiBD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,SAAS,EACT,MAAM,GACP,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA2FhD"}
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { resolvePath } from '@awesome-markdown/filter-engine';
4
+ /**
5
+ * Resolves a property's value for an item on a given board.
6
+ *
7
+ * Card layouts name explicit configuration paths; property names impose no schema.
8
+ */
9
+ export function resolveItemProperty(item, boardSlug, property) {
10
+ return resolvePath(property, item, { board: boardSlug });
11
+ }
12
+ function formatValue(value) {
13
+ if (value === undefined || value === null)
14
+ return '';
15
+ if (Array.isArray(value))
16
+ return value.map(String).join(', ');
17
+ return String(value);
18
+ }
19
+ function initials(value) {
20
+ const parts = value
21
+ .trim()
22
+ .split(/[\s_-]+/)
23
+ .filter(Boolean);
24
+ const chars = parts.length > 1 ? [parts[0][0], parts[1][0]] : [value.slice(0, 2)];
25
+ return chars.join('').toUpperCase();
26
+ }
27
+ /** Renders a single configured property according to its `visualStyle`. */
28
+ export function PropertyValueDisplay({ item, boardSlug, layout, }) {
29
+ let raw;
30
+ try {
31
+ raw = resolveItemProperty(item, boardSlug, layout.property);
32
+ }
33
+ catch (error) {
34
+ return _jsx("span", { role: "alert", children: error instanceof Error ? error.message : String(error) });
35
+ }
36
+ const text = formatValue(raw);
37
+ if (text === '')
38
+ return null;
39
+ const label = layout.label ?? layout.property;
40
+ const testId = `property-${layout.property}-${item.slug}`;
41
+ if (layout.visualStyle === 'badge') {
42
+ return (_jsx("span", { title: label, "data-testid": testId, style: {
43
+ fontFamily: 'var(--font-mono)',
44
+ fontSize: '10.5px',
45
+ fontWeight: 500,
46
+ color: 'var(--ink)',
47
+ background: 'var(--accent)',
48
+ padding: '1px 6px',
49
+ borderRadius: 0,
50
+ display: 'inline-block',
51
+ }, children: text }));
52
+ }
53
+ if (layout.visualStyle === 'tag') {
54
+ return (_jsx("span", { title: label, "data-testid": testId, style: {
55
+ fontFamily: 'var(--font-mono)',
56
+ fontSize: '10.5px',
57
+ fontWeight: 400,
58
+ color: 'var(--ink-muted)',
59
+ textTransform: 'uppercase',
60
+ letterSpacing: '0.06em',
61
+ }, children: text }));
62
+ }
63
+ if (layout.visualStyle === 'avatar') {
64
+ return (_jsx("span", { title: `${label}: ${text}`, "data-testid": testId, style: {
65
+ fontFamily: 'var(--font-sans)',
66
+ fontSize: '10px',
67
+ fontWeight: 600,
68
+ color: 'var(--bg)',
69
+ background: 'var(--ink)',
70
+ width: '18px',
71
+ height: '18px',
72
+ borderRadius: '50%',
73
+ display: 'inline-flex',
74
+ alignItems: 'center',
75
+ justifyContent: 'center',
76
+ }, children: initials(text) }));
77
+ }
78
+ // 'text' (default)
79
+ return (_jsxs("span", { "data-testid": testId, style: {
80
+ fontFamily: 'var(--font-sans)',
81
+ fontSize: '11.5px',
82
+ fontWeight: 400,
83
+ color: 'var(--ink-muted)',
84
+ }, children: [_jsxs("span", { style: { fontWeight: 500, color: 'var(--ink)' }, children: [label, ":"] }), " ", text] }));
85
+ }
86
+ //# sourceMappingURL=property-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-display.js","sourceRoot":"","sources":["../../src/lib/property-display.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,SAAiB,EAAE,QAAgB;IACjF,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAG,KAAK;SAChB,IAAI,EAAE;SACN,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;AAQD,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAAC,EACnC,IAAI,EACJ,SAAS,EACT,MAAM,GACa;IACnB,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAM,IAAI,EAAC,OAAO,YAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,CAAC;IAC5F,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAE1D,IAAI,MAAM,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,CACL,eACE,KAAK,EAAE,KAAK,iBACC,MAAM,EACnB,KAAK,EAAE;gBACL,UAAU,EAAE,kBAAkB;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,YAAY;gBACnB,UAAU,EAAE,eAAe;gBAC3B,OAAO,EAAE,SAAS;gBAClB,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,cAAc;aACxB,YAEA,IAAI,GACA,CACR,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACjC,OAAO,CACL,eACE,KAAK,EAAE,KAAK,iBACC,MAAM,EACnB,KAAK,EAAE;gBACL,UAAU,EAAE,kBAAkB;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,kBAAkB;gBACzB,aAAa,EAAE,WAAW;gBAC1B,aAAa,EAAE,QAAQ;aACxB,YAEA,IAAI,GACA,CACR,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,CACL,eACE,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,EAAE,iBACb,MAAM,EACnB,KAAK,EAAE;gBACL,UAAU,EAAE,kBAAkB;gBAC9B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,YAAY;gBACxB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,KAAK;gBACnB,OAAO,EAAE,aAAa;gBACtB,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;aACzB,YAEA,QAAQ,CAAC,IAAI,CAAC,GACV,CACR,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,OAAO,CACL,+BACe,MAAM,EACnB,KAAK,EAAE;YACL,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,kBAAkB;SAC1B,aAED,gBAAM,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,aAAG,KAAK,SAAS,OAAE,IAAI,IACvE,CACR,CAAC;AACJ,CAAC"}