@sondor-technology/sondor-components 1.0.1-develop.13 → 1.0.1-develop.14

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 (226) hide show
  1. package/dist/components/alert/alert.constants.d.ts +3 -0
  2. package/dist/components/alert/alert.constants.d.ts.map +1 -0
  3. package/dist/components/alert/alert.constants.js +2 -0
  4. package/dist/components/alert/alert.constants.js.map +1 -0
  5. package/dist/components/alert/alert.d.ts +4 -3
  6. package/dist/components/alert/alert.d.ts.map +1 -1
  7. package/dist/components/alert/alert.js +21 -11
  8. package/dist/components/alert/alert.js.map +1 -0
  9. package/dist/components/badge/badge.constants.d.ts +3 -0
  10. package/dist/components/badge/badge.constants.d.ts.map +1 -0
  11. package/dist/components/badge/badge.constants.js +2 -0
  12. package/dist/components/badge/badge.constants.js.map +1 -0
  13. package/dist/components/badge/badge.d.ts +1 -1
  14. package/dist/components/badge/badge.d.ts.map +1 -1
  15. package/dist/components/badge/badge.js +3 -2
  16. package/dist/components/badge/badge.js.map +1 -0
  17. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  18. package/dist/components/breadcrumb/breadcrumb.js +2 -1
  19. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  20. package/dist/components/button/button.constants.d.ts +7 -0
  21. package/dist/components/button/button.constants.d.ts.map +1 -0
  22. package/dist/components/button/button.constants.js +4 -0
  23. package/dist/components/button/button.constants.js.map +1 -0
  24. package/dist/components/button/button.d.ts +8 -4
  25. package/dist/components/button/button.d.ts.map +1 -1
  26. package/dist/components/button/button.js +181 -137
  27. package/dist/components/button/button.js.map +1 -0
  28. package/dist/components/button-group/button-group.d.ts +1 -0
  29. package/dist/components/button-group/button-group.d.ts.map +1 -1
  30. package/dist/components/button-group/button-group.js +17 -21
  31. package/dist/components/button-group/button-group.js.map +1 -0
  32. package/dist/components/checkbox/checkbox.constants.d.ts +3 -0
  33. package/dist/components/checkbox/checkbox.constants.d.ts.map +1 -0
  34. package/dist/components/checkbox/checkbox.constants.js +2 -0
  35. package/dist/components/checkbox/checkbox.constants.js.map +1 -0
  36. package/dist/components/checkbox/checkbox.d.ts +5 -1
  37. package/dist/components/checkbox/checkbox.d.ts.map +1 -1
  38. package/dist/components/checkbox/checkbox.js +21 -5
  39. package/dist/components/checkbox/checkbox.js.map +1 -0
  40. package/dist/components/code-block/code-block.d.ts +7 -7
  41. package/dist/components/code-block/code-block.d.ts.map +1 -1
  42. package/dist/components/code-block/code-block.js +130 -66
  43. package/dist/components/code-block/code-block.js.map +1 -0
  44. package/dist/components/content-card/content-card.d.ts.map +1 -1
  45. package/dist/components/content-card/content-card.js +10 -15
  46. package/dist/components/content-card/content-card.js.map +1 -0
  47. package/dist/components/divider/divider.constants.d.ts +5 -0
  48. package/dist/components/divider/divider.constants.d.ts.map +1 -0
  49. package/dist/components/divider/divider.constants.js +3 -0
  50. package/dist/components/divider/divider.constants.js.map +1 -0
  51. package/dist/components/divider/divider.d.ts +4 -2
  52. package/dist/components/divider/divider.d.ts.map +1 -1
  53. package/dist/components/divider/divider.js +18 -9
  54. package/dist/components/divider/divider.js.map +1 -0
  55. package/dist/components/drawer/drawer.d.ts +7 -4
  56. package/dist/components/drawer/drawer.d.ts.map +1 -1
  57. package/dist/components/drawer/drawer.js +73 -30
  58. package/dist/components/drawer/drawer.js.map +1 -0
  59. package/dist/components/field/field.d.ts +2 -2
  60. package/dist/components/field/field.d.ts.map +1 -1
  61. package/dist/components/field/field.js +8 -9
  62. package/dist/components/field/field.js.map +1 -0
  63. package/dist/components/footer/footer.d.ts +8 -1
  64. package/dist/components/footer/footer.d.ts.map +1 -1
  65. package/dist/components/footer/footer.js +42 -12
  66. package/dist/components/footer/footer.js.map +1 -0
  67. package/dist/components/form/form-step.js +1 -0
  68. package/dist/components/form/form-step.js.map +1 -0
  69. package/dist/components/form/form.d.ts +3 -0
  70. package/dist/components/form/form.d.ts.map +1 -1
  71. package/dist/components/form/form.js +109 -69
  72. package/dist/components/form/form.js.map +1 -0
  73. package/dist/components/grid/grid-row.d.ts +3 -3
  74. package/dist/components/grid/grid-row.d.ts.map +1 -1
  75. package/dist/components/grid/grid-row.js +36 -22
  76. package/dist/components/grid/grid-row.js.map +1 -0
  77. package/dist/components/grid/grid.d.ts +2 -2
  78. package/dist/components/grid/grid.d.ts.map +1 -1
  79. package/dist/components/grid/grid.js +5 -2
  80. package/dist/components/grid/grid.js.map +1 -0
  81. package/dist/components/icon/icon-paths.d.ts +161 -86
  82. package/dist/components/icon/icon-paths.d.ts.map +1 -1
  83. package/dist/components/icon/icon-paths.js +176 -106
  84. package/dist/components/icon/icon-paths.js.map +1 -0
  85. package/dist/components/icon/icon.d.ts +1 -1
  86. package/dist/components/icon/icon.d.ts.map +1 -1
  87. package/dist/components/icon/icon.js +6 -5
  88. package/dist/components/icon/icon.js.map +1 -0
  89. package/dist/components/input/input.d.ts +9 -0
  90. package/dist/components/input/input.d.ts.map +1 -1
  91. package/dist/components/input/input.js +30 -37
  92. package/dist/components/input/input.js.map +1 -0
  93. package/dist/components/link/link.d.ts +6 -6
  94. package/dist/components/link/link.d.ts.map +1 -1
  95. package/dist/components/link/link.js +42 -19
  96. package/dist/components/link/link.js.map +1 -0
  97. package/dist/components/metadata/metadata.d.ts +3 -3
  98. package/dist/components/metadata/metadata.d.ts.map +1 -1
  99. package/dist/components/metadata/metadata.js +23 -20
  100. package/dist/components/metadata/metadata.js.map +1 -0
  101. package/dist/components/modal/modal.d.ts +4 -16
  102. package/dist/components/modal/modal.d.ts.map +1 -1
  103. package/dist/components/modal/modal.js +99 -62
  104. package/dist/components/modal/modal.js.map +1 -0
  105. package/dist/components/page-layout/page-layout.d.ts +4 -3
  106. package/dist/components/page-layout/page-layout.d.ts.map +1 -1
  107. package/dist/components/page-layout/page-layout.js +95 -68
  108. package/dist/components/page-layout/page-layout.js.map +1 -0
  109. package/dist/components/radio/radio.d.ts +8 -0
  110. package/dist/components/radio/radio.d.ts.map +1 -1
  111. package/dist/components/radio/radio.js +8 -12
  112. package/dist/components/radio/radio.js.map +1 -0
  113. package/dist/components/radio-group/radio-group.d.ts +6 -1
  114. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  115. package/dist/components/radio-group/radio-group.js +44 -18
  116. package/dist/components/radio-group/radio-group.js.map +1 -0
  117. package/dist/components/router/router.d.ts +5 -7
  118. package/dist/components/router/router.d.ts.map +1 -1
  119. package/dist/components/router/router.js +54 -38
  120. package/dist/components/router/router.js.map +1 -0
  121. package/dist/components/select/select.d.ts +1 -3
  122. package/dist/components/select/select.d.ts.map +1 -1
  123. package/dist/components/select/select.js +14 -5
  124. package/dist/components/select/select.js.map +1 -0
  125. package/dist/components/skeleton/skeleton.d.ts +3 -2
  126. package/dist/components/skeleton/skeleton.d.ts.map +1 -1
  127. package/dist/components/skeleton/skeleton.js +10 -13
  128. package/dist/components/skeleton/skeleton.js.map +1 -0
  129. package/dist/components/switch/switch.d.ts +12 -0
  130. package/dist/components/switch/switch.d.ts.map +1 -1
  131. package/dist/components/switch/switch.js +28 -22
  132. package/dist/components/switch/switch.js.map +1 -0
  133. package/dist/components/table/data-table.d.ts +3 -25
  134. package/dist/components/table/data-table.d.ts.map +1 -1
  135. package/dist/components/table/data-table.js +211 -146
  136. package/dist/components/table/data-table.js.map +1 -0
  137. package/dist/components/table/table.d.ts +3 -3
  138. package/dist/components/table/table.d.ts.map +1 -1
  139. package/dist/components/table/table.js +39 -20
  140. package/dist/components/table/table.js.map +1 -0
  141. package/dist/components/tabs/tab-panel.d.ts +3 -1
  142. package/dist/components/tabs/tab-panel.d.ts.map +1 -1
  143. package/dist/components/tabs/tab-panel.js +21 -11
  144. package/dist/components/tabs/tab-panel.js.map +1 -0
  145. package/dist/components/tabs/tab.d.ts +5 -1
  146. package/dist/components/tabs/tab.d.ts.map +1 -1
  147. package/dist/components/tabs/tab.js +46 -28
  148. package/dist/components/tabs/tab.js.map +1 -0
  149. package/dist/components/tabs/tabs.d.ts +4 -0
  150. package/dist/components/tabs/tabs.d.ts.map +1 -1
  151. package/dist/components/tabs/tabs.js +76 -13
  152. package/dist/components/tabs/tabs.js.map +1 -0
  153. package/dist/components/textarea/textarea.d.ts +13 -0
  154. package/dist/components/textarea/textarea.d.ts.map +1 -1
  155. package/dist/components/textarea/textarea.js +59 -13
  156. package/dist/components/textarea/textarea.js.map +1 -0
  157. package/dist/components/theme-toggle/theme-toggle.constants.d.ts +3 -0
  158. package/dist/components/theme-toggle/theme-toggle.constants.d.ts.map +1 -0
  159. package/dist/components/theme-toggle/theme-toggle.constants.js +2 -0
  160. package/dist/components/theme-toggle/theme-toggle.constants.js.map +1 -0
  161. package/dist/components/theme-toggle/theme-toggle.d.ts +3 -2
  162. package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
  163. package/dist/components/theme-toggle/theme-toggle.js +46 -19
  164. package/dist/components/theme-toggle/theme-toggle.js.map +1 -0
  165. package/dist/components/vertical-nav/vertical-nav-group.d.ts +5 -2
  166. package/dist/components/vertical-nav/vertical-nav-group.d.ts.map +1 -1
  167. package/dist/components/vertical-nav/vertical-nav-group.js +50 -14
  168. package/dist/components/vertical-nav/vertical-nav-group.js.map +1 -0
  169. package/dist/components/vertical-nav/vertical-nav-item.d.ts +3 -2
  170. package/dist/components/vertical-nav/vertical-nav-item.d.ts.map +1 -1
  171. package/dist/components/vertical-nav/vertical-nav-item.js +30 -8
  172. package/dist/components/vertical-nav/vertical-nav-item.js.map +1 -0
  173. package/dist/styles/index.css +48 -17
  174. package/dist/styles/reset.js +1 -0
  175. package/dist/styles/reset.js.map +1 -0
  176. package/package.json +2 -1
  177. package/src/components/alert/alert.constants.ts +2 -0
  178. package/src/components/alert/alert.ts +24 -15
  179. package/src/components/badge/badge.constants.ts +2 -0
  180. package/src/components/badge/badge.ts +3 -4
  181. package/src/components/breadcrumb/breadcrumb.ts +2 -2
  182. package/src/components/button/button.constants.ts +8 -0
  183. package/src/components/button/button.ts +184 -144
  184. package/src/components/button-group/button-group.ts +18 -22
  185. package/src/components/checkbox/checkbox.constants.ts +2 -0
  186. package/src/components/checkbox/checkbox.ts +33 -18
  187. package/src/components/code-block/code-block.ts +151 -84
  188. package/src/components/content-card/content-card.ts +10 -16
  189. package/src/components/divider/divider.constants.ts +5 -0
  190. package/src/components/divider/divider.ts +22 -11
  191. package/src/components/drawer/drawer.ts +79 -34
  192. package/src/components/field/field.ts +9 -11
  193. package/src/components/footer/footer.ts +43 -12
  194. package/src/components/form/form.ts +121 -84
  195. package/src/components/grid/grid-row.ts +45 -32
  196. package/src/components/grid/grid.ts +7 -4
  197. package/src/components/icon/icon-paths.ts +175 -106
  198. package/src/components/icon/icon.ts +6 -6
  199. package/src/components/input/input.ts +32 -42
  200. package/src/components/link/link.ts +45 -21
  201. package/src/components/metadata/metadata.ts +26 -24
  202. package/src/components/modal/modal.ts +108 -74
  203. package/src/components/page-layout/page-layout.ts +97 -72
  204. package/src/components/radio/radio.ts +8 -13
  205. package/src/components/radio-group/radio-group.ts +45 -21
  206. package/src/components/router/router.ts +73 -50
  207. package/src/components/select/select.ts +18 -19
  208. package/src/components/skeleton/skeleton.ts +14 -14
  209. package/src/components/switch/switch.ts +31 -25
  210. package/src/components/table/data-table.ts +248 -177
  211. package/src/components/table/table.ts +52 -29
  212. package/src/components/tabs/tab-panel.ts +25 -13
  213. package/src/components/tabs/tab.ts +58 -33
  214. package/src/components/tabs/tabs.ts +77 -15
  215. package/src/components/textarea/textarea.ts +63 -15
  216. package/src/components/theme-toggle/theme-toggle.constants.ts +2 -0
  217. package/src/components/theme-toggle/theme-toggle.ts +47 -22
  218. package/src/components/vertical-nav/vertical-nav-group.ts +57 -18
  219. package/src/components/vertical-nav/vertical-nav-item.ts +35 -12
  220. package/src/styles/globals.css +27 -4
  221. package/src/styles/theme.css +38 -32
  222. package/tsconfig.json +2 -1
  223. package/dist/components/card/card.d.ts +0 -11
  224. package/dist/components/card/card.d.ts.map +0 -1
  225. package/dist/components/card/card.js +0 -54
  226. package/src/components/card/card.ts +0 -53
