ds-one 0.2.0-alpha.3 → 0.2.5-alpha.2

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 (245) hide show
  1. package/DS1/{utils/language.ts → 0-face/i18n.ts} +197 -2
  2. package/DS1/0-face/preferences.ts +23 -0
  3. package/DS1/0-face/pricing.ts +57 -0
  4. package/DS1/1-root/one.css +1 -1
  5. package/DS1/2-core/ds-button.ts +1 -1
  6. package/DS1/2-core/ds-cycle.ts +17 -18
  7. package/DS1/2-core/{ds-year.ts → ds-date.ts} +4 -4
  8. package/DS1/2-core/ds-input.ts +1 -0
  9. package/DS1/2-core/ds-text.ts +1 -1
  10. package/DS1/2-core/ds-tooltip.ts +4 -3
  11. package/DS1/3-unit/doublenav-v1.ts +105 -0
  12. package/DS1/3-unit/{ds-doublenav.ts → ds-portfolio-doublenav.ts} +4 -5
  13. package/DS1/3-unit/ds-portfolio-panel.ts +25 -0
  14. package/DS1/3-unit/list-v1.ts +24 -0
  15. package/DS1/3-unit/{ds-panel.ts → panel-v1.ts} +2 -3
  16. package/DS1/3-unit/row-v1.ts +52 -0
  17. package/DS1/3-unit/{ds-singlenav.ts → singlenav-v1.ts} +4 -5
  18. package/DS1/4-page/ds-grid.ts +1 -1
  19. package/DS1/index.ts +39 -37
  20. package/dist/0-face/{2025-04-23-device.d.ts → device.d.ts} +1 -1
  21. package/dist/0-face/device.d.ts.map +1 -0
  22. package/dist/{utils/language.d.ts → 0-face/i18n.d.ts} +1 -1
  23. package/dist/0-face/i18n.d.ts.map +1 -0
  24. package/dist/{utils/language.js → 0-face/i18n.js} +141 -2
  25. package/dist/0-face/preferences.d.ts +9 -0
  26. package/dist/0-face/preferences.d.ts.map +1 -0
  27. package/dist/0-face/preferences.js +14 -0
  28. package/dist/0-face/pricing.d.ts +15 -0
  29. package/dist/0-face/pricing.d.ts.map +1 -0
  30. package/dist/0-face/pricing.js +46 -0
  31. package/dist/0-face/theme.d.ts.map +1 -0
  32. package/dist/2-core/ds-button.js +1 -1
  33. package/dist/2-core/ds-cycle.js +15 -15
  34. package/dist/2-core/{ds-year.d.ts → ds-date.d.ts} +4 -4
  35. package/dist/2-core/ds-date.d.ts.map +1 -0
  36. package/dist/2-core/{ds-year.js → ds-date.js} +4 -4
  37. package/dist/2-core/ds-input.d.ts +1 -0
  38. package/dist/2-core/ds-input.d.ts.map +1 -0
  39. package/dist/2-core/ds-input.js +1 -0
  40. package/dist/2-core/ds-text.js +1 -1
  41. package/dist/2-core/ds-tooltip.d.ts.map +1 -1
  42. package/dist/2-core/ds-tooltip.js +4 -2
  43. package/dist/3-unit/{ds-doublenav.d.ts → ds-portfolio-doublenav.d.ts} +4 -4
  44. package/dist/3-unit/ds-portfolio-doublenav.d.ts.map +1 -0
  45. package/dist/3-unit/{ds-doublenav.js → ds-portfolio-doublenav.js} +4 -4
  46. package/dist/3-unit/{ds-panel.d.ts → ds-portfolio-panel.d.ts} +3 -3
  47. package/dist/3-unit/ds-portfolio-panel.d.ts.map +1 -0
  48. package/dist/3-unit/{ds-panel.js → ds-portfolio-panel.js} +3 -3
  49. package/dist/3-unit/{ds-singlenav.d.ts → ds-portfolio-singlenav.d.ts} +4 -4
  50. package/dist/3-unit/ds-portfolio-singlenav.d.ts.map +1 -0
  51. package/dist/3-unit/{ds-singlenav.js → ds-portfolio-singlenav.js} +4 -4
  52. package/dist/4-page/ds-grid.js +1 -1
  53. package/dist/ds-one.bundle.js +2075 -3774
  54. package/dist/ds-one.bundle.js.map +4 -4
  55. package/dist/ds-one.bundle.min.js +74 -740
  56. package/dist/ds-one.bundle.min.js.map +4 -4
  57. package/dist/index.d.ts +16 -26
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +32 -34
  60. package/package.json +2 -2
  61. package/DS1/0-face/2025-04-23-language.ts +0 -4
  62. package/DS1/2-core/ds-article.ts +0 -454
  63. package/DS1/2-core/ds-attributes.ts +0 -155
  64. package/DS1/2-core/ds-downloadcv.ts +0 -146
  65. package/DS1/2-core/ds-header.ts +0 -82
  66. package/DS1/2-core/ds-home.ts +0 -168
  67. package/DS1/2-core/ds-link.ts +0 -121
  68. package/DS1/2-core/ds-markdown.ts +0 -252
  69. package/DS1/2-core/ds-price.ts +0 -108
  70. package/DS1/2-core/ds-squarecircle.ts +0 -155
  71. package/DS1/2-core/ds-title.ts +0 -139
  72. package/DS1/2-core/ds-viewtoggle.ts +0 -83
  73. package/DS1/utils/cdn-loader.ts +0 -208
  74. package/DS1/utils/keys.json +0 -41
  75. package/DS1/utils/pricing.ts +0 -24
  76. package/DS1/utils/scroll.ts +0 -184
  77. package/DS1/utils/settings.ts +0 -23
  78. package/DS1/utils/viewMode.ts +0 -55
  79. package/dist/0-face/2025-04-23-device.d.ts.map +0 -1
  80. package/dist/0-face/2025-04-23-language.d.ts +0 -1
  81. package/dist/0-face/2025-04-23-language.d.ts.map +0 -1
  82. package/dist/0-face/2025-04-23-language.js +0 -3
  83. package/dist/2-core/article-v1.d.ts +0 -129
  84. package/dist/2-core/article-v1.d.ts.map +0 -1
  85. package/dist/2-core/article-v1.js +0 -361
  86. package/dist/2-core/attributes-v1.d.ts +0 -47
  87. package/dist/2-core/attributes-v1.d.ts.map +0 -1
  88. package/dist/2-core/attributes-v1.js +0 -128
  89. package/dist/2-core/cycle-v1.d.ts +0 -66
  90. package/dist/2-core/cycle-v1.d.ts.map +0 -1
  91. package/dist/2-core/cycle-v1.js +0 -586
  92. package/dist/2-core/downloadcv-v1.d.ts +0 -58
  93. package/dist/2-core/downloadcv-v1.d.ts.map +0 -1
  94. package/dist/2-core/downloadcv-v1.js +0 -119
  95. package/dist/2-core/ds-article.d.ts +0 -129
  96. package/dist/2-core/ds-article.d.ts.map +0 -1
  97. package/dist/2-core/ds-article.js +0 -361
  98. package/dist/2-core/ds-attributes.d.ts +0 -47
  99. package/dist/2-core/ds-attributes.d.ts.map +0 -1
  100. package/dist/2-core/ds-attributes.js +0 -128
  101. package/dist/2-core/ds-button.figma.d.ts +0 -2
  102. package/dist/2-core/ds-button.figma.d.ts.map +0 -1
  103. package/dist/2-core/ds-button.figma.js +0 -6
  104. package/dist/2-core/ds-downloadcv.d.ts +0 -58
  105. package/dist/2-core/ds-downloadcv.d.ts.map +0 -1
  106. package/dist/2-core/ds-downloadcv.js +0 -119
  107. package/dist/2-core/ds-header.d.ts +0 -28
  108. package/dist/2-core/ds-header.d.ts.map +0 -1
  109. package/dist/2-core/ds-header.js +0 -66
  110. package/dist/2-core/ds-home.d.ts +0 -26
  111. package/dist/2-core/ds-home.d.ts.map +0 -1
  112. package/dist/2-core/ds-home.js +0 -148
  113. package/dist/2-core/ds-link.d.ts +0 -35
  114. package/dist/2-core/ds-link.d.ts.map +0 -1
  115. package/dist/2-core/ds-link.js +0 -85
  116. package/dist/2-core/ds-markdown.d.ts +0 -7
  117. package/dist/2-core/ds-markdown.d.ts.map +0 -1
  118. package/dist/2-core/ds-markdown.js +0 -240
  119. package/dist/2-core/ds-price.d.ts +0 -46
  120. package/dist/2-core/ds-price.d.ts.map +0 -1
  121. package/dist/2-core/ds-price.js +0 -72
  122. package/dist/2-core/ds-squarecircle.d.ts +0 -50
  123. package/dist/2-core/ds-squarecircle.d.ts.map +0 -1
  124. package/dist/2-core/ds-squarecircle.js +0 -133
  125. package/dist/2-core/ds-title.d.ts +0 -50
  126. package/dist/2-core/ds-title.d.ts.map +0 -1
  127. package/dist/2-core/ds-title.js +0 -103
  128. package/dist/2-core/ds-viewtoggle.d.ts +0 -27
  129. package/dist/2-core/ds-viewtoggle.d.ts.map +0 -1
  130. package/dist/2-core/ds-viewtoggle.js +0 -49
  131. package/dist/2-core/ds-year.d.ts.map +0 -1
  132. package/dist/2-core/header-v1.d.ts +0 -28
  133. package/dist/2-core/header-v1.d.ts.map +0 -1
  134. package/dist/2-core/header-v1.js +0 -66
  135. package/dist/2-core/home-v1.d.ts +0 -26
  136. package/dist/2-core/home-v1.d.ts.map +0 -1
  137. package/dist/2-core/home-v1.js +0 -148
  138. package/dist/2-core/icon-v1.d.ts +0 -28
  139. package/dist/2-core/icon-v1.d.ts.map +0 -1
  140. package/dist/2-core/icon-v1.js +0 -297
  141. package/dist/2-core/link-v1.d.ts +0 -35
  142. package/dist/2-core/link-v1.d.ts.map +0 -1
  143. package/dist/2-core/link-v1.js +0 -85
  144. package/dist/2-core/markdown-v1.d.ts +0 -7
  145. package/dist/2-core/markdown-v1.d.ts.map +0 -1
  146. package/dist/2-core/markdown-v1.js +0 -240
  147. package/dist/2-core/price-v1.d.ts +0 -46
  148. package/dist/2-core/price-v1.d.ts.map +0 -1
  149. package/dist/2-core/price-v1.js +0 -72
  150. package/dist/2-core/squarecircle-v1.d.ts +0 -50
  151. package/dist/2-core/squarecircle-v1.d.ts.map +0 -1
  152. package/dist/2-core/squarecircle-v1.js +0 -133
  153. package/dist/2-core/text-v1.d.ts +0 -48
  154. package/dist/2-core/text-v1.d.ts.map +0 -1
  155. package/dist/2-core/text-v1.js +0 -83
  156. package/dist/2-core/title-v1.d.ts +0 -50
  157. package/dist/2-core/title-v1.d.ts.map +0 -1
  158. package/dist/2-core/title-v1.js +0 -103
  159. package/dist/2-core/tooltip-v1.d.ts +0 -39
  160. package/dist/2-core/tooltip-v1.d.ts.map +0 -1
  161. package/dist/2-core/tooltip-v1.js +0 -145
  162. package/dist/2-core/viewtoggle-v1.d.ts +0 -27
  163. package/dist/2-core/viewtoggle-v1.d.ts.map +0 -1
  164. package/dist/2-core/viewtoggle-v1.js +0 -49
  165. package/dist/2-core/year-v1.d.ts +0 -16
  166. package/dist/2-core/year-v1.d.ts.map +0 -1
  167. package/dist/2-core/year-v1.js +0 -21
  168. package/dist/3-unit/ds-doublenav.d.ts.map +0 -1
  169. package/dist/3-unit/ds-panel.d.ts.map +0 -1
  170. package/dist/3-unit/ds-singlenav.d.ts.map +0 -1
  171. package/dist/utils/cdn-loader.d.ts +0 -19
  172. package/dist/utils/cdn-loader.d.ts.map +0 -1
  173. package/dist/utils/cdn-loader.js +0 -142
  174. package/dist/utils/keys.json +0 -41
  175. package/dist/utils/language.d.ts.map +0 -1
  176. package/dist/utils/pricing.d.ts +0 -8
  177. package/dist/utils/pricing.d.ts.map +0 -1
  178. package/dist/utils/pricing.js +0 -14
  179. package/dist/utils/scroll.d.ts +0 -34
  180. package/dist/utils/scroll.d.ts.map +0 -1
  181. package/dist/utils/scroll.js +0 -140
  182. package/dist/utils/settings.d.ts +0 -9
  183. package/dist/utils/settings.d.ts.map +0 -1
  184. package/dist/utils/settings.js +0 -14
  185. package/dist/utils/theme.d.ts.map +0 -1
  186. package/dist/utils/viewMode.d.ts +0 -14
  187. package/dist/utils/viewMode.d.ts.map +0 -1
  188. package/dist/utils/viewMode.js +0 -46
  189. /package/DS1/0-face/{2025-04-23-device.ts → device.ts} +0 -0
  190. /package/DS1/{utils → 0-face}/theme.ts +0 -0
  191. /package/DS1/{x Icon → x-icon}/1x.svg +0 -0
  192. /package/DS1/{x Icon → x-icon}/1xdots.svg +0 -0
  193. /package/DS1/{x Icon → x-icon}/1xgrid.svg +0 -0
  194. /package/DS1/{x Icon → x-icon}/1xlines.svg +0 -0
  195. /package/DS1/{x Icon → x-icon}/2x.svg +0 -0
  196. /package/DS1/{x Icon → x-icon}/2xdots.svg +0 -0
  197. /package/DS1/{x Icon → x-icon}/2xgrid.svg +0 -0
  198. /package/DS1/{x Icon → x-icon}/2xlines.svg +0 -0
  199. /package/DS1/{x Icon → x-icon}/big.svg +0 -0
  200. /package/DS1/{x Icon → x-icon}/blank.svg +0 -0
  201. /package/DS1/{x Icon → x-icon}/check.svg +0 -0
  202. /package/DS1/{x Icon → x-icon}/close.svg +0 -0
  203. /package/DS1/{x Icon → x-icon}/collapse.svg +0 -0
  204. /package/DS1/{x Icon → x-icon}/color.svg +0 -0
  205. /package/DS1/{x Icon → x-icon}/column.svg +0 -0
  206. /package/DS1/{x Icon → x-icon}/default.svg +0 -0
  207. /package/DS1/{x Icon → x-icon}/delete.svg +0 -0
  208. /package/DS1/{x Icon → x-icon}/do.svg +0 -0
  209. /package/DS1/{x Icon → x-icon}/down.svg +0 -0
  210. /package/DS1/{x Icon → x-icon}/duplicate.svg +0 -0
  211. /package/DS1/{x Icon → x-icon}/email.svg +0 -0
  212. /package/DS1/{x Icon → x-icon}/expand.svg +0 -0
  213. /package/DS1/{x Icon → x-icon}/gallery.svg +0 -0
  214. /package/DS1/{x Icon → x-icon}/group.svg +0 -0
  215. /package/DS1/{x Icon → x-icon}/head.svg +0 -0
  216. /package/DS1/{x Icon → x-icon}/icon.svg +0 -0
  217. /package/DS1/{x Icon → x-icon}/left.svg +0 -0
  218. /package/DS1/{x Icon → x-icon}/lock.svg +0 -0
  219. /package/DS1/{x Icon → x-icon}/mic.svg +0 -0
  220. /package/DS1/{x Icon → x-icon}/minimize.svg +0 -0
  221. /package/DS1/{x Icon → x-icon}/more.svg +0 -0
  222. /package/DS1/{x Icon → x-icon}/note.svg +0 -0
  223. /package/DS1/{x Icon → x-icon}/open.svg +0 -0
  224. /package/DS1/{x Icon → x-icon}/page.svg +0 -0
  225. /package/DS1/{x Icon → x-icon}/plus.svg +0 -0
  226. /package/DS1/{x Icon → x-icon}/rewind.svg +0 -0
  227. /package/DS1/{x Icon → x-icon}/right.svg +0 -0
  228. /package/DS1/{x Icon → x-icon}/row..svg +0 -0
  229. /package/DS1/{x Icon → x-icon}/search.svg +0 -0
  230. /package/DS1/{x Icon → x-icon}/see.svg +0 -0
  231. /package/DS1/{x Icon → x-icon}/star.svg +0 -0
  232. /package/DS1/{x Icon → x-icon}/title.svg +0 -0
  233. /package/DS1/{x Icon → x-icon}/undo.svg +0 -0
  234. /package/DS1/{x Icon → x-icon}/ungroup.svg +0 -0
  235. /package/DS1/{x Icon → x-icon}/unhead.svg +0 -0
  236. /package/DS1/{x Icon → x-icon}/unicon.svg +0 -0
  237. /package/DS1/{x Icon → x-icon}/unlock.svg +0 -0
  238. /package/DS1/{x Icon → x-icon}/unmic.svg +0 -0
  239. /package/DS1/{x Icon → x-icon}/unsee.svg +0 -0
  240. /package/DS1/{x Icon → x-icon}/unstar.svg +0 -0
  241. /package/DS1/{x Icon → x-icon}/untitle.svg +0 -0
  242. /package/DS1/{x Icon → x-icon}/up.svg +0 -0
  243. /package/dist/0-face/{2025-04-23-device.js → device.js} +0 -0
  244. /package/dist/{utils → 0-face}/theme.d.ts +0 -0
  245. /package/dist/{utils → 0-face}/theme.js +0 -0
