@sectile/terminal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/accordion.d.ts +31 -0
  4. package/dist/accordion.d.ts.map +1 -0
  5. package/dist/accordion.js +76 -0
  6. package/dist/accordion.js.map +1 -0
  7. package/dist/alert-dialog.d.ts +18 -0
  8. package/dist/alert-dialog.d.ts.map +1 -0
  9. package/dist/alert-dialog.js +12 -0
  10. package/dist/alert-dialog.js.map +1 -0
  11. package/dist/calendar.d.ts +75 -0
  12. package/dist/calendar.d.ts.map +1 -0
  13. package/dist/calendar.js +217 -0
  14. package/dist/calendar.js.map +1 -0
  15. package/dist/carousel.d.ts +44 -0
  16. package/dist/carousel.d.ts.map +1 -0
  17. package/dist/carousel.js +129 -0
  18. package/dist/carousel.js.map +1 -0
  19. package/dist/checkbox-group.d.ts +19 -0
  20. package/dist/checkbox-group.d.ts.map +1 -0
  21. package/dist/checkbox-group.js +14 -0
  22. package/dist/checkbox-group.js.map +1 -0
  23. package/dist/checkbox.d.ts +17 -0
  24. package/dist/checkbox.d.ts.map +1 -0
  25. package/dist/checkbox.js +12 -0
  26. package/dist/checkbox.js.map +1 -0
  27. package/dist/combobox.d.ts +100 -0
  28. package/dist/combobox.d.ts.map +1 -0
  29. package/dist/combobox.js +286 -0
  30. package/dist/combobox.js.map +1 -0
  31. package/dist/date-field.d.ts +36 -0
  32. package/dist/date-field.d.ts.map +1 -0
  33. package/dist/date-field.js +46 -0
  34. package/dist/date-field.js.map +1 -0
  35. package/dist/date-picker.d.ts +38 -0
  36. package/dist/date-picker.d.ts.map +1 -0
  37. package/dist/date-picker.js +40 -0
  38. package/dist/date-picker.js.map +1 -0
  39. package/dist/date-range-picker.d.ts +38 -0
  40. package/dist/date-range-picker.d.ts.map +1 -0
  41. package/dist/date-range-picker.js +29 -0
  42. package/dist/date-range-picker.js.map +1 -0
  43. package/dist/date-time-field.d.ts +36 -0
  44. package/dist/date-time-field.d.ts.map +1 -0
  45. package/dist/date-time-field.js +133 -0
  46. package/dist/date-time-field.js.map +1 -0
  47. package/dist/date-time-picker.d.ts +38 -0
  48. package/dist/date-time-picker.d.ts.map +1 -0
  49. package/dist/date-time-picker.js +127 -0
  50. package/dist/date-time-picker.js.map +1 -0
  51. package/dist/date-time-range-picker.d.ts +38 -0
  52. package/dist/date-time-range-picker.d.ts.map +1 -0
  53. package/dist/date-time-range-picker.js +136 -0
  54. package/dist/date-time-range-picker.js.map +1 -0
  55. package/dist/dialog.d.ts +17 -0
  56. package/dist/dialog.d.ts.map +1 -0
  57. package/dist/dialog.js +12 -0
  58. package/dist/dialog.js.map +1 -0
  59. package/dist/disclosure.d.ts +22 -0
  60. package/dist/disclosure.d.ts.map +1 -0
  61. package/dist/disclosure.js +56 -0
  62. package/dist/disclosure.js.map +1 -0
  63. package/dist/feed.d.ts +28 -0
  64. package/dist/feed.d.ts.map +1 -0
  65. package/dist/feed.js +32 -0
  66. package/dist/feed.js.map +1 -0
  67. package/dist/grid.d.ts +40 -0
  68. package/dist/grid.d.ts.map +1 -0
  69. package/dist/grid.js +68 -0
  70. package/dist/grid.js.map +1 -0
  71. package/dist/index.d.ts +46 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +44 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/internal/checked-control.d.ts +23 -0
  76. package/dist/internal/checked-control.d.ts.map +1 -0
  77. package/dist/internal/checked-control.js +22 -0
  78. package/dist/internal/checked-control.js.map +1 -0
  79. package/dist/internal/controller.d.ts +6 -0
  80. package/dist/internal/controller.d.ts.map +1 -0
  81. package/dist/internal/controller.js +35 -0
  82. package/dist/internal/controller.js.map +1 -0
  83. package/dist/internal/disabled-items.d.ts +6 -0
  84. package/dist/internal/disabled-items.d.ts.map +1 -0
  85. package/dist/internal/disabled-items.js +15 -0
  86. package/dist/internal/disabled-items.js.map +1 -0
  87. package/dist/internal/facade.d.ts +44 -0
  88. package/dist/internal/facade.d.ts.map +1 -0
  89. package/dist/internal/facade.js +58 -0
  90. package/dist/internal/facade.js.map +1 -0
  91. package/dist/internal/menu-control.d.ts +34 -0
  92. package/dist/internal/menu-control.d.ts.map +1 -0
  93. package/dist/internal/menu-control.js +48 -0
  94. package/dist/internal/menu-control.js.map +1 -0
  95. package/dist/internal/popup-control.d.ts +24 -0
  96. package/dist/internal/popup-control.d.ts.map +1 -0
  97. package/dist/internal/popup-control.js +23 -0
  98. package/dist/internal/popup-control.js.map +1 -0
  99. package/dist/internal/semantic-controller.d.ts +20 -0
  100. package/dist/internal/semantic-controller.d.ts.map +1 -0
  101. package/dist/internal/semantic-controller.js +42 -0
  102. package/dist/internal/semantic-controller.js.map +1 -0
  103. package/dist/internal/text-input.d.ts +5 -0
  104. package/dist/internal/text-input.d.ts.map +1 -0
  105. package/dist/internal/text-input.js +53 -0
  106. package/dist/internal/text-input.js.map +1 -0
  107. package/dist/keyboard.d.ts +10 -0
  108. package/dist/keyboard.d.ts.map +1 -0
  109. package/dist/keyboard.js +16 -0
  110. package/dist/keyboard.js.map +1 -0
  111. package/dist/layout.d.ts +2 -0
  112. package/dist/layout.d.ts.map +1 -0
  113. package/dist/layout.js +24 -0
  114. package/dist/layout.js.map +1 -0
  115. package/dist/listbox.d.ts +87 -0
  116. package/dist/listbox.d.ts.map +1 -0
  117. package/dist/listbox.js +323 -0
  118. package/dist/listbox.js.map +1 -0
  119. package/dist/menu-button.d.ts +8 -0
  120. package/dist/menu-button.d.ts.map +1 -0
  121. package/dist/menu-button.js +11 -0
  122. package/dist/menu-button.js.map +1 -0
  123. package/dist/menu.d.ts +8 -0
  124. package/dist/menu.d.ts.map +1 -0
  125. package/dist/menu.js +11 -0
  126. package/dist/menu.js.map +1 -0
  127. package/dist/menubar.d.ts +8 -0
  128. package/dist/menubar.d.ts.map +1 -0
  129. package/dist/menubar.js +11 -0
  130. package/dist/menubar.js.map +1 -0
  131. package/dist/multi-thumb-slider.d.ts +32 -0
  132. package/dist/multi-thumb-slider.d.ts.map +1 -0
  133. package/dist/multi-thumb-slider.js +67 -0
  134. package/dist/multi-thumb-slider.js.map +1 -0
  135. package/dist/node.d.ts +15 -0
  136. package/dist/node.d.ts.map +1 -0
  137. package/dist/node.js +78 -0
  138. package/dist/node.js.map +1 -0
  139. package/dist/number-field.d.ts +44 -0
  140. package/dist/number-field.d.ts.map +1 -0
  141. package/dist/number-field.js +157 -0
  142. package/dist/number-field.js.map +1 -0
  143. package/dist/pagination.d.ts +35 -0
  144. package/dist/pagination.d.ts.map +1 -0
  145. package/dist/pagination.js +103 -0
  146. package/dist/pagination.js.map +1 -0
  147. package/dist/pin-input.d.ts +25 -0
  148. package/dist/pin-input.d.ts.map +1 -0
  149. package/dist/pin-input.js +30 -0
  150. package/dist/pin-input.js.map +1 -0
  151. package/dist/quantity-field.d.ts +45 -0
  152. package/dist/quantity-field.d.ts.map +1 -0
  153. package/dist/quantity-field.js +168 -0
  154. package/dist/quantity-field.js.map +1 -0
  155. package/dist/radio-group.d.ts +37 -0
  156. package/dist/radio-group.d.ts.map +1 -0
  157. package/dist/radio-group.js +126 -0
  158. package/dist/radio-group.js.map +1 -0
  159. package/dist/rating.d.ts +22 -0
  160. package/dist/rating.d.ts.map +1 -0
  161. package/dist/rating.js +38 -0
  162. package/dist/rating.js.map +1 -0
  163. package/dist/select.d.ts +41 -0
  164. package/dist/select.d.ts.map +1 -0
  165. package/dist/select.js +50 -0
  166. package/dist/select.js.map +1 -0
  167. package/dist/slider.d.ts +59 -0
  168. package/dist/slider.d.ts.map +1 -0
  169. package/dist/slider.js +156 -0
  170. package/dist/slider.js.map +1 -0
  171. package/dist/spin-button.d.ts +35 -0
  172. package/dist/spin-button.d.ts.map +1 -0
  173. package/dist/spin-button.js +78 -0
  174. package/dist/spin-button.js.map +1 -0
  175. package/dist/stepper.d.ts +19 -0
  176. package/dist/stepper.d.ts.map +1 -0
  177. package/dist/stepper.js +14 -0
  178. package/dist/stepper.js.map +1 -0
  179. package/dist/switch.d.ts +15 -0
  180. package/dist/switch.d.ts.map +1 -0
  181. package/dist/switch.js +12 -0
  182. package/dist/switch.js.map +1 -0
  183. package/dist/tabs.d.ts +42 -0
  184. package/dist/tabs.d.ts.map +1 -0
  185. package/dist/tabs.js +128 -0
  186. package/dist/tabs.js.map +1 -0
  187. package/dist/tags-input.d.ts +29 -0
  188. package/dist/tags-input.d.ts.map +1 -0
  189. package/dist/tags-input.js +27 -0
  190. package/dist/tags-input.js.map +1 -0
  191. package/dist/text.d.ts +60 -0
  192. package/dist/text.d.ts.map +1 -0
  193. package/dist/text.js +143 -0
  194. package/dist/text.js.map +1 -0
  195. package/dist/time-field.d.ts +36 -0
  196. package/dist/time-field.d.ts.map +1 -0
  197. package/dist/time-field.js +40 -0
  198. package/dist/time-field.js.map +1 -0
  199. package/dist/toggle-button.d.ts +15 -0
  200. package/dist/toggle-button.d.ts.map +1 -0
  201. package/dist/toggle-button.js +12 -0
  202. package/dist/toggle-button.js.map +1 -0
  203. package/dist/toolbar.d.ts +34 -0
  204. package/dist/toolbar.d.ts.map +1 -0
  205. package/dist/toolbar.js +108 -0
  206. package/dist/toolbar.js.map +1 -0
  207. package/dist/tooltip.d.ts +15 -0
  208. package/dist/tooltip.d.ts.map +1 -0
  209. package/dist/tooltip.js +12 -0
  210. package/dist/tooltip.js.map +1 -0
  211. package/dist/tree-grid.d.ts +94 -0
  212. package/dist/tree-grid.d.ts.map +1 -0
  213. package/dist/tree-grid.js +308 -0
  214. package/dist/tree-grid.js.map +1 -0
  215. package/dist/tree-view.d.ts +75 -0
  216. package/dist/tree-view.d.ts.map +1 -0
  217. package/dist/tree-view.js +213 -0
  218. package/dist/tree-view.js.map +1 -0
  219. package/dist/window-splitter.d.ts +19 -0
  220. package/dist/window-splitter.d.ts.map +1 -0
  221. package/dist/window-splitter.js +48 -0
  222. package/dist/window-splitter.js.map +1 -0
  223. package/package.json +273 -0
