Browse code

Update

Benjamin Roth authored on04/02/2026 16:01:58
Showing8 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+!vendor/
... ...
@@ -1,6 +1,15 @@
1 1
 :root {
2
-    --luumicore-primary: #007bff;
3
-    --luumicore-text-color: #333;
2
+  --luumicore-primary: #8c124d;
3
+  --luumicore-primary-tint: color-mix(in srgb, var(--luumicore-primary), #ffffff 85%);
4
+  --luumicore-secondary: #f0f0f0;
5
+  --luumicore-tertiary: #ffffff;
6
+  --luumicore-text-color: #000000;
7
+  --luumicore-shadow-color: rgba(from #000 r g b / 15%);
8
+
9
+  --luumicore-shadow: .25rem .25rem .25rem var(--luumicore-shadow-color);
10
+
11
+  --luumicore-border-radius: 1rem;
12
+  --luumicore-element-spacing: 2rem;
4 13
 }
5 14
 
6 15
 /* Global styles for the core bundle */
... ...
@@ -3,12 +3,22 @@ import { LitElement, html, css } from 'lit';
3 3
 export class LuumicoreCard extends LitElement {
4 4
   static styles = css`
5 5
     :host {
6
+      --luumicore-card-bg: var(--luumicore-secondary, #fff);
7
+      --luumicore-card-border-color: var(--luumicore-secondary, #fff);
8
+      --luumicore-card-border-radius: var(--luumicore-border-radius, 1rem);
9
+      --luumicore-card-shadow: var(--luumicore-shadow, .25rem .25rem 1rem rgba(0,0,0,0.2));
10
+      --luumicore-card-spacing: var(--luumicore-element-spacing, 2rem);
11
+
6 12
       display: block;
7
-      border: 1px solid var(--luumicore-border-color, #ddd);
8
-      border-radius: var(--luumicore-border-radius, 8px);
13
+      border: 1px solid var(--luumicore-card-border-color);
14
+      border-radius: var(--luumicore-card-border-radius);
9 15
       overflow: hidden;
10
-      background-color: var(--luumicore-card-bg, #fff);
11
-      box-shadow: var(--luumicore-shadow, 0 2px 4px rgba(0,0,0,0.1));
16
+      background-color: var(--luumicore-card-bg);
17
+      box-shadow: var(--luumicore-card-shadow);
18
+    }
19
+
20
+    :host(:not(:last-child)) {
21
+      margin-bottom: var(--luumicore-card-spacing);
12 22
     }
13 23
 
14 24
     .card-image {
15 25
new file mode 100644
16 26
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+{# {% extends "@Contao/page/layout.html.twig" %} #}
2
+
3
+{% block body_content %}
4
+    <div class="luumicore-dashboard">
5
+        <h1>Luumicore Dashboard</h1>
6
+        <p>Welcome to the dashboard.</p>
7
+    </div>
8
+{% endblock %}
... ...
@@ -1 +1 @@
1
-:root{--luumicore-primary: #007bff;--luumicore-text-color: #333}
1
+:root{--luumicore-primary: #8c124d;--luumicore-primary-tint: color-mix(in srgb, var(--luumicore-primary), #ffffff 85%);--luumicore-secondary: #f0f0f0;--luumicore-tertiary: #ffffff;--luumicore-text-color: #000000;--luumicore-shadow-color: rgba(from #000 r g b / 15%);--luumicore-shadow: .25rem .25rem .25rem var(--luumicore-shadow-color);--luumicore-border-radius: 1rem;--luumicore-element-spacing: 2rem}
... ...
@@ -1,6 +1,6 @@
1
-var ft = Object.defineProperty;
2
-var mt = (r, t, e) => t in r ? ft(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
-var b = (r, t, e) => mt(r, typeof t != "symbol" ? t + "" : t, e);
1
+var mt = Object.defineProperty;
2
+var ft = (r, t, e) => t in r ? mt(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
+var b = (r, t, e) => ft(r, typeof t != "symbol" ? t + "" : t, e);
4 4
 /**
5 5
  * @license
6 6
  * Copyright 2019 Google LLC
... ...
@@ -48,7 +48,7 @@ const _t = (r) => new nt(typeof r == "string" ? r : r + "", void 0, Z), D = (r,
48 48
  * Copyright 2017 Google LLC
49 49
  * SPDX-License-Identifier: BSD-3-Clause
50 50
  */
51
-const { is: At, defineProperty: yt, getOwnPropertyDescriptor: vt, getOwnPropertyNames: bt, getOwnPropertySymbols: Et, getPrototypeOf: St } = Object, m = globalThis, G = m.trustedTypes, xt = G ? G.emptyScript : "", L = m.reactiveElementPolyfillSupport, C = (r, t) => r, V = { toAttribute(r, t) {
51
+const { is: At, defineProperty: vt, getOwnPropertyDescriptor: yt, getOwnPropertyNames: bt, getOwnPropertySymbols: Et, getPrototypeOf: St } = Object, f = globalThis, G = f.trustedTypes, xt = G ? G.emptyScript : "", L = f.reactiveElementPolyfillSupport, C = (r, t) => r, V = { toAttribute(r, t) {
52 52
   switch (t) {
53 53
     case Boolean:
54 54
       r = r ? xt : null;
... ...
@@ -77,7 +77,7 @@ const { is: At, defineProperty: yt, getOwnPropertyDescriptor: vt, getOwnProperty
77 77
   }
78 78
   return e;
79 79
 } }, at = (r, t) => !At(r, t), Q = { attribute: !0, type: String, converter: V, reflect: !1, useDefault: !1, hasChanged: at };
80
-Symbol.metadata ?? (Symbol.metadata = Symbol("metadata")), m.litPropertyMetadata ?? (m.litPropertyMetadata = /* @__PURE__ */ new WeakMap());
80
+Symbol.metadata ?? (Symbol.metadata = Symbol("metadata")), f.litPropertyMetadata ?? (f.litPropertyMetadata = /* @__PURE__ */ new WeakMap());
81 81
 let E = class extends HTMLElement {
82 82
   static addInitializer(t) {
83 83
     this._$Ei(), (this.l ?? (this.l = [])).push(t);
... ...
@@ -88,11 +88,11 @@ let E = class extends HTMLElement {
88 88
   static createProperty(t, e = Q) {
89 89
     if (e.state && (e.attribute = !1), this._$Ei(), this.prototype.hasOwnProperty(t) && ((e = Object.create(e)).wrapped = !0), this.elementProperties.set(t, e), !e.noAccessor) {
90 90
       const s = Symbol(), i = this.getPropertyDescriptor(t, s, e);
91
-      i !== void 0 && yt(this.prototype, t, i);
91
+      i !== void 0 && vt(this.prototype, t, i);
92 92
     }
93 93
   }
94 94
   static getPropertyDescriptor(t, e, s) {
95
-    const { get: i, set: n } = vt(this.prototype, t) ?? { get() {
95
+    const { get: i, set: n } = yt(this.prototype, t) ?? { get() {
96 96
       return this[e];
97 97
     }, set(o) {
98 98
       this[e] = o;
... ...
@@ -281,15 +281,15 @@ let E = class extends HTMLElement {
281 281
   firstUpdated(t) {
282 282
   }
283 283
 };
284
-E.elementStyles = [], E.shadowRootOptions = { mode: "open" }, E[C("elementProperties")] = /* @__PURE__ */ new Map(), E[C("finalized")] = /* @__PURE__ */ new Map(), L == null || L({ ReactiveElement: E }), (m.reactiveElementVersions ?? (m.reactiveElementVersions = [])).push("2.1.2");
284
+E.elementStyles = [], E.shadowRootOptions = { mode: "open" }, E[C("elementProperties")] = /* @__PURE__ */ new Map(), E[C("finalized")] = /* @__PURE__ */ new Map(), L == null || L({ ReactiveElement: E }), (f.reactiveElementVersions ?? (f.reactiveElementVersions = [])).push("2.1.2");
285 285
 /**
286 286
  * @license
287 287
  * Copyright 2017 Google LLC
288 288
  * SPDX-License-Identifier: BSD-3-Clause
289 289
  */
290
-const P = globalThis, X = (r) => r, k = P.trustedTypes, Y = k ? k.createPolicy("lit-html", { createHTML: (r) => r }) : void 0, lt = "$lit$", f = `lit$${Math.random().toFixed(9).slice(2)}$`, ht = "?" + f, wt = `<${ht}>`, v = document, U = () => v.createComment(""), O = (r) => r === null || typeof r != "object" && typeof r != "function", J = Array.isArray, Ct = (r) => J(r) || typeof (r == null ? void 0 : r[Symbol.iterator]) == "function", j = `[ 	
290
+const P = globalThis, X = (r) => r, k = P.trustedTypes, Y = k ? k.createPolicy("lit-html", { createHTML: (r) => r }) : void 0, lt = "$lit$", m = `lit$${Math.random().toFixed(9).slice(2)}$`, ht = "?" + m, wt = `<${ht}>`, y = document, U = () => y.createComment(""), O = (r) => r === null || typeof r != "object" && typeof r != "function", J = Array.isArray, Ct = (r) => J(r) || typeof (r == null ? void 0 : r[Symbol.iterator]) == "function", j = `[ 	
291 291
 \f\r]`, w = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g, tt = /-->/g, et = />/g, g = RegExp(`>|${j}(?:([^\\s"'>=/]+)(${j}*=${j}*(?:[^ 	
292
-\f\r"'\`<>=]|("|')|))|$)`, "g"), st = /'/g, it = /"/g, ct = /^(?:script|style|textarea|title)$/i, Pt = (r) => (t, ...e) => ({ _$litType$: r, strings: t, values: e }), H = Pt(1), S = Symbol.for("lit-noChange"), d = Symbol.for("lit-nothing"), rt = /* @__PURE__ */ new WeakMap(), A = v.createTreeWalker(v, 129);
292
+\f\r"'\`<>=]|("|')|))|$)`, "g"), st = /'/g, it = /"/g, ct = /^(?:script|style|textarea|title)$/i, Pt = (r) => (t, ...e) => ({ _$litType$: r, strings: t, values: e }), H = Pt(1), S = Symbol.for("lit-noChange"), d = Symbol.for("lit-nothing"), rt = /* @__PURE__ */ new WeakMap(), A = y.createTreeWalker(y, 129);
293 293
 function dt(r, t) {
294 294
   if (!J(r) || !r.hasOwnProperty("raw")) throw Error("invalid template strings array");
295 295
   return Y !== void 0 ? Y.createHTML(t) : t;
... ...
@@ -302,7 +302,7 @@ const Ut = (r, t) => {
302 302
     let c, u, h = -1, p = 0;
303 303
     for (; p < a.length && (o.lastIndex = p, u = o.exec(a), u !== null); ) p = o.lastIndex, o === w ? u[1] === "!--" ? o = tt : u[1] !== void 0 ? o = et : u[2] !== void 0 ? (ct.test(u[2]) && (i = RegExp("</" + u[2], "g")), o = g) : u[3] !== void 0 && (o = g) : o === g ? u[0] === ">" ? (o = i ?? w, h = -1) : u[1] === void 0 ? h = -2 : (h = o.lastIndex - u[2].length, c = u[1], o = u[3] === void 0 ? g : u[3] === '"' ? it : st) : o === it || o === st ? o = g : o === tt || o === et ? o = w : (o = g, i = void 0);
304 304
     const $ = o === g && r[l + 1].startsWith("/>") ? " " : "";
305
-    n += o === w ? a + wt : h >= 0 ? (s.push(c), a.slice(0, h) + lt + a.slice(h) + f + $) : a + f + (h === -2 ? l : $);
305
+    n += o === w ? a + wt : h >= 0 ? (s.push(c), a.slice(0, h) + lt + a.slice(h) + m + $) : a + m + (h === -2 ? l : $);
306 306
   }
307 307
   return [dt(r, n + (r[e] || "<?>") + (t === 2 ? "</svg>" : t === 3 ? "</math>" : "")), s];
308 308
 };
... ...
@@ -319,11 +319,11 @@ class M {
319 319
     for (; (i = A.nextNode()) !== null && a.length < l; ) {
320 320
       if (i.nodeType === 1) {
321 321
         if (i.hasAttributes()) for (const h of i.getAttributeNames()) if (h.endsWith(lt)) {
322
-          const p = u[o++], $ = i.getAttribute(h).split(f), R = /([.?@])?(.*)/.exec(p);
322
+          const p = u[o++], $ = i.getAttribute(h).split(m), R = /([.?@])?(.*)/.exec(p);
323 323
           a.push({ type: 1, index: n, name: R[2], strings: $, ctor: R[1] === "." ? Ht : R[1] === "?" ? Mt : R[1] === "@" ? Nt : z }), i.removeAttribute(h);
324
-        } else h.startsWith(f) && (a.push({ type: 6, index: n }), i.removeAttribute(h));
324
+        } else h.startsWith(m) && (a.push({ type: 6, index: n }), i.removeAttribute(h));
325 325
         if (ct.test(i.tagName)) {
326
-          const h = i.textContent.split(f), p = h.length - 1;
326
+          const h = i.textContent.split(m), p = h.length - 1;
327 327
           if (p > 0) {
328 328
             i.textContent = k ? k.emptyScript : "";
329 329
             for (let $ = 0; $ < p; $++) i.append(h[$], U()), A.nextNode(), a.push({ type: 2, index: ++n });
... ...
@@ -333,13 +333,13 @@ class M {
333 333
       } else if (i.nodeType === 8) if (i.data === ht) a.push({ type: 2, index: n });
334 334
       else {
335 335
         let h = -1;
336
-        for (; (h = i.data.indexOf(f, h + 1)) !== -1; ) a.push({ type: 7, index: n }), h += f.length - 1;
336
+        for (; (h = i.data.indexOf(m, h + 1)) !== -1; ) a.push({ type: 7, index: n }), h += m.length - 1;
337 337
       }
338 338
       n++;
339 339
     }
340 340
   }
341 341
   static createElement(t, e) {
342
-    const s = v.createElement("template");
342
+    const s = y.createElement("template");
343 343
     return s.innerHTML = t, s;
344 344
   }
345 345
 }
... ...
@@ -361,7 +361,7 @@ class Ot {
361 361
     return this._$AM._$AU;
362 362
   }
363 363
   u(t) {
364
-    const { el: { content: e }, parts: s } = this._$AD, i = ((t == null ? void 0 : t.creationScope) ?? v).importNode(e, !0);
364
+    const { el: { content: e }, parts: s } = this._$AD, i = ((t == null ? void 0 : t.creationScope) ?? y).importNode(e, !0);
365 365
     A.currentNode = i;
366 366
     let n = A.nextNode(), o = 0, l = 0, a = s[0];
367 367
     for (; a !== void 0; ) {
... ...
@@ -371,7 +371,7 @@ class Ot {
371 371
       }
372 372
       o !== (a == null ? void 0 : a.index) && (n = A.nextNode(), o++);
373 373
     }
374
-    return A.currentNode = v, i;
374
+    return A.currentNode = y, i;
375 375
   }
376 376
   p(t) {
377 377
     let e = 0;
... ...
@@ -407,7 +407,7 @@ class N {
407 407
     this._$AH !== t && (this._$AR(), this._$AH = this.O(t));
408 408
   }
409 409
   _(t) {
410
-    this._$AH !== d && O(this._$AH) ? this._$AA.nextSibling.data = t : this.T(v.createTextNode(t)), this._$AH = t;
410
+    this._$AH !== d && O(this._$AH) ? this._$AA.nextSibling.data = t : this.T(y.createTextNode(t)), this._$AH = t;
411 411
   }
412 412
   $(t) {
413 413
     var n;
... ...
@@ -523,7 +523,7 @@ const Tt = (r, t, e) => {
523 523
  * Copyright 2017 Google LLC
524 524
  * SPDX-License-Identifier: BSD-3-Clause
525 525
  */
526
-const y = globalThis;
526
+const v = globalThis;
527 527
 class _ extends E {
528 528
   constructor() {
529 529
     super(...arguments), this.renderOptions = { host: this }, this._$Do = void 0;
... ...
@@ -550,10 +550,10 @@ class _ extends E {
550 550
   }
551 551
 }
552 552
 var ot;
553
-_._$litElement$ = !0, _.finalized = !0, (ot = y.litElementHydrateSupport) == null || ot.call(y, { LitElement: _ });
554
-const B = y.litElementPolyfillSupport;
553
+_._$litElement$ = !0, _.finalized = !0, (ot = v.litElementHydrateSupport) == null || ot.call(v, { LitElement: _ });
554
+const B = v.litElementPolyfillSupport;
555 555
 B == null || B({ LitElement: _ });
556
-(y.litElementVersions ?? (y.litElementVersions = [])).push("4.2.2");
556
+(v.litElementVersions ?? (v.litElementVersions = [])).push("4.2.2");
557 557
 class W extends _ {
558 558
   render() {
559 559
     return H`
... ...
@@ -571,12 +571,22 @@ class W extends _ {
571 571
 }
572 572
 b(W, "styles", D`
573 573
     :host {
574
+      --luumicore-card-bg: var(--luumicore-secondary, #fff);
575
+      --luumicore-card-border-color: var(--luumicore-secondary, #fff);
576
+      --luumicore-card-border-radius: var(--luumicore-border-radius, 1rem);
577
+      --luumicore-card-shadow: var(--luumicore-shadow, .25rem .25rem 1rem rgba(0,0,0,0.2));
578
+      --luumicore-card-spacing: var(--luumicore-element-spacing, 2rem);
579
+
574 580
       display: block;
575
-      border: 1px solid var(--luumicore-border-color, #ddd);
576
-      border-radius: var(--luumicore-border-radius, 8px);
581
+      border: 1px solid var(--luumicore-card-border-color);
582
+      border-radius: var(--luumicore-card-border-radius);
577 583
       overflow: hidden;
578
-      background-color: var(--luumicore-card-bg, #fff);
579
-      box-shadow: var(--luumicore-shadow, 0 2px 4px rgba(0,0,0,0.1));
584
+      background-color: var(--luumicore-card-bg);
585
+      box-shadow: var(--luumicore-card-shadow);
586
+    }
587
+
588
+    :host(:not(:last-child)) {
589
+      margin-bottom: var(--luumicore-card-spacing);
580 590
     }
581 591
 
582 592
     .card-image {
583 593
new file mode 100644
... ...
@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+namespace luumicore\CoreBundle\Controller\Page;
6
+
7
+use Contao\CoreBundle\Controller\Page\AbstractLayoutPageController;
8
+use Contao\CoreBundle\DependencyInjection\Attribute\AsPage;
9
+use Contao\CoreBundle\Twig\LayoutTemplate;
10
+use Contao\LayoutModel;
11
+use Symfony\Component\HttpFoundation\Request;
12
+use Symfony\Component\HttpFoundation\Response;
13
+
14
+#[AsPage(type: 'luumicore_dashboard')]
15
+class DashboardPageController extends AbstractLayoutPageController
16
+{
17
+    protected function getResponse(LayoutTemplate $template, LayoutModel $model, Request $request): Response
18
+    {
19
+        $this->initializeContaoFramework();
20
+        dump($this->container);
21
+        return $template->getResponse();
22
+    }
23
+}