|
1 | 1 | <template> |
2 | 2 | <section id="terminal-display"> |
3 | | - <p>Welcome to fish, the friendly interactive shell</p> |
4 | | - <p> |
5 | | - Type <span class="green">help</span> for instructions on how to use fish |
6 | | - </p> |
7 | | - <p> |
8 | | - <span class="cyan">ciembor</span>@browser |
9 | | - <span class="cyan">~</span>> |
10 | | - <span class="blue">./colors.sh</span> |
11 | | - </p> |
12 | | - <br /> |
13 | | - |
14 | | - <table id="colors"> |
15 | | - <tr> |
16 | | - <th v-for="(th, index) in columnsTh" :key="`column-${index}`">{{ th }}</th> |
17 | | - </tr> |
18 | | - <tr v-for="(fontColorName, rowIndex) in fontColorNames" :key="`row-${rowIndex}`"> |
19 | | - <th class="row-th">{{ rowsTh[rowIndex] }}</th> |
20 | | - <td |
21 | | - v-for="(backgroundColorName, colIndex) in backgroundColorNames" |
22 | | - :key="`cell-${rowIndex}-${colIndex}`" |
23 | | - :class="getCellClass(fontColorName, backgroundColorName)" |
24 | | - > |
25 | | - gYw |
26 | | - </td> |
27 | | - </tr> |
28 | | - </table> |
29 | | - |
30 | | - <br /> |
31 | | - <p><span class="cyan">ciembor</span>@browser <span class="cyan">~</span>></p> |
| 3 | + <div ref="terminalElement" class="terminal-display__xterm" aria-label="Terminal color preview"></div> |
32 | 4 | </section> |
33 | 5 | </template> |
34 | 6 |
|
35 | 7 | <script> |
| 8 | +import { watch } from 'vue'; |
| 9 | +import { buildTerminalPreviewSequence } from '../../../application/terminal-preview/build-terminal-preview-sequence'; |
| 10 | +import { useCalculatedSchemeStore } from '../../shared/stores/calculated-scheme'; |
| 11 | +import { createXtermTerminalPreview } from '../terminal-preview/xterm-terminal-preview'; |
| 12 | +import { xtermThemeFromScheme } from '../terminal-preview/xterm-theme'; |
| 13 | +
|
36 | 14 | export default { |
37 | 15 | name: 'TerminalDisplay', |
38 | | - data() { |
39 | | - return { |
40 | | - columnsTh: [' ', ' ', '40m', '41m', '42m', '43m', '44m', '45m', '46m', '47m'], |
41 | | - rowsTh: ['m', '1m', '30m', '1;30m', '31m', '1;31m', '32m', '1;32m', '33m', '1;33m', '34m', '1;34m', '35m', '1;35m', '36m', '1;36m', '37m', '1;37m' |
42 | | - ], |
43 | | - backgroundColorNames: [ |
44 | | - 'background', |
45 | | - 'black', |
46 | | - 'red', |
47 | | - 'green', |
48 | | - 'yellow', |
49 | | - 'blue', |
50 | | - 'magenta', |
51 | | - 'cyan', |
52 | | - 'white', |
53 | | - ], |
54 | | - fontColorNames: [ |
55 | | - 'foreground', |
56 | | - 'brightForeground', |
57 | | - 'black', |
58 | | - 'brightBlack', |
59 | | - 'red', |
60 | | - 'brightRed', |
61 | | - 'green', |
62 | | - 'brightGreen', |
63 | | - 'yellow', |
64 | | - 'brightYellow', |
65 | | - 'blue', |
66 | | - 'brightBlue', |
67 | | - 'magenta', |
68 | | - 'brightMagenta', |
69 | | - 'cyan', |
70 | | - 'brightCyan', |
71 | | - 'white', |
72 | | - 'brightWhite' |
73 | | - ] |
74 | | - }; |
| 16 | + setup() { |
| 17 | + const calculatedSchemeStore = useCalculatedSchemeStore(); |
| 18 | +
|
| 19 | + return { calculatedSchemeStore }; |
| 20 | + }, |
| 21 | + mounted() { |
| 22 | + this.previewSequence = buildTerminalPreviewSequence(); |
| 23 | + this.terminalPreview = createXtermTerminalPreview(this.$refs.terminalElement); |
| 24 | + this.stopThemeWatcher = watch( |
| 25 | + () => this.calculatedSchemeStore.calculatedScheme, |
| 26 | + (colors) => { |
| 27 | + this.renderTerminalPreview(colors); |
| 28 | + }, |
| 29 | + { immediate: true, deep: true } |
| 30 | + ); |
| 31 | + }, |
| 32 | + beforeUnmount() { |
| 33 | + this.stopThemeWatcher?.(); |
| 34 | + this.terminalPreview?.dispose(); |
75 | 35 | }, |
76 | 36 | methods: { |
77 | | - getCellClass(name, bgName) { |
78 | | - let classes = ''; |
79 | | - if (name.startsWith('bright')) { |
80 | | - classes += 'bold '; |
81 | | - } |
82 | | - classes += `${name} ${bgName}Bg`; |
83 | | - return classes; |
84 | | - } |
85 | | - } |
| 37 | + renderTerminalPreview(colors) { |
| 38 | + this.terminalPreview?.render(this.previewSequence, xtermThemeFromScheme(colors)); |
| 39 | + }, |
| 40 | + }, |
86 | 41 | }; |
87 | 42 | </script> |
88 | 43 |
|
89 | 44 | <style lang="less" scoped> |
90 | 45 | #terminal-display { |
91 | 46 | visibility: visible; |
92 | 47 | display: inline-block; |
93 | | - font-family: Inconsolata; |
94 | | - font-size: 20px; |
95 | 48 | margin: 26px 0 0 20px; |
96 | 49 | width: auto; |
97 | 50 | height: auto; |
98 | 51 | padding: 1px 2px; |
99 | 52 | box-shadow: 0 0 10px #666; |
100 | | - color: var(--color-foreground); |
101 | | - background-color: var(--color-background); |
102 | | -
|
103 | | - table { |
104 | | - border-collapse: separate; |
105 | | - border-spacing: 0.5em 0; |
106 | | - margin-right: 0.5em; |
107 | | - } |
108 | | -
|
109 | | - td { |
110 | | - margin-left: 1em; |
111 | | - padding: 0 1em; |
112 | | - } |
113 | | -
|
114 | | - .bold { |
115 | | - font-weight: bold; // opera sux |
116 | | - } |
117 | | -
|
118 | | - .row-th { |
119 | | - text-align: right; |
120 | | - } |
121 | | -} |
122 | | -
|
123 | | -.foreground, |
124 | | -.brightForeground { |
125 | | - color: var(--color-foreground); |
126 | | -} |
127 | | -
|
128 | | -.backgroundBg { |
129 | 53 | background-color: var(--color-background); |
130 | 54 | } |
131 | | -
|
132 | | -.black { color: var(--color-black); } |
133 | | -.brightBlack { color: var(--color-bright-black); } |
134 | | -.red { color: var(--color-red); } |
135 | | -.brightRed { color: var(--color-bright-red); } |
136 | | -.green { color: var(--color-green); } |
137 | | -.brightGreen { color: var(--color-bright-green); } |
138 | | -.yellow { color: var(--color-yellow); } |
139 | | -.brightYellow { color: var(--color-bright-yellow); } |
140 | | -.blue { color: var(--color-blue); } |
141 | | -.brightBlue { color: var(--color-bright-blue); } |
142 | | -.magenta { color: var(--color-magenta); } |
143 | | -.brightMagenta { color: var(--color-bright-magenta); } |
144 | | -.cyan { color: var(--color-cyan); } |
145 | | -.brightCyan { color: var(--color-bright-cyan); } |
146 | | -.white { color: var(--color-white); } |
147 | | -.brightWhite { color: var(--color-bright-white); } |
148 | | -
|
149 | | -.blackBg { background-color: var(--color-black); } |
150 | | -.brightBlackBg { background-color: var(--color-bright-black); } |
151 | | -.redBg { background-color: var(--color-red); } |
152 | | -.brightRedBg { background-color: var(--color-bright-red); } |
153 | | -.greenBg { background-color: var(--color-green); } |
154 | | -.brightGreenBg { background-color: var(--color-bright-green); } |
155 | | -.yellowBg { background-color: var(--color-yellow); } |
156 | | -.brightYellowBg { background-color: var(--color-bright-yellow); } |
157 | | -.blueBg { background-color: var(--color-blue); } |
158 | | -.brightBlueBg { background-color: var(--color-bright-blue); } |
159 | | -.magentaBg { background-color: var(--color-magenta); } |
160 | | -.brightMagentaBg { background-color: var(--color-bright-magenta); } |
161 | | -.cyanBg { background-color: var(--color-cyan); } |
162 | | -.brightCyanBg { background-color: var(--color-bright-cyan); } |
163 | | -.whiteBg { background-color: var(--color-white); } |
164 | | -.brightWhiteBg { background-color: var(--color-bright-white); } |
165 | 55 | </style> |
0 commit comments