@@ -1,252 +0,0 @@
1
- import { LitElement, html, css } from "lit";
2
-
3
- customElements.define(
4
- "ds-markdown",
5
- class Markdown extends LitElement {
6
- static properties = {
7
- content: { type: String },
8
- title: { type: String },
9
- language: { type: String },
10
- guideId: { type: String },
11
- };
12
-
13
- content = "";
14
- title = "";
15
- language = "";
16
- guideId = "";
17
-
18
- static styles = css`
19
- :host {
20
- display: block;
21
- font-family:
22
- -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu,
23
- Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
24
- line-height: 1.6;
25
- color: #333;
26
- }
27
-
28
- .markdown-container {
29
- max-width: 800px;
30
- margin: 0 auto;
31
- }
32
-
33
- .markdown-header {
34
- padding-bottom: 1rem;
35
- }
36
-
37
- .markdown-title {
38
- font-weight: 700;
39
- margin: 0 0 0.5rem 0;
40
- color: #2c3e50;
41
- }
42
-
43
- .markdown-meta {
44
- display: flex;
45
- gap: 1rem;
46
- font-size: 0.9rem;
47
- color: #666;
48
- flex-wrap: wrap;
49
- }
50
-
51
- .markdown-category {
52
- background: #e3f2fd;
53
- color: #1976d2;
54
- padding: 0.25rem 0.5rem;
55
- border-radius: 4px;
56
- font-weight: 500;
57
- }
58
-
59
- .markdown-tags {
60
- display: flex;
61
- gap: 0.5rem;
62
- flex-wrap: wrap;
63
- }
64
-
65
- .markdown-tag {
66
- background: #f5f5f5;
67
- color: #666;
68
- padding: 0.25rem 0.5rem;
69
- border-radius: 4px;
70
- font-size: 0.8rem;
71
- }
72
-
73
- .markdown-content {
74
- font-size: 1rem;
75
- }
76
-
77
- .markdown-content h1,
78
- .markdown-content h2,
79
- .markdown-content h3,
80
- .markdown-content h4,
81
- .markdown-content h5,
82
- .markdown-content h6 {
83
- margin-bottom: 1rem;
84
- font-weight: 600;
85
- line-height: 1.3;
86
- }
87
-
88
- .markdown-content h1 {
89
- font-size: 1.8rem;
90
- color: #2c3e50;
91
- }
92
-
93
- .markdown-content h2 {
94
- font-size: 1.5rem;
95
- color: #34495e;
96
- }
97
-
98
- .markdown-content h3 {
99
- font-size: 1.3rem;
100
- color: #2c3e50;
101
- }
102
-
103
- .markdown-content h4 {
104
- font-size: 1.1rem;
105
- color: #34495e;
106
- }
107
-
108
- .markdown-content p {
109
- margin-bottom: 1rem;
110
- line-height: 1.7;
111
- }
112
-
113
- .markdown-content ul,
114
- .markdown-content ol {
115
- }
116
-
117
- .markdown-content li {
118
- margin-bottom: 0.5rem;
119
- }
120
-
121
- .markdown-content blockquote {
122
- border-left: 4px solid #3498db;
123
- padding-left: 1rem;
124
- margin: 1.5rem 0;
125
- font-style: italic;
126
- color: #555;
127
- }
128
-
129
- .markdown-content code {
130
- background: #f8f9fa;
131
- padding: 0.2rem 0.4rem;
132
- border-radius: 3px;
133
- font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
134
- font-size: 0.9em;
135
- }
136
-
137
- .markdown-content pre {
138
- background: #f8f9fa;
139
- padding: 1rem;
140
- border-radius: 5px;
141
- overflow-x: auto;
142
- margin: 1.5rem 0;
143
- }
144
-
145
- .markdown-content pre code {
146
- background: none;
147
- padding: 0;
148
- }
149
-
150
- .markdown-content table {
151
- width: 100%;
152
- border-collapse: collapse;
153
- margin: 1.5rem 0;
154
- }
155
-
156
- .markdown-content th,
157
- .markdown-content td {
158
- padding: 0.75rem;
159
- text-align: left;
160
- }
161
-
162
- .markdown-content th {
163
- background: #f8f9fa;
164
- font-weight: 600;
165
- }
166
-
167
- .markdown-content a {
168
- color: #3498db;
169
- text-decoration: none;
170
- }
171
-
172
- .markdown-content a:hover {
173
- text-decoration: underline;
174
- }
175
-
176
- .markdown-content img {
177
- max-width: 100%;
178
- height: auto;
179
- margin: 1rem 0;
180
- }
181
- `;
182
-
183
- render() {
184
- if (!this.content) {
185
- return html`<div class="markdown-container">
186
- <p>No content available</p>
187
- </div>`;
188
- }
189
-
190
- return html`
191
- <div class="markdown-container">
192
- ${this.title
193
- ? html`
194
- <div class="markdown-header">
195
- <h1 class="markdown-title">${this.title}</h1>
196
- <div class="markdown-meta">
197
- ${this.language
198
- ? html`
199
- <span class="markdown-category"
200
- >${this.language}</span
201
- >
202
- `
203
- : ""}
204
- ${this.guideId
205
- ? html`
206
- <span class="markdown-tag"
207
- >Guide ID: ${this.guideId}</span
208
- >
209
- `
210
- : ""}
211
- </div>
212
- </div>
213
- `
214
- : ""}
215
- <div class="markdown-content">
216
- ${this.renderMarkdown(this.content)}
217
- </div>
218
- </div>
219
- `;
220
- }
221
-
222
- private renderMarkdown(markdown: string): any {
223
- // Simple markdown rendering - you might want to use a proper markdown parser
224
- let htmlContent = markdown
225
- // Headers
226
- .replace(/^### (.*$)/gim, "<h3>$1</h3>")
227
- .replace(/^## (.*$)/gim, "<h2>$1</h2>")
228
- .replace(/^# (.*$)/gim, "<h1>$1</h1>")
229
- // Bold
230
- .replace(/\*\*(.*?)\*\*/g, "<strong>$1</strong>")
231
- // Italic
232
- .replace(/\*(.*?)\*/g, "<em>$1</em>")
233
- // Code blocks
234
- .replace(/```([\s\S]*?)```/g, "<pre><code>$1</code></pre>")
235
- // Inline code
236
- .replace(/`(.*?)`/g, "<code>$1</code>")
237
- // Links
238
- .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>')
239
- // Line breaks
240
- .replace(/\n/g, "<br>");
241
-
242
- return html`${htmlContent}`;
243
- }
244
- }
245
- );
246
-
247
- declare global {
248
- interface HTMLElementTagNameMap {
249
- "ds-markdown": any;
250
- }
251
- }
252
-
@@ -1,108 +0,0 @@
1
- import { LitElement, html, css } from "lit";
2
- import { currentLanguage } from "../utils/language";
3
- import type { LanguageCode } from "../utils/language";
4
- import { getPriceLabel } from "../utils/pricing";
5
-
6
- /**
7
- * A component for displaying the monthly price label based on language/region
8
- *
9
- * @element ds-price
10
- * @prop {string} country - Preferred country (overrides language mapping)
11
- * @prop {string} region - Alias for country; if provided, takes precedence over country
12
- */
13
- export class Price extends LitElement {
14
- static get properties() {
15
- return {
16
- country: { type: String, reflect: true },
17
- region: { type: String, reflect: true },
18
- _label: { type: String, state: true },
19
- _loading: { type: Boolean, state: true },
20
- };
21
- }
22
-
23
- declare country: string;
24
- declare region: string;
25
- declare _label: string;
26
- declare _loading: boolean;
27
- private boundHandlers: { languageChanged: EventListener };
28
-
29
- constructor() {
30
- super();
31
- this.country = "";
32
- this.region = "";
33
- this._label = "";
34
- this._loading = true;
35
-
36
- this.boundHandlers = {
37
- languageChanged: (() => {
38
- this._loadPrice();
39
- }) as EventListener,
40
- };
41
- }
42
-
43
- static styles = css`
44
- :host {
45
- display: inline;
46
- }
47
- .loading {
48
- opacity: 0.6;
49
- }
50
- `;
51
-
52
- connectedCallback() {
53
- super.connectedCallback();
54
- this._loadPrice();
55
- window.addEventListener(
56
- "language-changed",
57
- this.boundHandlers.languageChanged
58
- );
59
- window.addEventListener(
60
- "translations-loaded",
61
- this.boundHandlers.languageChanged
62
- );
63
- }
64
-
65
- disconnectedCallback() {
66
- super.disconnectedCallback();
67
- window.removeEventListener(
68
- "language-changed",
69
- this.boundHandlers.languageChanged
70
- );
71
- window.removeEventListener(
72
- "translations-loaded",
73
- this.boundHandlers.languageChanged
74
- );
75
- }
76
-
77
- updated(changed: Map<string, unknown>) {
78
- super.updated(changed);
79
- if (changed.has("country") || changed.has("region")) {
80
- this._loadPrice();
81
- }
82
- }
83
-
84
- private _loadPrice() {
85
- this._loading = true;
86
- const lang: LanguageCode = currentLanguage.value;
87
- const preferredCountry = this.region || this.country;
88
- const label = getPriceLabel({ language: lang, country: preferredCountry });
89
- this._label = label;
90
- this._loading = false;
91
- this.requestUpdate();
92
- }
93
-
94
- render() {
95
- return html`<span class="${this._loading ? "loading" : ""}"
96
- >${this._label}</span
97
- >`;
98
- }
99
- }
100
-
101
- customElements.define("ds-price", Price);
102
-
103
- declare global {
104
- interface HTMLElementTagNameMap {
105
- "ds-price": Price;
106
- }
107
- }
108
-
@@ -1,155 +0,0 @@
1
- import { LitElement, css, html } from "lit";
2
- import { setTheme, currentTheme } from "../utils/theme";
3
-
4
- /**
5
- * A component for theme toggle or project links (square or circle shape)
6
- *
7
- * @element ds-squarecircle
8
- * @prop {string} type - "theme-toggle" or "link"
9
- * @prop {string} shape - "square" or "circle"
10
- * @prop {string} href - URL for link type
11
- * @prop {string} project - Project name for color theming
12
- * @prop {boolean} loading - Loading state with pulse animation
13
- */
14
- export class SquareCircle extends LitElement {
15
- static get properties() {
16
- return {
17
- type: { type: String, reflect: true },
18
- shape: { type: String, reflect: true },
19
- href: { type: String },
20
- project: { type: String, reflect: true },
21
- loading: { type: Boolean, reflect: true },
22
- };
23
- }
24
-
25
- declare type: "theme-toggle" | "link";
26
- declare shape: "square" | "circle";
27
- declare href: string;
28
- declare project: string;
29
- declare loading: boolean;
30
-
31
- constructor() {
32
- super();
33
- this.type = "theme-toggle";
34
- this.shape = "circle";
35
- this.href = "";
36
- this.project = "";
37
- this.loading = false;
38
- }
39
-
40
- static styles = css`
41
- :host {
42
- background-color: light-dark(var(--black), var(--white));
43
- display: block;
44
- width: calc(120px * var(--scaling-factor));
45
- height: calc(120px * var(--scaling-factor));
46
- cursor: pointer;
47
- pointer-events: auto;
48
- position: relative;
49
- z-index: 1;
50
- }
51
-
52
- :host([shape="circle"]) {
53
- border-radius: 9999px;
54
- }
55
-
56
- :host([shape="circle"]) .wrapper,
57
- :host([shape="circle"]) .container {
58
- border-radius: 9999px;
59
- }
60
-
61
- .wrapper {
62
- width: 100%;
63
- height: 100%;
64
- cursor: pointer;
65
- pointer-events: auto;
66
- }
67
-
68
- .container {
69
- width: 100%;
70
- height: 100%;
71
- background-color: inherit;
72
- cursor: pointer;
73
- pointer-events: auto;
74
- }
75
-
76
- .container:hover {
77
- opacity: 0.8;
78
- }
79
-
80
- a {
81
- display: block;
82
- width: 100%;
83
- height: 100%;
84
- text-decoration: none;
85
- cursor: pointer;
86
- pointer-events: auto;
87
- }
88
-
89
- :host([loading]) {
90
- animation: gentle-pulse 2s ease-in-out infinite;
91
- }
92
-
93
- @keyframes gentle-pulse {
94
- 0% {
95
- opacity: 1;
96
- }
97
- 50% {
98
- opacity: 0.7;
99
- }
100
- 100% {
101
- opacity: 1;
102
- }
103
- }
104
- `;
105
-
106
- private _handleClick(e: Event) {
107
- if (this.type === "theme-toggle") {
108
- e.preventDefault();
109
- const newTheme = currentTheme.get() === "light" ? "dark" : "light";
110
- setTheme(newTheme);
111
- }
112
- }
113
-
114
- connectedCallback() {
115
- super.connectedCallback();
116
- this.addEventListener("click", (e) => {
117
- this._handleClick(e);
118
- });
119
- }
120
-
121
- render() {
122
- const content = html`<div
123
- class="container"
124
- @click="${(e: Event) => {
125
- this._handleClick(e);
126
- }}"
127
- ></div>`;
128
-
129
- if (this.type === "link" && this.href) {
130
- return html`
131
- <a href="${this.href}" @click="${this._handleClick}">${content}</a>
132
- `;
133
- }
134
-
135
- return html`
136
- <div
137
- class="wrapper"
138
- @click="${(e: Event) => {
139
- this._handleClick(e);
140
- }}"
141
- >
142
- ${content}
143
- </div>
144
- `;
145
- }
146
- }
147
-
148
- customElements.define("ds-squarecircle", SquareCircle);
149
-
150
- declare global {
151
- interface HTMLElementTagNameMap {
152
- "ds-squarecircle": SquareCircle;
153
- }
154
- }
155
-
@@ -1,139 +0,0 @@
1
- import { LitElement, html, css } from "lit";
2
- import { getText } from "../utils/language";
3
-
4
- /**
5
- * A component for displaying page titles with localization support
6
- *
7
- * @element ds-title
8
- * @prop {string} key - The translation key to use
9
- * @prop {string} defaultValue - Default value if translation is not found
10
- */
11
- export class Title extends LitElement {
12
- private _gridArea = "";
13
-
14
- static get properties() {
15
- return {
16
- gridarea: { type: String, reflect: true },
17
- key: { type: String, reflect: true },
18
- defaultValue: { type: String, reflect: true, attribute: "default-value" },
19
- _text: { type: String, state: true },
20
- };
21
- }
22
-
23
- declare key: string;
24
- declare defaultValue: string;
25
- declare _text: string;
26
- private boundHandlers: { languageChanged: EventListener };
27
-
28
- set gridarea(value: string) {
29
- const oldValue = this._gridArea;
30
- this._gridArea = value;
31
- this.style.gridArea = value;
32
- this.requestUpdate("gridarea", oldValue);
33
- }
34
-
35
- get gridarea(): string {
36
- return this._gridArea;
37
- }
38
-
39
- static styles = css`
40
- :host {
41
- display: flex;
42
- padding: calc(2px * var(--scaling-factor));
43
- align-items: flex-start;
44
- }
45
-
46
- h1 {
47
- display: block;
48
- place-content: center;
49
- font-family: var(--typeface);
50
- color: light-dark(var(--black), var(--white));
51
- font-size: calc(36px * var(--scaling-factor));
52
- font-weight: 500;
53
- align-items: center;
54
- letter-spacing: -0.72px;
55
- margin: 0;
56
- height: 45px;
57
- }
58
-
59
- ::slotted(*) {
60
- margin: 0;
61
- width: 100%;
62
- }
63
- `;
64
-
65
- constructor() {
66
- super();
67
- this.key = "";
68
- this.defaultValue = "";
69
- this._text = "";
70
-
71
- this.boundHandlers = {
72
- languageChanged: (() => {
73
- this._loadText();
74
- }) as EventListener,
75
- };
76
- }
77
-
78
- connectedCallback() {
79
- super.connectedCallback();
80
- this._loadText();
81
- window.addEventListener(
82
- "language-changed",
83
- this.boundHandlers.languageChanged
84
- );
85
- }
86
-
87
- disconnectedCallback() {
88
- super.disconnectedCallback();
89
- window.removeEventListener(
90
- "language-changed",
91
- this.boundHandlers.languageChanged
92
- );
93
- }
94
-
95
- updated(changedProperties: Map<string, unknown>) {
96
- if (changedProperties.has("key") || changedProperties.has("defaultValue")) {
97
- this._loadText();
98
- }
99
- }
100
-
101
- _loadText() {
102
- if (!this.key) {
103
- this._text = this.defaultValue || "";
104
- return;
105
- }
106
-
107
- try {
108
- const text = getText(this.key);
109
- this._text = text || this.defaultValue || this.key;
110
- } catch (error) {
111
- console.error(
112
- `[ds-title] Error loading text for key "${this.key}":`,
113
- error
114
- );
115
- this._text = this.defaultValue || this.key;
116
- }
117
- }
118
-
119
- firstUpdated() {
120
- if (this.hasAttribute("gridarea")) {
121
- this.style.gridArea = this.getAttribute("gridarea") || "";
122
- }
123
- }
124
-
125
- render() {
126
- const hasKey = this.key && this._text;
127
-
128
- return html` <h1>${hasKey ? this._text : html`<slot></slot>`}</h1> `;
129
- }
130
- }
131
-
132
- customElements.define("ds-title", Title);
133
-
134
- declare global {
135
- interface HTMLElementTagNameMap {
136
- "ds-title": Title;
137
- }
138
- }
139
-