ajo 0.0.24 → 0.0.26

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/index.cjs CHANGED
@@ -25,6 +25,7 @@ __export(ajo_exports, {
25
25
  useCatch: () => useCatch,
26
26
  useEffect: () => useEffect,
27
27
  useHost: () => useHost,
28
+ useInsert: () => useInsert,
28
29
  useLayout: () => useLayout,
29
30
  useMemo: () => useMemo,
30
31
  useReducer: () => useReducer,
@@ -88,7 +89,7 @@ const Fragment = ({ children }) => children, h = (nodeName, props, ...children)
88
89
  const prev = stack[i][0], next = isFunction(value) ? value(prev) : value;
89
90
  if (is(prev, stack[i][0] = isFunction(fn) ? fn(prev, next) : next))
90
91
  return;
91
- runMutations(host);
92
+ runMutation(host);
92
93
  }
93
94
  ];
94
95
  return stack[hooks[0]++];
@@ -105,7 +106,7 @@ const Fragment = ({ children }) => children, h = (nodeName, props, ...children)
105
106
  setValue(value2);
106
107
  };
107
108
  return [value, () => setValue()];
108
- }, useHost = () => current, useState = (init) => useReducer(null, init), useRef = (current2) => useMemo(() => ({ current: current2 }), []), useCallback = (fn, deps) => useMemo(() => fn, deps), useLayout = (fn, deps) => useFx(fn, deps, "$layout"), useEffect = (fn, deps) => useFx(fn, deps, "$effect");
109
+ }, useHost = () => current, useState = (init) => useReducer(null, init), useRef = (current2) => useMemo(() => ({ current: current2 }), []), useCallback = (fn, deps) => useMemo(() => fn, deps), useInsert = (fn, deps) => useFx(fn, deps, "$insert"), useLayout = (fn, deps) => useFx(fn, deps, "$layout"), useEffect = (fn, deps) => useFx(fn, deps, "$effect");
109
110
  const { isArray, from } = Array, { is } = Object, noop = () => {
110
111
  }, FN = Symbol(), isObject = (v) => v && typeof v == "object", isFunction = (v) => typeof v == "function", some = (a, b) => isArray(a) && isArray(b) ? a.some((v, i) => !is(v, b[i])) : !is(a, b), reduce = (v) => from(v).reduce(assign, {}), assign = (v, { name, value }) => (v[name] = value, v), microtask = globalThis.queueMicrotask ?? ((fn) => fn()), task = globalThis.requestAnimationFrame ?? microtask, create = (ns, name, key) => {
111
112
  const node = ns ? document.createElementNS(ns, name) : document.createElement(name);
@@ -160,27 +161,11 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
160
161
  if (globalThis.navigator?.scheduling?.isInputPending()) {
161
162
  idleQueue.add(host);
162
163
  host.$idle = true;
163
- idleId ??= requestIdleCallback(() => {
164
- idleId = null;
165
- const queue = from(idleQueue);
166
- for (const host2 of queue) {
167
- idleQueue.delete(host2);
168
- host2.$idle = false;
169
- schedule(host2);
170
- }
171
- });
164
+ idleId ??= requestIdleCallback(runIdle);
172
165
  return;
173
166
  }
174
- runComponent(host);
175
- }, runMutations = (host) => {
176
- if (host.$queued)
177
- return;
178
- host.$queued = true;
179
- microtask(() => {
180
- host.$queued = false;
181
- runComponent(host);
182
- });
183
- }, runComponent = (host) => {
167
+ run(host);
168
+ }, run = (host) => {
184
169
  if (host.$idle) {
185
170
  idleQueue.delete(host);
186
171
  host.$idle = false;
@@ -196,13 +181,29 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
196
181
  current = null;
197
182
  layoutQueue.add(host);
198
183
  host.$layoutQueued = true;
199
- layoutId ??= task(runLayouts);
184
+ layoutId ??= task(runLayout);
200
185
  }
201
- }, runLayouts = () => {
186
+ }, runIdle = () => {
187
+ idleId = null;
188
+ for (const host of from(idleQueue)) {
189
+ idleQueue.delete(host);
190
+ host.$idle = false;
191
+ schedule(host);
192
+ }
193
+ }, runMutation = (host) => {
194
+ if (host.$runQueued)
195
+ return;
196
+ host.$runQueued = true;
197
+ microtask(() => {
198
+ host.$runQueued = false;
199
+ run(host);
200
+ });
201
+ }, runLayout = () => {
202
202
  layoutId = null;
203
203
  for (const host of layoutQueue) {
204
204
  layoutQueue.delete(host);
205
205
  host.$layoutQueued = false;
206
+ runFx(host, "$insert");
206
207
  try {
207
208
  render(host.$h, host);
208
209
  host.$h = null;
@@ -212,10 +213,10 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
212
213
  runFx(host, "$layout");
213
214
  effectQueue.add(host);
214
215
  host.$effectQueued = true;
215
- effectId ??= task(runEffects);
216
+ effectId ??= task(runEffect);
216
217
  }
217
218
  }
218
- }, runEffects = () => {
219
+ }, runEffect = () => {
219
220
  effectId = null;
220
221
  for (const host of effectQueue) {
221
222
  effectQueue.delete(host);
@@ -260,7 +261,7 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
260
261
  effectQueue.delete(host);
261
262
  host.$effectQueued = false;
262
263
  }
263
- for (const key of ["$layout", "$effect"])
264
+ for (const key of ["$insert", "$layout", "$effect"])
264
265
  if (host[key]) {
265
266
  for (const fx of host[key]) {
266
267
  host[key].delete(fx);
package/index.js CHANGED
@@ -79,7 +79,7 @@ export const
79
79
 
80
80
  if (is(prev, stack[i][0] = isFunction(fn) ? fn(prev, next) : next)) return
81
81
 
82
- runMutations(host)
82
+ runMutation(host)
83
83
  }
84
84
  ]
85
85
 
@@ -115,6 +115,7 @@ export const
115
115
  useRef = current => useMemo(() => ({ current }), []),
116
116
  useCallback = (fn, deps) => useMemo(() => fn, deps),
117
117
 
118
+ useInsert = (fn, deps) => useFx(fn, deps, '$insert'),
118
119
  useLayout = (fn, deps) => useFx(fn, deps, '$layout'),
119
120
  useEffect = (fn, deps) => useFx(fn, deps, '$effect')
120
121
 
@@ -200,38 +201,16 @@ const
200
201
  if (host.$idle) return
201
202
 
202
203
  if (globalThis.navigator?.scheduling?.isInputPending()) {
203
-
204
204
  idleQueue.add(host)
205
205
  host.$idle = true
206
-
207
- idleId ??= requestIdleCallback(() => {
208
- idleId = null
209
- const queue = from(idleQueue)
210
- for (const host of queue) {
211
- idleQueue.delete(host)
212
- host.$idle = false
213
- schedule(host)
214
- }
215
- })
216
-
206
+ idleId ??= requestIdleCallback(runIdle)
217
207
  return
218
208
  }
219
209
 
220
- runComponent(host)
221
- },
222
-
223
- runMutations = host => {
224
-
225
- if (host.$queued) return
226
-
227
- host.$queued = true
228
- microtask(() => {
229
- host.$queued = false
230
- runComponent(host)
231
- })
210
+ run(host)
232
211
  },
