@stephen-netu/design-system 0.2.0 → 0.2.2

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 (198) hide show
  1. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +10 -2
  2. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte.d.ts.map +1 -1
  3. package/dist/b0-app-shell/{command-bar/CommandBar.svelte → global-command-bar/GlobalCommandBar.svelte} +75 -75
  4. package/dist/b0-app-shell/{command-bar/CommandBar.svelte.d.ts → global-command-bar/GlobalCommandBar.svelte.d.ts} +6 -6
  5. package/dist/b0-app-shell/global-command-bar/GlobalCommandBar.svelte.d.ts.map +1 -0
  6. package/dist/b0-app-shell/index.d.ts +1 -1
  7. package/dist/b0-app-shell/index.d.ts.map +1 -1
  8. package/dist/b0-app-shell/index.js +1 -1
  9. package/dist/d0-data-viz/CheckpointPill.svelte +7 -2
  10. package/dist/d0-data-viz/CheckpointPill.svelte.d.ts.map +1 -1
  11. package/dist/d0-data-viz/theme-integration.d.ts +3 -3
  12. package/dist/d0-data-viz/theme-integration.js +3 -3
  13. package/dist/d0-data-viz/theme-integration.test.js +41 -0
  14. package/dist/demos/BspSizingInfographic.svelte +3 -32
  15. package/dist/editor/CodeEditor.test.js +38 -0
  16. package/dist/editor/FindReplaceDialog.svelte +32 -32
  17. package/dist/editor/MarkdownEditor.svelte +71 -58
  18. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  19. package/dist/editor/MarkdownEditor.test.js +38 -0
  20. package/dist/editor/components/CorrectionTooltip.svelte +0 -1
  21. package/dist/editor/extensions/expansion.d.ts.map +1 -1
  22. package/dist/editor/extensions/expansion.js +16 -10
  23. package/dist/entity-graph-view/WorldView.svelte +1 -1
  24. package/dist/fabric/ai/ChatPanel.svelte +31 -31
  25. package/dist/fabric/ai/ResearchPanel.svelte +6 -3
  26. package/dist/fabric/ai/ResearchPanel.svelte.d.ts.map +1 -1
  27. package/dist/fabric/index.d.ts +4 -5
  28. package/dist/fabric/index.d.ts.map +1 -1
  29. package/dist/fabric/index.js +3 -3
  30. package/dist/fabric/input/{CommandBar.svelte → AppHeaderBar.svelte} +13 -13
  31. package/dist/fabric/input/{CommandBar.svelte.d.ts → AppHeaderBar.svelte.d.ts} +5 -5
  32. package/dist/fabric/input/AppHeaderBar.svelte.d.ts.map +1 -0
  33. package/dist/fabric/input/{CommandBar.test.js → AppHeaderBar.test.js} +9 -9
  34. package/dist/fabric/input/index.d.ts +2 -2
  35. package/dist/fabric/input/index.d.ts.map +1 -1
  36. package/dist/fabric/input/index.js +1 -1
  37. package/dist/fabric/layout/KanbanBoard.svelte +25 -155
  38. package/dist/fabric/layout/KanbanBoard.svelte.d.ts +2 -26
  39. package/dist/fabric/layout/KanbanBoard.svelte.d.ts.map +1 -1
  40. package/dist/fabric/layout/KanbanBoard.test.js +125 -10
  41. package/dist/fabric/layout/KanbanCard.svelte +27 -223
  42. package/dist/fabric/layout/KanbanCard.svelte.d.ts +2 -19
  43. package/dist/fabric/layout/KanbanCard.svelte.d.ts.map +1 -1
  44. package/dist/fabric/layout/KanbanColumn.svelte +41 -275
  45. package/dist/fabric/layout/KanbanColumn.svelte.d.ts +2 -22
  46. package/dist/fabric/layout/KanbanColumn.svelte.d.ts.map +1 -1
  47. package/dist/fabric/layout/index.d.ts +2 -5
  48. package/dist/fabric/layout/index.d.ts.map +1 -1
  49. package/dist/fabric/layout/index.js +1 -1
  50. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +3 -3
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +4 -2
  53. package/dist/l0-layout/SectionSplitter.svelte +5 -5
  54. package/dist/l0-layout/block-writer/BlockItem.svelte +6 -4
  55. package/dist/l0-layout/card/CompactCard.svelte +4 -3
  56. package/dist/l0-layout/grant/GrantCard.svelte +15 -5
  57. package/dist/l0-layout/grant/GrantCard.svelte.d.ts.map +1 -1
  58. package/dist/l0-layout/index.d.ts +2 -0
  59. package/dist/l0-layout/index.d.ts.map +1 -1
  60. package/dist/l0-layout/index.js +1 -0
  61. package/dist/l0-layout/kanban/KanbanBoard.svelte +246 -29
  62. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts +28 -2
  63. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts.map +1 -1
  64. package/dist/l0-layout/kanban/KanbanCard.svelte +175 -150
  65. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts +16 -18
  66. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts.map +1 -1
  67. package/dist/l0-layout/kanban/KanbanColumn.svelte +152 -78
  68. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts +28 -7
  69. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts.map +1 -1
  70. package/dist/l0-layout/kanban/index.d.ts +6 -0
  71. package/dist/l0-layout/kanban/index.d.ts.map +1 -0
  72. package/dist/l0-layout/kanban/index.js +3 -0
  73. package/dist/n0-node-graph/Node.svelte +2 -2
  74. package/dist/n0-node-graph/NodePalette.svelte +2 -2
  75. package/dist/n1-flow-canvas/graph-state.test.js +69 -0
  76. package/dist/n1-flow-canvas/utils.test.js +116 -0
  77. package/dist/n3-force-graph/GraphTooltip.svelte +2 -2
  78. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +12 -11
  79. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  80. package/dist/n4-adaptive-manifold/classifier.test.js +104 -0
  81. package/dist/n4-adaptive-manifold/n4-tokens.css +2 -2
  82. package/dist/p0-primitives/ThemeProvider.svelte +10 -11
  83. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +1 -1
  84. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  85. package/dist/p0-primitives/canvas-theme.d.ts +12 -0
  86. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  87. package/dist/p0-primitives/canvas-theme.js +10 -0
  88. package/dist/p0-primitives/index.d.ts +2 -1
  89. package/dist/p0-primitives/index.d.ts.map +1 -1
  90. package/dist/p0-primitives/index.js +1 -0
  91. package/dist/p0-primitives/theme-context.d.ts +9 -0
  92. package/dist/p0-primitives/theme-context.d.ts.map +1 -0
  93. package/dist/p0-primitives/theme-context.js +8 -0
  94. package/dist/p0-primitives/tokens/tokens.css +22 -11
  95. package/dist/p0-primitives/utils/index.d.ts +2 -2
  96. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  97. package/dist/s0-state/SyncStatus.svelte +1 -1
  98. package/dist/s0-state/ThemeStore.svelte.d.ts +3 -2
  99. package/dist/s0-state/ThemeStore.svelte.d.ts.map +1 -1
  100. package/dist/s0-state/ThemeStore.svelte.js +20 -1
  101. package/dist/s0-state/index.d.ts +0 -1
  102. package/dist/s0-state/index.d.ts.map +1 -1
  103. package/dist/s0-state/index.js +1 -0
  104. package/dist/s0-state/modal-stack-store.svelte.d.ts +25 -0
  105. package/dist/s0-state/modal-stack-store.svelte.d.ts.map +1 -1
  106. package/dist/s0-state/modal-stack-store.svelte.js +19 -0
  107. package/dist/showcase/Showcase.svelte +43 -34
  108. package/dist/showcase/Showcase.svelte.d.ts.map +1 -1
  109. package/dist/spatial/BspTilingCanvas.svelte +7 -5
  110. package/dist/spatial/BspTilingCanvas.svelte.d.ts +1 -0
  111. package/dist/spatial/BspTilingCanvas.svelte.d.ts.map +1 -1
  112. package/dist/spatial/BspTilingSimulation.test.js +88 -0
  113. package/dist/spatial/CameraController.test.js +120 -0
  114. package/dist/spatial/ForceCanvas.svelte +20 -13
  115. package/dist/spatial/ForceCanvas.svelte.d.ts +1 -0
  116. package/dist/spatial/ForceCanvas.svelte.d.ts.map +1 -1
  117. package/dist/spatial/ForceSimulation.svelte.d.ts.map +1 -1
  118. package/dist/spatial/ForceSimulation.svelte.js +32 -21
  119. package/dist/spatial/LodRenderer.svelte +16 -1
  120. package/dist/spatial/LodRenderer.svelte.d.ts +1 -0
  121. package/dist/spatial/LodRenderer.svelte.d.ts.map +1 -1
  122. package/dist/spatial/SnapZoomCamera.svelte +25 -13
  123. package/dist/spatial/SnapZoomCamera.svelte.d.ts +1 -0
  124. package/dist/spatial/SnapZoomCamera.svelte.d.ts.map +1 -1
  125. package/dist/spatial/ZoneTiler.svelte +5 -2
  126. package/dist/spatial/ZoneTiler.svelte.d.ts +1 -0
  127. package/dist/spatial/ZoneTiler.svelte.d.ts.map +1 -1
  128. package/dist/spatial/d3-types.d.ts +31 -0
  129. package/dist/spatial/d3-types.d.ts.map +1 -0
  130. package/dist/spatial/d3-types.js +19 -0
  131. package/dist/ssr-import-clean.test.js +37 -0
  132. package/dist/t0-transport/fs.d.ts +12 -0
  133. package/dist/t0-transport/fs.d.ts.map +1 -0
  134. package/dist/t0-transport/fs.js +55 -0
  135. package/dist/t0-transport/index.d.ts +1 -0
  136. package/dist/t0-transport/index.d.ts.map +1 -1
  137. package/dist/t0-transport/index.js +1 -0
  138. package/dist/t0-transport/invoke.d.ts.map +1 -1
  139. package/dist/t0-transport/invoke.js +5 -2
  140. package/dist/t0-transport/quality.d.ts +12 -3
  141. package/dist/t0-transport/quality.d.ts.map +1 -1
  142. package/dist/t0-transport/quality.js +17 -4
  143. package/dist/t0-transport/substrate.svelte.d.ts +27 -0
  144. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -0
  145. package/dist/t0-transport/substrate.svelte.js +49 -0
  146. package/dist/u0-primitives/LockIndicator.svelte +1 -1
  147. package/dist/u0-primitives/VerticalToolbar.svelte +1 -1
  148. package/dist/u0-primitives/accordion/Accordion.svelte +10 -9
  149. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts +0 -7
  150. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts.map +1 -1
  151. package/dist/u0-primitives/accordion/Accordion.test.js +5 -5
  152. package/dist/u0-primitives/badge/Badge.test.js +10 -10
  153. package/dist/u0-primitives/badge/ValidityBadge.test.js +9 -9
  154. package/dist/u0-primitives/button/Button.svelte +3 -1
  155. package/dist/u0-primitives/button/Button.svelte.d.ts +1 -0
  156. package/dist/u0-primitives/button/Button.svelte.d.ts.map +1 -1
  157. package/dist/u0-primitives/button/Button.test.js +11 -11
  158. package/dist/u0-primitives/card/Card.svelte +26 -20
  159. package/dist/u0-primitives/card/Card.svelte.d.ts.map +1 -1
  160. package/dist/u0-primitives/command-palette/CommandPalette.svelte +27 -0
  161. package/dist/u0-primitives/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  162. package/dist/u0-primitives/command-palette/commandStore.svelte.d.ts.map +1 -1
  163. package/dist/u0-primitives/command-palette/commandStore.svelte.js +2 -1
  164. package/dist/u0-primitives/dropdown/Dropdown.test.js +1 -1
  165. package/dist/u0-primitives/index.d.ts +2 -0
  166. package/dist/u0-primitives/index.d.ts.map +1 -1
  167. package/dist/u0-primitives/index.js +1 -0
  168. package/dist/u0-primitives/input/Input.svelte +9 -0
  169. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  170. package/dist/u0-primitives/input/Input.test.js +1 -1
  171. package/dist/u0-primitives/modal/Modal.svelte +46 -23
  172. package/dist/u0-primitives/modal/Modal.svelte.d.ts.map +1 -1
  173. package/dist/u0-primitives/modal/Modal.test.js +63 -15
  174. package/dist/u0-primitives/rsvp/RsvpReader.svelte +8 -8
  175. package/dist/u0-primitives/rsvp/RsvpReader.svelte.d.ts.map +1 -1
  176. package/dist/u0-primitives/steps/Steps.svelte +2 -2
  177. package/dist/u0-primitives/surface-state/SurfaceState.svelte +190 -0
  178. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts +15 -0
  179. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts.map +1 -0
  180. package/dist/u0-primitives/toggle/Toggle.svelte +12 -2
  181. package/dist/u0-primitives/tooltip/Tooltip.test.js +12 -12
  182. package/dist/v0-diagrams/MarkmapDiagram.test.js +49 -0
  183. package/dist/v0-diagrams/MermaidDiagram.svelte +21 -9
  184. package/dist/v0-diagrams/MermaidDiagram.svelte.d.ts.map +1 -1
  185. package/dist/v0-diagrams/MermaidDiagram.test.js +40 -0
  186. package/package.json +51 -24
  187. package/src/n4-adaptive-manifold/n4-tokens.css +2 -2
  188. package/src/p0-primitives/tokens/tokens.css +22 -11
  189. package/src/p0-primitives/tokens/tokens.json +13 -2
  190. package/dist/b0-app-shell/command-bar/CommandBar.svelte.d.ts.map +0 -1
  191. package/dist/fabric/input/CommandBar.svelte.d.ts.map +0 -1
  192. package/dist/stores/vaultStore.svelte +0 -14
  193. package/dist/stores/vaultStore.svelte.d.ts +0 -24
  194. package/dist/stores/vaultStore.svelte.d.ts.map +0 -1
  195. package/dist/tauri/index.d.ts +0 -3
  196. package/dist/tauri/index.d.ts.map +0 -1
  197. package/dist/tauri/index.js +0 -11
  198. package/dist/types/tauri.d.ts +0 -18
