ds-one 0.1.11-alpha.1 → 0.1.11-alpha.10

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.
Files changed (37) hide show
  1. package/DS1/0-face/2025-04-23-device.ts +117 -1
  2. package/DS1/1-root/fonts/GT-America-Compressed-Regular.woff2 +0 -0
  3. package/DS1/1-root/one.css +10 -1
  4. package/DS1/2-core/{text-v1.ts → ds-text.ts} +4 -4
  5. package/DS1/2-core/home-v1.ts +2 -2
  6. package/DS1/3-unit/doublenav-v1.ts +2 -2
  7. package/DS1/3-unit/singlenav-v1.ts +1 -1
  8. package/DS1/4-page/ds-grid.ts +16 -4
  9. package/DS1/4-page/ds-layout.ts +1 -20
  10. package/DS1/index.ts +7 -1
  11. package/DS1/utils/cdn-loader.ts +5 -0
  12. package/DS1/utils/keys.json +41 -1
  13. package/README.md +5 -5
  14. package/dist/0-face/2025-04-23-device.d.ts +24 -0
  15. package/dist/0-face/2025-04-23-device.d.ts.map +1 -1
  16. package/dist/0-face/2025-04-23-device.js +84 -1
  17. package/dist/2-core/ds-text.d.ts +48 -0
  18. package/dist/2-core/ds-text.d.ts.map +1 -0
  19. package/dist/2-core/ds-text.js +83 -0
  20. package/dist/2-core/home-v1.js +2 -2
  21. package/dist/3-unit/doublenav-v1.js +2 -2
  22. package/dist/3-unit/singlenav-v1.js +1 -1
  23. package/dist/4-page/ds-grid.d.ts.map +1 -1
  24. package/dist/4-page/ds-grid.js +16 -4
  25. package/dist/4-page/ds-layout.d.ts.map +1 -1
  26. package/dist/4-page/ds-layout.js +1 -20
  27. package/dist/ds-one.bundle.js +138 -33
  28. package/dist/ds-one.bundle.js.map +3 -3
  29. package/dist/ds-one.bundle.min.js +54 -61
  30. package/dist/ds-one.bundle.min.js.map +4 -4
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5 -1
  34. package/dist/utils/cdn-loader.d.ts.map +1 -1
  35. package/dist/utils/cdn-loader.js +5 -0
  36. package/dist/utils/keys.json +41 -1
  37. package/package.json +1 -1
@@ -0,0 +1,83 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { getText } from "../utils/language";
3
+ /**
4
+ * A component for displaying text from translations
5
+ *
6
+ * @element ds-text
7
+ * @prop {string} key - The translation key to use
8
+ * @prop {string} defaultValue - Default value if translation is not found
9
+ * @prop {string} fallback - Optional fallback text if translation is not found (deprecated, use defaultValue)
10
+ */
11
+ export class Text extends LitElement {
12
+ static get properties() {
13
+ return {
14
+ key: { type: String, reflect: true },
15
+ defaultValue: { type: String, reflect: true, attribute: "default-value" },
16
+ fallback: { type: String, reflect: true }, // Kept for backward compatibility
17
+ _text: { type: String, state: true },
18
+ };
19
+ }
20
+ constructor() {
21
+ super();
22
+ this.key = "";
23
+ this.defaultValue = "";
24
+ this.fallback = "";
25
+ this._text = "";
26
+ // Create bound event handlers for proper cleanup
27
+ this.boundHandlers = {
28
+ languageChanged: (() => {
29
+ console.log("Language changed event received in ds-text");
30
+ this._loadText();
31
+ }),
32
+ };
33
+ }
34
+ connectedCallback() {
35
+ super.connectedCallback();
36
+ this._loadText();
37
+ // Listen for language changes
38
+ window.addEventListener("language-changed", this.boundHandlers.languageChanged);
39
+ // Also listen for translations loaded event
40
+ window.addEventListener("translations-loaded", this.boundHandlers.languageChanged);
41
+ // Listen for language changes via events instead of signals
42
+ // The currentLanguage signal changes will trigger the language-changed event
43
+ }
44
+ disconnectedCallback() {
45
+ super.disconnectedCallback();
46
+ window.removeEventListener("language-changed", this.boundHandlers.languageChanged);
47
+ window.removeEventListener("translations-loaded", this.boundHandlers.languageChanged);
48
+ }
49
+ updated(changedProperties) {
50
+ super.updated(changedProperties);
51
+ if (changedProperties.has("key") || changedProperties.has("defaultValue")) {
52
+ this._loadText();
53
+ }
54
+ }
55
+ _loadText() {
56
+ if (!this.key) {
57
+ this._text = this.defaultValue || this.fallback || "";
58
+ return;
59
+ }
60
+ try {
61
+ const text = getText(this.key);
62
+ this._text = text || this.defaultValue || this.fallback || this.key;
63
+ }
64
+ catch (error) {
65
+ console.error("Error loading text for key:", this.key, error);
66
+ this._text = this.defaultValue || this.fallback || this.key;
67
+ }
68
+ this.requestUpdate();
69
+ }
70
+ render() {
71
+ return html `<span>${this._text || this.defaultValue || this.key}</span>`;
72
+ }
73
+ }
74
+ Text.styles = css `
75
+ :host {
76
+ display: inline;
77
+ }
78
+
79
+ .loading {
80
+ opacity: 0.6;
81
+ }
82
+ `;
83
+ customElements.define("ds-text", Text);
@@ -63,7 +63,7 @@ export class Home extends LitElement {
63
63
  @click="${this._navigateHome}"
64
64
  @keydown="${this._onKeyDown}"
65
65
  >
66
- <text-v1 key="home"></text-v1>
66
+ <ds-text key="home"></ds-text>
67
67
  </div>
68
68
  `;
69
69
  }
@@ -107,7 +107,7 @@ Home.styles = css `
107
107
  }
