@tutorialkit-rb/react 1.5.2-rb.0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/BootScreen.d.ts +7 -0
  2. package/dist/BootScreen.js +37 -0
  3. package/dist/Button.d.ts +6 -0
  4. package/dist/Button.js +12 -0
  5. package/dist/Nav.d.ts +7 -0
  6. package/dist/Nav.js +38 -0
  7. package/dist/Panels/EditorPanel.d.ts +25 -0
  8. package/dist/Panels/EditorPanel.js +83 -0
  9. package/dist/Panels/PreviewPanel.d.ts +20 -0
  10. package/dist/Panels/PreviewPanel.js +166 -0
  11. package/dist/Panels/TerminalPanel.d.ts +7 -0
  12. package/dist/Panels/TerminalPanel.js +45 -0
  13. package/dist/Panels/WorkspacePanel.d.ts +14 -0
  14. package/dist/Panels/WorkspacePanel.js +166 -0
  15. package/dist/core/CodeMirrorEditor/BinaryContent.d.ts +1 -0
  16. package/dist/core/CodeMirrorEditor/BinaryContent.js +4 -0
  17. package/dist/core/CodeMirrorEditor/cm-theme.d.ts +8 -0
  18. package/dist/core/CodeMirrorEditor/cm-theme.js +167 -0
  19. package/dist/core/CodeMirrorEditor/indent.d.ts +2 -0
  20. package/dist/core/CodeMirrorEditor/indent.js +49 -0
  21. package/dist/core/CodeMirrorEditor/index.d.ts +39 -0
  22. package/dist/core/CodeMirrorEditor/index.js +201 -0
  23. package/dist/core/CodeMirrorEditor/languages.d.ts +3 -0
  24. package/dist/core/CodeMirrorEditor/languages.js +118 -0
  25. package/dist/core/CodeMirrorEditor/themes/vscode-dark.d.ts +2 -0
  26. package/dist/core/CodeMirrorEditor/themes/vscode-dark.js +75 -0
  27. package/dist/core/ContextMenu.d.ts +29 -0
  28. package/dist/core/ContextMenu.js +61 -0
  29. package/dist/core/Dialog.d.ts +15 -0
  30. package/dist/core/Dialog.js +12 -0
  31. package/dist/core/FileTree.d.ts +18 -0
  32. package/dist/core/FileTree.js +194 -0
  33. package/dist/core/Terminal/index.d.ts +15 -0
  34. package/dist/core/Terminal/index.js +57 -0
  35. package/dist/core/Terminal/theme.d.ts +2 -0
  36. package/dist/core/Terminal/theme.js +31 -0
  37. package/dist/core/types.d.ts +1 -0
  38. package/dist/core/types.js +1 -0
  39. package/dist/core.d.ts +3 -0
  40. package/dist/core.js +3 -0
  41. package/dist/hooks/useOutsideClick.d.ts +1 -0
  42. package/dist/hooks/useOutsideClick.js +14 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.js +9 -0
  45. package/dist/styles/cm.css +100 -0
  46. package/dist/styles/nav.module.css +108 -0
  47. package/dist/styles/resize-panel.module.css +28 -0
  48. package/dist/styles/terminal.css +8 -0
  49. package/dist/utils/classnames.d.ts +16 -0
  50. package/dist/utils/classnames.js +47 -0
  51. package/dist/utils/debounce.d.ts +1 -0
  52. package/dist/utils/debounce.js +13 -0
  53. package/dist/utils/mobile.d.ts +1 -0
  54. package/dist/utils/mobile.js +4 -0
  55. package/package.json +116 -0
