From e1f27690a9cfbcb3ff946b3484ed4dc718a8ea83 Mon Sep 17 00:00:00 2001 From: Viktor Podzigun Date: Mon, 29 Apr 2024 20:07:16 +0200 Subject: [PATCH] Fixed ts typings (#14) --- .github/workflows/ci.yml | 8 ++- index.d.ts => index.d.mts | 2 +- package.json | 18 ++++--- src/Button.d.ts | 11 ---- src/Button.mjs | 13 +++-- src/ButtonsPanel.d.ts | 14 ----- src/ButtonsPanel.mjs | 20 +++++-- src/CheckBox.d.ts | 10 ---- src/CheckBox.mjs | 14 +++-- src/ComboBox.d.ts | 9 ---- src/ComboBox.mjs | 17 ++++-- src/ComboBoxPopup.d.ts | 13 ----- src/ComboBoxPopup.mjs | 15 +++++- src/ListBox.d.ts | 13 ----- src/ListBox.mjs | 15 +++++- src/ListView.d.ts | 16 ------ src/ListView.mjs | 16 +++++- src/ListViewport.d.ts | 15 ------ src/ListViewport.mjs | 16 +++++- src/ProgressBar.d.ts | 9 ---- src/ProgressBar.mjs | 13 +++-- src/ScrollBar.d.ts | 15 ------ src/ScrollBar.mjs | 17 ++++-- src/TextBox.d.ts | 8 --- src/TextBox.mjs | 14 ++++- src/TextInput.d.ts | 74 -------------------------- src/TextInput.mjs | 63 +++++++++++++++++++--- src/TextLine.d.ts | 15 ------ src/TextLine.mjs | 16 ++++-- src/UI.mjs | 5 +- src/UiString.d.ts | 13 ----- src/UiString.mjs | 23 ++++++-- src/WithSize.d.ts | 3 -- src/WithSize.mjs | 7 ++- src/app/AppRoot.d.ts | 16 ------ src/app/AppRoot.mjs | 25 +++++++-- src/border/DoubleBorder.d.ts | 13 ----- src/border/DoubleBorder.mjs | 15 ++++-- src/border/HorizontalLine.d.ts | 13 ----- src/border/HorizontalLine.mjs | 15 ++++-- src/border/SingleBorder.d.ts | 9 ---- src/border/SingleBorder.mjs | 11 ++-- src/border/VerticalLine.d.ts | 13 ----- src/border/VerticalLine.mjs | 15 ++++-- src/menu/BottomMenu.d.ts | 3 -- src/menu/BottomMenu.mjs | 9 ++-- src/menu/BottomMenuView.d.ts | 4 -- src/menu/BottomMenuView.mjs | 17 ++++-- src/menu/MenuBar.d.ts | 10 ---- src/menu/MenuBar.mjs | 24 +++++++-- src/menu/MenuBarTrigger.mjs | 3 ++ src/menu/MenuPopup.d.ts | 7 --- src/menu/MenuPopup.mjs | 13 +++-- src/menu/SubMenu.d.ts | 7 --- src/menu/SubMenu.mjs | 13 +++-- src/popup/ListPopup.d.ts | 13 ----- src/popup/ListPopup.mjs | 19 ++++++- src/popup/MessageBox.d.ts | 11 ---- src/popup/MessageBox.mjs | 13 ++++- src/popup/MessageBoxAction.d.ts | 5 -- src/popup/MessageBoxAction.mjs | 8 ++- src/popup/Modal.d.ts | 11 ---- src/popup/Modal.mjs | 13 +++-- src/popup/ModalContent.d.ts | 20 ------- src/popup/ModalContent.mjs | 25 +++++++-- src/popup/Popup.d.ts | 6 --- src/popup/Popup.mjs | 12 +++-- src/popup/PopupOverlay.mjs | 5 +- src/popup/StatusPopup.d.ts | 5 -- src/popup/StatusPopup.mjs | 11 ++-- src/portal/WithPortals.d.ts | 6 --- src/portal/WithPortals.mjs | 16 ++++-- src/task/Task.d.ts | 5 -- src/task/Task.mjs | 11 +++- src/task/TaskAction.d.ts | 5 -- src/task/TaskAction.mjs | 24 +++++++++ src/task/TaskError.d.ts | 4 -- src/task/TaskManager.d.ts | 5 -- src/task/TaskManager.mjs | 33 +++++++++--- src/task/TaskManagerUi.d.ts | 8 --- src/task/TaskManagerUi.mjs | 14 +++-- src/task/TaskReducer.mjs | 8 ++- src/theme/DefaultTheme.mjs | 2 +- src/theme/Theme.d.ts | 31 ----------- src/theme/Theme.mjs | 51 ++++++++++++++++-- src/theme/XTerm256Theme.mjs | 2 +- src/tool/DevTool.mjs | 18 +++---- src/tool/DevToolPanel.d.ts | 7 --- src/tool/DevToolPanel.mjs | 14 +++-- src/tool/InputController.d.ts | 5 -- src/tool/InputController.mjs | 4 +- src/tool/LogController.d.ts | 6 --- src/tool/LogController.mjs | 8 ++- src/tool/LogPanel.d.ts | 3 -- src/tool/LogPanel.mjs | 9 ++-- test/Button.test.mjs | 2 +- test/ButtonsPanel.test.mjs | 4 +- test/CheckBox.test.mjs | 2 +- test/ComboBox.test.mjs | 6 +-- test/ComboBoxPopup.test.mjs | 4 +- test/ListBox.test.mjs | 2 +- test/ListView.test.mjs | 4 +- test/ListViewport.test.mjs | 2 +- test/ProgressBar.test.mjs | 2 +- test/ScrollBar.test.mjs | 2 +- test/TextBox.test.mjs | 4 +- test/TextInput.test.mjs | 4 +- test/TextLine.test.mjs | 2 +- test/UiString.test.mjs | 2 +- test/WithSize.test.mjs | 2 +- test/app/AppRoot.test.mjs | 16 +++--- test/border/DoubleBorder.test.mjs | 2 +- test/border/HorizontalLine.test.mjs | 2 +- test/border/SingleBorder.test.mjs | 2 +- test/border/VerticalLine.test.mjs | 2 +- test/menu/BottomMenu.test.mjs | 2 +- test/menu/BottomMenuView.test.mjs | 2 +- test/menu/MenuBar.test.mjs | 6 +-- test/menu/MenuPopup.test.mjs | 2 +- test/menu/SubMenu.test.mjs | 2 +- test/popup/ListPopup.test.mjs | 2 +- test/popup/MessageBox.test.mjs | 6 +-- test/popup/Modal.test.mjs | 2 +- test/popup/ModalContent.test.mjs | 2 +- test/popup/Popup.test.mjs | 2 +- test/popup/PopupOverlay.test.mjs | 2 +- test/popup/StatusPopup.test.mjs | 2 +- test/portal/WithPortals.test.mjs | 2 +- test/task/TaskManager.test.mjs | 6 +-- test/task/TaskManagerUi.test.mjs | 2 +- test/task/TaskReducer.test.mjs | 8 ++- test/theme/withThemeContext.mjs | 4 +- test/tool/DevToolPanel.test.mjs | 12 ++--- test/tool/InputController.test.mjs | 4 +- test/tool/LogController.test.mjs | 2 +- test/tool/LogPanel.test.mjs | 2 +- test/tsconfig.json | 9 ++++ tsconfig.json | 11 ++-- types/Button.d.mts | 37 +++++++++++++ types/ButtonsPanel.d.mts | 43 +++++++++++++++ types/CheckBox.d.mts | 29 +++++++++++ types/ComboBox.d.mts | 38 ++++++++++++++ types/ComboBoxPopup.d.mts | 49 +++++++++++++++++ types/ListBox.d.mts | 44 ++++++++++++++++ types/ListView.d.mts | 40 ++++++++++++++ types/ListViewport.d.mts | 22 ++++++++ types/ProgressBar.d.mts | 34 ++++++++++++ types/ScrollBar.d.mts | 37 +++++++++++++ types/TextAlign.d.mts | 7 +++ types/TextBox.d.mts | 31 +++++++++++ types/TextInput.d.mts | 81 +++++++++++++++++++++++++++++ types/TextLine.d.mts | 45 ++++++++++++++++ types/UI.d.mts | 20 +++++++ types/UiString.d.mts | 34 ++++++++++++ types/WithSize.d.mts | 22 ++++++++ types/app/AppRoot.d.mts | 49 +++++++++++++++++ types/border/DoubleBorder.d.mts | 35 +++++++++++++ types/border/DoubleChars.d.mts | 20 +++++++ types/border/HorizontalLine.d.mts | 36 +++++++++++++ types/border/SingleBorder.d.mts | 25 +++++++++ types/border/SingleChars.d.mts | 20 +++++++ types/border/VerticalLine.d.mts | 36 +++++++++++++ types/menu/BottomMenu.d.mts | 21 ++++++++ types/menu/BottomMenuView.d.mts | 33 ++++++++++++ types/menu/MenuBar.d.mts | 48 +++++++++++++++++ types/menu/MenuBarTrigger.d.mts | 9 ++++ types/menu/MenuPopup.d.mts | 46 ++++++++++++++++ types/menu/SubMenu.d.mts | 39 ++++++++++++++ types/popup/ListPopup.d.mts | 49 +++++++++++++++++ types/popup/MessageBox.d.mts | 33 ++++++++++++ types/popup/MessageBoxAction.d.mts | 11 ++++ types/popup/Modal.d.mts | 29 +++++++++++ types/popup/ModalContent.d.mts | 58 +++++++++++++++++++++ types/popup/Popup.d.mts | 27 ++++++++++ types/popup/PopupOverlay.d.mts | 20 +++++++ types/popup/StatusPopup.d.mts | 27 ++++++++++ types/portal/Portal.d.mts | 17 ++++++ types/portal/WithPortals.d.mts | 23 ++++++++ types/task/Task.d.mts | 24 +++++++++ types/task/TaskAction.d.mts | 27 ++++++++++ types/task/TaskManager.d.mts | 43 +++++++++++++++ types/task/TaskManagerUi.d.mts | 21 ++++++++ types/task/TaskReducer.d.mts | 15 ++++++ types/theme/Color.d.mts | 21 ++++++++ types/theme/DefaultTheme.d.mts | 5 ++ types/theme/Theme.d.mts | 32 ++++++++++++ types/theme/XTerm256Theme.d.mts | 5 ++ types/tool/ColorPanel.d.mts | 14 +++++ types/tool/DevTool.d.mts | 19 +++++++ types/tool/DevToolPanel.d.mts | 20 +++++++ types/tool/InputController.d.mts | 11 ++++ types/tool/LogController.d.mts | 19 +++++++ types/tool/LogPanel.d.mts | 20 +++++++ 193 files changed, 2346 insertions(+), 717 deletions(-) rename index.d.ts => index.d.mts (89%) delete mode 100644 src/Button.d.ts delete mode 100644 src/ButtonsPanel.d.ts delete mode 100644 src/CheckBox.d.ts delete mode 100644 src/ComboBox.d.ts delete mode 100644 src/ComboBoxPopup.d.ts delete mode 100644 src/ListBox.d.ts delete mode 100644 src/ListView.d.ts delete mode 100644 src/ListViewport.d.ts delete mode 100644 src/ProgressBar.d.ts delete mode 100644 src/ScrollBar.d.ts delete mode 100644 src/TextBox.d.ts delete mode 100644 src/TextInput.d.ts delete mode 100644 src/TextLine.d.ts delete mode 100644 src/UiString.d.ts delete mode 100644 src/WithSize.d.ts delete mode 100644 src/app/AppRoot.d.ts delete mode 100644 src/border/DoubleBorder.d.ts delete mode 100644 src/border/HorizontalLine.d.ts delete mode 100644 src/border/SingleBorder.d.ts delete mode 100644 src/border/VerticalLine.d.ts delete mode 100644 src/menu/BottomMenu.d.ts delete mode 100644 src/menu/BottomMenuView.d.ts delete mode 100644 src/menu/MenuBar.d.ts delete mode 100644 src/menu/MenuPopup.d.ts delete mode 100644 src/menu/SubMenu.d.ts delete mode 100644 src/popup/ListPopup.d.ts delete mode 100644 src/popup/MessageBox.d.ts delete mode 100644 src/popup/MessageBoxAction.d.ts delete mode 100644 src/popup/Modal.d.ts delete mode 100644 src/popup/ModalContent.d.ts delete mode 100644 src/popup/Popup.d.ts delete mode 100644 src/popup/StatusPopup.d.ts delete mode 100644 src/portal/WithPortals.d.ts delete mode 100644 src/task/Task.d.ts delete mode 100644 src/task/TaskAction.d.ts create mode 100644 src/task/TaskAction.mjs delete mode 100644 src/task/TaskError.d.ts delete mode 100644 src/task/TaskManager.d.ts delete mode 100644 src/task/TaskManagerUi.d.ts delete mode 100644 src/theme/Theme.d.ts delete mode 100644 src/tool/DevToolPanel.d.ts delete mode 100644 src/tool/InputController.d.ts delete mode 100644 src/tool/LogController.d.ts delete mode 100644 src/tool/LogPanel.d.ts create mode 100644 test/tsconfig.json create mode 100644 types/Button.d.mts create mode 100644 types/ButtonsPanel.d.mts create mode 100644 types/CheckBox.d.mts create mode 100644 types/ComboBox.d.mts create mode 100644 types/ComboBoxPopup.d.mts create mode 100644 types/ListBox.d.mts create mode 100644 types/ListView.d.mts create mode 100644 types/ListViewport.d.mts create mode 100644 types/ProgressBar.d.mts create mode 100644 types/ScrollBar.d.mts create mode 100644 types/TextAlign.d.mts create mode 100644 types/TextBox.d.mts create mode 100644 types/TextInput.d.mts create mode 100644 types/TextLine.d.mts create mode 100644 types/UI.d.mts create mode 100644 types/UiString.d.mts create mode 100644 types/WithSize.d.mts create mode 100644 types/app/AppRoot.d.mts create mode 100644 types/border/DoubleBorder.d.mts create mode 100644 types/border/DoubleChars.d.mts create mode 100644 types/border/HorizontalLine.d.mts create mode 100644 types/border/SingleBorder.d.mts create mode 100644 types/border/SingleChars.d.mts create mode 100644 types/border/VerticalLine.d.mts create mode 100644 types/menu/BottomMenu.d.mts create mode 100644 types/menu/BottomMenuView.d.mts create mode 100644 types/menu/MenuBar.d.mts create mode 100644 types/menu/MenuBarTrigger.d.mts create mode 100644 types/menu/MenuPopup.d.mts create mode 100644 types/menu/SubMenu.d.mts create mode 100644 types/popup/ListPopup.d.mts create mode 100644 types/popup/MessageBox.d.mts create mode 100644 types/popup/MessageBoxAction.d.mts create mode 100644 types/popup/Modal.d.mts create mode 100644 types/popup/ModalContent.d.mts create mode 100644 types/popup/Popup.d.mts create mode 100644 types/popup/PopupOverlay.d.mts create mode 100644 types/popup/StatusPopup.d.mts create mode 100644 types/portal/Portal.d.mts create mode 100644 types/portal/WithPortals.d.mts create mode 100644 types/task/Task.d.mts create mode 100644 types/task/TaskAction.d.mts create mode 100644 types/task/TaskManager.d.mts create mode 100644 types/task/TaskManagerUi.d.mts create mode 100644 types/task/TaskReducer.d.mts create mode 100644 types/theme/Color.d.mts create mode 100644 types/theme/DefaultTheme.d.mts create mode 100644 types/theme/Theme.d.mts create mode 100644 types/theme/XTerm256Theme.d.mts create mode 100644 types/tool/ColorPanel.d.mts create mode 100644 types/tool/DevTool.d.mts create mode 100644 types/tool/DevToolPanel.d.mts create mode 100644 types/tool/InputController.d.mts create mode 100644 types/tool/LogController.d.mts create mode 100644 types/tool/LogPanel.d.mts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec774e2..95a86a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,9 +43,13 @@ jobs: - name: Run tests run: | npm i - npm run formatCheck + rm -r ./types npx tsc - npx quick-lint-js ./**/*.mjs ./**/*.ts + npx tsc -p ./test + # ensure that committed and generated types are the same + git diff --exit-code + npx quick-lint-js ./**/*.mjs + npm run formatCheck NODE_V8_COVERAGE=coverage0 npx c8 -r lcovonly --all --src ./src node --experimental-test-coverage ./test/all.mjs if: ${{ env.TAG_NAME == '' }} diff --git a/index.d.ts b/index.d.mts similarity index 89% rename from index.d.ts rename to index.d.mts index 6252ffa..6bed425 100644 --- a/index.d.ts +++ b/index.d.mts @@ -3,7 +3,7 @@ import { DetailedBlessedProps } from "react-blessed"; import Blessed from "@farjs/blessed"; type ButtonElement = Blessed.Widgets.ButtonElement; -type FormElement = Blessed.Widgets.FormElement; +type FormElement = Blessed.Widgets.FormElement; type TextElement = Blessed.Widgets.TextElement; declare module "react" { diff --git a/package.json b/package.json index 7f34a1c..22370ce 100644 --- a/package.json +++ b/package.json @@ -5,15 +5,19 @@ "license": "MIT", "description": "Terminal UI React.js components library", "scripts": { - "lint": "quick-lint-js ./**/*.mjs ./**/*.ts", - "test": "tsc && bun test && node ./test/all.mjs", - "format": "prettier **/*.mjs **/*.ts --write", - "formatCheck": "prettier **/*.mjs **/*.ts --check" + "lint": "quick-lint-js ./**/*.mjs", + "test": "tsc && tsc -p ./test && bun test && node ./test/all.mjs", + "format": "prettier **/*.mjs --write", + "formatCheck": "prettier **/*.mjs --check" }, "type": "module", "exports": { - "./*": "./src/*" + "./*": { + "types": "./types/*", + "default": "./src/*" + } }, + "types": "./types/*", "private": false, "publishConfig": { "access": "public" @@ -47,10 +51,10 @@ "@types/react-blessed": "^0.7.3", "@types/react-test-renderer": "^17.0.1", "c8": "^7.13.0", - "mock-fn": "^1.0.0", + "mock-fn": "^1.1.0", "prettier": "^2.8.8", "quick-lint-js": "^3.0.0", - "react-assert": "^1.0.3", + "react-assert": "^1.1.0", "react-test-renderer": "^17.0.1", "typescript": "^4.9.5" } diff --git a/src/Button.d.ts b/src/Button.d.ts deleted file mode 100644 index c1b06e3..0000000 --- a/src/Button.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/// - -import { Widgets } from "@farjs/blessed"; - -export interface ButtonProps { - readonly left: number; - readonly top: number; - readonly label: string; - readonly style: Widgets.Types.TStyle; - onPress(): void; -} diff --git a/src/Button.mjs b/src/Button.mjs index 235d28c..1385fed 100644 --- a/src/Button.mjs +++ b/src/Button.mjs @@ -1,11 +1,18 @@ -/** - * @typedef {import("./Button").ButtonProps} ButtonProps - */ import React, { useState } from "react"; import * as UI from "./UI.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly label: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onPress(): void; + * }} ButtonProps + */ + /** * @param {ButtonProps} props */ diff --git a/src/ButtonsPanel.d.ts b/src/ButtonsPanel.d.ts deleted file mode 100644 index fd84bdc..0000000 --- a/src/ButtonsPanel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -export interface ButtonsPanelAction { - readonly label: string; - onAction(): void; -} - -export interface ButtonsPanelProps { - readonly top: number; - readonly actions: ButtonsPanelAction[]; - readonly style: Widgets.Types.TStyle; - readonly padding?: number; - readonly margin?: number; -} diff --git a/src/ButtonsPanel.mjs b/src/ButtonsPanel.mjs index 862dbd5..a349f38 100644 --- a/src/ButtonsPanel.mjs +++ b/src/ButtonsPanel.mjs @@ -1,11 +1,25 @@ -/** - * @typedef {import("./ButtonsPanel").ButtonsPanelProps} ButtonsPanelProps - */ import React from "react"; import Button from "./Button.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly label: string; + * onAction(): void; + * }} ButtonsPanelAction + */ + +/** + * @typedef {{ + * readonly top: number; + * readonly actions: ButtonsPanelAction[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly padding?: number; + * readonly margin?: number; + * }} ButtonsPanelProps + */ + /** * @param {ButtonsPanelProps} props */ diff --git a/src/CheckBox.d.ts b/src/CheckBox.d.ts deleted file mode 100644 index 46e90b3..0000000 --- a/src/CheckBox.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -export interface CheckBoxProps { - readonly left: number; - readonly top: number; - readonly value: boolean; - readonly label: string; - readonly style: Widgets.Types.TStyle; - onChange(): void; -} diff --git a/src/CheckBox.mjs b/src/CheckBox.mjs index b4059e3..b058bda 100644 --- a/src/CheckBox.mjs +++ b/src/CheckBox.mjs @@ -1,11 +1,19 @@ -/** - * @typedef {import("./CheckBox").CheckBoxProps} CheckBoxProps - */ import React from "react"; import Button from "./Button.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly value: boolean; + * readonly label: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onChange(): void; + * }} CheckBoxProps + */ + /** * @param {CheckBoxProps} props */ diff --git a/src/ComboBox.d.ts b/src/ComboBox.d.ts deleted file mode 100644 index 25f6c8d..0000000 --- a/src/ComboBox.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface ComboBoxProps { - readonly left: number; - readonly top: number; - readonly width: number; - readonly items: string[]; - readonly value: string; - onChange(value: string): void; - onEnter?(): void; -} diff --git a/src/ComboBox.mjs b/src/ComboBox.mjs index a6e2e09..f6ab975 100644 --- a/src/ComboBox.mjs +++ b/src/ComboBox.mjs @@ -1,9 +1,8 @@ /** * @typedef {import("@farjs/blessed").BlessedProgram} BlessedProgram * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement - * @typedef {import("./ListViewport").ListViewport} ListViewport - * @typedef {import("./TextInput").TextInputState} TextInputState - * @typedef {import("./ComboBox").ComboBoxProps} ComboBoxProps + * @typedef {import("./ListViewport.mjs").ListViewport} ListViewport + * @typedef {import("./TextInput.mjs").TextInputState} TextInputState */ import React, { useRef, useState } from "react"; import { createListViewport } from "./ListViewport.mjs"; @@ -14,6 +13,18 @@ import ComboBoxPopup from "./ComboBoxPopup.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly items: string[]; + * readonly value: string; + * onChange(value: string): void; + * onEnter?(): void; + * }} ComboBoxProps + */ + /** * @param {ComboBoxProps} props */ diff --git a/src/ComboBoxPopup.d.ts b/src/ComboBoxPopup.d.ts deleted file mode 100644 index f88da31..0000000 --- a/src/ComboBoxPopup.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Widgets } from "@farjs/blessed"; -import { ListViewport } from "./ListViewport"; - -export interface ComboBoxPopupProps { - readonly left: number; - readonly top: number; - readonly width: number; - readonly items: string[]; - readonly viewport: ListViewport; - setViewport(viewport: ListViewport): void; - readonly style: Widgets.Types.TStyle; - onClick(index: number): void; -} diff --git a/src/ComboBoxPopup.mjs b/src/ComboBoxPopup.mjs index 461c50f..97fab8e 100644 --- a/src/ComboBoxPopup.mjs +++ b/src/ComboBoxPopup.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("./ComboBoxPopup").ComboBoxPopupProps} ComboBoxPopupProps + * @typedef {import("./ListViewport.mjs").ListViewport} ListViewport */ import React from "react"; import SingleBorder from "./border/SingleBorder.mjs"; @@ -8,6 +8,19 @@ import ScrollBar from "./ScrollBar.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly items: string[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly viewport: ListViewport; + * setViewport(viewport: ListViewport): void; + * onClick(index: number): void; + * }} ComboBoxPopupProps + */ + /** * @param {ComboBoxPopupProps} props */ diff --git a/src/ListBox.d.ts b/src/ListBox.d.ts deleted file mode 100644 index 7728036..0000000 --- a/src/ListBox.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -export interface ListBoxProps { - readonly left: number; - readonly top: number; - readonly width: number; - readonly height: number; - readonly style: Widgets.Types.TStyle; - readonly items: string[]; - readonly selected: number; - onAction(index: number): void; - onSelect?(index: number): void; -} diff --git a/src/ListBox.mjs b/src/ListBox.mjs index d9b5717..32cd8a2 100644 --- a/src/ListBox.mjs +++ b/src/ListBox.mjs @@ -1,6 +1,5 @@ /** * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg} IKeyEventArg - * @typedef {import("./ListBox").ListBoxProps} ListBoxProps */ import React, { useLayoutEffect, useState } from "react"; import { createListViewport } from "./ListViewport.mjs"; @@ -9,6 +8,20 @@ import ScrollBar from "./ScrollBar.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly items: string[]; + * readonly selected: number; + * onAction(index: number): void; + * onSelect?(index: number): void; + * }} ListBoxProps + */ + /** * @param {ListBoxProps} props */ diff --git a/src/ListView.d.ts b/src/ListView.d.ts deleted file mode 100644 index e0f67af..0000000 --- a/src/ListView.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/// - -import { Widgets } from "@farjs/blessed"; -import { ListViewport } from "./ListViewport"; - -export interface ListViewProps { - readonly left: number; - readonly top: number; - readonly width: number; - readonly height: number; - readonly items: string[]; - readonly viewport: ListViewport; - setViewport(viewport: ListViewport): void; - readonly style: Widgets.Types.TStyle; - onClick(index: number): void; -} diff --git a/src/ListView.mjs b/src/ListView.mjs index 0d73cc3..f014c34 100644 --- a/src/ListView.mjs +++ b/src/ListView.mjs @@ -2,7 +2,7 @@ * @typedef {import("@farjs/blessed").Widgets.Types.TStyle} BlessedStyle * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement * @typedef {import("@farjs/blessed").Widgets.Events.IMouseEventArg} MouseEvent - * @typedef {import("./ListView").ListViewProps} ListViewProps + * @typedef {import("./ListViewport.mjs").ListViewport} ListViewport */ import React, { useLayoutEffect, useRef } from "react"; import * as UI from "./UI.mjs"; @@ -10,6 +10,20 @@ import UiString from "./UiString.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly height: number; + * readonly items: string[]; + * readonly style: BlessedStyle; + * readonly viewport: ListViewport; + * setViewport(viewport: ListViewport): void; + * onClick(index: number): void; + * }} ListViewProps + */ + /** * @param {number} selected * @param {string[]} items diff --git a/src/ListViewport.d.ts b/src/ListViewport.d.ts deleted file mode 100644 index b08aaa7..0000000 --- a/src/ListViewport.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface ListViewport { - readonly offset: number; - readonly focused: number; - readonly length: number; - readonly viewLength: number; - updated(offset: number, focused?: number): ListViewport; - down(): ListViewport; - up(): ListViewport; - pagedown(): ListViewport; - pageup(): ListViewport; - end(): ListViewport; - home(): ListViewport; - onKeypress(keyFull: string): ListViewport | undefined; - resize(viewLength: number): ListViewport; -} diff --git a/src/ListViewport.mjs b/src/ListViewport.mjs index 381d5f4..c9b5ff5 100644 --- a/src/ListViewport.mjs +++ b/src/ListViewport.mjs @@ -1,5 +1,19 @@ /** - * @typedef {import("./ListViewport").ListViewport} ListViewport + * @typedef {{ + * readonly offset: number; + * readonly focused: number; + * readonly length: number; + * readonly viewLength: number; + * updated(offset: number, focused?: number): ListViewport; + * down(): ListViewport; + * up(): ListViewport; + * pagedown(): ListViewport; + * pageup(): ListViewport; + * end(): ListViewport; + * home(): ListViewport; + * onKeypress(keyFull: string): ListViewport | undefined; + * resize(viewLength: number): ListViewport; + * }} ListViewport */ /** diff --git a/src/ProgressBar.d.ts b/src/ProgressBar.d.ts deleted file mode 100644 index 1d417ae..0000000 --- a/src/ProgressBar.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -export interface ProgressBarProps { - readonly percent: number; - readonly left: number; - readonly top: number; - readonly length: number; - readonly style: Widgets.Types.TStyle; -} diff --git a/src/ProgressBar.mjs b/src/ProgressBar.mjs index bdd1cc5..72a4e6c 100644 --- a/src/ProgressBar.mjs +++ b/src/ProgressBar.mjs @@ -1,10 +1,17 @@ -/** - * @typedef {import("./ProgressBar").ProgressBarProps} ProgressBarProps - */ import React from "react"; const h = React.createElement; +/** + * @typedef {{ + * readonly percent: number; + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} ProgressBarProps + */ + /** * @param {ProgressBarProps} props */ diff --git a/src/ScrollBar.d.ts b/src/ScrollBar.d.ts deleted file mode 100644 index d7abc0a..0000000 --- a/src/ScrollBar.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -import { Widgets } from "@farjs/blessed"; - -export interface ScrollBarProps { - readonly left: number; - readonly top: number; - readonly length: number; - readonly style: Widgets.Types.TStyle; - readonly value: number; - readonly extent: number; - readonly min: number; - readonly max: number; - onChange(value: number): void; -} diff --git a/src/ScrollBar.mjs b/src/ScrollBar.mjs index b47729a..a42e888 100644 --- a/src/ScrollBar.mjs +++ b/src/ScrollBar.mjs @@ -1,10 +1,21 @@ -/** - * @typedef {import("./ScrollBar").ScrollBarProps} ScrollBarProps - */ import React from "react"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly value: number; + * readonly extent: number; + * readonly min: number; + * readonly max: number; + * onChange(value: number): void; + * }} ScrollBarProps + */ + /** * @param {ScrollBarProps} props */ diff --git a/src/TextBox.d.ts b/src/TextBox.d.ts deleted file mode 100644 index a360a0e..0000000 --- a/src/TextBox.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface TextBoxProps { - readonly left: number; - readonly top: number; - readonly width: number; - readonly value: string; - onChange(value: string): void; - onEnter?(): void; -} diff --git a/src/TextBox.mjs b/src/TextBox.mjs index 1fb5fa1..b907aca 100644 --- a/src/TextBox.mjs +++ b/src/TextBox.mjs @@ -1,13 +1,23 @@ /** * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement - * @typedef {import("./TextInput").TextInputState} TextInputState - * @typedef {import("./TextBox").TextBoxProps} TextBoxProps + * @typedef {import("./TextInput.mjs").TextInputState} TextInputState */ import React, { useRef, useState } from "react"; import TextInput from "./TextInput.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly value: string; + * onChange(value: string): void; + * onEnter?(): void; + * }} TextBoxProps + */ + /** * @param {TextBoxProps} props */ diff --git a/src/TextInput.d.ts b/src/TextInput.d.ts deleted file mode 100644 index 71aae16..0000000 --- a/src/TextInput.d.ts +++ /dev/null @@ -1,74 +0,0 @@ -import React from "react"; -import { Widgets } from "@farjs/blessed"; -import { UiString } from "./UiString"; - -type BlessedElement = Widgets.BlessedElement; - -export interface TextInputProps { - readonly inputRef: React.MutableRefObject; - readonly left: number; - readonly top: number; - readonly width: number; - readonly value: string; - readonly state: TextInputState; - stateUpdater(update: (state: TextInputState) => TextInputState): void; - onChange(value: string): void; - onEnter?(): void; - onKeypress?(keyFull: string): boolean; -} - -export interface TextInputState { - readonly offset: number; - readonly cursorX: number; - readonly selStart: number; - readonly selEnd: number; -} - -export type CursorMove = - | CursorMove.At - | CursorMove.Home - | CursorMove.End - | CursorMove.Left - | CursorMove.Right; - -export namespace CursorMove { - interface At { - readonly move: "At"; - readonly pos: number; - } - - interface Home { - readonly move: "Home"; - } - - interface End { - readonly move: "End"; - } - - interface Left { - readonly move: "Left"; - readonly dx?: number; - } - - interface Right { - readonly move: "Right"; - readonly dx?: number; - } -} - -export type TextEdit = TextEdit.Insert | TextEdit.Delete | TextEdit.Backspace; - -export namespace TextEdit { - interface Insert { - readonly edit: "Insert"; - readonly str: UiString; - } - - interface Delete { - readonly edit: "Delete"; - } - - interface Backspace { - readonly edit: "Backspace"; - } -} diff --git a/src/TextInput.mjs b/src/TextInput.mjs index 499fccb..cf3bd60 100644 --- a/src/TextInput.mjs +++ b/src/TextInput.mjs @@ -4,11 +4,6 @@ * defaultPrevented?: boolean * }} IKeyEventArg * @typedef {import("@farjs/blessed").Widgets.Events.IMouseEventArg} MouseEvent - * @typedef {import("./UiString").UiString} UiString - * @typedef {import("./TextInput").TextInputProps} TextInputProps - * @typedef {import("./TextInput").TextInputState} TextInputState - * @typedef {import("./TextInput").CursorMove} CursorMove - * @typedef {import("./TextInput").TextEdit} TextEdit */ import React, { useLayoutEffect, useRef } from "react"; import { renderText2 } from "./UI.mjs"; @@ -17,6 +12,30 @@ import Theme from "./theme/Theme.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly inputRef: React.MutableRefObject; + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly value: string; + * readonly state: TextInputState; + * stateUpdater(update: (state: TextInputState) => TextInputState): void; + * onChange(value: string): void; + * onEnter?(): void; + * onKeypress?(keyFull: string): boolean; + * }} TextInputProps + */ + +/** + * @typedef {{ + * readonly offset: number; + * readonly cursorX: number; + * readonly selStart: number; + * readonly selEnd: number; + * }} TextInputState + */ + /** * @typedef {"Reset" | "All" | "TillTheHome" | "TillTheEnd" | "ToTheLeft" | "ToTheRight"} TextSelect * @typedef {{value: string, cm: CursorMove}} EditResult @@ -54,7 +73,7 @@ const TextInput = (props) => { /** * @param {BlessedElement} el - * @param {UiString} value + * @param {import("./UiString.mjs").UiString} value * @param {CursorMove} cm * @param {TextSelect} ts */ @@ -114,7 +133,7 @@ const TextInput = (props) => { } /** - * @param {UiString} value + * @param {import("./UiString.mjs").UiString} value * @param {number} idx * @param {number} newIdx * @param {TextSelect} ts @@ -181,7 +200,7 @@ const TextInput = (props) => { } /** - * @param {UiString} value + * @param {import("./UiString.mjs").UiString} value * @param {TextEdit} te * @returns {EditResult} */ @@ -347,3 +366,31 @@ TextInput.createState = () => { }; export default TextInput; + +/** + * @typedef {{ + * readonly move: "At"; + * readonly pos: number; + * } | { + * readonly move: "Home"; + * } | { + * readonly move: "End"; + * } | { + * readonly move: "Left"; + * readonly dx?: number; + * } | { + * readonly move: "Right"; + * readonly dx?: number; + * }} CursorMove + */ + +/** + * @typedef {{ + * readonly edit: "Insert"; + * readonly str: import("./UiString.mjs").UiString; + * } | { + * readonly edit: "Delete"; + * } | { + * readonly edit: "Backspace"; + * }} TextEdit + */ diff --git a/src/TextLine.d.ts b/src/TextLine.d.ts deleted file mode 100644 index dd19370..0000000 --- a/src/TextLine.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Widgets } from "@farjs/blessed"; -import { TextAlign } from "./TextAlign.mjs"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface TextLineProps { - readonly align: TextAlign; - readonly left: number; - readonly top: number; - readonly width: number; - readonly text: string; - readonly style: BlessedStyle; - readonly focused?: boolean; - readonly padding?: number; -} diff --git a/src/TextLine.mjs b/src/TextLine.mjs index d55c6ed..c3c7386 100644 --- a/src/TextLine.mjs +++ b/src/TextLine.mjs @@ -1,12 +1,22 @@ -/** - * @typedef {import("./TextLine").TextLineProps} TextLineProps - */ import React from "react"; import UiString from "./UiString.mjs"; import TextAlign from "./TextAlign.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly align: import("./TextAlign.mjs").TextAlign; + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly text: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly focused?: boolean; + * readonly padding?: number; + * }} TextLineProps + */ + /** * @param {TextLineProps} props */ diff --git a/src/UI.mjs b/src/UI.mjs index 85ae5b8..b828b32 100644 --- a/src/UI.mjs +++ b/src/UI.mjs @@ -1,10 +1,7 @@ -/** - * @typedef { import("@farjs/blessed").Widgets.Types.TStyle } BlessedStyle - */ import Blessed from "@farjs/blessed"; /** - * @param {BlessedStyle | undefined} style + * @param {import("@farjs/blessed").Widgets.Types.TStyle | undefined} style * @param {string} text * @returns {string} */ diff --git a/src/UiString.d.ts b/src/UiString.d.ts deleted file mode 100644 index 119e8ae..0000000 --- a/src/UiString.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface UiString { - strWidth(): number; - toString(): string; - charStartPos(from: number): UiCharStartPos; - slice(from: number, until: number): string; - ensureWidth(width: number, padCh: string): string; -} - -export interface UiCharStartPos { - readonly lcw: number; - readonly pos: number; - readonly rcw: number; -} diff --git a/src/UiString.mjs b/src/UiString.mjs index 54207a6..57952c6 100644 --- a/src/UiString.mjs +++ b/src/UiString.mjs @@ -1,13 +1,28 @@ -/** - * @typedef {import('./UiString').UiCharStartPos} UiCharStartPos - */ import Blessed from "@farjs/blessed"; const { unicode } = Blessed; +/** + * @typedef {{ + * readonly lcw: number; + * readonly pos: number; + * readonly rcw: number; + * }} UiCharStartPos + */ + +/** + * @typedef {{ + * strWidth(): number; + * toString(): string; + * charStartPos(from: number): UiCharStartPos; + * slice(from: number, until: number): string; + * ensureWidth(width: number, padCh: string): string; + * }} UiString + */ + /** * @param {string} str - * @returns {import('./UiString').UiString} + * @returns {UiString} */ function UiString(str) { /** @type {number | undefined} */ diff --git a/src/WithSize.d.ts b/src/WithSize.d.ts deleted file mode 100644 index c8a430d..0000000 --- a/src/WithSize.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface WithSizeProps { - render(width: number, height: number): React.ReactElement | null; -} diff --git a/src/WithSize.mjs b/src/WithSize.mjs index 8dc8b23..3c31534 100644 --- a/src/WithSize.mjs +++ b/src/WithSize.mjs @@ -1,12 +1,17 @@ /** * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement - * @typedef {import("./WithSize").WithSizeProps} WithSizeProps */ import React, { useLayoutEffect, useRef, useState } from "react"; import PopupOverlay from "./popup/PopupOverlay.mjs"; const h = React.createElement; +/** + * @typedef {{ + * render(width: number, height: number): React.ReactElement | null; + * }} WithSizeProps + */ + /** * @param {WithSizeProps} props */ diff --git a/src/app/AppRoot.d.ts b/src/app/AppRoot.d.ts deleted file mode 100644 index 8227f5a..0000000 --- a/src/app/AppRoot.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import { ThemeType } from "../theme/Theme"; -import { DevToolType } from "../tool/DevTool.mjs"; - -export type MainUi = React.FC | React.ComponentClass<{}>; - -export interface LoadResult { - readonly theme: ThemeType; - readonly mainUi: MainUi; -} - -export interface AppRootProps { - readonly loadMainUi: (dispatch: (a: any) => void) => Promise; - readonly initialDevTool: DevToolType; - readonly defaultTheme: ThemeType; -} diff --git a/src/app/AppRoot.mjs b/src/app/AppRoot.mjs index a683493..d347039 100644 --- a/src/app/AppRoot.mjs +++ b/src/app/AppRoot.mjs @@ -1,12 +1,10 @@ /** - * @typedef {import("./AppRoot").MainUi} MainUi - * @typedef {import("./AppRoot").LoadResult} LoadResult - * @typedef {import("./AppRoot").AppRootProps} AppRootProps - * @typedef {import("../theme/Theme").ThemeType} ThemeType * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg & { * defaultPrevented?: boolean * }} IKeyEventArg + * @typedef {import("../theme/Theme.mjs").Theme} Theme + * @typedef {import("../tool/DevTool.mjs").DevTool} DevTool */ import React, { useLayoutEffect, useReducer, useRef, useState } from "react"; import Theme from "../theme/Theme.mjs"; @@ -18,6 +16,25 @@ import TaskManager from "../task/TaskManager.mjs"; const h = React.createElement; +/** + * @typedef {React.FC | React.ComponentClass<{}>} MainUi + */ + +/** + * @typedef {{ + * readonly theme: Theme; + * readonly mainUi: MainUi; + * }} LoadResult + */ + +/** + * @typedef {{ + * readonly initialDevTool: DevTool; + * readonly defaultTheme: Theme; + * loadMainUi(dispatch: (a: any) => void): Promise; + * }} AppRootProps + */ + /** * @param {AppRootProps} props */ diff --git a/src/border/DoubleBorder.d.ts b/src/border/DoubleBorder.d.ts deleted file mode 100644 index f6cde17..0000000 --- a/src/border/DoubleBorder.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface DoubleBorderProps { - readonly width: number; - readonly height: number; - readonly style: BlessedStyle; - readonly left?: number; - readonly top?: number; - readonly title?: string; - readonly footer?: string; -} diff --git a/src/border/DoubleBorder.mjs b/src/border/DoubleBorder.mjs index 11f389d..f81a993 100644 --- a/src/border/DoubleBorder.mjs +++ b/src/border/DoubleBorder.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./DoubleBorder").DoubleBorderProps} DoubleBorderProps - */ import React from "react"; import TextAlign from "../TextAlign.mjs"; import TextLine from "../TextLine.mjs"; @@ -10,6 +7,18 @@ import DoubleChars from "./DoubleChars.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly left?: number; + * readonly top?: number; + * readonly title?: string; + * readonly footer?: string; + * }} DoubleBorderProps + */ + /** * @param {DoubleBorderProps} props */ diff --git a/src/border/HorizontalLine.d.ts b/src/border/HorizontalLine.d.ts deleted file mode 100644 index 12a445c..0000000 --- a/src/border/HorizontalLine.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface HorizontalLineProps { - readonly left: number; - readonly top: number; - readonly length: number; - readonly lineCh: string; - readonly style: BlessedStyle; - readonly startCh?: string; - readonly endCh?: string; -} diff --git a/src/border/HorizontalLine.mjs b/src/border/HorizontalLine.mjs index deefc3f..a779b3e 100644 --- a/src/border/HorizontalLine.mjs +++ b/src/border/HorizontalLine.mjs @@ -1,10 +1,19 @@ -/** - * @typedef {import("./HorizontalLine").HorizontalLineProps} HorizontalLineProps - */ import React from "react"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly lineCh: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly startCh?: string; + * readonly endCh?: string; + * }} HorizontalLineProps + */ + /** * @param {HorizontalLineProps} props */ diff --git a/src/border/SingleBorder.d.ts b/src/border/SingleBorder.d.ts deleted file mode 100644 index f9689ea..0000000 --- a/src/border/SingleBorder.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface SingleBorderProps { - readonly width: number; - readonly height: number; - readonly style: BlessedStyle; -} diff --git a/src/border/SingleBorder.mjs b/src/border/SingleBorder.mjs index 1ba545c..3efc0f7 100644 --- a/src/border/SingleBorder.mjs +++ b/src/border/SingleBorder.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./SingleBorder").SingleBorderProps} SingleBorderProps - */ import React from "react"; import HorizontalLine from "./HorizontalLine.mjs"; import VerticalLine from "./VerticalLine.mjs"; @@ -8,6 +5,14 @@ import SingleChars from "./SingleChars.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} SingleBorderProps + */ + /** * @param {SingleBorderProps} props */ diff --git a/src/border/VerticalLine.d.ts b/src/border/VerticalLine.d.ts deleted file mode 100644 index f3e6357..0000000 --- a/src/border/VerticalLine.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface VerticalLineProps { - readonly left: number; - readonly top: number; - readonly length: number; - readonly lineCh: string; - readonly style: BlessedStyle; - readonly startCh?: string; - readonly endCh?: string; -} diff --git a/src/border/VerticalLine.mjs b/src/border/VerticalLine.mjs index 6fddfc0..adb9727 100644 --- a/src/border/VerticalLine.mjs +++ b/src/border/VerticalLine.mjs @@ -1,10 +1,19 @@ -/** - * @typedef {import("./VerticalLine").VerticalLineProps} VerticalLineProps - */ import React from "react"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly lineCh: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly startCh?: string; + * readonly endCh?: string; + * }} VerticalLineProps + */ + /** * @param {VerticalLineProps} props */ diff --git a/src/menu/BottomMenu.d.ts b/src/menu/BottomMenu.d.ts deleted file mode 100644 index d227d9c..0000000 --- a/src/menu/BottomMenu.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface BottomMenuProps { - readonly items: string[]; -} diff --git a/src/menu/BottomMenu.mjs b/src/menu/BottomMenu.mjs index 0a76548..2ed6743 100644 --- a/src/menu/BottomMenu.mjs +++ b/src/menu/BottomMenu.mjs @@ -1,12 +1,15 @@ -/** - * @typedef {import("./BottomMenu").BottomMenuProps} BottomMenuProps - */ import React from "react"; import WithSize from "../WithSize.mjs"; import BottomMenuView from "./BottomMenuView.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly items: string[]; + * }} BottomMenuProps + */ + /** * @param {BottomMenuProps} props */ diff --git a/src/menu/BottomMenuView.d.ts b/src/menu/BottomMenuView.d.ts deleted file mode 100644 index 2b5d036..0000000 --- a/src/menu/BottomMenuView.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface BottomMenuViewProps { - readonly width: number; - readonly items: string[]; -} diff --git a/src/menu/BottomMenuView.mjs b/src/menu/BottomMenuView.mjs index 2e806ea..e6066dc 100644 --- a/src/menu/BottomMenuView.mjs +++ b/src/menu/BottomMenuView.mjs @@ -1,13 +1,22 @@ -/** - * @typedef {import("./BottomMenuView").BottomMenuViewProps} BottomMenuViewProps - */ import React from "react"; import Theme from "../theme/Theme.mjs"; const h = React.createElement; /** - * @typedef {{key: number, item: string, pos: number, textWidth: number}} BottomMenuViewItem + * @typedef {{ + * readonly width: number; + * readonly items: string[]; + * }} BottomMenuViewProps + */ + +/** + * @typedef {{ + * readonly key: number; + * readonly item: string; + * readonly pos: number; + * readonly textWidth: number; + * }} BottomMenuViewItem */ /** diff --git a/src/menu/MenuBar.d.ts b/src/menu/MenuBar.d.ts deleted file mode 100644 index 04110f7..0000000 --- a/src/menu/MenuBar.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface MenuBarItem { - readonly label: string; - readonly subItems: string[]; -} - -export interface MenuBarProps { - readonly items: MenuBarItem[]; - onAction(menuIndex: number, subIndex: number): void; - onClose(): void; -} diff --git a/src/menu/MenuBar.mjs b/src/menu/MenuBar.mjs index 163b40d..755dba6 100644 --- a/src/menu/MenuBar.mjs +++ b/src/menu/MenuBar.mjs @@ -1,7 +1,5 @@ /** - * @typedef {import("../../src/ButtonsPanel").ButtonsPanelAction} ButtonsPanelAction - * @typedef {import("./MenuBar").MenuBarItem} MenuBarItem - * @typedef {import("./MenuBar").MenuBarProps} MenuBarProps + * @typedef {import("../../src/ButtonsPanel.mjs").ButtonsPanelAction} ButtonsPanelAction */ import React, { useState } from "react"; import Theme from "../theme/Theme.mjs"; @@ -12,7 +10,25 @@ import SubMenu from "./SubMenu.mjs"; const h = React.createElement; /** - * @typedef {{menuIndex: number, subIndex: number}} SubMenuState + * @typedef {{ + * readonly label: string; + * readonly subItems: string[]; + * }} MenuBarItem + */ + +/** + * @typedef {{ + * readonly items: MenuBarItem[]; + * onAction(menuIndex: number, subIndex: number): void; + * onClose(): void; + * }} MenuBarProps + */ + +/** + * @typedef {{ + * readonly menuIndex: number; + * readonly subIndex: number; + * }} SubMenuState */ /** diff --git a/src/menu/MenuBarTrigger.mjs b/src/menu/MenuBarTrigger.mjs index b583db5..9027777 100644 --- a/src/menu/MenuBarTrigger.mjs +++ b/src/menu/MenuBarTrigger.mjs @@ -3,6 +3,9 @@ import PopupOverlay from "../popup/PopupOverlay.mjs"; const h = React.createElement; +/** + * @returns {React.ReactElement} + */ const MenuBarTrigger = () => { return h("box", { height: 1, diff --git a/src/menu/MenuPopup.d.ts b/src/menu/MenuPopup.d.ts deleted file mode 100644 index e934db5..0000000 --- a/src/menu/MenuPopup.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface MenuPopupProps { - readonly title: string; - readonly items: string[]; - getLeft(width: number): string; - onSelect(index: number): void; - onClose(): void; -} diff --git a/src/menu/MenuPopup.mjs b/src/menu/MenuPopup.mjs index 3772b68..5e0fbd3 100644 --- a/src/menu/MenuPopup.mjs +++ b/src/menu/MenuPopup.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./MenuPopup").MenuPopupProps} MenuPopupProps - */ import React from "react"; import Theme from "../theme/Theme.mjs"; import Popup from "../popup/Popup.mjs"; @@ -12,6 +9,16 @@ const h = React.createElement; const paddingHorizontal = 2; const paddingVertical = 1; +/** + * @typedef {{ + * readonly title: string; + * readonly items: string[]; + * getLeft(width: number): string; + * onSelect(index: number): void; + * onClose(): void; + * }} MenuPopupProps + */ + /** * @param {MenuPopupProps} props */ diff --git a/src/menu/SubMenu.d.ts b/src/menu/SubMenu.d.ts deleted file mode 100644 index 3152004..0000000 --- a/src/menu/SubMenu.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface SubMenuProps { - readonly selected: number; - readonly items: string[]; - readonly top: number; - readonly left: number; - onClick(index: number): void; -} diff --git a/src/menu/SubMenu.mjs b/src/menu/SubMenu.mjs index 705adfd..2c143ec 100644 --- a/src/menu/SubMenu.mjs +++ b/src/menu/SubMenu.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./SubMenu").SubMenuProps} SubMenuProps - */ import React from "react"; import Theme from "../theme/Theme.mjs"; import SingleChars from "../border/SingleChars.mjs"; @@ -10,6 +7,16 @@ import HorizontalLine from "../border/HorizontalLine.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly selected: number; + * readonly items: string[]; + * readonly top: number; + * readonly left: number; + * onClick(index: number): void; + * }} SubMenuProps + */ + /** * @param {SubMenuProps} props */ diff --git a/src/popup/ListPopup.d.ts b/src/popup/ListPopup.d.ts deleted file mode 100644 index bb35184..0000000 --- a/src/popup/ListPopup.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface ListPopupProps { - readonly title: string; - readonly items: string[]; - onAction(index: number): void; - onClose(): void; - readonly selected?: number; - onSelect?(index: number): void; - onKeypress?(keyFull: string): boolean; - readonly footer?: string; - readonly textPaddingLeft?: number; - readonly textPaddingRight?: number; - readonly itemWrapPrefixLen?: number; -} diff --git a/src/popup/ListPopup.mjs b/src/popup/ListPopup.mjs index 7e1cfda..fbc9293 100644 --- a/src/popup/ListPopup.mjs +++ b/src/popup/ListPopup.mjs @@ -1,6 +1,5 @@ /** - * @typedef {import("./ModalContent").BlessedPadding} BlessedPadding - * @typedef {import("./ListPopup").ListPopupProps} ListPopupProps + * @typedef {import("./ModalContent.mjs").BlessedPadding} BlessedPadding */ import React from "react"; import Theme from "../theme/Theme.mjs"; @@ -12,6 +11,22 @@ import TextLine from "../TextLine.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly title: string; + * readonly items: string[]; + * onAction(index: number): void; + * onClose(): void; + * readonly selected?: number; + * onSelect?(index: number): void; + * onKeypress?(keyFull: string): boolean; + * readonly footer?: string; + * readonly textPaddingLeft?: number; + * readonly textPaddingRight?: number; + * readonly itemWrapPrefixLen?: number; + * }} ListPopupProps + */ + /** * @param {ListPopupProps} props */ diff --git a/src/popup/MessageBox.d.ts b/src/popup/MessageBox.d.ts deleted file mode 100644 index e95460a..0000000 --- a/src/popup/MessageBox.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Widgets } from "@farjs/blessed"; -import { MessageBoxActionType } from "./MessageBoxAction"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface MessageBoxProps { - readonly title: string; - readonly message: string; - readonly actions: MessageBoxActionType[]; - readonly style: BlessedStyle; -} diff --git a/src/popup/MessageBox.mjs b/src/popup/MessageBox.mjs index 8ba66a2..7db03c7 100644 --- a/src/popup/MessageBox.mjs +++ b/src/popup/MessageBox.mjs @@ -1,6 +1,6 @@ /** - * @typedef {import("../../src/ButtonsPanel").ButtonsPanelAction} ButtonsPanelAction - * @typedef {import("./MessageBox").MessageBoxProps} MessageBoxProps + * @typedef {import("../../src/ButtonsPanel.mjs").ButtonsPanelAction} ButtonsPanelAction + * @typedef {import("./MessageBoxAction.mjs").MessageBoxAction} MessageBoxAction */ import React from "react"; import * as UI from "../UI.mjs"; @@ -12,6 +12,15 @@ import ButtonsPanel from "../ButtonsPanel.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly title: string; + * readonly message: string; + * readonly actions: MessageBoxAction[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} MessageBoxProps + */ + /** * @param {MessageBoxProps} props */ diff --git a/src/popup/MessageBoxAction.d.ts b/src/popup/MessageBoxAction.d.ts deleted file mode 100644 index 7c077a1..0000000 --- a/src/popup/MessageBoxAction.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface MessageBoxActionType { - readonly label: string; - readonly onAction: () => void; - readonly triggeredOnClose: boolean; -} diff --git a/src/popup/MessageBoxAction.mjs b/src/popup/MessageBoxAction.mjs index b06e563..48b34df 100644 --- a/src/popup/MessageBoxAction.mjs +++ b/src/popup/MessageBoxAction.mjs @@ -1,11 +1,15 @@ /** - * @typedef {import("./MessageBoxAction").MessageBoxActionType} MessageBoxActionType + * @typedef {{ + * readonly label: string; + * readonly triggeredOnClose: boolean; + * onAction(): void; + * }} MessageBoxAction */ /** * @param {string} label * @param {boolean} triggeredOnClose - * @returns {(onAction: () => void) => MessageBoxActionType} + * @returns {(onAction: () => void) => MessageBoxAction} */ function createAction(label, triggeredOnClose = false) { return (onAction) => { diff --git a/src/popup/Modal.d.ts b/src/popup/Modal.d.ts deleted file mode 100644 index 88d2f82..0000000 --- a/src/popup/Modal.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface ModalProps { - readonly title: string; - readonly width: number; - readonly height: number; - readonly style: BlessedStyle; - onCancel(): void; -} diff --git a/src/popup/Modal.mjs b/src/popup/Modal.mjs index 6503ea7..113a6c8 100644 --- a/src/popup/Modal.mjs +++ b/src/popup/Modal.mjs @@ -1,12 +1,19 @@ -/** - * @typedef {import("./Modal").ModalProps} ModalProps - */ import React from "react"; import Popup from "./Popup.mjs"; import ModalContent from "./ModalContent.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly title: string; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onCancel(): void; + * }} ModalProps + */ + /** * @param {React.PropsWithChildren} props */ diff --git a/src/popup/ModalContent.d.ts b/src/popup/ModalContent.d.ts deleted file mode 100644 index d766212..0000000 --- a/src/popup/ModalContent.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Widgets } from "@farjs/blessed"; - -type BlessedStyle = Widgets.Types.TStyle; - -export interface BlessedPadding { - readonly left: number; - readonly right: number; - readonly top: number; - readonly bottom: number; -} - -export interface ModalContentProps { - readonly title: string; - readonly width: number; - readonly height: number; - readonly style: BlessedStyle; - readonly padding?: BlessedPadding; - readonly left?: Widgets.Types.TTopLeft; - readonly footer?: string; -} diff --git a/src/popup/ModalContent.mjs b/src/popup/ModalContent.mjs index 0fec1fb..67a720a 100644 --- a/src/popup/ModalContent.mjs +++ b/src/popup/ModalContent.mjs @@ -1,12 +1,29 @@ -/** - * @typedef {import("./ModalContent").BlessedPadding} BlessedPadding - * @typedef {import("./ModalContent").ModalContentProps} ModalContentProps - */ import React from "react"; import DoubleBorder from "../border/DoubleBorder.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly left: number; + * readonly right: number; + * readonly top: number; + * readonly bottom: number; + * }} BlessedPadding + */ + +/** + * @typedef {{ + * readonly title: string; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly padding?: BlessedPadding; + * readonly left?: import("@farjs/blessed").Widgets.Types.TTopLeft; + * readonly footer?: string; + * }} ModalContentProps + */ + /** * @param {React.PropsWithChildren} props */ diff --git a/src/popup/Popup.d.ts b/src/popup/Popup.d.ts deleted file mode 100644 index 5a3b943..0000000 --- a/src/popup/Popup.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface PopupProps { - readonly onClose?: () => void; - readonly focusable?: boolean; - readonly onOpen?: () => void; - readonly onKeypress?: (keyFull: string) => boolean; -} diff --git a/src/popup/Popup.mjs b/src/popup/Popup.mjs index be70f12..dc092a4 100644 --- a/src/popup/Popup.mjs +++ b/src/popup/Popup.mjs @@ -1,12 +1,18 @@ -/** - * @typedef {import("./Popup").PopupProps} PopupProps - */ import React from "react"; import Portal from "../portal/Portal.mjs"; import PopupOverlay from "./PopupOverlay.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly focusable?: boolean; + * onClose?(): void; + * onOpen?(): void; + * onKeypress?(keyFull: string): boolean; + * }} PopupProps + */ + /** * @param {React.PropsWithChildren} props */ diff --git a/src/popup/PopupOverlay.mjs b/src/popup/PopupOverlay.mjs index 2ed6d05..1b94345 100644 --- a/src/popup/PopupOverlay.mjs +++ b/src/popup/PopupOverlay.mjs @@ -1,13 +1,13 @@ /** - * @typedef {import("./Popup").PopupProps} PopupProps * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement - * @typedef {import("@farjs/blessed").Widgets.FormElement & { + * @typedef {import("@farjs/blessed").Widgets.FormElement & { * focusFirst(): void, * _selected: BlessedElement * }} FormElement * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg & { * defaultPrevented?: boolean * }} IKeyEventArg + * @typedef {import("./Popup.mjs").PopupProps} PopupProps */ import React, { useLayoutEffect, useRef } from "react"; @@ -15,6 +15,7 @@ const h = React.createElement; /** * @param {React.PropsWithChildren} props + * @returns {React.ReactElement} */ const PopupOverlay = (props) => { const formRef = /** @type {React.MutableRefObject} */ (useRef()); diff --git a/src/popup/StatusPopup.d.ts b/src/popup/StatusPopup.d.ts deleted file mode 100644 index 7bf0acd..0000000 --- a/src/popup/StatusPopup.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface StatusPopupProps { - readonly text: string; - readonly title?: string; - readonly onClose?: () => void; -} diff --git a/src/popup/StatusPopup.mjs b/src/popup/StatusPopup.mjs index a2af4f5..631896b 100644 --- a/src/popup/StatusPopup.mjs +++ b/src/popup/StatusPopup.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./StatusPopup").StatusPopupProps} StatusPopupProps - */ import React from "react"; import * as UI from "../UI.mjs"; import TextAlign from "../TextAlign.mjs"; @@ -11,6 +8,14 @@ import ModalContent from "./ModalContent.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly text: string; + * readonly title?: string; + * onClose?(): void; + * }} StatusPopupProps + */ + /** * @param {StatusPopupProps} props */ diff --git a/src/portal/WithPortals.d.ts b/src/portal/WithPortals.d.ts deleted file mode 100644 index aba577f..0000000 --- a/src/portal/WithPortals.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import React from "react"; - -export interface WithPortalsContext { - onRender(portalId: number, content: React.ReactNode): void; - onRemove(portalId: number): void; -} diff --git a/src/portal/WithPortals.mjs b/src/portal/WithPortals.mjs index b256453..b1f95a5 100644 --- a/src/portal/WithPortals.mjs +++ b/src/portal/WithPortals.mjs @@ -1,8 +1,7 @@ /** - * @typedef {import("./WithPortals").WithPortalsContext} WithPortalsContext - * @typedef {import("./Portal.mjs").PortalContext} PortalContext * @typedef {import("@farjs/blessed").Widgets.Screen} BlessedScreen * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement + * @typedef {import("./Portal.mjs").PortalContext} PortalContext */ import React, { useMemo, useState } from "react"; import Portal from "./Portal.mjs"; @@ -10,7 +9,18 @@ import Portal from "./Portal.mjs"; const h = React.createElement; /** - * @typedef {{id: number, content: React.ReactNode, focused: BlessedElement}} PortalItem + * @typedef {{ + * readonly id: number; + * readonly content: React.ReactNode; + * readonly focused: BlessedElement; + * }} PortalItem + */ + +/** + * @typedef {{ + * onRender(portalId: number, content: React.ReactNode): void; + * onRemove(portalId: number): void; + * }} WithPortalsContext */ const WithPortals = { diff --git a/src/task/Task.d.ts b/src/task/Task.d.ts deleted file mode 100644 index aeb9891..0000000 --- a/src/task/Task.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Task { - readonly startTime: number; - readonly message: string; - readonly result: Promise; -} diff --git a/src/task/Task.mjs b/src/task/Task.mjs index 4568f12..043b3da 100644 --- a/src/task/Task.mjs +++ b/src/task/Task.mjs @@ -1,8 +1,17 @@ +/** + * @template T + * @typedef {{ + * readonly startTime: number; + * readonly message: string; + * readonly result: Promise; + * }} Task + */ + /** * @template T * @param {string} message * @param {Promise} result - * @returns {import('./Task').Task} + * @returns {Task} */ function Task(message, result) { return { diff --git a/src/task/TaskAction.d.ts b/src/task/TaskAction.d.ts deleted file mode 100644 index 527db95..0000000 --- a/src/task/TaskAction.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Task } from "./Task"; - -export interface TaskAction { - readonly task: Task; -} diff --git a/src/task/TaskAction.mjs b/src/task/TaskAction.mjs new file mode 100644 index 0000000..0a4209a --- /dev/null +++ b/src/task/TaskAction.mjs @@ -0,0 +1,24 @@ +/** + * @template T + * @typedef {import("./Task.mjs").Task} Task + */ + +/** + * @template T + * @typedef {{ + * readonly task: Task; + * }} TaskAction + */ + +/** + * @template T + * @param {Task} task + * @returns {TaskAction} + */ +function TaskAction(task) { + return { + task, + }; +} + +export default TaskAction; diff --git a/src/task/TaskError.d.ts b/src/task/TaskError.d.ts deleted file mode 100644 index ea6c0ff..0000000 --- a/src/task/TaskError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface TaskError { - readonly error: string; - readonly errorDetails?: string; -} diff --git a/src/task/TaskManager.d.ts b/src/task/TaskManager.d.ts deleted file mode 100644 index 7298699..0000000 --- a/src/task/TaskManager.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Task } from "./Task"; - -export interface TaskManagerProps { - readonly startTask?: Task; -} diff --git a/src/task/TaskManager.mjs b/src/task/TaskManager.mjs index b3a1947..9d0681a 100644 --- a/src/task/TaskManager.mjs +++ b/src/task/TaskManager.mjs @@ -1,8 +1,9 @@ /** - * @typedef {import("./Task").Task} Task - * @typedef {import("./TaskError").TaskError} TaskError - * @typedef {import("./TaskManager").TaskManagerProps} TaskManagerProps - * @typedef {import("./TaskManagerUi").TaskManagerUiProps} TaskManagerUiProps + * @template T + * @typedef {import("./Task.mjs").Task} Task + */ +/** + * @typedef {import("./TaskManagerUi.mjs").TaskManagerUiProps} TaskManagerUiProps */ import React, { useState, useLayoutEffect } from "react"; import TaskManagerUi from "./TaskManagerUi.mjs"; @@ -10,7 +11,18 @@ import TaskManagerUi from "./TaskManagerUi.mjs"; const h = React.createElement; /** - * @typedef {{taskCount: number, status?: string, error?: string, errorDetails?: string}} TaskManagerState + * @typedef {{ + * readonly startTask?: Task; + * }} TaskManagerProps + */ + +/** + * @typedef {{ + * readonly taskCount: number; + * readonly status?: string; + * readonly error?: string; + * readonly errorDetails?: string; + * }} TaskManagerState */ /** @@ -70,7 +82,7 @@ TaskManager.errorHandler = (error) => { /** * @param {React.Dispatch>} setState - * @param {Task} task + * @param {Task} task */ function onTaskStart(setState, task) { task.result.then( @@ -89,7 +101,7 @@ function onTaskStart(setState, task) { /** * @param {React.Dispatch>} setState - * @param {Task} task + * @param {Task} task * @param {any} [reason] */ function onTaskFinish(setState, task, reason) { @@ -109,3 +121,10 @@ function onTaskFinish(setState, task, reason) { } export default TaskManager; + +/** + * @typedef {{ + * readonly error: string; + * readonly errorDetails?: string; + * }} TaskError + */ diff --git a/src/task/TaskManagerUi.d.ts b/src/task/TaskManagerUi.d.ts deleted file mode 100644 index 1c266d5..0000000 --- a/src/task/TaskManagerUi.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface TaskManagerUiProps { - readonly showLoading: boolean; - onHideStatus(): void; - onCloseErrorPopup(): void; - readonly status?: string; - readonly error?: string; - readonly errorDetails?: string; -} diff --git a/src/task/TaskManagerUi.mjs b/src/task/TaskManagerUi.mjs index a49d21c..d89841e 100644 --- a/src/task/TaskManagerUi.mjs +++ b/src/task/TaskManagerUi.mjs @@ -1,6 +1,3 @@ -/** - * @typedef {import("./TaskManagerUi").TaskManagerUiProps} TaskManagerUiProps - */ import React, { useState, useLayoutEffect } from "react"; import StatusPopup from "../popup/StatusPopup.mjs"; import MessageBox from "../popup/MessageBox.mjs"; @@ -9,6 +6,17 @@ import Theme from "../theme/Theme.mjs"; const h = React.createElement; +/** + * @typedef {{ + * readonly showLoading: boolean; + * onHideStatus(): void; + * onCloseErrorPopup(): void; + * readonly status?: string; + * readonly error?: string; + * readonly errorDetails?: string; + * }} TaskManagerUiProps + */ + /** * @param {string} error * @returns {string} diff --git a/src/task/TaskReducer.mjs b/src/task/TaskReducer.mjs index cf09e38..070b137 100644 --- a/src/task/TaskReducer.mjs +++ b/src/task/TaskReducer.mjs @@ -1,8 +1,12 @@ /** * @template T - * @param {import('./Task').Task | undefined} state + * @typedef {import("./Task.mjs").Task} Task + */ + +/** + * @param {Task | undefined} state * @param {any} action - * @returns {import('./Task').Task | undefined} + * @returns {Task | undefined} */ function TaskReducer(state, action) { const task = action?.task; diff --git a/src/theme/DefaultTheme.mjs b/src/theme/DefaultTheme.mjs index 8a1885d..c0307b6 100644 --- a/src/theme/DefaultTheme.mjs +++ b/src/theme/DefaultTheme.mjs @@ -1,7 +1,7 @@ import Color from "./Color.mjs"; /** - * @type {import("./Theme").ThemeType} + * @type {import("./Theme.mjs").Theme} */ const DefaultTheme = Object.freeze({ popup: Object.freeze({ diff --git a/src/theme/Theme.d.ts b/src/theme/Theme.d.ts deleted file mode 100644 index a48a3d2..0000000 --- a/src/theme/Theme.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface ThemeStyle { - readonly bold?: boolean; - readonly bg: string; - readonly fg: string; -} - -export interface ThemeEffects extends ThemeStyle { - readonly focus?: ThemeStyle; -} - -export interface ThemePopup { - readonly regular: ThemeEffects; - readonly error: ThemeEffects; - readonly menu: ThemeEffects; -} - -export interface ThemeMenu { - readonly key: ThemeStyle; - readonly item: ThemeStyle; -} - -export interface ThemeTextBox { - readonly regular: ThemeEffects; - readonly selected: ThemeEffects; -} - -export interface ThemeType { - readonly popup: ThemePopup; - readonly menu: ThemeMenu; - readonly textBox: ThemeTextBox; -} diff --git a/src/theme/Theme.mjs b/src/theme/Theme.mjs index dec17fc..ffc8f07 100644 --- a/src/theme/Theme.mjs +++ b/src/theme/Theme.mjs @@ -1,13 +1,10 @@ -/** - * @typedef {import("./Theme").ThemeType} ThemeType - */ import React, { useContext } from "react"; const Theme = { - Context: React.createContext(/** @type {ThemeType | null} */ (null)), + Context: React.createContext(/** @type {Theme | null} */ (null)), /** - * @returns {ThemeType} + * @returns {Theme} */ useTheme: () => { const ctx = useContext(Theme.Context); @@ -22,3 +19,47 @@ const Theme = { }; export default Theme; + +/** + * @typedef {{ + * readonly popup: ThemePopup; + * readonly menu: ThemeMenu; + * readonly textBox: ThemeTextBox; + * }} Theme + */ + +/** + * @typedef {{ + * readonly bold?: boolean; + * readonly bg: string; + * readonly fg: string; + * }} ThemeStyle + */ + +/** + * @typedef {ThemeStyle & { + * readonly focus?: ThemeStyle; + * }} ThemeEffects + */ + +/** + * @typedef {{ + * readonly regular: ThemeEffects; + * readonly error: ThemeEffects; + * readonly menu: ThemeEffects; + * }} ThemePopup + */ + +/** + * @typedef {{ + * readonly key: ThemeStyle; + * readonly item: ThemeStyle; + * }} ThemeMenu + */ + +/** + * @typedef {{ + * readonly regular: ThemeEffects; + * readonly selected: ThemeEffects; + * }} ThemeTextBox + */ diff --git a/src/theme/XTerm256Theme.mjs b/src/theme/XTerm256Theme.mjs index 575c561..84d9730 100644 --- a/src/theme/XTerm256Theme.mjs +++ b/src/theme/XTerm256Theme.mjs @@ -1,7 +1,7 @@ import Color from "./Color.mjs"; /** - * @type {import("./Theme").ThemeType} + * @type {import("./Theme.mjs").Theme} */ const XTerm256Theme = Object.freeze({ popup: Object.freeze({ diff --git a/src/tool/DevTool.mjs b/src/tool/DevTool.mjs index 7913f06..c0f7c6e 100644 --- a/src/tool/DevTool.mjs +++ b/src/tool/DevTool.mjs @@ -1,21 +1,21 @@ /** - * @typedef {"Hidden" | "Logs" | "Inputs" | "Colors"} DevToolType + * @typedef {"Hidden" | "Logs" | "Inputs" | "Colors"} DevTool */ /** - * @type {DevToolType} + * @type {DevTool} */ const Hidden = "Hidden"; /** - * @type {DevToolType} + * @type {DevTool} */ const Logs = "Logs"; /** - * @type {DevToolType} + * @type {DevTool} */ const Inputs = "Inputs"; /** - * @type {DevToolType} + * @type {DevTool} */ const Colors = "Colors"; @@ -26,8 +26,8 @@ const DevTool = Object.freeze({ Colors, /** - * @param {DevToolType} from - * @param {DevToolType} to + * @param {DevTool} from + * @param {DevTool} to * @returns {boolean} */ shouldResize: (from, to) => { @@ -35,8 +35,8 @@ const DevTool = Object.freeze({ }, /** - * @param {DevToolType} from - * @returns {DevToolType} + * @param {DevTool} from + * @returns {DevTool} */ getNext: (from) => { switch (from) { diff --git a/src/tool/DevToolPanel.d.ts b/src/tool/DevToolPanel.d.ts deleted file mode 100644 index 42e9329..0000000 --- a/src/tool/DevToolPanel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DevToolType } from "./DevTool.mjs"; - -export interface DevToolPanelProps { - devTool: DevToolType; - logContent: string; - onActivate(devTool: DevToolType): void; -} diff --git a/src/tool/DevToolPanel.mjs b/src/tool/DevToolPanel.mjs index 33001a2..2d3ea50 100644 --- a/src/tool/DevToolPanel.mjs +++ b/src/tool/DevToolPanel.mjs @@ -1,7 +1,3 @@ -/** - * @typedef {import("./DevToolPanel").DevToolPanelProps} DevToolPanelProps - * @typedef {import("./DevTool.mjs").DevToolType} DevToolType - */ import React from "react"; import LogPanel from "./LogPanel.mjs"; import InputController from "./InputController.mjs"; @@ -13,7 +9,15 @@ import * as UI from "../UI.mjs"; const h = React.createElement; /** - * @type {Array<{tool: DevToolType, name: string}>} + * @typedef {{ + * readonly devTool: import("./DevTool.mjs").DevTool; + * readonly logContent: string; + * onActivate(devTool: import("./DevTool.mjs").DevTool): void; + * }} DevToolPanelProps + */ + +/** + * @type {Array<{tool: import("./DevTool.mjs").DevTool, name: string}>} */ const tools = [ { diff --git a/src/tool/InputController.d.ts b/src/tool/InputController.d.ts deleted file mode 100644 index 1189721..0000000 --- a/src/tool/InputController.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export {}; - -declare global { - var farjsLogKeys: ((msg: string) => void) | undefined; -} diff --git a/src/tool/InputController.mjs b/src/tool/InputController.mjs index 259270a..9613090 100644 --- a/src/tool/InputController.mjs +++ b/src/tool/InputController.mjs @@ -3,10 +3,12 @@ import LogPanel from "./LogPanel.mjs"; const h = React.createElement; +/** @type {{farjsLogKeys: ((msg: string) => void) | undefined}} */ +const g = /** @type {any} */ (global); + const InputController = () => { const { logPanelComp, maxBufferLength } = InputController; const [content, setContent] = useState(""); - const g = global; useLayoutEffect(() => { /** diff --git a/src/tool/LogController.d.ts b/src/tool/LogController.d.ts deleted file mode 100644 index 6d6de2a..0000000 --- a/src/tool/LogController.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import React from "react"; - -export interface LogControllerProps { - onReady(): void; - render(content: string): React.ReactElement | null; -} diff --git a/src/tool/LogController.mjs b/src/tool/LogController.mjs index 459e500..585088a 100644 --- a/src/tool/LogController.mjs +++ b/src/tool/LogController.mjs @@ -1,7 +1,11 @@ +import { useRef, useState, useLayoutEffect } from "react"; + /** - * @typedef {import("./LogController").LogControllerProps} LogControllerProps + * @typedef {{ + * onReady(): void; + * render(content: string): React.ReactElement | null; + * }} LogControllerProps */ -import { useRef, useState, useLayoutEffect } from "react"; /** * @param {LogControllerProps} props diff --git a/src/tool/LogPanel.d.ts b/src/tool/LogPanel.d.ts deleted file mode 100644 index 63a307d..0000000 --- a/src/tool/LogPanel.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface LogPanelProps { - content: string; -} diff --git a/src/tool/LogPanel.mjs b/src/tool/LogPanel.mjs index ed877df..b1f2af4 100644 --- a/src/tool/LogPanel.mjs +++ b/src/tool/LogPanel.mjs @@ -1,13 +1,14 @@ -/** - * @typedef {import("./LogPanel").LogPanelProps} LogPanelProps - */ import React from "react"; const h = React.createElement; /** - * @type {import("blessed").Widgets.Types.TStyle} + * @typedef {{ + * readonly content: string; + * }} LogPanelProps */ + +/** @type {import("@farjs/blessed").Widgets.Types.TStyle} */ const style = { scrollbar: { bg: "cyan", diff --git a/test/Button.test.mjs b/test/Button.test.mjs index 4f7479c..43e5c31 100644 --- a/test/Button.test.mjs +++ b/test/Button.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/Button').ButtonProps} ButtonProps + * @typedef {import("../src/Button.mjs").ButtonProps} ButtonProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ButtonsPanel.test.mjs b/test/ButtonsPanel.test.mjs index 3c4e188..40403c5 100644 --- a/test/ButtonsPanel.test.mjs +++ b/test/ButtonsPanel.test.mjs @@ -1,6 +1,6 @@ /** - * @typedef {import("../src/ButtonsPanel").ButtonsPanelAction} ButtonsPanelAction - * @typedef {import("../src/ButtonsPanel").ButtonsPanelProps} ButtonsPanelProps + * @typedef {import("../src/ButtonsPanel.mjs").ButtonsPanelAction} ButtonsPanelAction + * @typedef {import("../src/ButtonsPanel.mjs").ButtonsPanelProps} ButtonsPanelProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/CheckBox.test.mjs b/test/CheckBox.test.mjs index a026a8a..f3d932b 100644 --- a/test/CheckBox.test.mjs +++ b/test/CheckBox.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/CheckBox').CheckBoxProps} CheckBoxProps + * @typedef {import("../src/CheckBox.mjs").CheckBoxProps} CheckBoxProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ComboBox.test.mjs b/test/ComboBox.test.mjs index 6bb6abe..9638763 100644 --- a/test/ComboBox.test.mjs +++ b/test/ComboBox.test.mjs @@ -1,8 +1,8 @@ /** * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg} IKeyEventArg - * @typedef {import("../src/TextInput").TextInputState} TextInputState - * @typedef {import("../src/TextInput").TextInputProps} TextInputProps - * @typedef {import('../src/ComboBox').ComboBoxProps} ComboBoxProps + * @typedef {import("../src/TextInput.mjs").TextInputState} TextInputState + * @typedef {import("../src/TextInput.mjs").TextInputProps} TextInputProps + * @typedef {import("../src/ComboBox.mjs").ComboBoxProps} ComboBoxProps */ import { setTimeout } from "node:timers/promises"; import React from "react"; diff --git a/test/ComboBoxPopup.test.mjs b/test/ComboBoxPopup.test.mjs index d820b55..a269821 100644 --- a/test/ComboBoxPopup.test.mjs +++ b/test/ComboBoxPopup.test.mjs @@ -1,6 +1,6 @@ /** - * @typedef {import('../src/ListViewport').ListViewport} ListViewport - * @typedef {import('../src/ComboBoxPopup').ComboBoxPopupProps} ComboBoxPopupProps + * @typedef {import("../src/ListViewport.mjs").ListViewport} ListViewport + * @typedef {import("../src/ComboBoxPopup.mjs").ComboBoxPopupProps} ComboBoxPopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ListBox.test.mjs b/test/ListBox.test.mjs index fef01dd..1ff82e7 100644 --- a/test/ListBox.test.mjs +++ b/test/ListBox.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/ListBox').ListBoxProps} ListBoxProps + * @typedef {import("../src/ListBox.mjs").ListBoxProps} ListBoxProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ListView.test.mjs b/test/ListView.test.mjs index 79785b7..7dc85ba 100644 --- a/test/ListView.test.mjs +++ b/test/ListView.test.mjs @@ -1,8 +1,8 @@ /** * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement * @typedef {import("@farjs/blessed").Widgets.Events.IMouseEventArg} MouseEvent - * @typedef {import('../src/ListViewport').ListViewport} ListViewport - * @typedef {import('../src/ListView').ListViewProps} ListViewProps + * @typedef {import("../src/ListViewport.mjs").ListViewport} ListViewport + * @typedef {import("../src/ListView.mjs").ListViewProps} ListViewProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ListViewport.test.mjs b/test/ListViewport.test.mjs index 61604aa..d2d485c 100644 --- a/test/ListViewport.test.mjs +++ b/test/ListViewport.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../src/ListViewport").ListViewport} ListViewport + * @typedef {import("../src/ListViewport.mjs").ListViewport} ListViewport */ import assert from "node:assert/strict"; import { createListViewport } from "../src/ListViewport.mjs"; diff --git a/test/ProgressBar.test.mjs b/test/ProgressBar.test.mjs index 1db02d5..3a0b1c6 100644 --- a/test/ProgressBar.test.mjs +++ b/test/ProgressBar.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/ProgressBar').ProgressBarProps} ProgressBarProps + * @typedef {import("../src/ProgressBar.mjs").ProgressBarProps} ProgressBarProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/ScrollBar.test.mjs b/test/ScrollBar.test.mjs index bfadf49..338ec41 100644 --- a/test/ScrollBar.test.mjs +++ b/test/ScrollBar.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/ScrollBar').ScrollBarProps} ScrollBarProps + * @typedef {import("../src/ScrollBar.mjs").ScrollBarProps} ScrollBarProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/TextBox.test.mjs b/test/TextBox.test.mjs index ba8cd9c..d442e27 100644 --- a/test/TextBox.test.mjs +++ b/test/TextBox.test.mjs @@ -1,6 +1,6 @@ /** - * @typedef {import("../src/TextInput").TextInputProps} TextInputProps - * @typedef {import('../src/TextBox').TextBoxProps} TextBoxProps + * @typedef {import("../src/TextInput.mjs").TextInputProps} TextInputProps + * @typedef {import("../src/TextBox.mjs").TextBoxProps} TextBoxProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/TextInput.test.mjs b/test/TextInput.test.mjs index 245b001..ffba408 100644 --- a/test/TextInput.test.mjs +++ b/test/TextInput.test.mjs @@ -3,8 +3,8 @@ * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg & { * defaultPrevented?: boolean * }} IKeyEventArg - * @typedef {import('../src/TextInput').TextInputProps} TextInputProps - * @typedef {import('../src/TextInput').TextInputState} TextInputState + * @typedef {import("../src/TextInput.mjs").TextInputProps} TextInputProps + * @typedef {import("../src/TextInput.mjs").TextInputState} TextInputState */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/TextLine.test.mjs b/test/TextLine.test.mjs index c37979c..1d92908 100644 --- a/test/TextLine.test.mjs +++ b/test/TextLine.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/TextLine').TextLineProps} TextLineProps + * @typedef {import("../src/TextLine.mjs").TextLineProps} TextLineProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/UiString.test.mjs b/test/UiString.test.mjs index e7e0fd1..2c37287 100644 --- a/test/UiString.test.mjs +++ b/test/UiString.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/UiString').UiCharStartPos} UiCharStartPos + * @typedef {import("../src/UiString.mjs").UiCharStartPos} UiCharStartPos */ import Blessed from "@farjs/blessed"; import assert from "node:assert/strict"; diff --git a/test/WithSize.test.mjs b/test/WithSize.test.mjs index 9be6e96..7683713 100644 --- a/test/WithSize.test.mjs +++ b/test/WithSize.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../src/WithSize').WithSizeProps} WithSizeProps + * @typedef {import("../src/WithSize.mjs").WithSizeProps} WithSizeProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/app/AppRoot.test.mjs b/test/app/AppRoot.test.mjs index 8e9b7eb..e104591 100644 --- a/test/app/AppRoot.test.mjs +++ b/test/app/AppRoot.test.mjs @@ -1,8 +1,8 @@ /** - * @typedef {import("../../src/theme/Theme").ThemeType} ThemeType - * @typedef {import("../../src/tool/DevTool.mjs").DevToolType} DevToolType - * @typedef {import("../../src/app/AppRoot").LoadResult} LoadResult - * @typedef {import("../../src/app/AppRoot").AppRootProps} AppRootProps + * @typedef {import("../../src/theme/Theme.mjs").Theme} Theme + * @typedef {import("../../src/tool/DevTool.mjs").DevTool} DevTool + * @typedef {import("../../src/app/AppRoot.mjs").LoadResult} LoadResult + * @typedef {import("../../src/app/AppRoot.mjs").AppRootProps} AppRootProps */ import React from "react"; import TestRenderer from "react-test-renderer"; @@ -266,8 +266,8 @@ describe("AppRoot.test.mjs", () => { /** * @param {(dispatch: (a: any) => void) => Promise} loadMainUi - * @param {DevToolType} initialDevTool - * @param {ThemeType} defaultTheme + * @param {DevTool} initialDevTool + * @param {Theme} defaultTheme * @returns {AppRootProps} */ function getAppRootProps(loadMainUi, initialDevTool, defaultTheme) { @@ -279,10 +279,10 @@ function getAppRootProps(loadMainUi, initialDevTool, defaultTheme) { } /** - * @returns {[React.MutableRefObject, React.FC]} + * @returns {[React.MutableRefObject, React.FC]} */ function getThemeCtxHook() { - /** @type {React.MutableRefObject} */ + /** @type {React.MutableRefObject} */ const ref = React.createRef(); /** * @param {React.PropsWithChildren<{}>} props diff --git a/test/border/DoubleBorder.test.mjs b/test/border/DoubleBorder.test.mjs index fa33c11..75bab8c 100644 --- a/test/border/DoubleBorder.test.mjs +++ b/test/border/DoubleBorder.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/border/DoubleBorder').DoubleBorderProps} DoubleBorderProps + * @typedef {import("../../src/border/DoubleBorder.mjs").DoubleBorderProps} DoubleBorderProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/border/HorizontalLine.test.mjs b/test/border/HorizontalLine.test.mjs index 58f163b..4374c94 100644 --- a/test/border/HorizontalLine.test.mjs +++ b/test/border/HorizontalLine.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/border/HorizontalLine').HorizontalLineProps} HorizontalLineProps + * @typedef {import("../../src/border/HorizontalLine.mjs").HorizontalLineProps} HorizontalLineProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/border/SingleBorder.test.mjs b/test/border/SingleBorder.test.mjs index df97dda..e4e892a 100644 --- a/test/border/SingleBorder.test.mjs +++ b/test/border/SingleBorder.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/border/SingleBorder').SingleBorderProps} SingleBorderProps + * @typedef {import("../../src/border/SingleBorder.mjs").SingleBorderProps} SingleBorderProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/border/VerticalLine.test.mjs b/test/border/VerticalLine.test.mjs index 5119aec..307dbfd 100644 --- a/test/border/VerticalLine.test.mjs +++ b/test/border/VerticalLine.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/border/VerticalLine').VerticalLineProps} VerticalLineProps + * @typedef {import("../../src/border/VerticalLine.mjs").VerticalLineProps} VerticalLineProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/menu/BottomMenu.test.mjs b/test/menu/BottomMenu.test.mjs index 084bfb3..6e013e6 100644 --- a/test/menu/BottomMenu.test.mjs +++ b/test/menu/BottomMenu.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/menu/BottomMenu").BottomMenuProps} BottomMenuProps + * @typedef {import("../../src/menu/BottomMenu.mjs").BottomMenuProps} BottomMenuProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/menu/BottomMenuView.test.mjs b/test/menu/BottomMenuView.test.mjs index 2773bb9..b8eee0c 100644 --- a/test/menu/BottomMenuView.test.mjs +++ b/test/menu/BottomMenuView.test.mjs @@ -1,6 +1,6 @@ /** * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg} IKeyEventArg - * @typedef {import("../../src/menu/BottomMenuView").BottomMenuViewProps} BottomMenuViewProps + * @typedef {import("../../src/menu/BottomMenuView.mjs").BottomMenuViewProps} BottomMenuViewProps * @typedef {import("../../src/menu/BottomMenuView.mjs").BottomMenuViewItem} BottomMenuViewItem */ import React from "react"; diff --git a/test/menu/MenuBar.test.mjs b/test/menu/MenuBar.test.mjs index f3c99da..a3e1f09 100644 --- a/test/menu/MenuBar.test.mjs +++ b/test/menu/MenuBar.test.mjs @@ -1,8 +1,8 @@ /** * @typedef {import("@farjs/blessed").Widgets.Events.IKeyEventArg} IKeyEventArg - * @typedef {import("../../src/popup/Popup").PopupProps} PopupProps - * @typedef {import("../../src/menu/MenuBar").MenuBarItem} MenuBarItem - * @typedef {import("../../src/menu/MenuBar").MenuBarProps} MenuBarProps + * @typedef {import("../../src/popup/Popup.mjs").PopupProps} PopupProps + * @typedef {import("../../src/menu/MenuBar.mjs").MenuBarItem} MenuBarItem + * @typedef {import("../../src/menu/MenuBar.mjs").MenuBarProps} MenuBarProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/menu/MenuPopup.test.mjs b/test/menu/MenuPopup.test.mjs index 3c0ace6..711daf8 100644 --- a/test/menu/MenuPopup.test.mjs +++ b/test/menu/MenuPopup.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/menu/MenuPopup").MenuPopupProps} MenuPopupProps + * @typedef {import("../../src/menu/MenuPopup.mjs").MenuPopupProps} MenuPopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/menu/SubMenu.test.mjs b/test/menu/SubMenu.test.mjs index 8989958..73820c4 100644 --- a/test/menu/SubMenu.test.mjs +++ b/test/menu/SubMenu.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/menu/SubMenu").SubMenuProps} SubMenuProps + * @typedef {import("../../src/menu/SubMenu.mjs").SubMenuProps} SubMenuProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/ListPopup.test.mjs b/test/popup/ListPopup.test.mjs index b0610a3..ba7b79d 100644 --- a/test/popup/ListPopup.test.mjs +++ b/test/popup/ListPopup.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/popup/ListPopup').ListPopupProps} ListPopupProps + * @typedef {import("../../src/popup/ListPopup.mjs").ListPopupProps} ListPopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/MessageBox.test.mjs b/test/popup/MessageBox.test.mjs index ef2dbd5..d68cf25 100644 --- a/test/popup/MessageBox.test.mjs +++ b/test/popup/MessageBox.test.mjs @@ -1,7 +1,7 @@ /** - * @typedef {import("../../src/popup/Popup").PopupProps} PopupProps - * @typedef {import("../../src/ButtonsPanel").ButtonsPanelProps} ButtonsPanelProps - * @typedef {import('../../src/popup/MessageBox').MessageBoxProps} MessageBoxProps + * @typedef {import("../../src/popup/Popup.mjs").PopupProps} PopupProps + * @typedef {import("../../src/ButtonsPanel.mjs").ButtonsPanelProps} ButtonsPanelProps + * @typedef {import("../../src/popup/MessageBox.mjs").MessageBoxProps} MessageBoxProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/Modal.test.mjs b/test/popup/Modal.test.mjs index ba33361..3cc15ba 100644 --- a/test/popup/Modal.test.mjs +++ b/test/popup/Modal.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/popup/Modal').ModalProps} ModalProps + * @typedef {import("../../src/popup/Modal.mjs").ModalProps} ModalProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/ModalContent.test.mjs b/test/popup/ModalContent.test.mjs index 8322938..0d9074f 100644 --- a/test/popup/ModalContent.test.mjs +++ b/test/popup/ModalContent.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/popup/ModalContent').ModalContentProps} ModalContentProps + * @typedef {import("../../src/popup/ModalContent.mjs").ModalContentProps} ModalContentProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/Popup.test.mjs b/test/popup/Popup.test.mjs index 862c0f6..868c831 100644 --- a/test/popup/Popup.test.mjs +++ b/test/popup/Popup.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/popup/Popup').PopupProps} PopupProps + * @typedef {import("../../src/popup/Popup.mjs").PopupProps} PopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/PopupOverlay.test.mjs b/test/popup/PopupOverlay.test.mjs index 794fc70..ad25e0e 100644 --- a/test/popup/PopupOverlay.test.mjs +++ b/test/popup/PopupOverlay.test.mjs @@ -1,5 +1,4 @@ /** - * @typedef {import('../../src/popup/Popup').PopupProps} PopupProps * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement * @typedef {import("@farjs/blessed").Widgets.FormElement & { * focusFirst(): void, @@ -9,6 +8,7 @@ * full: string, * defaultPrevented?: boolean * }} IKeyEventArg + * @typedef {import("../../src/popup/Popup.mjs").PopupProps} PopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/popup/StatusPopup.test.mjs b/test/popup/StatusPopup.test.mjs index 54f16cd..46c78fe 100644 --- a/test/popup/StatusPopup.test.mjs +++ b/test/popup/StatusPopup.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/popup/StatusPopup').StatusPopupProps} StatusPopupProps + * @typedef {import("../../src/popup/StatusPopup.mjs").StatusPopupProps} StatusPopupProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/portal/WithPortals.test.mjs b/test/portal/WithPortals.test.mjs index 0ca2b3a..04187a3 100644 --- a/test/portal/WithPortals.test.mjs +++ b/test/portal/WithPortals.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/portal/WithPortals").WithPortalsContext} WithPortalsContext + * @typedef {import("../../src/portal/WithPortals.mjs").WithPortalsContext} WithPortalsContext * @typedef {import("../../src/portal/Portal.mjs").PortalContext} PortalContext * @typedef {import("@farjs/blessed").Widgets.Screen} BlessedScreen * @typedef {import("@farjs/blessed").Widgets.BlessedElement} BlessedElement diff --git a/test/task/TaskManager.test.mjs b/test/task/TaskManager.test.mjs index 8b75f75..3ae7368 100644 --- a/test/task/TaskManager.test.mjs +++ b/test/task/TaskManager.test.mjs @@ -1,7 +1,7 @@ /** - * @typedef {import("../../src/task/Task").Task} Task - * @typedef {import("../../src/task/TaskManager").TaskManagerProps} TaskManagerProps - * @typedef {import("../../src/task/TaskManagerUi").TaskManagerUiProps} TaskManagerUiProps + * @typedef {import("../../src/task/Task.mjs").Task} Task + * @typedef {import("../../src/task/TaskManager.mjs").TaskManagerProps} TaskManagerProps + * @typedef {import("../../src/task/TaskManagerUi.mjs").TaskManagerUiProps} TaskManagerUiProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/task/TaskManagerUi.test.mjs b/test/task/TaskManagerUi.test.mjs index 82c3da5..322134e 100644 --- a/test/task/TaskManagerUi.test.mjs +++ b/test/task/TaskManagerUi.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/task/TaskManagerUi").TaskManagerUiProps} TaskManagerUiProps + * @typedef {import("../../src/task/TaskManagerUi.mjs").TaskManagerUiProps} TaskManagerUiProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/task/TaskReducer.test.mjs b/test/task/TaskReducer.test.mjs index 1c32934..e19fc42 100644 --- a/test/task/TaskReducer.test.mjs +++ b/test/task/TaskReducer.test.mjs @@ -1,5 +1,6 @@ import assert from "node:assert/strict"; import Task from "../../src/task/Task.mjs"; +import TaskAction from "../../src/task/TaskAction.mjs"; import TaskReducer from "../../src/task/TaskReducer.mjs"; const { describe, it } = await (async () => { @@ -14,11 +15,8 @@ const { describe, it } = await (async () => { describe("TaskReducer.test.mjs", () => { it("should return task from action if TaskAction", () => { //given - const task = Task("test task", Promise.resolve()); - const taskAction = { - name: "test_name", - task: Task("test task action", Promise.resolve()), - }; + const task = Task("current test task", Promise.resolve()); + const taskAction = TaskAction(Task("new task action", Promise.resolve())); //when & then assert.deepEqual(TaskReducer(task, taskAction), taskAction.task); diff --git a/test/theme/withThemeContext.mjs b/test/theme/withThemeContext.mjs index abc5c75..0cd5724 100644 --- a/test/theme/withThemeContext.mjs +++ b/test/theme/withThemeContext.mjs @@ -1,6 +1,6 @@ /** * @typedef {import("react").ReactElement} ReactElement - * @typedef {import("../../src/theme/Theme").ThemeType} ThemeType + * @typedef {import("../../src/theme/Theme.mjs").Theme} Theme */ import React from "react"; import Theme from "../../src/theme/Theme.mjs"; @@ -10,7 +10,7 @@ const h = React.createElement; /** * @param {ReactElement} element - * @param {ThemeType} theme + * @param {Theme} theme * @returns {ReactElement} */ const withThemeContext = (element, theme = DefaultTheme) => { diff --git a/test/tool/DevToolPanel.test.mjs b/test/tool/DevToolPanel.test.mjs index cb56e0f..cb4b40f 100644 --- a/test/tool/DevToolPanel.test.mjs +++ b/test/tool/DevToolPanel.test.mjs @@ -1,7 +1,7 @@ /** - * @typedef {import("../../src/tool/DevToolPanel").DevToolPanelProps} DevToolPanelProps - * @typedef {import("../../src/tool/DevTool.mjs").DevToolType} DevToolType - * @typedef {import("../../src/theme/Theme.mjs").ThemeType} ThemeType + * @typedef {import("../../src/tool/DevToolPanel.mjs").DevToolPanelProps} DevToolPanelProps + * @typedef {import("../../src/tool/DevTool.mjs").DevTool} DevTool + * @typedef {import("../../src/theme/Theme.mjs").Theme} Theme */ import React from "react"; import TestRenderer from "react-test-renderer"; @@ -123,9 +123,9 @@ describe("DevToolPanel.test.mjs", () => { }); /** - * @param {DevToolType} devTool + * @param {DevTool} devTool * @param {string} logContent - * @param {(devTool: DevToolType) => void} onActivate + * @param {(devTool: DevTool) => void} onActivate * @returns {DevToolPanelProps} */ function getDevToolPanelProps(devTool, logContent, onActivate = (_) => {}) { @@ -165,7 +165,7 @@ const expectedTabs = [ * @param {TestRenderer.ReactTestRenderer} renderer * @param {string} activeTab * @param {React.ReactElement | null} expectedComp - * @param {ThemeType} currTheme + * @param {Theme} currTheme */ function assertDevToolPanel( renderer, diff --git a/test/tool/InputController.test.mjs b/test/tool/InputController.test.mjs index 43f80e4..8adb703 100644 --- a/test/tool/InputController.test.mjs +++ b/test/tool/InputController.test.mjs @@ -19,7 +19,9 @@ const { describe, it } = await (async () => { InputController.logPanelComp = mockComponent(LogPanel); InputController.maxBufferLength = 10; const { logPanelComp } = InputController; -const g = global; + +/** @type {{farjsLogKeys: ((msg: string) => void) | undefined}} */ +const g = /** @type {any} */ (global); /** * @param {string} msg diff --git a/test/tool/LogController.test.mjs b/test/tool/LogController.test.mjs index a5e5670..c46881e 100644 --- a/test/tool/LogController.test.mjs +++ b/test/tool/LogController.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import("../../src/tool/LogController").LogControllerProps} LogControllerProps + * @typedef {import("../../src/tool/LogController.mjs").LogControllerProps} LogControllerProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/tool/LogPanel.test.mjs b/test/tool/LogPanel.test.mjs index e695e54..c1c567c 100644 --- a/test/tool/LogPanel.test.mjs +++ b/test/tool/LogPanel.test.mjs @@ -1,5 +1,5 @@ /** - * @typedef {import('../../src/tool/LogPanel').LogPanelProps} LogPanelProps + * @typedef {import("../../src/tool/LogPanel.mjs").LogPanelProps} LogPanelProps */ import React from "react"; import TestRenderer from "react-test-renderer"; diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..d92c368 --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "include": ["./**/*.mjs", "../types/**/*.mts"], + "compilerOptions": { + "noEmit": true, + "declaration": false, + "emitDeclarationOnly": false + } +} diff --git a/tsconfig.json b/tsconfig.json index 1aa50e7..a5116ee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs - // "include": ["**/*.mjs"], + "include": ["./src/**/*.mjs"], "compilerOptions": { "module": "node16", //got from here: https://stackoverflow.com/questions/61305578/what-typescript-configuration-produces-output-closest-to-node-js-14-capabilities/61305579#61305579 @@ -10,7 +10,7 @@ "checkJs": true, "importHelpers": true, // output .d.ts declaration files for consumers - // "declaration": true, + "declaration": true, // output .js.map sourcemap files for consumers // "sourceMap": true, // match output dir to input dir. e.g. dist/index instead of dist/src/index @@ -25,7 +25,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, // use Node's module resolution algorithm, instead of the legacy TS one - "moduleResolution": "node", + //"moduleResolution": "node", // transpile JSX to React.createElement // "jsx": "react", // interop between ESM and CJS modules. Recommended by TS @@ -34,7 +34,8 @@ "skipLibCheck": true, // error out if import and file system have a casing mismatch. Recommended by TS "forceConsistentCasingInFileNames": true, - "noEmit": true - // "emitDeclarationOnly": true, + //"noEmit": true, + "emitDeclarationOnly": true, + "outDir": "./types" } } diff --git a/types/Button.d.mts b/types/Button.d.mts new file mode 100644 index 0000000..ad9b6a3 --- /dev/null +++ b/types/Button.d.mts @@ -0,0 +1,37 @@ +export default Button; +export type ButtonProps = { + readonly left: number; + readonly top: number; + readonly label: string; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + onPress(): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly label: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onPress(): void; + * }} ButtonProps + */ +/** + * @param {ButtonProps} props + */ +declare function Button(props: ButtonProps): React.DetailedReactHTMLElement<{ + mouse: boolean; + tags: boolean; + wrap: boolean; + width: number; + height: number; + left: number; + top: number; + onPress: () => void; + onFocus: () => void; + onBlur: () => void; + content: string; +}, HTMLElement>; +declare namespace Button { + const displayName: string; +} +import React from "react"; diff --git a/types/ButtonsPanel.d.mts b/types/ButtonsPanel.d.mts new file mode 100644 index 0000000..502efc3 --- /dev/null +++ b/types/ButtonsPanel.d.mts @@ -0,0 +1,43 @@ +export default ButtonsPanel; +export type ButtonsPanelAction = { + readonly label: string; + onAction(): void; +}; +export type ButtonsPanelProps = { + readonly top: number; + readonly actions: ButtonsPanelAction[]; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly padding?: number; + readonly margin?: number; +}; +/** + * @typedef {{ + * readonly label: string; + * onAction(): void; + * }} ButtonsPanelAction + */ +/** + * @typedef {{ + * readonly top: number; + * readonly actions: ButtonsPanelAction[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly padding?: number; + * readonly margin?: number; + * }} ButtonsPanelProps + */ +/** + * @param {ButtonsPanelProps} props + */ +declare function ButtonsPanel(props: ButtonsPanelProps): React.ReactElement<{ + width: number; + height: number; + left: string; + top: number; + style: import("blessed").Widgets.Types.TStyle; +}, string | React.JSXElementConstructor>; +declare namespace ButtonsPanel { + export const displayName: string; + export { Button as buttonComp }; +} +import React from "react"; +import Button from "./Button.mjs"; diff --git a/types/CheckBox.d.mts b/types/CheckBox.d.mts new file mode 100644 index 0000000..d8f52df --- /dev/null +++ b/types/CheckBox.d.mts @@ -0,0 +1,29 @@ +export default CheckBox; +export type CheckBoxProps = { + readonly left: number; + readonly top: number; + readonly value: boolean; + readonly label: string; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + onChange(): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly value: boolean; + * readonly label: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onChange(): void; + * }} CheckBoxProps + */ +/** + * @param {CheckBoxProps} props + */ +declare function CheckBox(props: CheckBoxProps): React.FunctionComponentElement<{}>; +declare namespace CheckBox { + export const displayName: string; + export { Button as buttonComp }; +} +import React from "react"; +import Button from "./Button.mjs"; diff --git a/types/ComboBox.d.mts b/types/ComboBox.d.mts new file mode 100644 index 0000000..60e386b --- /dev/null +++ b/types/ComboBox.d.mts @@ -0,0 +1,38 @@ +export default ComboBox; +export type BlessedProgram = import("@farjs/blessed").BlessedProgram; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type ListViewport = import("./ListViewport.mjs").ListViewport; +export type TextInputState = import("./TextInput.mjs").TextInputState; +export type ComboBoxProps = { + readonly left: number; + readonly top: number; + readonly width: number; + readonly items: string[]; + readonly value: string; + onChange(value: string): void; + onEnter?(): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly items: string[]; + * readonly value: string; + * onChange(value: string): void; + * onEnter?(): void; + * }} ComboBoxProps + */ +/** + * @param {ComboBoxProps} props + */ +declare function ComboBox(props: ComboBoxProps): React.FunctionComponentElement<{}>; +declare namespace ComboBox { + export const displayName: string; + export { TextInput as textInputComp }; + export { ComboBoxPopup as comboBoxPopup }; + export const arrowDownCh: string; +} +import React from "react"; +import TextInput from "./TextInput.mjs"; +import ComboBoxPopup from "./ComboBoxPopup.mjs"; diff --git a/types/ComboBoxPopup.d.mts b/types/ComboBoxPopup.d.mts new file mode 100644 index 0000000..6c76987 --- /dev/null +++ b/types/ComboBoxPopup.d.mts @@ -0,0 +1,49 @@ +export default ComboBoxPopup; +export type ListViewport = import("./ListViewport.mjs").ListViewport; +export type ComboBoxPopupProps = { + readonly left: number; + readonly top: number; + readonly width: number; + readonly items: string[]; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly viewport: ListViewport; + setViewport(viewport: ListViewport): void; + onClick(index: number): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly items: string[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly viewport: ListViewport; + * setViewport(viewport: ListViewport): void; + * onClick(index: number): void; + * }} ComboBoxPopupProps + */ +/** + * @param {ComboBoxPopupProps} props + */ +declare function ComboBoxPopup(props: ComboBoxPopupProps): React.ReactElement<{ + clickable: boolean; + autoFocus: boolean; + width: number; + height: number; + left: number; + top: number; + onWheelup: () => void; + onWheeldown: () => void; + style: import("blessed").Widgets.Types.TStyle; +}, string | React.JSXElementConstructor>; +declare namespace ComboBoxPopup { + export const displayName: string; + export { SingleBorder as singleBorderComp }; + export { ListView as listViewComp }; + export { ScrollBar as scrollBarComp }; + export const maxItems: number; +} +import React from "react"; +import SingleBorder from "./border/SingleBorder.mjs"; +import ListView from "./ListView.mjs"; +import ScrollBar from "./ScrollBar.mjs"; diff --git a/types/ListBox.d.mts b/types/ListBox.d.mts new file mode 100644 index 0000000..1c8972c --- /dev/null +++ b/types/ListBox.d.mts @@ -0,0 +1,44 @@ +export default ListBox; +export type IKeyEventArg = import("@farjs/blessed").Widgets.Events.IKeyEventArg; +export type ListBoxProps = { + readonly left: number; + readonly top: number; + readonly width: number; + readonly height: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly items: string[]; + readonly selected: number; + onAction(index: number): void; + onSelect?(index: number): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly items: string[]; + * readonly selected: number; + * onAction(index: number): void; + * onSelect?(index: number): void; + * }} ListBoxProps + */ +/** + * @param {ListBoxProps} props + */ +declare function ListBox(props: ListBoxProps): React.ReactElement<{ + left: number; + top: number; + width: number; + height: number; + onKeypress: (ch: any, key: IKeyEventArg) => void; +}, string | React.JSXElementConstructor>; +declare namespace ListBox { + export const displayName: string; + export { ListView as listViewComp }; + export { ScrollBar as scrollBarComp }; +} +import React from "react"; +import ListView from "./ListView.mjs"; +import ScrollBar from "./ScrollBar.mjs"; diff --git a/types/ListView.d.mts b/types/ListView.d.mts new file mode 100644 index 0000000..62f07f4 --- /dev/null +++ b/types/ListView.d.mts @@ -0,0 +1,40 @@ +export default ListView; +export type ListViewProps = { + readonly left: number; + readonly top: number; + readonly width: number; + readonly height: number; + readonly items: string[]; + readonly style: BlessedStyle; + readonly viewport: ListViewport; + setViewport(viewport: ListViewport): void; + onClick(index: number): void; +}; +export type BlessedStyle = import("@farjs/blessed").Widgets.Types.TStyle; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type MouseEvent = import("@farjs/blessed").Widgets.Events.IMouseEventArg; +export type ListViewport = import("./ListViewport.mjs").ListViewport; +/** + * @param {ListViewProps} props + */ +declare function ListView(props: ListViewProps): React.ReactElement<{ + ref: React.MutableRefObject; + clickable: boolean; + mouse: boolean; + autoFocus: boolean; + left: number; + top: number; + width: number; + height: number; + style: import("blessed").Widgets.Types.TStyle; + tags: boolean; + wrap: boolean; + content: string; + onWheelup: () => void; + onWheeldown: () => void; + onClick: (data: MouseEvent) => void; +}, string | React.JSXElementConstructor>; +declare namespace ListView { + const displayName: string; +} +import React from "react"; diff --git a/types/ListViewport.d.mts b/types/ListViewport.d.mts new file mode 100644 index 0000000..66988f7 --- /dev/null +++ b/types/ListViewport.d.mts @@ -0,0 +1,22 @@ +/** + * @param {number} index + * @param {number} length + * @param {number} viewLength + * @returns {ListViewport} + */ +export function createListViewport(index: number, length: number, viewLength: number): ListViewport; +export type ListViewport = { + readonly offset: number; + readonly focused: number; + readonly length: number; + readonly viewLength: number; + updated(offset: number, focused?: number): ListViewport; + down(): ListViewport; + up(): ListViewport; + pagedown(): ListViewport; + pageup(): ListViewport; + end(): ListViewport; + home(): ListViewport; + onKeypress(keyFull: string): ListViewport | undefined; + resize(viewLength: number): ListViewport; +}; diff --git a/types/ProgressBar.d.mts b/types/ProgressBar.d.mts new file mode 100644 index 0000000..c7f1e04 --- /dev/null +++ b/types/ProgressBar.d.mts @@ -0,0 +1,34 @@ +export default ProgressBar; +export type ProgressBarProps = { + readonly percent: number; + readonly left: number; + readonly top: number; + readonly length: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; +}; +/** + * @typedef {{ + * readonly percent: number; + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} ProgressBarProps + */ +/** + * @param {ProgressBarProps} props + */ +declare function ProgressBar(props: ProgressBarProps): React.ReactElement<{ + width: number; + height: number; + left: number; + top: number; + style: import("blessed").Widgets.Types.TStyle; + content: string; +}, string | React.JSXElementConstructor>; +declare namespace ProgressBar { + const displayName: string; + const filledCh: string; + const dottedCh: string; +} +import React from "react"; diff --git a/types/ScrollBar.d.mts b/types/ScrollBar.d.mts new file mode 100644 index 0000000..e343f1a --- /dev/null +++ b/types/ScrollBar.d.mts @@ -0,0 +1,37 @@ +export default ScrollBar; +export type ScrollBarProps = { + readonly left: number; + readonly top: number; + readonly length: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly value: number; + readonly extent: number; + readonly min: number; + readonly max: number; + onChange(value: number): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly value: number; + * readonly extent: number; + * readonly min: number; + * readonly max: number; + * onChange(value: number): void; + * }} ScrollBarProps + */ +/** + * @param {ScrollBarProps} props + */ +declare function ScrollBar(props: ScrollBarProps): React.FunctionComponentElement<{}>; +declare namespace ScrollBar { + const displayName: string; + const markerCh: string; + const scrollCh: string; + const upArrowCh: string; + const downArrowCh: string; +} +import React from "react"; diff --git a/types/TextAlign.d.mts b/types/TextAlign.d.mts new file mode 100644 index 0000000..ff87782 --- /dev/null +++ b/types/TextAlign.d.mts @@ -0,0 +1,7 @@ +export default TextAlign; +export type TextAlign = "left" | "right" | "center"; +declare const TextAlign: Readonly<{ + left: "left"; + right: "right"; + center: "center"; +}>; diff --git a/types/TextBox.d.mts b/types/TextBox.d.mts new file mode 100644 index 0000000..3a9f0ed --- /dev/null +++ b/types/TextBox.d.mts @@ -0,0 +1,31 @@ +export default TextBox; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type TextInputState = import("./TextInput.mjs").TextInputState; +export type TextBoxProps = { + readonly left: number; + readonly top: number; + readonly width: number; + readonly value: string; + onChange(value: string): void; + onEnter?(): void; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly value: string; + * onChange(value: string): void; + * onEnter?(): void; + * }} TextBoxProps + */ +/** + * @param {TextBoxProps} props + */ +declare function TextBox(props: TextBoxProps): React.FunctionComponentElement; +declare namespace TextBox { + export const displayName: string; + export { TextInput as textInputComp }; +} +import React from "react"; +import TextInput from "./TextInput.mjs"; diff --git a/types/TextInput.d.mts b/types/TextInput.d.mts new file mode 100644 index 0000000..223ef2b --- /dev/null +++ b/types/TextInput.d.mts @@ -0,0 +1,81 @@ +export default TextInput; +export type TextInputProps = { + readonly inputRef: React.MutableRefObject; + readonly left: number; + readonly top: number; + readonly width: number; + readonly value: string; + readonly state: TextInputState; + stateUpdater(update: (state: TextInputState) => TextInputState): void; + onChange(value: string): void; + onEnter?(): void; + onKeypress?(keyFull: string): boolean; +}; +export type TextInputState = { + readonly offset: number; + readonly cursorX: number; + readonly selStart: number; + readonly selEnd: number; +}; +export type TextSelect = "Reset" | "All" | "TillTheHome" | "TillTheEnd" | "ToTheLeft" | "ToTheRight"; +export type EditResult = { + value: string; + cm: CursorMove; +}; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type IKeyEventArg = import("@farjs/blessed").Widgets.Events.IKeyEventArg & { + defaultPrevented?: boolean; +}; +export type MouseEvent = import("@farjs/blessed").Widgets.Events.IMouseEventArg; +export type CursorMove = { + readonly move: "At"; + readonly pos: number; +} | { + readonly move: "Home"; +} | { + readonly move: "End"; +} | { + readonly move: "Left"; + readonly dx?: number; +} | { + readonly move: "Right"; + readonly dx?: number; +}; +export type TextEdit = { + readonly edit: "Insert"; + readonly str: import("./UiString.mjs").UiString; +} | { + readonly edit: "Delete"; +} | { + readonly edit: "Backspace"; +}; +/** + * @param {TextInputProps} props + */ +declare function TextInput(props: TextInputProps): React.ReactElement<{ + ref: React.MutableRefObject; + autoFocus: boolean; + clickable: boolean; + keyable: boolean; + width: number; + height: number; + left: number; + top: number; + style: import("./theme/Theme.mjs").ThemeEffects; + wrap: boolean; + tags: boolean; + content: string; + onClick: (data: MouseEvent) => void; + onResize: () => void; + onFocus: () => void; + onBlur: () => void; + onKeypress: (ch: object | null | undefined, key: IKeyEventArg) => void; +}, string | React.JSXElementConstructor>; +declare namespace TextInput { + const displayName: string; + /** + * @returns {TextInputState} + */ + function createState(): TextInputState; +} +import React from "react"; diff --git a/types/TextLine.d.mts b/types/TextLine.d.mts new file mode 100644 index 0000000..795685d --- /dev/null +++ b/types/TextLine.d.mts @@ -0,0 +1,45 @@ +export default TextLine; +export type TextLineProps = { + readonly align: import("./TextAlign.mjs").TextAlign; + readonly left: number; + readonly top: number; + readonly width: number; + readonly text: string; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly focused?: boolean; + readonly padding?: number; +}; +/** + * @typedef {{ + * readonly align: import("./TextAlign.mjs").TextAlign; + * readonly left: number; + * readonly top: number; + * readonly width: number; + * readonly text: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly focused?: boolean; + * readonly padding?: number; + * }} TextLineProps + */ +/** + * @param {TextLineProps} props + */ +declare function TextLine(props: TextLineProps): React.ReactElement<{ + width: number; + height: number; + left: number; + top: number; + style: import("blessed").Widgets.Types.Effects | undefined; + content: string; +}, string | React.JSXElementConstructor> | null; +declare namespace TextLine { + const displayName: string; + /** + * @param {string} text + * @param {number} width + * @param {number} prefixLen + * @returns {string} + */ + function wrapText(text: string, width: number, prefixLen?: number): string; +} +import React from "react"; diff --git a/types/UI.d.mts b/types/UI.d.mts new file mode 100644 index 0000000..ea11859 --- /dev/null +++ b/types/UI.d.mts @@ -0,0 +1,20 @@ +/** + * @param {import("@farjs/blessed").Widgets.Types.TStyle | undefined} style + * @param {string} text + * @returns {string} + */ +export function renderText2(style: import("@farjs/blessed").Widgets.Types.TStyle | undefined, text: string): string; +/** + * @param {boolean} isBold + * @param {string} fgColor + * @param {string} bgColor + * @param {string} text + * @returns {string} + */ +export function renderText(isBold: boolean, fgColor: string, bgColor: string, text: string): string; +/** + * @param {string} text + * @param {number} maxLen + * @returns {string[]} + */ +export function splitText(text: string, maxLen: number): string[]; diff --git a/types/UiString.d.mts b/types/UiString.d.mts new file mode 100644 index 0000000..33c5c23 --- /dev/null +++ b/types/UiString.d.mts @@ -0,0 +1,34 @@ +export default UiString; +export type UiCharStartPos = { + readonly lcw: number; + readonly pos: number; + readonly rcw: number; +}; +export type UiString = { + strWidth(): number; + toString(): string; + charStartPos(from: number): UiCharStartPos; + slice(from: number, until: number): string; + ensureWidth(width: number, padCh: string): string; +}; +/** + * @typedef {{ + * readonly lcw: number; + * readonly pos: number; + * readonly rcw: number; + * }} UiCharStartPos + */ +/** + * @typedef {{ + * strWidth(): number; + * toString(): string; + * charStartPos(from: number): UiCharStartPos; + * slice(from: number, until: number): string; + * ensureWidth(width: number, padCh: string): string; + * }} UiString + */ +/** + * @param {string} str + * @returns {UiString} + */ +declare function UiString(str: string): UiString; diff --git a/types/WithSize.d.mts b/types/WithSize.d.mts new file mode 100644 index 0000000..c25eca3 --- /dev/null +++ b/types/WithSize.d.mts @@ -0,0 +1,22 @@ +export default WithSize; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type WithSizeProps = { + render(width: number, height: number): React.ReactElement | null; +}; +/** + * @typedef {{ + * render(width: number, height: number): React.ReactElement | null; + * }} WithSizeProps + */ +/** + * @param {WithSizeProps} props + */ +declare function WithSize(props: WithSizeProps): React.ReactElement<{ + ref: React.MutableRefObject; + style: import("blessed").Widgets.Types.TStyle; + onResize: () => void; +}, string | React.JSXElementConstructor>; +declare namespace WithSize { + const displayName: string; +} +import React from "react"; diff --git a/types/app/AppRoot.d.mts b/types/app/AppRoot.d.mts new file mode 100644 index 0000000..0aa98a1 --- /dev/null +++ b/types/app/AppRoot.d.mts @@ -0,0 +1,49 @@ +export default AppRoot; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type IKeyEventArg = import("@farjs/blessed").Widgets.Events.IKeyEventArg & { + defaultPrevented?: boolean; +}; +export type Theme = import("../theme/Theme.mjs").Theme; +export type DevTool = import("../tool/DevTool.mjs").DevTool; +export type MainUi = React.FC | React.ComponentClass<{}>; +export type LoadResult = { + readonly theme: Theme; + readonly mainUi: MainUi; +}; +export type AppRootProps = { + readonly initialDevTool: DevTool; + readonly defaultTheme: Theme; + loadMainUi(dispatch: (a: any) => void): Promise; +}; +/** + * @typedef {React.FC | React.ComponentClass<{}>} MainUi + */ +/** + * @typedef {{ + * readonly theme: Theme; + * readonly mainUi: MainUi; + * }} LoadResult + */ +/** + * @typedef {{ + * readonly initialDevTool: DevTool; + * readonly defaultTheme: Theme; + * loadMainUi(dispatch: (a: any) => void): Promise; + * }} AppRootProps + */ +/** + * @param {AppRootProps} props + */ +declare function AppRoot(props: AppRootProps): React.FunctionComponentElement>; +declare namespace AppRoot { + export const displayName: string; + export { TaskManager as taskControllerComp }; + export { LogController as logControllerComp }; + export { DevToolPanel as devToolPanelComp }; +} +import React from "react"; +import Theme from "../theme/Theme.mjs"; +import DevTool from "../tool/DevTool.mjs"; +import TaskManager from "../task/TaskManager.mjs"; +import LogController from "../tool/LogController.mjs"; +import DevToolPanel from "../tool/DevToolPanel.mjs"; diff --git a/types/border/DoubleBorder.d.mts b/types/border/DoubleBorder.d.mts new file mode 100644 index 0000000..68a69ab --- /dev/null +++ b/types/border/DoubleBorder.d.mts @@ -0,0 +1,35 @@ +export default DoubleBorder; +export type DoubleBorderProps = { + readonly width: number; + readonly height: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly left?: number; + readonly top?: number; + readonly title?: string; + readonly footer?: string; +}; +/** + * @typedef {{ + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly left?: number; + * readonly top?: number; + * readonly title?: string; + * readonly footer?: string; + * }} DoubleBorderProps + */ +/** + * @param {DoubleBorderProps} props + */ +declare function DoubleBorder(props: DoubleBorderProps): React.FunctionComponentElement<{}>; +declare namespace DoubleBorder { + export const displayName: string; + export { HorizontalLine as horizontalLineComp }; + export { VerticalLine as verticalLineComp }; + export { TextLine as textLineComp }; +} +import React from "react"; +import HorizontalLine from "./HorizontalLine.mjs"; +import VerticalLine from "./VerticalLine.mjs"; +import TextLine from "../TextLine.mjs"; diff --git a/types/border/DoubleChars.d.mts b/types/border/DoubleChars.d.mts new file mode 100644 index 0000000..7b7edec --- /dev/null +++ b/types/border/DoubleChars.d.mts @@ -0,0 +1,20 @@ +export default DoubleChars; +declare const DoubleChars: Readonly<{ + horizontal: "═"; + vertical: "║"; + topLeft: "╔"; + topRight: "╗"; + bottomLeft: "╚"; + bottomRight: "╝"; + top: "╦"; + bottom: "╩"; + left: "╠"; + right: "╣"; + topSingle: "╤"; + bottomSingle: "╧"; + leftSingle: "╟"; + rightSingle: "╢"; + cross: "╬"; + crossSingleVert: "╪"; + crossSingleHoriz: "╫"; +}>; diff --git a/types/border/HorizontalLine.d.mts b/types/border/HorizontalLine.d.mts new file mode 100644 index 0000000..af31872 --- /dev/null +++ b/types/border/HorizontalLine.d.mts @@ -0,0 +1,36 @@ +export default HorizontalLine; +export type HorizontalLineProps = { + readonly left: number; + readonly top: number; + readonly length: number; + readonly lineCh: string; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly startCh?: string; + readonly endCh?: string; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly lineCh: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly startCh?: string; + * readonly endCh?: string; + * }} HorizontalLineProps + */ +/** + * @param {HorizontalLineProps} props + */ +declare function HorizontalLine(props: HorizontalLineProps): React.ReactElement<{ + width: number; + height: number; + left: number; + top: number; + style: import("blessed").Widgets.Types.TStyle; + content: string; +}, string | React.JSXElementConstructor>; +declare namespace HorizontalLine { + const displayName: string; +} +import React from "react"; diff --git a/types/border/SingleBorder.d.mts b/types/border/SingleBorder.d.mts new file mode 100644 index 0000000..f6685a3 --- /dev/null +++ b/types/border/SingleBorder.d.mts @@ -0,0 +1,25 @@ +export default SingleBorder; +export type SingleBorderProps = { + readonly width: number; + readonly height: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; +}; +/** + * @typedef {{ + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} SingleBorderProps + */ +/** + * @param {SingleBorderProps} props + */ +declare function SingleBorder(props: SingleBorderProps): React.FunctionComponentElement<{}>; +declare namespace SingleBorder { + export const displayName: string; + export { HorizontalLine as horizontalLineComp }; + export { VerticalLine as verticalLineComp }; +} +import React from "react"; +import HorizontalLine from "./HorizontalLine.mjs"; +import VerticalLine from "./VerticalLine.mjs"; diff --git a/types/border/SingleChars.d.mts b/types/border/SingleChars.d.mts new file mode 100644 index 0000000..fb834d3 --- /dev/null +++ b/types/border/SingleChars.d.mts @@ -0,0 +1,20 @@ +export default SingleChars; +declare const SingleChars: Readonly<{ + horizontal: "─"; + vertical: "│"; + topLeft: "┌"; + topRight: "┐"; + bottomLeft: "└"; + bottomRight: "┘"; + top: "┬"; + bottom: "┴"; + left: "├"; + right: "┤"; + topDouble: "╥"; + bottomDouble: "╨"; + leftDouble: "╞"; + rightDouble: "╡"; + cross: "┼"; + crossDoubleVert: "╫"; + crossDoubleHoriz: "╪"; +}>; diff --git a/types/border/VerticalLine.d.mts b/types/border/VerticalLine.d.mts new file mode 100644 index 0000000..2373203 --- /dev/null +++ b/types/border/VerticalLine.d.mts @@ -0,0 +1,36 @@ +export default VerticalLine; +export type VerticalLineProps = { + readonly left: number; + readonly top: number; + readonly length: number; + readonly lineCh: string; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly startCh?: string; + readonly endCh?: string; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly top: number; + * readonly length: number; + * readonly lineCh: string; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly startCh?: string; + * readonly endCh?: string; + * }} VerticalLineProps + */ +/** + * @param {VerticalLineProps} props + */ +declare function VerticalLine(props: VerticalLineProps): React.ReactElement<{ + width: number; + height: number; + left: number; + top: number; + style: import("blessed").Widgets.Types.TStyle; + content: string; +}, string | React.JSXElementConstructor>; +declare namespace VerticalLine { + const displayName: string; +} +import React from "react"; diff --git a/types/menu/BottomMenu.d.mts b/types/menu/BottomMenu.d.mts new file mode 100644 index 0000000..e23bf96 --- /dev/null +++ b/types/menu/BottomMenu.d.mts @@ -0,0 +1,21 @@ +export default BottomMenu; +export type BottomMenuProps = { + readonly items: string[]; +}; +/** + * @typedef {{ + * readonly items: string[]; + * }} BottomMenuProps + */ +/** + * @param {BottomMenuProps} props + */ +declare function BottomMenu(props: BottomMenuProps): React.FunctionComponentElement; +declare namespace BottomMenu { + export const displayName: string; + export { WithSize as withSizeComp }; + export { BottomMenuView as bottomMenuViewComp }; +} +import React from "react"; +import WithSize from "../WithSize.mjs"; +import BottomMenuView from "./BottomMenuView.mjs"; diff --git a/types/menu/BottomMenuView.d.mts b/types/menu/BottomMenuView.d.mts new file mode 100644 index 0000000..4f0e65d --- /dev/null +++ b/types/menu/BottomMenuView.d.mts @@ -0,0 +1,33 @@ +export default BottomMenuView; +export type BottomMenuViewProps = { + readonly width: number; + readonly items: string[]; +}; +export type BottomMenuViewItem = { + readonly key: number; + readonly item: string; + readonly pos: number; + readonly textWidth: number; +}; +/** + * @typedef {{ + * readonly width: number; + * readonly items: string[]; + * }} BottomMenuViewProps + */ +/** + * @typedef {{ + * readonly key: number; + * readonly item: string; + * readonly pos: number; + * readonly textWidth: number; + * }} BottomMenuViewItem + */ +/** + * @param {BottomMenuViewProps} props + */ +declare function BottomMenuView(props: BottomMenuViewProps): React.FunctionComponentElement<{}>; +declare namespace BottomMenuView { + const displayName: string; +} +import React from "react"; diff --git a/types/menu/MenuBar.d.mts b/types/menu/MenuBar.d.mts new file mode 100644 index 0000000..349d912 --- /dev/null +++ b/types/menu/MenuBar.d.mts @@ -0,0 +1,48 @@ +export default MenuBar; +export type ButtonsPanelAction = import("../../src/ButtonsPanel.mjs").ButtonsPanelAction; +export type MenuBarItem = { + readonly label: string; + readonly subItems: string[]; +}; +export type MenuBarProps = { + readonly items: MenuBarItem[]; + onAction(menuIndex: number, subIndex: number): void; + onClose(): void; +}; +export type SubMenuState = { + readonly menuIndex: number; + readonly subIndex: number; +}; +/** + * @typedef {{ + * readonly label: string; + * readonly subItems: string[]; + * }} MenuBarItem + */ +/** + * @typedef {{ + * readonly items: MenuBarItem[]; + * onAction(menuIndex: number, subIndex: number): void; + * onClose(): void; + * }} MenuBarProps + */ +/** + * @typedef {{ + * readonly menuIndex: number; + * readonly subIndex: number; + * }} SubMenuState + */ +/** + * @param {MenuBarProps} props + */ +declare function MenuBar(props: MenuBarProps): React.FunctionComponentElement<{}>; +declare namespace MenuBar { + export const displayName: string; + export { Popup as popupComp }; + export { ButtonsPanel as buttonsPanel }; + export { SubMenu as subMenuComp }; +} +import React from "react"; +import Popup from "../popup/Popup.mjs"; +import ButtonsPanel from "../ButtonsPanel.mjs"; +import SubMenu from "./SubMenu.mjs"; diff --git a/types/menu/MenuBarTrigger.d.mts b/types/menu/MenuBarTrigger.d.mts new file mode 100644 index 0000000..ac7778d --- /dev/null +++ b/types/menu/MenuBarTrigger.d.mts @@ -0,0 +1,9 @@ +export default MenuBarTrigger; +/** + * @returns {React.ReactElement} + */ +declare function MenuBarTrigger(): React.ReactElement; +declare namespace MenuBarTrigger { + const displayName: string; +} +import React from "react"; diff --git a/types/menu/MenuPopup.d.mts b/types/menu/MenuPopup.d.mts new file mode 100644 index 0000000..9d854c5 --- /dev/null +++ b/types/menu/MenuPopup.d.mts @@ -0,0 +1,46 @@ +export default MenuPopup; +export type MenuPopupProps = { + readonly title: string; + readonly items: string[]; + getLeft(width: number): string; + onSelect(index: number): void; + onClose(): void; +}; +/** + * @typedef {{ + * readonly title: string; + * readonly items: string[]; + * getLeft(width: number): string; + * onSelect(index: number): void; + * onClose(): void; + * }} MenuPopupProps + */ +/** + * @param {MenuPopupProps} props + */ +declare function MenuPopup(props: MenuPopupProps): React.FunctionComponentElement; +declare namespace MenuPopup { + export const displayName: string; + export { Popup as popupComp }; + export { ModalContent as modalContentComp }; + export { Button as buttonComp }; + export namespace padding { + export { paddingHorizontal as left }; + export { paddingHorizontal as right }; + export { paddingVertical as top }; + export { paddingVertical as bottom }; + } + /** + * @param {number} stackWidth + * @param {boolean} showOnLeft + * @param {number} width + * @returns {string} + */ + export function getLeftPos(stackWidth: number, showOnLeft: boolean, width: number): string; +} +import React from "react"; +import Popup from "../popup/Popup.mjs"; +import ModalContent from "../popup/ModalContent.mjs"; +import Button from "../Button.mjs"; +declare const paddingHorizontal: 2; +declare const paddingVertical: 1; diff --git a/types/menu/SubMenu.d.mts b/types/menu/SubMenu.d.mts new file mode 100644 index 0000000..9669e84 --- /dev/null +++ b/types/menu/SubMenu.d.mts @@ -0,0 +1,39 @@ +export default SubMenu; +export type SubMenuProps = { + readonly selected: number; + readonly items: string[]; + readonly top: number; + readonly left: number; + onClick(index: number): void; +}; +/** + * @typedef {{ + * readonly selected: number; + * readonly items: string[]; + * readonly top: number; + * readonly left: number; + * onClick(index: number): void; + * }} SubMenuProps + */ +/** + * @param {SubMenuProps} props + */ +declare function SubMenu(props: SubMenuProps): React.ReactElement<{ + clickable: boolean; + autoFocus: boolean; + width: number; + height: number; + top: number; + left: number; + shadow: boolean; + style: import("../theme/Theme.mjs").ThemeEffects; +}, string | React.JSXElementConstructor>; +declare namespace SubMenu { + export const displayName: string; + export { DoubleBorder as doubleBorderComp }; + export { HorizontalLine as horizontalLineComp }; + export const separator: string; +} +import React from "react"; +import DoubleBorder from "../border/DoubleBorder.mjs"; +import HorizontalLine from "../border/HorizontalLine.mjs"; diff --git a/types/popup/ListPopup.d.mts b/types/popup/ListPopup.d.mts new file mode 100644 index 0000000..bba133c --- /dev/null +++ b/types/popup/ListPopup.d.mts @@ -0,0 +1,49 @@ +export default ListPopup; +export type BlessedPadding = import("./ModalContent.mjs").BlessedPadding; +export type ListPopupProps = { + readonly title: string; + readonly items: string[]; + onAction(index: number): void; + onClose(): void; + readonly selected?: number | undefined; + onSelect?(index: number): void; + onKeypress?(keyFull: string): boolean; + readonly footer?: string | undefined; + readonly textPaddingLeft?: number | undefined; + readonly textPaddingRight?: number | undefined; + readonly itemWrapPrefixLen?: number | undefined; +}; +/** + * @typedef {{ + * readonly title: string; + * readonly items: string[]; + * onAction(index: number): void; + * onClose(): void; + * readonly selected?: number; + * onSelect?(index: number): void; + * onKeypress?(keyFull: string): boolean; + * readonly footer?: string; + * readonly textPaddingLeft?: number; + * readonly textPaddingRight?: number; + * readonly itemWrapPrefixLen?: number; + * }} ListPopupProps + */ +/** + * @param {ListPopupProps} props + */ +declare function ListPopup(props: ListPopupProps): React.FunctionComponentElement; +declare namespace ListPopup { + export const displayName: string; + export { Popup as popupComp }; + export { ModalContent as modalContentComp }; + export { WithSize as withSizeComp }; + export { ListBox as listBoxComp }; + export const paddingHorizontal: number; + export const paddingVertical: number; + export const padding: BlessedPadding; +} +import React from "react"; +import Popup from "./Popup.mjs"; +import ModalContent from "./ModalContent.mjs"; +import WithSize from "../WithSize.mjs"; +import ListBox from "../ListBox.mjs"; diff --git a/types/popup/MessageBox.d.mts b/types/popup/MessageBox.d.mts new file mode 100644 index 0000000..ef00eea --- /dev/null +++ b/types/popup/MessageBox.d.mts @@ -0,0 +1,33 @@ +export default MessageBox; +export type ButtonsPanelAction = import("../../src/ButtonsPanel.mjs").ButtonsPanelAction; +export type MessageBoxAction = import("./MessageBoxAction.mjs").MessageBoxAction; +export type MessageBoxProps = { + readonly title: string; + readonly message: string; + readonly actions: MessageBoxAction[]; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; +}; +/** + * @typedef {{ + * readonly title: string; + * readonly message: string; + * readonly actions: MessageBoxAction[]; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * }} MessageBoxProps + */ +/** + * @param {MessageBoxProps} props + */ +declare function MessageBox(props: MessageBoxProps): React.FunctionComponentElement; +declare namespace MessageBox { + export const displayName: string; + export { Popup as popupComp }; + export { ModalContent as modalContentComp }; + export { TextLine as textLineComp }; + export { ButtonsPanel as buttonsPanelComp }; +} +import React from "react"; +import Popup from "./Popup.mjs"; +import ModalContent from "./ModalContent.mjs"; +import TextLine from "../TextLine.mjs"; +import ButtonsPanel from "../ButtonsPanel.mjs"; diff --git a/types/popup/MessageBoxAction.d.mts b/types/popup/MessageBoxAction.d.mts new file mode 100644 index 0000000..fe71464 --- /dev/null +++ b/types/popup/MessageBoxAction.d.mts @@ -0,0 +1,11 @@ +export default MessageBoxAction; +export type MessageBoxAction = { + readonly label: string; + readonly triggeredOnClose: boolean; + onAction(): void; +}; +declare namespace MessageBoxAction { + function OK(onAction: () => void): MessageBoxAction; + function YES(onAction: () => void): MessageBoxAction; + function NO(onAction: () => void): MessageBoxAction; +} diff --git a/types/popup/Modal.d.mts b/types/popup/Modal.d.mts new file mode 100644 index 0000000..5586efa --- /dev/null +++ b/types/popup/Modal.d.mts @@ -0,0 +1,29 @@ +export default Modal; +export type ModalProps = { + readonly title: string; + readonly width: number; + readonly height: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + onCancel(): void; +}; +/** + * @typedef {{ + * readonly title: string; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * onCancel(): void; + * }} ModalProps + */ +/** + * @param {React.PropsWithChildren} props + */ +declare function Modal(props: React.PropsWithChildren): React.FunctionComponentElement; +declare namespace Modal { + export const displayName: string; + export { Popup as popupComp }; + export { ModalContent as modalContentComp }; +} +import React from "react"; +import Popup from "./Popup.mjs"; +import ModalContent from "./ModalContent.mjs"; diff --git a/types/popup/ModalContent.d.mts b/types/popup/ModalContent.d.mts new file mode 100644 index 0000000..d8deb84 --- /dev/null +++ b/types/popup/ModalContent.d.mts @@ -0,0 +1,58 @@ +export default ModalContent; +export type BlessedPadding = { + readonly left: number; + readonly right: number; + readonly top: number; + readonly bottom: number; +}; +export type ModalContentProps = { + readonly title: string; + readonly width: number; + readonly height: number; + readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + readonly padding?: BlessedPadding; + readonly left?: import("@farjs/blessed").Widgets.Types.TTopLeft; + readonly footer?: string; +}; +/** + * @typedef {{ + * readonly left: number; + * readonly right: number; + * readonly top: number; + * readonly bottom: number; + * }} BlessedPadding + */ +/** + * @typedef {{ + * readonly title: string; + * readonly width: number; + * readonly height: number; + * readonly style: import("@farjs/blessed").Widgets.Types.TStyle; + * readonly padding?: BlessedPadding; + * readonly left?: import("@farjs/blessed").Widgets.Types.TTopLeft; + * readonly footer?: string; + * }} ModalContentProps + */ +/** + * @param {React.PropsWithChildren} props + */ +declare function ModalContent(props: React.PropsWithChildren): React.ReactElement<{ + clickable: boolean; + autoFocus: boolean; + width: number; + height: number; + top: string; + left: import("blessed").Widgets.Types.TTopLeft; + shadow: boolean; + padding: BlessedPadding; + style: import("blessed").Widgets.Types.TStyle; +}, string | React.JSXElementConstructor>; +declare namespace ModalContent { + export const displayName: string; + export { DoubleBorder as doubleBorderComp }; + export const paddingHorizontal: number; + export const paddingVertical: number; + export const padding: BlessedPadding; +} +import React from "react"; +import DoubleBorder from "../border/DoubleBorder.mjs"; diff --git a/types/popup/Popup.d.mts b/types/popup/Popup.d.mts new file mode 100644 index 0000000..91959e6 --- /dev/null +++ b/types/popup/Popup.d.mts @@ -0,0 +1,27 @@ +export default Popup; +export type PopupProps = { + readonly focusable?: boolean | undefined; + onClose?(): void; + onOpen?(): void; + onKeypress?(keyFull: string): boolean; +}; +/** + * @typedef {{ + * readonly focusable?: boolean; + * onClose?(): void; + * onOpen?(): void; + * onKeypress?(keyFull: string): boolean; + * }} PopupProps + */ +/** + * @param {React.PropsWithChildren} props + */ +declare function Popup(props: React.PropsWithChildren): React.FunctionComponentElement<{}>; +declare namespace Popup { + export const displayName: string; + export { Portal as portalComp }; + export { PopupOverlay as popupOverlayComp }; +} +import React from "react"; +import Portal from "../portal/Portal.mjs"; +import PopupOverlay from "./PopupOverlay.mjs"; diff --git a/types/popup/PopupOverlay.d.mts b/types/popup/PopupOverlay.d.mts new file mode 100644 index 0000000..5b1578a --- /dev/null +++ b/types/popup/PopupOverlay.d.mts @@ -0,0 +1,20 @@ +export default PopupOverlay; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type FormElement = import("@farjs/blessed").Widgets.FormElement & { + focusFirst(): void; + _selected: BlessedElement; +}; +export type IKeyEventArg = import("@farjs/blessed").Widgets.Events.IKeyEventArg & { + defaultPrevented?: boolean; +}; +export type PopupProps = import("./Popup.mjs").PopupProps; +/** + * @param {React.PropsWithChildren} props + * @returns {React.ReactElement} + */ +declare function PopupOverlay(props: React.PropsWithChildren): React.ReactElement; +declare namespace PopupOverlay { + const displayName: string; + const style: import("@farjs/blessed").Widgets.Types.TStyle; +} +import React from "react"; diff --git a/types/popup/StatusPopup.d.mts b/types/popup/StatusPopup.d.mts new file mode 100644 index 0000000..a0422e3 --- /dev/null +++ b/types/popup/StatusPopup.d.mts @@ -0,0 +1,27 @@ +export default StatusPopup; +export type StatusPopupProps = { + readonly text: string; + readonly title?: string; + onClose?(): void; +}; +/** + * @typedef {{ + * readonly text: string; + * readonly title?: string; + * onClose?(): void; + * }} StatusPopupProps + */ +/** + * @param {StatusPopupProps} props + */ +declare function StatusPopup(props: StatusPopupProps): React.FunctionComponentElement; +declare namespace StatusPopup { + export const displayName: string; + export { Popup as popupComp }; + export { ModalContent as modalContentComp }; + export { TextLine as textLineComp }; +} +import React from "react"; +import Popup from "./Popup.mjs"; +import ModalContent from "./ModalContent.mjs"; +import TextLine from "../TextLine.mjs"; diff --git a/types/portal/Portal.d.mts b/types/portal/Portal.d.mts new file mode 100644 index 0000000..2702b9f --- /dev/null +++ b/types/portal/Portal.d.mts @@ -0,0 +1,17 @@ +export default Portal; +export type PortalContext = { + readonly isActive: boolean; +}; +/** + * @typedef {{readonly isActive: boolean}} PortalContext + */ +/** + * @param {React.PropsWithChildren<{}>} props + */ +declare function Portal(props: React.PropsWithChildren<{}>): null; +declare namespace Portal { + const displayName: string; + const Context: React.Context; + const _nextPortalId: number; +} +import React from "react"; diff --git a/types/portal/WithPortals.d.mts b/types/portal/WithPortals.d.mts new file mode 100644 index 0000000..6bb37ae --- /dev/null +++ b/types/portal/WithPortals.d.mts @@ -0,0 +1,23 @@ +export default WithPortals; +export type BlessedScreen = import("@farjs/blessed").Widgets.Screen; +export type BlessedElement = import("@farjs/blessed").Widgets.BlessedElement; +export type PortalContext = import("./Portal.mjs").PortalContext; +export type PortalItem = { + readonly id: number; + readonly content: React.ReactNode; + readonly focused: BlessedElement; +}; +export type WithPortalsContext = { + onRender(portalId: number, content: React.ReactNode): void; + onRemove(portalId: number): void; +}; +declare namespace WithPortals { + const Context: React.Context; + function create(screen: import("blessed").Widgets.Screen): { + (props: { + children?: React.ReactNode; + }): React.FunctionComponentElement<{}>; + displayName: string; + }; +} +import React from "react"; diff --git a/types/task/Task.d.mts b/types/task/Task.d.mts new file mode 100644 index 0000000..6dc56d9 --- /dev/null +++ b/types/task/Task.d.mts @@ -0,0 +1,24 @@ +export default Task; +/** + * + */ +export type Task = { + readonly startTime: number; + readonly message: string; + readonly result: Promise; +}; +/** + * @template T + * @typedef {{ + * readonly startTime: number; + * readonly message: string; + * readonly result: Promise; + * }} Task + */ +/** + * @template T + * @param {string} message + * @param {Promise} result + * @returns {Task} + */ +declare function Task(message: string, result: Promise): Task; diff --git a/types/task/TaskAction.d.mts b/types/task/TaskAction.d.mts new file mode 100644 index 0000000..000086a --- /dev/null +++ b/types/task/TaskAction.d.mts @@ -0,0 +1,27 @@ +export default TaskAction; +/** + * + */ +export type Task = import("./Task.mjs").Task; +/** + * + */ +export type TaskAction = { + readonly task: Task; +}; +/** + * @template T + * @typedef {import("./Task.mjs").Task} Task + */ +/** + * @template T + * @typedef {{ + * readonly task: Task; + * }} TaskAction + */ +/** + * @template T + * @param {Task} task + * @returns {TaskAction} + */ +declare function TaskAction(task: Task): TaskAction; diff --git a/types/task/TaskManager.d.mts b/types/task/TaskManager.d.mts new file mode 100644 index 0000000..3923f63 --- /dev/null +++ b/types/task/TaskManager.d.mts @@ -0,0 +1,43 @@ +export default TaskManager; +/** + * + */ +export type Task = import("./Task.mjs").Task; +export type TaskManagerUiProps = import("./TaskManagerUi.mjs").TaskManagerUiProps; +export type TaskManagerProps = { + readonly startTask?: Task; +}; +export type TaskManagerState = { + readonly taskCount: number; + readonly status?: string; + readonly error?: string; + readonly errorDetails?: string; +}; +export type TaskError = { + readonly error: string; + readonly errorDetails?: string; +}; +/** + * @typedef {{ + * readonly startTask?: Task; + * }} TaskManagerProps + */ +/** + * @typedef {{ + * readonly taskCount: number; + * readonly status?: string; + * readonly error?: string; + * readonly errorDetails?: string; + * }} TaskManagerState + */ +/** + * @param {TaskManagerProps} props + */ +declare function TaskManager(props: TaskManagerProps): React.ReactElement>; +declare namespace TaskManager { + export const displayName: string; + export { TaskManagerUi as uiComponent }; + export function errorHandler(error: any): TaskError; +} +import React from "react"; +import TaskManagerUi from "./TaskManagerUi.mjs"; diff --git a/types/task/TaskManagerUi.d.mts b/types/task/TaskManagerUi.d.mts new file mode 100644 index 0000000..7af55bb --- /dev/null +++ b/types/task/TaskManagerUi.d.mts @@ -0,0 +1,21 @@ +export default TaskManagerUi; +export type TaskManagerUiProps = { + readonly showLoading: boolean; + onHideStatus(): void; + onCloseErrorPopup(): void; + readonly status?: string; + readonly error?: string; + readonly errorDetails?: string; +}; +/** + * @param {TaskManagerUiProps} props + */ +declare function TaskManagerUi(props: TaskManagerUiProps): React.FunctionComponentElement<{}>; +declare namespace TaskManagerUi { + export const displayName: string; + export { StatusPopup as statusPopupComp }; + export { MessageBox as messageBoxComp }; +} +import React from "react"; +import StatusPopup from "../popup/StatusPopup.mjs"; +import MessageBox from "../popup/MessageBox.mjs"; diff --git a/types/task/TaskReducer.d.mts b/types/task/TaskReducer.d.mts new file mode 100644 index 0000000..c7597fb --- /dev/null +++ b/types/task/TaskReducer.d.mts @@ -0,0 +1,15 @@ +export default TaskReducer; +/** + * + */ +export type Task = import("./Task.mjs").Task; +/** + * @template T + * @typedef {import("./Task.mjs").Task} Task + */ +/** + * @param {Task | undefined} state + * @param {any} action + * @returns {Task | undefined} + */ +declare function TaskReducer(state: Task | undefined, action: any): Task | undefined; diff --git a/types/theme/Color.d.mts b/types/theme/Color.d.mts new file mode 100644 index 0000000..983fd12 --- /dev/null +++ b/types/theme/Color.d.mts @@ -0,0 +1,21 @@ +export default Color; +declare const Color: Readonly<{ + black: "black"; + red: "red"; + green: "green"; + yellow: "yellow"; + blue: "blue"; + magenta: "magenta"; + cyan: "cyan"; + white: "white"; + lightblack: "lightblack"; + lightred: "lightred"; + lightgreen: "lightgreen"; + lightyellow: "lightyellow"; + lightblue: "lightblue"; + lightmagenta: "lightmagenta"; + lightcyan: "lightcyan"; + lightwhite: "lightwhite"; + grey: "grey"; + lightgrey: "lightgrey"; +}>; diff --git a/types/theme/DefaultTheme.d.mts b/types/theme/DefaultTheme.d.mts new file mode 100644 index 0000000..03119c3 --- /dev/null +++ b/types/theme/DefaultTheme.d.mts @@ -0,0 +1,5 @@ +export default DefaultTheme; +/** + * @type {import("./Theme.mjs").Theme} + */ +declare const DefaultTheme: import("./Theme.mjs").Theme; diff --git a/types/theme/Theme.d.mts b/types/theme/Theme.d.mts new file mode 100644 index 0000000..2bcad57 --- /dev/null +++ b/types/theme/Theme.d.mts @@ -0,0 +1,32 @@ +export default Theme; +export type Theme = { + readonly popup: ThemePopup; + readonly menu: ThemeMenu; + readonly textBox: ThemeTextBox; +}; +export type ThemeStyle = { + readonly bold?: boolean; + readonly bg: string; + readonly fg: string; +}; +export type ThemeEffects = ThemeStyle & { + readonly focus?: ThemeStyle; +}; +export type ThemePopup = { + readonly regular: ThemeEffects; + readonly error: ThemeEffects; + readonly menu: ThemeEffects; +}; +export type ThemeMenu = { + readonly key: ThemeStyle; + readonly item: ThemeStyle; +}; +export type ThemeTextBox = { + readonly regular: ThemeEffects; + readonly selected: ThemeEffects; +}; +declare namespace Theme { + const Context: React.Context; + function useTheme(): Theme; +} +import React from "react"; diff --git a/types/theme/XTerm256Theme.d.mts b/types/theme/XTerm256Theme.d.mts new file mode 100644 index 0000000..719c562 --- /dev/null +++ b/types/theme/XTerm256Theme.d.mts @@ -0,0 +1,5 @@ +export default XTerm256Theme; +/** + * @type {import("./Theme.mjs").Theme} + */ +declare const XTerm256Theme: import("./Theme.mjs").Theme; diff --git a/types/tool/ColorPanel.d.mts b/types/tool/ColorPanel.d.mts new file mode 100644 index 0000000..86f17f0 --- /dev/null +++ b/types/tool/ColorPanel.d.mts @@ -0,0 +1,14 @@ +export default ColorPanel; +declare function ColorPanel(): React.ReactElement<{ + autoFocus: boolean; + mouse: boolean; + tags: boolean; + scrollbar: boolean; + scrollable: boolean; + alwaysScroll: boolean; + content: string; +}, string | React.JSXElementConstructor>; +declare namespace ColorPanel { + const displayName: string; +} +import React from "react"; diff --git a/types/tool/DevTool.d.mts b/types/tool/DevTool.d.mts new file mode 100644 index 0000000..0893040 --- /dev/null +++ b/types/tool/DevTool.d.mts @@ -0,0 +1,19 @@ +export default DevTool; +export type DevTool = "Hidden" | "Logs" | "Inputs" | "Colors"; +declare const DevTool: Readonly<{ + Hidden: "Hidden"; + Logs: "Logs"; + Inputs: "Inputs"; + Colors: "Colors"; + /** + * @param {DevTool} from + * @param {DevTool} to + * @returns {boolean} + */ + shouldResize: (from: DevTool, to: DevTool) => boolean; + /** + * @param {DevTool} from + * @returns {DevTool} + */ + getNext: (from: DevTool) => DevTool; +}>; diff --git a/types/tool/DevToolPanel.d.mts b/types/tool/DevToolPanel.d.mts new file mode 100644 index 0000000..08814c4 --- /dev/null +++ b/types/tool/DevToolPanel.d.mts @@ -0,0 +1,20 @@ +export default DevToolPanel; +export type DevToolPanelProps = { + readonly devTool: import("./DevTool.mjs").DevTool; + readonly logContent: string; + onActivate(devTool: import("./DevTool.mjs").DevTool): void; +}; +/** + * @param {DevToolPanelProps} props + */ +declare function DevToolPanel(props: DevToolPanelProps): React.FunctionComponentElement<{}>; +declare namespace DevToolPanel { + export const displayName: string; + export { LogPanel as logPanelComp }; + export { InputController as inputController }; + export { ColorPanel as colorPanelComp }; +} +import React from "react"; +import LogPanel from "./LogPanel.mjs"; +import InputController from "./InputController.mjs"; +import ColorPanel from "./ColorPanel.mjs"; diff --git a/types/tool/InputController.d.mts b/types/tool/InputController.d.mts new file mode 100644 index 0000000..7d8a1bd --- /dev/null +++ b/types/tool/InputController.d.mts @@ -0,0 +1,11 @@ +export default InputController; +declare function InputController(): React.FunctionComponentElement<{ + content: string; +}>; +declare namespace InputController { + export const displayName: string; + export { LogPanel as logPanelComp }; + export const maxBufferLength: number; +} +import React from "react"; +import LogPanel from "./LogPanel.mjs"; diff --git a/types/tool/LogController.d.mts b/types/tool/LogController.d.mts new file mode 100644 index 0000000..e7b7dbc --- /dev/null +++ b/types/tool/LogController.d.mts @@ -0,0 +1,19 @@ +export default LogController; +export type LogControllerProps = { + onReady(): void; + render(content: string): React.ReactElement | null; +}; +/** + * @typedef {{ + * onReady(): void; + * render(content: string): React.ReactElement | null; + * }} LogControllerProps + */ +/** + * @param {LogControllerProps} props + */ +declare function LogController(props: LogControllerProps): import("react").ReactElement> | null; +declare namespace LogController { + const displayName: string; + const maxBufferLength: number; +} diff --git a/types/tool/LogPanel.d.mts b/types/tool/LogPanel.d.mts new file mode 100644 index 0000000..cc6ce10 --- /dev/null +++ b/types/tool/LogPanel.d.mts @@ -0,0 +1,20 @@ +export default LogPanel; +export type LogPanelProps = { + readonly content: string; +}; +/** + * @param {LogPanelProps} props + */ +declare function LogPanel(props: LogPanelProps): React.ReactElement<{ + autoFocus: boolean; + mouse: boolean; + style: import("blessed").Widgets.Types.TStyle; + scrollbar: boolean; + scrollable: boolean; + alwaysScroll: boolean; + content: string; +}, string | React.JSXElementConstructor>; +declare namespace LogPanel { + const displayName: string; +} +import React from "react";