@@ -1,177 +1,213 @@
1
1
  <script lang="ts">
2
- import { GripVertical, X } from '@lucide/svelte';
2
+ /**
3
+ * KanbanCard — Merged canonical component.
4
+ *
5
+ * Combines fabric's CardData pattern with l0's Card composition,
6
+ * grip-handle-only drag for WebKit compatibility,
7
+ * and keyboard DnD support (F-16).
8
+ *
9
+ * @package @kos/design-system/fabric/layout
10
+ */
3
11
  import Card from '../../u0-primitives/card/Card.svelte';
4
- import Badge from '../../u0-primitives/badge/Badge.svelte';
5
- import Avatar from '../../u0-primitives/avatar/Avatar.svelte';
6
- import type { Snippet } from 'svelte';
7
12
 
8
- export interface KanbanCardData {
13
+ export interface CardData {
9
14
  id: string;
10
15
  title: string;
11
- content?: string;
16
+ description?: string;
12
17
  priority?: 'low' | 'medium' | 'high' | 'urgent';
13
- assignee?: {
14
- name: string;
15
- src?: string;
16
- };
17
- badges?: Array<{
18
- label: string;
19
- color?: 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';
20
- }>;
18
+ tags?: string[];
19
+ dueDate?: Date;
20
+ assignee?: string;
21
+ metadata?: Record<string, unknown>;
21
22
  }
22
23
 
23
- interface Props {
24
- item: KanbanCardData;
24
+ export interface Props {
25
+ card: CardData;
25
26
  isDragging?: boolean;
26
- class?: string;
27
- ondragstart?: (e: DragEvent) => void;
28
- onclick?: () => void;
29
- ondelete?: () => void;
30
- actions?: Snippet; // Additional actions for hover state
27
+ isSelected?: boolean;
28
+ disabled?: boolean;
29
+ onClick?: (card: CardData) => void;
30
+ onDragStart?: (card: CardData) => void;
31
+ onDragEnd?: (card: CardData) => void;
32
+ onKeyDown?: (e: KeyboardEvent) => void;
33
+ moveMode?: boolean;
34
+ children?: import('svelte').Snippet;
31
35
  }
32
36
 
33
37
  let {
34
- item,
38
+ card,
35
39
  isDragging = false,
36
- class: className = '',
37
- ondragstart,
38
- onclick,
39
- ondelete,
40
- actions
40
+ isSelected = false,
41
+ disabled = false,
42
+ onClick,
43
+ onDragStart,
44
+ onDragEnd,
45
+ onKeyDown,
46
+ moveMode = false,
47
+ children,
41
48
  }: Props = $props();
42
49
 
50
+ function getPriorityColor(p: CardData['priority']): string {
51
+ switch (p) {
52
+ case 'urgent': return 'var(--color-error)';
53
+ case 'high': return 'var(--color-error)';
54
+ case 'medium': return 'var(--color-warning)';
55
+ case 'low': return 'var(--color-success)';
56
+ default: return 'transparent';
57
+ }
58
+ }
59
+
60
+ function formatDate(date: Date | undefined): string {
61
+ if (!date) return '';
62
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
63
+ }
64
+
43
65
  function handleGripDragStart(e: DragEvent) {
66
+ if (disabled) return;
44
67
  if (e.dataTransfer) {
45
- e.dataTransfer.setData('text/plain', item.id);
68
+ e.dataTransfer.setData('text/plain', card.id);
46
69
  e.dataTransfer.effectAllowed = 'move';
47
- // Use the full card wrapper as the drag ghost — dragging just the grip icon looks broken.
48
- const wrapper = (e.currentTarget as HTMLElement).closest<HTMLElement>('.ds-kanban-card-wrapper');
70
+ const wrapper = (e.currentTarget as HTMLElement).closest<HTMLElement>('.ds-kanban-card');
49
71
  if (wrapper) {
50
72
  e.dataTransfer.setDragImage(wrapper, wrapper.offsetWidth / 2, 20);
51
73
  }
52
74
  }
53
- ondragstart?.(e);
75
+ onDragStart?.(card);
54
76
  }
55
77
 
56
- function getPriorityColor(p: KanbanCardData['priority']) {
57
- switch (p) {
58
- case 'low': return 'var(--color-info)';
59
- case 'medium': return 'var(--color-warning)';
60
- case 'high': return 'var(--color-accent)';
61
- case 'urgent': return 'var(--color-error)';
62
- default: return 'transparent';
78
+ function handleCardClick() {
79
+ if (!disabled) onClick?.(card);
80
+ }
81
+
82
+ function handleCardKeyDown(e: KeyboardEvent) {
83
+ if (e.key === 'Enter' || e.key === ' ') {
84
+ e.preventDefault();
85
+ onKeyDown?.(e);
86
+ if (!e.defaultPrevented) onClick?.(card);
87
+ return;
63
88
  }
89
+ onKeyDown?.(e);
64
90
  }
65
91
  </script>
66
92
 
67
- <!-- Drag is scoped to the grip handle — the wrapper is NOT draggable.
68
- Making the whole wrapper draggable suppresses click events on WebKit (Tauri/Safari). -->
69
93
  <div
70
- class="ds-kanban-card-wrapper {className}"
94
+ class="ds-kanban-card"
71
95
  class:is-dragging={isDragging}
72
- aria-grabbed={isDragging}
96
+ class:is-selected={isSelected}
97
+ class:is-move-source={moveMode && isSelected}
98
+ class:is-disabled={disabled}
99
+ role="listitem"
100
+ aria-grabbed={isDragging || (moveMode && isSelected) ? 'true' : 'false'}
101
+ aria-label={card.title}
73
102
  >
74
- <Card
75
- variant="interactive"
76
- onclick={onclick}
77
- class="ds-kanban-card-inner"
78
- >
79
- <!-- Priority Bar -->
80
- {#if item.priority}
81
- <div
82
- class="ds-kanban-priority-bar"
83
- style="background-color: {getPriorityColor(item.priority)};"
84
- title="Priority: {item.priority}"
103
+ <Card variant="interactive" onclick={handleCardClick} onkeydown={handleCardKeyDown}>
104
+ {#if card.priority}
105
+ <div
106
+ class="ds-kanban-priority-bar"
107
+ style="background-color: {getPriorityColor(card.priority)}"
108
+ title="Priority: {card.priority}"
85
109
  ></div>
86
110
  {/if}
87
111
 
88
- <div class="ds-kanban-header">
112
+ <div class="ds-kanban-card-header">
89
113
  <!-- svelte-ignore a11y_no_static_element_interactions -->
90
114
  <div
91
115
  class="ds-kanban-drag-handle"
92
- title="Drag to reorder"
116
+ title="Drag to reorder (or press Space to move)"
93
117
  draggable="true"
94
118
  ondragstart={handleGripDragStart}
95
119
  >
96
- <GripVertical size={14} />
97
- </div>
98
-
99
- <h4 class="ds-kanban-title">{item.title}</h4>
100
-
101
- <div class="ds-kanban-actions">
102
- {#if actions}
103
- {@render actions()}
104
- {/if}
105
- {#if ondelete}
106
- <button
107
- class="ds-kanban-delete"
108
- onclick={(e) => { e.stopPropagation(); ondelete(); }}
109
- title="Delete task"
110
- aria-label="Delete task"
111
- >
112
- <X size={14} />
113
- </button>
114
- {/if}
120
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
121
+ <circle cx="5" cy="4" r="1.5" fill="currentColor"/>
122
+ <circle cx="11" cy="4" r="1.5" fill="currentColor"/>
123
+ <circle cx="5" cy="8" r="1.5" fill="currentColor"/>
124
+ <circle cx="11" cy="8" r="1.5" fill="currentColor"/>
125
+ <circle cx="5" cy="12" r="1.5" fill="currentColor"/>
126
+ <circle cx="11" cy="12" r="1.5" fill="currentColor"/>
127
+ </svg>
115
128
  </div>
129
+
130
+ <span class="ds-kanban-card-title">{card.title}</span>
116
131
  </div>
117
132
 
118
- {#if item.content}
119
- <p class="ds-kanban-preview">{item.content}</p>
133
+ {#if card.description}
134
+ <p class="ds-kanban-card-description">{card.description}</p>
120
135
  {/if}
121
136
 
122
- <div class="ds-kanban-footer">
123
- <div class="ds-kanban-badges">
124
- {#if item.badges}
125
- {#each item.badges as badge}
126
- <Badge variant="status" color={badge.color || 'neutral'} size="sm">
127
- {badge.label}
128
- </Badge>
129
- {/each}
130
- {/if}
131
- </div>
137
+ {#if children}
138
+ {@render children()}
139
+ {/if}
132
140
 
133
- {#if item.assignee}
134
- <div class="ds-kanban-assignee">
135
- <Avatar
136
- name={item.assignee.name}
137
- src={item.assignee.src}
138
- size="sm"
139
- class="ds-kanban-avatar"
140
- />
141
+ <div class="ds-kanban-card-footer">
142
+ {#if card.tags && card.tags.length > 0}
143
+ <div class="ds-kanban-card-tags">
144
+ {#each card.tags.slice(0, 3) as tag}
145
+ <span class="ds-kanban-card-tag">{tag}</span>
146
+ {/each}
147
+ {#if card.tags.length > 3}
148
+ <span class="ds-kanban-card-tag-more">+{card.tags.length - 3}</span>
149
+ {/if}
141
150
  </div>
142
151
  {/if}
152
+
153
+ {#if card.dueDate}
154
+ <span class="ds-kanban-card-due" class:overdue={card.dueDate < new Date()}>
155
+ <svg width="12" height="12" viewBox="0 0 16 16" fill="none" aria-hidden="true">
156
+ <circle cx="8" cy="8" r="7" stroke="currentColor" stroke-width="1.5"/>
157
+ <path d="M8 4v4l2.5 2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
158
+ </svg>
159
+ {formatDate(card.dueDate)}
160
+ </span>
161
+ {/if}
143
162
  </div>
144
163
  </Card>
145
164
  </div>
146
165
 
147
166
  <style>
148
- .ds-kanban-card-wrapper {
167
+ .ds-kanban-card {
149
168
  position: relative;
150
169
  width: 100%;
151
- transition: transform var(--transition-fast), opacity var(--transition-fast);
170
+ transition: transform var(--transition-fast, 0.15s), opacity var(--transition-fast, 0.15s);
171
+ cursor: pointer;
152
172
  }
153
173
 
154
- .ds-kanban-card-wrapper.is-dragging {
174
+ .ds-kanban-card.is-dragging {
155
175
  opacity: 0.5;
156
176
  transform: scale(0.98);
157
177
  }
158
178
 
159
- /* Target the inner card to override default padding */
160
- :global(.ds-kanban-card-inner.ds-card) {
179
+ .ds-kanban-card.is-selected {
180
+ box-shadow: 0 0 0 var(--border-width-default) var(--color-accent);
181
+ border-radius: var(--radius-md, 0.375rem);
182
+ }
183
+
184
+ .ds-kanban-card.is-move-source {
185
+ box-shadow: 0 0 0 var(--border-width-default) var(--color-accent), 0 0 var(--blur-lg) var(--color-accent-glow);
186
+ border-radius: var(--radius-md, 0.375rem);
187
+ }
188
+
189
+ .ds-kanban-card.is-disabled {
190
+ opacity: 0.5;
191
+ cursor: not-allowed;
192
+ pointer-events: none;
193
+ }
194
+
195
+ .ds-kanban-card :global(.ds-card) {
161
196
  padding: 0;
162
- overflow: hidden; /* For priority bar */
197
+ overflow: hidden;
198
+ position: relative;
163
199
  }
164
200
 
165
201
  .ds-kanban-priority-bar {
166
202
  position: absolute;
167
203
  top: 0;
168
204
  left: 0;
169
- width: 4px;
205
+ width: var(--space-1);
170
206
  height: 100%;
171
207
  z-index: 2;
172
208
  }
173
209
 
174
- .ds-kanban-header {
210
+ .ds-kanban-card-header {
175
211
  display: flex;
176
212
  align-items: flex-start;
177
213
  padding: var(--space-3) var(--space-4) var(--space-2) var(--space-2);
@@ -181,15 +217,9 @@
181
217
  .ds-kanban-drag-handle {
182
218
  color: var(--color-text-muted);
183
219
  cursor: grab;
184
- margin-top: 2px;
185
- padding: 2px;
186
- border-radius: var(--radius-sm);
187
- touch-action: none;
188
- opacity: 0.4;
189
- transition: opacity var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
190
220
  }
191
221
 
192
- .ds-kanban-card-wrapper:hover .ds-kanban-drag-handle {
222
+ .ds-kanban-card:hover .ds-kanban-drag-handle {
193
223
  opacity: 1;
194
224
  }
195
225
 
@@ -199,13 +229,12 @@
199
229
 
200
230
  .ds-kanban-drag-handle:hover {
201
231
  color: var(--color-text-secondary);
202
- background: var(--color-bg-panel);
232
+ background: var(--color-bg-panel, rgba(255,255,255,0.05));
203
233
  }
204
234
 
205
- .ds-kanban-title {
235
+ .ds-kanban-card-title {
206
236
  flex: 1;
207
237
  min-width: 0;
208
- margin: 0;
209
238
  font-size: var(--text-sm);
210
239
  font-weight: 500;
211
240
  color: var(--color-text-primary);
@@ -215,62 +244,58 @@
215
244
  text-overflow: ellipsis;
216
245
  }
217
246
 
218
- .ds-kanban-actions {
219
- display: flex;
220
- align-items: center;
221
- opacity: 0;
222
- transition: opacity var(--transition-fast);
223
- }
224
-
225
- .ds-kanban-card-wrapper:hover .ds-kanban-actions {
226
- opacity: 1;
227
- }
228
-
229
- .ds-kanban-delete {
230
- display: flex;
231
- align-items: center;
232
- justify-content: center;
233
- background: transparent;
234
- border: none;
235
- color: var(--color-text-muted);
236
- padding: 4px;
237
- border-radius: var(--radius-sm);
238
- cursor: pointer;
239
- }
240
-
241
- .ds-kanban-delete:hover {
242
- color: var(--color-error);
243
- background: rgba(166, 94, 94, 0.15);
244
- }
245
-
246
- .ds-kanban-preview {
247
- margin: 0 0 var(--space-3) var(--space-8);
247
+ .ds-kanban-card-description {
248
+ margin: 0 0 var(--space-3) var(--space-5);
248
249
  padding-right: var(--space-4);
249
250
  font-size: var(--text-xs);
250
251
  color: var(--color-text-secondary);
251
252
  line-height: 1.4;
252
253
  display: -webkit-box;
253
254
  -webkit-box-orient: vertical;
254
- -webkit-line-clamp: 2;
255
- line-clamp: 2;
255
+ -webkit-line-clamp: 3;
256
+ line-clamp: 3;
256
257
  overflow: hidden;
257
258
  }
258
259
 
259
- .ds-kanban-footer {
260
+ .ds-kanban-card-footer {
260
261
  display: flex;
261
262
  align-items: center;
262
263
  justify-content: space-between;
263
- padding: 0 var(--space-4) var(--space-3) var(--space-8);
264
- gap: var(--space-3);
264
+ padding: 0 var(--space-4) var(--space-3) var(--space-5);
265
+ gap: var(--space-2);
265
266
  }
266
267
 
267
- .ds-kanban-badges {
268
+ .ds-kanban-card-tags {
268
269
  display: flex;
269
270
  flex-wrap: wrap;
270
- gap: var(--space-2);
271
+ gap: var(--space-1);
271
272
  }
272
273
 
273
- .ds-kanban-assignee {
274
+ .ds-kanban-card-tag {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ font-size: 0.625rem;
278
+ padding: var(--space-05) 0.375rem;
279
+ background: var(--color-bg-canvas);
280
+ border-radius: var(--radius-sm, 0.25rem);
281
+ color: var(--color-text-tertiary);
282
+ }
283
+
284
+ .ds-kanban-card-tag-more {
285
+ font-size: 0.625rem;
286
+ color: var(--color-text-tertiary);
287
+ }
288
+
289
+ .ds-kanban-card-due {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ gap: var(--space-1);
293
+ font-size: 0.6875rem;
294
+ color: var(--color-text-tertiary);
274
295
  flex-shrink: 0;
275
296
  }
297
+
298
+ .ds-kanban-card-due.overdue {
299
+ color: var(--color-error);
300
+ }
276
301
  </style>
@@ -1,26 +1,24 @@
1
- import type { Snippet } from 'svelte';
2
- export interface KanbanCardData {
1
+ export interface CardData {
3
2
  id: string;
4
3
  title: string;
5
- content?: string;
4
+ description?: string;
6
5
  priority?: 'low' | 'medium' | 'high' | 'urgent';
7
- assignee?: {
8
- name: string;
9
- src?: string;
10
- };
11
- badges?: Array<{
12
- label: string;
13
- color?: 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';
14
- }>;
6
+ tags?: string[];
7
+ dueDate?: Date;
8
+ assignee?: string;
9
+ metadata?: Record<string, unknown>;
15
10
  }
16
- interface Props {
17
- item: KanbanCardData;
11
+ export interface Props {
12
+ card: CardData;
18
13
  isDragging?: boolean;
19
- class?: string;
20
- ondragstart?: (e: DragEvent) => void;
21
- onclick?: () => void;
22
- ondelete?: () => void;
23
- actions?: Snippet;
14
+ isSelected?: boolean;
15
+ disabled?: boolean;
16
+ onClick?: (card: CardData) => void;
17
+ onDragStart?: (card: CardData) => void;
18
+ onDragEnd?: (card: CardData) => void;
19
+ onKeyDown?: (e: KeyboardEvent) => void;
20
+ moveMode?: boolean;
21
+ children?: import('svelte').Snippet;
24
22
  }
25
23
  declare const KanbanCard: import("svelte").Component<Props, {}, "">;
26
24
  type KanbanCard = ReturnType<typeof KanbanCard>;
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanCard.svelte.d.ts","sourceRoot":"","sources":["../../../src/l0-layout/kanban/KanbanCard.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;KACzE,CAAC,CAAC;CACJ;AAED,UAAU,KAAK;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoGH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"KanbanCard.svelte.d.ts","sourceRoot":"","sources":["../../../src/l0-layout/kanban/KanbanCard.svelte.ts"],"names":[],"mappings":"AAeE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACrC;AA0HH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}