@dataengineeringformachinelearning/viking-ui 4.0.4 → 4.0.6

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 (246) hide show
  1. package/README.md +35 -11
  2. package/dist/README.md +35 -11
  3. package/dist/design-tokens.css +300 -85
  4. package/dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs +100 -64
  5. package/dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs.map +1 -1
  6. package/dist/icons.js +306 -0
  7. package/dist/package.json +24 -5
  8. package/{src/lib/site-drakkar/site-drakkar.config.ts → dist/site-drakkar.js} +64 -130
  9. package/dist/src/tokens/viking-tokens.json +9 -7
  10. package/dist/types/dataengineeringformachinelearning-viking-ui.d.ts +97 -3
  11. package/dist/viking-components.css +161 -70
  12. package/dist/viking-tokens.json +9 -7
  13. package/dist/viking-ui-elements.js +44 -32
  14. package/dist/viking-ui.css +1 -1
  15. package/dist/web-components.js +44 -32
  16. package/package.json +30 -8
  17. package/dist/scripts/build-web-components.mjs +0 -37
  18. package/dist/src/web/badge/viking-badge-wc.ts +0 -116
  19. package/dist/src/web/button/viking-button-wc.ts +0 -165
  20. package/dist/src/web/callout/viking-callout-wc.ts +0 -105
  21. package/dist/src/web/card/viking-card-wc.ts +0 -67
  22. package/dist/src/web/core/base.ts +0 -56
  23. package/dist/src/web/core/dom.ts +0 -53
  24. package/dist/src/web/core/icons-inline.ts +0 -44
  25. package/dist/src/web/core/styles.ts +0 -1261
  26. package/dist/src/web/core/types.ts +0 -19
  27. package/dist/src/web/field/viking-field-wc.ts +0 -154
  28. package/dist/src/web/index.ts +0 -73
  29. package/dist/src/web/input/viking-input-wc.ts +0 -211
  30. package/dist/src/web/modal/viking-modal-wc.ts +0 -187
  31. package/dist/src/web/search-palette/viking-search-palette-wc.ts +0 -495
  32. package/dist/src/web/select/viking-select-wc.ts +0 -218
  33. package/dist/src/web/suite-header/viking-suite-header-wc.ts +0 -729
  34. package/dist/src/web/suite-search-palette/viking-suite-search-palette-wc.ts +0 -234
  35. package/dist/src/web/theme-toggle/viking-theme-toggle-wc.ts +0 -139
  36. package/dist/src/web/types.ts +0 -37
  37. package/dist/src/web/web-components.spec.ts +0 -297
  38. package/src/assets/drakkar-favicon.svg +0 -17
  39. package/src/assets/fonts/inter/InterVariable-Italic.woff2 +0 -0
  40. package/src/assets/fonts/inter/InterVariable.woff2 +0 -0
  41. package/src/core/brand/deml-lockup.svg +0 -5
  42. package/src/core/brand/deml-mark-compact.svg +0 -4
  43. package/src/core/brand/deml-mark-filled.svg +0 -3
  44. package/src/core/brand/deml-mark-outline.svg +0 -4
  45. package/src/core/brand-icons.ts +0 -62
  46. package/src/core/icons.spec.ts +0 -52
  47. package/src/core/icons.ts +0 -206
  48. package/src/core/integration-brand-icons.ts +0 -77
  49. package/src/core/lucide-paths.generated.ts +0 -130
  50. package/src/core/types.ts +0 -85
  51. package/src/core/uid.ts +0 -7
  52. package/src/elements/button/viking-button.ts +0 -201
  53. package/src/elements/card/viking-card.ts +0 -60
  54. package/src/elements/core/dom.ts +0 -33
  55. package/src/elements/core/styles.ts +0 -28
  56. package/src/elements/modal/viking-modal.ts +0 -154
  57. package/src/index.ts +0 -1
  58. package/src/lib/accordion/accordion.ts +0 -126
  59. package/src/lib/app-header/app-header.scss +0 -274
  60. package/src/lib/app-header/app-header.ts +0 -43
  61. package/src/lib/app-sidebar/app-sidebar.scss +0 -415
  62. package/src/lib/app-sidebar/app-sidebar.ts +0 -29
  63. package/src/lib/auth-panel/auth-panel.spec.ts +0 -132
  64. package/src/lib/auth-panel/auth-panel.ts +0 -228
  65. package/src/lib/autocomplete/autocomplete.ts +0 -223
  66. package/src/lib/avatar/avatar.ts +0 -126
  67. package/src/lib/badge/badge.ts +0 -182
  68. package/src/lib/bar/bar.ts +0 -31
  69. package/src/lib/brand/brand.ts +0 -60
  70. package/src/lib/breadcrumbs/breadcrumbs.ts +0 -81
  71. package/src/lib/button/button-group.ts +0 -40
  72. package/src/lib/button/button.scss +0 -119
  73. package/src/lib/button/button.ts +0 -98
  74. package/src/lib/calendar/calendar.ts +0 -253
  75. package/src/lib/callout/callout.ts +0 -211
  76. package/src/lib/card/card-title.spec.ts +0 -27
  77. package/src/lib/card/card-title.ts +0 -50
  78. package/src/lib/card/card.ts +0 -200
  79. package/src/lib/carousel/carousel.ts +0 -206
  80. package/src/lib/chart/chart-zoom.spec.ts +0 -65
  81. package/src/lib/chart/chart-zoom.ts +0 -71
  82. package/src/lib/chart/chart.ts +0 -1257
  83. package/src/lib/chart-card-header/chart-card-header.ts +0 -80
  84. package/src/lib/chart-empty-state/chart-empty-state.ts +0 -146
  85. package/src/lib/chart-panel/chart-panel.ts +0 -133
  86. package/src/lib/checkbox/checkbox.ts +0 -139
  87. package/src/lib/color-picker/color-picker.ts +0 -148
  88. package/src/lib/command/command.ts +0 -260
  89. package/src/lib/composer/composer.ts +0 -180
  90. package/src/lib/confirm-dialog/confirm-dialog.ts +0 -163
  91. package/src/lib/confirm-dialog/dialog.service.ts +0 -79
  92. package/src/lib/context/context.ts +0 -75
  93. package/src/lib/core/brand-icons.ts +0 -62
  94. package/src/lib/core/cva.ts +0 -33
  95. package/src/lib/core/icons.ts +0 -206
  96. package/src/lib/core/integration-brand-icons.ts +0 -77
  97. package/src/lib/core/lucide-paths.generated.ts +0 -130
  98. package/src/lib/date-picker/date-picker.ts +0 -139
  99. package/src/lib/dropdown/dropdown.ts +0 -188
  100. package/src/lib/editor/editor.ts +0 -170
  101. package/src/lib/empty-state/empty-state.ts +0 -100
  102. package/src/lib/fab/fab.ts +0 -76
  103. package/src/lib/field/field.ts +0 -111
  104. package/src/lib/file-upload/file-upload.ts +0 -208
  105. package/src/lib/footer/footer.scss +0 -162
  106. package/src/lib/footer/footer.ts +0 -28
  107. package/src/lib/form-section/form-section.ts +0 -200
  108. package/src/lib/forms.spec.ts +0 -92
  109. package/src/lib/gauge-arc/gauge-arc.ts +0 -85
  110. package/src/lib/hud-panel/hud-panel.ts +0 -27
  111. package/src/lib/icon/icon.ts +0 -284
  112. package/src/lib/icon-badge/icon-badge.ts +0 -87
  113. package/src/lib/icon-heading/icon-heading.spec.ts +0 -32
  114. package/src/lib/icon-heading/icon-heading.ts +0 -38
  115. package/src/lib/icon-text/icon-text.ts +0 -120
  116. package/src/lib/input/input.ts +0 -119
  117. package/src/lib/kanban/kanban.ts +0 -211
  118. package/src/lib/kbd/kbd.ts +0 -32
  119. package/src/lib/label/label.ts +0 -39
  120. package/src/lib/loading-overlay/loading-overlay.ts +0 -80
  121. package/src/lib/menubar/menubar.ts +0 -77
  122. package/src/lib/metric-card/metric-card.ts +0 -33
  123. package/src/lib/modal/modal.ts +0 -207
  124. package/src/lib/native-select/native-select.ts +0 -124
  125. package/src/lib/navbar/navbar.ts +0 -124
  126. package/src/lib/navigation-menu/navigation-menu.ts +0 -116
  127. package/src/lib/otp-input/otp-input.ts +0 -164
  128. package/src/lib/page-back-link/page-back-link.ts +0 -74
  129. package/src/lib/page-header/page-header.ts +0 -70
  130. package/src/lib/pagination/pagination.ts +0 -157
  131. package/src/lib/pillbox/pillbox.ts +0 -157
  132. package/src/lib/popover/popover.ts +0 -92
  133. package/src/lib/profile/profile.ts +0 -73
  134. package/src/lib/progress/progress.ts +0 -123
  135. package/src/lib/radio/radio.ts +0 -132
  136. package/src/lib/ring-gauge/ring-gauge.ts +0 -75
  137. package/src/lib/scroll-area/scroll-area.ts +0 -57
  138. package/src/lib/search-palette/search-palette.scss +0 -288
  139. package/src/lib/search-palette/search-palette.ts +0 -114
  140. package/src/lib/select/select.ts +0 -292
  141. package/src/lib/separator/separator.ts +0 -59
  142. package/src/lib/sheet/sheet.ts +0 -192
  143. package/src/lib/sidebar-nav/sidebar-nav.scss +0 -218
  144. package/src/lib/sidebar-nav/sidebar-nav.ts +0 -158
  145. package/src/lib/site-drakkar/site-footer.ts +0 -133
  146. package/src/lib/site-drakkar/site-navbar.scss +0 -2
  147. package/src/lib/site-drakkar/site-navbar.ts +0 -286
  148. package/src/lib/site-drakkar/suite-search-items.spec.ts +0 -61
  149. package/src/lib/site-drakkar/suite-search-items.ts +0 -246
  150. package/src/lib/skeleton/skeleton.ts +0 -51
  151. package/src/lib/slider/slider.ts +0 -133
  152. package/src/lib/spinner/spinner.ts +0 -75
  153. package/src/lib/status-metric-row/status-metric-row.ts +0 -74
  154. package/src/lib/suite-search-palette/suite-search-palette.ts +0 -95
  155. package/src/lib/switch/switch.ts +0 -131
  156. package/src/lib/table/table.ts +0 -137
  157. package/src/lib/tabs/tab-panel.ts +0 -61
  158. package/src/lib/tabs/tab.ts +0 -107
  159. package/src/lib/tabs/tabs.ts +0 -109
  160. package/src/lib/textarea/textarea.ts +0 -103
  161. package/src/lib/theme-toggle/theme-toggle.spec.ts +0 -40
  162. package/src/lib/theme-toggle/theme-toggle.ts +0 -40
  163. package/src/lib/time-picker/time-picker.ts +0 -197
  164. package/src/lib/timeline/timeline.ts +0 -152
  165. package/src/lib/toast/toast.ts +0 -196
  166. package/src/lib/toggle/toggle-group.ts +0 -60
  167. package/src/lib/toggle/toggle.ts +0 -101
  168. package/src/lib/tooltip/tooltip.ts +0 -119
  169. package/src/lib/typography/heading.ts +0 -52
  170. package/src/lib/typography/text.ts +0 -51
  171. package/src/lib/uptime-bar/uptime-bar.ts +0 -55
  172. package/src/lib/verification-code-field/verification-code-field.ts +0 -149
  173. package/src/lib/whitepaper-cta/whitepaper-cta.scss +0 -130
  174. package/src/lib/whitepaper-cta/whitepaper-cta.ts +0 -78
  175. package/src/lib/wizard/wizard.ts +0 -80
  176. package/src/public-api.ts +0 -172
  177. package/src/styles/_buttons.scss +0 -386
  178. package/src/styles/_component-primitives.scss +0 -183
  179. package/src/styles/_drakkar-buttons.scss +0 -85
  180. package/src/styles/_fonts.scss +0 -22
  181. package/src/styles/_forms.scss +0 -66
  182. package/src/styles/_input.scss +0 -106
  183. package/src/styles/_layout-enforcement.scss +0 -229
  184. package/src/styles/_layout-rhythm.scss +0 -158
  185. package/src/styles/_legacy-aliases.scss +0 -212
  186. package/src/styles/_series-colors.scss +0 -24
  187. package/src/styles/_static-primitives.scss +0 -857
  188. package/src/styles/_typography.scss +0 -87
  189. package/src/styles/_variables.scss +0 -527
  190. package/src/styles/components/a11y.scss +0 -90
  191. package/src/styles/components/badges.scss +0 -102
  192. package/src/styles/components/extracted-utilities.scss +0 -459
  193. package/src/styles/components/footer.scss +0 -168
  194. package/src/styles/components/icon-heading.scss +0 -47
  195. package/src/styles/components/icon-inline.scss +0 -101
  196. package/src/styles/components/layout.scss +0 -59
  197. package/src/styles/components/utilities.scss +0 -131
  198. package/src/styles/components/viking-inspired.scss +0 -204
  199. package/src/styles/components/whitepaper-cta.scss +0 -130
  200. package/src/styles/components-bundle.scss +0 -9
  201. package/src/styles/components.scss +0 -442
  202. package/src/styles/deml-components.scss +0 -10
  203. package/src/styles/index.scss +0 -8
  204. package/src/styles/layout-shell.scss +0 -111
  205. package/src/styles/page-shell.scss +0 -859
  206. package/src/styles/static-navbar.scss +0 -1250
  207. package/src/styles/surfaces/backend.scss +0 -154
  208. package/src/styles/surfaces/docs-global.scss +0 -73
  209. package/src/styles/surfaces/docs-shell.scss +0 -437
  210. package/src/styles/surfaces/docs-showcase.scss +0 -1153
  211. package/src/styles/surfaces/marketing-cta.scss +0 -62
  212. package/src/styles/surfaces/marketing-docs-bento.scss +0 -67
  213. package/src/styles/surfaces/marketing-global.scss +0 -748
  214. package/src/styles/surfaces/marketing-landing.scss +0 -1526
  215. package/src/styles/surfaces/marketing-publication.scss +0 -535
  216. package/src/styles/surfaces/marketing-theme.scss +0 -14
  217. package/src/styles/surfaces/swagger-ui.scss +0 -1013
  218. package/src/styles/tokens-export.scss +0 -18
  219. package/src/styles/tokens.scss +0 -5
  220. package/src/styles/viking-ui-bundle.scss +0 -23
  221. package/src/styles/viking-ui.scss +0 -272
  222. package/src/tokens/series-presets.ts +0 -15
  223. package/src/tokens/tailwind.preset.js +0 -209
  224. package/src/tokens/viking-tokens.json +0 -318
  225. package/src/viking-ui.spec.ts +0 -416
  226. package/src/web/badge/viking-badge-wc.ts +0 -116
  227. package/src/web/button/viking-button-wc.ts +0 -165
  228. package/src/web/callout/viking-callout-wc.ts +0 -105
  229. package/src/web/card/viking-card-wc.ts +0 -67
  230. package/src/web/core/base.ts +0 -56
  231. package/src/web/core/dom.ts +0 -53
  232. package/src/web/core/icons-inline.ts +0 -44
  233. package/src/web/core/styles.ts +0 -1261
  234. package/src/web/core/types.ts +0 -19
  235. package/src/web/field/viking-field-wc.ts +0 -154
  236. package/src/web/index.ts +0 -73
  237. package/src/web/input/viking-input-wc.ts +0 -211
  238. package/src/web/modal/viking-modal-wc.ts +0 -187
  239. package/src/web/search-palette/viking-search-palette-wc.ts +0 -495
  240. package/src/web/select/viking-select-wc.ts +0 -218
  241. package/src/web/suite-header/viking-suite-header-wc.ts +0 -729
  242. package/src/web/suite-search-palette/viking-suite-search-palette-wc.ts +0 -234
  243. package/src/web/theme-toggle/viking-theme-toggle-wc.ts +0 -139
  244. package/src/web/types.ts +0 -37
  245. package/src/web/web-components.spec.ts +0 -297
  246. package/src/web-components/index.ts +0 -1