233
212
 
234
- runComponent = host => {
213
+ run = host => {
235
214
 
236
215
  if (host.$idle) {
237
216
  idleQueue.delete(host)
@@ -250,11 +229,33 @@ const
250
229
  current = null
251
230
  layoutQueue.add(host)
252
231
  host.$layoutQueued = true
253
- layoutId ??= task(runLayouts)
232
+ layoutId ??= task(runLayout)
233
+ }
234
+ },
235
+
236
+ runIdle = () => {
237
+
238
+ idleId = null
239
+
240
+ for (const host of from(idleQueue)) {
241
+ idleQueue.delete(host)
242
+ host.$idle = false
243
+ schedule(host)
254
244
  }
255
245
  },
256
246
 
257
- runLayouts = () => {
247
+ runMutation = host => {
248
+
249
+ if (host.$runQueued) return
250
+
251
+ host.$runQueued = true
252
+ microtask(() => {
253
+ host.$runQueued = false
254
+ run(host)
255
+ })
256
+ },
257
+
258
+ runLayout = () => {
258
259
 
259
260
  layoutId = null
260
261
 
@@ -263,6 +264,8 @@ const
263
264
  layoutQueue.delete(host)
264
265
  host.$layoutQueued = false
265
266
 
267
+ runFx(host, '$insert')
268
+
266
269
  try {
267
270
  render(host.$h, host)
268
271
  host.$h = null
@@ -272,12 +275,12 @@ const
272
275
  runFx(host, '$layout')
273
276
  effectQueue.add(host)
274
277
  host.$effectQueued = true
275
- effectId ??= task(runEffects)
278
+ effectId ??= task(runEffect)
276
279
  }
277
280
  }
278
281
  },
279
282
 
280
- runEffects = () => {
283
+ runEffect = () => {
281
284
 
282
285
  effectId = null
283
286
 
@@ -333,7 +336,7 @@ const
333
336
  host.$effectQueued = false
334
337
  }
335
338
 
336
- for (const key of ['$layout', '$effect']) if (host[key]) {
339
+ for (const key of ['$insert', '$layout', '$effect']) if (host[key]) {
337
340
 
338
341
  for (const fx of host[key]) {
339
342
 
package/index.min.js CHANGED
@@ -1 +1 @@
1
- var ajo=(()=>{var x=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var n in t)x(e,n,{get:t[n],enumerable:!0})},J=(e,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of W(t))!D.call(e,l)&&l!==n&&x(e,l,{get:()=>t[l],enumerable:!(u=V(t,l))||u.enumerable});return e};var K=e=>J(x({},"__esModule",{value:!0}),e);var se={};G(se,{Fragment:()=>U,component:()=>X,h:()=>C,render:()=>N,useCallback:()=>h,useCatch:()=>Y,useEffect:()=>te,useHost:()=>p,useLayout:()=>ee,useMemo:()=>Q,useReducer:()=>S,useRef:()=>_,useState:()=>Z});const U=({children:e})=>e,C=(e,t,...n)=>{const{length:u}=n;return n=u==0?null:u==1?n[0]:n,{children:n,...t,nodeName:e}},N=(e,t,n)=>{let u=t.firstChild;for(e of b(e)){let l=u;if(e instanceof Node)l=e;else if(typeof e=="string"){for(;l&&l.nodeType!=3;)l=l.nextSibling;l?l.data!=e&&(l.data=e):l=document.createTextNode(e)}else{const{xmlns:a=n,nodeName:i,key:r,ref:o,memo:q,children:z,[T]:v,...P}=e;for(;l&&!(l.localName==i&&$(l.$key??=r,r));)l=l.nextSibling;l??=ie(a,i,r),ne(o)&&(o.current=l,l.$ref=o),(q==null||w(l.$deps,l.$deps=q))&&(re(P,l),f(v)?v(l):N(z,l,a))}l==u?u=u.nextSibling:fe(t,l,u)}for(;u;){const l=u.nextSibling;L(u),t.removeChild(u),u=l}},X=e=>({nodeName:t,as:n,props:u,key:l,ref:a,memo:i,...r})=>C(n??e?.as??"c-host",{...e?.props,...u,key:l,ref:a,memo:i,[T]:o=>{o.$fn=f(e)?e:le,o.$args={...e?.args,...r},M(o)}}),S=(e,t)=>{const n=p(),u=g(),[l,a]=u;return l==a.length&&(a[l]=[f(t)?t():t,i=>{const r=a[l][0],o=f(i)?i(r):i;$(r,a[l][0]=f(e)?e(r,o):o)||oe(n)}]),a[u[0]++]},Q=(e,t)=>{const n=g(),[u,l]=n;return(u==l.length||t==null||w(t,l[u][1]))&&(l[u]=[e(),t]),l[n[0]++][0]},Y=e=>{const t=p(),[n,u]=S(),l=g(),[a,i]=l;return i[l[0]++]=e,t.$catch??=r=>{f(i[a])&&i[a](r),u(r)},[n,()=>u()]},p=()=>c,Z=e=>S(null,e),_=e=>Q(()=>({current:e}),[]),h=(e,t)=>Q(()=>e,t),ee=(e,t)=>j(e,t,"$layout"),te=(e,t)=>j(e,t,"$effect"),{isArray:s,from:F}=Array,{is:$}=Object,le=()=>{},T=Symbol(),ne=e=>e&&typeof e=="object",f=e=>typeof e=="function",w=(e,t)=>s(e)&&s(t)?e.some((n,u)=>!$(n,t[u])):!$(e,t),ue=e=>F(e).reduce(ae,{}),ae=(e,{name:t,value:n})=>(e[t]=n,e),E=globalThis.queueMicrotask??(e=>e()),I=globalThis.requestAnimationFrame??E,ie=(e,t,n)=>{const u=e?document.createElementNS(e,t):document.createElement(t);return u.$key=n,u},b=function*(e,t={data:""},n=!0){let u;for(e of s(e)?e:[e])e==null||typeof e=="boolean"||(typeof e.nodeName=="string"?((u=t.data)&&(t.data="",yield u),yield e):f(e.nodeName)?yield*b(e.nodeName(e),t,!1):s(e)?yield*b(e,t,!1):t.data+=e);n&&(u=t.data)&&(yield u)},re=(e,t)=>{const n=t.$props??=t.hasAttributes()?ue(t.attributes):{};for(const u in{...n,...t.$props=e}){let l=e[u];l!==n[u]&&(u.startsWith("set:")?t[u.slice(4)]=l:l==null||l===!1?t.removeAttribute(u):t.setAttribute(u,l===!0?"":l))}},fe=(e,t,n)=>{if(t.contains?.(document.activeElement)){const u=t.nextSibling;for(;n&&n!=t;){const l=n.nextSibling;e.insertBefore(n,u),n=l}}else e.insertBefore(t,n)},g=()=>c.$hooks??=[0,[]],j=(e,t,n)=>{const u=p(),l=g(),[a,i]=l;a==i.length?(u[n]??=new Set).add(i[a]=[null,e,t]):(t==null||w(t,i[a][2]))&&(i[a][1]=e,i[a][2]=t),l[0]++},M=e=>{if(!e.$idle){if(globalThis.navigator?.scheduling?.isInputPending()){d.add(e),e.$idle=!0,A??=requestIdleCallback(()=>{A=null;const t=F(d);for(const n of t)d.delete(n),n.$idle=!1,M(n)});return}B(e)}},oe=e=>{e.$queued||(e.$queued=!0,E(()=>{e.$queued=!1,B(e)}))},B=e=>{e.$idle&&(d.delete(e),e.$idle=!1),c=e,c.$hooks&&(c.$hooks[0]=0);try{e.$h=e.$fn(e.$args)}catch(t){k(t,e.parentNode)}finally{c=null,y.add(e),e.$layoutQueued=!0,O??=I(ce)}},ce=()=>{O=null;for(const e of y){y.delete(e),e.$layoutQueued=!1;try{N(e.$h,e),e.$h=null}catch(t){k(t,e)}finally{H(e,"$layout"),m.add(e),e.$effectQueued=!0,R??=I(de)}}},de=()=>{R=null;for(const e of m)m.delete(e),e.$effectQueued=!1,H(e,"$effect")},H=(e,t)=>{if(e[t])for(const n of e[t]){const[u,l]=n;if(f(l))try{f(u)&&u(),n[0]=l()}catch(a){n[0]=null,k(a,e.parentNode)}finally{n[1]=null}}},L=e=>{if(e.nodeType==1){for(const t of e.children)L(t);if(e.$ref&&(e.$ref.current=null),!!e.$fn){e.$idle&&(d.delete(e),e.$idle=!1),e.$layoutQueued&&(y.delete(e),e.$layoutQueued=!1),e.$effectQueued&&(m.delete(e),e.$effectQueued=!1);for(const t of["$layout","$effect"])if(e[t])for(const n of e[t]){e[t].delete(n);try{const[u]=n;f(u)&&u()}catch(u){k(u,e.parentNode)}finally{n[0]=n[1]=null}}}}},k=(e,t)=>{for(let n;t;t=t.parentNode)if(f(n=t.$catch))return void n(e);throw e};let c=null,y=new Set,m=new Set,d=new Set,O=null,R=null,A=null;return K(se);})();
1
+ var ajo=(()=>{var x=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var u in t)x(e,u,{get:t[u],enumerable:!0})},J=(e,t,u,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of W(t))!D.call(e,n)&&n!==u&&x(e,n,{get:()=>t[n],enumerable:!(l=V(t,n))||l.enumerable});return e};var K=e=>J(x({},"__esModule",{value:!0}),e);var ye={};G(ye,{Fragment:()=>U,component:()=>X,h:()=>T,render:()=>Q,useCallback:()=>h,useCatch:()=>Y,useEffect:()=>ne,useHost:()=>p,useInsert:()=>ee,useLayout:()=>te,useMemo:()=>w,useReducer:()=>S,useRef:()=>_,useState:()=>Z});const U=({children:e})=>e,T=(e,t,...u)=>{const{length:l}=u;return u=l==0?null:l==1?u[0]:u,{children:u,...t,nodeName:e}},Q=(e,t,u)=>{let l=t.firstChild;for(e of b(e)){let n=l;if(e instanceof Node)n=e;else if(typeof e=="string"){for(;n&&n.nodeType!=3;)n=n.nextSibling;n?n.data!=e&&(n.data=e):n=document.createTextNode(e)}else{const{xmlns:r=u,nodeName:a,key:i,ref:o,memo:A,children:z,[E]:F,...P}=e;for(;n&&!(n.localName==a&&$(n.$key??=i,i));)n=n.nextSibling;n??=ie(r,a,i),ue(o)&&(o.current=n,n.$ref=o),(A==null||v(n.$deps,n.$deps=A))&&(fe(P,n),f(F)?F(n):Q(z,n,r))}n==l?l=l.nextSibling:oe(t,n,l)}for(;l;){const n=l.nextSibling;H(l),t.removeChild(l),l=n}},X=e=>({nodeName:t,as:u,props:l,key:n,ref:r,memo:a,...i})=>T(u??e?.as??"c-host",{...e?.props,...l,key:n,ref:r,memo:a,[E]:o=>{o.$fn=f(e)?e:le,o.$args={...e?.args,...i},M(o)}}),S=(e,t)=>{const u=p(),l=g(),[n,r]=l;return n==r.length&&(r[n]=[f(t)?t():t,a=>{const i=r[n][0],o=f(a)?a(i):a;$(i,r[n][0]=f(e)?e(i,o):o)||de(u)}]),r[l[0]++]},w=(e,t)=>{const u=g(),[l,n]=u;return(l==n.length||t==null||v(t,n[l][1]))&&(n[l]=[e(),t]),n[u[0]++][0]},Y=e=>{const t=p(),[u,l]=S(),n=g(),[r,a]=n;return a[n[0]++]=e,t.$catch??=i=>{f(a[r])&&a[r](i),l(i)},[u,()=>l()]},p=()=>c,Z=e=>S(null,e),_=e=>w(()=>({current:e}),[]),h=(e,t)=>w(()=>e,t),ee=(e,t)=>I(e,t,"$insert"),te=(e,t)=>I(e,t,"$layout"),ne=(e,t)=>I(e,t,"$effect"),{isArray:s,from:C}=Array,{is:$}=Object,le=()=>{},E=Symbol(),ue=e=>e&&typeof e=="object",f=e=>typeof e=="function",v=(e,t)=>s(e)&&s(t)?e.some((u,l)=>!$(u,t[l])):!$(e,t),re=e=>C(e).reduce(ae,{}),ae=(e,{name:t,value:u})=>(e[t]=u,e),j=globalThis.queueMicrotask??(e=>e()),q=globalThis.requestAnimationFrame??j,ie=(e,t,u)=>{const l=e?document.createElementNS(e,t):document.createElement(t);return l.$key=u,l},b=function*(e,t={data:""},u=!0){let l;for(e of s(e)?e:[e])e==null||typeof e=="boolean"||(typeof e.nodeName=="string"?((l=t.data)&&(t.data="",yield l),yield e):f(e.nodeName)?yield*b(e.nodeName(e),t,!1):s(e)?yield*b(e,t,!1):t.data+=e);u&&(l=t.data)&&(yield l)},fe=(e,t)=>{const u=t.$props??=t.hasAttributes()?re(t.attributes):{};for(const l in{...u,...t.$props=e}){let n=e[l];n!==u[l]&&(l.startsWith("set:")?t[l.slice(4)]=n:n==null||n===!1?t.removeAttribute(l):t.setAttribute(l,n===!0?"":n))}},oe=(e,t,u)=>{if(t.contains?.(document.activeElement)){const l=t.nextSibling;for(;u&&u!=t;){const n=u.nextSibling;e.insertBefore(u,l),u=n}}else e.insertBefore(t,u)},g=()=>c.$hooks??=[0,[]],I=(e,t,u)=>{const l=p(),n=g(),[r,a]=n;r==a.length?(l[u]??=new Set).add(a[r]=[null,e,t]):(t==null||v(t,a[r][2]))&&(a[r][1]=e,a[r][2]=t),n[0]++},M=e=>{if(!e.$idle){if(globalThis.navigator?.scheduling?.isInputPending()){d.add(e),e.$idle=!0,R??=requestIdleCallback(ce);return}B(e)}},B=e=>{e.$idle&&(d.delete(e),e.$idle=!1),c=e,c.$hooks&&(c.$hooks[0]=0);try{e.$h=e.$fn(e.$args)}catch(t){k(t,e.parentNode)}finally{c=null,y.add(e),e.$layoutQueued=!0,L??=q(se)}},ce=()=>{R=null;for(const e of C(d))d.delete(e),e.$idle=!1,M(e)},de=e=>{e.$runQueued||(e.$runQueued=!0,j(()=>{e.$runQueued=!1,B(e)}))},se=()=>{L=null;for(const e of y){y.delete(e),e.$layoutQueued=!1,N(e,"$insert");try{Q(e.$h,e),e.$h=null}catch(t){k(t,e)}finally{N(e,"$layout"),m.add(e),e.$effectQueued=!0,O??=q($e)}}},$e=()=>{O=null;for(const e of m)m.delete(e),e.$effectQueued=!1,N(e,"$effect")},N=(e,t)=>{if(e[t])for(const u of e[t]){const[l,n]=u;if(f(n))try{f(l)&&l(),u[0]=n()}catch(r){u[0]=null,k(r,e.parentNode)}finally{u[1]=null}}},H=e=>{if(e.nodeType==1){for(const t of e.children)H(t);if(e.$ref&&(e.$ref.current=null),!!e.$fn){e.$idle&&(d.delete(e),e.$idle=!1),e.$layoutQueued&&(y.delete(e),e.$layoutQueued=!1),e.$effectQueued&&(m.delete(e),e.$effectQueued=!1);for(const t of["$insert","$layout","$effect"])if(e[t])for(const u of e[t]){e[t].delete(u);try{const[l]=u;f(l)&&l()}catch(l){k(l,e.parentNode)}finally{u[0]=u[1]=null}}}}},k=(e,t)=>{for(let u;t;t=t.parentNode)if(f(u=t.$catch))return void u(e);throw e};let c=null,y=new Set,m=new Set,d=new Set,L=null,O=null,R=null;return K(ye);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ajo",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "ajo is a JavaScript view library for building user interfaces",
5
5
  "type": "module",
6
6
  "module": "index.js",
package/readme.md CHANGED
@@ -7,7 +7,7 @@ ajo is a JavaScript view library for building user interfaces
7
7
  npm install ajo
8
8
  ```
9
9
 
10
- ## render JSX to a DOM element
10
+ ## render a JSX element to a DOM element
11
11
 
12
12
  ```jsx
13
13
  /** @jsx h */
@@ -18,7 +18,7 @@ document.body.innerHTML = '<div>Hello World</div>'
18
18
  render(<div>Goodbye World</div>, document.body)
19
19
  ```
20
20
 
21
- ## stateless component
21
+ ## function element (stateless)
22
22
 
23
23
  ```jsx
24
24
  /** @jsx h */
@@ -29,7 +29,7 @@ const Greet = ({ name }) => <div>Hello {name}</div>
29
29
  render(<Greet name="World" />, document.body)
30
30
  ```
31
31
 
32
- ## stateful component
32
+ ## component element (stateful)
33
33
 
34
34
  ```jsx
35
35
  /** @jsx h */