svelte-tiler 0.3.0 → 0.4.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.
package/dist/context.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { SvelteMap } from 'svelte/reactivity';
1
2
  import { DndContext } from './shared/dnd.svelte.ts';
2
3
  import type { Tile, TileComponent, TileInsertData, Tiles, TileType } from './model.js';
3
4
  export declare const getTilerContext: () => TilerContext, setTilerContext: (context: TilerContext) => TilerContext;
@@ -10,40 +11,20 @@ export interface TileDefinition<T extends TileType> {
10
11
  export type TileDefinitions = {
11
12
  [T in TileType]: TileDefinition<T>;
12
13
  };
13
- export type TileEffects = {
14
- [T in TileType]?: (tile: Tiles[T]) => void | (() => void);
15
- };
16
14
  export interface TilerContextOptions {
17
15
  definitions: TileDefinitions;
18
16
  dnd?: DndContext<Tile>;
19
- effects?: TileEffects;
20
17
  }
21
18
  export declare class TilerContext {
22
19
  protected definitions: TileDefinitions;
23
- protected effects: TileEffects;
24
20
  protected updateRootFn: ((tile: Tile) => void) | undefined;
25
21
  protected registry: FinalizationRegistry<string>;
26
- protected tiles: Map<string, WeakRef<Tile>>;
22
+ protected tiles: SvelteMap<string, WeakRef<Tile>>;
27
23
  protected parents: WeakMap<Tile, Tile>;
28
24
  readonly dnd: DndContext<Tile>;
29
25
  constructor(options: TilerContextOptions);
30
- registerTile(tile: Tile, parent: Tile | ((tile: Tile) => void)): void;
31
- getTileEffect(tile: Tile): ((tile: import("./model.js").TileBase<"leaf"> & {
32
- name: string;
33
- }) => void | (() => void)) | ((tile: import("./model.js").TileBase<"split"> & {
34
- constraints: Array<import("./shared/constraints.ts").Constraint[]>;
35
- weights: number[];
36
- direction: import("./shared/spatial.ts").Direction;
37
- resizer?: string;
38
- gapPx: number;
39
- }) => void | (() => void)) | ((tile: import("./model.js").TileBase<"tabs"> & {
40
- titles: string[];
41
- selectedTab: number;
42
- headersDirection: import("./tiles/tabs.svelte.ts").HeadersDirection;
43
- actions?: string;
44
- tabHeader?: string;
45
- empty?: string;
46
- }) => void | (() => void)) | undefined;
26
+ registerTile(tile: Tile, parent: Tile | ((tile: Tile) => void)): (() => void) | void;
27
+ getTileById(tileId: string): Tile | undefined;
47
28
  getTileComponent(tile: Tile): TileComponent<"leaf"> | TileComponent<"split"> | TileComponent<"tabs">;
48
29
  replace(tile: Tile | undefined, replace: Tile): void;
49
30
  replaceTile(tileId: string | undefined, replace: Tile): void;
@@ -53,5 +34,5 @@ export declare class TilerContext {
53
34
  removeChildFromTile(tileId: string, index: number): void;
54
35
  remove(tile: Tile): void;
55
36
  removeTile(tileId: string): void;
56
- protected getTileById(tileId: string): Tile;
37
+ protected getTileByIdOrThrow(tileId: string): Tile;
57
38
  }
package/dist/context.js CHANGED
@@ -1,20 +1,19 @@
1
1
  import { createContext } from 'svelte';
2
+ import { SvelteMap } from 'svelte/reactivity';
2
3
  import { DndContext } from "./shared/dnd.svelte.js";
3
4
  export const [getTilerContext, setTilerContext] = createContext();
4
5
  export class TilerContext {
5
6
  definitions;
6
- effects;
7
7
  updateRootFn;
8
8
  registry = new FinalizationRegistry((id) => {
9
9
  this.tiles.delete(id);
10
10
  });
11
- tiles = new Map();
11
+ tiles = new SvelteMap();
12
12
  parents = new WeakMap();
13
13
  dnd;
14
14
  constructor(options) {
15
15
  this.definitions = options.definitions;
16
16
  this.dnd = options.dnd ?? new DndContext();
17
- this.effects = options.effects ?? {};
18
17
  }
19
18
  registerTile(tile, parent) {
20
19
  this.tiles.set(tile.id, new WeakRef(tile));
@@ -27,8 +26,8 @@ export class TilerContext {
27
26
  this.parents.set(tile, parent);
28
27
  }
29
28
  }
30
- getTileEffect(tile) {
31
- return this.effects[tile.type];
29
+ getTileById(tileId) {
30
+ return this.tiles.get(tileId)?.deref();
32
31
  }
33
32
  getTileComponent(tile) {
34
33
  return this.definitions[tile.type].default;
@@ -48,14 +47,14 @@ export class TilerContext {
48
47
  this.updateRootFn?.(replace);
49
48
  }
50
49
  replaceTile(tileId, replace) {
51
- const tile = tileId && this.getTileById(tileId);
50
+ const tile = tileId && this.getTileByIdOrThrow(tileId);
52
51
  this.replace(tile || undefined, replace);
53
52
  }
54
53
  insertInto(tile, index, data) {
55
54
  this.definitions[tile.type].onInsert(this, tile, index, data);
56
55
  }
57
56
  insertIntoTile(tileId, type, index, data) {
58
- const tile = this.getTileById(tileId);
57
+ const tile = this.getTileByIdOrThrow(tileId);
59
58
  if (tile.type !== type) {
60
59
  throw new Error(`Tile type mismatch: expected "${type}", but got "${tile.type}"`);
61
60
  }
@@ -65,7 +64,7 @@ export class TilerContext {
65
64
  this.definitions[tile.type].onRemoveChild(this, tile, index);
66
65
  }
67
66
  removeChildFromTile(tileId, index) {
68
- this.removeChildFrom(this.getTileById(tileId), index);
67
+ this.removeChildFrom(this.getTileByIdOrThrow(tileId), index);
69
68
  }
70
69
  remove(tile) {
71
70
  const parent = this.parents.get(tile);
@@ -80,9 +79,9 @@ export class TilerContext {
80
79
  this.removeChildFrom(parent, index);
81
80
  }
82
81
  removeTile(tileId) {
83
- this.remove(this.getTileById(tileId));
82
+ this.remove(this.getTileByIdOrThrow(tileId));
84
83
  }
85
- getTileById(tileId) {
84
+ getTileByIdOrThrow(tileId) {
86
85
  const tile = this.tiles.get(tileId)?.deref();
87
86
  if (tile === undefined) {
88
87
  throw new Error(`Unable to find tile with "${tileId}" id`);
package/dist/debug.svelte CHANGED
@@ -1,8 +1,5 @@
1
- <script lang="ts">
2
- import type { Tile } from './model.js';
3
- import Self from './debug.svelte';
4
-
5
- const { tile, level = 0 }: { tile: Tile; level?: number } = $props();
1
+ <script lang="ts">import Self from "./debug.svelte";
2
+ const { tile, level = 0 } = $props();
6
3
  </script>
7
4
 
8
5
  <div style="padding-left: {level * 12}px;">{tile.type} ({tile.id})</div>
package/dist/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export * from './dnd.ts';
4
4
  export { default as Panel } from './panel.svelte';
5
5
  export { default as Tiler } from './tiler.svelte';
6
6
  export { default as Debug } from './debug.svelte';
7
+ export { default as Provider } from './provider.svelte';
package/dist/index.js CHANGED
@@ -4,3 +4,4 @@ export * from "./dnd.js";
4
4
  export { default as Panel } from './panel.svelte';
5
5
  export { default as Tiler } from './tiler.svelte';
6
6
  export { default as Debug } from './debug.svelte';
7
+ export { default as Provider } from './provider.svelte';
package/dist/panel.svelte CHANGED
@@ -1,8 +1,5 @@
1
- <script lang="ts">
2
- import Render from './render.svelte';
3
- import type { Tile } from './model.js';
4
-
5
- let { layout = $bindable() }: { layout: Tile | undefined } = $props();
1
+ <script lang="ts">import Render from "./render.svelte";
2
+ let { layout = $bindable() } = $props();
6
3
  </script>
7
4
 
8
5
  {#if layout}
@@ -0,0 +1,8 @@
1
+ <script lang="ts">const {
2
+ setContext,
3
+ children
4
+ } = $props();
5
+ setContext();
6
+ </script>
7
+
8
+ {@render children()}
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ setContext: () => void;
4
+ children: Snippet;
5
+ };
6
+ declare const Provider: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type Provider = ReturnType<typeof Provider>;
8
+ export default Provider;
@@ -1,25 +1,13 @@
1
- <script lang="ts">
2
- import { getTilerContext } from './context.js';
3
- import type { Tile } from './model.js';
4
- import Self from './render.svelte';
5
-
6
- let {
7
- tile = $bindable(),
8
- parent = $bindable(),
9
- index,
10
- }: {
11
- tile: Tile;
12
- parent: Tile | undefined;
13
- index: number;
14
- } = $props();
15
-
16
- const ctx = getTilerContext();
17
-
18
- $effect(() => ctx.registerTile(tile, parent ?? ((t) => (parent = t))));
19
-
20
- $effect(() => ctx.getTileEffect(tile)?.(tile as never));
21
-
22
- const TileComponent = $derived(ctx.getTileComponent(tile));
1
+ <script lang="ts">import { getTilerContext } from "./context.js";
2
+ import Self from "./render.svelte";
3
+ let {
4
+ tile = $bindable(),
5
+ parent = $bindable(),
6
+ index
7
+ } = $props();
8
+ const ctx = getTilerContext();
9
+ $effect(() => ctx.registerTile(tile, parent ?? ((t) => parent = t)));
10
+ const TileComponent = $derived(ctx.getTileComponent(tile));
23
11
  </script>
24
12
 
25
13
  {#snippet child(index: number)}
package/dist/tiler.svelte CHANGED
@@ -1,18 +1,13 @@
1
- <script lang="ts">
2
- import {
3
- setTilerContext,
4
- TilerContext,
5
- type TilerContextOptions,
6
- } from './context.js';
7
- import type { Tile } from './model.js';
8
- import Panel from './panel.svelte';
9
-
10
- let {
11
- layout = $bindable(),
12
- ...rest
13
- }: { layout: Tile | undefined } & TilerContextOptions = $props();
14
-
15
- setTilerContext(new TilerContext(rest));
1
+ <script lang="ts">import {
2
+ setTilerContext,
3
+ TilerContext
4
+ } from "./context.js";
5
+ import Panel from "./panel.svelte";
6
+ let {
7
+ layout = $bindable(),
8
+ ...rest
9
+ } = $props();
10
+ setTilerContext(new TilerContext(rest));
16
11
  </script>
17
12
 
18
13
  <Panel bind:layout />
@@ -1,45 +1,24 @@
1
- <script lang="ts" module>
2
- import { createContext, type Snippet } from 'svelte';
3
-
4
- import type { Registry } from '../shared/registry.js';
5
- import type { Tile, TileProps, Tiles } from '../model.js';
6
-
7
- declare module '../model.js' {
8
- interface TileRegistry {
9
- leaf: {
10
- name: string;
11
- };
12
- }
13
- }
14
-
15
- type LeafContext<N extends string = string> = Registry<
16
- N,
17
- Snippet<[Tiles['leaf'], number, Tile | undefined]> | undefined
18
- >;
19
-
20
- const [getContext, setContext] = createContext<LeafContext>();
21
-
22
- export function setup<N extends string>(leafs: LeafContext<N>) {
23
- setContext(leafs);
24
- return (name: N): Tiles['leaf'] => ({
25
- id: crypto.randomUUID(),
26
- type: 'leaf',
27
- name,
28
- children: [],
29
- });
30
- }
31
-
32
- export function onRemoveChild() {}
33
-
34
- export function onClear() {}
35
-
36
- export function onInsert() {}
1
+ <script lang="ts" module>import { createContext } from "svelte";
2
+ const [getContext, setContext] = createContext();
3
+ export function setup(leafs) {
4
+ setContext(leafs);
5
+ return (name) => ({
6
+ id: crypto.randomUUID(),
7
+ type: "leaf",
8
+ name,
9
+ children: []
10
+ });
11
+ }
12
+ export function onRemoveChild() {
13
+ }
14
+ export function onClear() {
15
+ }
16
+ export function onInsert() {
17
+ }
37
18
  </script>
38
19
 
39
- <script lang="ts">
40
- const leafCtx = getContext();
41
-
42
- let { tile = $bindable(), index, parent }: TileProps<'leaf'> = $props();
20
+ <script lang="ts">const leafCtx = getContext();
21
+ let { tile = $bindable(), index, parent } = $props();
43
22
  </script>
44
23
 
45
24
  {@render leafCtx.get(tile.name)?.(tile, index, parent)}