@tooee/view 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +15 -15
  2. package/dist/components/subviews/{CodeSubview.d.ts → code-subview.d.ts} +2 -2
  3. package/dist/components/subviews/code-subview.d.ts.map +1 -0
  4. package/dist/components/subviews/{CodeSubview.js → code-subview.js} +8 -8
  5. package/dist/components/subviews/code-subview.js.map +1 -0
  6. package/dist/components/subviews/custom-subview.d.ts +9 -0
  7. package/dist/components/subviews/custom-subview.d.ts.map +1 -0
  8. package/dist/components/subviews/{CustomSubview.js → custom-subview.js} +7 -7
  9. package/dist/components/subviews/custom-subview.js.map +1 -0
  10. package/dist/components/subviews/index.d.ts +4 -4
  11. package/dist/components/subviews/index.d.ts.map +1 -1
  12. package/dist/components/subviews/index.js +4 -4
  13. package/dist/components/subviews/index.js.map +1 -1
  14. package/dist/components/subviews/markdown-subview.d.ts +11 -0
  15. package/dist/components/subviews/markdown-subview.d.ts.map +1 -0
  16. package/dist/components/subviews/{MarkdownSubview.js → markdown-subview.js} +28 -26
  17. package/dist/components/subviews/markdown-subview.js.map +1 -0
  18. package/dist/components/subviews/table-subview.d.ts +8 -0
  19. package/dist/components/subviews/table-subview.d.ts.map +1 -0
  20. package/dist/components/subviews/{TableSubview.js → table-subview.js} +40 -22
  21. package/dist/components/subviews/table-subview.js.map +1 -0
  22. package/dist/components/subviews/types.d.ts.map +1 -1
  23. package/dist/components/{ViewScreen.d.ts → view-screen.d.ts} +3 -3
  24. package/dist/components/view-screen.d.ts.map +1 -0
  25. package/dist/components/{ViewScreen.js → view-screen.js} +11 -11
  26. package/dist/components/view-screen.js.map +1 -0
  27. package/dist/content-loader-store.d.ts +11 -7
  28. package/dist/content-loader-store.d.ts.map +1 -1
  29. package/dist/content-loader-store.js +70 -50
  30. package/dist/content-loader-store.js.map +1 -1
  31. package/dist/default-provider.d.ts +4 -4
  32. package/dist/default-provider.d.ts.map +1 -1
  33. package/dist/default-provider.js +48 -39
  34. package/dist/default-provider.js.map +1 -1
  35. package/dist/directory-provider.d.ts +2 -2
  36. package/dist/directory-provider.d.ts.map +1 -1
  37. package/dist/directory-provider.js +13 -10
  38. package/dist/directory-provider.js.map +1 -1
  39. package/dist/directory-view.d.ts +8 -0
  40. package/dist/directory-view.d.ts.map +1 -0
  41. package/dist/{DirectoryView.js → directory-view.js} +18 -12
  42. package/dist/directory-view.js.map +1 -0
  43. package/dist/hooks/index.d.ts +4 -4
  44. package/dist/hooks/index.d.ts.map +1 -1
  45. package/dist/hooks/index.js +3 -3
  46. package/dist/hooks/index.js.map +1 -1
  47. package/dist/hooks/{useContentCommands.d.ts → use-content-commands.d.ts} +2 -2
  48. package/dist/hooks/use-content-commands.d.ts.map +1 -0
  49. package/dist/hooks/{useContentCommands.js → use-content-commands.js} +6 -4
  50. package/dist/hooks/use-content-commands.js.map +1 -0
  51. package/dist/hooks/{useContentLoader.d.ts → use-content-loader.d.ts} +4 -4
  52. package/dist/hooks/use-content-loader.d.ts.map +1 -0
  53. package/dist/hooks/use-content-loader.js +81 -0
  54. package/dist/hooks/use-content-loader.js.map +1 -0
  55. package/dist/hooks/{useViewCommandContext.d.ts → use-view-command-context.d.ts} +3 -3
  56. package/dist/hooks/use-view-command-context.d.ts.map +1 -0
  57. package/dist/hooks/{useViewCommandContext.js → use-view-command-context.js} +15 -13
  58. package/dist/hooks/use-view-command-context.js.map +1 -0
  59. package/dist/index.d.ts +4 -4
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -3
  62. package/dist/index.js.map +1 -1
  63. package/dist/launch.d.ts +2 -2
  64. package/dist/launch.d.ts.map +1 -1
  65. package/dist/launch.js +6 -6
  66. package/dist/launch.js.map +1 -1
  67. package/dist/types.d.ts +4 -4
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js +46 -24
  70. package/dist/types.js.map +1 -1
  71. package/dist/view.d.ts +18 -0
  72. package/dist/view.d.ts.map +1 -0
  73. package/dist/{View.js → view.js} +20 -14
  74. package/dist/view.js.map +1 -0
  75. package/package.json +10 -10
  76. package/src/components/subviews/{CodeSubview.tsx → code-subview.tsx} +25 -19
  77. package/src/components/subviews/{CustomSubview.tsx → custom-subview.tsx} +23 -21
  78. package/src/components/subviews/index.ts +5 -5
  79. package/src/components/subviews/{MarkdownSubview.tsx → markdown-subview.tsx} +55 -52
  80. package/src/components/subviews/table-subview.tsx +95 -0
  81. package/src/components/subviews/types.ts +14 -14
  82. package/src/components/{ViewScreen.tsx → view-screen.tsx} +33 -32
  83. package/src/content-loader-store.ts +131 -99
  84. package/src/default-provider.ts +84 -64
  85. package/src/directory-provider.ts +32 -24
  86. package/src/directory-view.tsx +79 -0
  87. package/src/hooks/index.ts +7 -4
  88. package/src/hooks/{useContentCommands.ts → use-content-commands.ts} +19 -14
  89. package/src/hooks/use-content-loader.ts +92 -0
  90. package/src/hooks/{useViewCommandContext.ts → use-view-command-context.ts} +40 -38
  91. package/src/index.ts +14 -14
  92. package/src/launch.tsx +20 -18
  93. package/src/types.ts +107 -78
  94. package/src/view.tsx +114 -0
  95. package/dist/DirectoryView.d.ts +0 -7
  96. package/dist/DirectoryView.d.ts.map +0 -1
  97. package/dist/DirectoryView.js.map +0 -1
  98. package/dist/View.d.ts +0 -16
  99. package/dist/View.d.ts.map +0 -1
  100. package/dist/View.js.map +0 -1
  101. package/dist/components/ViewScreen.d.ts.map +0 -1
  102. package/dist/components/ViewScreen.js.map +0 -1
  103. package/dist/components/subviews/CodeSubview.d.ts.map +0 -1
  104. package/dist/components/subviews/CodeSubview.js.map +0 -1
  105. package/dist/components/subviews/CustomSubview.d.ts +0 -9
  106. package/dist/components/subviews/CustomSubview.d.ts.map +0 -1
  107. package/dist/components/subviews/CustomSubview.js.map +0 -1
  108. package/dist/components/subviews/MarkdownSubview.d.ts +0 -10
  109. package/dist/components/subviews/MarkdownSubview.d.ts.map +0 -1
  110. package/dist/components/subviews/MarkdownSubview.js.map +0 -1
  111. package/dist/components/subviews/TableSubview.d.ts +0 -8
  112. package/dist/components/subviews/TableSubview.d.ts.map +0 -1
  113. package/dist/components/subviews/TableSubview.js.map +0 -1
  114. package/dist/hooks/useContentCommands.d.ts.map +0 -1
  115. package/dist/hooks/useContentCommands.js.map +0 -1
  116. package/dist/hooks/useContentLoader.d.ts.map +0 -1
  117. package/dist/hooks/useContentLoader.js +0 -55
  118. package/dist/hooks/useContentLoader.js.map +0 -1
  119. package/dist/hooks/useViewCommandContext.d.ts.map +0 -1
  120. package/dist/hooks/useViewCommandContext.js.map +0 -1
  121. package/src/DirectoryView.tsx +0 -68
  122. package/src/View.tsx +0 -94
  123. package/src/components/subviews/TableSubview.tsx +0 -65
  124. package/src/hooks/useContentLoader.ts +0 -72