@@ -1,415 +0,0 @@
1
- .viking-app-sidebar-host {
2
- display: contents;
3
-
4
- /* Theme-driven sidebar — Viking tokens only (THEME.md) */
5
- --sidebar-accent: var(--viking-accent-strong, var(--color-primary-container));
6
- --sidebar-border: var(--viking-border, var(--border-layout));
7
- --sidebar-bg: var(--viking-surface);
8
- --sidebar-hover-bg: color-mix(in srgb, var(--viking-accent) 6%, transparent);
9
- --sidebar-active-bg: linear-gradient(
10
- 90deg,
11
- color-mix(in srgb, var(--viking-accent) 12%, transparent) 0%,
12
- color-mix(in srgb, var(--viking-accent) 3%, transparent) 100%
13
- );
14
- --sidebar-active-border: var(--viking-accent, var(--color-primary));
15
- }
16
-
17
- html[data-theme='light'] .viking-app-sidebar-host {
18
- --sidebar-accent: var(--viking-accent, var(--color-primary));
19
- --sidebar-border: var(--viking-border, var(--border-layout));
20
- --sidebar-bg: var(--viking-surface);
21
- --sidebar-hover-bg: color-mix(in srgb, var(--viking-accent) 5%, transparent);
22
- --sidebar-active-bg: linear-gradient(
23
- 90deg,
24
- color-mix(in srgb, var(--viking-accent) 8%, transparent) 0%,
25
- color-mix(in srgb, var(--viking-accent) 2%, transparent) 100%
26
- );
27
- --sidebar-active-border: var(--viking-accent, var(--color-primary));
28
- }
29
-
30
- .dashboard-sidebar {
31
- display: flex;
32
- flex-direction: column;
33
- width: 100%;
34
- background: var(--sidebar-bg);
35
- border-bottom: 1px solid var(--sidebar-border);
36
- flex-shrink: 0;
37
- height: auto;
38
- position: sticky;
39
- top: var(--viking-navbar-height, var(--navbar-height, 64px));
40
- z-index: 40;
41
- transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
42
- overflow: hidden;
43
-
44
- &.dragging {
45
- transition: none;
46
- user-select: none;
47
- }
48
- }
49
-
50
- .resize-handle {
51
- position: absolute;
52
- right: -4px;
53
- top: 0;
54
- bottom: 0;
55
- width: 16px;
56
- cursor: col-resize;
57
- z-index: 10;
58
- background: transparent;
59
- display: none;
60
- align-items: center;
61
- justify-content: center;
62
-
63
- &::after {
64
- content: '';
65
- height: 24px;
66
- width: 0px;
67
- border-left: 1px solid var(--text-muted);
68
- border-right: 1px solid var(--text-muted);
69
- opacity: 0.3;
70
- border-radius: 0px;
71
- transition:
72
- opacity 0.2s,
73
- border-color 0.2s;
74
- }
75
-
76
- &:hover::after,
77
- &:active::after {
78
- opacity: 1;
79
- border-left-color: var(--sidebar-accent);
80
- border-right-color: var(--sidebar-accent);
81
- }
82
- }
83
-
84
- .sidebar-brand {
85
- padding: var(--viking-space-1-5) var(--viking-space-2);
86
- display: flex;
87
- align-items: center;
88
- gap: var(--viking-space-1);
89
- border-bottom: 1px solid var(--sidebar-border);
90
- cursor: pointer;
91
- justify-content: space-between;
92
- transition: background 0.2s;
93
-
94
- .collapse-toggle-btn {
95
- display: none;
96
- }
97
-
98
- &:hover {
99
- background: var(--sidebar-hover-bg);
100
- }
101
-
102
- .brand-icon {
103
- color: var(--sidebar-accent);
104
- font-size: 24px;
105
- width: 24px;
106
- height: 24px;
107
- display: inline-flex;
108
- align-items: center;
109
- justify-content: center;
110
- overflow: visible !important;
111
- line-height: 1;
112
- flex-shrink: 0;
113
- }
114
-
115
- .brand-title {
116
- margin: 0;
117
- font-size: 1rem;
118
- font-weight: 800;
119
- letter-spacing: 0.08em;
120
- text-transform: uppercase;
121
- color: var(--text-color);
122
- flex: 1;
123
- white-space: nowrap;
124
- overflow: hidden;
125
- text-overflow: ellipsis;
126
- }
127
-
128
- .collapse-toggle-btn {
129
- background: transparent;
130
- border: none;
131
- color: var(--text-muted);
132
- cursor: pointer;
133
- display: flex;
134
- align-items: center;
135
- justify-content: center;
136
- padding: var(--viking-space-1);
137
- border-radius: 50%;
138
- transition: var(--transition-smooth);
139
-
140
- &:hover {
141
- background: var(--sidebar-hover-bg);
142
- color: var(--text-color);
143
- }
144
- }
145
- }
146
-
147
- .sidebar-scroll-container {
148
- flex: 1;
149
- overflow-x: auto;
150
- overflow-y: hidden;
151
- display: flex;
152
- flex-direction: column;
153
- -webkit-overflow-scrolling: touch;
154
- scrollbar-width: none;
155
-
156
- &::-webkit-scrollbar {
157
- height: 0;
158
- width: 0;
159
- }
160
-
161
- &::-webkit-scrollbar {
162
- width: 0px;
163
- }
164
-
165
- &::-webkit-scrollbar-track {
166
- background: transparent;
167
- }
168
-
169
- &::-webkit-scrollbar-thumb {
170
- background: color-mix(in srgb, var(--viking-text) 8%, transparent);
171
- border-radius: 0;
172
- }
173
-
174
- &::-webkit-scrollbar-thumb:hover {
175
- background: color-mix(in srgb, var(--viking-text) 15%, transparent);
176
- }
177
- }
178
-
179
- html[data-theme='light'] .viking-app-sidebar-host {
180
- .sidebar-scroll-container::-webkit-scrollbar-thumb {
181
- background: color-mix(in srgb, var(--viking-text) 8%, transparent);
182
- }
183
- .sidebar-scroll-container::-webkit-scrollbar-thumb:hover {
184
- background: color-mix(in srgb, var(--viking-text) 15%, transparent);
185
- }
186
- }
187
-
188
- .sidebar-footer {
189
- display: none;
190
- padding: var(--viking-space-2);
191
- border-top: 1px solid var(--sidebar-border);
192
- }
193
-
194
- .system-health {
195
- display: flex;
196
- align-items: center;
197
- gap: 8px;
198
- font-size: 1rem;
199
- color: var(--text-muted);
200
- font-weight: 600;
201
- text-decoration: none;
202
- white-space: nowrap;
203
-
204
- .health-dot {
205
- width: 8px;
206
- height: 8px;
207
- border-radius: 50%;
208
- background-color: var(--color-success);
209
- box-shadow: 0 0 8px var(--color-success);
210
- flex-shrink: 0;
211
- animation: pulse-glow 2s infinite;
212
- }
213
-
214
- &.degraded {
215
- .health-dot {
216
- background-color: var(--color-warning);
217
- box-shadow: 0 0 8px var(--color-warning);
218
- animation: pulse-glow-warning 2s infinite;
219
- }
220
- }
221
- }
222
-
223
- @keyframes pulse-glow {
224
- 0% {
225
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-success) 40%, transparent);
226
- }
227
- 70% {
228
- box-shadow: 0 0 0 6px transparent;
229
- }
230
- 100% {
231
- box-shadow: 0 0 0 0 transparent;
232
- }
233
- }
234
-
235
- @keyframes pulse-glow-warning {
236
- 0% {
237
- box-shadow: 0 0 0 0 rgba(255, 193, 7, 0.4);
238
- }
239
- 70% {
240
- box-shadow: 0 0 0 6px rgba(255, 193, 7, 0);
241
- }
242
- 100% {
243
- box-shadow: 0 0 0 0 rgba(255, 193, 7, 0);
244
- }
245
- }
246
-
247
- @media (min-width: 901px) {
248
- .dashboard-sidebar:not(.collapsed) {
249
- width: var(--viking-sidebar-width, 256px);
250
- }
251
-
252
- .dashboard-sidebar {
253
- border-right: 1px solid var(--sidebar-border);
254
- border-bottom: none;
255
- height: calc(100vh - var(--viking-navbar-height, 64px));
256
- position: sticky;
257
- top: var(--viking-navbar-height, 64px);
258
- }
259
-
260
- .sidebar-brand {
261
- padding: var(--viking-space-3);
262
-
263
- .collapse-toggle-btn {
264
- display: flex;
265
- }
266
- }
267
-
268
- .resize-handle {
269
- display: flex;
270
- }
271
-
272
- .sidebar-scroll-container {
273
- overflow-x: hidden;
274
- overflow-y: auto;
275
- }
276
-
277
- .sidebar-footer {
278
- display: block;
279
- }
280
-
281
- .dashboard-sidebar.collapsed {
282
- width: 64px;
283
-
284
- .brand-title,
285
- .brand-icon,
286
- .viking-sidebar-nav-label,
287
- .viking-sidebar-nav-tree,
288
- .health-text {
289
- display: none !important;
290
- }
291
-
292
- .sidebar-brand {
293
- padding: var(--viking-space-3) var(--viking-space-1);
294
- justify-content: center;
295
- }
296
-
297
- .viking-sidebar-nav-link a {
298
- justify-content: center;
299
- padding: var(--viking-space-1);
300
- border-left: 3px solid transparent;
301
-
302
- &.viking-sidebar-nav-link-active {
303
- border-left-color: var(--sidebar-active-border);
304
- }
305
- }
306
-
307
- .sidebar-footer {
308
- display: flex;
309
- justify-content: center;
310
- padding: var(--viking-space-3) 0;
311
- }
312
- }
313
- }
314
-
315
- .search-results-list {
316
- padding: var(--viking-space-2);
317
- display: flex;
318
- flex-direction: column;
319
- gap: var(--viking-space-1);
320
-
321
- .search-results-header {
322
- font-size: 1rem;
323
- font-weight: 700;
324
- text-transform: uppercase;
325
- letter-spacing: 0.08em;
326
- color: var(--text-muted);
327
- margin-bottom: 8px;
328
- }
329
-
330
- .search-result-item {
331
- display: flex;
332
- align-items: center;
333
- gap: var(--viking-space-1);
334
- padding: var(--viking-space-1) var(--viking-space-2);
335
- border-radius: var(--viking-radius);
336
- background: color-mix(in srgb, var(--viking-surface-alt) 40%, transparent);
337
- border: 1px solid var(--viking-border-subtle);
338
- cursor: pointer;
339
- transition: var(--viking-transition-interactive);
340
-
341
- &:hover {
342
- background: var(--sidebar-hover-bg);
343
- border-color: var(--sidebar-accent);
344
-
345
- .result-title {
346
- color: var(--sidebar-accent);
347
- }
348
- }
349
-
350
- .result-icon {
351
- font-size: 20px;
352
- width: 20px;
353
- height: 20px;
354
- line-height: 20px;
355
- color: var(--text-muted);
356
- }
357
-
358
- .result-details {
359
- display: flex;
360
- flex-direction: column;
361
- overflow: hidden;
362
- flex: 1;
363
- }
364
-
365
- .result-title {
366
- font-size: 1rem;
367
- font-weight: 600;
368
- color: var(--text-color);
369
- white-space: nowrap;
370
- overflow: hidden;
371
- text-overflow: ellipsis;
372
- transition: color 0.2s;
373
- }
374
-
375
- .result-snippet {
376
- font-size: 1rem;
377
- color: var(--text-muted);
378
- margin-top: 0px;
379
- line-height: 1.3;
380
- display: -webkit-box;
381
- -webkit-line-clamp: 2;
382
- -webkit-box-orient: vertical;
383
- overflow: hidden;
384
- text-overflow: ellipsis;
385
- }
386
-
387
- .result-type {
388
- font-size: 1rem;
389
- color: var(--text-muted);
390
- text-transform: uppercase;
391
- letter-spacing: 0.05em;
392
- margin-top: 8px;
393
- }
394
-
395
- mark.search-highlight {
396
- background: color-mix(in srgb, var(--viking-accent) 25%, transparent);
397
- color: var(--viking-accent);
398
- font-weight: 700;
399
- border-radius: 0px;
400
- padding: 0 0px;
401
-
402
- :host-context(html[data-theme='light']) & {
403
- background: color-mix(in srgb, var(--viking-accent) 15%, transparent);
404
- color: var(--viking-accent);
405
- }
406
- }
407
- }
408
-
409
- .search-no-results {
410
- font-size: 1rem;
411
- color: var(--text-muted);
412
- text-align: center;
413
- padding: 16px 0;
414
- }
415
- }
@@ -1,29 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- input,
6
- output,
7
- } from "@angular/core";
8
-
9
- /**
10
- * viking-app-sidebar — dashboard sidebar shell styles (project nav markup inside).
11
- * Width is driven by the `--viking-sidebar-width` CSS variable on the host.
12
- */
13
- @Component({
14
- selector: "viking-app-sidebar",
15
- changeDetection: ChangeDetectionStrategy.OnPush,
16
- encapsulation: ViewEncapsulation.None,
17
- host: {
18
- class: "viking-app-sidebar-host",
19
- "[style.--viking-sidebar-width.px]": "collapsed() ? null : width()",
20
- },
21
- template: `<ng-content />`,
22
- styleUrl: "./app-sidebar.scss",
23
- })
24
- export class VikingAppSidebar {
25
- readonly collapsed = input<boolean>(false);
26
- readonly dragging = input<boolean>(false);
27
- readonly width = input<number>(260);
28
- readonly resizeStart = output<MouseEvent>();
29
- }
@@ -1,132 +0,0 @@
1
- import { Component } from "@angular/core";
2
- import { TestBed, ComponentFixture } from "@angular/core/testing";
3
- import { describe, it, expect } from "vitest";
4
- import { VikingAuthPanel } from "./auth-panel";
5
- import { VikingField } from "../field/field";
6
- import { VikingInput } from "../input/input";
7
-
8
- @Component({
9
- imports: [VikingAuthPanel, VikingField, VikingInput],
10
- template: `
11
- <viking-auth-panel
12
- title="Sign In"
13
- subtitle="Enter credentials"
14
- [showSocial]="true"
15
- [socialLoading]="loading"
16
- (googleSignIn)="onGoogle()"
17
- (appleSignIn)="onApple()"
18
- >
19
- <viking-field label="Email">
20
- <viking-input placeholder="Email" />
21
- </viking-field>
22
- <a vikingAuthLinks href="/forgot">Forgot password?</a>
23
- <p vikingAuthFooter>Need help?</p>
24
- </viking-auth-panel>
25
- `,
26
- })
27
- class AuthPanelHost {
28
- loading = false;
29
- googleCalled = false;
30
- appleCalled = false;
31
- onGoogle = (): void => {
32
- this.googleCalled = true;
33
- };
34
- onApple = (): void => {
35
- this.appleCalled = true;
36
- };
37
- }
38
-
39
- describe("viking-auth-panel", () => {
40
- const render = async (): Promise<ComponentFixture<AuthPanelHost>> => {
41
- const fixture = TestBed.createComponent(AuthPanelHost);
42
- fixture.detectChanges();
43
- await fixture.whenStable();
44
- return fixture;
45
- };
46
-
47
- it("renders accessible sign-in structure with title and subtitle", async () => {
48
- const fixture = await render();
49
- const panel = fixture.nativeElement.querySelector(
50
- ".viking-auth-panel",
51
- ) as HTMLElement;
52
- expect(panel.getAttribute("aria-labelledby")).toBe("viking-auth-title");
53
- expect(
54
- fixture.nativeElement.querySelector("#viking-auth-title")?.textContent,
55
- ).toContain("Sign In");
56
- expect(
57
- fixture.nativeElement.querySelector(".viking-auth-subtitle")?.textContent,
58
- ).toContain("Enter credentials");
59
- });
60
-
61
- it("projects form body, links, and footer slots", async () => {
62
- const fixture = await render();
63
- expect(fixture.nativeElement.querySelector("viking-field")).toBeTruthy();
64
- expect(
65
- fixture.nativeElement.querySelector("[vikingAuthLinks]")?.textContent,
66
- ).toContain("Forgot password?");
67
- expect(
68
- fixture.nativeElement.querySelector("[vikingAuthFooter]")?.textContent,
69
- ).toContain("Need help?");
70
- });
71
-
72
- it("emits googleSignIn and appleSignIn from social buttons", async () => {
73
- const fixture = await render();
74
- const buttons = fixture.nativeElement.querySelectorAll(
75
- ".viking-auth-social viking-button viking-button-wc",
76
- ) as NodeListOf<HTMLElement>;
77
- expect(buttons.length).toBe(2);
78
- buttons[0].dispatchEvent(
79
- new CustomEvent("viking-press", {
80
- bubbles: true,
81
- composed: true,
82
- detail: new MouseEvent("click"),
83
- }),
84
- );
85
- buttons[1].dispatchEvent(
86
- new CustomEvent("viking-press", {
87
- bubbles: true,
88
- composed: true,
89
- detail: new MouseEvent("click"),
90
- }),
91
- );
92
- fixture.detectChanges();
93
- expect(fixture.componentInstance.googleCalled).toBe(true);
94
- expect(fixture.componentInstance.appleCalled).toBe(true);
95
- });
96
-
97
- it("hides social row when showSocial is false", async () => {
98
- @Component({
99
- imports: [VikingAuthPanel],
100
- template: `<viking-auth-panel title="Sign In" [showSocial]="false" />`,
101
- })
102
- class NoSocialHost {}
103
-
104
- const fixture = TestBed.createComponent(NoSocialHost);
105
- fixture.detectChanges();
106
- expect(
107
- fixture.nativeElement.querySelector(".viking-auth-social"),
108
- ).toBeNull();
109
- });
110
-
111
- it("disables social buttons while socialLoading is true", async () => {
112
- @Component({
113
- imports: [VikingAuthPanel],
114
- template: `<viking-auth-panel
115
- title="Sign In"
116
- [socialLoading]="true"
117
- [showSocial]="true"
118
- />`,
119
- })
120
- class LoadingHost {}
121
-
122
- const fixture = TestBed.createComponent(LoadingHost);
123
- fixture.detectChanges();
124
- await fixture.whenStable();
125
- const buttons = fixture.nativeElement.querySelectorAll(
126
- ".viking-auth-social viking-button viking-button-wc",
127
- ) as NodeListOf<HTMLElement>;
128
- expect(buttons[0].shadowRoot?.querySelector("button")?.disabled).toBe(true);
129
- expect(buttons[1].shadowRoot?.querySelector("button")?.disabled).toBe(true);
130
- expect(buttons[0].getAttribute("aria-busy")).toBe("true");
131
- });
132
- });