@websline/cms-view-utils 0.4.0 → 0.5.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.
@@ -0,0 +1 @@
1
+ export*from"./pageData";
@@ -0,0 +1 @@
1
+ async function u(e,t,n){const _=import.meta.env.PUBLIC_API_URL?.replace(/\/+$/,"");if(!_)throw new Error("PUBLIC_API_URL ist nicht gesetzt.");const r=`__pageData__${t}__${n}`;if(!e[r]){const o=`${_}/${t}/pages/${n}`,a=await fetch(o);if(!a.ok)throw new Error(`Fehler beim Abrufen der Seite: ${a.status} ${a.statusText}`);e[r]=await a.json()}return e.__currentPageKey=r,e[r]}function f(e){const t=e.__currentPageKey;if(!t||!e[t])throw new Error("getPageData() wurde aufgerufen, bevor fetchPageData() ausgef\xFChrt wurde.");return e[t]}export{u as fetchPageData,f as getPageData};
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{default as o}from"./components/PageRenderer.astro";export*from"./data";export*from"./utils";export{o as PageRenderer};
@@ -0,0 +1 @@
1
+ [data-drop-zone]{transition:all .2s ease-in-out;height:0}[data-drop-zone].highlight{border:1.5px dashed var(--cms-drop-zone-border, #00f);height:60px;margin:24px 0}[data-drop-zone].highlight:hover{background-color:var(--cms-drop-zone-background, rgba(0, 0, 255, 0.5))}
@@ -0,0 +1 @@
1
+ const i=(n="[data-block-area]")=>{const e=document.querySelector(n);if(!e)return;const d=Array.from(e.children);let t=0;d.forEach((a,c)=>{const r=document.createElement("div");r.setAttribute("data-drop-zone",""),r.setAttribute("data-drop-zone-index",t.toString()),e.insertBefore(r,a),t++});const o=document.createElement("div");o.setAttribute("data-drop-zone",""),o.setAttribute("data-drop-zone-index",t.toString()),e.appendChild(o)};export{i as insertDropZones};
@@ -0,0 +1 @@
1
+ class r{constructor(){this.mouseFollowerWidth=48,this.mouseFollowerHeight=48,this.handleMouseMove=e=>{this.lastMouseEvent=e,this.updateMouseFollowerPosition(e),this.checkMouseLeaveFrame()},this.handleScroll=()=>{this.lastMouseEvent&&this.updateMouseFollowerPosition(this.lastMouseEvent)},window.addEventListener("message",e=>{const{owner:o,type:t}=e.data;o==="dragging"&&(t==="startDragging"&&this.enableDragging(),t==="stopDragging"&&this.disableDragging(),t==="enterIframeWhileDragging"&&this.showMouseFollower(),t==="leaveIframeWhileDragging"&&this.hideMouseFollower())})}enableDragging(){this.addStopDraggingHandler(),this.addMouseFollowerToDOM(),this.addMouseFollowerHandler(),this.highlightDropzone(),this.addDropListeners(),window.addEventListener("scroll",this.handleScroll,!0)}disableDragging(){this.removeStopDraggingHandler(),this.removeMouseFollowerFromDOM(),this.removeMouseFollowerHandler(),this.unhighlightDropzone(),this.removeDropListeners(),window.removeEventListener("scroll",this.handleScroll,!0),this.lastMouseEvent=null}addStopDraggingHandler(){window.addEventListener("mouseup",this.stopDragging)}removeStopDraggingHandler(){window.removeEventListener("mouseup",this.stopDragging)}stopDragging=()=>{this.sendParentMessage({owner:"iframe",type:"stopDragging"}),this.removeStopDraggingHandler()};addMouseFollowerToDOM(){if(this.mouseFollowerInDOM())return;const e=document.createElement("div");e.className="mouse-follower",Object.assign(e.style,{position:"absolute",zIndex:"9999",pointerEvents:"none",left:`-${this.mouseFollowerWidth}px`,top:`-${this.mouseFollowerHeight}px`,width:this.mouseFollowerWidth+"px",height:this.mouseFollowerHeight+"px",background:"url(/drag-component.svg) no-repeat center center"}),document.body.appendChild(e)}addMouseFollowerHandler(){window.addEventListener("mousemove",this.handleMouseMove)}removeMouseFollowerHandler(){window.removeEventListener("mousemove",this.handleMouseMove)}updateMouseFollowerPosition(e){const o=this.getMouseFollower();o&&(o.style.left=`${e.clientX+window.scrollX-this.mouseFollowerWidth/2}px`,o.style.top=`${e.clientY+window.scrollY-this.mouseFollowerHeight/2}px`)}checkMouseLeaveFrame(){const e=this.getMouseFollower();if(!e)return;const o=e.getBoundingClientRect(),t=1,s=o.left<-t||o.top<-t||o.right>window.innerWidth+t||o.bottom>window.innerHeight+t;s&&!e.dataset._wasOutside?(e.dataset._wasOutside="true",this.hideMouseFollower(),this.sendParentMessage({owner:"iframe",type:"leaveIframe"})):!s&&e.dataset._wasOutside==="true"&&delete e.dataset._wasOutside}hideMouseFollower(){const e=this.getMouseFollower();e&&(e.style.display="none")}showMouseFollower(){const e=this.getMouseFollower();e&&(e.style.display="block")}removeMouseFollowerFromDOM(){const e=this.getMouseFollower();e&&e.remove()}mouseFollowerInDOM(){return!!this.getMouseFollower()}getMouseFollower(){return document.querySelector(".mouse-follower")}sendParentMessage(e){window.parent.postMessage(e,"*")}addDropListeners(){document.querySelectorAll("[data-drop-zone]").forEach(o=>{o.addEventListener("mouseup",this.commitDrop)})}removeDropListeners(){document.querySelectorAll("[data-drop-zone]").forEach(o=>{o.removeEventListener("mouseup",this.commitDrop)})}commitDrop=e=>{e.preventDefault();const o=e.target.getAttribute("data-drop-zone-index");this.sendParentMessage({owner:"iframe",position:o,type:"commitDrop"})};highlightDropzone(){document.querySelectorAll("[data-drop-zone]").forEach(o=>{o.classList.add("highlight")})}unhighlightDropzone(){document.querySelectorAll("[data-drop-zone]").forEach(o=>{o.classList.remove("highlight")})}}var n=r;export{n as default};
@@ -0,0 +1 @@
1
+ export*from"./iframeDragHandler";export*from"./dropZoneUtils";
package/package.json CHANGED
@@ -1,16 +1,25 @@
1
1
  {
2
2
  "name": "@websline/cms-view-utils",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "exports": {
6
- ".": "./src/index.js"
6
+ ".": "./dist/index.js"
7
7
  },
8
8
  "files": [
9
- "src"
9
+ "dist",
10
+ "src/**/*.svelte",
11
+ "src/**/*.astro"
10
12
  ],
11
13
  "sideEffects": false,
12
14
  "peerDependencies": {
13
15
  "astro": "^5.8.0",
14
16
  "svelte": "^5.33.2"
17
+ },
18
+ "devDependencies": {
19
+ "esbuild": "^0.25.4",
20
+ "csso": "^5.0.5"
21
+ },
22
+ "scripts": {
23
+ "build": "node build.js"
15
24
  }
16
25
  }
package/src/data/index.js DELETED
@@ -1 +0,0 @@
1
- export * from "./pageData";
@@ -1,34 +0,0 @@
1
- export async function fetchPageData(locals, lang, slug) {
2
- const API_BASE = import.meta.env.PUBLIC_API_URL?.replace(/\/+$/, ""); // Remove trailing slashes
3
- if (!API_BASE) throw new Error("PUBLIC_API_URL ist nicht gesetzt.");
4
-
5
- const key = `__pageData__${lang}__${slug}`;
6
-
7
- if (!locals[key]) {
8
- const url = `${API_BASE}/${lang}/pages/${slug}`;
9
- const res = await fetch(url);
10
-
11
- if (!res.ok) {
12
- throw new Error(
13
- `Fehler beim Abrufen der Seite: ${res.status} ${res.statusText}`
14
- );
15
- }
16
-
17
- locals[key] = await res.json();
18
- }
19
-
20
- locals.__currentPageKey = key;
21
- return locals[key];
22
- }
23
-
24
- export function getPageData(locals) {
25
- const key = locals.__currentPageKey;
26
-
27
- if (!key || !locals[key]) {
28
- throw new Error(
29
- "getPageData() wurde aufgerufen, bevor fetchPageData() ausgeführt wurde."
30
- );
31
- }
32
-
33
- return locals[key];
34
- }
package/src/index.js DELETED
@@ -1,3 +0,0 @@
1
- export { default as PageRenderer } from "./components/PageRenderer.astro";
2
- export * from "./data";
3
- export * from "./utils";
@@ -1,12 +0,0 @@
1
- [data-drop-zone] {
2
- transition: all 0.2s ease-in-out;
3
- height: 0px;
4
- }
5
- [data-drop-zone].highlight {
6
- border: 1.5px dashed var(--cms-drop-zone-border, #00f);
7
- height: 60px;
8
- margin: 24px 0;
9
- }
10
- [data-drop-zone].highlight:hover {
11
- background-color: var(--cms-drop-zone-background, rgba(0, 0, 255, 0.5));
12
- }
@@ -1,23 +0,0 @@
1
- const insertDropZones = (blockAreaSelector = "[data-block-area]") => {
2
- const blockArea = document.querySelector(blockAreaSelector);
3
- if (!blockArea) return;
4
-
5
- const children = Array.from(blockArea.children);
6
- let lastIndex = 0;
7
-
8
- children.forEach((child, index) => {
9
- const dropZone = document.createElement("div");
10
- dropZone.setAttribute("data-drop-zone", "");
11
- dropZone.setAttribute("data-drop-zone-index", lastIndex.toString());
12
- blockArea.insertBefore(dropZone, child);
13
-
14
- lastIndex++;
15
- });
16
-
17
- const finalDropZone = document.createElement("div");
18
- finalDropZone.setAttribute("data-drop-zone", "");
19
- finalDropZone.setAttribute("data-drop-zone-index", lastIndex.toString());
20
- blockArea.appendChild(finalDropZone);
21
- };
22
-
23
- export { insertDropZones };
@@ -1,210 +0,0 @@
1
- // Handler for mouse follower behavior inside the iframe
2
- class IframeDragHandler {
3
- constructor() {
4
- this.mouseFollowerWidth = 48;
5
- this.mouseFollowerHeight = 48;
6
-
7
- this.handleMouseMove = (event) => {
8
- this.lastMouseEvent = event;
9
- this.updateMouseFollowerPosition(event);
10
- this.checkMouseLeaveFrame();
11
- };
12
-
13
- this.handleScroll = () => {
14
- if (!this.lastMouseEvent) return;
15
- this.updateMouseFollowerPosition(this.lastMouseEvent);
16
- };
17
-
18
- window.addEventListener("message", (event) => {
19
- const { owner, type } = event.data;
20
- if (owner !== "dragging") return;
21
-
22
- if (type === "startDragging") {
23
- this.enableDragging();
24
- }
25
-
26
- if (type === "stopDragging") {
27
- this.disableDragging();
28
- }
29
-
30
- if (type === "enterIframeWhileDragging") {
31
- this.showMouseFollower();
32
- }
33
-
34
- if (type === "leaveIframeWhileDragging") {
35
- this.hideMouseFollower();
36
- }
37
- });
38
- }
39
-
40
- enableDragging() {
41
- this.addStopDraggingHandler();
42
- this.addMouseFollowerToDOM();
43
- this.addMouseFollowerHandler();
44
- this.highlightDropzone();
45
- this.addDropListeners();
46
- window.addEventListener("scroll", this.handleScroll, true);
47
- }
48
-
49
- disableDragging() {
50
- this.removeStopDraggingHandler();
51
- this.removeMouseFollowerFromDOM();
52
- this.removeMouseFollowerHandler();
53
- this.unhighlightDropzone();
54
- this.removeDropListeners();
55
- window.removeEventListener("scroll", this.handleScroll, true);
56
- this.lastMouseEvent = null;
57
- }
58
-
59
- addStopDraggingHandler() {
60
- window.addEventListener("mouseup", this.stopDragging);
61
- }
62
-
63
- removeStopDraggingHandler() {
64
- window.removeEventListener("mouseup", this.stopDragging);
65
- }
66
-
67
- stopDragging = () => {
68
- this.sendParentMessage({
69
- owner: "iframe",
70
- type: "stopDragging",
71
- });
72
- this.removeStopDraggingHandler();
73
- };
74
-
75
- addMouseFollowerToDOM() {
76
- if (this.mouseFollowerInDOM()) return;
77
-
78
- const div = document.createElement("div");
79
- div.className = "mouse-follower";
80
-
81
- Object.assign(div.style, {
82
- position: "absolute",
83
- zIndex: "9999",
84
- pointerEvents: "none",
85
- left: `-${this.mouseFollowerWidth}px`,
86
- top: `-${this.mouseFollowerHeight}px`,
87
- width: this.mouseFollowerWidth + "px",
88
- height: this.mouseFollowerHeight + "px",
89
- background: "url(/drag-component.svg) no-repeat center center",
90
- });
91
-
92
- document.body.appendChild(div);
93
- }
94
-
95
- addMouseFollowerHandler() {
96
- window.addEventListener("mousemove", this.handleMouseMove);
97
- }
98
-
99
- removeMouseFollowerHandler() {
100
- window.removeEventListener("mousemove", this.handleMouseMove);
101
- }
102
-
103
- updateMouseFollowerPosition(event) {
104
- const div = this.getMouseFollower();
105
- if (div) {
106
- div.style.left = `${event.clientX + window.scrollX - this.mouseFollowerWidth / 2}px`;
107
- div.style.top = `${event.clientY + window.scrollY - this.mouseFollowerHeight / 2}px`;
108
- }
109
- }
110
-
111
- checkMouseLeaveFrame() {
112
- const follower = this.getMouseFollower();
113
- if (!follower) return;
114
-
115
- const rect = follower.getBoundingClientRect();
116
- const margin = 1;
117
-
118
- const outOfBounds =
119
- rect.left < -margin ||
120
- rect.top < -margin ||
121
- rect.right > window.innerWidth + margin ||
122
- rect.bottom > window.innerHeight + margin;
123
-
124
- if (outOfBounds && !follower.dataset._wasOutside) {
125
- follower.dataset._wasOutside = "true";
126
- this.hideMouseFollower();
127
- this.sendParentMessage({ owner: "iframe", type: "leaveIframe" });
128
- } else if (!outOfBounds && follower.dataset._wasOutside === "true") {
129
- delete follower.dataset._wasOutside;
130
- }
131
- }
132
-
133
- hideMouseFollower() {
134
- const div = this.getMouseFollower();
135
- if (div) {
136
- div.style.display = "none";
137
- }
138
- }
139
-
140
- showMouseFollower() {
141
- const div = this.getMouseFollower();
142
- if (div) {
143
- div.style.display = "block";
144
- }
145
- }
146
-
147
- removeMouseFollowerFromDOM() {
148
- const div = this.getMouseFollower();
149
- if (div) {
150
- div.remove();
151
- }
152
- }
153
-
154
- mouseFollowerInDOM() {
155
- return !!this.getMouseFollower();
156
- }
157
-
158
- getMouseFollower() {
159
- return document.querySelector(".mouse-follower");
160
- }
161
-
162
- sendParentMessage(message) {
163
- window.parent.postMessage(message, "*");
164
- }
165
-
166
- addDropListeners() {
167
- const dropzones = document.querySelectorAll("[data-drop-zone]");
168
-
169
- dropzones.forEach((dropzone) => {
170
- dropzone.addEventListener("mouseup", this.commitDrop);
171
- });
172
- }
173
-
174
- removeDropListeners() {
175
- const dropzones = document.querySelectorAll("[data-drop-zone]");
176
-
177
- dropzones.forEach((dropzone) => {
178
- dropzone.removeEventListener("mouseup", this.commitDrop);
179
- });
180
- }
181
-
182
- commitDrop = (event) => {
183
- event.preventDefault();
184
- const dropPosition = event.target.getAttribute("data-drop-zone-index");
185
-
186
- this.sendParentMessage({
187
- owner: "iframe",
188
- position: dropPosition,
189
- type: "commitDrop",
190
- });
191
- };
192
-
193
- highlightDropzone() {
194
- const dropzones = document.querySelectorAll("[data-drop-zone]");
195
-
196
- dropzones.forEach((dropzone) => {
197
- dropzone.classList.add("highlight");
198
- });
199
- }
200
-
201
- unhighlightDropzone() {
202
- const dropzones = document.querySelectorAll("[data-drop-zone]");
203
-
204
- dropzones.forEach((dropzone) => {
205
- dropzone.classList.remove("highlight");
206
- });
207
- }
208
- }
209
-
210
- export default IframeDragHandler;
@@ -1,2 +0,0 @@
1
- export * from "./iframeDragHandler";
2
- export * from "./dropZoneUtils";