ds-one 0.2.0-alpha.3 → 0.2.5-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 → device.ts} +10 -6
- package/DS1/{utils/language.ts → 0-face/i18n.ts} +236 -92
- package/DS1/0-face/preferences.ts +23 -0
- package/DS1/0-face/pricing.ts +57 -0
- package/DS1/1-root/fonts/Iosevka-Regular.woff2 +0 -0
- package/DS1/1-root/one.css +76 -107
- package/DS1/2-core/ds-banner.ts +3 -0
- package/DS1/2-core/ds-button.ts +13 -16
- package/DS1/2-core/ds-cycle.ts +84 -39
- package/DS1/2-core/{ds-year.ts → ds-date.ts} +5 -6
- package/DS1/2-core/ds-icon.ts +4 -4
- package/DS1/2-core/ds-input.ts +1 -0
- package/DS1/2-core/ds-text.ts +27 -3
- package/DS1/2-core/ds-tooltip.ts +9 -14
- package/DS1/3-unit/ds-list.ts +7 -0
- package/DS1/3-unit/ds-row.ts +4 -5
- package/DS1/3-unit/ds-table.ts +5 -6
- package/DS1/4-page/ds-grid.ts +9 -59
- package/DS1/4-page/ds-layout.ts +123 -18
- package/DS1/index.ts +39 -37
- package/LICENSE +1 -1
- package/README.md +43 -133
- 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/0-face/{2025-04-23-device.js → device.js} +7 -3
- package/dist/{utils/language.d.ts → 0-face/i18n.d.ts} +1 -3
- package/dist/0-face/i18n.d.ts.map +1 -0
- package/dist/{utils/language.js → 0-face/i18n.js} +178 -76
- 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-banner.d.ts +1 -0
- package/dist/2-core/ds-banner.d.ts.map +1 -0
- package/dist/2-core/ds-banner.js +2 -0
- package/dist/2-core/ds-button.d.ts +2 -7
- package/dist/2-core/ds-button.d.ts.map +1 -1
- package/dist/2-core/ds-button.js +12 -14
- package/dist/2-core/ds-cycle.d.ts +2 -0
- package/dist/2-core/ds-cycle.d.ts.map +1 -1
- package/dist/2-core/ds-cycle.js +80 -34
- 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} +5 -5
- package/dist/2-core/ds-icon.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.d.ts +2 -0
- package/dist/2-core/ds-text.d.ts.map +1 -1
- package/dist/2-core/ds-text.js +26 -3
- package/dist/2-core/ds-tooltip.d.ts +1 -1
- package/dist/2-core/ds-tooltip.d.ts.map +1 -1
- package/dist/2-core/ds-tooltip.js +9 -13
- package/dist/3-unit/ds-list.d.ts.map +1 -1
- package/dist/3-unit/ds-list.js +3 -0
- 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} +7 -7
- package/dist/3-unit/ds-row.js +4 -4
- package/dist/3-unit/ds-table.d.ts.map +1 -1
- package/dist/3-unit/ds-table.js +5 -6
- package/dist/4-page/ds-grid.d.ts +0 -7
- package/dist/4-page/ds-grid.d.ts.map +1 -1
- package/dist/4-page/ds-grid.js +9 -54
- package/dist/4-page/ds-layout.d.ts +1 -1
- package/dist/4-page/ds-layout.d.ts.map +1 -1
- package/dist/4-page/ds-layout.js +126 -17
- package/dist/ds-one.bundle.js +2515 -4132
- package/dist/ds-one.bundle.js.map +4 -4
- package/dist/ds-one.bundle.min.js +245 -787
- 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 +8 -9
- 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/3-unit/ds-doublenav.ts +0 -106
- package/DS1/3-unit/ds-panel.ts +0 -27
- package/DS1/3-unit/ds-singlenav.ts +0 -79
- package/DS1/utils/cdn-loader.ts +0 -208
- 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 -142
- 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/{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/row..svg → 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/{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
|
-
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { LitElement, html, css } from "lit";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A component for double navigation (previous/next)
|
|
5
|
-
*
|
|
6
|
-
* @element ds-doublenav
|
|
7
|
-
* @prop {string} previous - URL for previous link
|
|
8
|
-
* @prop {string} next - URL for next link
|
|
9
|
-
* @prop {string} previousText - Text for previous link
|
|
10
|
-
* @prop {string} nextText - Text for next link
|
|
11
|
-
* @prop {string} overlay - Overlay color (blue, red, orange, green, yellow)
|
|
12
|
-
*/
|
|
13
|
-
export class DoubleNav extends LitElement {
|
|
14
|
-
static get properties() {
|
|
15
|
-
return {
|
|
16
|
-
previous: { type: String, reflect: true },
|
|
17
|
-
next: { type: String, reflect: true },
|
|
18
|
-
previousText: { type: String, reflect: true, attribute: "previous-text" },
|
|
19
|
-
nextText: { type: String, reflect: true, attribute: "next-text" },
|
|
20
|
-
overlay: { type: String, reflect: true },
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
declare previous: string;
|
|
25
|
-
declare next: string;
|
|
26
|
-
declare previousText: string;
|
|
27
|
-
declare nextText: string;
|
|
28
|
-
declare overlay?: string;
|
|
29
|
-
|
|
30
|
-
constructor() {
|
|
31
|
-
super();
|
|
32
|
-
this.previous = "";
|
|
33
|
-
this.next = "";
|
|
34
|
-
this.previousText = "";
|
|
35
|
-
this.nextText = "";
|
|
36
|
-
this.overlay = "";
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
static styles = css`
|
|
40
|
-
:host {
|
|
41
|
-
display: flex;
|
|
42
|
-
justify-content: space-between;
|
|
43
|
-
gap: calc(5px * var(--scaling-factor));
|
|
44
|
-
padding: calc(2px * var(--scaling-factor));
|
|
45
|
-
align-items: center;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
a {
|
|
49
|
-
display: inline-flex;
|
|
50
|
-
align-items: center;
|
|
51
|
-
gap: calc(5px * var(--scaling-factor));
|
|
52
|
-
text-decoration: none;
|
|
53
|
-
color: inherit;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.nav-previous {
|
|
57
|
-
justify-self: start;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.nav-next {
|
|
61
|
-
justify-self: end;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.nav-previous ds-icon {
|
|
65
|
-
order: -1;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.nav-next ds-icon {
|
|
69
|
-
padding-top: 3px;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.nav-previous ds-icon {
|
|
73
|
-
padding-top: 3px;
|
|
74
|
-
}
|
|
75
|
-
`;
|
|
76
|
-
|
|
77
|
-
render() {
|
|
78
|
-
return html`
|
|
79
|
-
${this.previous
|
|
80
|
-
? html`
|
|
81
|
-
<a href="${this.previous}" class="nav-previous">
|
|
82
|
-
<ds-icon type="left"></ds-icon>
|
|
83
|
-
<ds-text>${this.previousText || "Previous"}</ds-text>
|
|
84
|
-
</a>
|
|
85
|
-
`
|
|
86
|
-
: html`<div></div>`}
|
|
87
|
-
${this.next
|
|
88
|
-
? html`
|
|
89
|
-
<a href="${this.next}" class="nav-next">
|
|
90
|
-
<ds-text>${this.nextText || "Next"}</ds-text>
|
|
91
|
-
<ds-icon type="right"></ds-icon>
|
|
92
|
-
</a>
|
|
93
|
-
`
|
|
94
|
-
: html`<div></div>`}
|
|
95
|
-
`;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
customElements.define("ds-doublenav", DoubleNav);
|
|
100
|
-
|
|
101
|
-
declare global {
|
|
102
|
-
interface HTMLElementTagNameMap {
|
|
103
|
-
"ds-doublenav": DoubleNav;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
package/DS1/3-unit/ds-panel.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { LitElement, html, css } from "lit";
|
|
3
|
-
|
|
4
|
-
export class Panel extends LitElement {
|
|
5
|
-
static styles = css`
|
|
6
|
-
:host {
|
|
7
|
-
display: flex;
|
|
8
|
-
flex-direction: row;
|
|
9
|
-
height: var(--08);
|
|
10
|
-
align-items: end;
|
|
11
|
-
gap: var(--025);
|
|
12
|
-
}
|
|
13
|
-
`;
|
|
14
|
-
|
|
15
|
-
render() {
|
|
16
|
-
return html`<slot></slot>`;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
customElements.define("ds-panel", Panel);
|
|
21
|
-
|
|
22
|
-
declare global {
|
|
23
|
-
interface HTMLElementTagNameMap {
|
|
24
|
-
"ds-panel": Panel;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { LitElement, html, css } from "lit";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A component for single navigation links
|
|
5
|
-
*
|
|
6
|
-
* @element ds-singlenav
|
|
7
|
-
* @prop {string} type - Type of navigation: "projects" or "work"
|
|
8
|
-
* @prop {string} to - Optional custom destination URL
|
|
9
|
-
*/
|
|
10
|
-
export class SingleNav extends LitElement {
|
|
11
|
-
static get properties() {
|
|
12
|
-
return {
|
|
13
|
-
type: { type: String, reflect: true },
|
|
14
|
-
to: { type: String, reflect: true },
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
declare type: "projects" | "work";
|
|
19
|
-
declare to?: string;
|
|
20
|
-
|
|
21
|
-
constructor() {
|
|
22
|
-
super();
|
|
23
|
-
this.type = "work";
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
static styles = css`
|
|
27
|
-
:host {
|
|
28
|
-
display: flex;
|
|
29
|
-
justify-content: end;
|
|
30
|
-
gap: calc(5px * var(--scaling-factor));
|
|
31
|
-
padding: calc(2px * var(--scaling-factor));
|
|
32
|
-
align-items: center;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
a {
|
|
36
|
-
display: inline-flex;
|
|
37
|
-
align-items: center;
|
|
38
|
-
gap: calc(5px * var(--scaling-factor));
|
|
39
|
-
text-decoration: none;
|
|
40
|
-
color: inherit;
|
|
41
|
-
}
|
|
42
|
-
`;
|
|
43
|
-
|
|
44
|
-
render() {
|
|
45
|
-
const navConfig = this.getNavConfig();
|
|
46
|
-
const href = this.to || navConfig.href;
|
|
47
|
-
|
|
48
|
-
return html`
|
|
49
|
-
<a href="${href}">
|
|
50
|
-
<ds-text key="${navConfig.key}"></ds-text>
|
|
51
|
-
<ds-icon type="right"></ds-icon>
|
|
52
|
-
</a>
|
|
53
|
-
`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
private getNavConfig() {
|
|
57
|
-
switch (this.type) {
|
|
58
|
-
case "projects":
|
|
59
|
-
return {
|
|
60
|
-
href: "/projects",
|
|
61
|
-
key: "projects",
|
|
62
|
-
};
|
|
63
|
-
case "work":
|
|
64
|
-
return {
|
|
65
|
-
href: "/",
|
|
66
|
-
key: "workExperience",
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
customElements.define("ds-singlenav", SingleNav);
|
|
73
|
-
|
|
74
|
-
declare global {
|
|
75
|
-
interface HTMLElementTagNameMap {
|
|
76
|
-
"ds-singlenav": SingleNav;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
package/DS1/utils/cdn-loader.ts
DELETED
|
@@ -1,208 +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_FILE = "./translations.json";
|
|
21
|
-
|
|
22
|
-
function normalizeCandidate(path: string): string | null {
|
|
23
|
-
if (!path) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
const trimmed = path.trim();
|
|
27
|
-
if (!trimmed) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
trimmed.startsWith("./") ||
|
|
33
|
-
trimmed.startsWith("../") ||
|
|
34
|
-
trimmed.startsWith("/") ||
|
|
35
|
-
/^https?:\/\//i.test(trimmed)
|
|
36
|
-
) {
|
|
37
|
-
return trimmed;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return `./${trimmed}`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function findAttributeCandidate(): string | null {
|
|
44
|
-
if (typeof document === "undefined") {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const scriptWithAttribute = document.querySelector(
|
|
49
|
-
"script[data-ds-one-translations]"
|
|
50
|
-
);
|
|
51
|
-
const scriptCandidate = scriptWithAttribute?.getAttribute(
|
|
52
|
-
"data-ds-one-translations"
|
|
53
|
-
);
|
|
54
|
-
if (scriptCandidate) {
|
|
55
|
-
return scriptCandidate;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const metaCandidate = document
|
|
59
|
-
.querySelector('meta[name="ds-one:translations"]')
|
|
60
|
-
?.getAttribute("content");
|
|
61
|
-
if (metaCandidate) {
|
|
62
|
-
return metaCandidate;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const linkCandidate = document
|
|
66
|
-
.querySelector('link[rel="ds-one-translations"]')
|
|
67
|
-
?.getAttribute("href");
|
|
68
|
-
if (linkCandidate) {
|
|
69
|
-
return linkCandidate;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function resolveTranslationSources(): string[] {
|
|
76
|
-
const candidates: string[] = [];
|
|
77
|
-
|
|
78
|
-
const windowCandidate =
|
|
79
|
-
typeof window !== "undefined" ? window.DS_ONE_TRANSLATIONS_FILE : null;
|
|
80
|
-
const attributeCandidate = findAttributeCandidate();
|
|
81
|
-
|
|
82
|
-
// Only use explicitly configured paths, or the single default
|
|
83
|
-
const windowNormalized = normalizeCandidate(windowCandidate ?? "");
|
|
84
|
-
if (windowNormalized) {
|
|
85
|
-
candidates.push(windowNormalized);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const attrNormalized = normalizeCandidate(attributeCandidate ?? "");
|
|
89
|
-
if (attrNormalized && !candidates.includes(attrNormalized)) {
|
|
90
|
-
candidates.push(attrNormalized);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Only try default if no explicit path was configured
|
|
94
|
-
if (candidates.length === 0) {
|
|
95
|
-
candidates.push(DEFAULT_TRANSLATION_FILE);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return candidates;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function validateTranslationMap(
|
|
102
|
-
candidate: unknown
|
|
103
|
-
): candidate is TranslationMap {
|
|
104
|
-
if (!candidate || typeof candidate !== "object") {
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return Object.values(candidate).every(
|
|
109
|
-
(entry) => entry && typeof entry === "object"
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function fetchTranslationFile(
|
|
114
|
-
source: string
|
|
115
|
-
): Promise<TranslationMap | null> {
|
|
116
|
-
try {
|
|
117
|
-
const response = await fetch(source);
|
|
118
|
-
|
|
119
|
-
if (!response.ok) {
|
|
120
|
-
// 404 is expected if no translations file exists - don't log as error
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const translations = await response.json();
|
|
125
|
-
|
|
126
|
-
if (!validateTranslationMap(translations)) {
|
|
127
|
-
console.warn(
|
|
128
|
-
`[DS one] Invalid translation format in ${source}. Expected object with language codes as keys.`
|
|
129
|
-
);
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const languages = Object.keys(translations);
|
|
134
|
-
if (languages.length === 0) {
|
|
135
|
-
console.warn(`[DS one] No languages found in ${source}`);
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return translations;
|
|
140
|
-
} catch {
|
|
141
|
-
// Silently fail - file likely doesn't exist or isn't valid JSON
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Attempts to load translations from a JSON file in the same directory
|
|
148
|
-
*/
|
|
149
|
-
export async function loadExternalTranslations(): Promise<boolean> {
|
|
150
|
-
// Only attempt once
|
|
151
|
-
if (loadAttempted) {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
loadAttempted = true;
|
|
155
|
-
|
|
156
|
-
if (typeof window === "undefined") {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Check if translations are already loaded (e.g., by the application)
|
|
161
|
-
if (
|
|
162
|
-
window.DS_ONE_TRANSLATIONS &&
|
|
163
|
-
Object.keys(window.DS_ONE_TRANSLATIONS).length > 0
|
|
164
|
-
) {
|
|
165
|
-
console.log(
|
|
166
|
-
`[DS one] Translations already loaded (${Object.keys(window.DS_ONE_TRANSLATIONS).length} languages), skipping auto-load`
|
|
167
|
-
);
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const sources = resolveTranslationSources();
|
|
172
|
-
|
|
173
|
-
for (const source of sources) {
|
|
174
|
-
const translations = await fetchTranslationFile(source);
|
|
175
|
-
if (!translations) {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
window.DS_ONE_TRANSLATIONS = translations;
|
|
180
|
-
|
|
181
|
-
const languages = Object.keys(translations);
|
|
182
|
-
console.log(
|
|
183
|
-
`[DS one] External translations loaded from ${source}: ${languages.length} language(s) – ${languages.join(", ")}`
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
window.dispatchEvent(new CustomEvent("translations-ready"));
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
console.info(
|
|
191
|
-
`[DS one] No external translations found at ${sources[0] ?? DEFAULT_TRANSLATION_FILE}. Using bundled translations.`
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Auto-load translations when this module is imported (for CDN bundle)
|
|
198
|
-
if (typeof window !== "undefined") {
|
|
199
|
-
// Wait a bit to ensure the DOM is ready
|
|
200
|
-
if (document.readyState === "loading") {
|
|
201
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
202
|
-
loadExternalTranslations();
|
|
203
|
-
});
|
|
204
|
-
} else {
|
|
205
|
-
// DOM is already ready
|
|
206
|
-
loadExternalTranslations();
|
|
207
|
-
}
|
|
208
|
-
}
|
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
|
-
}
|