draggable-dashboard-lete-pro 1.5.4

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,562 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ var _excluded = ["tiles", "setTiles", "dashboardId", "editMode", "theme", "fetchers"];
3
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
4
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
6
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
7
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
8
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
12
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
13
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
14
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
15
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
16
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
23
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
24
+ import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';
25
+ import { GRID_COLS, GRID_GAP, MIN_UNITS, MOBILE_BREAKPOINT } from '../constants';
26
+ import { DashboardTile } from './DashboardTile';
27
+ import { getPositions, setPositions } from '../services/dashboardTileDB';
28
+ import { TileContent } from './TileContent';
29
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
30
+ export var DraggableDashboard = function DraggableDashboard(_ref) {
31
+ var tiles = _ref.tiles,
32
+ setTiles = _ref.setTiles,
33
+ dashboardId = _ref.dashboardId,
34
+ _ref$editMode = _ref.editMode,
35
+ editMode = _ref$editMode === void 0 ? true : _ref$editMode,
36
+ _ref$theme = _ref.theme,
37
+ theme = _ref$theme === void 0 ? 'light' : _ref$theme,
38
+ fetchers = _ref.fetchers,
39
+ rest = _objectWithoutProperties(_ref, _excluded);
40
+ var containerRef = useRef(null);
41
+ var _useState = useState(0),
42
+ _useState2 = _slicedToArray(_useState, 2),
43
+ containerWidth = _useState2[0],
44
+ setContainerWidth = _useState2[1];
45
+ var _useState3 = useState(false),
46
+ _useState4 = _slicedToArray(_useState3, 2),
47
+ isMobile = _useState4[0],
48
+ setIsMobile = _useState4[1];
49
+ var _useState5 = useState(null),
50
+ _useState6 = _slicedToArray(_useState5, 2),
51
+ dragState = _useState6[0],
52
+ setDragState = _useState6[1];
53
+ var _useState7 = useState(null),
54
+ _useState8 = _slicedToArray(_useState7, 2),
55
+ resizeState = _useState8[0],
56
+ setResizeState = _useState8[1];
57
+ var _useState9 = useState(null),
58
+ _useState0 = _slicedToArray(_useState9, 2),
59
+ activeTileId = _useState0[0],
60
+ setActiveTileId = _useState0[1];
61
+ var _useState1 = useState(null),
62
+ _useState10 = _slicedToArray(_useState1, 2),
63
+ maximizedTileId = _useState10[0],
64
+ setMaximizedTileId = _useState10[1];
65
+
66
+ // Delete confirmation state
67
+ var _useState11 = useState(null),
68
+ _useState12 = _slicedToArray(_useState11, 2),
69
+ tileToDeleteId = _useState12[0],
70
+ setTileToDeleteId = _useState12[1];
71
+
72
+ // Persistence management
73
+ useEffect(function () {
74
+ var initPositions = /*#__PURE__*/function () {
75
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
76
+ var saved, _t;
77
+ return _regenerator().w(function (_context) {
78
+ while (1) switch (_context.p = _context.n) {
79
+ case 0:
80
+ _context.p = 0;
81
+ _context.n = 1;
82
+ return getPositions(dashboardId);
83
+ case 1:
84
+ saved = _context.v;
85
+ if (saved && Object.keys(saved).length > 0) {
86
+ setTiles(function (prev) {
87
+ return prev.map(function (t) {
88
+ return saved[t.id] ? _objectSpread(_objectSpread({}, t), saved[t.id]) : t;
89
+ });
90
+ });
91
+ }
92
+ _context.n = 3;
93
+ break;
94
+ case 2:
95
+ _context.p = 2;
96
+ _t = _context.v;
97
+ console.warn('Could not load saved positions', _t);
98
+ case 3:
99
+ return _context.a(2);
100
+ }
101
+ }, _callee, null, [[0, 2]]);
102
+ }));
103
+ return function initPositions() {
104
+ return _ref2.apply(this, arguments);
105
+ };
106
+ }();
107
+ initPositions();
108
+ }, [dashboardId, setTiles]);
109
+ var savePositions = useCallback(/*#__PURE__*/function () {
110
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(currentTiles) {
111
+ var posMap, _t2;
112
+ return _regenerator().w(function (_context2) {
113
+ while (1) switch (_context2.p = _context2.n) {
114
+ case 0:
115
+ posMap = {};
116
+ currentTiles.forEach(function (t) {
117
+ posMap[t.id] = {
118
+ x: t.x,
119
+ y: t.y,
120
+ w: t.w,
121
+ h: t.h
122
+ };
123
+ });
124
+ _context2.p = 1;
125
+ _context2.n = 2;
126
+ return setPositions(dashboardId, posMap);
127
+ case 2:
128
+ _context2.n = 4;
129
+ break;
130
+ case 3:
131
+ _context2.p = 3;
132
+ _t2 = _context2.v;
133
+ console.warn('Could not save positions', _t2);
134
+ case 4:
135
+ return _context2.a(2);
136
+ }
137
+ }, _callee2, null, [[1, 3]]);
138
+ }));
139
+ return function (_x) {
140
+ return _ref3.apply(this, arguments);
141
+ };
142
+ }(), [dashboardId]);
143
+
144
+ // Responsive handling
145
+ useEffect(function () {
146
+ var handleResize = function handleResize() {
147
+ if (containerRef.current) {
148
+ var width = containerRef.current.offsetWidth;
149
+ if (width > 0) {
150
+ setContainerWidth(width);
151
+ }
152
+ setIsMobile(window.innerWidth <= MOBILE_BREAKPOINT);
153
+ }
154
+ };
155
+ handleResize();
156
+ var observer = new ResizeObserver(handleResize);
157
+ if (containerRef.current) observer.observe(containerRef.current);
158
+ window.addEventListener('resize', handleResize);
159
+ return function () {
160
+ window.removeEventListener('resize', handleResize);
161
+ observer.disconnect();
162
+ };
163
+ }, []);
164
+ var cellSize = useMemo(function () {
165
+ if (isMobile) return 0;
166
+ var effectiveWidth = containerWidth || (typeof window !== 'undefined' ? window.innerWidth - 64 : 1100);
167
+ return Math.max(10, (effectiveWidth - (GRID_COLS - 1) * GRID_GAP) / GRID_COLS);
168
+ }, [containerWidth, isMobile]);
169
+
170
+ // Maximize Navigation
171
+ var navigateMaximized = function navigateMaximized(direction) {
172
+ if (!maximizedTileId || tiles.length === 0) return;
173
+ var currentIndex = tiles.findIndex(function (t) {
174
+ return t.id === maximizedTileId;
175
+ });
176
+ if (currentIndex === -1) return;
177
+ var nextIndex = direction === 'next' ? (currentIndex + 1) % tiles.length : (currentIndex - 1 + tiles.length) % tiles.length;
178
+ setMaximizedTileId(tiles[nextIndex].id);
179
+ };
180
+
181
+ // Collision & Placement Logic
182
+ var checkOverlap = function checkOverlap(a, b) {
183
+ return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
184
+ };
185
+ var findNearestAvailableSpot = function findNearestAvailableSpot(target, allTiles, excludeId) {
186
+ var others = allTiles.filter(function (t) {
187
+ return t.id !== excludeId;
188
+ });
189
+ if (!others.some(function (o) {
190
+ return checkOverlap(target, o);
191
+ })) return target;
192
+ for (var radius = 1; radius < 20; radius++) {
193
+ for (var dy = -radius; dy <= radius; dy++) {
194
+ var _loop = function _loop() {
195
+ if (Math.abs(dx) !== radius && Math.abs(dy) !== radius) return 0; // continue
196
+ var nx = target.x + dx;
197
+ var ny = target.y + dy;
198
+ if (nx >= 0 && nx <= GRID_COLS - target.w && ny >= 0) {
199
+ var potential = _objectSpread(_objectSpread({}, target), {}, {
200
+ x: nx,
201
+ y: ny
202
+ });
203
+ if (!others.some(function (o) {
204
+ return checkOverlap(potential, o);
205
+ })) return {
206
+ v: potential
207
+ };
208
+ }
209
+ },
210
+ _ret;
211
+ for (var dx = -radius; dx <= radius; dx++) {
212
+ _ret = _loop();
213
+ if (_ret === 0) continue;
214
+ if (_ret) return _ret.v;
215
+ }
216
+ }
217
+ }
218
+ return target;
219
+ };
220
+ var resolveCollisions = useCallback(function (movedTile, allTiles) {
221
+ var currentLayout = _toConsumableArray(allTiles);
222
+ var movedIdx = currentLayout.findIndex(function (t) {
223
+ return t.id === movedTile.id;
224
+ });
225
+ if (movedIdx === -1) return currentLayout;
226
+ currentLayout[movedIdx] = movedTile;
227
+ var hasOverlap = true;
228
+ var safetyCounter = 0;
229
+ while (hasOverlap && safetyCounter < 30) {
230
+ hasOverlap = false;
231
+ safetyCounter++;
232
+ for (var i = 0; i < currentLayout.length; i++) {
233
+ for (var j = 0; j < currentLayout.length; j++) {
234
+ if (i === j) continue;
235
+ if (checkOverlap(currentLayout[i], currentLayout[j])) {
236
+ hasOverlap = true;
237
+ var targetIdx = currentLayout[i].id === movedTile.id ? j : i;
238
+ currentLayout[targetIdx] = _objectSpread(_objectSpread({}, currentLayout[targetIdx]), findNearestAvailableSpot(currentLayout[targetIdx], currentLayout, currentLayout[targetIdx].id));
239
+ }
240
+ }
241
+ }
242
+ }
243
+ return currentLayout;
244
+ }, []);
245
+
246
+ // Event Handlers
247
+ var handleDragStart = function handleDragStart(e, tileId) {
248
+ if (!editMode) return;
249
+ var tile = tiles.find(function (t) {
250
+ return t.id === tileId;
251
+ });
252
+ if (!tile) return;
253
+ setActiveTileId(tileId);
254
+ setDragState({
255
+ tileId: tileId,
256
+ startX: e.clientX,
257
+ startY: e.clientY,
258
+ originalX: tile.x,
259
+ originalY: tile.y
260
+ });
261
+ e.target.setPointerCapture(e.pointerId);
262
+ };
263
+ var handleResizeStart = function handleResizeStart(e, tileId) {
264
+ if (!editMode) return;
265
+ var tile = tiles.find(function (t) {
266
+ return t.id === tileId;
267
+ });
268
+ if (!tile) return;
269
+ setActiveTileId(tileId);
270
+ setResizeState({
271
+ tileId: tileId,
272
+ startX: e.clientX,
273
+ startY: e.clientY,
274
+ startWidth: tile.w,
275
+ startHeight: tile.h,
276
+ originalW: tile.w,
277
+ originalH: tile.h
278
+ });
279
+ e.target.setPointerCapture(e.pointerId);
280
+ };
281
+ var handlePointerMove = function handlePointerMove(e) {
282
+ if (!editMode || isMobile) return;
283
+ if (dragState) {
284
+ var gridDeltaX = Math.round((e.clientX - dragState.startX) / (cellSize + GRID_GAP));
285
+ var gridDeltaY = Math.round((e.clientY - dragState.startY) / (cellSize + GRID_GAP));
286
+ var tile = tiles.find(function (t) {
287
+ return t.id === dragState.tileId;
288
+ });
289
+ var newX = Math.max(0, Math.min(GRID_COLS - tile.w, dragState.originalX + gridDeltaX));
290
+ var newY = Math.max(0, dragState.originalY + gridDeltaY);
291
+ if (newX !== tile.x || newY !== tile.y) {
292
+ var movedTile = _objectSpread(_objectSpread({}, tile), {}, {
293
+ x: newX,
294
+ y: newY
295
+ });
296
+ var newLayout = resolveCollisions(movedTile, tiles);
297
+ setTiles(newLayout);
298
+ }
299
+ }
300
+ if (resizeState) {
301
+ var gridDeltaW = Math.round((e.clientX - resizeState.startX) / (cellSize + GRID_GAP));
302
+ var gridDeltaH = Math.round((e.clientY - resizeState.startY) / (cellSize + GRID_GAP));
303
+ var _tile = tiles.find(function (t) {
304
+ return t.id === resizeState.tileId;
305
+ });
306
+ var newW = Math.max(MIN_UNITS, Math.min(GRID_COLS - _tile.x, resizeState.originalW + gridDeltaW));
307
+ var newH = Math.max(MIN_UNITS, resizeState.originalH + gridDeltaH);
308
+ if (newW !== _tile.w || newH !== _tile.h) {
309
+ var resizedTile = _objectSpread(_objectSpread({}, _tile), {}, {
310
+ w: newW,
311
+ h: newH
312
+ });
313
+ var _newLayout = resolveCollisions(resizedTile, tiles);
314
+ setTiles(_newLayout);
315
+ }
316
+ }
317
+ };
318
+ var handlePointerUp = function handlePointerUp(e) {
319
+ if (dragState || resizeState) savePositions(tiles);
320
+ setDragState(null);
321
+ setResizeState(null);
322
+ setActiveTileId(null);
323
+ };
324
+ var confirmDelete = function confirmDelete() {
325
+ if (tileToDeleteId) {
326
+ var updated = tiles.filter(function (t) {
327
+ return t.id !== tileToDeleteId;
328
+ });
329
+ setTiles(updated);
330
+ savePositions(updated);
331
+ setTileToDeleteId(null);
332
+ }
333
+ };
334
+ var renderDeleteConfirmation = function renderDeleteConfirmation() {
335
+ if (!tileToDeleteId) return null;
336
+ var tile = tiles.find(function (t) {
337
+ return t.id === tileToDeleteId;
338
+ });
339
+ return /*#__PURE__*/_jsx("div", {
340
+ className: "fixed inset-0 z-[300] bg-slate-900/60 backdrop-blur-md flex items-center justify-center p-4 animate-in fade-in duration-300",
341
+ children: /*#__PURE__*/_jsxs("div", {
342
+ className: "bg-white dark:bg-slate-900 w-full max-w-sm rounded-3xl shadow-2xl overflow-hidden p-8 flex flex-col items-center text-center space-y-6",
343
+ children: [/*#__PURE__*/_jsx("div", {
344
+ className: "w-16 h-16 bg-red-50 dark:bg-red-900/20 rounded-2xl flex items-center justify-center text-red-500",
345
+ children: /*#__PURE__*/_jsx("svg", {
346
+ className: "w-8 h-8",
347
+ fill: "none",
348
+ stroke: "currentColor",
349
+ viewBox: "0 0 24 24",
350
+ strokeWidth: 2.5,
351
+ children: /*#__PURE__*/_jsx("path", {
352
+ d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-4v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
353
+ })
354
+ })
355
+ }), /*#__PURE__*/_jsxs("div", {
356
+ className: "space-y-2",
357
+ children: [/*#__PURE__*/_jsx("h3", {
358
+ className: "text-xl font-black text-slate-800 dark:text-white",
359
+ children: "Delete Widget?"
360
+ }), /*#__PURE__*/_jsxs("p", {
361
+ className: "text-sm text-slate-500 dark:text-slate-400",
362
+ children: ["Are you sure you want to remove \"", /*#__PURE__*/_jsx("span", {
363
+ className: "font-bold text-slate-700 dark:text-slate-200",
364
+ children: tile === null || tile === void 0 ? void 0 : tile.title
365
+ }), "\"? This action cannot be undone."]
366
+ })]
367
+ }), /*#__PURE__*/_jsxs("div", {
368
+ className: "flex gap-3 w-full",
369
+ children: [/*#__PURE__*/_jsx("button", {
370
+ onClick: function onClick() {
371
+ return setTileToDeleteId(null);
372
+ },
373
+ className: "flex-1 px-4 py-3 text-xs font-black tracking-widest text-slate-500 dark:text-slate-400 hover:bg-slate-50 dark:hover:bg-slate-800 rounded-xl transition-colors uppercase",
374
+ children: "Cancel"
375
+ }), /*#__PURE__*/_jsx("button", {
376
+ onClick: confirmDelete,
377
+ className: "flex-1 px-4 py-3 text-xs font-black tracking-widest bg-red-500 text-white rounded-xl shadow-lg shadow-red-500/30 hover:bg-red-600 transition-all active:scale-95 uppercase",
378
+ children: "Delete"
379
+ })]
380
+ })]
381
+ })
382
+ });
383
+ };
384
+ var renderMaximizedView = function renderMaximizedView() {
385
+ if (!maximizedTileId) return null;
386
+ var tile = tiles.find(function (t) {
387
+ return t.id === maximizedTileId;
388
+ });
389
+ if (!tile) return null;
390
+ return /*#__PURE__*/_jsx("div", {
391
+ className: "fixed inset-0 z-[200] bg-slate-900/60 backdrop-blur-md flex items-center justify-center p-4 md:p-10 animate-in fade-in duration-300",
392
+ children: /*#__PURE__*/_jsxs("div", {
393
+ className: "bg-white dark:bg-slate-900 w-full max-w-6xl h-full max-h-[90vh] rounded-3xl shadow-2xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-300",
394
+ children: [/*#__PURE__*/_jsxs("div", {
395
+ className: "px-8 h-20 border-b border-slate-100 dark:border-slate-800 flex items-center justify-between shrink-0",
396
+ children: [/*#__PURE__*/_jsxs("div", {
397
+ className: "flex items-center gap-6",
398
+ children: [/*#__PURE__*/_jsxs("div", {
399
+ className: "flex items-center gap-2 bg-slate-100 dark:bg-slate-800 p-1.5 rounded-xl",
400
+ children: [/*#__PURE__*/_jsx("button", {
401
+ onClick: function onClick() {
402
+ return navigateMaximized('prev');
403
+ },
404
+ className: "p-2 hover:bg-white dark:hover:bg-slate-700 rounded-lg transition-all shadow-sm active:scale-90 text-slate-600 dark:text-slate-300",
405
+ children: /*#__PURE__*/_jsx("svg", {
406
+ className: "w-5 h-5",
407
+ fill: "none",
408
+ stroke: "currentColor",
409
+ viewBox: "0 0 24 24",
410
+ strokeWidth: 2.5,
411
+ children: /*#__PURE__*/_jsx("path", {
412
+ d: "M15 19l-7-7 7-7"
413
+ })
414
+ })
415
+ }), /*#__PURE__*/_jsx("button", {
416
+ onClick: function onClick() {
417
+ return navigateMaximized('next');
418
+ },
419
+ className: "p-2 hover:bg-white dark:hover:bg-slate-700 rounded-lg transition-all shadow-sm active:scale-90 text-slate-600 dark:text-slate-300",
420
+ children: /*#__PURE__*/_jsx("svg", {
421
+ className: "w-5 h-5",
422
+ fill: "none",
423
+ stroke: "currentColor",
424
+ viewBox: "0 0 24 24",
425
+ strokeWidth: 2.5,
426
+ children: /*#__PURE__*/_jsx("path", {
427
+ d: "M9 5l7 7-7 7"
428
+ })
429
+ })
430
+ })]
431
+ }), /*#__PURE__*/_jsxs("div", {
432
+ className: "flex flex-col",
433
+ children: [/*#__PURE__*/_jsx("span", {
434
+ className: "text-[10px] font-black text-slate-400 uppercase tracking-widest leading-none mb-1",
435
+ children: "MAXIMIZED VIEW"
436
+ }), /*#__PURE__*/_jsx("h3", {
437
+ className: "text-lg font-bold text-slate-800 dark:text-slate-100 leading-tight",
438
+ children: tile.title
439
+ })]
440
+ })]
441
+ }), /*#__PURE__*/_jsx("button", {
442
+ onClick: function onClick() {
443
+ return setMaximizedTileId(null);
444
+ },
445
+ className: "p-3 bg-slate-50 dark:bg-slate-800 hover:bg-red-50 dark:hover:bg-red-900/20 text-slate-400 hover:text-red-500 rounded-2xl transition-all",
446
+ children: /*#__PURE__*/_jsx("svg", {
447
+ className: "w-6 h-6",
448
+ fill: "none",
449
+ stroke: "currentColor",
450
+ viewBox: "0 0 24 24",
451
+ strokeWidth: 2.5,
452
+ children: /*#__PURE__*/_jsx("path", {
453
+ d: "M6 18L18 6M6 6l12 12"
454
+ })
455
+ })
456
+ })]
457
+ }), /*#__PURE__*/_jsx("div", {
458
+ className: "flex-1 overflow-auto p-8 md:p-12 scrollbar-hide",
459
+ children: /*#__PURE__*/_jsx("div", {
460
+ className: "max-w-4xl mx-auto h-full flex flex-col",
461
+ children: /*#__PURE__*/_jsx("div", {
462
+ className: "flex-1 rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm p-8 min-h-[400px]",
463
+ children: /*#__PURE__*/_jsx(TileContent, _objectSpread({
464
+ tile: tile,
465
+ setTiles: setTiles,
466
+ editMode: editMode,
467
+ fetchers: fetchers
468
+ }, rest))
469
+ })
470
+ })
471
+ })]
472
+ })
473
+ });
474
+ };
475
+ if (isMobile) {
476
+ return /*#__PURE__*/_jsxs("div", {
477
+ className: "flex flex-col gap-6 p-6",
478
+ children: [renderMaximizedView(), renderDeleteConfirmation(), tiles.map(function (tile) {
479
+ return /*#__PURE__*/_jsxs("div", {
480
+ className: "bg-white dark:bg-slate-800 rounded-2xl shadow-md border border-slate-200 dark:border-slate-700 overflow-hidden flex flex-col min-h-[400px]",
481
+ children: [/*#__PURE__*/_jsxs("div", {
482
+ className: "px-6 py-4 border-b border-slate-100 dark:border-slate-700/50 flex items-center justify-between bg-slate-50/50 dark:bg-slate-800/50",
483
+ children: [/*#__PURE__*/_jsx("h3", {
484
+ className: "text-sm font-bold text-slate-700 dark:text-slate-200",
485
+ children: tile.title
486
+ }), /*#__PURE__*/_jsxs("div", {
487
+ className: "flex items-center gap-2",
488
+ children: [/*#__PURE__*/_jsx("button", {
489
+ onClick: function onClick() {
490
+ return setMaximizedTileId(tile.id);
491
+ },
492
+ className: "p-2 text-indigo-600 bg-indigo-50 dark:bg-indigo-900/20 rounded-lg",
493
+ children: /*#__PURE__*/_jsx("svg", {
494
+ className: "w-4 h-4",
495
+ fill: "none",
496
+ stroke: "currentColor",
497
+ viewBox: "0 0 24 24",
498
+ strokeWidth: 2.5,
499
+ children: /*#__PURE__*/_jsx("path", {
500
+ d: "M15 3h6m0 0v6m0-6L14 10M9 21H3m0 0v-6m0 6l7-7"
501
+ })
502
+ })
503
+ }), editMode && /*#__PURE__*/_jsx("button", {
504
+ onClick: function onClick() {
505
+ return setTileToDeleteId(tile.id);
506
+ },
507
+ className: "p-2 text-red-500 bg-red-50 dark:bg-red-900/20 rounded-lg",
508
+ children: /*#__PURE__*/_jsx("svg", {
509
+ className: "w-4 h-4",
510
+ fill: "none",
511
+ stroke: "currentColor",
512
+ viewBox: "0 0 24 24",
513
+ strokeWidth: 2.5,
514
+ children: /*#__PURE__*/_jsx("path", {
515
+ d: "M6 18L18 6M6 6l12 12"
516
+ })
517
+ })
518
+ })]
519
+ })]
520
+ }), /*#__PURE__*/_jsx("div", {
521
+ className: "flex-1 p-6",
522
+ children: /*#__PURE__*/_jsx(TileContent, _objectSpread({
523
+ tile: tile,
524
+ setTiles: setTiles,
525
+ editMode: editMode,
526
+ fetchers: fetchers
527
+ }, rest))
528
+ })]
529
+ }, tile.id);
530
+ })]
531
+ });
532
+ }
533
+ var gridHeight = Math.max.apply(Math, _toConsumableArray(tiles.map(function (t) {
534
+ return t.y + t.h;
535
+ })).concat([12])) * (cellSize + GRID_GAP) + 120;
536
+ return /*#__PURE__*/_jsxs("div", {
537
+ ref: containerRef,
538
+ className: "relative w-full grid-bg select-none p-8 transition-all duration-500 ".concat(editMode ? 'grid-active' : '', " ").concat(theme === 'dark' ? 'dark' : ''),
539
+ onPointerMove: handlePointerMove,
540
+ onPointerUp: handlePointerUp,
541
+ onPointerLeave: handlePointerUp,
542
+ style: {
543
+ height: "".concat(gridHeight, "px"),
544
+ minHeight: '100vh'
545
+ },
546
+ children: [renderMaximizedView(), renderDeleteConfirmation(), tiles.map(function (tile) {
547
+ return /*#__PURE__*/_jsx(DashboardTile, _objectSpread({
548
+ tile: tile,
549
+ cellSize: cellSize,
550
+ editMode: editMode,
551
+ onDragStart: handleDragStart,
552
+ onResizeStart: handleResizeStart,
553
+ onDelete: setTileToDeleteId,
554
+ onMaximize: setMaximizedTileId,
555
+ isDragging: activeTileId === tile.id && !!dragState,
556
+ isResizing: activeTileId === tile.id && !!resizeState,
557
+ fetchers: fetchers,
558
+ setTiles: setTiles
559
+ }, rest), tile.id);
560
+ })]
561
+ });
562
+ };