@plures/design-dojo 0.5.3 → 0.7.1

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 (250) hide show
  1. package/dist/app/CanvasBreadcrumb.svelte +146 -0
  2. package/dist/app/CanvasBreadcrumb.svelte.d.ts +19 -0
  3. package/dist/app/CanvasBreadcrumb.types.js +1 -0
  4. package/dist/app/ChatInput.svelte +296 -0
  5. package/dist/app/ChatInput.svelte.d.ts +15 -0
  6. package/dist/app/ChatView.svelte +542 -0
  7. package/dist/app/ChatView.svelte.d.ts +19 -0
  8. package/dist/app/ChatView.types.js +1 -0
  9. package/dist/app/ConversationGraph.svelte +471 -0
  10. package/dist/app/ConversationGraph.svelte.d.ts +20 -0
  11. package/dist/app/FirstRunWizard.svelte +542 -0
  12. package/dist/app/FirstRunWizard.svelte.d.ts +10 -0
  13. package/dist/app/FirstRunWizard.types.js +1 -0
  14. package/dist/app/MemorySidebar.svelte +258 -0
  15. package/dist/app/MemorySidebar.svelte.d.ts +9 -0
  16. package/dist/app/MemorySidebar.types.js +1 -0
  17. package/dist/app/PeerStatusPanel.svelte +464 -0
  18. package/dist/app/PeerStatusPanel.svelte.d.ts +16 -0
  19. package/dist/app/ProcedureCanvas.svelte +994 -0
  20. package/dist/app/ProcedureCanvas.svelte.d.ts +12 -0
  21. package/dist/app/ProcedureCanvas.types.js +1 -0
  22. package/dist/app/ProcedureEditor.svelte +494 -0
  23. package/dist/app/ProcedureEditor.svelte.d.ts +11 -0
  24. package/dist/app/ProcedureEditor.types.js +1 -0
  25. package/dist/app/ProcedureInspector.svelte +520 -0
  26. package/dist/app/ProcedureInspector.svelte.d.ts +15 -0
  27. package/dist/app/ProcedureNode.svelte +283 -0
  28. package/dist/app/ProcedureNode.svelte.d.ts +26 -0
  29. package/dist/app/Realm.types.js +1 -0
  30. package/dist/app/RealmIndicator.svelte +81 -0
  31. package/dist/app/RealmIndicator.svelte.d.ts +10 -0
  32. package/dist/app/RealmSwitcher.svelte +354 -0
  33. package/dist/app/RealmSwitcher.svelte.d.ts +16 -0
  34. package/dist/app/SemanticConversation.types.js +1 -0
  35. package/dist/app/SemanticSearchInput.svelte +630 -0
  36. package/dist/app/SemanticSearchInput.svelte.d.ts +20 -0
  37. package/dist/app/SemanticSearchInput.types.js +1 -0
  38. package/dist/app/SemanticTimeline.svelte +426 -0
  39. package/dist/app/SemanticTimeline.svelte.d.ts +13 -0
  40. package/dist/app/SettingsPanel.svelte +330 -0
  41. package/dist/app/SettingsPanel.svelte.d.ts +12 -0
  42. package/dist/app/SettingsPanel.types.js +1 -0
  43. package/dist/app/SubCanvas.svelte +457 -0
  44. package/dist/app/SubCanvas.svelte.d.ts +48 -0
  45. package/dist/app/SubCanvas.types.js +1 -0
  46. package/dist/app/Sync.types.js +1 -0
  47. package/dist/app/SyncIndicator.svelte +219 -0
  48. package/dist/app/SyncIndicator.svelte.d.ts +15 -0
  49. package/dist/app/SyncTimeline.svelte +299 -0
  50. package/dist/app/SyncTimeline.svelte.d.ts +12 -0
  51. package/dist/app/TagCloud.svelte +287 -0
  52. package/dist/app/TagCloud.svelte.d.ts +12 -0
  53. package/dist/app/WorkModeToggle.svelte +188 -0
  54. package/dist/app/WorkModeToggle.svelte.d.ts +17 -0
  55. package/dist/data/List.svelte +104 -0
  56. package/dist/data/List.svelte.d.ts +18 -0
  57. package/dist/data/ListItem.svelte +130 -0
  58. package/dist/data/ListItem.svelte.d.ts +12 -0
  59. package/dist/data/Table.svelte +241 -0
  60. package/dist/data/Table.svelte.d.ts +17 -0
  61. package/dist/data/index.d.ts +3 -0
  62. package/dist/data/index.js +3 -0
  63. package/dist/disclosure/Accordion.svelte +48 -0
  64. package/dist/disclosure/Accordion.svelte.d.ts +15 -0
  65. package/dist/feedback/Badge.svelte +60 -0
  66. package/dist/feedback/Badge.svelte.d.ts +14 -0
  67. package/dist/feedback/Callout.svelte +52 -0
  68. package/dist/feedback/Callout.svelte.d.ts +12 -0
  69. package/dist/feedback/EmptyState.svelte +47 -0
  70. package/dist/feedback/EmptyState.svelte.d.ts +12 -0
  71. package/dist/feedback/ProgressBar.svelte +95 -0
  72. package/dist/feedback/ProgressBar.svelte.d.ts +16 -0
  73. package/dist/forms/FileUpload.svelte +99 -0
  74. package/dist/forms/FileUpload.svelte.d.ts +18 -0
  75. package/dist/forms/RadioGroup.svelte +84 -0
  76. package/dist/forms/RadioGroup.svelte.d.ts +19 -0
  77. package/dist/icons/NerdFont.svelte +44 -0
  78. package/dist/icons/NerdFont.svelte.d.ts +13 -0
  79. package/dist/icons/index.d.ts +1 -0
  80. package/dist/icons/index.js +1 -0
  81. package/dist/index.d.ts +76 -0
  82. package/dist/index.js +70 -6212
  83. package/dist/layout/Box.svelte +207 -0
  84. package/dist/layout/Box.svelte.d.ts +22 -0
  85. package/dist/layout/Sidebar.svelte +210 -0
  86. package/dist/layout/Sidebar.svelte.d.ts +22 -0
  87. package/dist/layout/SplitPane.svelte +64 -0
  88. package/dist/layout/SplitPane.svelte.d.ts +12 -0
  89. package/dist/layout/StatusBar.svelte +83 -0
  90. package/dist/layout/StatusBar.svelte.d.ts +12 -0
  91. package/dist/layout/StatusBarItem.svelte +146 -0
  92. package/dist/layout/StatusBarItem.svelte.d.ts +15 -0
  93. package/dist/layout/StatusBarSpacer.svelte +38 -0
  94. package/dist/layout/StatusBarSpacer.svelte.d.ts +3 -0
  95. package/dist/layout/Tabs.svelte +254 -0
  96. package/dist/layout/Tabs.svelte.d.ts +21 -0
  97. package/dist/layout/Tabs.types.js +1 -0
  98. package/dist/layout/TitleBar.svelte +422 -0
  99. package/dist/layout/TitleBar.svelte.d.ts +22 -0
  100. package/dist/layout/index.d.ts +9 -0
  101. package/dist/layout/index.js +8 -0
  102. package/dist/motion/index.d.ts +1 -0
  103. package/dist/motion/index.js +1 -0
  104. package/dist/motion/spring.js +116 -0
  105. package/dist/overlays/ContextMenu.svelte +268 -0
  106. package/dist/overlays/ContextMenu.svelte.d.ts +17 -0
  107. package/dist/overlays/Dialog.svelte +264 -0
  108. package/dist/overlays/Dialog.svelte.d.ts +20 -0
  109. package/dist/overlays/Menu.svelte +274 -0
  110. package/dist/overlays/Menu.svelte.d.ts +26 -0
  111. package/dist/overlays/Menu.types.js +1 -0
  112. package/dist/overlays/Popover.svelte +158 -0
  113. package/dist/overlays/Popover.svelte.d.ts +21 -0
  114. package/dist/overlays/Toast.svelte +179 -0
  115. package/dist/overlays/Toast.svelte.d.ts +19 -0
  116. package/dist/overlays/Tooltip.svelte +114 -0
  117. package/dist/overlays/Tooltip.svelte.d.ts +17 -0
  118. package/dist/overlays/index.d.ts +7 -0
  119. package/dist/overlays/index.js +6 -0
  120. package/dist/primitives/Button.svelte +217 -0
  121. package/dist/primitives/Button.svelte.d.ts +13 -0
  122. package/dist/primitives/ContextMenu.svelte +242 -0
  123. package/dist/primitives/ContextMenu.svelte.d.ts +18 -0
  124. package/dist/primitives/ContextMenu.types.js +1 -0
  125. package/dist/primitives/Input.svelte +468 -0
  126. package/dist/primitives/Input.svelte.d.ts +21 -0
  127. package/dist/primitives/MarkdownEditor.svelte +781 -0
  128. package/dist/primitives/MarkdownEditor.svelte.d.ts +21 -0
  129. package/dist/primitives/MarkdownEditor.types.js +1 -0
  130. package/dist/primitives/SearchInput.svelte +623 -0
  131. package/dist/primitives/SearchInput.svelte.d.ts +24 -0
  132. package/dist/primitives/Select.svelte +336 -0
  133. package/dist/primitives/Select.svelte.d.ts +18 -0
  134. package/dist/primitives/Text.svelte +177 -0
  135. package/dist/primitives/Text.svelte.d.ts +26 -0
  136. package/dist/primitives/Toggle.svelte +138 -0
  137. package/dist/primitives/Toggle.svelte.d.ts +9 -0
  138. package/dist/primitives/index.d.ts +9 -0
  139. package/dist/primitives/index.js +7 -0
  140. package/dist/primitives/search-input-types.js +1 -0
  141. package/dist/surfaces/ChatPane.svelte +520 -0
  142. package/dist/surfaces/ChatPane.svelte.d.ts +15 -0
  143. package/dist/surfaces/ChatPane.types.js +1 -0
  144. package/dist/surfaces/GlassPanel.svelte +118 -0
  145. package/dist/surfaces/GlassPanel.svelte.d.ts +19 -0
  146. package/dist/surfaces/Pane.svelte +172 -0
  147. package/dist/surfaces/Pane.svelte.d.ts +25 -0
  148. package/dist/surfaces/index.d.ts +4 -0
  149. package/dist/surfaces/index.js +3 -0
  150. package/dist/telemetry/correlation.js +26 -0
  151. package/dist/telemetry/index.d.ts +4 -4
  152. package/dist/telemetry/index.js +20 -101
  153. package/dist/telemetry/sampling.js +58 -0
  154. package/dist/telemetry/tracer.d.ts +16 -1
  155. package/dist/telemetry/tracer.js +112 -0
  156. package/dist/tokens.css +123 -0
  157. package/dist/tui-tokens.css +36 -0
  158. package/dist/useTui.js +31 -0
  159. package/package.json +32 -22
  160. package/dist/design-dojo.css +0 -1
  161. package/dist/enforce/index.d.ts +0 -75
  162. package/dist/enforce/known-components.d.ts +0 -7
  163. package/dist/enforce/rules/no-local-components.d.ts +0 -29
  164. package/dist/enforce/rules/prefer-design-dojo-imports.d.ts +0 -27
  165. package/dist/enforce.js +0 -132
  166. package/dist/lib/app/CanvasBreadcrumb.svelte.d.ts +0 -1
  167. package/dist/lib/app/ChatInput.svelte.d.ts +0 -1
  168. package/dist/lib/app/ChatView.svelte.d.ts +0 -1
  169. package/dist/lib/app/ConversationGraph.svelte.d.ts +0 -1
  170. package/dist/lib/app/FirstRunWizard.svelte.d.ts +0 -1
  171. package/dist/lib/app/MemorySidebar.svelte.d.ts +0 -1
  172. package/dist/lib/app/PeerStatusPanel.svelte.d.ts +0 -1
  173. package/dist/lib/app/ProcedureCanvas.svelte.d.ts +0 -1
  174. package/dist/lib/app/ProcedureEditor.svelte.d.ts +0 -1
  175. package/dist/lib/app/ProcedureInspector.svelte.d.ts +0 -1
  176. package/dist/lib/app/ProcedureNode.svelte.d.ts +0 -1
  177. package/dist/lib/app/RealmIndicator.svelte.d.ts +0 -1
  178. package/dist/lib/app/RealmSwitcher.svelte.d.ts +0 -1
  179. package/dist/lib/app/SemanticSearchInput.svelte.d.ts +0 -1
  180. package/dist/lib/app/SemanticTimeline.svelte.d.ts +0 -1
  181. package/dist/lib/app/SettingsPanel.svelte.d.ts +0 -1
  182. package/dist/lib/app/SubCanvas.svelte.d.ts +0 -1
  183. package/dist/lib/app/SyncIndicator.svelte.d.ts +0 -1
  184. package/dist/lib/app/SyncTimeline.svelte.d.ts +0 -1
  185. package/dist/lib/app/TagCloud.svelte.d.ts +0 -1
  186. package/dist/lib/app/WorkModeToggle.svelte.d.ts +0 -1
  187. package/dist/lib/data/List.svelte.d.ts +0 -1
  188. package/dist/lib/data/ListItem.svelte.d.ts +0 -1
  189. package/dist/lib/data/Table.svelte.d.ts +0 -1
  190. package/dist/lib/data/index.d.ts +0 -3
  191. package/dist/lib/disclosure/Accordion.svelte.d.ts +0 -1
  192. package/dist/lib/feedback/Badge.svelte.d.ts +0 -1
  193. package/dist/lib/feedback/Callout.svelte.d.ts +0 -1
  194. package/dist/lib/feedback/EmptyState.svelte.d.ts +0 -1
  195. package/dist/lib/feedback/ProgressBar.svelte.d.ts +0 -1
  196. package/dist/lib/forms/FileUpload.svelte.d.ts +0 -1
  197. package/dist/lib/forms/RadioGroup.svelte.d.ts +0 -1
  198. package/dist/lib/icons/NerdFont.svelte.d.ts +0 -1
  199. package/dist/lib/icons/index.d.ts +0 -1
  200. package/dist/lib/index.d.ts +0 -76
  201. package/dist/lib/layout/Box.svelte.d.ts +0 -1
  202. package/dist/lib/layout/Sidebar.svelte.d.ts +0 -1
  203. package/dist/lib/layout/SplitPane.svelte.d.ts +0 -1
  204. package/dist/lib/layout/StatusBar.svelte.d.ts +0 -1
  205. package/dist/lib/layout/StatusBarItem.svelte.d.ts +0 -1
  206. package/dist/lib/layout/StatusBarSpacer.svelte.d.ts +0 -1
  207. package/dist/lib/layout/Tabs.svelte.d.ts +0 -1
  208. package/dist/lib/layout/TitleBar.svelte.d.ts +0 -1
  209. package/dist/lib/layout/index.d.ts +0 -9
  210. package/dist/lib/motion/index.d.ts +0 -1
  211. package/dist/lib/overlays/ContextMenu.svelte.d.ts +0 -1
  212. package/dist/lib/overlays/Dialog.svelte.d.ts +0 -1
  213. package/dist/lib/overlays/Menu.svelte.d.ts +0 -1
  214. package/dist/lib/overlays/Popover.svelte.d.ts +0 -1
  215. package/dist/lib/overlays/Toast.svelte.d.ts +0 -1
  216. package/dist/lib/overlays/Tooltip.svelte.d.ts +0 -1
  217. package/dist/lib/overlays/index.d.ts +0 -7
  218. package/dist/lib/primitives/Button.svelte.d.ts +0 -1
  219. package/dist/lib/primitives/ContextMenu.svelte.d.ts +0 -1
  220. package/dist/lib/primitives/Input.svelte.d.ts +0 -1
  221. package/dist/lib/primitives/MarkdownEditor.svelte.d.ts +0 -1
  222. package/dist/lib/primitives/SearchInput.svelte.d.ts +0 -1
  223. package/dist/lib/primitives/Select.svelte.d.ts +0 -1
  224. package/dist/lib/primitives/Text.svelte.d.ts +0 -1
  225. package/dist/lib/primitives/Toggle.svelte.d.ts +0 -1
  226. package/dist/lib/primitives/index.d.ts +0 -9
  227. package/dist/lib/surfaces/ChatPane.svelte.d.ts +0 -1
  228. package/dist/lib/surfaces/GlassPanel.svelte.d.ts +0 -1
  229. package/dist/lib/surfaces/Pane.svelte.d.ts +0 -1
  230. package/dist/lib/surfaces/index.d.ts +0 -4
  231. /package/dist/{lib/app → app}/CanvasBreadcrumb.types.d.ts +0 -0
  232. /package/dist/{lib/app → app}/ChatView.types.d.ts +0 -0
  233. /package/dist/{lib/app → app}/FirstRunWizard.types.d.ts +0 -0
  234. /package/dist/{lib/app → app}/MemorySidebar.types.d.ts +0 -0
  235. /package/dist/{lib/app → app}/ProcedureCanvas.types.d.ts +0 -0
  236. /package/dist/{lib/app → app}/ProcedureEditor.types.d.ts +0 -0
  237. /package/dist/{lib/app → app}/Realm.types.d.ts +0 -0
  238. /package/dist/{lib/app → app}/SemanticConversation.types.d.ts +0 -0
  239. /package/dist/{lib/app → app}/SemanticSearchInput.types.d.ts +0 -0
  240. /package/dist/{lib/app → app}/SettingsPanel.types.d.ts +0 -0
  241. /package/dist/{lib/app → app}/SubCanvas.types.d.ts +0 -0
  242. /package/dist/{lib/app → app}/Sync.types.d.ts +0 -0
  243. /package/dist/{lib/layout → layout}/Tabs.types.d.ts +0 -0
  244. /package/dist/{lib/motion → motion}/spring.d.ts +0 -0
  245. /package/dist/{lib/overlays → overlays}/Menu.types.d.ts +0 -0
  246. /package/dist/{lib/primitives → primitives}/ContextMenu.types.d.ts +0 -0
  247. /package/dist/{lib/primitives → primitives}/MarkdownEditor.types.d.ts +0 -0
  248. /package/dist/{lib/primitives → primitives}/search-input-types.d.ts +0 -0
  249. /package/dist/{lib/surfaces → surfaces}/ChatPane.types.d.ts +0 -0
  250. /package/dist/{lib/useTui.d.ts → useTui.d.ts} +0 -0
