@@ -5,21 +5,215 @@
5 import Symbol from './Symbol.svelte';
5 import Symbol from './Symbol.svelte';
7 import type { PartType, SymbolQuery } from 'types/sigil';
7 import type { PartType, SymbolQuery } from 'types/sigil';
8− import { PART_TYPES } from 'types/sigil';
10 export let symbolQuery: SymbolQuery;
9 export let symbolQuery: SymbolQuery;
11− export let inputMode: PartType;
10+ // export let inputMode: PartType;
11+ export let inputComponents: string[] = [];
12+ export let unfocusSymbol: Function;
15+ [mode: string]: ModeDef
19+ displayParts?: string[];
23+ const modeDefs: ModeDefs = {
26+ displayParts: ['ghb'],
31+ parts: ['lvf', 'lhf', 'lff', 'lbf'],
34+ parts: ['lvfl', 'lvfr', 'lhft', 'lhfb', 'lfht', 'lfhb', 'lbht', 'lbhb'],
37+ parts: ['lff', 'lfft', 'lffb'],
40+ parts: ['lbf', 'lbft'],
43+ parts: ['lbhtf', 'lbrf', 'lfhm'],
46+ parts: ['lvf', 'lvfl', 'lvfr', 'lhf', 'lhft', 'lhfb', 'lff', 'lbf'],
51+ parts: ['atrf8', 'atrf6', 'atrf4', 'atrf2'],
54+ parts: [/*'atra8',*/ 'atra6', 'atra4', 'atra2', 'atrb8', 'atrb6', 'atrb4', 'atrb2'],
55+ displayParts: ['atrb8', 'atrb6', 'atrb4', 'atrb2'],
58+ parts: ['atlf8', 'atlf6', 'atlf4', 'atlf2'],
61+ parts: ['atla8', 'atla6', 'atla4', 'atla2', 'atlb8', 'atlb6', 'atlb4', 'atlb2'],
62+ displayParts: ['atlb8', 'atlb6', 'atlb4', 'atlb2'],
65+ parts: ['ablf8', 'ablf6', 'ablf4', 'ablf2'],
68+ parts: ['ablb8', 'ablb6', 'ablb4', 'ablb2'],
69+ displayParts: ['ablb8', 'ablb6', 'ablb4', 'ablb2'],
72+ parts: ['abrf8', 'abrf6', 'abrf4', 'abrf2'],
75+ parts: ['abrb8', 'abrb6', 'abrb4', 'abrb2'],
76+ displayParts: ['abrb8', 'abrb6', 'abrb4', 'abrb2'],
79+ parts: ['ablf8', 'ablf6', 'ablf4', 'ablf2'],
84+ parts: ['am081', 'am082', 'am083', 'am08s'],
87+ parts: ['am741', 'am742', 'am743', 'am422', 'am423'],
90+ parts: ['ab2', 'ab3', 'ab4', 'at1', 'at3', 'at4'],
93+ parts: ['al2', 'al3', 'al4', 'ar1', 'ar2', 'ar4'/*, 'arb2'*/],
96+ parts: ['am642', 'am643'],
99+ parts: ['am222', 'am223', 'am622', 'am623'],
102+ parts: ['am142', 'am443'],
105+ parts: ['am021', 'am022', 'am023', 'am242', 'arb2'],
111+ parts: ['am222', 'am223', 'ar4', 'ar2', 'ar1'],
117+ 'ct2mb', 'cl2mb', 'cb2mb', 'cr2mb',
121+ parts: ['dbl', /*'dl',*/ 'dm', 'dtl', 'dtr'],
124+ parts: ['b1l1', 'b1l2', 'b1l3'],
127+ let modes: string[] = [];
128+ let modeDef: ModeDef = undefined;
129+ let subModeDefs: ModeDefs = modeDefs;
13 let size = 48;
130 let size = 48;
134+ if (!symbolQuery.geon) {
139+ function pushMode(mode: string) {
140+ if (modeDef?.modes) {
141+ modes = [...modes, mode];
143+ modes = [...modes.slice(0, -1), mode];
147+ function popMode() {
149+ if (modeDef?.modes) {
150+ modes = modes.slice(0, -1);
152+ modes = modes.slice(0, -2);
160+ modeDef = undefined;
161+ subModeDefs = modeDefs;
162+ for (let mode of modes) {
163+ if (modeDef && modeDef.modes) {
164+ subModeDefs = modeDef.modes;
166+ if (subModeDefs[mode]) {
167+ modeDef = subModeDefs[mode];
169+ console.error(`Unknown mode: ${mode} of ${modes} in defs:`, subModeDefs);
173+ if (modeDef && modeDef.modes) {
174+ subModeDefs = modeDef.modes;
177+ if (modeDef?.parts?.length && !modeDef.modes) {
178+ inputComponents = modeDef.parts;
180+ inputComponents = [];
186+ symbolQuery = symbolQuery.clearPartType(modes[0] as PartType);
188+ symbolQuery = symbolQuery.clear();
16<div class="grid grid-rows-2 grid-flow-col xs:grid-cols-2 xs:grid-flow-row place-content-center justify-center">
193<div class="grid grid-rows-2 grid-flow-col xs:grid-cols-2 xs:grid-flow-row place-content-center justify-center">
195+ class="aspect-square"
201+ class="aspect-square"
17− {#if inputMode === 'geon'}
206+ {#if modes[0] === 'geon'}
18− <GeonSelector bind:symbolQuery bind:inputMode />
207+ <GeonSelector bind:symbolQuery {popMode} />
20− {#each PART_TYPES as partType}
209+ <!-- {#each PART_TYPES as partType}
21− <SymbolInputModeSelectorButton {partType} focused={inputMode === partType}
210+ <SymbolInputModeSelectorButton {partType} focused={modes[0] === partType}
22− on:click={() => inputMode = partType}
211+ on:click={() => pushMode(partType)}
214+ {#each Object.entries(subModeDefs) as [modeName, def]}
215+ <SymbolInputModeSelectorButton components={def.displayParts || def.parts} focused={modes.slice(-1)[0] === modeName}
216+ on:click={() => pushMode(modeName)}