@@ -1,15 +1,15 @@
1
- import { LitElement, html, css } from 'lit';
2
- import { customElement, property, state, query } from 'lit/decorators.js';
3
- import { unsafeHTML } from 'lit/directives/unsafe-html.js';
4
- import { resetStyles } from '../../styles/reset.js';
5
-
6
- import Prism from 'prismjs';
7
- import 'prismjs/components/prism-typescript.js';
8
- import 'prismjs/components/prism-javascript.js';
9
- import 'prismjs/components/prism-css.js';
10
- import 'prismjs/components/prism-json.js';
11
- import 'prismjs/components/prism-bash.js';
12
- import 'prismjs/components/prism-csharp.js';
1
+ import {LitElement, html, css} from "lit";
2
+ import {customElement, property, state, query} from "lit/decorators.js";
3
+ import {unsafeHTML} from "lit/directives/unsafe-html.js";
4
+ import {resetStyles} from "../../styles/reset.js";
5
+
6
+ import Prism from "prismjs";
7
+ import "prismjs/components/prism-typescript.js";
8
+ import "prismjs/components/prism-javascript.js";
9
+ import "prismjs/components/prism-css.js";
10
+ import "prismjs/components/prism-json.js";
11
+ import "prismjs/components/prism-bash.js";
12
+ import "prismjs/components/prism-csharp.js";
13
13
 