@@ -0,0 +1,12 @@
1
+ import type { ProcedureCanvasState } from "./ProcedureCanvas.types.js";
2
+ interface Props {
3
+ /** Initial canvas state. */
4
+ state?: ProcedureCanvasState;
5
+ /** Custom CSS class. */
6
+ class?: string;
7
+ /** Fired whenever the canvas state changes. */
8
+ onchange?: (canvasState: ProcedureCanvasState) => void;
9
+ }
10
+ declare const ProcedureCanvas: import("svelte").Component<Props, {}, "">;
11
+ type ProcedureCanvas = ReturnType<typeof ProcedureCanvas>;
12
+ export default ProcedureCanvas;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,494 @@
1
+ <!--
2
+ ProcedureEditor — Agent procedures with list and canvas views.
3
+
4
+ Features:
5
+ - Toggle enable/disable per procedure (spring-physics Toggle)
6
+ - Inline edit: event type and priority
7
+ - Delete procedure
8
+ - Add new procedure
9
+ - onchange callback emits full updated list
10
+ - Toggle between list view and visual canvas editor
11
+ -->
12
+ <script lang="ts">
13
+ import Toggle from "../primitives/Toggle.svelte";
14
+ import ProcedureCanvas from "./ProcedureCanvas.svelte";
15
+ import type { Procedure } from "./ProcedureEditor.types.js";
16
+ import type { CanvasNode, ProcedureCanvasState } from "./ProcedureCanvas.types.js";
17
+
18
+ interface Props {
19
+ procedures?: Procedure[];
20
+ /** Custom CSS class. */
21
+ class?: string;
22
+ /** Fired on any change with the full updated list. */
23
+ onchange?: (procedures: Procedure[]) => void;
24
+ }
25
+
26
+ let { procedures = $bindable([]), class: className = "", onchange }: Props = $props();
27
+
28
+ let view: "list" | "canvas" = $state("list");
29
+
30
+ // Local deep copy so we control mutations
31
+ let items: Procedure[] = $state(procedures.map((p) => ({ ...p })));
32
+
33
+ /** Convert procedure list to a basic canvas state. */
34
+ function toCanvasState(procs: Procedure[]): ProcedureCanvasState {
35
+ const nodes: CanvasNode[] = procs.map((p, i) => ({
36
+ id: p.id,
37
+ type: "procedure" as const,
38
+ label: p.name,
39
+ position: { x: 60 + (i % 3) * 240, y: 60 + Math.floor(i / 3) * 160 },
40
+ config: { eventType: p.eventType, priority: p.priority, enabled: p.enabled },
41
+ ports: {
42
+ inputs: [{ id: `${p.id}-in`, label: p.eventType }],
43
+ outputs: [{ id: `${p.id}-out`, label: "out" }],
44
+ },
45
+ status: p.enabled ? "active" : "inactive",
46
+ }));
47
+ return { nodes, edges: [], viewport: { x: 40, y: 40, zoom: 1 } };
48
+ }
49
+
50
+ const canvasState = $derived(toCanvasState(items));
51
+
52
+ // Track which item is being edited inline
53
+ let editingId: string | null = $state(null);
54
+
55
+ function notify() {
56
+ onchange?.(items.map((p) => ({ ...p })));
57
+ }
58
+
59
+ function toggleEnabled(id: string, checked: boolean) {
60
+ items = items.map((p) => (p.id === id ? { ...p, enabled: checked } : p));
61
+ notify();
62
+ }
63
+
64
+ function setEventType(id: string, value: string) {
65
+ items = items.map((p) => (p.id === id ? { ...p, eventType: value } : p));
66
+ }
67
+
68
+ function setPriority(id: string, value: string) {
69
+ const n = parseInt(value, 10);
70
+ if (!isNaN(n)) items = items.map((p) => (p.id === id ? { ...p, priority: n } : p));
71
+ }
72
+
73
+ function commitEdit(id: string) {
74
+ editingId = null;
75
+ notify();
76
+ }
77
+
78
+ function deleteProcedure(id: string) {
79
+ items = items.filter((p) => p.id !== id);
80
+ if (editingId === id) editingId = null;
81
+ notify();
82
+ }
83
+
84
+ function addProcedure() {
85
+ const id =
86
+ typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
87
+ ? `proc-${crypto.randomUUID()}`
88
+ : `proc-${Date.now()}-${Math.random().toString(36).slice(2)}`;
89
+ const newProc: Procedure = {
90
+ id,
91
+ name: "New Procedure",
92
+ enabled: true,
93
+ eventType: "message",
94
+ priority: 0,
95
+ };
96
+ items = [...items, newProc];
97
+ editingId = id;
98
+ notify();
99
+ }
100
+ </script>
101
+
102
+ <div class="proc-editor {className}" aria-label="Procedure editor">
103
+ <div class="proc-editor__header">
104
+ <h3 class="proc-editor__title">Procedures</h3>
105
+ <div class="proc-editor__header-actions">
106
+ <!-- View toggle -->
107
+ <div class="proc-editor__view-toggle" role="group" aria-label="View mode">
108
+ <button
109
+ class="proc-editor__view-btn"
110
+ class:proc-editor__view-btn--active={view === "list"}
111
+ type="button"
112
+ onclick={() => (view = "list")}
113
+ aria-pressed={view === "list"}
114
+ title="List view"
115
+ >≡</button>
116
+ <button
117
+ class="proc-editor__view-btn"
118
+ class:proc-editor__view-btn--active={view === "canvas"}
119
+ type="button"
120
+ onclick={() => (view = "canvas")}
121
+ aria-pressed={view === "canvas"}
122
+ title="Canvas view"
123
+ >⬡</button>
124
+ </div>
125
+ {#if view === "list"}
126
+ <button
127
+ class="proc-editor__add-btn"
128
+ type="button"
129
+ onclick={addProcedure}
130
+ aria-label="Add procedure"
131
+ >+ Add</button>
132
+ {/if}
133
+ </div>
134
+ </div>
135
+
136
+ {#if view === "canvas"}
137
+ <div class="proc-editor__canvas-wrap">
138
+ <ProcedureCanvas state={canvasState} />
139
+ </div>
140
+ {:else}
141
+ <div class="proc-editor__list" role="list">
142
+ {#if items.length === 0}
143
+ <p class="proc-editor__empty">No procedures yet. Click "+ Add" to create one.</p>
144
+ {:else}
145
+ {#each items as proc (proc.id)}
146
+ <div
147
+ class="proc-editor__item"
148
+ class:proc-editor__item--disabled={!proc.enabled}
149
+ role="listitem"
150
+ >
151
+ <div class="proc-editor__item-main">
152
+ <Toggle
153
+ checked={proc.enabled}
154
+ onchange={(checked) => toggleEnabled(proc.id, checked)}
155
+ />
156
+ <div class="proc-editor__item-info">
157
+ {#if editingId === proc.id}
158
+ <input
159
+ class="proc-editor__name-input"
160
+ type="text"
161
+ value={proc.name}
162
+ oninput={(e) => {
163
+ const v = (e.target as HTMLInputElement).value;
164
+ items = items.map((p) => (p.id === proc.id ? { ...p, name: v } : p));
165
+ }}
166
+ aria-label="Procedure name"
167
+ onblur={() => commitEdit(proc.id)}
168
+ onkeydown={(e) => e.key === "Enter" && commitEdit(proc.id)}
169
+ />
170
+ {:else}
171
+ <span class="proc-editor__name">{proc.name}</span>
172
+ {/if}
173
+ {#if proc.description}
174
+ <span class="proc-editor__desc">{proc.description}</span>
175
+ {/if}
176
+ </div>
177
+ <div class="proc-editor__item-actions">
178
+ <button
179
+ class="proc-editor__icon-btn"
180
+ type="button"
181
+ onclick={() => (editingId = editingId === proc.id ? null : proc.id)}
182
+ aria-label="Edit procedure"
183
+ title="Edit"
184
+ >✏️</button>
185
+ <button
186
+ class="proc-editor__icon-btn proc-editor__icon-btn--danger"
187
+ type="button"
188
+ onclick={() => deleteProcedure(proc.id)}
189
+ aria-label="Delete procedure"
190
+ title="Delete"
191
+ >🗑</button>
192
+ </div>
193
+ </div>
194
+
195
+ {#if editingId === proc.id}
196
+ <div class="proc-editor__item-fields">
197
+ <label class="proc-editor__field">
198
+ <span class="proc-editor__field-label">Event Type</span>
199
+ <input
200
+ class="proc-editor__field-input"
201
+ type="text"
202
+ value={proc.eventType}
203
+ placeholder="message"
204
+ oninput={(e) => setEventType(proc.id, (e.target as HTMLInputElement).value)}
205
+ aria-label="Event type"
206
+ />
207
+ </label>
208
+ <label class="proc-editor__field">
209
+ <span class="proc-editor__field-label">Priority</span>
210
+ <input
211
+ class="proc-editor__field-input proc-editor__field-input--narrow"
212
+ type="number"
213
+ value={proc.priority}
214
+ min="0"
215
+ max="999"
216
+ oninput={(e) => setPriority(proc.id, (e.target as HTMLInputElement).value)}
217
+ aria-label="Priority"
218
+ />
219
+ </label>
220
+ </div>
221
+ {:else}
222
+ <div class="proc-editor__item-meta">
223
+ <span class="proc-editor__chip">⚡ {proc.eventType}</span>
224
+ <span class="proc-editor__chip">↑ {proc.priority}</span>
225
+ </div>
226
+ {/if}
227
+ </div>
228
+ {/each}
229
+ {/if}
230
+ </div>
231
+ {/if}
232
+ </div>
233
+
234
+ <style>
235
+ .proc-editor {
236
+ display: flex;
237
+ flex-direction: column;
238
+ height: 100%;
239
+ background: var(--surface-1, #141414);
240
+ color: var(--color-text, #e8e8e8);
241
+ }
242
+
243
+ /* ── Header ── */
244
+ .proc-editor__header {
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: space-between;
248
+ padding: var(--space-4, 16px);
249
+ border-bottom: 1px solid var(--color-border, #2a2a2a);
250
+ flex-shrink: 0;
251
+ }
252
+
253
+ .proc-editor__title {
254
+ margin: 0;
255
+ font-size: var(--text-sm, 14px);
256
+ font-weight: 700;
257
+ text-transform: uppercase;
258
+ letter-spacing: 0.06em;
259
+ color: var(--color-text-muted, #888);
260
+ }
261
+
262
+ .proc-editor__add-btn {
263
+ background: var(--color-accent, #6366f1);
264
+ color: white;
265
+ border: none;
266
+ border-radius: var(--radius-md, 10px);
267
+ padding: 6px 14px;
268
+ font-size: var(--text-sm, 14px);
269
+ font-weight: 600;
270
+ cursor: pointer;
271
+ transition: background 0.15s;
272
+ }
273
+
274
+ .proc-editor__add-btn:hover { background: var(--color-accent-hover, #818cf8); }
275
+
276
+ /* ── Header actions ── */
277
+ .proc-editor__header-actions {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: var(--space-2, 8px);
281
+ }
282
+
283
+ /* ── View toggle ── */
284
+ .proc-editor__view-toggle {
285
+ display: flex;
286
+ border: 1px solid var(--color-border, #2a2a2a);
287
+ border-radius: var(--radius-sm, 6px);
288
+ overflow: hidden;
289
+ }
290
+
291
+ .proc-editor__view-btn {
292
+ background: none;
293
+ border: none;
294
+ color: var(--color-text-muted, #888);
295
+ font-size: 16px;
296
+ width: 30px;
297
+ height: 26px;
298
+ cursor: pointer;
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ transition: background 0.1s, color 0.1s;
303
+ padding: 0;
304
+ }
305
+
306
+ .proc-editor__view-btn:hover {
307
+ background: var(--alpha-10, rgba(255,255,255,0.08));
308
+ color: var(--color-text, #e8e8e8);
309
+ }
310
+
311
+ .proc-editor__view-btn--active {
312
+ background: var(--color-accent, #6366f1);
313
+ color: white;
314
+ }
315
+
316
+ /* ── Canvas wrapper ── */
317
+ .proc-editor__canvas-wrap {
318
+ flex: 1;
319
+ min-height: 0;
320
+ display: flex;
321
+ }
322
+
323
+ /* ── List ── */
324
+ .proc-editor__list {
325
+ flex: 1;
326
+ min-height: 0;
327
+ overflow-y: auto;
328
+ padding: var(--space-3, 12px);
329
+ display: flex;
330
+ flex-direction: column;
331
+ gap: var(--space-2, 8px);
332
+ }
333
+
334
+ .proc-editor__empty {
335
+ margin: var(--space-4, 16px) 0;
336
+ text-align: center;
337
+ font-size: var(--text-sm, 14px);
338
+ color: var(--color-text-subtle, #555);
339
+ }
340
+
341
+ /* ── Item ── */
342
+ .proc-editor__item {
343
+ background: var(--surface-2, #1e1e1e);
344
+ border: 1px solid var(--color-border, #2a2a2a);
345
+ border-radius: var(--radius-md, 10px);
346
+ padding: var(--space-3, 12px);
347
+ display: flex;
348
+ flex-direction: column;
349
+ gap: var(--space-2, 8px);
350
+ transition: border-color 0.15s;
351
+ }
352
+
353
+ .proc-editor__item:hover { border-color: color-mix(in srgb, var(--color-accent, #6366f1) 30%, var(--color-border, #2a2a2a)); }
354
+
355
+ .proc-editor__item--disabled {
356
+ opacity: 0.5;
357
+ }
358
+
359
+ .proc-editor__item-main {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: var(--space-3, 12px);
363
+ }
364
+
365
+ /* ── Info ── */
366
+ .proc-editor__item-info {
367
+ flex: 1;
368
+ min-width: 0;
369
+ display: flex;
370
+ flex-direction: column;
371
+ gap: 2px;
372
+ }
373
+
374
+ .proc-editor__name {
375
+ font-size: var(--text-sm, 14px);
376
+ font-weight: 600;
377
+ color: var(--color-text, #e8e8e8);
378
+ white-space: nowrap;
379
+ overflow: hidden;
380
+ text-overflow: ellipsis;
381
+ }
382
+
383
+ .proc-editor__desc {
384
+ font-size: var(--text-xs, 12px);
385
+ color: var(--color-text-muted, #888);
386
+ white-space: nowrap;
387
+ overflow: hidden;
388
+ text-overflow: ellipsis;
389
+ }
390
+
391
+ .proc-editor__name-input {
392
+ width: 100%;
393
+ background: transparent;
394
+ border: none;
395
+ border-bottom: 1.5px solid var(--color-accent, #6366f1);
396
+ outline: none;
397
+ color: var(--color-text, #e8e8e8);
398
+ font-family: inherit;
399
+ font-size: var(--text-sm, 14px);
400
+ font-weight: 600;
401
+ padding: 2px 0;
402
+ }
403
+
404
+ /* ── Icon buttons ── */
405
+ .proc-editor__item-actions {
406
+ display: flex;
407
+ gap: var(--space-1, 4px);
408
+ flex-shrink: 0;
409
+ }
410
+
411
+ .proc-editor__icon-btn {
412
+ background: none;
413
+ border: none;
414
+ cursor: pointer;
415
+ font-size: 15px;
416
+ padding: 4px;
417
+ border-radius: var(--radius-sm, 6px);
418
+ line-height: 1;
419
+ opacity: 0.6;
420
+ transition: opacity 0.1s, background 0.1s;
421
+ }
422
+
423
+ .proc-editor__icon-btn:hover {
424
+ opacity: 1;
425
+ background: var(--alpha-10, rgba(255,255,255,0.1));
426
+ }
427
+
428
+ .proc-editor__icon-btn--danger:hover {
429
+ background: color-mix(in srgb, var(--color-danger, #ef4444) 15%, transparent);
430
+ }
431
+
432
+ /* ── Meta chips ── */
433
+ .proc-editor__item-meta {
434
+ display: flex;
435
+ gap: var(--space-2, 8px);
436
+ padding-left: 60px; /* align with text after toggle */
437
+ }
438
+
439
+ .proc-editor__chip {
440
+ font-size: 11px;
441
+ color: var(--color-text-muted, #888);
442
+ background: var(--surface-1, #141414);
443
+ border: 1px solid var(--color-border, #2a2a2a);
444
+ border-radius: var(--radius-full, 9999px);
445
+ padding: 2px 8px;
446
+ font-family: var(--font-mono, monospace);
447
+ }
448
+
449
+ /* ── Inline edit fields ── */
450
+ .proc-editor__item-fields {
451
+ display: flex;
452
+ gap: var(--space-3, 12px);
453
+ padding-left: 60px;
454
+ flex-wrap: wrap;
455
+ }
456
+
457
+ .proc-editor__field {
458
+ display: flex;
459
+ flex-direction: column;
460
+ gap: var(--space-1, 4px);
461
+ flex: 1;
462
+ min-width: 100px;
463
+ }
464
+
465
+ .proc-editor__field-label {
466
+ font-size: 11px;
467
+ font-weight: 600;
468
+ text-transform: uppercase;
469
+ letter-spacing: 0.05em;
470
+ color: var(--color-text-subtle, #555);
471
+ }
472
+
473
+ .proc-editor__field-input {
474
+ background: var(--surface-1, #141414);
475
+ border: 1.5px solid var(--color-border, #2a2a2a);
476
+ border-radius: var(--radius-sm, 6px);
477
+ padding: 4px var(--space-2, 8px);
478
+ color: var(--color-text, #e8e8e8);
479
+ font-family: inherit;
480
+ font-size: var(--text-sm, 14px);
481
+ outline: none;
482
+ transition: border-color 0.15s;
483
+ width: 100%;
484
+ box-sizing: border-box;
485
+ }
486
+
487
+ .proc-editor__field-input:focus {
488
+ border-color: var(--color-accent, #6366f1);
489
+ }
490
+
491
+ .proc-editor__field-input--narrow {
492
+ max-width: 80px;
493
+ }
494
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { Procedure } from "./ProcedureEditor.types.js";
2
+ interface Props {
3
+ procedures?: Procedure[];
4
+ /** Custom CSS class. */
5
+ class?: string;
6
+ /** Fired on any change with the full updated list. */
7
+ onchange?: (procedures: Procedure[]) => void;
8
+ }
9
+ declare const ProcedureEditor: import("svelte").Component<Props, {}, "procedures">;
10
+ type ProcedureEditor = ReturnType<typeof ProcedureEditor>;
11
+ export default ProcedureEditor;
@@ -0,0 +1 @@
1
+ export {};