efficient-web-builder 28.1.0 → 29.0.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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 29.0.0 - 2026-10-20
|
|
6
|
+
|
|
7
|
+
**MAJOR: easel peer ^15.** The `efficient-easel` peer range rises from `^14.1.0` to `^15.0.0` (and `efficient-shell` to `^8.10.1`), so a host on easel 14 must upgrade.
|
|
8
|
+
|
|
9
|
+
**The website editor takes efficient-easel 15.0.0** (Lewis 2026-10-20, card [FIX] Single Click On Text). Nothing in the builder's own code changes; the canvas behaviour comes with the screen:
|
|
10
|
+
|
|
11
|
+
### Changed (from efficient-easel 15.0.0)
|
|
12
|
+
|
|
13
|
+
- One click on a block selects it and leaves no caret; a block whose words can be typed shows "Double-click to edit" on its top-right corner.
|
|
14
|
+
- The pointer on the canvas is the arrow; the I-beam only inside the words being typed.
|
|
15
|
+
- Backspace never deletes a block. The Delete key, the trash and right-click Delete still do, with Undo.
|
|
16
|
+
- No "+" insert point while words are typed; ⌘A while typing selects the words of that box only.
|
|
17
|
+
- The floating text toolbar is one row (efficient-shell `TextToolbar layout="row"`).
|
|
18
|
+
|
|
19
|
+
### For hosts
|
|
20
|
+
|
|
21
|
+
- **efficient-easel `^15.0.0`** (peer and dev; was `^14.1.0`) and **efficient-shell `^8.10.1`** (was `^8.8.1`; easel 15 needs `^8.9.0`, and 8.10.1 draws the "{ }" Insert variable glyph).
|
|
22
|
+
|
|
23
|
+
**Every picture row is efficient-shell's `MediaUploadField`, drawn directly** (SSOT, harness UI-24). A MINOR, with a higher efficient-shell floor; it frees the builder for efficient-easel 15.0.0, which deletes `ImageBox`.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- `components/MediaUploadField.tsx` (every section's `upload()` row and the chrome media panels) draws the shell's `MediaUploadField` instead of efficient-easel's `ImageBox`. The ask to the admin's media window is the field's `onPick`, which returns a promise of the URL: the field shows "Choosing" while the window is open, takes the URL, and says when the library could not be opened (efficient-shell 8.7.0). The drop, the size cap, the focus dot and the template note are as before.
|
|
28
|
+
- The empty box's words are the shell's now: "Upload an image" (or "Upload a video") and "Choose from library or upload", where easel's were "Choose an image" and "From the library, or upload one". The box, its size and the filled picture look the same.
|
|
29
|
+
|
|
30
|
+
### For hosts
|
|
31
|
+
|
|
32
|
+
- **efficient-shell `^8.8.1`** (peer and dev; was `^8.2.0`): the promised `onPick` is new in 8.7.0.
|
|
33
|
+
|
|
34
|
+
### Guard
|
|
35
|
+
|
|
36
|
+
- `scripts/test-one-picture-field.ts`: no file in `src/` draws `ImageBox`; the picture row is the shell's `MediaUploadField`, handed `onPick`.
|
|
37
|
+
|
|
5
38
|
## 28.1.0 - 2026-10-20
|
|
6
39
|
|
|
7
40
|
**The cookie banner's own system page** (consent by country, efficient-backend docs/adr/0065). A MINOR: new exports, nothing removed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as t}from"react/jsx-runtime";import{SettingsDefaultReset as S,SettingsField as v}from"efficient-easel/panel";import{useSelectedFields as b}from"efficient-easel/easel";import{FOCAL_DEFAULT as x}from"efficient-shell/format";import{ImageIcon as g,PlayIcon as w}from"efficient-easel/icons";import{MediaUploadField as C}from"efficient-shell/ui";import{useContext as y}from"react";import{StorefrontDocumentContext as P}from"./StorefrontDocumentContext.js";import{editorEaselWords as U,say as l}from"../../format/lib/editor-words.js";import{PHONE_CLEAR as D,phoneKey as I}from"../../format/lib/puck/phone-override.js";import{usePreviewDevice as M}from"efficient-easel/draw/client";import{requestMediaPick as A}from"../lib/editor-media-picker.js";import{useEditorHost as B}from"../lib/editor-host.js";import{backendOf as L}from"../lib/website-session.js";import{useEditorSession as O}from"../lib/editor-session-context.js";function R(o,d){let e=null;try{e=b()}catch{e=null}const n=M()==="mobile";if(!o||!e||d&&!d(e.values??{}))return null;const r=typeof e.values?.[o]=="string"&&e.values[o]?String(e.values[o]):x,i=I(o),c=typeof e.values?.[i]=="string"&&e.values[i]?String(e.values[i]):void 0,m=e.onChange;return{phone:n,desktop:r,own:c,focus:n?c??r:r,set:u=>m(n?i:o,u),clear:()=>m(i,D)}}function T({value:o,onChange:d,label:e,accept:n,placeholder:r,focusKey:i,focusWhen:c}){const m=B(),u=O(),p=l(e),a=n.startsWith("video"),s=R(a?void 0:i,c),f=y(P),k=h=>A(m,{accept:n,title:p,...h?{file:h}:{}}).then(F=>F?.url??null);if(f&&!f.capabilities.mediaEditing)return t(v,{label:p,icon:a?t(w,{}):t(g,{}),children:t("div",{className:"sf-image-slot-inert",children:a?l("Templates don’t store videos — this slot stays a placeholder. Each website picks its own after it’s created."):l("Templates don’t store images — this slot stays a placeholder. Each website picks its own after it’s created.")})});const E=s?.phone&&o?t(S,{words:U()?.panel,label:l("Image focus"),changed:!!s.own,detail:l("{value} on desktop",{value:s.desktop}),onReset:s.clear}):void 0;return t(v,{label:p,icon:a?t(w,{}):t(g,{}),action:E,children:t("div",{style:{flex:"1 1 auto",minWidth:0},children:t(C,{value:o,onChange:d,onPick:k,accept:a?"video/*":"image/*",kind:a?"video":"image",placeholder:r===void 0?void 0:l(r),maxSizeBytes:L(u).media.maxUploadBytes,...s?{focus:s.focus,onFocusChange:s.set}:{}})})})}export{T as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "efficient-web-builder",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "29.0.0",
|
|
4
4
|
"description": "The EFFICIENT website builder: the website editor, the general sections and the renderer that draws them, compiled. Hostable by any EFFICIENT product; nothing here imports a host.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Efficient Pty Ltd",
|
|
@@ -43,17 +43,18 @@
|
|
|
43
43
|
"test:boundary": "node scripts/test-boundary.mjs",
|
|
44
44
|
"test:screen": "node scripts/test-screen-in-easel.mjs",
|
|
45
45
|
"test:own-ui": "efficient-shell-ui-check",
|
|
46
|
+
"test:media-hosts": "efficient-shell-media-host-check",
|
|
46
47
|
"build": "node scripts/build.mjs",
|
|
47
48
|
"verify:dist": "node scripts/verify-dist.mjs && node scripts/verify-published-entries.mjs",
|
|
48
|
-
"verify": "pnpm run typecheck && pnpm run test:boundary && pnpm run test:screen && pnpm run test:own-ui && pnpm run test:guards && pnpm run build && pnpm run verify:dist",
|
|
49
|
+
"verify": "pnpm run typecheck && pnpm run test:boundary && pnpm run test:screen && pnpm run test:own-ui && pnpm run test:media-hosts && pnpm run test:guards && pnpm run build && pnpm run verify:dist",
|
|
49
50
|
"test:guards": "tsc --noEmit -p scripts/tsconfig.json && node scripts/run-guards.mjs",
|
|
50
51
|
"words": "TSX_TSCONFIG_PATH=scripts/tsconfig.json tsx scripts/write-editor-words.ts",
|
|
51
52
|
"text-parts": "TSX_TSCONFIG_PATH=scripts/tsconfig.json tsx scripts/write-text-part-shapes.ts"
|
|
52
53
|
},
|
|
53
54
|
"peerDependencies": {
|
|
54
55
|
"@tabler/icons-react": "^3.46.0",
|
|
55
|
-
"efficient-easel": "^
|
|
56
|
-
"efficient-shell": "^8.
|
|
56
|
+
"efficient-easel": "^15.0.0",
|
|
57
|
+
"efficient-shell": "^8.10.1",
|
|
57
58
|
"isomorphic-dompurify": "^3.18.0",
|
|
58
59
|
"next": ">=16",
|
|
59
60
|
"react": ">=19",
|
|
@@ -72,8 +73,8 @@
|
|
|
72
73
|
"@types/node": "^20",
|
|
73
74
|
"@types/react": "^19",
|
|
74
75
|
"@types/react-dom": "^19",
|
|
75
|
-
"efficient-easel": "^
|
|
76
|
-
"efficient-shell": "^8.
|
|
76
|
+
"efficient-easel": "^15.0.0",
|
|
77
|
+
"efficient-shell": "^8.10.1",
|
|
77
78
|
"esbuild": "^0.28.0",
|
|
78
79
|
"happy-dom": "^20.14.5",
|
|
79
80
|
"isomorphic-dompurify": "^3.18.0",
|