@@ -0,0 +1 @@
1
+ export declare function useOutsideClick(ref: React.RefObject<HTMLDivElement>, onOutsideClick?: () => void): void;
@@ -0,0 +1,14 @@
1
+ import { useEffect } from 'react';
2
+ export function useOutsideClick(ref, onOutsideClick) {
3
+ useEffect(() => {
4
+ function handleClickOutside(event) {
5
+ if (ref.current && !ref.current.contains(event.target)) {
6
+ onOutsideClick?.();
7
+ }
8
+ }
9
+ document.addEventListener('mousedown', handleClickOutside);
10
+ return () => {
11
+ document.removeEventListener('mousedown', handleClickOutside);
12
+ };
13
+ }, [ref]);
14
+ }
@@ -0,0 +1,10 @@
1
+ export * from './BootScreen.js';
2
+ export * from './Button.js';
3
+ export * from './Nav.js';
4
+ export * from './Panels/EditorPanel.js';
5
+ export * from './Panels/PreviewPanel.js';
6
+ export * from './Panels/TerminalPanel.js';
7
+ export * from './Panels/WorkspacePanel.js';
8
+ export { default as Dialog } from './core/Dialog.js';
9
+ export type * from './core/types.js';
10
+ export * from './utils/classnames.js';
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from './BootScreen.js';
2
+ export * from './Button.js';
3
+ export * from './Nav.js';
4
+ export * from './Panels/EditorPanel.js';
5
+ export * from './Panels/PreviewPanel.js';
6
+ export * from './Panels/TerminalPanel.js';
7
+ export * from './Panels/WorkspacePanel.js';
8
+ export { default as Dialog } from './core/Dialog.js';
9
+ export * from './utils/classnames.js';
@@ -0,0 +1,100 @@
1
+ :root {
2
+ --cm-backgroundColor: var(--tk-elements-editor-backgroundColor, var(--tk-elements-app-backgroundColor));
3
+ --cm-textColor: var(--tk-elements-editor-textColor, var(--tk-text-primary));
4
+
5
+ /* Gutter */
6
+ --cm-gutter-backgroundColor: var(--tk-elements-editor-gutter-backgroundColor, var(--cm-backgroundColor));
7
+ --cm-gutter-textColor: var(--tk-elements-editor-gutter-textColor, var(--tk-text-secondary));
8
+ --cm-gutter-activeLineTextColor: var(--tk-elements-editor-gutter-activeLineTextColor, var(--cm-gutter-textColor));
9
+
10
+ /* Fold Gutter */
11
+ --cm-foldGutter-textColor: var(--tk-elements-editor-foldGutter-textColor, var(--cm-gutter-textColor));
12
+ --cm-foldGutter-textColorHover: var(--tk-elements-editor-foldGutter-textColorHover, var(--cm-gutter-textColor));
13
+
14
+ /* Active Line */
15
+ --cm-activeLineBackgroundColor: var(--tk-elements-editor-activeLineBackgroundColor, rgb(224 231 235 / 30%));
16
+
17
+ /* Cursor */
18
+ --cm-cursor-width: 2px;
19
+ --cm-cursor-backgroundColor: var(--tk-elements-editor-cursorColor, var(--tk-text-primary));
20
+
21
+ /* Matching Brackets */
22
+ --cm-matching-bracket: var(--tk-elements-editor-matchingBracketBackgroundColor, rgb(50 140 130 / 0.3));
23
+
24
+ /* Selection */
25
+ --cm-selection-backgroundColorFocused: var(--tk-elements-editor-selection-backgroundColor, #42b4ff);
26
+ --cm-selection-backgroundOpacityFocused: var(--tk-elements-editor-selection-backgroundOpacity, 0.3);
27
+ --cm-selection-backgroundColorBlured: var(--tk-elements-editor-selection-inactiveBackgroundColor, #c9e9ff);
28
+ --cm-selection-backgroundOpacityBlured: var(--tk-elements-editor-selection-inactiveBackgroundOpacity, 0.3);
29
+
30
+ /* Panels */
31
+ --cm-panels-borderColor: var(--tk-elements-editor-panels-borderColor, var(--tk-elements-app-borderColor));
32
+
33
+ /* Search */
34
+ --cm-search-backgroundColor: var(--tk-elements-editor-search-backgroundColor, var(--cm-backgroundColor));
35
+ --cm-search-textColor: var(--tk-elements-editor-search-textColor, var(--tk-elements-app-textColor));
36
+ --cm-search-closeButton-backgroundColor: var(--tk-elements-editor-search-closeButton-backgroundColor, transparent);
37
+ --cm-search-closeButton-backgroundColorHover: var(
38
+ --tk-elements-editor-search-closeButton-backgroundColorHover,
39
+ var(--tk-background-secondary)
40
+ );
41
+ --cm-search-closeButton-textColor: var(--tk-elements-editor-search-closeButton-textColor, var(--tk-text-secondary));
42
+ --cm-search-closeButton-textColorHover: var(
43
+ --tk-elements-editor-search-closeButton-textColorHover,
44
+ var(--tk-text-primary)
45
+ );
46
+ --cm-search-button-backgroundColor: var(
47
+ --tk-elements-editor-search-button-backgroundColor,
48
+ var(--tk-background-secondary)
49
+ );
50
+ --cm-search-button-backgroundColorHover: var(
51
+ --tk-elements-editor-search-button-backgroundColorHover,
52
+ var(--tk-background-active)
53
+ );
54
+ --cm-search-button-textColor: var(--tk-elements-editor-search-button-textColor, var(--tk-text-secondary));
55
+ --cm-search-button-textColorHover: var(--tk-elements-editor-search-button-textColorHover, var(--tk-text-primary));
56
+ --cm-search-button-borderColor: var(--tk-elements-editor-search-button-borderColor, transparent);
57
+ --cm-search-button-borderColorHover: var(
58
+ --tk-elements-editor-search-button-borderColorHover,
59
+ var(--cm-search-button-borderColor)
60
+ );
61
+ --cm-search-button-borderColorFocused: var(
62
+ --tk-elements-editor-search-button-borderColorFocused,
63
+ var(--tk-border-accent)
64
+ );
65
+ --cm-search-input-backgroundColor: var(
66
+ --tk-elements-editor-search-input-backgroundColor,
67
+ var(--tk-background-primary)
68
+ );
69
+ --cm-search-input-borderColor: var(--tk-elements-editor-search-input-borderColor, var(--tk-elements-app-borderColor));
70
+ --cm-search-input-borderColorFocused: var(
71
+ --tk-elements-editor-search-input-borderColorFocused,
72
+ var(--tk-border-accent)
73
+ );
74
+
75
+ /* Tooltip */
76
+ --cm-tooltip-backgroundColor: var(
77
+ --tk-elements-editor-tooltip-backgroundColor,
78
+ var(--tk-elements-app-backgroundColor)
79
+ );
80
+ --cm-tooltip-textColor: var(--tk-elements-editor-tooltip-textColor, var(--tk-text-primary));
81
+ --cm-tooltip-backgroundColorSelected: var(
82
+ --tk-elements-editor-tooltip-backgroundColorSelected,
83
+ var(--tk-background-accent)
84
+ );
85
+ --cm-tooltip-textColorSelected: var(--tk-elements-editor-tooltip-textColorSelected, var(--tk-text-primary));
86
+ --cm-tooltip-borderColor: var(--tk-elements-editor-tooltip-borderColor, var(--tk-elements-app-borderColor));
87
+ }
88
+
89
+ html[data-theme='light'] {
90
+ --tk-elements-editor-gutter-textColor: #237893;
91
+ --tk-elements-editor-gutter-activeLineTextColor: var(--tk-text-primary);
92
+ --tk-elements-editor-foldGutter-textColorHover: var(--tk-text-primary);
93
+ }
94
+
95
+ html[data-theme='dark'] {
96
+ --tk-elements-editor-gutter-activeLineTextColor: var(--tk-text-primary);
97
+ --tk-elements-editor-selection-backgroundOpacityBlured: 0.1;
98
+ --tk-elements-editor-activeLineBackgroundColor: rgb(50 53 63 / 50%);
99
+ --tk-elements-editor-foldGutter-textColorHover: var(--tk-text-primary);
100
+ }
@@ -0,0 +1,108 @@
1
+ .AccordionTrigger[data-state='open'] .AccordionTriggerIcon {
2
+ --un-rotate: 90deg;
3
+ }
4
+
5
+ .AccordionTrigger {
6
+ --at-apply: text-tk-elements-breadcrumbs-dropdown-accordionTextColor;
7
+ }
8
+
9
+ .AccordionTrigger.AccordionTriggerActive {
10
+ --at-apply: text-tk-elements-breadcrumbs-dropdown-accordionTextColorSelected;
11
+ }
12
+
13
+ .AccordionTrigger:hover {
14
+ --at-apply: text-tk-elements-breadcrumbs-dropdown-accordionTextColorHover;
15
+ }
16
+
17
+ .AccordionTrigger .AccordionTriggerIcon {
18
+ --at-apply: transition-color duration-100 text-tk-elements-breadcrumbs-dropdown-accordionIconColor;
19
+ }
20
+
21
+ .AccordionTrigger.AccordionTriggerActive .AccordionTriggerIcon {
22
+ --at-apply: text-tk-elements-breadcrumbs-dropdown-accordionIconColorSelected;
23
+ }
24
+
25
+ .AccordionTrigger:hover .AccordionTriggerIcon {
26
+ --at-apply: text-tk-elements-breadcrumbs-dropdown-accordionIconColorHover;
27
+ }
28
+
29
+ .AccordionContent {
30
+ overflow: hidden;
31
+ }
32
+
33
+ .AccordionContent[data-state='open'] {
34
+ animation: slideDown 200ms cubic-bezier(0.4, 0, 0.2, 1);
35
+ }
36
+
37
+ .AccordionContent[data-state='closed'] {
38
+ animation: slideUp 200ms cubic-bezier(0.4, 0, 0.2, 1);
39
+ }
40
+
41
+ .NavContainer:hover {
42
+ --at-apply: transition-theme border-tk-elements-breadcrumbs-toggleButton-borderColorHover;
43
+ }
44
+
45
+ .NavContainer[data-state='closed']:not(:hover) {
46
+ --at-apply: transition-theme border-tk-elements-breadcrumbs-toggleButton-borderColor;
47
+ }
48
+
49
+ .NavContainer[data-state='open']:not(:hover) {
50
+ --at-apply: transition-theme border-tk-elements-breadcrumbs-toggleButton-borderColorSelected;
51
+ }
52
+
53
+ .NavContainer .ToggleButton:hover {
54
+ --at-apply: transition-theme bg-tk-elements-breadcrumbs-toggleButton-backgroundColorHover
55
+ text-tk-elements-breadcrumbs-toggleButton-textColorHover;
56
+ }
57
+
58
+ .NavContainer[data-state='closed'] .ToggleButton:not(:hover) {
59
+ --at-apply: transition-theme bg-tk-elements-breadcrumbs-toggleButton-backgroundColor
60
+ text-tk-elements-breadcrumbs-toggleButton-textColor;
61
+ }
62
+
63
+ .NavContainer[data-state='open'] .ToggleButton:not(:hover) {
64
+ --at-apply: transition-theme bg-tk-elements-breadcrumbs-toggleButton-backgroundColorSelected
65
+ text-tk-elements-breadcrumbs-toggleButton-textColorSelected;
66
+ }
67
+
68
+ .NavContainer[data-state='closed'] .ToggleButton:not(:hover) .Divider {
69
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-textDividerColor;
70
+ }
71
+
72
+ .NavContainer[data-state='open'] .ToggleButton:not(:hover) .Divider {
73
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-textDividerColorSelected;
74
+ }
75
+
76
+ .NavContainer .ToggleButton:hover .Divider {
77
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-textDividerColorHover;
78
+ }
79
+
80
+ .ToggleButton .ToggleButtonIcon {
81
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-iconColor;
82
+ }
83
+
84
+ .ToggleButton:hover .ToggleButtonIcon {
85
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-iconColorHover;
86
+ }
87
+
88
+ .NavContainer[data-state='open'] .ToggleButton:not(:hover) .ToggleButtonIcon {
89
+ --at-apply: text-tk-elements-breadcrumbs-toggleButton-iconColorSelected;
90
+ }
91
+
92
+ @keyframes slideDown {
93
+ from {
94
+ height: 0;
95
+ }
96
+ to {
97
+ height: var(--radix-accordion-content-height);
98
+ }
99
+ }
100
+
101
+ @keyframes slideUp {
102
+ from {
103
+ height: var(--radix-accordion-content-height);
104
+ }
105
+ to {
106
+ height: 0;
107
+ }
108
+ }
@@ -0,0 +1,28 @@
1
+ .PanelResizeHandle {
2
+ position: relative;
3
+ }
4
+
5
+ .PanelResizeHandle[data-panel-group-direction='horizontal']:after {
6
+ content: '';
7
+ position: absolute;
8
+ top: 0;
9
+ bottom: 0;
10
+ left: -5px;
11
+ right: -5px;
12
+ z-index: 999;
13
+ }
14
+
15
+ .PanelResizeHandle[data-panel-group-direction='vertical']:after {
16
+ content: '';
17
+ position: absolute;
18
+ left: 0;
19
+ right: 0;
20
+ top: -5px;
21
+ bottom: -5px;
22
+ z-index: 999;
23
+ }
24
+
25
+ .PanelResizeHandle[data-resize-handle-state='hover']:after,
26
+ .PanelResizeHandle[data-resize-handle-state='drag']:after {
27
+ background-color: #8882;
28
+ }
@@ -0,0 +1,8 @@
1
+ .xterm {
2
+ --at-apply: h-full;
3
+ --at-apply: p-3;
4
+ }
5
+
6
+ .xterm .xterm-viewport {
7
+ --at-apply: transition-theme;
8
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright (c) 2018 Jed Watson.
3
+ * Licensed under the MIT License (MIT), see:
4
+ *
5
+ * @link http://jedwatson.github.io/classnames
6
+ */
7
+ type ClassNamesArg = undefined | false | string | Record<string, boolean> | ClassNamesArg[];
8
+ /**
9
+ * A simple JavaScript utility for conditionally joining classNames together.
10
+ *
11
+ * @param args A series of classes or object with key that are class and values
12
+ * that are interpreted as boolean to decide whether or not the class
13
+ * should be included in the final class.
14
+ */
15
+ export declare function classNames(...args: ClassNamesArg[]): string;
16
+ export {};
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copyright (c) 2018 Jed Watson.
3
+ * Licensed under the MIT License (MIT), see:
4
+ *
5
+ * @link http://jedwatson.github.io/classnames
6
+ */
7
+ /**
8
+ * A simple JavaScript utility for conditionally joining classNames together.
9
+ *
10
+ * @param args A series of classes or object with key that are class and values
11
+ * that are interpreted as boolean to decide whether or not the class
12
+ * should be included in the final class.
13
+ */
14
+ export function classNames(...args) {
15
+ let classes = '';
16
+ for (const arg of args) {
17
+ classes = appendClass(classes, parseValue(arg));
18
+ }
19
+ return classes;
20
+ }
21
+ function parseValue(arg) {
22
+ if (typeof arg === 'string' || typeof arg === 'number') {
23
+ return arg;
24
+ }
25
+ if (typeof arg !== 'object') {
26
+ return '';
27
+ }
28
+ if (Array.isArray(arg)) {
29
+ return classNames(...arg);
30
+ }
31
+ let classes = '';
32
+ for (const key in arg) {
33
+ if (arg[key]) {
34
+ classes = appendClass(classes, key);
35
+ }
36
+ }
37
+ return classes;
38
+ }
39
+ function appendClass(value, newClass) {
40
+ if (!newClass) {
41
+ return value;
42
+ }
43
+ if (value) {
44
+ return value + ' ' + newClass;
45
+ }
46
+ return value + newClass;
47
+ }
@@ -0,0 +1 @@
1
+ export declare function debounce<Args extends any[]>(fn: (...args: Args) => void, delay?: number): (...args: Args) => void;
@@ -0,0 +1,13 @@
1
+ export function debounce(fn, delay = 100) {
2
+ if (delay === 0) {
3
+ return fn;
4
+ }
5
+ let timer;
6
+ return function (...args) {
7
+ const context = this;
8
+ clearTimeout(timer);
9
+ timer = window.setTimeout(() => {
10
+ fn.apply(context, args);
11
+ }, delay);
12
+ };
13
+ }
@@ -0,0 +1 @@
1
+ export declare function isMobile(): boolean;
@@ -0,0 +1,4 @@
1
+ export function isMobile() {
2
+ // we use sm: as the breakpoint for mobile. It's currently set to 640px
3
+ return globalThis.innerWidth < 640;
4
+ }
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "@tutorialkit-rb/react",
3
+ "version": "1.5.2-rb.0.1.0",
4
+ "description": "TutorialKit's React components and utilities",
5
+ "author": "StackBlitz Inc.",
6
+ "type": "module",
7
+ "bugs": "https://github.com/stackblitz/tutorialkit/issues",
8
+ "homepage": "https://github.com/stackblitz/tutorialkit",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/Bakaface/tutorialkit.rb",
13
+ "directory": "packages/react"
14
+ },
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "import": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ }
22
+ },
23
+ "./core": {
24
+ "import": {
25
+ "types": "./dist/core.d.ts",
26
+ "default": "./dist/core.js"
27
+ }
28
+ },
29
+ "./core/CodeMirrorEditor": {
30
+ "import": {
31
+ "types": "./dist/core/CodeMirrorEditor/index.d.ts",
32
+ "default": "./dist/core/CodeMirrorEditor/index.js"
33
+ }
34
+ },
35
+ "./core/FileTree": {
36
+ "import": {
37
+ "types": "./dist/core/FileTree.d.ts",
38
+ "default": "./dist/core/FileTree.js"
39
+ }
40
+ },
41
+ "./core/Terminal": {
42
+ "import": {
43
+ "types": "./dist/core/Terminal/index.d.ts",
44
+ "default": "./dist/core/Terminal/index.js"
45
+ }
46
+ },
47
+ "./dialog": {
48
+ "import": {
49
+ "types": "./dist/core/Dialog.d.ts",
50
+ "default": "./dist/core/Dialog.js"
51
+ }
52
+ },
53
+ "./package.json": "./package.json"
54
+ },
55
+ "files": [
56
+ "dist"
57
+ ],
58
+ "scripts": {
59
+ "build": "node ./scripts/build.js",
60
+ "dev": "node ./scripts/build.js --watch",
61
+ "test": "vitest --passWithNoTests"
62
+ },
63
+ "dependencies": {
64
+ "@codemirror/autocomplete": "^6.16.3",
65
+ "@codemirror/commands": "^6.6.0",
66
+ "@codemirror/legacy-modes": "^6.5.1",
67
+ "@codemirror/lang-css": "^6.2.1",
68
+ "@codemirror/lang-html": "^6.4.9",
69
+ "@codemirror/lang-javascript": "^6.2.2",
70
+ "@codemirror/lang-json": "^6.0.1",
71
+ "@codemirror/lang-markdown": "^6.2.5",
72
+ "@codemirror/lang-sass": "^6.0.2",
73
+ "@codemirror/lang-vue": "^0.1.3",
74
+ "@codemirror/lang-wast": "^6.0.2",
75
+ "@codemirror/lang-yaml": "^6.1.1",
76
+ "@codemirror/language": "^6.10.2",
77
+ "@codemirror/state": "^6.4.1",
78
+ "@codemirror/view": "^6.28.1",
79
+ "@lezer/common": "^1.0.0",
80
+ "@lezer/highlight": "^1.2.0",
81
+ "@lezer/javascript": "^1.2.0",
82
+ "@lezer/lr": "^1.0.0",
83
+ "@nanostores/react": "0.7.2",
84
+ "@radix-ui/react-accordion": "^1.2.0",
85
+ "@radix-ui/react-context-menu": "^2.2.1",
86
+ "@radix-ui/react-dialog": "^1.1.1",
87
+ "@replit/codemirror-lang-svelte": "^6.0.0",
88
+ "@tutorialkit-rb/runtime": "1.5.2",
89
+ "@tutorialkit-rb/theme": "1.5.2",
90
+ "@webcontainer/api": "1.5.1",
91
+ "@xterm/addon-fit": "^0.10.0",
92
+ "@xterm/addon-web-links": "^0.11.0",
93
+ "@xterm/xterm": "^5.5.0",
94
+ "codemirror": "^6.0.1",
95
+ "framer-motion": "^11.2.11",
96
+ "nanostores": "^0.10.3",
97
+ "picomatch": "^4.0.2",
98
+ "react": "^18.3.1",
99
+ "react-resizable-panels": "^2.0.19"
100
+ },
101
+ "devDependencies": {
102
+ "@codemirror/search": "^6.5.6",
103
+ "@tutorialkit-rb/types": "1.5.2",
104
+ "@types/picomatch": "^3.0.1",
105
+ "@types/react": "^18.3.3",
106
+ "chokidar": "3.6.0",
107
+ "execa": "^9.2.0",
108
+ "typescript": "^5.4.5",
109
+ "vitest": "^3.0.5"
110
+ },
111
+ "keywords": [
112
+ "ruby",
113
+ "rails",
114
+ "wasm"
115
+ ]
116
+ }