@connectorvol/tree 4.1.0 → 4.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 (38) hide show
  1. package/dist/(classes)/chessTree.svelte.d.ts +2 -0
  2. package/dist/(classes)/chessTree.svelte.js +7 -1
  3. package/dist/(components)/Move.svelte +346 -310
  4. package/dist/(components)/MoveWithIcon.svelte +79 -48
  5. package/dist/(components)/NagBadges.svelte +30 -30
  6. package/dist/(components)/TreeViewer.svelte +878 -842
  7. package/dist/(components)/TreeViewerPanelManager.svelte +99 -98
  8. package/dist/(components)/VariantDropdownNavigator.svelte +177 -173
  9. package/dist/(components)/VariantDropdownNavigator.svelte.d.ts +3 -0
  10. package/dist/(utils)/parseSanMove.d.ts +6 -0
  11. package/dist/(utils)/parseSanMove.js +40 -7
  12. package/dist/components/ui/checkbox/checkbox.svelte +39 -0
  13. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +4 -0
  14. package/dist/components/ui/checkbox/index.d.ts +2 -0
  15. package/dist/components/ui/checkbox/index.js +4 -0
  16. package/dist/components/ui/popover/index.d.ts +9 -0
  17. package/dist/components/ui/popover/index.js +11 -0
  18. package/dist/components/ui/popover/popover-close.svelte +7 -0
  19. package/dist/components/ui/popover/popover-close.svelte.d.ts +4 -0
  20. package/dist/components/ui/popover/popover-content.svelte +31 -0
  21. package/dist/components/ui/popover/popover-content.svelte.d.ts +10 -0
  22. package/dist/components/ui/popover/popover-description.svelte +20 -0
  23. package/dist/components/ui/popover/popover-description.svelte.d.ts +5 -0
  24. package/dist/components/ui/popover/popover-header.svelte +20 -0
  25. package/dist/components/ui/popover/popover-header.svelte.d.ts +5 -0
  26. package/dist/components/ui/popover/popover-portal.svelte +7 -0
  27. package/dist/components/ui/popover/popover-portal.svelte.d.ts +3 -0
  28. package/dist/components/ui/popover/popover-title.svelte +20 -0
  29. package/dist/components/ui/popover/popover-title.svelte.d.ts +5 -0
  30. package/dist/components/ui/popover/popover-trigger.svelte +17 -0
  31. package/dist/components/ui/popover/popover-trigger.svelte.d.ts +4 -0
  32. package/dist/components/ui/popover/popover.svelte +7 -0
  33. package/dist/components/ui/popover/popover.svelte.d.ts +3 -0
  34. package/dist/components/ui/toggle/index.d.ts +3 -0
  35. package/dist/components/ui/toggle/index.js +5 -0
  36. package/dist/components/ui/toggle/toggle.svelte +51 -0
  37. package/dist/components/ui/toggle/toggle.svelte.d.ts +43 -0
  38. package/package.json +11 -9
