@sectile/terminal 0.2.0 → 0.2.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 (301) hide show
  1. package/dist/accordion.d.ts +34 -0
  2. package/dist/accordion.d.ts.map +1 -0
  3. package/dist/accordion.js +76 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/alert-dialog.d.ts +23 -0
  6. package/dist/alert-dialog.d.ts.map +1 -0
  7. package/dist/alert-dialog.js +12 -0
  8. package/dist/alert-dialog.js.map +1 -0
  9. package/dist/appearance.d.ts +50 -0
  10. package/dist/appearance.d.ts.map +1 -0
  11. package/dist/appearance.js +200 -0
  12. package/dist/appearance.js.map +1 -0
  13. package/dist/calendar.d.ts +80 -0
  14. package/dist/calendar.d.ts.map +1 -0
  15. package/dist/calendar.js +217 -0
  16. package/dist/calendar.js.map +1 -0
  17. package/dist/carousel.d.ts +49 -0
  18. package/dist/carousel.d.ts.map +1 -0
  19. package/dist/carousel.js +129 -0
  20. package/dist/carousel.js.map +1 -0
  21. package/dist/cascade-select.d.ts +43 -0
  22. package/dist/cascade-select.d.ts.map +1 -0
  23. package/dist/cascade-select.js +71 -0
  24. package/dist/cascade-select.js.map +1 -0
  25. package/dist/checkbox-group.d.ts +19 -0
  26. package/dist/checkbox-group.d.ts.map +1 -0
  27. package/dist/checkbox-group.js +14 -0
  28. package/dist/checkbox-group.js.map +1 -0
  29. package/dist/checkbox.d.ts +19 -0
  30. package/dist/checkbox.d.ts.map +1 -0
  31. package/dist/checkbox.js +12 -0
  32. package/dist/checkbox.js.map +1 -0
  33. package/dist/color-picker.d.ts +39 -0
  34. package/dist/color-picker.d.ts.map +1 -0
  35. package/dist/color-picker.js +62 -0
  36. package/dist/color-picker.js.map +1 -0
  37. package/dist/combobox.d.ts +107 -0
  38. package/dist/combobox.d.ts.map +1 -0
  39. package/dist/combobox.js +286 -0
  40. package/dist/combobox.js.map +1 -0
  41. package/dist/date-field.d.ts +39 -0
  42. package/dist/date-field.d.ts.map +1 -0
  43. package/dist/date-field.js +46 -0
  44. package/dist/date-field.js.map +1 -0
  45. package/dist/date-picker.d.ts +42 -0
  46. package/dist/date-picker.d.ts.map +1 -0
  47. package/dist/date-picker.js +40 -0
  48. package/dist/date-picker.js.map +1 -0
  49. package/dist/date-range-field.d.ts +43 -0
  50. package/dist/date-range-field.d.ts.map +1 -0
  51. package/dist/date-range-field.js +49 -0
  52. package/dist/date-range-field.js.map +1 -0
  53. package/dist/date-range-picker.d.ts +42 -0
  54. package/dist/date-range-picker.d.ts.map +1 -0
  55. package/dist/date-range-picker.js +29 -0
  56. package/dist/date-range-picker.js.map +1 -0
  57. package/dist/date-time-field.d.ts +39 -0
  58. package/dist/date-time-field.d.ts.map +1 -0
  59. package/dist/date-time-field.js +133 -0
  60. package/dist/date-time-field.js.map +1 -0
  61. package/dist/date-time-picker.d.ts +42 -0
  62. package/dist/date-time-picker.d.ts.map +1 -0
  63. package/dist/date-time-picker.js +128 -0
  64. package/dist/date-time-picker.js.map +1 -0
  65. package/dist/date-time-range-picker.d.ts +42 -0
  66. package/dist/date-time-range-picker.d.ts.map +1 -0
  67. package/dist/date-time-range-picker.js +137 -0
  68. package/dist/date-time-range-picker.js.map +1 -0
  69. package/dist/dialog.d.ts +21 -0
  70. package/dist/dialog.d.ts.map +1 -0
  71. package/dist/dialog.js +12 -0
  72. package/dist/dialog.js.map +1 -0
  73. package/dist/disclosure.d.ts +24 -0
  74. package/dist/disclosure.d.ts.map +1 -0
  75. package/dist/disclosure.js +56 -0
  76. package/dist/disclosure.js.map +1 -0
  77. package/dist/editable.d.ts +27 -0
  78. package/dist/editable.d.ts.map +1 -0
  79. package/dist/editable.js +70 -0
  80. package/dist/editable.js.map +1 -0
  81. package/dist/feed.d.ts +36 -0
  82. package/dist/feed.d.ts.map +1 -0
  83. package/dist/feed.js +90 -0
  84. package/dist/feed.js.map +1 -0
  85. package/dist/form.d.ts +65 -0
  86. package/dist/form.d.ts.map +1 -0
  87. package/dist/form.js +234 -0
  88. package/dist/form.js.map +1 -0
  89. package/dist/grid.d.ts +47 -0
  90. package/dist/grid.d.ts.map +1 -0
  91. package/dist/grid.js +68 -0
  92. package/dist/grid.js.map +1 -0
  93. package/dist/index.d.ts +110 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +62 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/internal/checked-control.d.ts +23 -0
  98. package/dist/internal/checked-control.d.ts.map +1 -0
  99. package/dist/internal/checked-control.js +22 -0
  100. package/dist/internal/checked-control.js.map +1 -0
  101. package/dist/internal/controller.d.ts +6 -0
  102. package/dist/internal/controller.d.ts.map +1 -0
  103. package/dist/internal/controller.js +35 -0
  104. package/dist/internal/controller.js.map +1 -0
  105. package/dist/internal/disabled-items.d.ts +6 -0
  106. package/dist/internal/disabled-items.d.ts.map +1 -0
  107. package/dist/internal/disabled-items.js +15 -0
  108. package/dist/internal/disabled-items.js.map +1 -0
  109. package/dist/internal/facade.d.ts +45 -0
  110. package/dist/internal/facade.d.ts.map +1 -0
  111. package/dist/internal/facade.js +58 -0
  112. package/dist/internal/facade.js.map +1 -0
  113. package/dist/internal/menu-control.d.ts +34 -0
  114. package/dist/internal/menu-control.d.ts.map +1 -0
  115. package/dist/internal/menu-control.js +171 -0
  116. package/dist/internal/menu-control.js.map +1 -0
  117. package/dist/internal/popup-control.d.ts +24 -0
  118. package/dist/internal/popup-control.d.ts.map +1 -0
  119. package/dist/internal/popup-control.js +23 -0
  120. package/dist/internal/popup-control.js.map +1 -0
  121. package/dist/internal/semantic-controller.d.ts +20 -0
  122. package/dist/internal/semantic-controller.d.ts.map +1 -0
  123. package/dist/internal/semantic-controller.js +42 -0
  124. package/dist/internal/semantic-controller.js.map +1 -0
  125. package/dist/internal/text-input.d.ts +5 -0
  126. package/dist/internal/text-input.d.ts.map +1 -0
  127. package/dist/internal/text-input.js +53 -0
  128. package/dist/internal/text-input.js.map +1 -0
  129. package/dist/keyboard.d.ts +10 -0
  130. package/dist/keyboard.d.ts.map +1 -0
  131. package/dist/keyboard.js +16 -0
  132. package/dist/keyboard.js.map +1 -0
  133. package/dist/layer-stack.d.ts +16 -0
  134. package/dist/layer-stack.d.ts.map +1 -0
  135. package/dist/layer-stack.js +49 -0
  136. package/dist/layer-stack.js.map +1 -0
  137. package/dist/layout.d.ts +2 -0
  138. package/dist/layout.d.ts.map +1 -0
  139. package/dist/layout.js +24 -0
  140. package/dist/layout.js.map +1 -0
  141. package/dist/listbox.d.ts +98 -0
  142. package/dist/listbox.d.ts.map +1 -0
  143. package/dist/listbox.js +330 -0
  144. package/dist/listbox.js.map +1 -0
  145. package/dist/menu-button.d.ts +8 -0
  146. package/dist/menu-button.d.ts.map +1 -0
  147. package/dist/menu-button.js +11 -0
  148. package/dist/menu-button.js.map +1 -0
  149. package/dist/menu.d.ts +8 -0
  150. package/dist/menu.d.ts.map +1 -0
  151. package/dist/menu.js +11 -0
  152. package/dist/menu.js.map +1 -0
  153. package/dist/menubar.d.ts +8 -0
  154. package/dist/menubar.d.ts.map +1 -0
  155. package/dist/menubar.js +11 -0
  156. package/dist/menubar.js.map +1 -0
  157. package/dist/month-picker.d.ts +3 -0
  158. package/dist/month-picker.d.ts.map +1 -0
  159. package/dist/month-picker.js +2 -0
  160. package/dist/month-picker.js.map +1 -0
  161. package/dist/month-range-picker.d.ts +3 -0
  162. package/dist/month-range-picker.d.ts.map +1 -0
  163. package/dist/month-range-picker.js +2 -0
  164. package/dist/month-range-picker.js.map +1 -0
  165. package/dist/multi-thumb-slider.d.ts +34 -0
  166. package/dist/multi-thumb-slider.d.ts.map +1 -0
  167. package/dist/multi-thumb-slider.js +67 -0
  168. package/dist/multi-thumb-slider.js.map +1 -0
  169. package/dist/navigation-menu.d.ts +8 -0
  170. package/dist/navigation-menu.d.ts.map +1 -0
  171. package/dist/navigation-menu.js +10 -0
  172. package/dist/navigation-menu.js.map +1 -0
  173. package/dist/node.d.ts +43 -0
  174. package/dist/node.d.ts.map +1 -0
  175. package/dist/node.js +196 -0
  176. package/dist/node.js.map +1 -0
  177. package/dist/number-field.d.ts +47 -0
  178. package/dist/number-field.d.ts.map +1 -0
  179. package/dist/number-field.js +157 -0
  180. package/dist/number-field.js.map +1 -0
  181. package/dist/pagination.d.ts +38 -0
  182. package/dist/pagination.d.ts.map +1 -0
  183. package/dist/pagination.js +103 -0
  184. package/dist/pagination.js.map +1 -0
  185. package/dist/pin-input.d.ts +28 -0
  186. package/dist/pin-input.d.ts.map +1 -0
  187. package/dist/pin-input.js +30 -0
  188. package/dist/pin-input.js.map +1 -0
  189. package/dist/popover.d.ts +21 -0
  190. package/dist/popover.d.ts.map +1 -0
  191. package/dist/popover.js +8 -0
  192. package/dist/popover.js.map +1 -0
  193. package/dist/quantity-field.d.ts +49 -0
  194. package/dist/quantity-field.d.ts.map +1 -0
  195. package/dist/quantity-field.js +168 -0
  196. package/dist/quantity-field.js.map +1 -0
  197. package/dist/radio-group.d.ts +40 -0
  198. package/dist/radio-group.d.ts.map +1 -0
  199. package/dist/radio-group.js +126 -0
  200. package/dist/radio-group.js.map +1 -0
  201. package/dist/range-calendar.d.ts +3 -0
  202. package/dist/range-calendar.d.ts.map +1 -0
  203. package/dist/range-calendar.js +2 -0
  204. package/dist/range-calendar.js.map +1 -0
  205. package/dist/rating.d.ts +23 -0
  206. package/dist/rating.d.ts.map +1 -0
  207. package/dist/rating.js +38 -0
  208. package/dist/rating.js.map +1 -0
  209. package/dist/reorder.d.ts +42 -0
  210. package/dist/reorder.d.ts.map +1 -0
  211. package/dist/reorder.js +166 -0
  212. package/dist/reorder.js.map +1 -0
  213. package/dist/screen.d.ts +108 -0
  214. package/dist/screen.d.ts.map +1 -0
  215. package/dist/screen.js +364 -0
  216. package/dist/screen.js.map +1 -0
  217. package/dist/select.d.ts +45 -0
  218. package/dist/select.d.ts.map +1 -0
  219. package/dist/select.js +50 -0
  220. package/dist/select.js.map +1 -0
  221. package/dist/slider.d.ts +62 -0
  222. package/dist/slider.d.ts.map +1 -0
  223. package/dist/slider.js +156 -0
  224. package/dist/slider.js.map +1 -0
  225. package/dist/spin-button.d.ts +38 -0
  226. package/dist/spin-button.d.ts.map +1 -0
  227. package/dist/spin-button.js +78 -0
  228. package/dist/spin-button.js.map +1 -0
  229. package/dist/stepper.d.ts +19 -0
  230. package/dist/stepper.d.ts.map +1 -0
  231. package/dist/stepper.js +14 -0
  232. package/dist/stepper.js.map +1 -0
  233. package/dist/switch.d.ts +17 -0
  234. package/dist/switch.d.ts.map +1 -0
  235. package/dist/switch.js +12 -0
  236. package/dist/switch.js.map +1 -0
  237. package/dist/tabs.d.ts +46 -0
  238. package/dist/tabs.d.ts.map +1 -0
  239. package/dist/tabs.js +128 -0
  240. package/dist/tabs.js.map +1 -0
  241. package/dist/tags-input.d.ts +32 -0
  242. package/dist/tags-input.d.ts.map +1 -0
  243. package/dist/tags-input.js +68 -0
  244. package/dist/tags-input.js.map +1 -0
  245. package/dist/text.d.ts +63 -0
  246. package/dist/text.d.ts.map +1 -0
  247. package/dist/text.js +143 -0
  248. package/dist/text.js.map +1 -0
  249. package/dist/time-field.d.ts +39 -0
  250. package/dist/time-field.d.ts.map +1 -0
  251. package/dist/time-field.js +40 -0
  252. package/dist/time-field.js.map +1 -0
  253. package/dist/time-range-field.d.ts +42 -0
  254. package/dist/time-range-field.d.ts.map +1 -0
  255. package/dist/time-range-field.js +43 -0
  256. package/dist/time-range-field.js.map +1 -0
  257. package/dist/timer.d.ts +30 -0
  258. package/dist/timer.d.ts.map +1 -0
  259. package/dist/timer.js +31 -0
  260. package/dist/timer.js.map +1 -0
  261. package/dist/toast.d.ts +29 -0
  262. package/dist/toast.d.ts.map +1 -0
  263. package/dist/toast.js +38 -0
  264. package/dist/toast.js.map +1 -0
  265. package/dist/toggle-button.d.ts +17 -0
  266. package/dist/toggle-button.d.ts.map +1 -0
  267. package/dist/toggle-button.js +12 -0
  268. package/dist/toggle-button.js.map +1 -0
  269. package/dist/toggle-group.d.ts +22 -0
  270. package/dist/toggle-group.d.ts.map +1 -0
  271. package/dist/toggle-group.js +33 -0
  272. package/dist/toggle-group.js.map +1 -0
  273. package/dist/toolbar.d.ts +37 -0
  274. package/dist/toolbar.d.ts.map +1 -0
  275. package/dist/toolbar.js +108 -0
  276. package/dist/toolbar.js.map +1 -0
  277. package/dist/tooltip.d.ts +17 -0
  278. package/dist/tooltip.d.ts.map +1 -0
  279. package/dist/tooltip.js +12 -0
  280. package/dist/tooltip.js.map +1 -0
  281. package/dist/tree-grid.d.ts +102 -0
  282. package/dist/tree-grid.d.ts.map +1 -0
  283. package/dist/tree-grid.js +308 -0
  284. package/dist/tree-grid.js.map +1 -0
  285. package/dist/tree-view.d.ts +83 -0
  286. package/dist/tree-view.d.ts.map +1 -0
  287. package/dist/tree-view.js +216 -0
  288. package/dist/tree-view.js.map +1 -0
  289. package/dist/window-splitter.d.ts +19 -0
  290. package/dist/window-splitter.d.ts.map +1 -0
  291. package/dist/window-splitter.js +48 -0
  292. package/dist/window-splitter.js.map +1 -0
  293. package/dist/year-picker.d.ts +3 -0
  294. package/dist/year-picker.d.ts.map +1 -0
  295. package/dist/year-picker.js +2 -0
  296. package/dist/year-picker.js.map +1 -0
  297. package/dist/year-range-picker.d.ts +3 -0
  298. package/dist/year-range-picker.d.ts.map +1 -0
  299. package/dist/year-range-picker.js +2 -0
  300. package/dist/year-range-picker.js.map +1 -0
  301. package/package.json +2 -2