package/src/view.tsx ADDED
@@ -0,0 +1,114 @@
1
+ import { useCallback, useMemo, useState } from "react";
2
+ import { useTheme } from "@tooee/themes";
3
+ import type { ActionDefinition } from "@tooee/commands";
4
+ import type { MarkSet } from "@tooee/marks";
5
+ import type { CodeBlockRenderer, MarkdownLinkHandler } from "@tooee/renderers";
6
+ import { isCustomContent } from "./types.js";
7
+ import type { ContentProvider, ContentRenderer } from "./types.js";
8
+ import { useContentLoader } from "./hooks/use-content-loader.js";
9
+ import {
10
+ MarkdownSubview,
11
+ CodeSubview,
12
+ TableSubview,
13
+ CustomSubview,
14
+ } from "./components/subviews/index.js";
15
+
16
+ interface ViewProps {
17
+ contentProvider: ContentProvider;
18
+ actions?: ActionDefinition[];
19
+ renderers?: Record<string, ContentRenderer>;
20
+ /**
21
+ * Custom renderers for fenced code blocks in markdown content, keyed by
22
+ * fence type (first word of the fence info string, case-insensitive).
23
+ */
24
+ codeBlockRenderers?: Record<string, CodeBlockRenderer>;
25
+ /** Handles primary-button activation of inline Markdown links. */
26
+ onMarkdownLinkActivate?: MarkdownLinkHandler;
27
+ }
28
+
29
+ export const View = function View({
30
+ contentProvider,
31
+ actions,
32
+ renderers,
33
+ codeBlockRenderers,
34
+ onMarkdownLinkActivate,
35
+ }: ViewProps): React.ReactNode {
36
+ const { theme } = useTheme();
37
+ const { content, streaming, error, providerMarks, reload } = useContentLoader(contentProvider);
38
+
39
+ const [userMarks, setUserMarks] = useState<MarkSet[]>([]);
40
+
41
+ const setMarkSet = useCallback((set: MarkSet) => {
42
+ setUserMarks((prev) => {
43
+ const filtered = prev.filter((s) => s.namespace !== set.namespace);
44
+ return [...filtered, set];
45
+ });
46
+ }, []);
47
+
48
+ const clearMarkNamespace = useCallback((namespace: string) => {
49
+ setUserMarks((prev) => prev.filter((s) => s.namespace !== namespace));
50
+ }, []);
51
+
52
+ const clearAllUserMarks = useCallback(() => {
53
+ setUserMarks([]);
54
+ }, []);
55
+
56
+ // Mark sets are decoration layers; the controller composes them with the
57
+ // interaction layers it generates, ordered by each set's own priority.
58
+ const decorations = useMemo(() => [...providerMarks, ...userMarks], [providerMarks, userMarks]);
59
+
60
+ if ((error?.length ?? 0) > 0) {
61
+ return (
62
+ <box style={{ flexDirection: "column" }}>
63
+ <text content={`Error: ${error}`} fg={theme.error} />
64
+ </box>
65
+ );
66
+ }
67
+
68
+ if (!content) {
69
+ return (
70
+ <box>
71
+ <text content="Loading..." fg={theme.textMuted} />
72
+ </box>
73
+ );
74
+ }
75
+
76
+ const shared = {
77
+ actions,
78
+ clearAllUserMarks,
79
+ clearMarkNamespace,
80
+ decorations,
81
+ providerMarks,
82
+ reload,
83
+ setMarkSet,
84
+ streaming,
85
+ userMarks,
86
+ };
87
+
88
+ if (isCustomContent(content)) {
89
+ return <CustomSubview content={content} renderers={renderers} {...shared} />;
90
+ }
91
+
92
+ switch (content.format) {
93
+ case "markdown": {
94
+ return (
95
+ <MarkdownSubview
96
+ content={content}
97
+ codeBlockRenderers={codeBlockRenderers}
98
+ onLinkActivate={onMarkdownLinkActivate}
99
+ {...shared}
100
+ />
101
+ );
102
+ }
103
+ case "code":
104
+ case "text": {
105
+ return <CodeSubview content={content} {...shared} />;
106
+ }
107
+ case "table": {
108
+ return <TableSubview content={content} {...shared} />;
109
+ }
110
+ default: {
111
+ return null;
112
+ }
113
+ }
114
+ };
@@ -1,7 +0,0 @@
1
- interface DirectoryViewProps {
2
- dirPath: string;
3
- actions?: import("@tooee/commands").ActionDefinition[];
4
- }
5
- export declare function DirectoryView({ dirPath, actions }: DirectoryViewProps): import("react").ReactNode;
6
- export {};
7
- //# sourceMappingURL=DirectoryView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DirectoryView.d.ts","sourceRoot":"","sources":["../src/DirectoryView.tsx"],"names":[],"mappings":"AAyBA,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACvD;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB,6BAqCrE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DirectoryView.js","sourceRoot":"","sources":["../src/DirectoryView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAuB,MAAM,yBAAyB,CAAA;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,SAAS,2BAA2B,CAClC,KAAqB,EACrB,KAAa,EACb,KAAa;IAEb,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;YAC3B,MAAM,OAAO,GAAG,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,MAAqB,CAAA;YACjF,OAAO;gBACL,GAAG,OAAO;gBACV,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG;aAChD,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAsB;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACnE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEnD,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CACH,KAAK,CAAC,MAAM,GAAG,CAAC;QACd,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;QAC9E,CAAC,CAAC,IAAI,EACV,CAAC,KAAK,EAAE,YAAY,CAAC,CACtB,CAAA;IAED,UAAU,CAAC;QACT,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KACzE,CAAC,CAAA;IAEF,UAAU,CAAC;QACT,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;KAC1D,CAAC,CAAA;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,OAAO,CACL,wBACE,eAAM,OAAO,EAAC,gCAAgC,GAAG,GAC7C,CACP,CAAA;IACH,CAAC;IAED,OAAO,KAAC,IAAI,IAAC,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAI,CAAA;AACrE,CAAC"}
package/dist/View.d.ts DELETED
@@ -1,16 +0,0 @@
1
- import type { ActionDefinition } from "@tooee/commands";
2
- import type { CodeBlockRenderer } from "@tooee/renderers";
3
- import { type ContentProvider, type ContentRenderer } from "./types.js";
4
- interface ViewProps {
5
- contentProvider: ContentProvider;
6
- actions?: ActionDefinition[];
7
- renderers?: Record<string, ContentRenderer>;
8
- /**
9
- * Custom renderers for fenced code blocks in markdown content, keyed by
10
- * fence type (first word of the fence info string, case-insensitive).
11
- */
12
- codeBlockRenderers?: Record<string, CodeBlockRenderer>;
13
- }
14
- export declare function View({ contentProvider, actions, renderers, codeBlockRenderers }: ViewProps): import("react").ReactNode;
15
- export {};
16
- //# sourceMappingURL=View.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"View.d.ts","sourceRoot":"","sources":["../src/View.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AASxF,UAAU,SAAS;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAC3C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CACvD;AAED,wBAAgB,IAAI,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,SAAS,6BAoE1F"}
package/dist/View.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"View.js","sourceRoot":"","sources":["../src/View.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ViewScreen.d.ts","sourceRoot":"","sources":["../../src/components/ViewScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,aAAa,EAAE,OAAO,EAAE,CAAA;IACxB,SAAS,EAAE,OAAO,EAAE,CAAA;IACpB,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAC5B,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,EAAE,eAAe,CAAC,CAAC,CAAC,aAiCpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ViewScreen.js","sourceRoot":"","sources":["../../src/components/ViewScreen.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAmBhF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAI,EAC5B,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACW;IACnB,4BAA4B,CAAC;QAC3B,OAAO;QACP,MAAM;QACN,KAAK,EAAE;YACL,UAAU;YACV,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,iBAAiB;YAC3B,SAAS;YACT,aAAa;SACd;KACF,CAAC,CAAA;IAEF,MAAM,KAAK,GAAoB;QAC7B,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAA;IAED,OAAO,CACL,KAAC,cAAc,IACb,UAAU,EAAE,UAAU,EACtB,QAAQ,EACN,OAAO,CAAC,KAAK;YACX,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;YACpD,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAE/B,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,YAE9D,QAAQ,GACM,CAClB,CAAA;AACH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodeSubview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/CodeSubview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,UAAU,gBAAiB,SAAQ,YAAY;IAC7C,OAAO,EAAE,WAAW,GAAG,WAAW,CAAA;CACnC;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,gBAAgB,6BAwCzF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodeSubview.js","sourceRoot":"","sources":["../../../src/components/subviews/CodeSubview.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAsB,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,EAAoB;IACxF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAA;IAC3E,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEvE,MAAM,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;IAExE,MAAM,QAAQ,GAAG,qBAAqB,CAAgB;QACpD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,IAAI;QACjB,WAAW;QACX,+EAA+E;QAC/E,WAAW,EAAE,OAAO;KACrB,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC;QACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;QAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;KACpD,EACD,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAClC,CAAA;IAED,OAAO,CACL,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,KACpB,MAAM,YAEV,KAAC,QAAQ,IACP,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAClE,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,GAClB,GACS,CACd,CAAA;AACH,CAAC"}
@@ -1,9 +0,0 @@
1
- import { type CustomContent, type ContentRenderer } from "../../types.js";
2
- import type { SubviewProps } from "./types.js";
3
- interface CustomSubviewProps extends SubviewProps {
4
- content: CustomContent;
5
- renderers?: Record<string, ContentRenderer>;
6
- }
7
- export declare function CustomSubview({ content, decorations, actions, renderers, ...screen }: CustomSubviewProps): import("react").ReactNode;
8
- export {};
9
- //# sourceMappingURL=CustomSubview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomSubview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/CustomSubview.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,UAAU,kBAAmB,SAAQ,YAAY;IAC/C,OAAO,EAAE,aAAa,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC5C;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,EACT,GAAG,MAAM,EACV,EAAE,kBAAkB,6BAwCpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomSubview.js","sourceRoot":"","sources":["../../../src/components/subviews/CustomSubview.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAsB,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,cAAc,EAA4C,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQ7C,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,EACT,GAAG,MAAM,EACU;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACrE,gEAAgE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEvE,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;IAE5C,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,qBAAqB,CAAgB;QACpD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,IAAI;QACjB,WAAW;KACZ,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC;QACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;QAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;KACpD,EACD,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAClC,CAAA;IAED,MAAM,cAAc,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAElD,OAAO,CACL,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,KACpB,MAAM,YAET,cAAc,CAAC,CAAC,CAAC,CAChB,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CACtC,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAC/E,GACU,CACd,CAAA;AACH,CAAC"}
@@ -1,10 +0,0 @@
1
- import { type CodeBlockRenderer } from "@tooee/renderers";
2
- import type { MarkdownContent } from "../../types.js";
3
- import type { SubviewProps } from "./types.js";
4
- interface MarkdownSubviewProps extends SubviewProps {
5
- content: MarkdownContent;
6
- codeBlockRenderers?: Record<string, CodeBlockRenderer>;
7
- }
8
- export declare function MarkdownSubview({ content, codeBlockRenderers, decorations, actions, ...screen }: MarkdownSubviewProps): import("react").ReactNode;
9
- export {};
10
- //# sourceMappingURL=MarkdownSubview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownSubview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/MarkdownSubview.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,UAAU,oBAAqB,SAAQ,YAAY;IACjD,OAAO,EAAE,eAAe,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CACvD;AAeD,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,GAAG,MAAM,EACV,EAAE,oBAAoB,6BAsEtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownSubview.js","sourceRoot":"","sources":["../../../src/components/subviews/MarkdownSubview.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { type TableContent } from "../../types.js";
2
- import type { SubviewProps } from "./types.js";
3
- interface TableSubviewProps extends SubviewProps {
4
- content: TableContent;
5
- }
6
- export declare function TableSubview({ content, decorations, actions, ...screen }: TableSubviewProps): import("react").ReactNode;
7
- export {};
8
- //# sourceMappingURL=TableSubview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TableSubview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/TableSubview.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,UAAU,iBAAkB,SAAQ,YAAY;IAC9C,OAAO,EAAE,YAAY,CAAA;CACtB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,iBAAiB,6BAyC3F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TableSubview.js","sourceRoot":"","sources":["../../../src/components/subviews/TableSubview.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAiB,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,EAAqB;IAC1F,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACrE,MAAM,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;IAExE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACjC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC;QACL,OAAO,EAAE,CAAC,GAAa,EAAE,EAAE,CACzB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACxE,CAAC,EACF,CAAC,OAAO,CAAC,CACV,CAAA;IACD,MAAM,QAAQ,GAAG,qBAAqB,CAAW;QAC/C,IAAI;QACJ,OAAO;QACP,WAAW,EAAE,IAAI;QACjB,WAAW;QACX,+EAA+E;QAC/E,WAAW,EAAE,OAAO;KACrB,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC;QACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;QAC3C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAC9C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;KAClD,EACD,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAC9C,CAAA;IAED,OAAO,CACL,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,KACpB,MAAM,YAEV,KAAC,KAAK,IAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAClF,CACd,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACjF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useContentCommands.d.ts","sourceRoot":"","sources":["../../src/hooks/useContentCommands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,UAAU,wBAAwB;IAChC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,wBAAwB;;EAapF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useContentCommands.js","sourceRoot":"","sources":["../../src/hooks/useContentCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQzC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAA4B;IACnF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,CAAA;IAEnF,cAAc,CAAC;QACb,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;KACnD,CAAC,CAAA;IACF,2BAA2B,CAAC;QAC1B,eAAe;QACf,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;KAC9C,CAAC,CAAA;IAEF,OAAO,EAAE,eAAe,EAAE,CAAA;AAC5B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useContentLoader.d.ts","sourceRoot":"","sources":["../../src/hooks/useContentLoader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAalD,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,eAAe;;;;;;;EAwDhE"}
@@ -1,55 +0,0 @@
1
- import { useCallback, useEffect, useState } from "react";
2
- import { useSelector } from "@xstate/store-react";
3
- import { createContentLoaderStore, isAsyncIterable, normalizeError, selectContent, selectError, selectLoadSeq, selectProviderMarks, selectStatus, selectStreaming, } from "../content-loader-store.js";
4
- export function useContentLoader(contentProvider) {
5
- const [store] = useState(createContentLoaderStore);
6
- const loadSeq = useSelector(store, (snapshot) => selectLoadSeq(snapshot.context));
7
- useEffect(() => {
8
- store.trigger.loadStarted({
9
- marks: contentProvider.marks ?? [],
10
- title: contentProvider.title,
11
- });
12
- const requestId = store.getSnapshot().context.requestId;
13
- const loaded = contentProvider.load();
14
- if (isAsyncIterable(loaded)) {
15
- store.trigger.streamStarted({
16
- requestId,
17
- format: contentProvider.format ?? "markdown",
18
- });
19
- const iterator = loaded[Symbol.asyncIterator]();
20
- (async () => {
21
- try {
22
- while (true) {
23
- const result = await iterator.next();
24
- if (result.done)
25
- break;
26
- store.trigger.chunkReceived({ requestId, chunk: result.value });
27
- }
28
- store.trigger.streamEnded({ requestId });
29
- }
30
- catch (error) {
31
- store.trigger.loadFailed({ requestId, error: normalizeError(error) });
32
- }
33
- })();
34
- return () => {
35
- store.trigger.loadCancelled({ requestId });
36
- Promise.resolve(iterator.return?.()).catch(() => { });
37
- };
38
- }
39
- if (loaded instanceof Promise) {
40
- loaded
41
- .then((content) => store.trigger.loaded({ requestId, content }))
42
- .catch((error) => store.trigger.loadFailed({ requestId, error: normalizeError(error) }));
43
- return () => store.trigger.loadCancelled({ requestId });
44
- }
45
- store.trigger.loaded({ requestId, content: loaded });
46
- }, [contentProvider, loadSeq, store]);
47
- const content = useSelector(store, (snapshot) => selectContent(snapshot.context));
48
- const streaming = useSelector(store, (snapshot) => selectStreaming(snapshot.context));
49
- const error = useSelector(store, (snapshot) => selectError(snapshot.context));
50
- const providerMarks = useSelector(store, (snapshot) => selectProviderMarks(snapshot.context));
51
- const status = useSelector(store, (snapshot) => selectStatus(snapshot.context));
52
- const reload = useCallback(() => store.trigger.reloadRequested({}), [store]);
53
- return { content, streaming, error, providerMarks, status, reload };
54
- }
55
- //# sourceMappingURL=useContentLoader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useContentLoader.js","sourceRoot":"","sources":["../../src/hooks/useContentLoader.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useViewCommandContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useViewCommandContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,KAAK,EAAE;QACL,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;QAClC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;QAC3C,QAAQ,EAAE,MAAM,IAAI,CAAA;QACpB,SAAS,EAAE,OAAO,EAAE,CAAA;QACpB,aAAa,EAAE,OAAO,EAAE,CAAA;KACzB,CAAA;CACF;AAED,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,cAAc;QACtB,IAAI,EAAE,kBAAkB,CAAA;KACzB;CACF;AAID,MAAM,WAAW,+BAA+B;IAC9C;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,gCAAgC,GAAG,+BAA+B,CAAA;AAE9E,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,MAAM,EACN,KAAK,EACL,IAAI,EACJ,MAAM,EACN,KAAK,GACN,EAAE,+BAA+B,GAAG,kBAAkB,CAwBtD;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,gCAAgC,GAAG,CAAC,MAAM,gCAAgC,CAAC,QAKrF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useViewCommandContext.js","sourceRoot":"","sources":["../../src/hooks/useViewCommandContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAiC7D,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;AAiBrB,MAAM,UAAU,wBAAwB,CAAC,EACvC,OAAO,EACP,MAAM,EACN,KAAK,EACL,IAAI,EACJ,MAAM,EACN,KAAK,GAC2B;IAChC,MAAM,cAAc,GAAG,MAAM,IAAI,OAAO,EAAE,MAAM,IAAI,QAAQ,CAAA;IAC5D,MAAM,eAAe,GACnB,OAAO;QACN;YACC,MAAM,EAAE,cAAc;YACtB,IAAI;YACJ,KAAK;SACgB,CAAA;IAEzB,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK;QAC9B,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,KAAK,EAAE;YACL,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI;YACrC,cAAc,EAAE,KAAK,EAAE,cAAc,IAAI,IAAI;YAC7C,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,IAAI;YACjC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE;YACjC,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,EAAE;SAC1C;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAoF;IAEpF,2BAA2B,CAAC,MAAM,EAAE,GAAG,EAAE,CACvC,wBAAwB,CAAC,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAC9E,CAAA;AACH,CAAC"}
@@ -1,68 +0,0 @@
1
- import { useState, useMemo } from "react"
2
- import { useCommand } from "@tooee/commands"
3
- import { View } from "./View.js"
4
- import { listDirectoryFiles, type DirectoryEntry } from "./directory-provider.js"
5
- import type { AnyContent, ContentProvider } from "./types.js"
6
- import { createFileProvider } from "./default-provider.js"
7
-
8
- function createDirectoryFileProvider(
9
- entry: DirectoryEntry,
10
- index: number,
11
- total: number,
12
- ): ContentProvider {
13
- const inner = createFileProvider(entry.path)
14
- return {
15
- async load(): Promise<AnyContent> {
16
- const result = inner.load()
17
- const content = result instanceof Promise ? await result : (result as AnyContent)
18
- return {
19
- ...content,
20
- title: `${entry.name} (${index + 1}/${total})`,
21
- }
22
- },
23
- }
24
- }
25
-
26
- interface DirectoryViewProps {
27
- dirPath: string
28
- actions?: import("@tooee/commands").ActionDefinition[]
29
- }
30
-
31
- export function DirectoryView({ dirPath, actions }: DirectoryViewProps) {
32
- const files = useMemo(() => listDirectoryFiles(dirPath), [dirPath])
33
- const [currentIndex, setCurrentIndex] = useState(0)
34
-
35
- const contentProvider = useMemo(
36
- () =>
37
- files.length > 0
38
- ? createDirectoryFileProvider(files[currentIndex], currentIndex, files.length)
39
- : null,
40
- [files, currentIndex],
41
- )
42
-
43
- useCommand({
44
- id: "dir.next-file",
45
- title: "Next file",
46
- hotkey: "l",
47
- modes: ["cursor"],
48
- handler: () => setCurrentIndex((i) => Math.min(i + 1, files.length - 1)),
49
- })
50
-
51
- useCommand({
52
- id: "dir.prev-file",
53
- title: "Previous file",
54
- hotkey: "h",
55
- modes: ["cursor"],
56
- handler: () => setCurrentIndex((i) => Math.max(i - 1, 0)),
57
- })
58
-
59
- if (files.length === 0 || !contentProvider) {
60
- return (
61
- <box>
62
- <text content="No viewable files in directory" />
63
- </box>
64
- )
65
- }
66
-
67
- return <View contentProvider={contentProvider} actions={actions} />
68
- }
package/src/View.tsx DELETED
@@ -1,94 +0,0 @@
1
- import { useCallback, useMemo, useState } from "react"
2
- import { useTheme } from "@tooee/themes"
3
- import type { ActionDefinition } from "@tooee/commands"
4
- import type { MarkSet } from "@tooee/marks"
5
- import type { CodeBlockRenderer } from "@tooee/renderers"
6
- import { isCustomContent, type ContentProvider, type ContentRenderer } from "./types.js"
7
- import { useContentLoader } from "./hooks/useContentLoader.js"
8
- import {
9
- MarkdownSubview,
10
- CodeSubview,
11
- TableSubview,
12
- CustomSubview,
13
- } from "./components/subviews/index.js"
14
-
15
- interface ViewProps {
16
- contentProvider: ContentProvider
17
- actions?: ActionDefinition[]
18
- renderers?: Record<string, ContentRenderer>
19
- /**
20
- * Custom renderers for fenced code blocks in markdown content, keyed by
21
- * fence type (first word of the fence info string, case-insensitive).
22
- */
23
- codeBlockRenderers?: Record<string, CodeBlockRenderer>
24
- }
25
-
26
- export function View({ contentProvider, actions, renderers, codeBlockRenderers }: ViewProps) {
27
- const { theme } = useTheme()
28
- const { content, streaming, error, providerMarks, reload } = useContentLoader(contentProvider)
29
-
30
- const [userMarks, setUserMarks] = useState<MarkSet[]>([])
31
-
32
- const setMarkSet = useCallback((set: MarkSet) => {
33
- setUserMarks((prev) => {
34
- const filtered = prev.filter((s) => s.namespace !== set.namespace)
35
- return [...filtered, set]
36
- })
37
- }, [])
38
-
39
- const clearMarkNamespace = useCallback((namespace: string) => {
40
- setUserMarks((prev) => prev.filter((s) => s.namespace !== namespace))
41
- }, [])
42
-
43
- const clearAllUserMarks = useCallback(() => {
44
- setUserMarks([])
45
- }, [])
46
-
47
- // Mark sets are decoration layers; the controller composes them with the
48
- // interaction layers it generates, ordered by each set's own priority.
49
- const decorations = useMemo(() => [...providerMarks, ...userMarks], [providerMarks, userMarks])
50
-
51
- if (error) {
52
- return (
53
- <box style={{ flexDirection: "column" }}>
54
- <text content={`Error: ${error}`} fg={theme.error} />
55
- </box>
56
- )
57
- }
58
-
59
- if (!content) {
60
- return (
61
- <box>
62
- <text content="Loading..." fg={theme.textMuted} />
63
- </box>
64
- )
65
- }
66
-
67
- const shared = {
68
- decorations,
69
- providerMarks,
70
- userMarks,
71
- setMarkSet,
72
- clearMarkNamespace,
73
- clearAllUserMarks,
74
- reload,
75
- streaming,
76
- actions,
77
- }
78
-
79
- if (isCustomContent(content)) {
80
- return <CustomSubview content={content} renderers={renderers} {...shared} />
81
- }
82
-
83
- switch (content.format) {
84
- case "markdown":
85
- return (
86
- <MarkdownSubview content={content} codeBlockRenderers={codeBlockRenderers} {...shared} />
87
- )
88
- case "code":
89
- case "text":
90
- return <CodeSubview content={content} {...shared} />
91
- case "table":
92
- return <TableSubview content={content} {...shared} />
93
- }
94
- }
@@ -1,65 +0,0 @@
1
- import { useMemo } from "react"
2
- import { Table, type TableRow } from "@tooee/renderers"
3
- import { useDocumentController } from "@tooee/shell"
4
- import { getTextContent, type TableContent } from "../../types.js"
5
- import { useContentCommands } from "../../hooks/useContentCommands.js"
6
- import { ViewScreen } from "../ViewScreen.js"
7
- import type { SubviewProps } from "./types.js"
8
-
9
- interface TableSubviewProps extends SubviewProps {
10
- content: TableContent
11
- }
12
-
13
- export function TableSubview({ content, decorations, actions, ...screen }: TableSubviewProps) {
14
- const textContent = useMemo(() => getTextContent(content), [content])
15
- const { showLineNumbers } = useContentCommands({ content, textContent })
16
-
17
- const { columns, rows } = content
18
- const adapter = useMemo(
19
- () => ({
20
- getText: (row: TableRow) =>
21
- columns.map((column) => stringifyRowCell(row[column.key])).join("\t"),
22
- }),
23
- [columns],
24
- )
25
- const document = useDocumentController<TableRow>({
26
- rows,
27
- adapter,
28
- multiSelect: true,
29
- decorations,
30
- // The controller projects the screen's actions onto menu entries at open time.
31
- contextMenu: actions,
32
- })
33
-
34
- const statusItems = useMemo(
35
- () => [
36
- { label: "Format:", value: content.format },
37
- { label: "Rows:", value: String(rows.length) },
38
- { label: "Cols:", value: String(columns.length) },
39
- ],
40
- [content.format, rows.length, columns.length],
41
- )
42
-
43
- return (
44
- <ViewScreen
45
- content={content}
46
- controller={document}
47
- actions={actions}
48
- statusItems={statusItems}
49
- {...screen}
50
- >
51
- <Table columns={columns} rows={rows} showLineNumbers={showLineNumbers} document={document} />
52
- </ViewScreen>
53
- )
54
- }
55
-
56
- function stringifyRowCell(value: unknown): string {
57
- if (value == null) return ""
58
- if (typeof value === "string") return value
59
- if (typeof value === "number" || typeof value === "boolean") return String(value)
60
- try {
61
- return JSON.stringify(value)
62
- } catch {
63
- return String(value)
64
- }
65
- }
@@ -1,72 +0,0 @@
1
- import { useCallback, useEffect, useState } from "react"
2
- import { useSelector } from "@xstate/store-react"
3
- import type { ContentProvider } from "../types.js"
4
- import {
5
- createContentLoaderStore,
6
- isAsyncIterable,
7
- normalizeError,
8
- selectContent,
9
- selectError,
10
- selectLoadSeq,
11
- selectProviderMarks,
12
- selectStatus,
13
- selectStreaming,
14
- } from "../content-loader-store.js"
15
-
16
- export function useContentLoader(contentProvider: ContentProvider) {
17
- const [store] = useState(createContentLoaderStore)
18
- const loadSeq = useSelector(store, (snapshot) => selectLoadSeq(snapshot.context))
19
-
20
- useEffect(() => {
21
- store.trigger.loadStarted({
22
- marks: contentProvider.marks ?? [],
23
- title: contentProvider.title,
24
- })
25
- const requestId = store.getSnapshot().context.requestId
26
- const loaded = contentProvider.load()
27
-
28
- if (isAsyncIterable(loaded)) {
29
- store.trigger.streamStarted({
30
- requestId,
31
- format: contentProvider.format ?? "markdown",
32
- })
33
- const iterator = loaded[Symbol.asyncIterator]()
34
- ;(async () => {
35
- try {
36
- while (true) {
37
- const result = await iterator.next()
38
- if (result.done) break
39
- store.trigger.chunkReceived({ requestId, chunk: result.value })
40
- }
41
- store.trigger.streamEnded({ requestId })
42
- } catch (error) {
43
- store.trigger.loadFailed({ requestId, error: normalizeError(error) })
44
- }
45
- })()
46
- return () => {
47
- store.trigger.loadCancelled({ requestId })
48
- Promise.resolve(iterator.return?.()).catch(() => {})
49
- }
50
- }
51
-
52
- if (loaded instanceof Promise) {
53
- loaded
54
- .then((content) => store.trigger.loaded({ requestId, content }))
55
- .catch((error: unknown) =>
56
- store.trigger.loadFailed({ requestId, error: normalizeError(error) }),
57
- )
58
- return () => store.trigger.loadCancelled({ requestId })
59
- }
60
-
61
- store.trigger.loaded({ requestId, content: loaded })
62
- }, [contentProvider, loadSeq, store])
63
-
64
- const content = useSelector(store, (snapshot) => selectContent(snapshot.context))
65
- const streaming = useSelector(store, (snapshot) => selectStreaming(snapshot.context))
66
- const error = useSelector(store, (snapshot) => selectError(snapshot.context))
67
- const providerMarks = useSelector(store, (snapshot) => selectProviderMarks(snapshot.context))
68
- const status = useSelector(store, (snapshot) => selectStatus(snapshot.context))
69
- const reload = useCallback(() => store.trigger.reloadRequested({}), [store])
70
-
71
- return { content, streaming, error, providerMarks, status, reload }
72
- }