Skip to content
Merged

v1.0 #2233

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
8404f4f
refactor: rewrite store
segunadebayo Feb 11, 2025
00228ed
refactor: rewrite react
segunadebayo Feb 11, 2025
e6dde1a
docs: add migration
segunadebayo Feb 11, 2025
0e9a257
refactor: accordion, angle-slider, avatar, carousel
segunadebayo Feb 11, 2025
fcb8fa4
refactor: checkbox
segunadebayo Feb 11, 2025
69dcdf7
refactor: clipboard
segunadebayo Feb 11, 2025
0d1b550
refactor: types
segunadebayo Feb 11, 2025
d3d8c31
refactor: collapsible
segunadebayo Feb 11, 2025
8ec3ecc
refactor: colorpicker
segunadebayo Feb 11, 2025
dc8d786
refactor: combobox
segunadebayo Feb 11, 2025
0f6be03
refactor: dialog
segunadebayo Feb 11, 2025
d98218a
refactor: datepicker
segunadebayo Feb 11, 2025
c95ef85
refactor: file upload
segunadebayo Feb 11, 2025
80d7786
refactor: pin input
segunadebayo Feb 11, 2025
0991f55
refactor: presence
segunadebayo Feb 11, 2025
f2c7800
refactor: progress
segunadebayo Feb 11, 2025
db58353
refactor: qr code
segunadebayo Feb 11, 2025
3dabb32
refactor: more components
segunadebayo Feb 11, 2025
1d27e9b
refactor: more components
segunadebayo Feb 11, 2025
ed6f79c
refactor: timer
segunadebayo Feb 11, 2025
0f9760d
refactor: examples
segunadebayo Feb 11, 2025
8c422b2
refactor: tags input
segunadebayo Feb 11, 2025
92b1355
refactor: tree
segunadebayo Feb 11, 2025
d5e9256
refactor: radio group
segunadebayo Feb 11, 2025
f4ded2e
refactor: pagination
segunadebayo Feb 12, 2025
bd5251a
refactor: tour
segunadebayo Feb 12, 2025
d861b9a
chore: update avatar
segunadebayo Feb 12, 2025
697806d
refactor: menu
segunadebayo Feb 12, 2025
5a0dbbc
refactor: machines
segunadebayo Feb 12, 2025
1930d98
refactor: toggle group
segunadebayo Feb 12, 2025
5db6c50
refactor: switch
segunadebayo Feb 12, 2025
68a753f
refactor: signature pad
segunadebayo Feb 12, 2025
342f2bf
refactor: splitter
segunadebayo Feb 12, 2025
5643c83
refactor: radio-group
segunadebayo Feb 12, 2025
54d025a
chore: update
segunadebayo Feb 12, 2025
46fd1e9
refactor: number input
segunadebayo Feb 12, 2025
7e3e1c8
refactor: radio group
segunadebayo Feb 12, 2025
89a99d8
refactor: time picker
segunadebayo Feb 12, 2025
0270a4f
refactor: slid
segunadebayo Feb 12, 2025
b094177
chore: fix avatar
segunadebayo Feb 12, 2025
748e1ec
fix: carousel
segunadebayo Feb 12, 2025
cdb63b7
fix: react examples
segunadebayo Feb 12, 2025
0dcccde
fix: react examples
segunadebayo Feb 12, 2025
3ae4962
chore: update react examples
segunadebayo Feb 13, 2025
c0f722c
refactor: machines and examples
segunadebayo Feb 13, 2025
61237be
refactor: react bindings
segunadebayo Feb 13, 2025
4c3b1d1
refactor: test setup
segunadebayo Feb 13, 2025
1abc222
test: fix framework tests
segunadebayo Feb 13, 2025
cff8dfc
refactor: solid and examples
segunadebayo Feb 14, 2025
53857ef
refactor: machines and solid
segunadebayo Feb 14, 2025
e149cc4
refactor: svelte support
segunadebayo Feb 14, 2025
f2d59f9
refactor: vue
segunadebayo Feb 14, 2025
4ef9a08
chore: update visualizer
segunadebayo Feb 14, 2025
2d18cd3
chore: update combobox
segunadebayo Feb 14, 2025
8ab4a28
chore: update deps
segunadebayo Feb 14, 2025
d8b1ef3
chore: update
segunadebayo Feb 14, 2025
a00892a
chore: trim examples
segunadebayo Feb 15, 2025
6276c8b
refactor: preact example
segunadebayo Feb 15, 2025
7590d67
fix: typecheck
segunadebayo Feb 15, 2025
4fb9544
fix: lint
segunadebayo Feb 15, 2025
003dae6
fix: react layout effect warning
segunadebayo Feb 15, 2025
62890a7
refactor: e2e tests
segunadebayo Feb 15, 2025
a143199
Merge remote-tracking branch 'origin' into v1
segunadebayo Feb 15, 2025
7d5f458
test: update
segunadebayo Feb 15, 2025
0c4067c
test: remove .only
segunadebayo Feb 15, 2025
df4085f
docs: update demos
segunadebayo Feb 15, 2025
2cf4c6c
docs: fix use search
segunadebayo Feb 15, 2025
4b5cba9
feat: add raf based timers
segunadebayo Feb 15, 2025
83b62c3
refactor: starter
segunadebayo Feb 15, 2025
971d53a
refactor: toast, frameworks
segunadebayo Feb 17, 2025
1bdb565
chore: add more vue example
segunadebayo Feb 17, 2025
9008854
chore: update vue
segunadebayo Feb 17, 2025
f1b0665
chore: update vue
segunadebayo Feb 17, 2025
84b2fc7
fix: issues
segunadebayo Feb 18, 2025
a22d071
chore: update plop template
segunadebayo Feb 18, 2025
a7ee1b5
Merge remote-tracking branch 'origin' into v1
segunadebayo Feb 18, 2025
c45b5e7
fix: color picker
segunadebayo Feb 18, 2025
fb23ceb
refactor: toast examples
segunadebayo Feb 18, 2025
c1cfdcd
docs: update
segunadebayo Feb 18, 2025
4e63d26
fix: carousel initial page
segunadebayo Feb 19, 2025
721cba0
Merge remote-tracking branch 'origin' into v1
segunadebayo Feb 19, 2025
a8e7a9f
chore: bump svelte
segunadebayo Feb 19, 2025
3cd6e7d
docs: update
segunadebayo Feb 19, 2025
fe01a26
docs: fix highlight
segunadebayo Feb 19, 2025
c282dbf
docs: fix highlight
segunadebayo Feb 19, 2025
950a556
docs: update migration guide
segunadebayo Feb 20, 2025
f8475b2
chore: add scripts
segunadebayo Feb 20, 2025
1fd8832
chore: update
segunadebayo Feb 20, 2025
5efa5fc
fix: avatar
segunadebayo Feb 20, 2025
3a1885e
fix: select initial items
segunadebayo Feb 20, 2025
f55d86b
fix: props export
segunadebayo Feb 20, 2025
8f82ca0
fix: collapsible
segunadebayo Feb 20, 2025
8cc2dfb
chore: rm set-collection
segunadebayo Feb 20, 2025
aa7fdb7
refactor: type comments
segunadebayo Feb 20, 2025
33f5373
fix: typedocs script
segunadebayo Feb 20, 2025
baf13e3
chore: update attr docs
segunadebayo Feb 20, 2025
4b363e4
fix: types
segunadebayo Feb 20, 2025
0614ec9
chore: rm logs
segunadebayo Feb 20, 2025
82d526a
fix: types
segunadebayo Feb 20, 2025
7bf8940
refactor: improve file upload directory handling
segunadebayo Feb 20, 2025
b79fc3c
Merge remote-tracking branch 'origin' into v1
segunadebayo Feb 20, 2025
0f0f1d9
chore: rm unused
segunadebayo Feb 20, 2025
38533d2
docs: add link to migration
segunadebayo Feb 21, 2025
3a4fa89
refactor: carousel
segunadebayo Feb 21, 2025
28b03ea
chore: update scripts
segunadebayo Feb 21, 2025
7b61215
chore: update scripts
segunadebayo Feb 21, 2025
73c2e9c
chore: fix packaging and use client
segunadebayo Feb 21, 2025
86b088e
refactor: eslint
segunadebayo Feb 21, 2025
6ebbfb4
chore: migrate eslint
segunadebayo Feb 21, 2025
e8de561
fix: date range picker
segunadebayo Feb 21, 2025
295de6e
chore: keep svelte examples in sync
segunadebayo Feb 21, 2025
52365b4
docs: write migration guide
segunadebayo Feb 21, 2025
8391431
fix: mem leak in effect
segunadebayo Feb 21, 2025
3e6f27b
docs: update
segunadebayo Feb 21, 2025
75f1904
docs: update
segunadebayo Feb 21, 2025
de5b868
docs: update
segunadebayo Feb 21, 2025
a9c8642
refactor: toasts
segunadebayo Feb 22, 2025
ef49d82
chore: update
segunadebayo Feb 22, 2025
f40d202
chore: update default max toast
segunadebayo Feb 22, 2025
f609ed3
docs: update
segunadebayo Feb 22, 2025
8381900
chore: update types
segunadebayo Feb 22, 2025
fe5964b
docs: mention Key component
segunadebayo Feb 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 0 additions & 2 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,9 @@
"nuxt-ts",
"solid-ts",
"nuxt-ts",
"react-19",
"preact-ts",
"svelte-ts",
"vanilla-ts",
"lit-ts",
"website"
]
}
7 changes: 7 additions & 0 deletions .changeset/poor-tips-compete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@zag-js/core": major
---

