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