Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0f3bdd4
feat: refactor getValue to static parseAttribute for JSX compilation
thescientist13 Feb 1, 2026
df648e4
feat: #232 refactor attributeChangedCallback and remove this.update
thescientist13 Feb 1, 2026
3b8f4c5
feat: #232 remove inferredObservability instruction markers
thescientist13 Feb 1, 2026
96c0252
feat: #232 local WCC override patches
thescientist13 Feb 7, 2026
3671ea8
feat: #232 local WCC override patches
thescientist13 Feb 7, 2026
c869ba7
feat: #232 local WCC override patches
thescientist13 Feb 7, 2026
c7f5058
feat: #232 remove unused getters and hoist observed attributes tracki…
thescientist13 Feb 7, 2026
dba95df
feat: #232 update TODO comments
thescientist13 Feb 7, 2026
1c68635
feat: #232 prune computed signals from observed attributes and handle…
thescientist13 Feb 8, 2026
e6f60a8
feat: #232 transform template signals usage into effects and templates
thescientist13 Feb 16, 2026
5ce4c8b
feat: #232 update comments
thescientist13 Feb 16, 2026
63d1ee4
feat: #232 move effects inlining to connectedCallback
thescientist13 Feb 16, 2026
c5e63a6
feat: #232 cache DOM elements referenced by effects
thescientist13 Feb 16, 2026
088f32d
feat: #232 clean up DOM shim
thescientist13 Feb 16, 2026
4e31687
feat: #232 trim templates
thescientist13 Feb 19, 2026
3ca7dd3
chore: fix lock file
thescientist13 Feb 19, 2026
6c3fc8f
feat: #232 refactor shadow root detection
thescientist13 Feb 21, 2026
a41e6de
feat: #232 handle reactive attributes and tracking reactivity across …
thescientist13 Feb 22, 2026
5808688
feat: #232 fix reactivity detection
thescientist13 Feb 22, 2026
cc2da83
feat: #232 update component example use cases
thescientist13 Feb 22, 2026
b0243eb
feat: #232 update component example use cases
thescientist13 Feb 22, 2026
cbde7f6
feat: #232 support tracking multiple of the same top level tags
thescientist13 Feb 22, 2026
f3ccd3e
feat: #232 correctly track reactive elements in order
thescientist13 Feb 23, 2026
d6b9171
feat: #232 style signal counter sandbox demo
thescientist13 Feb 25, 2026
a70e77b
feat: #232 add TODOs and refine comments
thescientist13 Feb 26, 2026
fe5afba
feat: #232 update comment around custom wcc tagged template
thescientist13 Feb 28, 2026
56ae8a8
feat: #232 typescript working
thescientist13 Feb 28, 2026
f0222a7
feat: #232 remove need for custom template string function
thescientist13 Mar 14, 2026
744a6ec
feat: #232 top level tag text and attributes reactivity tracking
thescientist13 Mar 15, 2026
6f4b6e5
feat: #232 more fixtures testing for JSX test cases
thescientist13 Mar 15, 2026
7c70f18
feat: #232 inject effect runtime at compile time
thescientist13 Mar 28, 2026
2f501b8
feat: #232 make acorn parse options a variable
thescientist13 Mar 28, 2026
8ea9854
feat: #232 restore full sandbox
thescientist13 Mar 28, 2026
63e25b3
feat: #232 disconntedCallback for effects cleanup
thescientist13 Apr 11, 2026
7d5e0a7
feat: #232 merge disconnected callback cleanup effects
thescientist13 Apr 11, 2026
078ab81
feat: #232 TODOs and console log cleanup
thescientist13 Apr 11, 2026
51bde5c
feat: #232 documentation
thescientist13 Apr 12, 2026
47f90fd
feat: #232 promote signals on home page
thescientist13 Apr 12, 2026
c621f8f
feat: #232 final docs tweaks
thescientist13 Apr 12, 2026
20c9169
feat: #232 greenwood config clean up
thescientist13 Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions docs/components/sandbox/counter-dsd.jsx

This file was deleted.

34 changes: 0 additions & 34 deletions docs/components/sandbox/counter-dsd.tsx

This file was deleted.

29 changes: 0 additions & 29 deletions docs/components/sandbox/counter.jsx

This file was deleted.

31 changes: 0 additions & 31 deletions docs/components/sandbox/counter.tsx

This file was deleted.

17 changes: 0 additions & 17 deletions docs/components/sandbox/greeting.ts