14
14
  interface CodeSnippet {
15
15
  lang: string;
@@ -18,11 +18,11 @@ interface CodeSnippet {
18
18
  highlightedCode: string;
19
19
  }
20
20
 
21
- @customElement('st-code-block')
21
+ @customElement("st-code-block")
22
22
  export class StCodeBlock extends LitElement {
23
23
  // Fallback language if a template doesn't provide one
24
- @property({ type: String }) language = 'typescript';
25
-
24
+ @property({type: String}) language = "typescript";
25
+
26
26
  @state() private _snippets: CodeSnippet[] = [];
27
27
  @state() private _activeIndex = 0;
28
28
  @state() private _copied = false;
@@ -36,7 +36,8 @@ export class StCodeBlock extends LitElement {
36
36
  display: block;
37
37
  margin: var(--st-spacing-md) 0;
38
38
  border-radius: 8px;
39
- background-color: var(--st-color-surface);
39
+ /* 1. Lock background to a deep dark surface */
40
+ background-color: #161b22;
40
41
  border: 1px solid var(--st-color-border);
41
42
  overflow: hidden;
42
43
  }
@@ -45,8 +46,9 @@ export class StCodeBlock extends LitElement {
45
46
  display: flex;
46
47
  justify-content: space-between;
47
48
  align-items: center;
48
- background-color: rgba(0, 0, 0, 0.2);
49
- border-bottom: 1px solid var(--st-color-border);
49
+ /* 2. Lock header to a slightly darker shade */
50
+ background-color: #0d1117;
51
+ border-bottom: 1px solid #30363d;
50
52
  padding: 0 var(--st-spacing-md);
51
53
  min-height: 2.5rem; /* 40px */
52
54
  }
@@ -54,7 +56,7 @@ export class StCodeBlock extends LitElement {
54
56
  /* Single language label */
55
57
  .language-label {
56
58
  font-size: var(--st-font-size-xs);
57
- color: var(--st-color-text-muted);
59
+ color: #8b949e;
58
60
  text-transform: uppercase;
59
61
  letter-spacing: 0.05em;
60
62
  font-weight: var(--st-font-weight-bold);
@@ -71,7 +73,7 @@ export class StCodeBlock extends LitElement {
71
73
  background: transparent;
72
74
  border: none;
73
75
  border-bottom: 2px solid transparent;
74
- color: var(--st-color-text-muted);
76
+ color: #8b949e;
75
77
  font-size: var(--st-font-size-xs);
76
78
  font-weight: var(--st-font-weight-medium);
77
79
  padding: var(--st-spacing-xs) 0;
@@ -80,19 +82,20 @@ export class StCodeBlock extends LitElement {
80
82
  }
81
83
 
82
84
  .tab:hover {
83
- color: var(--st-color-text);
85
+ color: #c9d1d9;
84
86
  }
85
87
 
86
88
  .tab.active {
87
- color: var(--st-color-primary);
88
- border-bottom-color: var(--st-color-primary);
89
+ /* 3. Hardcode the active tab to a high-contrast blue instead of dynamic primary */
90
+ color: #79c0ff;
91
+ border-bottom-color: #79c0ff;
89
92
  }
90
93
 
91
94
  /* Copy Button */
92
95
  .copy-button {
93
96
  background: transparent;
94
97
  border: 1px solid transparent;
95
- color: var(--st-color-text-muted);
98
+ color: #8b949e;
96
99
  cursor: pointer;
97
100
  display: flex;
98
101
  align-items: center;
@@ -105,8 +108,8 @@ export class StCodeBlock extends LitElement {
105
108
  }
106
109
 
107
110
  .copy-button:hover {
108
- color: var(--st-color-text);
109
- background-color: rgba(255, 255, 255, 0.05);
111
+ color: #c9d1d9;
112
+ background-color: rgba(255, 255, 255, 0.1);
110
113
  }
111
114
 
112
115
  .copy-button svg {
@@ -120,17 +123,20 @@ export class StCodeBlock extends LitElement {
120
123
  }
121
124
 
122
125
  .copy-button.copied {
123
- color: var(--st-color-success);
126
+ color: #3fb950; /* High-contrast success green */
124
127
  }
125
128
 
126
129
  pre {
127
130
  margin: 0;
128
131
  padding: var(--st-spacing-md);
129
132
  overflow-x: auto;
130
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
133
+ font-family:
134
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
135
+ monospace;
131
136
  font-size: 0.875rem;
132
137
  line-height: 1.5;
133
- color: var(--st-color-text);
138
+ /* 4. Ensure default text stays light */
139
+ color: #c9d1d9;
134
140
  }
135
141
 
136
142
  .raw-content {
@@ -140,76 +146,130 @@ export class StCodeBlock extends LitElement {
140
146
  /* ==========================================================
141
147
  Prism.js Theme Mapping (Space Grey / Purple Aesthetic)
142
148
  ========================================================== */
143
- .token.comment, .token.prolog, .token.doctype, .token.cdata { color: var(--st-color-text-muted); font-style: italic; }
144
- .token.punctuation { color: #8b949e; }
145
- .token.namespace { opacity: .7; }
146
- .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #79c0ff; }
147
- .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #a5d6ff; }
148
- .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: var(--st-color-text); }
149
- .token.atrule, .token.attr-value, .token.keyword { color: var(--st-color-primary); }
150
- .token.function, .token.class-name { color: #d2a8ff; }
151
- .token.regex, .token.important, .token.variable { color: #ffa657; }
152
- `
149
+ .token.comment,
150
+ .token.prolog,
151
+ .token.doctype,
152
+ .token.cdata {
153
+ color: #8b949e;
154
+ font-style: italic;
155
+ }
156
+ .token.punctuation {
157
+ color: #8b949e;
158
+ }
159
+ .token.namespace {
160
+ opacity: 0.7;
161
+ }
162
+ .token.property,
163
+ .token.tag,
164
+ .token.boolean,
165
+ .token.number,
166
+ .token.constant,
167
+ .token.symbol,
168
+ .token.deleted {
169
+ color: #79c0ff;
170
+ }
171
+ .token.selector,
172
+ .token.attr-name,
173
+ .token.string,
174
+ .token.char,
175
+ .token.builtin,
176
+ .token.inserted {
177
+ color: #a5d6ff;
178
+ }
179
+
180
+ /* Replaced var(--st-color-text) with #c9d1d9 */
181
+ .token.operator,
182
+ .token.entity,
183
+ .token.url,
184
+ .language-css .token.string,
185
+ .style .token.string {
186
+ color: #c9d1d9;
187
+ }
188
+
189
+ /* Replaced var(--st-color-primary) with #ff7b72 (High-contrast pink/red for keywords) */
190
+ .token.atrule,
191
+ .token.attr-value,
192
+ .token.keyword {
193
+ color: #ff7b72;
194
+ }
195
+
196
+ .token.function,
197
+ .token.class-name {
198
+ color: #d2a8ff;
199
+ }
200
+ .token.regex,
201
+ .token.important,
202
+ .token.variable {
203
+ color: #ffa657;
204
+ }
205
+ `,
153
206
  ];
154
207
 
155
208
  private _handleSlotChange() {
156
- const nodes = this._slot.assignedNodes({ flatten: true });
157
-
209
+ const nodes = this._slot.assignedNodes({flatten: true});
210
+
158
211
  // Find ALL template tags passed into the slot
159
- const templates = nodes.filter(n => n instanceof HTMLTemplateElement) as HTMLTemplateElement[];
160
-
212
+ const templates = nodes.filter(
213
+ (n) => n instanceof HTMLTemplateElement,
214
+ ) as HTMLTemplateElement[];
215
+
161
216
  if (templates.length > 0) {
162
217
  // Map over every template and parse its code and attributes
163
- this._snippets = templates.map(template => {
164
- const lang = template.getAttribute('data-lang') || this.language;
165
- const label = template.getAttribute('data-label') || lang; // Fallback to lang if no label provided
218
+ this._snippets = templates.map((template) => {
219
+ const lang = template.getAttribute("data-lang") || this.language;
220
+ const label = template.getAttribute("data-label") || lang; // Fallback to lang if no label provided
166
221
  const rawCode = this._dedent(template.innerHTML);
167
-
222
+
168
223
  const grammar = Prism.languages[lang] || Prism.languages.javascript;
169
224
  const highlightedCode = Prism.highlight(rawCode, grammar, lang);
170
-
171
- return { lang, label, rawCode, highlightedCode };
225
+
226
+ return {lang, label, rawCode, highlightedCode};
172
227
  });
173
228
  } else {
174
229
  // Fallback: If no template is used, process raw text just like before
175
- const rawText = nodes.map(n => n.textContent).join('');
230
+ const rawText = nodes.map((n) => n.textContent).join("");
176
231
  const rawCode = this._dedent(rawText);
177
-
232
+
178
233
  if (rawCode) {
179
234
  const grammar = Prism.languages[this.language] || Prism.languages.javascript;
180
235
  const highlightedCode = Prism.highlight(rawCode, grammar, this.language);
181
- this._snippets = [{ lang: this.language, label: this.language, rawCode, highlightedCode }];
236
+ this._snippets = [{lang: this.language, label: this.language, rawCode, highlightedCode}];
182
237
  }
183
238
  }
184
-
239
+
185
240
  // Reset to the first tab whenever new code is injected
186
241
  this._activeIndex = 0;
187
242
  }
188
243
 
189
244
  private _dedent(text: string): string {
190
- const lines = text.split('\n');
245
+ const lines = text.split("\n");
191
246
  const minIndent = lines
192
- .filter(line => line.trim().length > 0)
247
+ .filter((line) => line.trim().length > 0)
193
248
  .reduce((min, line) => {
194
249
  const indent = line.match(/^\s*/)?.[0].length || 0;
195
250
  return Math.min(min, indent);
196
251
  }, Infinity);
197
252
 
198
253
  if (minIndent === Infinity || minIndent === 0) return text.trim();
199
- return lines.map(line => line.slice(minIndent)).join('\n').trim();
254
+ return lines
255
+ .map((line) => line.slice(minIndent))
256
+ .join("\n")
257
+ .trim();
200
258
  }
201
259
 
202
260
  private async _copyToClipboard() {
203
261
  // Copy the code from the currently active tab
204
262
  const activeSnippet = this._snippets[this._activeIndex];
205
263
  if (!activeSnippet) return;
206
-
264
+
207
265
  try {
208
266
  await navigator.clipboard.writeText(activeSnippet.rawCode);
209
267
  this._copied = true;
210
- setTimeout(() => { this._copied = false; }, 2000);
268
+ setTimeout(() => {
269
+ this._copied = false;
270
+ }, 2000);
211
271
  } catch (err) {
212
- console.error('Failed to copy text: ', err);
272
+ console.error("Failed to copy text: ", err);
213
273
  }
214
274
  }
215
275
 
@@ -218,37 +278,44 @@ export class StCodeBlock extends LitElement {
218
278
 
219
279
  return html`
220
280
  <div class="header">
221
- ${this._snippets.length > 1
281
+ ${this._snippets.length > 1
222
282
  ? html`
223
283
  <div class="tabs">
224
- ${this._snippets.map((snippet, index) => html`
225
- <button
226
- class="tab ${index === this._activeIndex ? 'active' : ''}"
227
- @click=${() => this._activeIndex = index}
228
- >
229
- ${snippet.label}
230
- </button>
231
- `)}
284
+ ${this._snippets.map(
285
+ (snippet, index) => html`
286
+ <button
287
+ class="tab ${index === this._activeIndex ? "active" : ""}"
288
+ @click=${() => (this._activeIndex = index)}
289
+ >
290
+ ${snippet.label}
291
+ </button>
292
+ `,
293
+ )}
232
294
  </div>
233
- `
234
- : html`
235
- <span class="language-label">${activeSnippet?.label || this.language}</span>
236
295
  `
237
- }
238
-
239
- <button class="copy-button ${this._copied ? 'copied' : ''}" @click=${this._copyToClipboard}>
240
- ${this._copied
241
- ? html`<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg> Copied!`
242
- : html`<svg viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg> Copy`
243
- }
296
+ : html` <span class="language-label">${activeSnippet?.label || this.language}</span> `}
297
+
298
+ <button class="copy-button ${this._copied ? "copied" : ""}" @click=${this._copyToClipboard}>
299
+ ${this._copied
300
+ ? html`<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>
301
+ Copied!`
302
+ : html`<svg viewBox="0 0 24 24">
303
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
304
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
305
+ </svg>
306
+ Copy`}
244
307
  </button>
245
308
  </div>
246
-
309
+
247
310
  <!-- Render the currently active snippet -->
248
- ${activeSnippet ? html`
249
- <pre><code class="language-${activeSnippet.lang}">${unsafeHTML(activeSnippet.highlightedCode)}</code></pre>
250
- ` : ''}
251
-
311
+ ${activeSnippet
312
+ ? html`
313
+ <pre><code class="language-${activeSnippet.lang}">${unsafeHTML(
314
+ activeSnippet.highlightedCode,
315
+ )}</code></pre>
316
+ `
317
+ : ""}
318
+
252
319
  <div class="raw-content">
253
320
  <slot name="raw" @slotchange=${this._handleSlotChange}></slot>
254
321
  </div>
@@ -260,4 +327,4 @@ declare global {
260
327
  interface HTMLElementTagNameMap {
261
328
  "st-code-block": StCodeBlock;
262
329
  }
263
- }
330
+ }
@@ -1,10 +1,10 @@
1
1
  import { LitElement, html, css } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
+ import { ifDefined } from 'lit/directives/if-defined.js';
3
4
  import { resetStyles } from '../../styles/reset.js';
4
5
 
5
6
  @customElement('st-content-card')
6
7
  export class StContentCard extends LitElement {
7
- // Use href to align with native HTML web standards
8
8
  @property({ type: String }) href?: string;
9
9
  @property({ type: String }) target: '_blank' | '_self' = '_self';
10
10
 
@@ -13,7 +13,6 @@ export class StContentCard extends LitElement {
13
13
  css`
14
14
  :host {
15
15
  display: block;
16
- /* Ensures cards stretch to equal heights if placed in a flex/grid container */
17
16
  height: 100%;
18
17
  }
19
18
 
@@ -27,8 +26,6 @@ export class StContentCard extends LitElement {
27
26
  overflow: hidden;
28
27
  text-decoration: none;
29
28
  color: inherit;
30
-
31
- /* Smooth transitions for the hover effects */
32
29
  transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
33
30
  }
34
31
 
@@ -44,13 +41,11 @@ export class StContentCard extends LitElement {
44
41
  outline: none;
45
42
  border-color: var(--st-color-primary);
46
43
  transform: translateY(-2px);
47
- /* Subtle shadow to lift the card off the background */
48
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
49
- }
50
-
51
- /* Dark mode specific shadow adjustment */
52
- :host-context([data-theme="dark"]) a.card:hover {
53
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
44
+ /*
45
+ Safari fix: WebKit ignores :host-context.
46
+ Set --st-card-shadow-hover in your global dark mode CSS instead!
47
+ */
48
+ box-shadow: var(--st-card-shadow-hover, 0 4px 12px rgba(0, 0, 0, 0.05));
54
49
  }
55
50
 
56
51
  /* ==========================================================
@@ -66,14 +61,12 @@ export class StContentCard extends LitElement {
66
61
  overflow: hidden;
67
62
  }
68
63
 
69
- /* Image formatting */
70
64
  ::slotted(img[slot="media"]) {
71
65
  width: 100%;
72
66
  height: 100%;
73
67
  object-fit: cover;
74
68
  }
75
69
 
76
- /* SVG formatting (for the icons we just created) */
77
70
  ::slotted(svg[slot="media"]) {
78
71
  width: 3rem;
79
72
  height: 3rem;
@@ -105,7 +98,6 @@ export class StContentCard extends LitElement {
105
98
  ];
106
99
 
107
100
  render() {
108
- // 1. Define the inner content once to avoid duplication
109
101
  const innerContent = html`
110
102
  <div class="media">
111
103
  <slot name="media"></slot>
@@ -120,9 +112,11 @@ export class StContentCard extends LitElement {
120
112
  </div>
121
113
  `;
122
114
 
123
- // 2. Conditionally wrap it in an anchor or a div
115
+ // 🚀 THE FIX: Conditionally apply security rel if opening in a new tab
116
+ const secureRel = this.target === '_blank' ? 'noopener noreferrer' : undefined;
117
+
124
118
  return this.href
125
- ? html`<a href="${this.href}" target="${this.target}" class="card">${innerContent}</a>`
119
+ ? html`<a href="${this.href}" target="${this.target}" rel="${ifDefined(secureRel)}" class="card">${innerContent}</a>`
126
120
  : html`<div class="card">${innerContent}</div>`;
127
121
  }
128
122
  }
@@ -0,0 +1,5 @@
1
+ export const dividerDirections = ['horizontal', 'vertical'] as const;
2
+ export type DividerDirection = typeof dividerDirections[number];
3
+
4
+ export const dividerColors = ['default', 'primary', 'border'] as const;
5
+ export type DividerColor = typeof dividerColors[number];
@@ -1,13 +1,14 @@
1
1
  import { LitElement, html, css } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import { resetStyles } from '../../styles/reset.js';
4
+ import { DividerColor, DividerDirection } from './divider.constants.js';
4
5
 
5
6
  @customElement('st-divider')
6
7
  export class StDivider extends LitElement {
7
- @property({ type: String, reflect: true }) direction: 'horizontal' | 'vertical' = 'horizontal';
8
+ @property({ type: String, reflect: true }) direction: DividerDirection = 'horizontal';
8
9
  @property({ type: String }) thickness = '1px';
9
10
  @property({ type: String }) margin = '0';
10
- @property({ type: String, reflect: true }) color: 'default' | 'primary' | 'border' = 'border';
11
+ @property({ type: String, reflect: true }) color: DividerColor = 'border';
11
12
 
12
13
  static styles = [
13
14
  resetStyles,
@@ -43,22 +44,32 @@ export class StDivider extends LitElement {
43
44
  `
44
45
  ];
45
46
 
47
+ connectedCallback() {
48
+ super.connectedCallback();
49
+ // Semantic role belongs on the host element
50
+ if (!this.hasAttribute('role')) {
51
+ this.setAttribute('role', 'separator');
52
+ }
53
+ }
54
+
46
55
  updated(changedProperties: Map<string, any>) {
47
56
  super.updated(changedProperties);
48
57
 
49
58
  // Sync properties to CSS variables for dynamic adjustment
50
- this.style.setProperty('--divider-thickness', this.thickness);
51
- this.style.setProperty('--divider-margin', this.margin);
59
+ if (changedProperties.has('thickness') || changedProperties.has('margin')) {
60
+ this.style.setProperty('--divider-thickness', this.thickness);
61
+ this.style.setProperty('--divider-margin', this.margin);
62
+ }
63
+
64
+ // Keep native ARIA attributes perfectly synced with our Lit properties
65
+ if (changedProperties.has('direction')) {
66
+ this.setAttribute('aria-orientation', this.direction);
67
+ }
52
68
  }
53
69
 
54
70
  render() {
55
- // Accessibility: Set role and aria-orientation
56
- return html`
57
- <div
58
- role="separator"
59
- aria-orientation="${this.direction === 'horizontal' ? 'horizontal' : 'vertical'}"
60
- ></div>
61
- `;
71
+ // The host element itself is the structural divider. No inner DOM bloat needed.
72
+ return html``;
62
73
  }
63
74
  }
64
75