@@ -0,0 +1,308 @@
1
+ import { createFacadeConnection } from './internal/facade.js';
2
+ import { unwrap } from '@sectile/core/result';
3
+ import { tryCreateInteractionState, requireInteraction, } from '@sectile/core/interaction';
4
+ import { tryCreateRevisionSnapshot, rejectRevisionInput, } from '@sectile/core/revision';
5
+ import { applyTreeGridEvent, tryCreateTreeGridModelFromRows, tryCreateTreeGridState, } from '@sectile/core/tree-grid';
6
+ import { applyControllerEvent, synchronizeControllerState } from './internal/controller.js';
7
+ import { applyTerminalTextInput, } from './keyboard.js';
8
+ export function createTreeGridController(options) {
9
+ const value = options.value !== undefined ? options.value : options.defaultValue ?? null;
10
+ const initial = tryCreateTreeGridState(options.model, {
11
+ selected: value === null ? [] : [value],
12
+ anchor: value,
13
+ expanded: options.expandedValue ?? options.defaultExpandedValue ?? [],
14
+ current: options.highlightedValue !== undefined
15
+ ? options.highlightedValue
16
+ : options.defaultHighlightedValue ?? null,
17
+ editMode: options.editMode ?? options.defaultEditMode ?? 'navigation',
18
+ });
19
+ if (!initial.ok)
20
+ return initial;
21
+ const snapshot = tryCreateRevisionSnapshot(initial.value);
22
+ if (!snapshot.ok)
23
+ return snapshot;
24
+ const interaction = tryCreateInteractionState(options);
25
+ if (!interaction.ok)
26
+ return interaction;
27
+ return { ok: true, value: new TerminalTreeGridController(options, snapshot.value, interaction.value) };
28
+ }
29
+ export function createTreeGrid(options) {
30
+ return unwrap(tryCreateTreeGrid(options));
31
+ }
32
+ export function tryCreateTreeGrid(options) {
33
+ return createFacadeConnection(options, (options) => tryCreateTreeGridConnection(options));
34
+ }
35
+ function tryCreateTreeGridConnection(options) {
36
+ const model = tryCreateTreeGridModelFromRows(options.rows);
37
+ if (!model.ok)
38
+ return model;
39
+ const controller = createTreeGridController({ ...options, model: model.value });
40
+ if (!controller.ok)
41
+ return controller;
42
+ return { ok: true, value: connectTreeGrid({ ...options, controller: controller.value }) };
43
+ }
44
+ export function connectTreeGrid(options) {
45
+ return new TerminalTreeGridConnection(options);
46
+ }
47
+ export function toTreeGridEvent(input, editMode = 'navigation') {
48
+ if (input.ctrlKey === true)
49
+ return null;
50
+ if (editMode === 'editing') {
51
+ if (input.key === 'enter')
52
+ return 'commit-edit';
53
+ if (input.key === 'escape')
54
+ return 'cancel-edit';
55
+ if (input.key === 'edit')
56
+ return 'start-edit';
57
+ return null;
58
+ }
59
+ if (input.altKey === true && input.key === 'right')
60
+ return 'expand';
61
+ if (input.altKey === true && input.key === 'left')
62
+ return 'collapse';
63
+ if (input.key === 'left')
64
+ return 'left';
65
+ if (input.key === 'right')
66
+ return 'right';
67
+ if (input.key === 'up')
68
+ return 'up';
69
+ if (input.key === 'down')
70
+ return 'down';
71
+ if (input.key === 'expand')
72
+ return 'expand';
73
+ if (input.key === 'collapse')
74
+ return 'collapse';
75
+ if (input.key === 'o')
76
+ return 'expand';
77
+ if (input.key === 'c')
78
+ return 'collapse';
79
+ if (input.key === 'space')
80
+ return 'select';
81
+ if (input.key === 'enter' || input.key === 'edit')
82
+ return 'start-edit';
83
+ return null;
84
+ }
85
+ class TerminalTreeGridConnection {
86
+ model;
87
+ #controller;
88
+ #getCellValue;
89
+ #setCellValue;
90
+ #onTransition;
91
+ #onUpdate;
92
+ #disabled;
93
+ #readOnly;
94
+ #editBaseline = null;
95
+ constructor(options) {
96
+ this.#controller = options.controller;
97
+ this.model = options.controller.model;
98
+ this.#getCellValue = options.getCellValue;
99
+ this.#setCellValue = options.setCellValue;
100
+ this.#onTransition = options.onTransition;
101
+ this.#onUpdate = options.onUpdate;
102
+ this.#disabled = options.disabled === true;
103
+ this.#readOnly = options.readOnly === true;
104
+ }
105
+ getSnapshot() {
106
+ return this.#controller.getSnapshot();
107
+ }
108
+ syncControlledValues(values) {
109
+ const result = this.#controller.syncControlledValues(values);
110
+ if (result.ok)
111
+ this.#onUpdate?.();
112
+ return result;
113
+ }
114
+ handleKeyboardInput(input) {
115
+ const snapshot = this.#controller.getSnapshot();
116
+ if (snapshot.state.editMode === 'editing' && snapshot.state.cursor.current !== null) {
117
+ if (this.#disabled || this.#readOnly)
118
+ return false;
119
+ const id = snapshot.state.cursor.current;
120
+ const nextValue = applyTerminalTextInput(this.#getCellValue(id), input);
121
+ if (nextValue !== null) {
122
+ this.#setCellValue(id, nextValue);
123
+ this.#onUpdate?.();
124
+ return true;
125
+ }
126
+ }
127
+ const event = toTreeGridEvent(input, snapshot.state.editMode);
128
+ if (event === null)
129
+ return false;
130
+ const result = this.#controller.handleKeyboardInput(input);
131
+ if (result.ok)
132
+ this.#applyEffects(result.commands);
133
+ this.#onTransition?.(Object.freeze({ event, result }));
134
+ if (result.ok)
135
+ this.#onUpdate?.();
136
+ return result.ok;
137
+ }
138
+ #applyEffects(effects) {
139
+ for (const effect of effects) {
140
+ if (effect.type === 'begin-cell-edit') {
141
+ this.#editBaseline = Object.freeze({
142
+ id: effect.id,
143
+ value: this.#getCellValue(effect.id),
144
+ });
145
+ }
146
+ else if (effect.type === 'cancel-cell-edit') {
147
+ if (this.#editBaseline?.id === effect.id) {
148
+ this.#setCellValue(effect.id, this.#editBaseline.value);
149
+ }
150
+ this.#editBaseline = null;
151
+ }
152
+ else if (effect.type === 'commit-cell-edit') {
153
+ this.#editBaseline = null;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ export function toTreeGridEffect(command) {
159
+ if (command.type === 'focus') {
160
+ return Object.freeze({ type: 'move-highlight', id: command.id });
161
+ }
162
+ if (command.type === 'begin-edit') {
163
+ return Object.freeze({ type: 'begin-cell-edit', id: command.id });
164
+ }
165
+ if (command.type === 'commit-edit') {
166
+ return Object.freeze({ type: 'commit-cell-edit', id: command.id });
167
+ }
168
+ return Object.freeze({ type: 'cancel-cell-edit', id: command.id });
169
+ }
170
+ class TerminalTreeGridController {
171
+ model;
172
+ #policies;
173
+ #valueControlled;
174
+ #expandedControlled;
175
+ #highlightControlled;
176
+ #editModeControlled;
177
+ #onValueChange;
178
+ #onExpandedValueChange;
179
+ #onHighlightedValueChange;
180
+ #onEditModeChange;
181
+ #interaction;
182
+ #snapshot;
183
+ constructor(options, snapshot, interaction) {
184
+ this.model = options.model;
185
+ this.#policies = options.policies ?? {};
186
+ this.#valueControlled = options.value !== undefined;
187
+ this.#expandedControlled = options.expandedValue !== undefined;
188
+ this.#highlightControlled = options.highlightedValue !== undefined;
189
+ this.#editModeControlled = options.editMode !== undefined;
190
+ this.#onValueChange = options.onValueChange;
191
+ this.#onExpandedValueChange = options.onExpandedValueChange;
192
+ this.#onHighlightedValueChange = options.onHighlightedValueChange;
193
+ this.#onEditModeChange = options.onEditModeChange;
194
+ this.#interaction = interaction;
195
+ this.#snapshot = snapshot;
196
+ }
197
+ getSnapshot() {
198
+ return this.#snapshot;
199
+ }
200
+ syncControlledValues(values) {
201
+ const error = controlledInputError(this.#valueControlled, this.#expandedControlled, this.#highlightControlled, this.#editModeControlled, values);
202
+ if (error !== null)
203
+ return { ok: false, error };
204
+ const selected = this.#valueControlled
205
+ ? values.value
206
+ : selectedValue(this.#snapshot.state);
207
+ const state = tryCreateTreeGridState(this.model, {
208
+ selected: selected === null ? [] : [selected],
209
+ anchor: this.#valueControlled ? selected : this.#snapshot.state.selection.anchor,
210
+ expanded: this.#expandedControlled
211
+ ? values.expandedValue
212
+ : this.#snapshot.state.expansion.ids,
213
+ current: this.#highlightControlled
214
+ ? values.highlightedValue
215
+ : this.#snapshot.state.cursor.current,
216
+ editMode: this.#editModeControlled
217
+ ? values.editMode
218
+ : this.#snapshot.state.editMode,
219
+ });
220
+ const snapshot = synchronizeControllerState(this.#snapshot, state);
221
+ if (!snapshot.ok)
222
+ return snapshot;
223
+ this.#snapshot = snapshot.value;
224
+ return snapshot;
225
+ }
226
+ handleKeyboardInput(input, expectedRevision = this.#snapshot.revision) {
227
+ const event = toTreeGridEvent(input, this.#snapshot.state.editMode);
228
+ if (event === null) {
229
+ return rejectRevisionInput(this.#snapshot, {
230
+ class: 'transition-rejection',
231
+ code: 'unsupported-terminal-key',
232
+ message: 'Terminal keyboard input does not map to a tree-grid semantic event.',
233
+ details: { key: input.key },
234
+ });
235
+ }
236
+ const permitted = requireInteraction(this.#interaction, treeGridIntent(event));
237
+ if (!permitted.ok)
238
+ return rejectRevisionInput(this.#snapshot, permitted.error);
239
+ const result = applyControllerEvent(this.#snapshot, expectedRevision, event, (state, semanticEvent) => applyTreeGridEvent(this.model, state, semanticEvent, this.#policies), (previous, proposed) => controlledState(this.model, previous, proposed, this.#valueControlled, this.#expandedControlled, this.#highlightControlled, this.#editModeControlled), (previous, proposed) => this.#notify(previous, proposed), toTreeGridEffect);
240
+ if (result.ok)
241
+ this.#snapshot = result.snapshot;
242
+ return result;
243
+ }
244
+ #notify(previous, proposed) {
245
+ const previousValue = selectedValue(previous);
246
+ const value = selectedValue(proposed);
247
+ if (previousValue !== value) {
248
+ this.#onValueChange?.(Object.freeze({ value, previousValue }));
249
+ }
250
+ if (!sameIDs(previous.expansion.ids, proposed.expansion.ids)) {
251
+ this.#onExpandedValueChange?.(Object.freeze({
252
+ value: proposed.expansion.ids,
253
+ previousValue: previous.expansion.ids,
254
+ }));
255
+ }
256
+ if (previous.cursor.current !== proposed.cursor.current) {
257
+ this.#onHighlightedValueChange?.(Object.freeze({
258
+ value: proposed.cursor.current,
259
+ previousValue: previous.cursor.current,
260
+ }));
261
+ }
262
+ if (previous.editMode !== proposed.editMode) {
263
+ this.#onEditModeChange?.(Object.freeze({
264
+ value: proposed.editMode,
265
+ previousValue: previous.editMode,
266
+ }));
267
+ }
268
+ }
269
+ }
270
+ function treeGridIntent(event) {
271
+ const type = typeof event === 'object' ? event.type : event;
272
+ return type === 'start-edit' || type === 'commit-edit' || type === 'cancel-edit'
273
+ ? 'mutate'
274
+ : 'navigate';
275
+ }
276
+ function controlledState(model, previous, proposed, valueControlled, expandedControlled, highlightControlled, editModeControlled) {
277
+ return tryCreateTreeGridState(model, {
278
+ selected: valueControlled ? previous.selection.selected : proposed.selection.selected,
279
+ anchor: valueControlled ? previous.selection.anchor : proposed.selection.anchor,
280
+ expanded: expandedControlled ? previous.expansion.ids : proposed.expansion.ids,
281
+ current: highlightControlled ? previous.cursor.current : proposed.cursor.current,
282
+ editMode: editModeControlled ? previous.editMode : proposed.editMode,
283
+ });
284
+ }
285
+ function selectedValue(state) {
286
+ return state.selection.selected[0] ?? null;
287
+ }
288
+ function controlledInputError(valueControlled, expandedControlled, highlightControlled, editModeControlled, values) {
289
+ return fieldError(valueControlled, values.value !== undefined, 'value', 'tree-grid selection')
290
+ ?? fieldError(expandedControlled, values.expandedValue !== undefined, 'expanded-value', 'tree-grid expansion')
291
+ ?? fieldError(highlightControlled, values.highlightedValue !== undefined, 'highlighted-value', 'tree-grid highlight')
292
+ ?? fieldError(editModeControlled, values.editMode !== undefined, 'edit-mode', 'tree-grid edit mode');
293
+ }
294
+ function fieldError(controlled, provided, codeName, label) {
295
+ if (controlled === provided)
296
+ return null;
297
+ return {
298
+ class: 'construction',
299
+ code: controlled ? `controlled-${codeName}-required` : `uncontrolled-${codeName}-update`,
300
+ message: controlled
301
+ ? `Controlled ${label} sync requires its external value.`
302
+ : `Uncontrolled ${label} cannot be synchronized externally.`,
303
+ };
304
+ }
305
+ function sameIDs(left, right) {
306
+ return left.length === right.length && left.every((id, index) => id === right[index]);
307
+ }
308
+ //# sourceMappingURL=tree-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-grid.js","sourceRoot":"","sources":["../src/tree-grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { type FacadeConnection } from './internal/facade.js';
2
+ import type { Result, StableID } from '@sectile/core';
3
+ import { type RevisionResult, type RevisionSnapshot } from '@sectile/core/revision';
4
+ import { type Tree, type TreeNodeInput } from '@sectile/core/tree';
5
+ import { type TreeViewCommand, type TreeViewEvent, type TreeViewPolicies, type TreeViewSelectionMode, type TreeViewState } from '@sectile/core/tree-view';
6
+ import type { TerminalKeyboardInput } from './keyboard.js';
7
+ export type KeyboardInput = TerminalKeyboardInput;
8
+ export type { TreeViewSelectionMode } from '@sectile/core/tree-view';
9
+ export interface TreeViewEffect<ID extends StableID = StableID> {
10
+ readonly type: 'move-highlight';
11
+ readonly id: ID;
12
+ }
13
+ export interface TreeViewValueChangeDetails<ID extends StableID = StableID> {
14
+ readonly value: readonly ID[];
15
+ readonly previousValue: readonly ID[];
16
+ }
17
+ export interface TreeViewExpandedValuesChangeDetails<ID extends StableID = StableID> {
18
+ readonly value: readonly ID[];
19
+ readonly previousValue: readonly ID[];
20
+ }
21
+ export interface TreeViewHighlightChangeDetails<ID extends StableID = StableID> {
22
+ readonly value: ID | null;
23
+ readonly previousValue: ID | null;
24
+ }
25
+ export interface TreeViewControllerOptions<ID extends StableID = StableID> {
26
+ readonly tree: Tree<ID>;
27
+ readonly selectionMode?: TreeViewSelectionMode;
28
+ readonly disabled?: boolean;
29
+ readonly value?: readonly ID[];
30
+ readonly defaultValue?: readonly ID[];
31
+ readonly expandedValues?: readonly ID[];
32
+ readonly defaultExpandedValues?: readonly ID[];
33
+ readonly highlightedValue?: ID | null;
34
+ readonly defaultHighlightedValue?: ID | null;
35
+ readonly policies?: TreeViewPolicies<ID>;
36
+ readonly onValueChange?: (change: TreeViewValueChangeDetails<ID>) => void;
37
+ readonly onExpandedValuesChange?: (change: TreeViewExpandedValuesChangeDetails<ID>) => void;
38
+ readonly onHighlightedValueChange?: (change: TreeViewHighlightChangeDetails<ID>) => void;
39
+ }
40
+ export type TreeViewControllerValueChangeHandler<ID extends StableID = StableID> = NonNullable<TreeViewControllerOptions<ID>['onValueChange']>;
41
+ export type TreeViewControllerExpandedValuesChangeHandler<ID extends StableID = StableID> = NonNullable<TreeViewControllerOptions<ID>['onExpandedValuesChange']>;
42
+ export type TreeViewControllerHighlightedValueChangeHandler<ID extends StableID = StableID> = NonNullable<TreeViewControllerOptions<ID>['onHighlightedValueChange']>;
43
+ export interface TreeViewControlledValues<ID extends StableID = StableID> {
44
+ readonly value?: readonly ID[];
45
+ readonly expandedValues?: readonly ID[];
46
+ readonly highlightedValue?: ID | null;
47
+ }
48
+ export interface TreeViewController<ID extends StableID = StableID> {
49
+ readonly tree: Tree<ID>;
50
+ readonly selectionMode: TreeViewSelectionMode;
51
+ getSnapshot(): RevisionSnapshot<TreeViewState<ID>>;
52
+ syncControlledValues(values: TreeViewControlledValues<ID>): Result<RevisionSnapshot<TreeViewState<ID>>>;
53
+ handleKeyboardInput(input: KeyboardInput, expectedRevision?: number): RevisionResult<TreeViewState<ID>, TreeViewEffect<ID>>;
54
+ }
55
+ export interface TreeViewTransitionDetails<ID extends StableID = StableID> {
56
+ readonly event: TreeViewEvent<ID>;
57
+ readonly result: RevisionResult<TreeViewState<ID>, TreeViewEffect<ID>>;
58
+ }
59
+ export interface TreeViewConnectionOptions<ID extends StableID = StableID> {
60
+ readonly controller: TreeViewController<ID>;
61
+ readonly disabled?: boolean;
62
+ readonly onTransition?: (details: TreeViewTransitionDetails<ID>) => void;
63
+ readonly onUpdate?: () => void;
64
+ }
65
+ export type TreeViewConnectionTransitionHandler<ID extends StableID = StableID> = NonNullable<TreeViewConnectionOptions<ID>['onTransition']>;
66
+ export type TreeViewConnectionUpdateHandler<ID extends StableID = StableID> = NonNullable<TreeViewConnectionOptions<ID>['onUpdate']>;
67
+ export interface TreeViewConnection<ID extends StableID = StableID> {
68
+ readonly tree: Tree<ID>;
69
+ getSnapshot(): RevisionSnapshot<TreeViewState<ID>>;
70
+ syncControlledValues(values: TreeViewControlledValues<ID>): Result<RevisionSnapshot<TreeViewState<ID>>>;
71
+ handleKeyboardInput(input: KeyboardInput): boolean;
72
+ }
73
+ export type TreeViewOptions<ID extends StableID = StableID> = Omit<TreeViewControllerOptions<ID>, 'tree'> & Omit<TreeViewConnectionOptions<ID>, 'controller'> & {
74
+ readonly nodes: readonly TreeNodeInput<ID>[];
75
+ readonly disabledItems?: readonly ID[];
76
+ };
77
+ export declare function createTreeViewController<ID extends StableID>(options: TreeViewControllerOptions<ID>): Result<TreeViewController<ID>>;
78
+ export declare function createTreeView<ID extends StableID>(options: TreeViewOptions<ID>): FacadeConnection<TreeViewConnection<ID>>;
79
+ export declare function tryCreateTreeView<ID extends StableID>(options: TreeViewOptions<ID>): Result<FacadeConnection<TreeViewConnection<ID>>>;
80
+ export declare function connectTreeView<ID extends StableID>(options: TreeViewConnectionOptions<ID>): TreeViewConnection<ID>;
81
+ export declare function toTreeViewEvent<ID extends StableID = StableID>(input: KeyboardInput): TreeViewEvent<ID> | null;
82
+ export declare function toTreeViewEffect<ID extends StableID>(command: TreeViewCommand<ID>): TreeViewEffect<ID>;
83
+ //# sourceMappingURL=tree-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../src/tree-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import { createFacadeConnection } from './internal/facade.js';
2
+ import { unwrap } from '@sectile/core/result';
3
+ import { tryCreateInteractionState, requireInteraction, } from '@sectile/core/interaction';
4
+ import { tryCreateRevisionSnapshot, rejectRevisionInput, } from '@sectile/core/revision';
5
+ import { tryCreateTree } from '@sectile/core/tree';
6
+ import { applyTreeViewEvent, tryCreateTreeViewState, } from '@sectile/core/tree-view';
7
+ import { applyControllerEvent, synchronizeControllerState } from './internal/controller.js';
8
+ export function createTreeViewController(options) {
9
+ const selectionMode = options.selectionMode ?? options.policies?.selectionMode ?? 'single';
10
+ const initial = tryCreateTreeViewState(options.tree, {
11
+ selected: options.value ?? options.defaultValue ?? [],
12
+ expanded: options.expandedValues ?? options.defaultExpandedValues ?? [],
13
+ current: options.highlightedValue !== undefined
14
+ ? options.highlightedValue
15
+ : options.defaultHighlightedValue ?? null,
16
+ }, selectionMode);
17
+ if (!initial.ok)
18
+ return initial;
19
+ const snapshot = tryCreateRevisionSnapshot(initial.value);
20
+ if (!snapshot.ok)
21
+ return snapshot;
22
+ const interaction = tryCreateInteractionState(options);
23
+ if (!interaction.ok)
24
+ return interaction;
25
+ return { ok: true, value: new TerminalTreeViewController({ ...options, selectionMode }, snapshot.value, interaction.value) };
26
+ }
27
+ export function createTreeView(options) {
28
+ return unwrap(tryCreateTreeView(options));
29
+ }
30
+ export function tryCreateTreeView(options) {
31
+ return createFacadeConnection(options, (options) => tryCreateTreeViewConnection(options));
32
+ }
33
+ function tryCreateTreeViewConnection(options) {
34
+ const tree = tryCreateTree(options.nodes);
35
+ if (!tree.ok)
36
+ return tree;
37
+ const disabled = new Set(options.disabledItems ?? []);
38
+ for (const id of disabled)
39
+ if (!tree.value.has(id))
40
+ return { ok: false, error: { class: 'construction', code: 'disabled-item-outside-domain', message: 'Every disabled tree-view item must exist in the tree.', details: { id } } };
41
+ const suppliedEligibility = options.policies?.eligible;
42
+ const policies = { ...options.policies, eligible: (id) => !disabled.has(id) && (suppliedEligibility?.(id) ?? true) };
43
+ const controller = createTreeViewController({ ...options, policies, tree: tree.value });
44
+ if (!controller.ok)
45
+ return controller;
46
+ return { ok: true, value: connectTreeView({ ...options, controller: controller.value }) };
47
+ }
48
+ export function connectTreeView(options) {
49
+ return new TerminalTreeViewConnection(options);
50
+ }
51
+ export function toTreeViewEvent(input) {
52
+ if (input.key === 'down')
53
+ return 'next';
54
+ if (input.key === 'up')
55
+ return 'previous';
56
+ if (input.key === 'right')
57
+ return 'right';
58
+ if (input.key === 'left')
59
+ return 'left';
60
+ if (input.key === 'space')
61
+ return 'toggle-select';
62
+ return null;
63
+ }
64
+ export function toTreeViewEffect(command) {
65
+ return Object.freeze({ type: 'move-highlight', id: command.id });
66
+ }
67
+ class TerminalTreeViewConnection {
68
+ tree;
69
+ #controller;
70
+ #onTransition;
71
+ #onUpdate;
72
+ constructor(options) {
73
+ this.#controller = options.controller;
74
+ this.tree = options.controller.tree;
75
+ this.#onTransition = options.onTransition;
76
+ this.#onUpdate = options.onUpdate;
77
+ }
78
+ getSnapshot() {
79
+ return this.#controller.getSnapshot();
80
+ }
81
+ syncControlledValues(values) {
82
+ const result = this.#controller.syncControlledValues(values);
83
+ if (result.ok)
84
+ this.#onUpdate?.();
85
+ return result;
86
+ }
87
+ handleKeyboardInput(input) {
88
+ const event = toTreeViewEvent(input);
89
+ if (event === null)
90
+ return false;
91
+ const result = this.#controller.handleKeyboardInput(input);
92
+ this.#onTransition?.(Object.freeze({ event, result }));
93
+ if (result.ok)
94
+ this.#onUpdate?.();
95
+ return result.ok;
96
+ }
97
+ }
98
+ class TerminalTreeViewController {
99
+ tree;
100
+ selectionMode;
101
+ #tree;
102
+ #policies;
103
+ #valueControlled;
104
+ #expandedControlled;
105
+ #highlightControlled;
106
+ #onValueChange;
107
+ #onExpandedValuesChange;
108
+ #onHighlightedValueChange;
109
+ #interaction;
110
+ #snapshot;
111
+ constructor(options, snapshot, interaction) {
112
+ this.tree = options.tree;
113
+ this.selectionMode = options.selectionMode ?? options.policies?.selectionMode ?? 'single';
114
+ this.#tree = options.tree;
115
+ this.#policies = { ...options.policies, selectionMode: this.selectionMode };
116
+ this.#valueControlled = options.value !== undefined;
117
+ this.#expandedControlled = options.expandedValues !== undefined;
118
+ this.#highlightControlled = options.highlightedValue !== undefined;
119
+ this.#onValueChange = options.onValueChange;
120
+ this.#onExpandedValuesChange = options.onExpandedValuesChange;
121
+ this.#onHighlightedValueChange = options.onHighlightedValueChange;
122
+ this.#interaction = interaction;
123
+ this.#snapshot = snapshot;
124
+ }
125
+ getSnapshot() {
126
+ return this.#snapshot;
127
+ }
128
+ syncControlledValues(values) {
129
+ const error = controlledInputError(this.#valueControlled, this.#expandedControlled, this.#highlightControlled, values);
130
+ if (error !== null)
131
+ return { ok: false, error };
132
+ const state = tryCreateTreeViewState(this.#tree, {
133
+ selected: this.#valueControlled
134
+ ? values.value
135
+ : this.#snapshot.state.selection.selected,
136
+ anchor: this.#snapshot.state.selection.anchor,
137
+ expanded: this.#expandedControlled
138
+ ? values.expandedValues
139
+ : this.#snapshot.state.expansion.ids,
140
+ current: this.#highlightControlled
141
+ ? values.highlightedValue
142
+ : this.#snapshot.state.cursor.current,
143
+ }, this.selectionMode);
144
+ const snapshot = synchronizeControllerState(this.#snapshot, state);
145
+ if (!snapshot.ok)
146
+ return snapshot;
147
+ this.#snapshot = snapshot.value;
148
+ return snapshot;
149
+ }
150
+ handleKeyboardInput(input, expectedRevision = this.#snapshot.revision) {
151
+ const permitted = requireInteraction(this.#interaction, 'navigate');
152
+ if (!permitted.ok)
153
+ return rejectRevisionInput(this.#snapshot, permitted.error);
154
+ const event = toTreeViewEvent(input);
155
+ if (event === null) {
156
+ return rejectRevisionInput(this.#snapshot, {
157
+ class: 'transition-rejection',
158
+ code: 'unsupported-terminal-key',
159
+ message: 'Terminal keyboard input does not map to a tree-view semantic event.',
160
+ details: { key: input.key },
161
+ });
162
+ }
163
+ const result = applyControllerEvent(this.#snapshot, expectedRevision, event, (state, semanticEvent) => applyTreeViewEvent(this.#tree, state, semanticEvent, this.#policies), (previous, proposed) => controlledState(this.#tree, previous, proposed, this.#valueControlled, this.#expandedControlled, this.#highlightControlled, this.selectionMode), (previous, proposed) => this.#notify(previous, proposed), toTreeViewEffect);
164
+ if (result.ok)
165
+ this.#snapshot = result.snapshot;
166
+ return result;
167
+ }
168
+ #notify(previous, proposed) {
169
+ if (!sameIDs(previous.selection.selected, proposed.selection.selected)) {
170
+ this.#onValueChange?.(Object.freeze({
171
+ value: proposed.selection.selected,
172
+ previousValue: previous.selection.selected,
173
+ }));
174
+ }
175
+ if (!sameIDs(previous.expansion.ids, proposed.expansion.ids)) {
176
+ this.#onExpandedValuesChange?.(Object.freeze({
177
+ value: proposed.expansion.ids,
178
+ previousValue: previous.expansion.ids,
179
+ }));
180
+ }
181
+ if (previous.cursor.current !== proposed.cursor.current) {
182
+ this.#onHighlightedValueChange?.(Object.freeze({
183
+ value: proposed.cursor.current,
184
+ previousValue: previous.cursor.current,
185
+ }));
186
+ }
187
+ }
188
+ }
189
+ function controlledState(tree, previous, proposed, valueControlled, expandedControlled, highlightControlled, selectionMode) {
190
+ return tryCreateTreeViewState(tree, {
191
+ selected: valueControlled ? previous.selection.selected : proposed.selection.selected,
192
+ anchor: valueControlled ? previous.selection.anchor : proposed.selection.anchor,
193
+ expanded: expandedControlled ? previous.expansion.ids : proposed.expansion.ids,
194
+ current: highlightControlled ? previous.cursor.current : proposed.cursor.current,
195
+ }, selectionMode);
196
+ }
197
+ function controlledInputError(valueControlled, expandedControlled, highlightControlled, values) {
198
+ return fieldError(valueControlled, values.value !== undefined, 'value', 'tree-view selection')
199
+ ?? fieldError(expandedControlled, values.expandedValues !== undefined, 'expanded-values', 'tree-view expansion')
200
+ ?? fieldError(highlightControlled, values.highlightedValue !== undefined, 'highlighted-value', 'tree-view highlight');
201
+ }
202
+ function fieldError(controlled, provided, codeName, label) {
203
+ if (controlled === provided)
204
+ return null;
205
+ return {
206
+ class: 'construction',
207
+ code: controlled ? `controlled-${codeName}-required` : `uncontrolled-${codeName}-update`,
208
+ message: controlled
209
+ ? `Controlled ${label} sync requires its external value.`
210
+ : `Uncontrolled ${label} cannot be synchronized externally.`,
211
+ };
212
+ }
213
+ function sameIDs(left, right) {
214
+ return left.length === right.length && left.every((id, index) => id === right[index]);
215
+ }
216
+ //# sourceMappingURL=tree-view.js.map