termcast 1.3.32 → 1.3.34
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.
- package/dist/action-utils.d.ts.map +1 -1
- package/dist/action-utils.js +8 -0
- package/dist/action-utils.js.map +1 -1
- package/dist/apis/cache.d.ts +1 -2
- package/dist/apis/cache.d.ts.map +1 -1
- package/dist/apis/cache.js +138 -54
- package/dist/apis/cache.js.map +1 -1
- package/dist/apis/clipboard.d.ts.map +1 -1
- package/dist/apis/clipboard.js +4 -0
- package/dist/apis/clipboard.js.map +1 -1
- package/dist/apis/oauth.d.ts.map +1 -1
- package/dist/apis/oauth.js +31 -4
- package/dist/apis/oauth.js.map +1 -1
- package/dist/build.d.ts +0 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +30 -51
- package/dist/build.js.map +1 -1
- package/dist/cli.js +31 -14
- package/dist/cli.js.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +5 -1
- package/dist/compile.js.map +1 -1
- package/dist/components/actions.d.ts +14 -0
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js +151 -59
- package/dist/components/actions.js.map +1 -1
- package/dist/components/alert.d.ts.map +1 -1
- package/dist/components/alert.js +6 -5
- package/dist/components/alert.js.map +1 -1
- package/dist/components/animation-tick.d.ts +1 -1
- package/dist/components/animation-tick.js +1 -1
- package/dist/components/animation-tick.js.map +1 -1
- package/dist/components/detail.d.ts +5 -31
- package/dist/components/detail.d.ts.map +1 -1
- package/dist/components/detail.js +36 -52
- package/dist/components/detail.js.map +1 -1
- package/dist/components/dropdown.d.ts +1 -1
- package/dist/components/dropdown.d.ts.map +1 -1
- package/dist/components/dropdown.js +50 -22
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/footer.d.ts.map +1 -1
- package/dist/components/footer.js +19 -18
- package/dist/components/footer.js.map +1 -1
- package/dist/components/form/checkbox.d.ts.map +1 -1
- package/dist/components/form/checkbox.js +12 -11
- package/dist/components/form/checkbox.js.map +1 -1
- package/dist/components/form/date-picker.d.ts.map +1 -1
- package/dist/components/form/date-picker.js +7 -22
- package/dist/components/form/date-picker.js.map +1 -1
- package/dist/components/form/description.d.ts +1 -1
- package/dist/components/form/description.d.ts.map +1 -1
- package/dist/components/form/description.js +6 -5
- package/dist/components/form/description.js.map +1 -1
- package/dist/components/form/dropdown.d.ts.map +1 -1
- package/dist/components/form/dropdown.js +53 -50
- package/dist/components/form/dropdown.js.map +1 -1
- package/dist/components/form/file-autocomplete.d.ts.map +1 -1
- package/dist/components/form/file-autocomplete.js +5 -4
- package/dist/components/form/file-autocomplete.js.map +1 -1
- package/dist/components/form/file-picker.d.ts.map +1 -1
- package/dist/components/form/file-picker.js +23 -22
- package/dist/components/form/file-picker.js.map +1 -1
- package/dist/components/form/form-end.d.ts.map +1 -1
- package/dist/components/form/form-end.js +6 -4
- package/dist/components/form/form-end.js.map +1 -1
- package/dist/components/form/form-field-wrapper.d.ts +15 -0
- package/dist/components/form/form-field-wrapper.d.ts.map +1 -0
- package/dist/components/form/form-field-wrapper.js +29 -0
- package/dist/components/form/form-field-wrapper.js.map +1 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +31 -30
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/password-field.d.ts.map +1 -1
- package/dist/components/form/password-field.js +7 -6
- package/dist/components/form/password-field.js.map +1 -1
- package/dist/components/form/separator.d.ts.map +1 -1
- package/dist/components/form/separator.js +3 -2
- package/dist/components/form/separator.js.map +1 -1
- package/dist/components/form/tagpicker.d.ts.map +1 -1
- package/dist/components/form/tagpicker.js +2 -1
- package/dist/components/form/tagpicker.js.map +1 -1
- package/dist/components/form/text-area.d.ts.map +1 -1
- package/dist/components/form/text-area.js +7 -6
- package/dist/components/form/text-area.js.map +1 -1
- package/dist/components/form/text-field.d.ts.map +1 -1
- package/dist/components/form/text-field.js +7 -6
- package/dist/components/form/text-field.js.map +1 -1
- package/dist/components/form/use-form-navigation.d.ts.map +1 -1
- package/dist/components/form/use-form-navigation.js +4 -4
- package/dist/components/form/use-form-navigation.js.map +1 -1
- package/dist/components/form/with-left-border.d.ts +15 -0
- package/dist/components/form/with-left-border.d.ts.map +1 -1
- package/dist/components/form/with-left-border.js +21 -9
- package/dist/components/form/with-left-border.js.map +1 -1
- package/dist/components/icon.d.ts +14 -0
- package/dist/components/icon.d.ts.map +1 -1
- package/dist/components/icon.js +60 -0
- package/dist/components/icon.js.map +1 -1
- package/dist/components/image.d.ts +47 -2
- package/dist/components/image.d.ts.map +1 -1
- package/dist/components/image.js +46 -7
- package/dist/components/image.js.map +1 -1
- package/dist/components/list.d.ts +5 -0
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +188 -132
- package/dist/components/list.js.map +1 -1
- package/dist/components/loading-bar.d.ts.map +1 -1
- package/dist/components/loading-bar.js +4 -3
- package/dist/components/loading-bar.js.map +1 -1
- package/dist/components/metadata.d.ts +70 -0
- package/dist/components/metadata.d.ts.map +1 -0
- package/dist/components/metadata.js +82 -0
- package/dist/components/metadata.js.map +1 -0
- package/dist/components/theme-picker.d.ts.map +1 -1
- package/dist/components/theme-picker.js +3 -2
- package/dist/components/theme-picker.js.map +1 -1
- package/dist/descendants-v2.d.ts +60 -0
- package/dist/descendants-v2.d.ts.map +1 -0
- package/dist/descendants-v2.js +144 -0
- package/dist/descendants-v2.js.map +1 -0
- package/dist/examples/actions-context.d.ts +2 -0
- package/dist/examples/actions-context.d.ts.map +1 -0
- package/dist/examples/actions-context.js +33 -0
- package/dist/examples/actions-context.js.map +1 -0
- package/dist/examples/form-basic.d.ts.map +1 -1
- package/dist/examples/form-basic.js +1 -1
- package/dist/examples/form-basic.js.map +1 -1
- package/dist/examples/form-dropdown.js +1 -1
- package/dist/examples/form-dropdown.js.map +1 -1
- package/dist/examples/internal/custom-action-renderables.d.ts +70 -0
- package/dist/examples/internal/custom-action-renderables.d.ts.map +1 -0
- package/dist/examples/internal/custom-action-renderables.js +163 -0
- package/dist/examples/internal/custom-action-renderables.js.map +1 -0
- package/dist/examples/internal/custom-dropdown.d.ts +99 -0
- package/dist/examples/internal/custom-dropdown.d.ts.map +1 -0
- package/dist/examples/internal/custom-dropdown.js +270 -0
- package/dist/examples/internal/custom-dropdown.js.map +1 -0
- package/dist/examples/internal/custom-renderable-form.d.ts +43 -0
- package/dist/examples/internal/custom-renderable-form.d.ts.map +1 -0
- package/dist/examples/internal/custom-renderable-form.js +284 -0
- package/dist/examples/internal/custom-renderable-form.js.map +1 -0
- package/dist/examples/internal/custom-renderable-list-default-search.d.ts +2 -0
- package/dist/examples/internal/custom-renderable-list-default-search.d.ts.map +1 -0
- package/dist/examples/internal/custom-renderable-list-default-search.js +16 -0
- package/dist/examples/internal/custom-renderable-list-default-search.js.map +1 -0
- package/dist/examples/internal/custom-renderable-list-v2-default-search.d.ts +2 -0
- package/dist/examples/internal/custom-renderable-list-v2-default-search.d.ts.map +1 -0
- package/dist/examples/internal/custom-renderable-list-v2-default-search.js +24 -0
- package/dist/examples/internal/custom-renderable-list-v2-default-search.js.map +1 -0
- package/dist/examples/internal/custom-renderable-list-v2.d.ts +189 -0
- package/dist/examples/internal/custom-renderable-list-v2.d.ts.map +1 -0
- package/dist/examples/internal/custom-renderable-list-v2.js +708 -0
- package/dist/examples/internal/custom-renderable-list-v2.js.map +1 -0
- package/dist/examples/internal/custom-renderable-list.d.ts +72 -0
- package/dist/examples/internal/custom-renderable-list.d.ts.map +1 -0
- package/dist/examples/internal/custom-renderable-list.js +544 -0
- package/dist/examples/internal/custom-renderable-list.js.map +1 -0
- package/dist/examples/internal/rhf-custom-ref.js +5 -4
- package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
- package/dist/examples/internal/scrollbox-with-descendants.js +4 -2
- package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
- package/dist/examples/list-controlled-search.d.ts +2 -0
- package/dist/examples/list-controlled-search.d.ts.map +1 -0
- package/dist/examples/list-controlled-search.js +12 -0
- package/dist/examples/list-controlled-search.js.map +1 -0
- package/dist/examples/list-detail-metadata.js +1 -1
- package/dist/examples/list-detail-metadata.js.map +1 -1
- package/dist/examples/simple-image-mask.d.ts +8 -0
- package/dist/examples/simple-image-mask.d.ts.map +1 -0
- package/dist/examples/simple-image-mask.js +12 -0
- package/dist/examples/simple-image-mask.js.map +1 -0
- package/dist/examples/toast-variations.js +1 -1
- package/dist/examples/toast-variations.js.map +1 -1
- package/dist/extensions/dev.d.ts.map +1 -1
- package/dist/extensions/dev.js +3 -2
- package/dist/extensions/dev.js.map +1 -1
- package/dist/extensions/react-refresh-init.d.ts.map +1 -1
- package/dist/extensions/react-refresh-init.js +4 -3
- package/dist/extensions/react-refresh-init.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/date-picker-widget.d.ts.map +1 -1
- package/dist/internal/date-picker-widget.js +2 -1
- package/dist/internal/date-picker-widget.js.map +1 -1
- package/dist/internal/dialog.d.ts +6 -0
- package/dist/internal/dialog.d.ts.map +1 -1
- package/dist/internal/dialog.js +59 -18
- package/dist/internal/dialog.js.map +1 -1
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +8 -1
- package/dist/internal/navigation.js.map +1 -1
- package/dist/internal/offscreen.d.ts +3 -0
- package/dist/internal/offscreen.d.ts.map +1 -1
- package/dist/internal/offscreen.js +5 -0
- package/dist/internal/offscreen.js.map +1 -1
- package/dist/internal/providers.d.ts.map +1 -1
- package/dist/internal/providers.js +20 -3
- package/dist/internal/providers.js.map +1 -1
- package/dist/internal/scrollbox.d.ts.map +1 -1
- package/dist/internal/scrollbox.js +3 -2
- package/dist/internal/scrollbox.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -1
- package/dist/preload.js +5 -17
- package/dist/preload.js.map +1 -1
- package/dist/state.d.ts +4 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -0
- package/dist/state.js.map +1 -1
- package/dist/test-border-overlay.d.ts +2 -0
- package/dist/test-border-overlay.d.ts.map +1 -0
- package/dist/test-border-overlay.js +7 -0
- package/dist/test-border-overlay.js.map +1 -0
- package/dist/test-layout-2.d.ts +2 -0
- package/dist/test-layout-2.d.ts.map +1 -0
- package/dist/test-layout-2.js +5 -0
- package/dist/test-layout-2.js.map +1 -0
- package/dist/test-layout.d.ts +2 -0
- package/dist/test-layout.d.ts.map +1 -0
- package/dist/test-layout.js +7 -0
- package/dist/test-layout.js.map +1 -0
- package/dist/theme.d.ts +1 -2
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +5 -9
- package/dist/theme.js.map +1 -1
- package/dist/utils/run-command.d.ts +1 -1
- package/dist/utils/run-command.d.ts.map +1 -1
- package/dist/utils/run-command.js +27 -7
- package/dist/utils/run-command.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +44 -23
- package/dist/utils.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +24 -4
- package/dist/watcher.js.map +1 -1
- package/package.json +14 -12
- package/src/action-utils.tsx +10 -0
- package/src/apis/cache.test.ts +35 -3
- package/src/apis/cache.tsx +184 -59
- package/src/apis/clipboard.tsx +5 -0
- package/src/apis/oauth.tsx +33 -4
- package/src/build.tsx +35 -58
- package/src/cli.tsx +156 -134
- package/src/compile.tsx +6 -3
- package/src/compile.vitest.tsx +33 -15
- package/src/components/actions.tsx +230 -99
- package/src/components/alert.tsx +11 -10
- package/src/components/animation-tick.tsx +1 -1
- package/src/components/detail.tsx +56 -151
- package/src/components/dropdown.tsx +70 -36
- package/src/components/footer.tsx +58 -33
- package/src/components/form/checkbox.tsx +30 -32
- package/src/components/form/date-picker.tsx +27 -47
- package/src/components/form/description.tsx +19 -18
- package/src/components/form/dropdown.tsx +95 -103
- package/src/components/form/file-autocomplete.tsx +9 -8
- package/src/components/form/file-picker.tsx +46 -46
- package/src/components/form/form-end.tsx +6 -4
- package/src/components/form/index.tsx +38 -48
- package/src/components/form/password-field.tsx +25 -27
- package/src/components/form/separator.tsx +3 -2
- package/src/components/form/tagpicker.tsx +2 -1
- package/src/components/form/text-area.tsx +25 -30
- package/src/components/form/text-field.tsx +25 -27
- package/src/components/form/use-form-navigation.tsx +4 -5
- package/src/components/form/with-left-border.tsx +48 -10
- package/src/components/icon.tsx +69 -0
- package/src/components/image.tsx +60 -7
- package/src/components/list.tsx +270 -202
- package/src/components/loading-bar.tsx +4 -3
- package/src/components/metadata.tsx +217 -0
- package/src/components/theme-picker.tsx +3 -2
- package/src/examples/actions-context.tsx +63 -0
- package/src/examples/actions-context.vitest.tsx +110 -0
- package/src/examples/actions-dialog-layout.vitest.tsx +2 -1
- package/src/examples/file-autocomplete.vitest.tsx +15 -15
- package/src/examples/form-basic.tsx +12 -0
- package/src/examples/form-basic.vitest.tsx +74 -74
- package/src/examples/form-dropdown.tsx +8 -0
- package/src/examples/form-dropdown.vitest.tsx +364 -421
- package/src/examples/form-tagpicker.vitest.tsx +56 -54
- package/src/examples/github.vitest.tsx +252 -0
- package/src/examples/internal/rhf-custom-ref.tsx +16 -15
- package/src/examples/internal/scrollbox-with-descendants.tsx +4 -2
- package/src/examples/internal/simple-dialog.tsx +1 -1
- package/src/examples/internal/simple-scrollbox.vitest.tsx +14 -9
- package/src/examples/list-controlled-search.tsx +28 -0
- package/src/examples/list-controlled-search.vitest.tsx +49 -0
- package/src/examples/list-detail-metadata.tsx +8 -5
- package/src/examples/list-detail-metadata.vitest.tsx +22 -22
- package/src/examples/list-dropdown-default.vitest.tsx +12 -12
- package/src/examples/list-scrollbox.vitest.tsx +52 -38
- package/src/examples/list-with-detail.vitest.tsx +45 -41
- package/src/examples/list-with-dropdown.vitest.tsx +5 -5
- package/src/examples/list-with-sections.vitest.tsx +65 -12
- package/src/examples/list-with-toast.vitest.tsx +4 -4
- package/src/examples/simple-file-picker.vitest.tsx +12 -12
- package/src/examples/simple-grid.vitest.tsx +53 -53
- package/src/examples/simple-image-mask.tsx +58 -0
- package/src/examples/simple-navigation.vitest.tsx +19 -19
- package/src/examples/store.vitest.tsx +1 -1
- package/src/examples/swift-extension.vitest.tsx +4 -2
- package/src/examples/synonyms.vitest.tsx +31 -9
- package/src/examples/toast-action.vitest.tsx +8 -8
- package/src/examples/toast-variations.tsx +1 -1
- package/src/examples/toast-variations.vitest.tsx +69 -134
- package/src/extensions/dev.tsx +3 -2
- package/src/extensions/dev.vitest.tsx +65 -28
- package/src/extensions/react-refresh-init.tsx +4 -3
- package/src/index.tsx +3 -1
- package/src/internal/date-picker-widget.tsx +2 -1
- package/src/internal/dialog.tsx +100 -28
- package/src/internal/navigation.tsx +8 -1
- package/src/internal/offscreen.tsx +10 -0
- package/src/internal/providers.tsx +34 -8
- package/src/internal/scrollbox.tsx +4 -2
- package/src/logger.tsx +4 -0
- package/src/preload.tsx +5 -17
- package/src/state.tsx +12 -0
- package/src/theme.tsx +6 -9
- package/src/utils/run-command.tsx +32 -8
- package/src/utils.tsx +58 -23
- package/src/watcher.tsx +26 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-renderable-list-v2.js","sourceRoot":"","sources":["../../../src/examples/internal/custom-renderable-list-v2.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Renderable List Example
|
|
3
|
+
*
|
|
4
|
+
* This example uses opentui's extend() to register custom renderables
|
|
5
|
+
* that handle filtering, navigation, and selection imperatively.
|
|
6
|
+
*
|
|
7
|
+
* Uses unified ItemState/SectionState model for simplified state management.
|
|
8
|
+
*
|
|
9
|
+
* ## How React Props Work with opentui Renderables
|
|
10
|
+
*
|
|
11
|
+
* React props are applied via direct property assignment, NOT just constructor:
|
|
12
|
+
*
|
|
13
|
+
* 1. `createInstance()` - constructor called (props passed in options)
|
|
14
|
+
* 2. `setInitialProperties()` - iterates props, does `instance[propKey] = propValue`
|
|
15
|
+
* 3. `commitUpdate()` - on re-render, applies changed props via `instance[propKey] = propValue`
|
|
16
|
+
*
|
|
17
|
+
* This means:
|
|
18
|
+
* - Props don't need to be read from constructor options - React sets them after
|
|
19
|
+
* - Simple props (just stored/read later) can be public fields
|
|
20
|
+
* - Props that need side effects on change require setters
|
|
21
|
+
* - Constructor should just create the renderable structure
|
|
22
|
+
*
|
|
23
|
+
* Example:
|
|
24
|
+
* ```typescript
|
|
25
|
+
* class MyRenderable extends BoxRenderable {
|
|
26
|
+
* // Simple prop - no setter needed, React assigns directly
|
|
27
|
+
* public myLabel = ''
|
|
28
|
+
*
|
|
29
|
+
* // Prop that needs action on change - use setter
|
|
30
|
+
* private _activeIndex = 0
|
|
31
|
+
* get activeIndex() { return this._activeIndex }
|
|
32
|
+
* set activeIndex(value: number) {
|
|
33
|
+
* if (this._activeIndex === value) return
|
|
34
|
+
* this._activeIndex = value
|
|
35
|
+
* this.updateHighlight() // side effect
|
|
36
|
+
* this.requestRender()
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
import React from 'react';
|
|
42
|
+
interface ListProps {
|
|
43
|
+
children?: React.ReactNode;
|
|
44
|
+
placeholder?: string;
|
|
45
|
+
defaultSearchQuery?: string;
|
|
46
|
+
}
|
|
47
|
+
declare function CustomList({ children, placeholder, defaultSearchQuery }: ListProps): React.ReactNode;
|
|
48
|
+
declare namespace CustomList {
|
|
49
|
+
var Item: typeof CustomListItem;
|
|
50
|
+
var Section: typeof CustomListSection;
|
|
51
|
+
var EmptyView: typeof CustomListEmptyView;
|
|
52
|
+
}
|
|
53
|
+
interface ListItemProps {
|
|
54
|
+
title: string;
|
|
55
|
+
subtitle?: string;
|
|
56
|
+
keywords?: string[];
|
|
57
|
+
onAction?: () => void;
|
|
58
|
+
}
|
|
59
|
+
declare function CustomListItem({ title, subtitle, keywords, onAction }: ListItemProps): React.ReactNode;
|
|
60
|
+
interface ListSectionProps {
|
|
61
|
+
title: string;
|
|
62
|
+
children?: React.ReactNode;
|
|
63
|
+
}
|
|
64
|
+
declare function CustomListSection({ title, children }: ListSectionProps): React.ReactNode;
|
|
65
|
+
interface ListEmptyViewProps {
|
|
66
|
+
title?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
}
|
|
69
|
+
declare function CustomListEmptyView({ title, description }: ListEmptyViewProps): React.ReactNode;
|
|
70
|
+
declare function Example(): React.ReactNode;
|
|
71
|
+
export { CustomList, CustomListItem, Example };
|
|
72
|
+
//# sourceMappingURL=custom-renderable-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-renderable-list.d.ts","sourceRoot":"","sources":["../../../src/examples/internal/custom-renderable-list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAeH,OAAO,KAAiB,MAAM,OAAO,CAAA;AAqhBrC,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,iBAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,SAAS,mBA+B3E;kBA/BQ,UAAU;;;;;AAiCnB,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,iBAAS,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,mBAS7E;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,iBAAS,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,mBAM/D;AAED,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,iBAAS,mBAAmB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,kBAAkB,mBAOtE;AA8BD,iBAAS,OAAO,oBAmCf;AAMD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Custom Renderable List Example
|
|
4
|
+
*
|
|
5
|
+
* This example uses opentui's extend() to register custom renderables
|
|
6
|
+
* that handle filtering, navigation, and selection imperatively.
|
|
7
|
+
*
|
|
8
|
+
* Uses unified ItemState/SectionState model for simplified state management.
|
|
9
|
+
*
|
|
10
|
+
* ## How React Props Work with opentui Renderables
|
|
11
|
+
*
|
|
12
|
+
* React props are applied via direct property assignment, NOT just constructor:
|
|
13
|
+
*
|
|
14
|
+
* 1. `createInstance()` - constructor called (props passed in options)
|
|
15
|
+
* 2. `setInitialProperties()` - iterates props, does `instance[propKey] = propValue`
|
|
16
|
+
* 3. `commitUpdate()` - on re-render, applies changed props via `instance[propKey] = propValue`
|
|
17
|
+
*
|
|
18
|
+
* This means:
|
|
19
|
+
* - Props don't need to be read from constructor options - React sets them after
|
|
20
|
+
* - Simple props (just stored/read later) can be public fields
|
|
21
|
+
* - Props that need side effects on change require setters
|
|
22
|
+
* - Constructor should just create the renderable structure
|
|
23
|
+
*
|
|
24
|
+
* Example:
|
|
25
|
+
* ```typescript
|
|
26
|
+
* class MyRenderable extends BoxRenderable {
|
|
27
|
+
* // Simple prop - no setter needed, React assigns directly
|
|
28
|
+
* public myLabel = ''
|
|
29
|
+
*
|
|
30
|
+
* // Prop that needs action on change - use setter
|
|
31
|
+
* private _activeIndex = 0
|
|
32
|
+
* get activeIndex() { return this._activeIndex }
|
|
33
|
+
* set activeIndex(value: number) {
|
|
34
|
+
* if (this._activeIndex === value) return
|
|
35
|
+
* this._activeIndex = value
|
|
36
|
+
* this.updateHighlight() // side effect
|
|
37
|
+
* this.requestRender()
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
import { BoxRenderable, TextRenderable, ScrollBoxRenderable, TextareaRenderable, } from '@opentui/core';
|
|
43
|
+
import { extend, useKeyboard } from '@opentui/react';
|
|
44
|
+
import { useIsInFocus } from 'termcast/src/internal/focus-context';
|
|
45
|
+
import { useStore } from 'termcast/src/state';
|
|
46
|
+
import { useRef } from 'react';
|
|
47
|
+
import { renderWithProviders } from '../../utils';
|
|
48
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
49
|
+
// Renderables
|
|
50
|
+
// - Section/Item: self-rendering (create their own child TextRenderables)
|
|
51
|
+
// - EmptyView: data holder (height:0, parent creates emptyBox from its data)
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Generic helper to find parent of specific type by traversing up
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
function findParent(node, type) {
|
|
56
|
+
let current = node.parent;
|
|
57
|
+
while (current) {
|
|
58
|
+
if (current instanceof type) {
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
current = current.parent;
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
class CustomListSectionRenderable extends BoxRenderable {
|
|
66
|
+
headerText;
|
|
67
|
+
parentList;
|
|
68
|
+
// Prop with setter - updates header text when changed
|
|
69
|
+
_sectionTitle = '';
|
|
70
|
+
get sectionTitle() { return this._sectionTitle; }
|
|
71
|
+
set sectionTitle(value) {
|
|
72
|
+
this._sectionTitle = value;
|
|
73
|
+
this.headerText.content = value ? `── ${value} ──` : '';
|
|
74
|
+
this.headerText.height = value ? 'auto' : 0;
|
|
75
|
+
this.headerText.paddingTop = value ? 1 : 0;
|
|
76
|
+
}
|
|
77
|
+
constructor(ctx, options) {
|
|
78
|
+
super(ctx, { ...options, flexDirection: 'column', width: '100%' });
|
|
79
|
+
// Create header - React will set sectionTitle prop after constructor
|
|
80
|
+
this.headerText = new TextRenderable(ctx, {
|
|
81
|
+
content: '',
|
|
82
|
+
paddingTop: 1,
|
|
83
|
+
paddingLeft: 1,
|
|
84
|
+
});
|
|
85
|
+
super.add(this.headerText);
|
|
86
|
+
// Register with parent list after being added to tree
|
|
87
|
+
this.onLifecyclePass = () => {
|
|
88
|
+
if (!this.parentList) {
|
|
89
|
+
this.parentList = findParent(this, CustomListRenderable);
|
|
90
|
+
this.parentList?.registerSection(this);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
class CustomListEmptyViewRenderable extends BoxRenderable {
|
|
96
|
+
// Simple props - just stored, read by parent list. No setter needed.
|
|
97
|
+
emptyTitle = 'No items';
|
|
98
|
+
emptyDescription;
|
|
99
|
+
parentList;
|
|
100
|
+
constructor(ctx, options) {
|
|
101
|
+
super(ctx, { ...options, visible: false });
|
|
102
|
+
// React will set emptyTitle/emptyDescription props after constructor
|
|
103
|
+
// Self-register with parent list after being added to tree
|
|
104
|
+
this.onLifecyclePass = () => {
|
|
105
|
+
if (!this.parentList) {
|
|
106
|
+
this.parentList = findParent(this, CustomListRenderable);
|
|
107
|
+
this.parentList?.registerEmptyView(this);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
class CustomListItemRenderable extends BoxRenderable {
|
|
113
|
+
// Simple props - just stored/read for filtering. No setter needed.
|
|
114
|
+
keywords;
|
|
115
|
+
onAction;
|
|
116
|
+
section;
|
|
117
|
+
isSelected = false;
|
|
118
|
+
indicatorText;
|
|
119
|
+
titleText;
|
|
120
|
+
subtitleText;
|
|
121
|
+
parentList;
|
|
122
|
+
// Prop with setter - updates title text when changed
|
|
123
|
+
_itemTitle = '';
|
|
124
|
+
get itemTitle() { return this._itemTitle; }
|
|
125
|
+
set itemTitle(value) {
|
|
126
|
+
this._itemTitle = value;
|
|
127
|
+
this.titleText.content = value;
|
|
128
|
+
}
|
|
129
|
+
// Prop with setter - updates subtitle text when changed
|
|
130
|
+
_itemSubtitle;
|
|
131
|
+
get itemSubtitle() { return this._itemSubtitle; }
|
|
132
|
+
set itemSubtitle(value) {
|
|
133
|
+
this._itemSubtitle = value;
|
|
134
|
+
this.subtitleText.content = value ? ` ${value}` : '';
|
|
135
|
+
}
|
|
136
|
+
constructor(ctx, options) {
|
|
137
|
+
super(ctx, { ...options, flexDirection: 'row', width: '100%' });
|
|
138
|
+
// Create text renderables - React will set itemTitle/itemSubtitle props after constructor
|
|
139
|
+
this.indicatorText = new TextRenderable(ctx, { content: ' ' });
|
|
140
|
+
this.titleText = new TextRenderable(ctx, { content: '' });
|
|
141
|
+
this.subtitleText = new TextRenderable(ctx, { content: '' });
|
|
142
|
+
super.add(this.indicatorText);
|
|
143
|
+
super.add(this.titleText);
|
|
144
|
+
super.add(this.subtitleText);
|
|
145
|
+
// Register with parent list after being added to tree
|
|
146
|
+
this.onLifecyclePass = () => {
|
|
147
|
+
if (!this.parentList) {
|
|
148
|
+
this.parentList = findParent(this, CustomListRenderable);
|
|
149
|
+
this.section = findParent(this, CustomListSectionRenderable);
|
|
150
|
+
this.parentList?.registerItem(this);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
// Example: register click handler directly on renderable
|
|
154
|
+
this.onMouseDown = (event) => {
|
|
155
|
+
console.log('CustomListItemRenderable clicked:', this.itemTitle, event);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
get selected() { return this.isSelected; }
|
|
159
|
+
set selected(value) {
|
|
160
|
+
if (this.isSelected !== value) {
|
|
161
|
+
this.isSelected = value;
|
|
162
|
+
this.backgroundColor = value ? '#0066cc' : 'transparent';
|
|
163
|
+
this.indicatorText.content = value ? '› ' : ' ';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
168
|
+
// CustomListRenderable
|
|
169
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
170
|
+
class CustomListRenderable extends BoxRenderable {
|
|
171
|
+
emptyView;
|
|
172
|
+
selectedIndex = 0;
|
|
173
|
+
searchQuery = '';
|
|
174
|
+
// Registered items/sections (they register themselves)
|
|
175
|
+
registeredItems = new Set();
|
|
176
|
+
registeredSections = new Set();
|
|
177
|
+
// Display components
|
|
178
|
+
searchInput;
|
|
179
|
+
scrollBox;
|
|
180
|
+
statusText;
|
|
181
|
+
emptyBox;
|
|
182
|
+
// Prop with setter - updates search input placeholder
|
|
183
|
+
_placeholder = 'Search...';
|
|
184
|
+
get placeholder() { return this._placeholder; }
|
|
185
|
+
set placeholder(value) {
|
|
186
|
+
this._placeholder = value;
|
|
187
|
+
this.searchInput.placeholder = value;
|
|
188
|
+
}
|
|
189
|
+
// Prop with setter - updates search input text and triggers refilter
|
|
190
|
+
get defaultSearchQuery() { return this.searchQuery; }
|
|
191
|
+
set defaultSearchQuery(value) {
|
|
192
|
+
if (this.searchQuery === value)
|
|
193
|
+
return;
|
|
194
|
+
this.searchQuery = value;
|
|
195
|
+
this.searchInput.editBuffer?.setText(value);
|
|
196
|
+
this.dirty = true;
|
|
197
|
+
this.requestRender();
|
|
198
|
+
}
|
|
199
|
+
constructor(ctx, options) {
|
|
200
|
+
super(ctx, { ...options, flexDirection: 'column' });
|
|
201
|
+
// Create search input - React will set placeholder/defaultSearchQuery props after constructor
|
|
202
|
+
this.searchInput = new TextareaRenderable(ctx, {
|
|
203
|
+
placeholder: 'Search...',
|
|
204
|
+
height: 1,
|
|
205
|
+
width: '100%',
|
|
206
|
+
keyBindings: [
|
|
207
|
+
{ name: 'return', action: 'submit' },
|
|
208
|
+
{ name: 'linefeed', action: 'submit' },
|
|
209
|
+
],
|
|
210
|
+
});
|
|
211
|
+
this.searchInput.onContentChange = () => {
|
|
212
|
+
const value = this.searchInput.editBuffer?.getText() || '';
|
|
213
|
+
this.setSearchQuery(value);
|
|
214
|
+
};
|
|
215
|
+
this.searchInput.focus();
|
|
216
|
+
this.scrollBox = new ScrollBoxRenderable(ctx, {
|
|
217
|
+
flexGrow: 1,
|
|
218
|
+
flexDirection: 'column',
|
|
219
|
+
});
|
|
220
|
+
this.statusText = new TextRenderable(ctx, {
|
|
221
|
+
content: '0 items',
|
|
222
|
+
});
|
|
223
|
+
super.add(this.searchInput);
|
|
224
|
+
super.add(this.scrollBox);
|
|
225
|
+
super.add(this.statusText);
|
|
226
|
+
// Example: register key handler directly on renderable (logs all key presses)
|
|
227
|
+
this.onKeyDown = (key) => {
|
|
228
|
+
console.log('CustomListRenderable received key:', key.name, key);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
232
|
+
// Child Management
|
|
233
|
+
//
|
|
234
|
+
// All React children are redirected to scrollBox for proper scrolling.
|
|
235
|
+
// Children self-register with the list via onLifecyclePass callback:
|
|
236
|
+
//
|
|
237
|
+
// 1. React calls list.add(child) for sections/items/emptyView
|
|
238
|
+
// 2. We forward to scrollBox.add(child), which sets child.parent
|
|
239
|
+
// 3. opentui calls child.onLifecyclePass() after parent is set
|
|
240
|
+
// 4. Child traverses up via findParent() to find this list
|
|
241
|
+
// 5. Child calls registerItem/Section/EmptyView to add itself to sets
|
|
242
|
+
// 6. scheduleUpdate() debounces and triggers refilter/selection
|
|
243
|
+
//
|
|
244
|
+
// This avoids the list needing to traverse the tree to find children.
|
|
245
|
+
// Stale refs are cleaned lazily in getAllItems/Sections by checking
|
|
246
|
+
// if items are still connected to the tree via parent chain.
|
|
247
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
248
|
+
add(child, index) {
|
|
249
|
+
return this.scrollBox.add(child, index);
|
|
250
|
+
}
|
|
251
|
+
registerItem(item) {
|
|
252
|
+
this.registeredItems.add(item);
|
|
253
|
+
this.dirty = true;
|
|
254
|
+
this.requestRender();
|
|
255
|
+
}
|
|
256
|
+
registerSection(section) {
|
|
257
|
+
this.registeredSections.add(section);
|
|
258
|
+
this.dirty = true;
|
|
259
|
+
this.requestRender();
|
|
260
|
+
}
|
|
261
|
+
registerEmptyView(emptyView) {
|
|
262
|
+
this.emptyView = emptyView;
|
|
263
|
+
}
|
|
264
|
+
// Single dirty flag - checked in render() to run all updates
|
|
265
|
+
dirty = false;
|
|
266
|
+
render(buffer, deltaTime) {
|
|
267
|
+
if (this.dirty) {
|
|
268
|
+
this.dirty = false;
|
|
269
|
+
this.refilter();
|
|
270
|
+
this.updateEmptyState();
|
|
271
|
+
this.updateStatus();
|
|
272
|
+
// Select first visible item if none selected
|
|
273
|
+
const visibleItems = this.getVisibleItems();
|
|
274
|
+
if (visibleItems.length > 0 && !visibleItems.some(i => i.selected)) {
|
|
275
|
+
this.selectedIndex = 0;
|
|
276
|
+
visibleItems[0].selected = true;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
super.render(buffer, deltaTime);
|
|
280
|
+
}
|
|
281
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
282
|
+
// Helpers - use registered sets, clean stale refs
|
|
283
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
284
|
+
// Check if a renderable is still connected to this list
|
|
285
|
+
isConnected(node) {
|
|
286
|
+
let current = node.parent;
|
|
287
|
+
while (current) {
|
|
288
|
+
if (current === this.scrollBox || current === this) {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
current = current.parent;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
getAllItems() {
|
|
296
|
+
// Clean stale refs (items no longer in tree)
|
|
297
|
+
for (const item of this.registeredItems) {
|
|
298
|
+
if (!this.isConnected(item)) {
|
|
299
|
+
this.registeredItems.delete(item);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return Array.from(this.registeredItems);
|
|
303
|
+
}
|
|
304
|
+
getVisibleItems() {
|
|
305
|
+
return this.getAllItems().filter(item => item.visible);
|
|
306
|
+
}
|
|
307
|
+
getAllSections() {
|
|
308
|
+
// Clean stale refs
|
|
309
|
+
for (const section of this.registeredSections) {
|
|
310
|
+
if (!this.isConnected(section)) {
|
|
311
|
+
this.registeredSections.delete(section);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return Array.from(this.registeredSections);
|
|
315
|
+
}
|
|
316
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
317
|
+
// Filtering
|
|
318
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
319
|
+
setSearchQuery(query) {
|
|
320
|
+
if (this.searchQuery === query)
|
|
321
|
+
return;
|
|
322
|
+
// Deselect current before query change
|
|
323
|
+
const oldVisible = this.getVisibleItems();
|
|
324
|
+
if (oldVisible[this.selectedIndex]) {
|
|
325
|
+
oldVisible[this.selectedIndex].selected = false;
|
|
326
|
+
}
|
|
327
|
+
this.searchQuery = query;
|
|
328
|
+
this.selectedIndex = 0; // Reset to first item on query change
|
|
329
|
+
this.dirty = true;
|
|
330
|
+
this.requestRender();
|
|
331
|
+
}
|
|
332
|
+
refilter() {
|
|
333
|
+
const query = this.searchQuery.toLowerCase();
|
|
334
|
+
const allItems = this.getAllItems();
|
|
335
|
+
const allSections = this.getAllSections();
|
|
336
|
+
// Fast path: no query means all visible
|
|
337
|
+
// We use the `visible` prop instead of conditional rendering to keep elements
|
|
338
|
+
// in the tree - this preserves registration order and indexes for navigation
|
|
339
|
+
if (!query) {
|
|
340
|
+
for (const item of allItems) {
|
|
341
|
+
item.visible = true;
|
|
342
|
+
}
|
|
343
|
+
for (const section of allSections) {
|
|
344
|
+
section.visible = true;
|
|
345
|
+
}
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
// Update item visibility
|
|
349
|
+
for (const item of allItems) {
|
|
350
|
+
item.visible = this.scoreItem(item, query) > 0;
|
|
351
|
+
}
|
|
352
|
+
// Update section visibility
|
|
353
|
+
for (const section of allSections) {
|
|
354
|
+
const sectionItems = allItems.filter(item => item.section === section);
|
|
355
|
+
const hasVisibleItems = sectionItems.some(item => item.visible);
|
|
356
|
+
section.visible = hasVisibleItems;
|
|
357
|
+
}
|
|
358
|
+
// Clamp selection
|
|
359
|
+
const visibleCount = this.getVisibleItems().length;
|
|
360
|
+
this.selectedIndex = Math.min(Math.max(0, this.selectedIndex), Math.max(0, visibleCount - 1));
|
|
361
|
+
}
|
|
362
|
+
scoreItem(item, query) {
|
|
363
|
+
let score = 0;
|
|
364
|
+
const title = item.itemTitle.toLowerCase();
|
|
365
|
+
if (title.includes(query)) {
|
|
366
|
+
score += title.startsWith(query) ? 2 : 1;
|
|
367
|
+
}
|
|
368
|
+
if (item.itemSubtitle?.toLowerCase().includes(query)) {
|
|
369
|
+
score += 0.6;
|
|
370
|
+
}
|
|
371
|
+
for (const kw of item.keywords || []) {
|
|
372
|
+
if (kw.toLowerCase().includes(query)) {
|
|
373
|
+
score += 0.3;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return score;
|
|
377
|
+
}
|
|
378
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
379
|
+
// Display
|
|
380
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
381
|
+
updateStatus() {
|
|
382
|
+
const visibleCount = this.getVisibleItems().length;
|
|
383
|
+
const totalCount = this.getAllItems().length;
|
|
384
|
+
this.statusText.content = this.searchQuery
|
|
385
|
+
? `${visibleCount} of ${totalCount} items • Searching: "${this.searchQuery}"`
|
|
386
|
+
: `${visibleCount} of ${totalCount} items`;
|
|
387
|
+
}
|
|
388
|
+
updateEmptyState() {
|
|
389
|
+
const showEmpty = this.getVisibleItems().length === 0;
|
|
390
|
+
if (showEmpty && !this.emptyBox) {
|
|
391
|
+
this.emptyBox = new BoxRenderable(this.ctx, { padding: 1, flexDirection: 'column' });
|
|
392
|
+
if (this.emptyView) {
|
|
393
|
+
this.emptyBox.add(new TextRenderable(this.ctx, { content: this.emptyView.emptyTitle }));
|
|
394
|
+
if (this.emptyView.emptyDescription) {
|
|
395
|
+
this.emptyBox.add(new TextRenderable(this.ctx, { content: this.emptyView.emptyDescription }));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
this.emptyBox.add(new TextRenderable(this.ctx, {
|
|
400
|
+
content: this.searchQuery ? `No results for "${this.searchQuery}"` : 'No items',
|
|
401
|
+
}));
|
|
402
|
+
}
|
|
403
|
+
this.scrollBox.add(this.emptyBox);
|
|
404
|
+
}
|
|
405
|
+
else if (!showEmpty && this.emptyBox) {
|
|
406
|
+
this.scrollBox.remove(this.emptyBox.id);
|
|
407
|
+
this.emptyBox = undefined;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
411
|
+
// Navigation
|
|
412
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
413
|
+
moveSelection(delta) {
|
|
414
|
+
const visibleItems = this.getVisibleItems();
|
|
415
|
+
if (visibleItems.length === 0)
|
|
416
|
+
return;
|
|
417
|
+
let newIndex = this.selectedIndex + delta;
|
|
418
|
+
if (newIndex < 0)
|
|
419
|
+
newIndex = visibleItems.length - 1;
|
|
420
|
+
if (newIndex >= visibleItems.length)
|
|
421
|
+
newIndex = 0;
|
|
422
|
+
if (newIndex === this.selectedIndex)
|
|
423
|
+
return;
|
|
424
|
+
// O(1) update: just change 2 items' selected state
|
|
425
|
+
visibleItems[this.selectedIndex].selected = false;
|
|
426
|
+
visibleItems[newIndex].selected = true;
|
|
427
|
+
this.selectedIndex = newIndex;
|
|
428
|
+
this.scrollToSelected();
|
|
429
|
+
}
|
|
430
|
+
scrollToSelected() {
|
|
431
|
+
const visibleItems = this.getVisibleItems();
|
|
432
|
+
const item = visibleItems[this.selectedIndex];
|
|
433
|
+
if (!item)
|
|
434
|
+
return;
|
|
435
|
+
// Use item's position for scrolling
|
|
436
|
+
const itemY = item.y;
|
|
437
|
+
const scrollBoxY = this.scrollBox.content.y;
|
|
438
|
+
const viewportHeight = this.scrollBox.viewport?.height || 10;
|
|
439
|
+
const relativeY = itemY - scrollBoxY;
|
|
440
|
+
const targetScrollTop = relativeY - Math.floor(viewportHeight / 2);
|
|
441
|
+
this.scrollBox.scrollTop = Math.max(0, targetScrollTop);
|
|
442
|
+
}
|
|
443
|
+
activateSelected() {
|
|
444
|
+
const visibleItems = this.getVisibleItems();
|
|
445
|
+
visibleItems[this.selectedIndex]?.onAction?.();
|
|
446
|
+
}
|
|
447
|
+
getSelectedItem() {
|
|
448
|
+
return this.getVisibleItems()[this.selectedIndex];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
452
|
+
// Register with opentui
|
|
453
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
454
|
+
extend({
|
|
455
|
+
'custom-list': CustomListRenderable,
|
|
456
|
+
'custom-list-item': CustomListItemRenderable,
|
|
457
|
+
'custom-list-section': CustomListSectionRenderable,
|
|
458
|
+
'custom-list-empty-view': CustomListEmptyViewRenderable,
|
|
459
|
+
});
|
|
460
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
461
|
+
// React Components
|
|
462
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
463
|
+
function ActionDialog({ itemTitle }) {
|
|
464
|
+
const inFocus = useIsInFocus();
|
|
465
|
+
useKeyboard((evt) => {
|
|
466
|
+
if (!inFocus)
|
|
467
|
+
return;
|
|
468
|
+
if (evt.name === 'escape') {
|
|
469
|
+
const state = useStore.getState();
|
|
470
|
+
useStore.setState({
|
|
471
|
+
dialogStack: state.dialogStack.slice(0, -1),
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
return (_jsxs("box", { flexDirection: "column", padding: 1, children: [_jsxs("text", { children: ["Actions for: ", itemTitle || 'No item selected'] }), _jsx("text", { marginTop: 1, children: "Press ESC to close" })] }));
|
|
476
|
+
}
|
|
477
|
+
function CustomList({ children, placeholder, defaultSearchQuery }) {
|
|
478
|
+
const listRef = useRef(null);
|
|
479
|
+
const inFocus = useIsInFocus();
|
|
480
|
+
useKeyboard((evt) => {
|
|
481
|
+
if (!inFocus || !listRef.current)
|
|
482
|
+
return;
|
|
483
|
+
if (evt.name === 'up')
|
|
484
|
+
listRef.current.moveSelection(-1);
|
|
485
|
+
if (evt.name === 'down')
|
|
486
|
+
listRef.current.moveSelection(1);
|
|
487
|
+
if (evt.name === 'return')
|
|
488
|
+
listRef.current.activateSelected();
|
|
489
|
+
if (evt.name === 'k' && evt.ctrl) {
|
|
490
|
+
const selectedItem = listRef.current.getSelectedItem();
|
|
491
|
+
const state = useStore.getState();
|
|
492
|
+
useStore.setState({
|
|
493
|
+
dialogStack: [
|
|
494
|
+
...state.dialogStack,
|
|
495
|
+
{
|
|
496
|
+
element: _jsx(ActionDialog, { itemTitle: selectedItem?.itemTitle }),
|
|
497
|
+
position: 'center',
|
|
498
|
+
},
|
|
499
|
+
],
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
return (_jsx("custom-list", { ref: listRef, flexGrow: 1, placeholder: placeholder, defaultSearchQuery: defaultSearchQuery, children: children }));
|
|
504
|
+
}
|
|
505
|
+
function CustomListItem({ title, subtitle, keywords, onAction }) {
|
|
506
|
+
return (_jsx("custom-list-item", { itemTitle: title, itemSubtitle: subtitle, keywords: keywords, onAction: onAction }));
|
|
507
|
+
}
|
|
508
|
+
function CustomListSection({ title, children }) {
|
|
509
|
+
return (_jsx("custom-list-section", { sectionTitle: title, children: children }));
|
|
510
|
+
}
|
|
511
|
+
function CustomListEmptyView({ title, description }) {
|
|
512
|
+
return (_jsx("custom-list-empty-view", { emptyTitle: title, emptyDescription: description }));
|
|
513
|
+
}
|
|
514
|
+
CustomList.Item = CustomListItem;
|
|
515
|
+
CustomList.Section = CustomListSection;
|
|
516
|
+
CustomList.EmptyView = CustomListEmptyView;
|
|
517
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
518
|
+
// Example
|
|
519
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
520
|
+
const FRUITS = [
|
|
521
|
+
{ title: 'Apple', subtitle: 'A red fruit', keywords: ['red'] },
|
|
522
|
+
{ title: 'Banana', subtitle: 'A yellow fruit', keywords: ['yellow'] },
|
|
523
|
+
{ title: 'Date', subtitle: 'A sweet fruit', keywords: ['sweet'] },
|
|
524
|
+
{ title: 'Fig', subtitle: 'A small fruit', keywords: ['small'] },
|
|
525
|
+
{ title: 'Grape', subtitle: 'A vine fruit', keywords: ['vine'] },
|
|
526
|
+
{ title: 'Lemon', subtitle: 'A citrus fruit', keywords: ['citrus'] },
|
|
527
|
+
];
|
|
528
|
+
const VEGETABLES = [
|
|
529
|
+
{ title: 'Carrot', subtitle: 'An orange vegetable', keywords: ['orange'] },
|
|
530
|
+
{ title: 'Eggplant', subtitle: 'A purple vegetable', keywords: ['purple'] },
|
|
531
|
+
{ title: 'Jalapeno', subtitle: 'A spicy pepper', keywords: ['spicy'] },
|
|
532
|
+
{ title: 'Kale', subtitle: 'A superfood', keywords: ['healthy'] },
|
|
533
|
+
];
|
|
534
|
+
function ItemWrapper({ children }) {
|
|
535
|
+
return _jsx("box", { children: children });
|
|
536
|
+
}
|
|
537
|
+
function Example() {
|
|
538
|
+
return (_jsxs("box", { flexDirection: "column", padding: 1, flexGrow: 1, children: [_jsx("text", { marginBottom: 1, children: "Custom Renderable List (using extend)" }), _jsxs(CustomList, { placeholder: "Search items...", children: [_jsx(CustomList.EmptyView, { title: "Nothing found", description: "Try a different search term" }), _jsx(CustomList.Section, { title: "Fruits", children: FRUITS.map((item) => (_jsx(ItemWrapper, { children: _jsx(CustomList.Item, { title: item.title, subtitle: item.subtitle, keywords: item.keywords, onAction: () => console.log(`Selected: ${item.title}`) }) }, item.title))) }), _jsx(CustomList.Section, { title: "Vegetables", children: VEGETABLES.map((item) => (_jsx(CustomList.Item, { title: item.title, subtitle: item.subtitle, keywords: item.keywords, onAction: () => console.log(`Selected: ${item.title}`) }, item.title))) })] })] }));
|
|
539
|
+
}
|
|
540
|
+
if (import.meta.main) {
|
|
541
|
+
renderWithProviders(_jsx(Example, {}));
|
|
542
|
+
}
|
|
543
|
+
export { CustomList, CustomListItem, Example };
|
|
544
|
+
//# sourceMappingURL=custom-renderable-list.js.map
|