108
108
 
109
109
  /* Inner text spacing without affecting the 80px outer width */
110
- .home > text-v1 {
110
+ .home > ds-text {
111
111
  padding: 0 calc(var(--1) * 0.15 * var(--scaling-factor));
112
112
  box-sizing: border-box;
113
113
  height: 100%;
@@ -33,14 +33,14 @@ export class DoubleNav extends LitElement {
33
33
  ? html `
34
34
  <a href="${this.previous}" class="nav-previous">
35
35
  <icon-v1 type="left"></icon-v1>
36
- <text-v1>${this.previousText || "Previous"}</text-v1>
36
+ <ds-text>${this.previousText || "Previous"}</ds-text>
37
37
  </a>
38
38
  `
39
39
  : html `<div></div>`}
40
40
  ${this.next
41
41
  ? html `
42
42
  <a href="${this.next}" class="nav-next">
43
- <text-v1>${this.nextText || "Next"}</text-v1>
43
+ <ds-text>${this.nextText || "Next"}</ds-text>
44
44
  <icon-v1 type="right"></icon-v1>
45
45
  </a>
46
46
  `
@@ -22,7 +22,7 @@ export class SingleNav extends LitElement {
22
22
  const href = this.to || navConfig.href;
23
23
  return html `
24
24
  <a href="${href}">
25
- <text-v1 key="${navConfig.key}"></text-v1>
25
+ <ds-text key="${navConfig.key}"></ds-text>
26
26
  <icon-v1 type="right"></icon-v1>
27
27
  </a>
28
28
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"ds-grid.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-grid.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,UAAU;;;;MAEf;IAEF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,MAAM,0BAqCX;IAEF,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
1
+ {"version":3,"file":"ds-grid.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-grid.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,UAAU;;;;MAEf;IAEF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,MAAM,0BAiDX;IAEF,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
@@ -14,7 +14,7 @@ Grid.styles = css `
14
14
  margin-top: 0.5px !important;
15
15
  margin-left: 0.5px !important;
16
16
  display: grid;
17
- width: 100%;
17
+ width: 1440px;
18
18
  height: 100%;
19
19
  grid-template-columns: repeat(auto-fill, 19px);
20
20
  grid-template-rows: repeat(auto-fill, 19px);
@@ -24,7 +24,7 @@ Grid.styles = css `
24
24
  column-rule: 1px solid
25
25
  light-dark(rgba(0, 0, 0, 0.03), rgba(238, 238, 238, 0.022));
26
26
  outline: 1px solid light-dark(rgba(0, 0, 0, 0.15), #100101e7);
27
- position: absolute;
27
+ position: fixed;
28
28
  top: 0;
29
29
  left: 50%;
30
30
  transform: translateX(-50%);
@@ -32,6 +32,17 @@ Grid.styles = css `
32
32
  z-index: 300;
33
33
  }
34
34
 
35
+ /* Mobile styles - 15 columns with smaller gap */
36
+ @media (max-width: 768px) {
37
+ :host {
38
+ width: 100%;
39
+ max-width: 375px;
40
+ grid-template-columns: repeat(15, 1fr);
41
+ grid-template-rows: repeat(auto-fill, 20px);
42
+ gap: 0.5px;
43
+ }
44
+ }
45
+
35
46
  :host([align="left"]) {
36
47
  left: 0;
37
48
  transform: none;
@@ -43,8 +54,9 @@ Grid.styles = css `
43
54
  }
44
55
 
45
56
  :host([align="right"]) {
46
- left: 100%;
47
- transform: translateX(-100%);
57
+ left: auto;
58
+ right: 0;
59
+ transform: none;
48
60
  }
49
61
  `;
50
62
  customElements.define("ds-grid", Grid);
@@ -1 +1 @@
1
- {"version":3,"file":"ds-layout.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-layout.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,MAAO,SAAQ,UAAU;IACpC,MAAM,CAAC,UAAU;;;;;;;;;;MAIf;IAEF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,MAAM,CAAC,MAAM,0BAmKX;IAEF,MAAM;CA6BP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,MAAM,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"ds-layout.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-layout.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,MAAO,SAAQ,UAAU;IACpC,MAAM,CAAC,UAAU;;;;;;;;;;MAIf;IAEF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,MAAM,CAAC,MAAM,0BAgJX;IAEF,MAAM;CA6BP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,MAAM,CAAC;KACrB;CACF"}
@@ -54,7 +54,7 @@ Layout.styles = css `
54
54
  ". footer ."
55
55
  ". . .";
56
56
  min-height: 600px;
57
- background-color: rgba(235, 231, 231, 0.44);
57
+ background-color: rgba(165, 165, 165, 0.03);
58
58
  position: relative;
59
59
  width: 100%;
60
60
  max-width: 640px;
@@ -90,10 +90,6 @@ Layout.styles = css `
90
90
  justify-self: end;
91
91
  }
92
92
 
93
- :host([mode="debug"]) {
94
- background-color: rgba(200, 114, 114, 0.1);
95
- }
96
-
97
93
  .debug-overlay {
98
94
  position: absolute;
99
95
  margin-left: -1px;
@@ -142,7 +138,6 @@ Layout.styles = css `
142
138
  font-size: 10px;
143
139
  font-weight: var(--type-weight-default);
144
140
  font-family: var(--typeface);
145
- background-color: var(--slate);
146
141
  color: var(--black);
147
142
  border: 1px solid red;
148
143
  opacity: 1;
@@ -150,53 +145,39 @@ Layout.styles = css `
150
145
 
151
146
  .debug-square {
152
147
  grid-area: square;
153
- background-color: rgba(255, 0, 0, 0.2);
154
148
  }
155
149
 
156
150
  .debug-title {
157
151
  grid-area: title;
158
- background-color: rgba(0, 255, 0, 0.2);
159
152
  }
160
153
 
161
154
  .debug-header {
162
155
  grid-area: header;
163
- background-color: rgba(0, 0, 255, 0.2);
164
156
  border-color: #0000ff;
165
157
  }
166
158
 
167
159
  .debug-projects {
168
160
  grid-area: projects;
169
- background-color: rgba(255, 255, 0, 0.2);
170
161
  border-color: #ffff00;
171
162
  }
172
163
 
173
164
  .debug-bio {
174
165
  grid-area: bio;
175
- background-color: rgba(255, 0, 255, 0.2);
176
166
  border-color: #ff00ff;
177
167
  }
178
168
 
179
169
  .debug-nav {
180
170
  grid-area: nav;
181
- background-color: rgba(0, 255, 255, 0.2);
182
171
  border-color: #00ffff;
183
172
  }
184
173
 
185
174
  .debug-footer {
186
175
  grid-area: footer;
187
- background-color: rgba(255, 165, 0, 0.2);
188
176
  border-color: #ffa500;
189
177
  }
190
178
 
191
- .debug-header {
192
- grid-area: header;
193
- background-color: rgba(0, 0, 255, 0.2);
194
- border-color: #0000ff;
195
- }
196
-
197
179
  .debug-content {
198
180
  grid-area: content;
199
- background-color: rgba(21, 169, 21, 0.57);
200
181
  border-color: rgba(71, 231, 71, 0.63);
201
182
  }
202
183
  `;
@@ -1,3 +1,67 @@
1
+ // dist/0-face/2025-04-23-device.js
2
+ function detectMobileDevice() {
3
+ if (typeof navigator === "undefined" || typeof window === "undefined") {
4
+ return false;
5
+ }
6
+ const nav = navigator;
7
+ const win = window;
8
+ const ua = nav && (nav.userAgent || nav.vendor) || win && win.opera || "";
9
+ const uaMatchesMobile = /Mobile|Android|iP(ad|hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)|Windows Phone|Phone|Tablet/i.test(ua);
10
+ const touchPoints = nav && nav.maxTouchPoints || 0;
11
+ const isTouchCapable = touchPoints > 1;
12
+ const narrowViewport = win ? Math.min(win.innerWidth || 0, win.innerHeight || 0) <= 820 : false;
13
+ return uaMatchesMobile || isTouchCapable && narrowViewport;
14
+ }
15
+ function getDeviceInfo() {
16
+ const isMobile = detectMobileDevice();
17
+ const nav = navigator;
18
+ const win = window;
19
+ const touchPoints = nav && nav.maxTouchPoints || 0;
20
+ const isTouchCapable = touchPoints > 1;
21
+ const screenWidth = win?.innerWidth || 0;
22
+ const screenHeight = win?.innerHeight || 0;
23
+ const isTablet = isMobile && Math.min(screenWidth, screenHeight) >= 600;
24
+ return {
25
+ isMobile,
26
+ isTablet,
27
+ isDesktop: !isMobile,
28
+ isTouchCapable,
29
+ deviceType: isMobile ? isTablet ? "tablet" : "mobile" : "desktop",
30
+ userAgent: nav && (nav.userAgent || nav.vendor) || "",
31
+ screenWidth,
32
+ screenHeight
33
+ };
34
+ }
35
+ function initDeviceDetection() {
36
+ const deviceInfo = getDeviceInfo();
37
+ if (deviceInfo.isMobile) {
38
+ console.log(`[DS one] Mobile device detected - ${deviceInfo.deviceType} (${deviceInfo.screenWidth}x${deviceInfo.screenHeight})`);
39
+ } else {
40
+ console.log(`[DS one] Desktop device detected (${deviceInfo.screenWidth}x${deviceInfo.screenHeight})`);
41
+ }
42
+ if (typeof window !== "undefined" && window.DS_ONE_DEBUG) {
43
+ console.log("[DS one] Device Info:", {
44
+ type: deviceInfo.deviceType,
45
+ isMobile: deviceInfo.isMobile,
46
+ isTablet: deviceInfo.isTablet,
47
+ isDesktop: deviceInfo.isDesktop,
48
+ isTouchCapable: deviceInfo.isTouchCapable,
49
+ viewport: `${deviceInfo.screenWidth}x${deviceInfo.screenHeight}`,
50
+ userAgent: deviceInfo.userAgent
51
+ });
52
+ }
53
+ return deviceInfo;
54
+ }
55
+ if (typeof window !== "undefined") {
56
+ if (document.readyState === "loading") {
57
+ document.addEventListener("DOMContentLoaded", () => {
58
+ initDeviceDetection();
59
+ });
60
+ } else {
61
+ initDeviceDetection();
62
+ }
63
+ }
64
+
1
65
  // dist/utils/cdn-loader.js
2
66
  var loadAttempted = false;
3
67
  var DEFAULT_TRANSLATION_FILES = [
@@ -69,11 +133,14 @@ function validateTranslationMap(candidate) {
69
133
  }
70
134
  async function fetchTranslationFile(source) {
71
135
  try {
136
+ console.log(`[DS one] Attempting to fetch translations from: ${source}`);
72
137
  const response = await fetch(source);
73
138
  if (!response.ok) {
139
+ console.log(`[DS one] Failed to fetch ${source} (${response.status})`);
74
140
  return null;
75
141
  }
76
142
  const translations = await response.json();
143
+ console.log(`[DS one] Successfully fetched JSON from ${source}`);
77
144
  if (!validateTranslationMap(translations)) {
78
145
  console.warn(`[DS one] Invalid translation format in ${source}. Expected object with language codes as keys.`);
79
146
  return null;
@@ -83,9 +150,11 @@ async function fetchTranslationFile(source) {
83
150
  console.warn(`[DS one] No languages found in ${source}`);
84
151
  return null;
85
152
  }
153
+ console.log(`[DS one] Valid translations found: ${languages.join(", ")}`);
86
154
  return translations;
87
155
  } catch (error) {
88
156
  if (error instanceof TypeError && error.message.includes("Failed to fetch")) {
157
+ console.log(`[DS one] Network error fetching ${source}`);
89
158
  return null;
90
159
  }
91
160
  console.error(`[DS one] Error loading external translations from ${source}:`, error);
@@ -681,7 +750,47 @@ o4?.({ LitElement: i4 });
681
750
  (s3.litElementVersions ?? (s3.litElementVersions = [])).push("4.2.1");
682
751
 
683
752
  // dist/utils/keys.json
684
- var keys_default = {};
753
+ var keys_default = {
754
+ en: {
755
+ language: "Language",
756
+ theme: "Theme",
757
+ home: "Home",
758
+ about: "About",
759
+ contact: "Contact",
760
+ welcome: "Welcome",
761
+ description: "Description",
762
+ learnMore: "Learn More",
763
+ copyright: "\xA9 2025",
764
+ siteTitle: "Site Title",
765
+ downloadCV: "Download CV"
766
+ },
767
+ da: {
768
+ language: "Sprog",
769
+ theme: "Tema",
770
+ home: "Hjem",
771
+ about: "Om",
772
+ contact: "Kontakt",
773
+ welcome: "Velkommen",
774
+ description: "Beskrivelse",
775
+ learnMore: "L\xE6r Mere",
776
+ copyright: "\xA9 2025",
777
+ siteTitle: "Site Titel",
778
+ downloadCV: "Download CV"
779
+ },
780
+ ja: {
781
+ language: "\u8A00\u8A9E",
782
+ theme: "\u30C6\u30FC\u30DE",
783
+ home: "\u30DB\u30FC\u30E0",
784
+ about: "\u306B\u3064\u3044\u3066",
785
+ contact: "\u304A\u554F\u3044\u5408\u308F\u305B",
786
+ welcome: "\u3088\u3046\u3053\u305D",
787
+ description: "\u8AAC\u660E",
788
+ learnMore: "\u8A73\u7D30\u3092\u898B\u308B",
789
+ copyright: "\xA9 2025",
790
+ siteTitle: "\u30B5\u30A4\u30C8\u30BF\u30A4\u30C8\u30EB",
791
+ downloadCV: "CV\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9"
792
+ }
793
+ };
685
794
 
686
795
  // dist/utils/language.js
687
796
  var LANGUAGE_PRIORITY_ORDER = [
@@ -1169,7 +1278,7 @@ Button.styles = i`
1169
1278
  `;
1170
1279
  customElements.define("ds-button", Button);
1171
1280
 
1172
- // dist/2-core/text-v1.js
1281
+ // dist/2-core/ds-text.js
1173
1282
  var Text = class extends i4 {
1174
1283
  static get properties() {
1175
1284
  return {
@@ -1188,7 +1297,7 @@ var Text = class extends i4 {
1188
1297
  this._text = "";
1189
1298
  this.boundHandlers = {
1190
1299
  languageChanged: (() => {
1191
- console.log("Language changed event received in text-v1");
1300
+ console.log("Language changed event received in ds-text");
1192
1301
  this._loadText();
1193
1302
  })
1194
1303
  };
@@ -1237,7 +1346,7 @@ Text.styles = i`
1237
1346
  opacity: 0.6;
1238
1347
  }
1239
1348
  `;
1240
- customElements.define("text-v1", Text);
1349
+ customElements.define("ds-text", Text);
1241
1350
 
1242
1351
  // node_modules/lit-html/directive.js
1243
1352
  var t3 = { ATTRIBUTE: 1, CHILD: 2, PROPERTY: 3, BOOLEAN_ATTRIBUTE: 4, EVENT: 5, ELEMENT: 6 };
@@ -3283,7 +3392,7 @@ var Home = class extends i4 {
3283
3392
  @click="${this._navigateHome}"
3284
3393
  @keydown="${this._onKeyDown}"
3285
3394
  >
3286
- <text-v1 key="home"></text-v1>
3395
+ <ds-text key="home"></ds-text>
3287
3396
  </div>
3288
3397
  `;
3289
3398
  }
@@ -3328,7 +3437,7 @@ Home.styles = i`
3328
3437
  }
3329
3438
 
3330
3439
  /* Inner text spacing without affecting the 80px outer width */
3331
- .home > text-v1 {
3440
+ .home > ds-text {
3332
3441
  padding: 0 calc(var(--1) * 0.15 * var(--scaling-factor));
3333
3442
  box-sizing: border-box;
3334
3443
  height: 100%;
@@ -4370,7 +4479,7 @@ var SingleNav = class extends i4 {
4370
4479
  const href = this.to || navConfig.href;
4371
4480
  return x`
4372
4481
  <a href="${href}">
4373
- <text-v1 key="${navConfig.key}"></text-v1>
4482
+ <ds-text key="${navConfig.key}"></ds-text>
4374
4483
  <icon-v1 type="right"></icon-v1>
4375
4484
  </a>
4376
4485
  `;
@@ -4433,12 +4542,12 @@ var DoubleNav = class extends i4 {
4433
4542
  ${this.previous ? x`
4434
4543
  <a href="${this.previous}" class="nav-previous">
4435
4544
  <icon-v1 type="left"></icon-v1>
4436
- <text-v1>${this.previousText || "Previous"}</text-v1>
4545
+ <ds-text>${this.previousText || "Previous"}</ds-text>
4437
4546
  </a>
4438
4547
  ` : x`<div></div>`}
4439
4548
  ${this.next ? x`
4440
4549
  <a href="${this.next}" class="nav-next">
4441
- <text-v1>${this.nextText || "Next"}</text-v1>
4550
+ <ds-text>${this.nextText || "Next"}</ds-text>
4442
4551
  <icon-v1 type="right"></icon-v1>
4443
4552
  </a>
4444
4553
  ` : x`<div></div>`}
@@ -4621,7 +4730,7 @@ Grid.styles = i`
4621
4730
  margin-top: 0.5px !important;
4622
4731
  margin-left: 0.5px !important;
4623
4732
  display: grid;
4624
- width: 100%;
4733
+ width: 1440px;
4625
4734
  height: 100%;
4626
4735
  grid-template-columns: repeat(auto-fill, 19px);
4627
4736
  grid-template-rows: repeat(auto-fill, 19px);
@@ -4631,7 +4740,7 @@ Grid.styles = i`
4631
4740
  column-rule: 1px solid
4632
4741
  light-dark(rgba(0, 0, 0, 0.03), rgba(238, 238, 238, 0.022));
4633
4742
  outline: 1px solid light-dark(rgba(0, 0, 0, 0.15), #100101e7);
4634
- position: absolute;
4743
+ position: fixed;
4635
4744
  top: 0;
4636
4745
  left: 50%;
4637
4746
  transform: translateX(-50%);
@@ -4639,6 +4748,17 @@ Grid.styles = i`
4639
4748
  z-index: 300;
4640
4749
  }
4641
4750
 
4751
+ /* Mobile styles - 15 columns with smaller gap */
4752
+ @media (max-width: 768px) {
4753
+ :host {
4754
+ width: 100%;
4755
+ max-width: 375px;
4756
+ grid-template-columns: repeat(15, 1fr);
4757
+ grid-template-rows: repeat(auto-fill, 20px);
4758
+ gap: 0.5px;
4759
+ }
4760
+ }
4761
+
4642
4762
  :host([align="left"]) {
4643
4763
  left: 0;
4644
4764
  transform: none;
@@ -4650,8 +4770,9 @@ Grid.styles = i`
4650
4770
  }
4651
4771
 
4652
4772
  :host([align="right"]) {
4653
- left: 100%;
4654
- transform: translateX(-100%);
4773
+ left: auto;
4774
+ right: 0;
4775
+ transform: none;
4655
4776
  }
4656
4777
  `;
4657
4778
  customElements.define("ds-grid", Grid);
@@ -4706,7 +4827,7 @@ Layout.styles = i`
4706
4827
  ". footer ."
4707
4828
  ". . .";
4708
4829
  min-height: 600px;
4709
- background-color: rgba(235, 231, 231, 0.44);
4830
+ background-color: rgba(165, 165, 165, 0.03);
4710
4831
  position: relative;
4711
4832
  width: 100%;
4712
4833
  max-width: 640px;
@@ -4742,10 +4863,6 @@ Layout.styles = i`
4742
4863
  justify-self: end;
4743
4864
  }
4744
4865
 
4745
- :host([mode="debug"]) {
4746
- background-color: rgba(200, 114, 114, 0.1);
4747
- }
4748
-
4749
4866
  .debug-overlay {
4750
4867
  position: absolute;
4751
4868
  margin-left: -1px;
@@ -4794,7 +4911,6 @@ Layout.styles = i`
4794
4911
  font-size: 10px;
4795
4912
  font-weight: var(--type-weight-default);
4796
4913
  font-family: var(--typeface);
4797
- background-color: var(--slate);
4798
4914
  color: var(--black);
4799
4915
  border: 1px solid red;
4800
4916
  opacity: 1;
@@ -4802,53 +4918,39 @@ Layout.styles = i`
4802
4918
 
4803
4919
  .debug-square {
4804
4920
  grid-area: square;
4805
- background-color: rgba(255, 0, 0, 0.2);
4806
4921
  }
4807
4922
 
4808
4923
  .debug-title {
4809
4924
  grid-area: title;
4810
- background-color: rgba(0, 255, 0, 0.2);
4811
4925
  }
4812
4926
 
4813
4927
  .debug-header {
4814
4928
  grid-area: header;
4815
- background-color: rgba(0, 0, 255, 0.2);
4816
4929
  border-color: #0000ff;
4817
4930
  }
4818
4931
 
4819
4932
  .debug-projects {
4820
4933
  grid-area: projects;
4821
- background-color: rgba(255, 255, 0, 0.2);
4822
4934
  border-color: #ffff00;
4823
4935
  }
4824
4936
 
4825
4937
  .debug-bio {
4826
4938
  grid-area: bio;
4827
- background-color: rgba(255, 0, 255, 0.2);
4828
4939
  border-color: #ff00ff;
4829
4940
  }
4830
4941
 
4831
4942
  .debug-nav {
4832
4943
  grid-area: nav;
4833
- background-color: rgba(0, 255, 255, 0.2);
4834
4944
  border-color: #00ffff;
4835
4945
  }
4836
4946
 
4837
4947
  .debug-footer {
4838
4948
  grid-area: footer;
4839
- background-color: rgba(255, 165, 0, 0.2);
4840
4949
  border-color: #ffa500;
4841
4950
  }
4842
4951
 
4843
- .debug-header {
4844
- grid-area: header;
4845
- background-color: rgba(0, 0, 255, 0.2);
4846
- border-color: #0000ff;
4847
- }
4848
-
4849
4952
  .debug-content {
4850
4953
  grid-area: content;
4851
- background-color: rgba(21, 169, 21, 0.57);
4852
4954
  border-color: rgba(71, 231, 71, 0.63);
4853
4955
  }
4854
4956
  `;
@@ -4987,9 +5089,11 @@ export {
4987
5089
  clearScrollPosition,
4988
5090
  currentLanguage,
4989
5091
  currentTheme,
5092
+ detectMobileDevice,
4990
5093
  getAvailableLanguages,
4991
5094
  getAvailableLanguagesSync,
4992
5095
  getBrowserLanguage,
5096
+ getDeviceInfo,
4993
5097
  getLanguageDisplayName,
4994
5098
  getNotionText,
4995
5099
  getPriceLabel,
@@ -4997,6 +5101,7 @@ export {
4997
5101
  getText,
4998
5102
  getViewMode,
4999
5103
  hasTranslation,
5104
+ initDeviceDetection,
5000
5105
  initScrollManagement,
5001
5106
  loadTranslations,
5002
5107
  restoreScrollPosition,