@signal9/era-ui 30.1.2 → 30.1.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [30.1.3](https://github.com/sig-nine/era-ui/compare/v30.1.2...v30.1.3) (2026-08-16)
2
+
3
+ ### Bug Fixes
4
+
5
+ * **os:** stop printing a framework warning into consumer consoles ([312e1d5](https://github.com/sig-nine/era-ui/commit/312e1d531f4df19443282917819700b66f37ccfe))
6
+
1
7
  ## [30.1.2](https://github.com/sig-nine/era-ui/compare/v30.1.1...v30.1.2) (2026-08-16)
2
8
 
3
9
  ### Bug Fixes
@@ -162,9 +162,21 @@
162
162
  <div class="absolute inset-0 isolate">
163
163
  <!-- Only the active workspace paints; other workspaces' panes keep
164
164
  their state untouched and simply aren't in the tree. Keyed by id, so
165
- switching back remounts them exactly where they were. -->
166
- {#each pm.activePanes as pane (pane.id)}
167
- <Pane {pane} />
165
+ switching back remounts them exactly where they were.
166
+
167
+ ITERATING pm.panes AND FILTERING HERE, rather than iterating the
168
+ `activePanes` derived, is what makes `bind:` below legal: a pane's
169
+ geometry is written by Pane.Root through two bindings, and Svelte's
170
+ ownership check wants that declared the whole way up — but you cannot
171
+ bind to an item of a DERIVED array. `pm.panes[i]` is the same object
172
+ the derived would have yielded, in the same order (activePanes is a
173
+ pure filter), and the {#if} unmounts exactly what the filter excluded.
174
+ Without this the shell logged ownership_invalid_binding twice per
175
+ pane into every consumer's dev console. -->
176
+ {#each pm.panes as pane, i (pane.id)}
177
+ {#if pane.workspaceId === pm.activeWorkspaceId}
178
+ <Pane bind:pane={pm.panes[i]} />
179
+ {/if}
168
180
  {/each}
169
181
  </div>
170
182
  {@render children?.()}
@@ -8,7 +8,16 @@
8
8
  import { cn } from '../utils/index.js';
9
9
  import { getPaneManager, type AppPane } from './pane-manager.svelte.js';
10
10
 
11
- let { pane }: { pane: AppPane } = $props();
11
+ // $bindable, though nothing here ever reassigns it. Pane.Root takes
12
+ // `position` and `size` with bind:, which WRITES to pane.pos / pane.size —
13
+ // state this component does not own. Svelte's dev-mode ownership check
14
+ // followed that write up the tree, found no declared binding, and logged
15
+ // ownership_invalid_binding on every pane mount: era's own shell printing
16
+ // two framework warnings per load into every consumer's dev console.
17
+ // Declaring the binding here and using it in desktop.svelte is Svelte's own
18
+ // remedy for the message; it costs nothing at runtime and says out loud
19
+ // what the component has always done.
20
+ let { pane = $bindable() }: { pane: AppPane } = $props();
12
21
 
13
22
  const pm = getPaneManager();
14
23
  const focused = $derived(pm.focusedId === pane.id);
@@ -3,6 +3,6 @@ import { type AppPane } from './pane-manager.svelte.js';
3
3
  type $$ComponentProps = {
4
4
  pane: AppPane;
5
5
  };
6
- declare const Pane: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ declare const Pane: import("svelte").Component<$$ComponentProps, {}, "pane">;
7
7
  type Pane = ReturnType<typeof Pane>;
8
8
  export default Pane;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signal9/era-ui",
3
- "version": "30.1.2",
3
+ "version": "30.1.3",
4
4
  "scripts": {
5
5
  "dev": "vite dev --host",
6
6
  "build": "vite build && npm run prepack",