Rewrite machines for increased performance and initial mount time.

This is done by relying on native framework primitives and a reducer rather than an external store.
90 changes: 84 additions & 6 deletions .xstate/clipboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,43 @@ const {
choose
} = actions;
const fetchMachine = createMachine({
id: "clipboard",
initial: "idle",
context: {},
props({
props
}) {
return {
timeout: 3000,
defaultValue: "",
...props
};
},
initialState() {
return "idle";
},
context({
prop,
bindable
}) {
return {
value: bindable(() => ({
defaultValue: prop("defaultValue"),
value: prop("value"),
onChange(value) {
prop("onValueChange")?.({
value
});
}
}))
};
},
watch({
track,
context: {},
action
}) {
track([() => context.get("value")], () => {
action(["syncInputElement"]);
});
},
on: {
"VALUE.SET": {
actions: ["setValue"]
Expand All @@ -37,10 +71,11 @@ const fetchMachine = createMachine({
}
},
copied: {
after: {
COPY_TIMEOUT: "idle"
},
effects: ["waitForTimeout"],
on: {
"COPY.DONE": {
target: "idle"
},
COPY: {
target: "copied",
actions: ["copyToClipboard", "invokeOnCopy"]
Expand All @@ -50,6 +85,49 @@ const fetchMachine = createMachine({
}
}
}
},
implementations: {
effects: {
waitForTimeout({
prop,
send
}) {
return setRafTimeout(() => {
send({
type: "COPY.DONE"
});
}, prop("timeout"));
}
},
actions: {
setValue({
context,
event
}) {
context.set("value", event.value);
},
copyToClipboard({
context,
scope
}) {
dom.writeToClipboard(scope, context.get("value"));
},
invokeOnCopy({
prop
}) {
prop("onStatusChange")?.({
copied: true
});
},
syncInputElement({
context,
scope
}) {
const inputEl = dom.getInputEl(scope);
if (!inputEl) return;
setElementValue(inputEl, context.get("value"));
}
}
}
}, {
actions: {
Expand Down
206 changes: 200 additions & 6 deletions .xstate/editable.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,53 @@ const {
choose
} = actions;
const fetchMachine = createMachine({
id: "editable",
initial: ctx.edit ? "edit" : "preview",
entry: ctx.edit ? ["focusInput"] : undefined,
props({
props
}) {
return {
activationMode: "focus",
submitMode: "both",
defaultValue: "",
selectOnFocus: true,
...props,
translations: {
input: "editable input",
edit: "edit",
submit: "submit",
cancel: "cancel",
...props.translations
}
};
},
initialState({
prop
}) {
const edit = prop("edit") || prop("defaultEdit");
return edit ? "edit" : "preview";
},
entry: ["focusInputIfNeeded"],
context: {
"isEditControlled": false,
"isSubmitEvent": false,
"isEditControlled": false,
"isEditControlled": false
},
watch({
track,
action,
context,
prop
}) {
track([() => context.get("value")], () => {
action(["syncInputValue"]);
});
track([() => prop("edit")], () => {
action(["toggleEditing"]);
});
},
on: {
"VALUE.SET": {
actions: "setValue"
actions: ["setValue"]
}
},
on: {
Expand All @@ -31,7 +66,6 @@ const fetchMachine = createMachine({
},
states: {
preview: {
// https://bugzilla.mozilla.org/show_bug.cgi?id=559561
entry: ["blurInputIfNeeded"],
on: {
"CONTROLLED.EDIT": {
Expand All @@ -48,7 +82,7 @@ const fetchMachine = createMachine({
}
},
edit: {
activities: ["trackInteractOutside"],
effects: ["trackInteractOutside"],
on: {
"CONTROLLED.PREVIEW": [{
cond: "isSubmitEvent",
Expand All @@ -74,6 +108,166 @@ const fetchMachine = createMachine({
}]
}
}
},
implementations: {
guards: {
isEditControlled: ({
prop
}) => prop("edit") != undefined,
isSubmitEvent: ({
event
}) => event.previousEvent?.type === "SUBMIT"
},
effects: {
trackInteractOutside({
send,
scope,
prop
}) {
return trackInteractOutside(dom.getInputEl(scope), {
exclude(target) {
const ignore = [dom.getCancelTriggerEl(scope), dom.getSubmitTriggerEl(scope)];
return ignore.some(el => contains(el, target));
},
onFocusOutside: prop("onFocusOutside"),
onPointerDownOutside: prop("onPointerDownOutside"),
onInteractOutside(event) {
prop("onInteractOutside")?.(event);
if (event.defaultPrevented) return;
const {
focusable
} = event.detail;
send({
type: computed("submitOnBlur") ? "SUBMIT" : "CANCEL",
src: "interact-outside",
focusable
});
}
});
}
},
actions: {
restoreFocus({
event,
scope,
prop
}) {
if (event.focusable) return;
raf(() => {
const finalEl = prop("finalFocusEl")?.() ?? dom.getEditTriggerEl(scope);
finalEl?.focus({
preventScroll: true
});
});
},
clearValue({
context
}) {
context.set("value", "");
},
focusInputIfNeeded({
action,
prop
}) {
const edit = prop("edit") || prop("defaultEdit");
if (!edit) return;
action(["focusInput"]);
},
focusInput({
scope,
prop
}) {
raf(() => {
const inputEl = dom.getInputEl(scope);
if (!inputEl) return;
if (prop("selectOnFocus")) {
inputEl.select();
} else {
inputEl.focus({
preventScroll: true
});
}
});
},
invokeOnCancel({
prop,
context
}) {
const prev = context.get("previousValue");
prop("onValueRevert")?.({
value: prev
});
},
invokeOnSubmit({
prop,
context
}) {
const value = context.get("value");
prop("onValueCommit")?.({
value
});
},
invokeOnEdit({
prop
}) {
prop("onEditChange")?.({
edit: true
});
},
invokeOnPreview({
prop
}) {
prop("onEditChange")?.({
edit: false
});
},
toggleEditing({
prop,
send,
event
}) {
send({
type: prop("edit") ? "CONTROLLED.EDIT" : "CONTROLLED.PREVIEW",
previousEvent: event
});
},
syncInputValue({
context,
scope
}) {
const inputEl = dom.getInputEl(scope);
if (!inputEl) return;
setElementValue(inputEl, context.get("value"));
},
setValue({
context,
prop,
event
}) {
const max = prop("maxLength");
const current = event.value;
const value = max != null ? current.slice(0, max) : current;
context.set("value", value);
},
setPreviousValue({
context
}) {
const value = context.get("value");
context.set("previousValue", value);
},
revertValue({
context
}) {
const value = context.get("previousValue");
if (!value) return;
context.set("value", value);
},
blurInputIfNeeded({
scope
}) {
dom.getInputEl(scope)?.blur();
}
}
}
}, {
actions: {
Expand Down
Loading
Loading