@@ -1,48 +1,79 @@
1
- <script lang="ts">
2
- import type { PieceSet } from "@connectorvol/shared";
3
- import type { ParsedSanMove } from "../(utils)/parseSanMove.js";
4
-
5
- import { PieceType } from "@connectorvol/shared";
6
-
7
- import { parseSanMove } from "../(utils)/parseSanMove.js";
8
- import PieceIcon from "./PieceIcon.svelte";
9
-
10
- interface Props {
11
- /** SAN нотация хода */
12
- san: string;
13
- /** Номер полухода */
14
- ply: number;
15
- /** Размер иконки в пикселях */
16
- iconSize?: number;
17
- /** Набор фигур*/
18
- pieceSet?: PieceSet;
19
- }
20
-
21
- const { san, ply, iconSize = 16, pieceSet }: Props = $props();
22
-
23
- const parsedMove: ParsedSanMove = $derived(parseSanMove(san, ply));
24
- </script>
25
-
26
- <span class="inline-flex items-baseline">
27
- {#if parsedMove.isCastling || parsedMove.pieceType === PieceType.PAWN}
28
- <!-- Для рокировки показываем только текст -->
29
- <span>{san}</span>
30
- {:else}
31
- <!-- Для фигур показываем иконку + взятие + координаты -->
32
- <PieceIcon
33
- pieceType={parsedMove.pieceType}
34
- color={parsedMove.color}
35
- size={iconSize}
36
- {pieceSet}
37
- />
38
- {#if parsedMove.isCapture}
39
- <span>x</span>
40
- {/if}
41
- <span>{parsedMove.destination}</span>
42
- {#if parsedMove.isCheck}
43
- <span>+</span>
44
- {:else if parsedMove.isCheckmate}
45
- <span>#</span>
46
- {/if}
47
- {/if}
48
- </span>
1
+ <script lang="ts">
2
+ import type { PieceSet } from "@connectorvol/shared";
3
+ import type { ParsedSanMove } from "../(utils)/parseSanMove.js";
4
+
5
+ import { PieceType } from "@connectorvol/shared";
6
+
7
+ import { parseSanMove } from "../(utils)/parseSanMove.js";
8
+ import PieceIcon from "./PieceIcon.svelte";
9
+
10
+ interface Props {
11
+ /** SAN нотация хода */
12
+ san: string;
13
+ /** Номер полухода */
14
+ ply: number;
15
+ /** Размер иконки в пикселях */
16
+ iconSize?: number;
17
+ /** Набор фигур*/
18
+ pieceSet?: PieceSet;
19
+ }
20
+
21
+ const { san, ply, iconSize = 16, pieceSet }: Props = $props();
22
+
23
+ const sanParseCache = new Map<string, ParsedSanMove>();
24
+
25
+ function getParsedSanMove(san: string, ply: number): ParsedSanMove {
26
+ const key = `${san}|${ply}`;
27
+ const cached = sanParseCache.get(key);
28
+ if (cached) return cached;
29
+ const parsed = parseSanMove(san, ply);
30
+ sanParseCache.set(key, parsed);
31
+ return parsed;
32
+ }
33
+
34
+ const parsedMove: ParsedSanMove = $derived(getParsedSanMove(san, ply));
35
+ </script>
36
+
37
+ <span class="inline-flex items-baseline">
38
+ {#if parsedMove.promotionPieceType}
39
+ {#if parsedMove.isCapture}
40
+ <span>{parsedMove.pawnFile}x{parsedMove.destination}</span>
41
+ {:else}
42
+ <span>{parsedMove.destination}</span>
43
+ {/if}
44
+ <PieceIcon
45
+ pieceType={parsedMove.promotionPieceType}
46
+ color={parsedMove.color}
47
+ size={iconSize}
48
+ {pieceSet}
49
+ />
50
+ {#if parsedMove.isCheck}
51
+ <span>+</span>
52
+ {:else if parsedMove.isCheckmate}
53
+ <span>#</span>
54
+ {/if}
55
+ {:else if parsedMove.isCastling || parsedMove.pieceType === PieceType.PAWN}
56
+ <!-- Для рокировки и обычных ходов пешки показываем только текст -->
57
+ <span>{san}</span>
58
+ {:else}
59
+ <!-- Для фигур показываем иконку + уточнение + взятие + координаты -->
60
+ <PieceIcon
61
+ pieceType={parsedMove.pieceType}
62
+ color={parsedMove.color}
63
+ size={iconSize}
64
+ {pieceSet}
65
+ />
66
+ {#if parsedMove.disambiguation}
67
+ <span>{parsedMove.disambiguation}</span>
68
+ {/if}
69
+ {#if parsedMove.isCapture}
70
+ <span>x</span>
71
+ {/if}
72
+ <span>{parsedMove.destination}</span>
73
+ {#if parsedMove.isCheck}
74
+ <span>+</span>
75
+ {:else if parsedMove.isCheckmate}
76
+ <span>#</span>
77
+ {/if}
78
+ {/if}
79
+ </span>
@@ -1,37 +1,37 @@
1
1
  <script lang="ts">
2
- import { nagBadgeBackground, transformNag } from "@connectorvol/shared";
3
- import { cn } from "../utils.js";
4
- import { nagDescription } from "../(models)/nagCatalog.js";
2
+ import { nagBadgeBackground, transformNag } from "@connectorvol/shared";
3
+ import { cn } from "../utils.js";
4
+ import { nagDescription } from "../(models)/nagCatalog.js";
5
5
 
6
- type TNagBadgesProps = {
7
- /** Возвращает список NAG для отображения. */
8
- nags: number[] | undefined;
9
- /** Возвращает дополнительные классы корневого контейнера. */
10
- class?: string;
11
- };
6
+ type TNagBadgesProps = {
7
+ /** Возвращает список NAG для отображения. */
8
+ nags: number[] | undefined;
9
+ /** Возвращает дополнительные классы корневого контейнера. */
10
+ class?: string;
11
+ };
12
12
 
13
- const { nags, class: className = "" }: TNagBadgesProps = $props();
13
+ const { nags, class: className = "" }: TNagBadgesProps = $props();
14
14
  </script>
15
15
 
16
16
  {#if nags?.length}
17
- <!-- svelte-ignore a11y_no_static_element_interactions -->
18
- <span
19
- data-nag-badges
20
- class={cn(
21
- "ml-0.5 inline-flex max-w-full flex-nowrap items-center gap-0.5 align-middle whitespace-nowrap overflow-hidden",
22
- className,
23
- )}
24
- oncontextmenu={(e) => e.preventDefault()}
25
- >
26
- {#each nags ?? [] as nag, i (i)}
27
- {@const label = transformNag(nag)}
28
- {#if label}
29
- <span
30
- class="inline-flex h-[1.125rem] w-[1.125rem] shrink-0 cursor-help items-center justify-center rounded-full border border-white/25 text-center font-serif text-[0.625rem] font-semibold leading-none text-white shadow-[0_1px_2px_rgba(0,0,0,0.25)]"
31
- style:background={nagBadgeBackground(nag)}
32
- title={nagDescription(nag)}>{label}</span
33
- >
34
- {/if}
35
- {/each}
36
- </span>
17
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
18
+ <span
19
+ data-nag-badges
20
+ class={cn(
21
+ "ml-0.5 inline-flex max-w-full flex-nowrap items-center gap-0.5 align-middle whitespace-nowrap overflow-hidden",
22
+ className,
23
+ )}
24
+ oncontextmenu={(e) => e.preventDefault()}
25
+ >
26
+ {#each nags ?? [] as nag (nag)}
27
+ {@const label = transformNag(nag)}
28
+ {#if label}
29
+ <span
30
+ class="inline-flex h-[1.125rem] w-[1.125rem] shrink-0 cursor-help items-center justify-center rounded-full border border-white/25 text-center font-serif text-[0.625rem] font-semibold leading-none text-white shadow-[0_1px_2px_rgba(0,0,0,0.25)]"
31
+ style:background={nagBadgeBackground(nag)}
32
+ title={nagDescription(nag)}>{label}</span
33
+ >
34
+ {/if}
35
+ {/each}
36
+ </span>
37
37
  {/if}