ds-one 0.2.0-alpha.2 → 0.2.5-alpha.1
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/{utils/language.ts → 0-face/i18n.ts} +197 -2
- package/DS1/0-face/preferences.ts +23 -0
- package/DS1/0-face/pricing.ts +57 -0
- package/DS1/1-root/one.css +1 -1
- package/DS1/2-core/ds-button.ts +1 -1
- package/DS1/2-core/ds-cycle.ts +17 -18
- package/DS1/2-core/{ds-year.ts → ds-date.ts} +4 -4
- package/DS1/2-core/ds-input.ts +1 -0
- package/DS1/2-core/ds-text.ts +1 -1
- package/DS1/2-core/ds-tooltip.ts +4 -3
- package/DS1/3-unit/doublenav-v1.ts +105 -0
- package/DS1/3-unit/{ds-doublenav.ts → ds-portfolio-doublenav.ts} +4 -5
- package/DS1/3-unit/ds-portfolio-panel.ts +27 -0
- package/DS1/3-unit/ds-portfolio-singlenav.ts +79 -0
- package/DS1/3-unit/list-v1.ts +24 -0
- package/DS1/3-unit/{ds-panel.ts → panel-v1.ts} +2 -3
- package/DS1/3-unit/row-v1.ts +52 -0
- package/DS1/3-unit/{ds-singlenav.ts → singlenav-v1.ts} +4 -5
- package/DS1/4-page/ds-grid.ts +1 -1
- package/DS1/index.ts +39 -37
- package/README.md +3 -3
- package/dist/0-face/{2025-04-23-device.d.ts → device.d.ts} +1 -1
- package/dist/0-face/device.d.ts.map +1 -0
- package/dist/{utils/language.d.ts → 0-face/i18n.d.ts} +1 -1
- package/dist/0-face/i18n.d.ts.map +1 -0
- package/dist/{utils/language.js → 0-face/i18n.js} +141 -2
- package/dist/0-face/preferences.d.ts +9 -0
- package/dist/0-face/preferences.d.ts.map +1 -0
- package/dist/0-face/preferences.js +14 -0
- package/dist/0-face/pricing.d.ts +15 -0
- package/dist/0-face/pricing.d.ts.map +1 -0
- package/dist/0-face/pricing.js +46 -0
- package/dist/0-face/theme.d.ts.map +1 -0
- package/dist/2-core/ds-button.js +1 -1
- package/dist/2-core/ds-cycle.js +15 -15
- package/dist/2-core/{ds-year.d.ts → ds-date.d.ts} +4 -4
- package/dist/2-core/ds-date.d.ts.map +1 -0
- package/dist/2-core/{ds-year.js → ds-date.js} +4 -4
- package/dist/2-core/ds-input.d.ts +1 -0
- package/dist/2-core/ds-input.d.ts.map +1 -0
- package/dist/2-core/ds-input.js +1 -0
- package/dist/2-core/ds-text.js +1 -1
- package/dist/2-core/ds-tooltip.d.ts.map +1 -1
- package/dist/2-core/ds-tooltip.js +4 -2
- package/dist/3-unit/{ds-doublenav.d.ts → ds-portfolio-doublenav.d.ts} +4 -4
- package/dist/3-unit/ds-portfolio-doublenav.d.ts.map +1 -0
- package/dist/3-unit/{ds-doublenav.js → ds-portfolio-doublenav.js} +4 -4
- package/dist/3-unit/{ds-panel.d.ts → ds-portfolio-panel.d.ts} +3 -3
- package/dist/3-unit/ds-portfolio-panel.d.ts.map +1 -0
- package/dist/3-unit/{ds-panel.js → ds-portfolio-panel.js} +3 -3
- package/dist/3-unit/{ds-singlenav.d.ts → ds-portfolio-singlenav.d.ts} +4 -4
- package/dist/3-unit/ds-portfolio-singlenav.d.ts.map +1 -0
- package/dist/3-unit/{ds-singlenav.js → ds-portfolio-singlenav.js} +4 -4
- package/dist/4-page/ds-grid.js +1 -1
- package/dist/ds-one.bundle.js +2087 -3806
- package/dist/ds-one.bundle.js.map +4 -4
- package/dist/ds-one.bundle.min.js +74 -740
- package/dist/ds-one.bundle.min.js.map +4 -4
- package/dist/index.d.ts +16 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -34
- package/package.json +2 -2
- package/DS1/0-face/2025-04-23-language.ts +0 -4
- package/DS1/2-core/ds-article.ts +0 -454
- package/DS1/2-core/ds-attributes.ts +0 -155
- package/DS1/2-core/ds-downloadcv.ts +0 -146
- package/DS1/2-core/ds-header.ts +0 -82
- package/DS1/2-core/ds-home.ts +0 -168
- package/DS1/2-core/ds-link.ts +0 -121
- package/DS1/2-core/ds-markdown.ts +0 -252
- package/DS1/2-core/ds-price.ts +0 -108
- package/DS1/2-core/ds-squarecircle.ts +0 -155
- package/DS1/2-core/ds-title.ts +0 -139
- package/DS1/2-core/ds-viewtoggle.ts +0 -83
- package/DS1/utils/cdn-loader.ts +0 -232
- package/DS1/utils/keys.json +0 -41
- package/DS1/utils/pricing.ts +0 -24
- package/DS1/utils/scroll.ts +0 -184
- package/DS1/utils/settings.ts +0 -23
- package/DS1/utils/viewMode.ts +0 -55
- package/dist/0-face/2025-04-23-device.d.ts.map +0 -1
- package/dist/0-face/2025-04-23-language.d.ts +0 -1
- package/dist/0-face/2025-04-23-language.d.ts.map +0 -1
- package/dist/0-face/2025-04-23-language.js +0 -3
- package/dist/2-core/article-v1.d.ts +0 -129
- package/dist/2-core/article-v1.d.ts.map +0 -1
- package/dist/2-core/article-v1.js +0 -361
- package/dist/2-core/attributes-v1.d.ts +0 -47
- package/dist/2-core/attributes-v1.d.ts.map +0 -1
- package/dist/2-core/attributes-v1.js +0 -128
- package/dist/2-core/cycle-v1.d.ts +0 -66
- package/dist/2-core/cycle-v1.d.ts.map +0 -1
- package/dist/2-core/cycle-v1.js +0 -586
- package/dist/2-core/downloadcv-v1.d.ts +0 -58
- package/dist/2-core/downloadcv-v1.d.ts.map +0 -1
- package/dist/2-core/downloadcv-v1.js +0 -119
- package/dist/2-core/ds-article.d.ts +0 -129
- package/dist/2-core/ds-article.d.ts.map +0 -1
- package/dist/2-core/ds-article.js +0 -361
- package/dist/2-core/ds-attributes.d.ts +0 -47
- package/dist/2-core/ds-attributes.d.ts.map +0 -1
- package/dist/2-core/ds-attributes.js +0 -128
- package/dist/2-core/ds-button.figma.d.ts +0 -2
- package/dist/2-core/ds-button.figma.d.ts.map +0 -1
- package/dist/2-core/ds-button.figma.js +0 -6
- package/dist/2-core/ds-downloadcv.d.ts +0 -58
- package/dist/2-core/ds-downloadcv.d.ts.map +0 -1
- package/dist/2-core/ds-downloadcv.js +0 -119
- package/dist/2-core/ds-header.d.ts +0 -28
- package/dist/2-core/ds-header.d.ts.map +0 -1
- package/dist/2-core/ds-header.js +0 -66
- package/dist/2-core/ds-home.d.ts +0 -26
- package/dist/2-core/ds-home.d.ts.map +0 -1
- package/dist/2-core/ds-home.js +0 -148
- package/dist/2-core/ds-link.d.ts +0 -35
- package/dist/2-core/ds-link.d.ts.map +0 -1
- package/dist/2-core/ds-link.js +0 -85
- package/dist/2-core/ds-markdown.d.ts +0 -7
- package/dist/2-core/ds-markdown.d.ts.map +0 -1
- package/dist/2-core/ds-markdown.js +0 -240
- package/dist/2-core/ds-price.d.ts +0 -46
- package/dist/2-core/ds-price.d.ts.map +0 -1
- package/dist/2-core/ds-price.js +0 -72
- package/dist/2-core/ds-squarecircle.d.ts +0 -50
- package/dist/2-core/ds-squarecircle.d.ts.map +0 -1
- package/dist/2-core/ds-squarecircle.js +0 -133
- package/dist/2-core/ds-title.d.ts +0 -50
- package/dist/2-core/ds-title.d.ts.map +0 -1
- package/dist/2-core/ds-title.js +0 -103
- package/dist/2-core/ds-viewtoggle.d.ts +0 -27
- package/dist/2-core/ds-viewtoggle.d.ts.map +0 -1
- package/dist/2-core/ds-viewtoggle.js +0 -49
- package/dist/2-core/ds-year.d.ts.map +0 -1
- package/dist/2-core/header-v1.d.ts +0 -28
- package/dist/2-core/header-v1.d.ts.map +0 -1
- package/dist/2-core/header-v1.js +0 -66
- package/dist/2-core/home-v1.d.ts +0 -26
- package/dist/2-core/home-v1.d.ts.map +0 -1
- package/dist/2-core/home-v1.js +0 -148
- package/dist/2-core/icon-v1.d.ts +0 -28
- package/dist/2-core/icon-v1.d.ts.map +0 -1
- package/dist/2-core/icon-v1.js +0 -297
- package/dist/2-core/link-v1.d.ts +0 -35
- package/dist/2-core/link-v1.d.ts.map +0 -1
- package/dist/2-core/link-v1.js +0 -85
- package/dist/2-core/markdown-v1.d.ts +0 -7
- package/dist/2-core/markdown-v1.d.ts.map +0 -1
- package/dist/2-core/markdown-v1.js +0 -240
- package/dist/2-core/price-v1.d.ts +0 -46
- package/dist/2-core/price-v1.d.ts.map +0 -1
- package/dist/2-core/price-v1.js +0 -72
- package/dist/2-core/squarecircle-v1.d.ts +0 -50
- package/dist/2-core/squarecircle-v1.d.ts.map +0 -1
- package/dist/2-core/squarecircle-v1.js +0 -133
- package/dist/2-core/text-v1.d.ts +0 -48
- package/dist/2-core/text-v1.d.ts.map +0 -1
- package/dist/2-core/text-v1.js +0 -83
- package/dist/2-core/title-v1.d.ts +0 -50
- package/dist/2-core/title-v1.d.ts.map +0 -1
- package/dist/2-core/title-v1.js +0 -103
- package/dist/2-core/tooltip-v1.d.ts +0 -39
- package/dist/2-core/tooltip-v1.d.ts.map +0 -1
- package/dist/2-core/tooltip-v1.js +0 -145
- package/dist/2-core/viewtoggle-v1.d.ts +0 -27
- package/dist/2-core/viewtoggle-v1.d.ts.map +0 -1
- package/dist/2-core/viewtoggle-v1.js +0 -49
- package/dist/2-core/year-v1.d.ts +0 -16
- package/dist/2-core/year-v1.d.ts.map +0 -1
- package/dist/2-core/year-v1.js +0 -21
- package/dist/3-unit/ds-doublenav.d.ts.map +0 -1
- package/dist/3-unit/ds-panel.d.ts.map +0 -1
- package/dist/3-unit/ds-singlenav.d.ts.map +0 -1
- package/dist/utils/cdn-loader.d.ts +0 -19
- package/dist/utils/cdn-loader.d.ts.map +0 -1
- package/dist/utils/cdn-loader.js +0 -160
- package/dist/utils/keys.json +0 -41
- package/dist/utils/language.d.ts.map +0 -1
- package/dist/utils/pricing.d.ts +0 -8
- package/dist/utils/pricing.d.ts.map +0 -1
- package/dist/utils/pricing.js +0 -14
- package/dist/utils/scroll.d.ts +0 -34
- package/dist/utils/scroll.d.ts.map +0 -1
- package/dist/utils/scroll.js +0 -140
- package/dist/utils/settings.d.ts +0 -9
- package/dist/utils/settings.d.ts.map +0 -1
- package/dist/utils/settings.js +0 -14
- package/dist/utils/theme.d.ts.map +0 -1
- package/dist/utils/viewMode.d.ts +0 -14
- package/dist/utils/viewMode.d.ts.map +0 -1
- package/dist/utils/viewMode.js +0 -46
- /package/DS1/0-face/{2025-04-23-device.ts → device.ts} +0 -0
- /package/DS1/{utils → 0-face}/theme.ts +0 -0
- /package/DS1/{x Icon → x-icon}/1x.svg +0 -0
- /package/DS1/{x Icon → x-icon}/1xdots.svg +0 -0
- /package/DS1/{x Icon → x-icon}/1xgrid.svg +0 -0
- /package/DS1/{x Icon → x-icon}/1xlines.svg +0 -0
- /package/DS1/{x Icon → x-icon}/2x.svg +0 -0
- /package/DS1/{x Icon → x-icon}/2xdots.svg +0 -0
- /package/DS1/{x Icon → x-icon}/2xgrid.svg +0 -0
- /package/DS1/{x Icon → x-icon}/2xlines.svg +0 -0
- /package/DS1/{x Icon → x-icon}/big.svg +0 -0
- /package/DS1/{x Icon → x-icon}/blank.svg +0 -0
- /package/DS1/{x Icon → x-icon}/check.svg +0 -0
- /package/DS1/{x Icon → x-icon}/close.svg +0 -0
- /package/DS1/{x Icon → x-icon}/collapse.svg +0 -0
- /package/DS1/{x Icon → x-icon}/color.svg +0 -0
- /package/DS1/{x Icon → x-icon}/column.svg +0 -0
- /package/DS1/{x Icon → x-icon}/default.svg +0 -0
- /package/DS1/{x Icon → x-icon}/delete.svg +0 -0
- /package/DS1/{x Icon → x-icon}/do.svg +0 -0
- /package/DS1/{x Icon → x-icon}/down.svg +0 -0
- /package/DS1/{x Icon → x-icon}/duplicate.svg +0 -0
- /package/DS1/{x Icon → x-icon}/email.svg +0 -0
- /package/DS1/{x Icon → x-icon}/expand.svg +0 -0
- /package/DS1/{x Icon → x-icon}/gallery.svg +0 -0
- /package/DS1/{x Icon → x-icon}/group.svg +0 -0
- /package/DS1/{x Icon → x-icon}/head.svg +0 -0
- /package/DS1/{x Icon → x-icon}/icon.svg +0 -0
- /package/DS1/{x Icon → x-icon}/left.svg +0 -0
- /package/DS1/{x Icon → x-icon}/lock.svg +0 -0
- /package/DS1/{x Icon → x-icon}/mic.svg +0 -0
- /package/DS1/{x Icon → x-icon}/minimize.svg +0 -0
- /package/DS1/{x Icon → x-icon}/more.svg +0 -0
- /package/DS1/{x Icon → x-icon}/note.svg +0 -0
- /package/DS1/{x Icon → x-icon}/open.svg +0 -0
- /package/DS1/{x Icon → x-icon}/page.svg +0 -0
- /package/DS1/{x Icon → x-icon}/plus.svg +0 -0
- /package/DS1/{x Icon → x-icon}/rewind.svg +0 -0
- /package/DS1/{x Icon → x-icon}/right.svg +0 -0
- /package/DS1/{x Icon → x-icon}/row..svg +0 -0
- /package/DS1/{x Icon → x-icon}/search.svg +0 -0
- /package/DS1/{x Icon → x-icon}/see.svg +0 -0
- /package/DS1/{x Icon → x-icon}/star.svg +0 -0
- /package/DS1/{x Icon → x-icon}/title.svg +0 -0
- /package/DS1/{x Icon → x-icon}/undo.svg +0 -0
- /package/DS1/{x Icon → x-icon}/ungroup.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unhead.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unicon.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unlock.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unmic.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unsee.svg +0 -0
- /package/DS1/{x Icon → x-icon}/unstar.svg +0 -0
- /package/DS1/{x Icon → x-icon}/untitle.svg +0 -0
- /package/DS1/{x Icon → x-icon}/up.svg +0 -0
- /package/dist/0-face/{2025-04-23-device.js → device.js} +0 -0
- /package/dist/{utils → 0-face}/theme.d.ts +0 -0
- /package/dist/{utils → 0-face}/theme.js +0 -0
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { LitElement, html } from "lit";
|
|
2
|
-
import { getText } from "../utils/language";
|
|
3
|
-
import { getViewMode, setViewMode } from "../utils/viewMode";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A component for toggling between text and image view modes
|
|
7
|
-
*
|
|
8
|
-
* @element ds-viewtoggle
|
|
9
|
-
*/
|
|
10
|
-
export class ViewToggle extends LitElement {
|
|
11
|
-
static properties = {
|
|
12
|
-
_mode: { type: String, state: true },
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
declare _mode: "text" | "image";
|
|
16
|
-
|
|
17
|
-
private boundHandlers: {
|
|
18
|
-
viewModeChanged: EventListener;
|
|
19
|
-
languageChanged: EventListener;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
constructor() {
|
|
23
|
-
super();
|
|
24
|
-
this._mode = getViewMode();
|
|
25
|
-
this.boundHandlers = {
|
|
26
|
-
viewModeChanged: ((e: CustomEvent) => {
|
|
27
|
-
const mode = e.detail === "image" ? "image" : "text";
|
|
28
|
-
if (this._mode !== mode) {
|
|
29
|
-
this._mode = mode;
|
|
30
|
-
}
|
|
31
|
-
}) as EventListener,
|
|
32
|
-
languageChanged: (() => {
|
|
33
|
-
this.requestUpdate();
|
|
34
|
-
}) as EventListener,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
connectedCallback() {
|
|
39
|
-
super.connectedCallback();
|
|
40
|
-
window.addEventListener(
|
|
41
|
-
"view-mode-changed",
|
|
42
|
-
this.boundHandlers.viewModeChanged
|
|
43
|
-
);
|
|
44
|
-
window.addEventListener(
|
|
45
|
-
"language-changed",
|
|
46
|
-
this.boundHandlers.languageChanged
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
disconnectedCallback() {
|
|
51
|
-
super.disconnectedCallback();
|
|
52
|
-
window.removeEventListener(
|
|
53
|
-
"view-mode-changed",
|
|
54
|
-
this.boundHandlers.viewModeChanged
|
|
55
|
-
);
|
|
56
|
-
window.removeEventListener(
|
|
57
|
-
"language-changed",
|
|
58
|
-
this.boundHandlers.languageChanged
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private _toggle = () => {
|
|
63
|
-
const next = this._mode === "image" ? "text" : "image";
|
|
64
|
-
setViewMode(next);
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
render() {
|
|
68
|
-
const label =
|
|
69
|
-
this._mode === "image" ? getText("hideImage") : getText("viewImage");
|
|
70
|
-
return html`
|
|
71
|
-
<ds-button variant="primary" @click=${this._toggle}>${label}</ds-button>
|
|
72
|
-
`;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
customElements.define("ds-viewtoggle", ViewToggle);
|
|
77
|
-
|
|
78
|
-
declare global {
|
|
79
|
-
interface HTMLElementTagNameMap {
|
|
80
|
-
"ds-viewtoggle": ViewToggle;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
package/DS1/utils/cdn-loader.ts
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Loader Utility
|
|
3
|
-
* Automatically detects and loads translation JSON files from the same directory as the HTML file
|
|
4
|
-
* for CDN users who want to use external translations
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
type TranslationData = Record<string, string>;
|
|
8
|
-
type TranslationMap = Record<string, TranslationData>;
|
|
9
|
-
|
|
10
|
-
declare global {
|
|
11
|
-
interface Window {
|
|
12
|
-
DS_ONE_TRANSLATIONS?: TranslationMap;
|
|
13
|
-
DS_ONE_TRANSLATIONS_FILE?: string;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Track if we've already attempted to load
|
|
18
|
-
let loadAttempted = false;
|
|
19
|
-
|
|
20
|
-
const DEFAULT_TRANSLATION_FILES = [
|
|
21
|
-
"./keys.json",
|
|
22
|
-
"./tekst.json",
|
|
23
|
-
"./tekster.json",
|
|
24
|
-
"./language.json",
|
|
25
|
-
"./languages.json",
|
|
26
|
-
"./translations.json",
|
|
27
|
-
"./translate.json",
|
|
28
|
-
"./i18n.json",
|
|
29
|
-
"./locales.json",
|
|
30
|
-
"./strings.json",
|
|
31
|
-
"./text.json",
|
|
32
|
-
"./texts.json",
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
function normalizeCandidate(path: string): string | null {
|
|
36
|
-
if (!path) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
const trimmed = path.trim();
|
|
40
|
-
if (!trimmed) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (
|
|
45
|
-
trimmed.startsWith("./") ||
|
|
46
|
-
trimmed.startsWith("../") ||
|
|
47
|
-
trimmed.startsWith("/") ||
|
|
48
|
-
/^https?:\/\//i.test(trimmed)
|
|
49
|
-
) {
|
|
50
|
-
return trimmed;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return `./${trimmed}`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function findAttributeCandidate(): string | null {
|
|
57
|
-
if (typeof document === "undefined") {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const scriptWithAttribute = document.querySelector(
|
|
62
|
-
"script[data-ds-one-translations]"
|
|
63
|
-
);
|
|
64
|
-
const scriptCandidate = scriptWithAttribute?.getAttribute(
|
|
65
|
-
"data-ds-one-translations"
|
|
66
|
-
);
|
|
67
|
-
if (scriptCandidate) {
|
|
68
|
-
return scriptCandidate;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const metaCandidate = document
|
|
72
|
-
.querySelector('meta[name="ds-one:translations"]')
|
|
73
|
-
?.getAttribute("content");
|
|
74
|
-
if (metaCandidate) {
|
|
75
|
-
return metaCandidate;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const linkCandidate = document
|
|
79
|
-
.querySelector('link[rel="ds-one-translations"]')
|
|
80
|
-
?.getAttribute("href");
|
|
81
|
-
if (linkCandidate) {
|
|
82
|
-
return linkCandidate;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function resolveTranslationSources(): string[] {
|
|
89
|
-
const candidates = new Set<string>();
|
|
90
|
-
|
|
91
|
-
const windowCandidate =
|
|
92
|
-
typeof window !== "undefined" ? window.DS_ONE_TRANSLATIONS_FILE : null;
|
|
93
|
-
const attributeCandidate = findAttributeCandidate();
|
|
94
|
-
|
|
95
|
-
const addCandidate = (candidate: string | null) => {
|
|
96
|
-
const normalized = normalizeCandidate(candidate ?? "");
|
|
97
|
-
if (normalized) {
|
|
98
|
-
candidates.add(normalized);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
addCandidate(windowCandidate ?? null);
|
|
103
|
-
addCandidate(attributeCandidate);
|
|
104
|
-
|
|
105
|
-
// Always include defaults as fallback so existing behaviour keeps working
|
|
106
|
-
DEFAULT_TRANSLATION_FILES.forEach((file) => addCandidate(file));
|
|
107
|
-
|
|
108
|
-
return Array.from(candidates);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function validateTranslationMap(
|
|
112
|
-
candidate: unknown
|
|
113
|
-
): candidate is TranslationMap {
|
|
114
|
-
if (!candidate || typeof candidate !== "object") {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return Object.values(candidate).every(
|
|
119
|
-
(entry) => entry && typeof entry === "object"
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async function fetchTranslationFile(
|
|
124
|
-
source: string
|
|
125
|
-
): Promise<TranslationMap | null> {
|
|
126
|
-
try {
|
|
127
|
-
console.log(`[DS one] Attempting to fetch translations from: ${source}`);
|
|
128
|
-
const response = await fetch(source);
|
|
129
|
-
|
|
130
|
-
if (!response.ok) {
|
|
131
|
-
console.log(`[DS one] Failed to fetch ${source} (${response.status})`);
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const translations = await response.json();
|
|
136
|
-
console.log(`[DS one] Successfully fetched JSON from ${source}`);
|
|
137
|
-
|
|
138
|
-
if (!validateTranslationMap(translations)) {
|
|
139
|
-
console.warn(
|
|
140
|
-
`[DS one] Invalid translation format in ${source}. Expected object with language codes as keys.`
|
|
141
|
-
);
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const languages = Object.keys(translations);
|
|
146
|
-
if (languages.length === 0) {
|
|
147
|
-
console.warn(`[DS one] No languages found in ${source}`);
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
console.log(`[DS one] Valid translations found: ${languages.join(", ")}`);
|
|
152
|
-
return translations;
|
|
153
|
-
} catch (error) {
|
|
154
|
-
if (
|
|
155
|
-
error instanceof TypeError &&
|
|
156
|
-
error.message.includes("Failed to fetch")
|
|
157
|
-
) {
|
|
158
|
-
console.log(`[DS one] Network error fetching ${source}`);
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
console.error(
|
|
163
|
-
`[DS one] Error loading external translations from ${source}:`,
|
|
164
|
-
error
|
|
165
|
-
);
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Attempts to load translations from a JSON file in the same directory
|
|
172
|
-
*/
|
|
173
|
-
export async function loadExternalTranslations(): Promise<boolean> {
|
|
174
|
-
// Only attempt once
|
|
175
|
-
if (loadAttempted) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
loadAttempted = true;
|
|
179
|
-
|
|
180
|
-
if (typeof window === "undefined") {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Check if translations are already loaded (e.g., by the application)
|
|
185
|
-
if (
|
|
186
|
-
window.DS_ONE_TRANSLATIONS &&
|
|
187
|
-
Object.keys(window.DS_ONE_TRANSLATIONS).length > 0
|
|
188
|
-
) {
|
|
189
|
-
console.log(
|
|
190
|
-
`[DS one] Translations already loaded (${Object.keys(window.DS_ONE_TRANSLATIONS).length} languages), skipping auto-load`
|
|
191
|
-
);
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const sources = resolveTranslationSources();
|
|
196
|
-
|
|
197
|
-
for (const source of sources) {
|
|
198
|
-
const translations = await fetchTranslationFile(source);
|
|
199
|
-
if (!translations) {
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
window.DS_ONE_TRANSLATIONS = translations;
|
|
204
|
-
|
|
205
|
-
const languages = Object.keys(translations);
|
|
206
|
-
console.log(
|
|
207
|
-
`[DS one] External translations loaded from ${source}: ${languages.length} language(s) – ${languages.join(", ")}`
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
window.dispatchEvent(new CustomEvent("translations-ready"));
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
console.info(
|
|
215
|
-
`[DS one] No external translations found. Looked in: ${sources.join(", ")}. Using bundled translations.`
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
return false;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Auto-load translations when this module is imported (for CDN bundle)
|
|
222
|
-
if (typeof window !== "undefined") {
|
|
223
|
-
// Wait a bit to ensure the DOM is ready
|
|
224
|
-
if (document.readyState === "loading") {
|
|
225
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
226
|
-
loadExternalTranslations();
|
|
227
|
-
});
|
|
228
|
-
} else {
|
|
229
|
-
// DOM is already ready
|
|
230
|
-
loadExternalTranslations();
|
|
231
|
-
}
|
|
232
|
-
}
|
package/DS1/utils/keys.json
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"en": {
|
|
3
|
-
"language": "Language",
|
|
4
|
-
"theme": "Theme",
|
|
5
|
-
"home": "Home",
|
|
6
|
-
"about": "About",
|
|
7
|
-
"contact": "Contact",
|
|
8
|
-
"welcome": "Welcome",
|
|
9
|
-
"description": "Description",
|
|
10
|
-
"learnMore": "Learn More",
|
|
11
|
-
"copyright": "© 2025",
|
|
12
|
-
"siteTitle": "Site Title",
|
|
13
|
-
"downloadCV": "Download CV"
|
|
14
|
-
},
|
|
15
|
-
"da": {
|
|
16
|
-
"language": "Sprog",
|
|
17
|
-
"theme": "Tema",
|
|
18
|
-
"home": "Hjem",
|
|
19
|
-
"about": "Om",
|
|
20
|
-
"contact": "Kontakt",
|
|
21
|
-
"welcome": "Velkommen",
|
|
22
|
-
"description": "Beskrivelse",
|
|
23
|
-
"learnMore": "Lær Mere",
|
|
24
|
-
"copyright": "© 2025",
|
|
25
|
-
"siteTitle": "Site Titel",
|
|
26
|
-
"downloadCV": "Download CV"
|
|
27
|
-
},
|
|
28
|
-
"ja": {
|
|
29
|
-
"language": "言語",
|
|
30
|
-
"theme": "テーマ",
|
|
31
|
-
"home": "ホーム",
|
|
32
|
-
"about": "について",
|
|
33
|
-
"contact": "お問い合わせ",
|
|
34
|
-
"welcome": "ようこそ",
|
|
35
|
-
"description": "説明",
|
|
36
|
-
"learnMore": "詳細を見る",
|
|
37
|
-
"copyright": "© 2025",
|
|
38
|
-
"siteTitle": "サイトタイトル",
|
|
39
|
-
"downloadCV": "CVをダウンロード"
|
|
40
|
-
}
|
|
41
|
-
}
|
package/DS1/utils/pricing.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { LanguageCode } from "./language";
|
|
2
|
-
|
|
3
|
-
type PriceLabelOptions = {
|
|
4
|
-
language: LanguageCode;
|
|
5
|
-
country?: string;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
const defaultPriceByLanguage: Record<string, string> = {
|
|
9
|
-
en: "$42", // life, the universe and everything
|
|
10
|
-
de: "42 €",
|
|
11
|
-
fr: "42 €",
|
|
12
|
-
es: "42 €",
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export function getPriceLabel({ language, country }: PriceLabelOptions): string {
|
|
16
|
-
const normalized = language.toLowerCase();
|
|
17
|
-
const base = defaultPriceByLanguage[normalized] ?? defaultPriceByLanguage.en;
|
|
18
|
-
|
|
19
|
-
if (!country) {
|
|
20
|
-
return base;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return `${base} (${country.toUpperCase()})`;
|
|
24
|
-
}
|
package/DS1/utils/scroll.ts
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
// scroll.ts
|
|
2
|
-
// Scroll position utilities for carrying scroll position across page navigations
|
|
3
|
-
|
|
4
|
-
export type ScrollPosition = {
|
|
5
|
-
x: number;
|
|
6
|
-
y: number;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const SCROLL_POSITION_KEY = "ds-scroll-position";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Save the current scroll position
|
|
13
|
-
*/
|
|
14
|
-
export function saveScrollPosition(): void {
|
|
15
|
-
if (typeof window === "undefined") {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
const position: ScrollPosition = {
|
|
21
|
-
x: window.scrollX,
|
|
22
|
-
y: window.scrollY,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
sessionStorage.setItem(SCROLL_POSITION_KEY, JSON.stringify(position));
|
|
26
|
-
} catch (error) {
|
|
27
|
-
console.warn("[DS one] Failed to save scroll position:", error);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get the saved scroll position
|
|
33
|
-
*/
|
|
34
|
-
export function getScrollPosition(): ScrollPosition | null {
|
|
35
|
-
if (typeof window === "undefined") {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
const stored = sessionStorage.getItem(SCROLL_POSITION_KEY);
|
|
41
|
-
|
|
42
|
-
if (!stored) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const position = JSON.parse(stored) as ScrollPosition;
|
|
47
|
-
|
|
48
|
-
// Validate the parsed data
|
|
49
|
-
if (
|
|
50
|
-
typeof position.x === "number" &&
|
|
51
|
-
typeof position.y === "number" &&
|
|
52
|
-
!isNaN(position.x) &&
|
|
53
|
-
!isNaN(position.y)
|
|
54
|
-
) {
|
|
55
|
-
return position;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return null;
|
|
59
|
-
} catch (error) {
|
|
60
|
-
console.warn("[DS one] Failed to retrieve scroll position:", error);
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Restore the saved scroll position
|
|
67
|
-
*/
|
|
68
|
-
export function restoreScrollPosition(
|
|
69
|
-
options: { smooth?: boolean; clear?: boolean } = {}
|
|
70
|
-
): boolean {
|
|
71
|
-
if (typeof window === "undefined") {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const position = getScrollPosition();
|
|
76
|
-
|
|
77
|
-
if (!position) {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
try {
|
|
82
|
-
// Use requestAnimationFrame to ensure DOM is ready
|
|
83
|
-
requestAnimationFrame(() => {
|
|
84
|
-
window.scrollTo({
|
|
85
|
-
left: position.x,
|
|
86
|
-
top: position.y,
|
|
87
|
-
behavior: options.smooth ? "smooth" : "instant",
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// Optionally clear the saved position after restoring
|
|
91
|
-
if (options.clear) {
|
|
92
|
-
clearScrollPosition();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Dispatch custom event
|
|
96
|
-
window.dispatchEvent(
|
|
97
|
-
new CustomEvent("scroll-restored", {
|
|
98
|
-
detail: position,
|
|
99
|
-
})
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
return true;
|
|
104
|
-
} catch (error) {
|
|
105
|
-
console.warn("[DS one] Failed to restore scroll position:", error);
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Clear the saved scroll position
|
|
112
|
-
*/
|
|
113
|
-
export function clearScrollPosition(): void {
|
|
114
|
-
if (typeof window === "undefined") {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
sessionStorage.removeItem(SCROLL_POSITION_KEY);
|
|
120
|
-
} catch (error) {
|
|
121
|
-
console.warn("[DS one] Failed to clear scroll position:", error);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Initialize scroll position management
|
|
127
|
-
* Call this once to set up automatic save/restore behavior
|
|
128
|
-
*/
|
|
129
|
-
export function initScrollManagement(
|
|
130
|
-
options: {
|
|
131
|
-
autoSave?: boolean;
|
|
132
|
-
autoRestore?: boolean;
|
|
133
|
-
smooth?: boolean;
|
|
134
|
-
clearOnRestore?: boolean;
|
|
135
|
-
} = {}
|
|
136
|
-
): void {
|
|
137
|
-
if (typeof window === "undefined") {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const {
|
|
142
|
-
autoSave = true,
|
|
143
|
-
autoRestore = true,
|
|
144
|
-
smooth = false,
|
|
145
|
-
clearOnRestore = false,
|
|
146
|
-
} = options;
|
|
147
|
-
|
|
148
|
-
// Auto-save scroll position before leaving the page
|
|
149
|
-
if (autoSave) {
|
|
150
|
-
window.addEventListener("beforeunload", () => {
|
|
151
|
-
saveScrollPosition();
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// Also save on history state changes (for SPAs)
|
|
155
|
-
window.addEventListener("pagehide", () => {
|
|
156
|
-
saveScrollPosition();
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Auto-restore scroll position when page loads
|
|
161
|
-
if (autoRestore) {
|
|
162
|
-
const restore = () => {
|
|
163
|
-
restoreScrollPosition({ smooth, clear: clearOnRestore });
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
if (document.readyState === "loading") {
|
|
167
|
-
// Wait for DOM to be ready
|
|
168
|
-
document.addEventListener("DOMContentLoaded", restore);
|
|
169
|
-
} else {
|
|
170
|
-
// DOM is already ready
|
|
171
|
-
restore();
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Auto-initialize scroll management when module loads
|
|
177
|
-
if (typeof window !== "undefined") {
|
|
178
|
-
initScrollManagement({
|
|
179
|
-
autoSave: true,
|
|
180
|
-
autoRestore: true,
|
|
181
|
-
smooth: false,
|
|
182
|
-
clearOnRestore: false,
|
|
183
|
-
});
|
|
184
|
-
}
|
package/DS1/utils/settings.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { LanguageCode } from "./language";
|
|
2
|
-
import type { ThemeType } from "./theme";
|
|
3
|
-
|
|
4
|
-
export type Settings = {
|
|
5
|
-
language?: LanguageCode;
|
|
6
|
-
theme?: ThemeType;
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export function saveSettings(settings: Settings): void {
|
|
11
|
-
if (typeof window === "undefined") {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const raw = window.localStorage?.getItem("ds-one:settings");
|
|
17
|
-
const existing = raw ? (JSON.parse(raw) as Record<string, unknown>) : {};
|
|
18
|
-
const next = { ...existing, ...settings };
|
|
19
|
-
window.localStorage?.setItem("ds-one:settings", JSON.stringify(next));
|
|
20
|
-
} catch (error) {
|
|
21
|
-
console.warn("ds-one: unable to persist settings", error);
|
|
22
|
-
}
|
|
23
|
-
}
|
package/DS1/utils/viewMode.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
// viewMode.ts
|
|
2
|
-
// View mode utilities for managing text/image view states
|
|
3
|
-
|
|
4
|
-
export type ViewMode = "text" | "image";
|
|
5
|
-
|
|
6
|
-
const VIEW_MODE_KEY = "ds-view-mode";
|
|
7
|
-
const DEFAULT_VIEW_MODE: ViewMode = "text";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Get the current view mode from localStorage or return default
|
|
11
|
-
*/
|
|
12
|
-
export function getViewMode(): ViewMode {
|
|
13
|
-
if (typeof window === "undefined") {
|
|
14
|
-
return DEFAULT_VIEW_MODE;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
try {
|
|
18
|
-
const stored = localStorage.getItem(VIEW_MODE_KEY);
|
|
19
|
-
return stored === "image" || stored === "text" ? stored : DEFAULT_VIEW_MODE;
|
|
20
|
-
} catch {
|
|
21
|
-
return DEFAULT_VIEW_MODE;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Set the view mode in localStorage and dispatch change event
|
|
27
|
-
*/
|
|
28
|
-
export function setViewMode(mode: ViewMode): void {
|
|
29
|
-
if (typeof window === "undefined") {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
localStorage.setItem(VIEW_MODE_KEY, mode);
|
|
35
|
-
|
|
36
|
-
// Dispatch custom event for components to listen to
|
|
37
|
-
window.dispatchEvent(
|
|
38
|
-
new CustomEvent("view-mode-changed", {
|
|
39
|
-
detail: mode,
|
|
40
|
-
})
|
|
41
|
-
);
|
|
42
|
-
} catch (error) {
|
|
43
|
-
console.warn("Failed to save view mode:", error);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Toggle between text and image view modes
|
|
49
|
-
*/
|
|
50
|
-
export function toggleViewMode(): ViewMode {
|
|
51
|
-
const currentMode = getViewMode();
|
|
52
|
-
const newMode = currentMode === "text" ? "image" : "text";
|
|
53
|
-
setViewMode(newMode);
|
|
54
|
-
return newMode;
|
|
55
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"2025-04-23-device.d.ts","sourceRoot":"","sources":["../../DS1/0-face/2025-04-23-device.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA0B5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CA6B1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,CA8ChD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=2025-04-23-language.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"2025-04-23-language.d.ts","sourceRoot":"","sources":["../../DS1/0-face/2025-04-23-language.ts"],"names":[],"mappings":""}
|