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.
- package/DS1/0-face/2025-04-23-device.ts +117 -1
- package/DS1/1-root/fonts/GT-America-Compressed-Regular.woff2 +0 -0
- package/DS1/1-root/one.css +10 -1
- package/DS1/2-core/{text-v1.ts → ds-text.ts} +4 -4
- package/DS1/2-core/home-v1.ts +2 -2
- package/DS1/3-unit/doublenav-v1.ts +2 -2
- package/DS1/3-unit/singlenav-v1.ts +1 -1
- package/DS1/4-page/ds-grid.ts +16 -4
- package/DS1/4-page/ds-layout.ts +1 -20
- package/DS1/index.ts +7 -1
- package/DS1/utils/cdn-loader.ts +5 -0
- package/DS1/utils/keys.json +41 -1
- package/README.md +5 -5
- package/dist/0-face/2025-04-23-device.d.ts +24 -0
- package/dist/0-face/2025-04-23-device.d.ts.map +1 -1
- package/dist/0-face/2025-04-23-device.js +84 -1
- package/dist/2-core/ds-text.d.ts +48 -0
- package/dist/2-core/ds-text.d.ts.map +1 -0
- package/dist/2-core/ds-text.js +83 -0
- package/dist/2-core/home-v1.js +2 -2
- package/dist/3-unit/doublenav-v1.js +2 -2
- package/dist/3-unit/singlenav-v1.js +1 -1
- package/dist/4-page/ds-grid.d.ts.map +1 -1
- package/dist/4-page/ds-grid.js +16 -4
- package/dist/4-page/ds-layout.d.ts.map +1 -1
- package/dist/4-page/ds-layout.js +1 -20
- package/dist/ds-one.bundle.js +138 -33
- package/dist/ds-one.bundle.js.map +3 -3
- package/dist/ds-one.bundle.min.js +54 -61
- package/dist/ds-one.bundle.min.js.map +4 -4
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/utils/cdn-loader.d.ts.map +1 -1
- package/dist/utils/cdn-loader.js +5 -0
- package/dist/utils/keys.json +41 -1
- 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);
|
package/dist/2-core/home-v1.js
CHANGED
|
@@ -63,7 +63,7 @@ export class Home extends LitElement {
|
|
|
63
63
|
@click="${this._navigateHome}"
|
|
64
64
|
@keydown="${this._onKeyDown}"
|
|
65
65
|
>
|
|
66
|
-
<text
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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"}
|
package/dist/4-page/ds-grid.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
47
|
-
|
|
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,
|
|
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"}
|
package/dist/4-page/ds-layout.js
CHANGED
|
@@ -54,7 +54,7 @@ Layout.styles = css `
|
|
|
54
54
|
". footer ."
|
|
55
55
|
". . .";
|
|
56
56
|
min-height: 600px;
|
|
57
|
-
background-color: rgba(
|
|
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
|
`;
|
package/dist/ds-one.bundle.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
4654
|
-
|
|
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(
|
|
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,
|