This file was deleted.

1 change: 1 addition & 0 deletions docs/components/sandbox/picture-frame.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export default class PictureFrame extends HTMLElement {
connectedCallback() {
const title = this.getAttribute('title');

// should handle for pre-rendering (has double output)
this.innerHTML = `
<div class="picture-frame">
<h6 class="heading">${title}</h6>
Expand Down
19 changes: 19 additions & 0 deletions docs/components/sandbox/signal-counter.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
:host,
:root {
text-align: center;
}

.heading {
display: block;
text-decoration: underline;
}

.even {
color: green;
display: block;
}

.odd {
color: red;
display: block;
}
54 changes: 54 additions & 0 deletions docs/components/sandbox/signal-counter.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
export const inferredObservability = true;

export default class SignalCounter extends HTMLElement {
count;
parity;
isLarge;

constructor() {
super();
this.count = new Signal.State(0);
this.parity = new Signal.Computed(() => (this.count.get() % 2 === 0 ? 'even' : 'odd'));
this.isLarge = new Signal.Computed(() =>
this.count.get() >= 100 ? 'Wow!!!' : 'Keep Going...',
);
}

// Light DOM
connectedCallback() {
this.render();
}

increment() {
this.count.set(this.count.get() + 1);
}

decrement() {
this.count.set(this.count.get() - 1);
}

double() {
this.count.set(this.count.get() * 2);
}

render() {
const { count, parity, isLarge } = this;

return (
<div>
<span class="heading">My Signal Counter</span>
<button onclick={this.increment}>Increment (+)</button>
<button onclick={this.decrement}>Decrement (-)</button>
{/* TODO: inline version breaks with effects */}
{/* <button onclick={() => this.count.set(this.count.get() * 2)}>Double (++)</button> */}
<button onclick={this.double}>Double (++)</button>
<span class={parity.get()}>
The count is {count.get()} ({parity.get()})
</span>
<p data-count={count.get()}>({isLarge.get()})</p>
</div>
);
}
}

customElements.define('sb-signal-counter-jsx', SignalCounter);
68 changes: 68 additions & 0 deletions docs/components/sandbox/signal-counter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import sheet from './signal-counter.css' with { type: 'css' };

export const inferredObservability = true;

export default class SignalCounter extends HTMLElement {
count;
parity;
isLarge;

constructor() {
super();
this.count = new Signal.State(0);
this.parity = new Signal.Computed(() => (this.count.get() % 2 === 0 ? 'even' : 'odd'));
this.isLarge = new Signal.Computed(() =>
this.count.get() >= 100 ? 'Wow!!!' : 'Keep Going...',
);
}

// Shadow DOM
connectedCallback() {
if (!this.shadowRoot) {
this.attachShadow({
mode: 'open',
});
this.render();
}

this.shadowRoot.adoptedStyleSheets = [sheet];
}

increment() {
this.count.set(this.count.get() + 1);
}

decrement() {
this.count.set(this.count.get() - 1);
}

double() {
this.count.set(this.count.get() * 2);
}

disconnectedCallback() {
console.log('Disconnected!');
}

render() {
const { count, parity, isLarge } = this;

return (
<div>
<span class="heading">My Signal Counter</span>
<button onclick={this.increment}>Increment (+)</button>
<button onclick={this.decrement}>Decrement (-)</button>
{/* TODO: inline version breaks with effects */}
{/* https://github.com/ProjectEvergreen/wcc/issues/256 */}
{/* <button onclick={() => this.count.set(this.count.get() * 2)}>Double (++)</button> */}
<button onclick={this.double}>Double (++)</button>
<span class={parity.get()}>
The count is {count.get()} ({parity.get()})
</span>
<p data-count={count.get()}>({isLarge.get()})</p>
</div>
);
}
}

customElements.define('sb-signal-counter-tsx', SignalCounter);
30 changes: 30 additions & 0 deletions docs/components/sandbox/signal-greeting.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
export const inferredObservability = true;

export default class SignalGreeting extends HTMLElement {
name;

constructor() {
super();
this.name = new Signal.State('World');
}

connectedCallback() {
if (!this.shadowRoot) {
this.attachShadow({ mode: 'open' });
}

this.render();
}

render() {
const { name } = this;

return (
<h3 style="text-align: center" data-name={name.get()}>
Hello {name.get()} 👋
</h3>
);
}
}

customElements.define('sb-signal-greeting-jsx', SignalGreeting);
Loading