@@ -0,0 +1,24 @@
1
+ import type { Result } from '@sectile/core';
2
+ import type { InteractionStateInput } from '@sectile/core/interaction';
3
+ import type { MachineUpdate, RevisionSnapshot } from '@sectile/core/revision';
4
+ import type { TerminalKeyboardInput } from '../keyboard.js';
5
+ export interface TerminalPopupConnection<State, Event> {
6
+ getSnapshot(): RevisionSnapshot<State>;
7
+ syncControlledValue(open: boolean): Result<RevisionSnapshot<State>>;
8
+ handleEvent(event: Event): boolean;
9
+ handleKeyboardInput(input: TerminalKeyboardInput): boolean;
10
+ }
11
+ export interface Options<State, Event, Command> {
12
+ readonly controlled: boolean;
13
+ readonly initial: Result<State>;
14
+ readonly reducer: (state: State, event: Event) => Result<MachineUpdate<State, Command>>;
15
+ readonly create: (open: boolean) => Result<State>;
16
+ readonly read: (state: State) => boolean;
17
+ readonly close: Event;
18
+ readonly onOpenChange?: ((open: boolean) => void) | undefined;
19
+ readonly command?: ((command: Command) => void) | undefined;
20
+ readonly onUpdate?: (() => void) | undefined;
21
+ readonly interaction?: InteractionStateInput;
22
+ }
23
+ export declare function createTerminalPopup<State, Event, Command>(options: Options<State, Event, Command>): Result<TerminalPopupConnection<State, Event>>;
24
+ //# sourceMappingURL=popup-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-control.d.ts","sourceRoot":"","sources":["../../src/internal/popup-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG5D,MAAM,WAAW,uBAAuB,CAAC,KAAK,EAAE,KAAK;IAAI,WAAW,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IAAC,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAA;CAAE;AACtQ,MAAM,WAAW,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO;IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAA;CAAE;AACthB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAIjJ"}
@@ -0,0 +1,23 @@
1
+ import { createSemanticController } from './semantic-controller.js';
2
+ export function createTerminalPopup(options) {
3
+ const runtime = createSemanticController({ initial: options.initial, reducer: options.reducer, reconcile: (previous, proposed) => options.create(options.controlled ? options.read(previous) : options.read(proposed)), notify: (previous, proposed) => { if (options.read(previous) !== options.read(proposed))
4
+ options.onOpenChange?.(options.read(proposed)); }, toEffect: (command) => command, interaction: options.interaction });
5
+ if (!runtime.ok)
6
+ return runtime;
7
+ return { ok: true, value: new TerminalPopup(options, runtime.value) };
8
+ }
9
+ class TerminalPopup {
10
+ #options;
11
+ #runtime;
12
+ constructor(options, runtime) { this.#options = options; this.#runtime = runtime; }
13
+ getSnapshot() { return this.#runtime.getSnapshot(); }
14
+ syncControlledValue(open) { if (!this.#options.controlled)
15
+ return { ok: false, error: { class: 'construction', code: 'uncontrolled-controller-sync', message: 'An uncontrolled popup cannot be synchronized externally.' } }; const result = this.#runtime.replace(this.#options.create(open)); if (result.ok)
16
+ this.#options.onUpdate?.(); return result; }
17
+ handleEvent(event) { const result = this.#runtime.handle(event); if (result.ok)
18
+ for (const command of result.commands)
19
+ this.#options.command?.(command); if (result.ok)
20
+ this.#options.onUpdate?.(); return result.ok; }
21
+ handleKeyboardInput(input) { return input.key === 'escape' ? this.handleEvent(this.#options.close) : false; }
22
+ }
23
+ //# sourceMappingURL=popup-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-control.js","sourceRoot":"","sources":["../../src/internal/popup-control.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAA2B,MAAM,0BAA0B,CAAC;AAI7F,MAAM,UAAU,mBAAmB,CAAwB,OAAuC;IAChG,MAAM,OAAO,GAAG,wBAAwB,CAAiC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxc,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC;AACD,MAAM,aAAa;IACR,QAAQ,CAAiC;IAAU,QAAQ,CAA4C;IAChH,YAAmB,OAAuC,EAAE,OAAkD,IAAI,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAC9J,WAAW,KAA8B,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9E,mBAAmB,CAAC,IAAa,IAAqC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,0DAA0D,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;IACrY,WAAW,CAAC,KAAY,IAAa,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE;QAAE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvO,mBAAmB,CAAC,KAA4B,IAAa,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;CACrJ"}
@@ -0,0 +1,20 @@
1
+ import type { Result } from '@sectile/core';
2
+ import { type InteractionStateInput } from '@sectile/core/interaction';
3
+ import { type EventReducer, type RevisionResult, type RevisionSnapshot } from '@sectile/core/revision';
4
+ export interface SemanticController<State, Event, Effect> {
5
+ getSnapshot(): RevisionSnapshot<State>;
6
+ replace(state: Result<State>): Result<RevisionSnapshot<State>>;
7
+ handle(event: Event, expectedRevision?: number): RevisionResult<State, Effect>;
8
+ reject(code: string, message: string, details?: Readonly<Record<string, unknown>>): RevisionResult<State, Effect>;
9
+ }
10
+ export interface SemanticControllerOptions<State, Event, Command, Effect> {
11
+ readonly initial: Result<State>;
12
+ readonly reducer: EventReducer<State, Event, Command>;
13
+ readonly reconcile?: (previous: State, proposed: State) => Result<State>;
14
+ readonly notify?: (previous: State, proposed: State) => void;
15
+ readonly toEffect: (command: Command) => Effect;
16
+ readonly interaction?: InteractionStateInput | undefined;
17
+ readonly interactionIntent?: (event: Event) => 'navigate' | 'mutate';
18
+ }
19
+ export declare function createSemanticController<State, Event, Command, Effect>(options: SemanticControllerOptions<State, Event, Command, Effect>): Result<SemanticController<State, Event, Effect>>;
20
+ //# sourceMappingURL=semantic-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-controller.d.ts","sourceRoot":"","sources":["../../src/internal/semantic-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM;IACtD,WAAW,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7D,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,UAAU,GAAG,QAAQ,CAAC;CACtE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EACpE,OAAO,EAAE,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAChE,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAiDlD"}
@@ -0,0 +1,42 @@
1
+ import { createInteractionState, requireInteraction, } from '@sectile/core/interaction';
2
+ import { createRevisionSnapshot, rejectRevisionInput, } from '@sectile/core/revision';
3
+ import { applyControllerEvent, synchronizeControllerState } from './controller.js';
4
+ export function createSemanticController(options) {
5
+ if (!options.initial.ok)
6
+ return options.initial;
7
+ const interaction = createInteractionState(options.interaction);
8
+ if (!interaction.ok)
9
+ return interaction;
10
+ const snapshot = createRevisionSnapshot(options.initial.value);
11
+ if (!snapshot.ok)
12
+ return snapshot;
13
+ let current = snapshot.value;
14
+ return {
15
+ ok: true,
16
+ value: Object.freeze({
17
+ getSnapshot: () => current,
18
+ replace: (state) => {
19
+ const next = synchronizeControllerState(current, state);
20
+ if (next.ok)
21
+ current = next.value;
22
+ return next;
23
+ },
24
+ handle: (event, expectedRevision = current.revision) => {
25
+ const permitted = requireInteraction(interaction.value, options.interactionIntent?.(event) ?? 'mutate');
26
+ if (!permitted.ok)
27
+ return rejectRevisionInput(current, permitted.error);
28
+ const result = applyControllerEvent(current, expectedRevision, event, options.reducer, options.reconcile ?? ((_previous, proposed) => ({ ok: true, value: proposed })), options.notify ?? (() => undefined), options.toEffect);
29
+ if (result.ok)
30
+ current = result.snapshot;
31
+ return result;
32
+ },
33
+ reject: (code, message, details) => rejectRevisionInput(current, {
34
+ class: 'transition-rejection',
35
+ code,
36
+ message,
37
+ ...(details === undefined ? {} : { details }),
38
+ }),
39
+ }),
40
+ };
41
+ }
42
+ //# sourceMappingURL=semantic-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-controller.js","sourceRoot":"","sources":["../../src/internal/semantic-controller.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GAIpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAmBnF,MAAM,UAAU,wBAAwB,CACtC,OAAiE;IAEjE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAChD,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC;IACxC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,GAA4B,EAAE,CAAC,OAAO;YACnD,OAAO,EAAE,CAAC,KAAoB,EAAmC,EAAE;gBACjE,MAAM,IAAI,GAAG,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACxD,IAAI,IAAI,CAAC,EAAE;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CACN,KAAY,EACZ,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EACJ,EAAE;gBACjC,MAAM,SAAS,GAAG,kBAAkB,CAClC,WAAW,CAAC,KAAK,EACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,QAAQ,CAC/C,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,EAAE;oBAAE,OAAO,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,MAAM,GAAG,oBAAoB,CACjC,OAAO,EACP,gBAAgB,EAChB,KAAK,EACL,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAC/E,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EACnC,OAAO,CAAC,QAAQ,CACjB,CAAC;gBACF,IAAI,MAAM,CAAC,EAAE;oBAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;gBACzC,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,EAAE,CACN,IAAY,EACZ,OAAe,EACf,OAA2C,EACZ,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE;gBAC/D,KAAK,EAAE,sBAAsB;gBAC7B,IAAI;gBACJ,OAAO;gBACP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;aAC9C,CAAC;SACH,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TextEditingState } from '@sectile/core/text';
2
+ import type { TerminalKeyboardInput } from '../keyboard.js';
3
+ import type { TextInput } from '../text.js';
4
+ export declare function toTerminalTextInput(state: TextEditingState, input: TerminalKeyboardInput): TextInput | null;
5
+ //# sourceMappingURL=text-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.d.ts","sourceRoot":"","sources":["../../src/internal/text-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,qBAAqB,GAC3B,SAAS,GAAG,IAAI,CA0BlB"}
@@ -0,0 +1,53 @@
1
+ export function toTerminalTextInput(state, input) {
2
+ if (input.ctrlKey === true || input.altKey === true)
3
+ return null;
4
+ const snapshot = state.snapshot;
5
+ let start = snapshot.selection.startCodeUnitOffset;
6
+ let end = snapshot.selection.endCodeUnitOffset;
7
+ let text;
8
+ let type;
9
+ if (input.key === 'backspace') {
10
+ if (start === end)
11
+ start = previousGraphemeOffset(snapshot.text, start);
12
+ text = '';
13
+ type = 'delete';
14
+ }
15
+ else if (input.key === 'delete') {
16
+ if (start === end)
17
+ end = nextGraphemeOffset(snapshot.text, end);
18
+ text = '';
19
+ type = 'delete';
20
+ }
21
+ else if (input.text !== undefined && input.text.length > 0) {
22
+ text = input.text;
23
+ type = start === end ? 'insert' : 'replace';
24
+ }
25
+ else {
26
+ return null;
27
+ }
28
+ const offset = start + text.length;
29
+ const selection = collapsedSelection(offset);
30
+ return type === 'delete'
31
+ ? { type, startCodeUnitOffset: start, endCodeUnitOffset: end, selection }
32
+ : { type, text, startCodeUnitOffset: start, endCodeUnitOffset: end, selection };
33
+ }
34
+ function collapsedSelection(offset) {
35
+ return Object.freeze({ anchorCodeUnitOffset: offset, focusCodeUnitOffset: offset });
36
+ }
37
+ function previousGraphemeOffset(text, offset) {
38
+ let previous = 0;
39
+ for (const segment of new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text)) {
40
+ if (segment.index >= offset)
41
+ break;
42
+ previous = segment.index;
43
+ }
44
+ return previous;
45
+ }
46
+ function nextGraphemeOffset(text, offset) {
47
+ for (const segment of new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text)) {
48
+ if (segment.index > offset)
49
+ return segment.index;
50
+ }
51
+ return text.length;
52
+ }
53
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","sourceRoot":"","sources":["../../src/internal/text-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface TerminalKeyboardInput {
2
+ readonly key: string;
3
+ readonly text?: string;
4
+ readonly altKey?: boolean;
5
+ readonly ctrlKey?: boolean;
6
+ readonly shiftKey?: boolean;
7
+ }
8
+ export declare function applyTerminalTextInput(value: string, input: TerminalKeyboardInput): string | null;
9
+ export declare function removeLastGrapheme(value: string): string;
10
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,qBAAqB,GAC3B,MAAM,GAAG,IAAI,CAKf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxD"}
@@ -0,0 +1,16 @@
1
+ export function applyTerminalTextInput(value, input) {
2
+ if (input.ctrlKey === true || input.altKey === true)
3
+ return null;
4
+ if (input.key === 'backspace')
5
+ return removeLastGrapheme(value);
6
+ if (input.text === undefined || input.text.length === 0)
7
+ return null;
8
+ return `${value}${input.text}`;
9
+ }
10
+ export function removeLastGrapheme(value) {
11
+ const segments = Array.from(new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(value));
12
+ if (segments.length === 0)
13
+ return value;
14
+ return value.slice(0, segments.at(-1)?.index ?? value.length);
15
+ }
16
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,KAA4B;IAE5B,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fitTerminalText(value: string, width: number): string;
2
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBpE"}
package/dist/layout.js ADDED
@@ -0,0 +1,24 @@
1
+ import stringWidth from 'string-width';
2
+ export function fitTerminalText(value, width) {
3
+ if (!Number.isSafeInteger(width) || width < 0) {
4
+ throw new RangeError('Terminal text width must be a non-negative safe integer.');
5
+ }
6
+ if (width === 0)
7
+ return '';
8
+ const valueWidth = stringWidth(value);
9
+ if (valueWidth <= width)
10
+ return `${value}${' '.repeat(width - valueWidth)}`;
11
+ const ellipsis = '…';
12
+ const contentWidth = width - stringWidth(ellipsis);
13
+ let rendered = '';
14
+ let renderedWidth = 0;
15
+ for (const segment of new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(value)) {
16
+ const segmentWidth = stringWidth(segment.segment);
17
+ if (renderedWidth + segmentWidth > contentWidth)
18
+ break;
19
+ rendered += segment.segment;
20
+ renderedWidth += segmentWidth;
21
+ }
22
+ return `${rendered}${' '.repeat(contentWidth - renderedWidth)}${ellipsis}`;
23
+ }
24
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAa;IAC1D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,UAAU,CAAC,0DAA0D,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,UAAU,IAAI,KAAK;QAAE,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAE5E,MAAM,QAAQ,GAAG,GAAG,CAAC;IACrB,MAAM,YAAY,GAAG,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,aAAa,GAAG,YAAY,GAAG,YAAY;YAAE,MAAM;QACvD,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;QAC5B,aAAa,IAAI,YAAY,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,QAAQ,EAAE,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { type FacadeConnection } from './internal/facade.js';
2
+ import type { Result, StableID } from '@sectile/core';
3
+ import { type ListboxCommand, type ListboxEvent, type ListboxPolicies, type ListboxSelectionMode, type ListboxState } from '@sectile/core/listbox';
4
+ import { type Sequence } from '@sectile/core/sequence';
5
+ import { type RevisionResult, type RevisionSnapshot } from '@sectile/core/revision';
6
+ import type { TerminalKeyboardInput } from './keyboard.js';
7
+ export type KeyboardInput = TerminalKeyboardInput;
8
+ export type ListboxEffect<ID extends StableID = StableID> = {
9
+ readonly type: 'move-highlight';
10
+ readonly id: ID;
11
+ } | {
12
+ readonly type: 'submit-item';
13
+ readonly id: ID;
14
+ };
15
+ export interface ListboxValueChangeDetails<ID extends StableID = StableID> {
16
+ readonly value: readonly ID[];
17
+ readonly previousValue: readonly ID[];
18
+ }
19
+ export interface ListboxHighlightChangeDetails<ID extends StableID = StableID> {
20
+ readonly value: ID | null;
21
+ readonly previousValue: ID | null;
22
+ }
23
+ export interface ListboxControllerOptions<ID extends StableID = StableID> {
24
+ readonly domain: Sequence<ID>;
25
+ readonly policies?: ListboxPolicies<ID>;
26
+ readonly selectionMode?: ListboxSelectionMode;
27
+ readonly orientation?: 'horizontal' | 'vertical';
28
+ readonly disabledItems?: readonly ID[];
29
+ readonly disabled?: boolean;
30
+ readonly readOnly?: boolean;
31
+ readonly typeahead?: ListboxTypeaheadOptions<ID>;
32
+ readonly value?: readonly ID[];
33
+ readonly defaultValue?: readonly ID[];
34
+ readonly highlightedValue?: ID | null;
35
+ readonly defaultHighlightedValue?: ID | null;
36
+ readonly onValueChange?: (change: ListboxValueChangeDetails<ID>) => void;
37
+ readonly onHighlightedValueChange?: (change: ListboxHighlightChangeDetails<ID>) => void;
38
+ }
39
+ export interface ListboxTypeaheadOptions<ID extends StableID = StableID> {
40
+ readonly textValue: (id: ID) => string;
41
+ readonly normalize?: (text: string) => string;
42
+ readonly timeoutMs?: number;
43
+ readonly now?: () => number;
44
+ }
45
+ export interface ListboxControlledValues<ID extends StableID = StableID> {
46
+ readonly value?: readonly ID[];
47
+ readonly highlightedValue?: ID | null;
48
+ }
49
+ export interface ListboxController<ID extends StableID = StableID> {
50
+ getSnapshot(): RevisionSnapshot<ListboxState<ID>>;
51
+ syncControlledValues(values: ListboxControlledValues<ID>): Result<RevisionSnapshot<ListboxState<ID>>>;
52
+ handleKeyboardInput(input: KeyboardInput, expectedRevision?: number): RevisionResult<ListboxState<ID>, ListboxEffect<ID>>;
53
+ handleEvent(event: ListboxEvent<ID>, expectedRevision?: number): RevisionResult<ListboxState<ID>, ListboxEffect<ID>>;
54
+ }
55
+ export interface ListboxTransitionDetails<ID extends StableID = StableID> {
56
+ readonly event: ListboxEvent<ID> | {
57
+ readonly type: 'typeahead';
58
+ readonly query: string;
59
+ };
60
+ readonly result: RevisionResult<ListboxState<ID>, ListboxEffect<ID>>;
61
+ }
62
+ export interface ListboxConnectionOptions<ID extends StableID = StableID> {
63
+ readonly controller: ListboxController<ID>;
64
+ readonly disabled?: boolean;
65
+ readonly readOnly?: boolean;
66
+ readonly orientation?: 'horizontal' | 'vertical';
67
+ readonly typeahead?: ListboxTypeaheadOptions<ID>;
68
+ readonly onActivate?: (id: ID) => void;
69
+ readonly onTransition?: (details: ListboxTransitionDetails<ID>) => void;
70
+ readonly onUpdate?: () => void;
71
+ }
72
+ export interface ListboxConnection<ID extends StableID = StableID> {
73
+ getSnapshot(): RevisionSnapshot<ListboxState<ID>>;
74
+ syncControlledValues(values: ListboxControlledValues<ID>): Result<RevisionSnapshot<ListboxState<ID>>>;
75
+ handleKeyboardInput(input: KeyboardInput): boolean;
76
+ handleEvent(event: ListboxEvent<ID>): boolean;
77
+ }
78
+ export type ListboxOptions<ID extends StableID = StableID> = Omit<ListboxControllerOptions<ID>, 'domain'> & Omit<ListboxConnectionOptions<ID>, 'controller'> & {
79
+ readonly items: readonly ID[];
80
+ };
81
+ export declare function createListboxController<ID extends StableID>(options: ListboxControllerOptions<ID>): Result<ListboxController<ID>>;
82
+ export declare function createListbox<ID extends StableID>(options: ListboxOptions<ID>): FacadeConnection<ListboxConnection<ID>>;
83
+ export declare function tryCreateListbox<ID extends StableID>(options: ListboxOptions<ID>): Result<FacadeConnection<ListboxConnection<ID>>>;
84
+ export declare function connectListbox<ID extends StableID>(options: ListboxConnectionOptions<ID>): ListboxConnection<ID>;
85
+ export declare function toListboxEvent<ID extends StableID = StableID>(input: KeyboardInput, orientation?: 'horizontal' | 'vertical'): ListboxEvent<ID> | null;
86
+ export declare function toListboxEffect<ID extends StableID>(command: ListboxCommand<ID>): ListboxEffect<ID>;
87
+ //# sourceMappingURL=listbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listbox.d.ts","sourceRoot":"","sources":["../src/listbox.ts"],"names":[],"mappings":"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"}