@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,111 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, input } from "@angular/core";
2
- import { vikingUid } from "../../core/uid";
3
-
4
- /**
5
- * viking-field — label / description / error wrapper for any control
6
- *.
7
- * The projected control is associated with the label by wrapping.
8
- */
9
- @Component({
10
- selector: "viking-field",
11
- changeDetection: ChangeDetectionStrategy.OnPush,
12
- host: { "[class.viking-field-invalid]": "!!error()" },
13
- template: `
14
- <!-- The projected control lives inside the label, which associates it implicitly. -->
15
- <!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -->
16
- <label class="viking-field-label-wrap">
17
- @if (label()) {
18
- <span class="viking-field-label" [id]="labelId">
19
- {{ label() }}
20
- @if (required()) {
21
- <span class="viking-field-required" aria-hidden="true">*</span>
22
- }
23
- </span>
24
- }
25
- <ng-content />
26
- </label>
27
- @if (description() && !error()) {
28
- <p class="viking-field-description" [id]="descriptionId">
29
- {{ description() }}
30
- </p>
31
- }
32
- @if (error()) {
33
- <p class="viking-field-error" [id]="errorId" role="alert">
34
- {{ error() }}
35
- </p>
36
- }
37
- `,
38
- styles: [
39
- `
40
- :host {
41
- display: block;
42
- font-family: var(--viking-font-family);
43
- }
44
- :host(.viking-field-invalid) {
45
- animation: viking-shake var(--viking-duration-slow)
46
- var(--viking-ease-default);
47
- }
48
- .viking-field-label-wrap {
49
- display: flex;
50
- flex-direction: column;
51
- gap: var(--viking-space-half);
52
- }
53
- .viking-field-label {
54
- font-size: var(--viking-font-size-sm);
55
- font-weight: var(--viking-font-weight-semibold);
56
- color: var(--viking-text);
57
- letter-spacing: var(--viking-letter-spacing-wide);
58
- line-height: var(--viking-line-height-tight);
59
- }
60
- .viking-field-required {
61
- color: var(--viking-danger);
62
- margin-left: 2px;
63
- }
64
- .viking-field-description,
65
- .viking-field-error {
66
- margin: var(--viking-space-half) 0 0;
67
- font-size: var(--viking-font-size-sm);
68
- line-height: var(--viking-line-height-normal);
69
- }
70
- .viking-field-description {
71
- color: var(--viking-text-muted);
72
- }
73
- .viking-field-error {
74
- color: var(--viking-danger-text, var(--viking-danger));
75
- font-weight: var(--viking-font-weight-semibold);
76
- display: flex;
77
- align-items: center;
78
- gap: var(--viking-space-half);
79
- }
80
- .viking-field-error::before {
81
- content: "";
82
- width: 6px;
83
- height: 6px;
84
- border-radius: var(--viking-radius-pill);
85
- background: var(--viking-danger);
86
- flex-shrink: 0;
87
- }
88
- :host(.viking-field-invalid) ::ng-deep .viking-control {
89
- border-color: var(--viking-danger);
90
- box-shadow: 0 0 0 1px
91
- color-mix(in srgb, var(--viking-danger) 25%, transparent);
92
- }
93
- :host ::ng-deep viking-select,
94
- :host ::ng-deep viking-native-select {
95
- display: block;
96
- width: 100%;
97
- min-width: 0;
98
- }
99
- `,
100
- ],
101
- })
102
- export class VikingField {
103
- readonly label = input<string>("");
104
- readonly description = input<string>("");
105
- readonly error = input<string>("");
106
- readonly required = input<boolean>(false);
107
-
108
- protected readonly descriptionId = vikingUid("viking-field-description");
109
- protected readonly errorId = vikingUid("viking-field-error");
110
- protected readonly labelId = vikingUid("viking-field-label");
111
- }
@@ -1,208 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- input,
5
- output,
6
- signal,
7
- } from "@angular/core";
8
- import { VikingIcon } from "../icon/icon";
9
-
10
- /**
11
- * viking-file-upload — drag & drop file zone.
12
- */
13
- @Component({
14
- selector: "viking-file-upload",
15
- imports: [VikingIcon],
16
- changeDetection: ChangeDetectionStrategy.OnPush,
17
- template: `
18
- <label
19
- class="viking-upload-zone"
20
- [class.viking-dragover]="dragOver()"
21
- (dragover)="onDragOver($event)"
22
- (dragleave)="dragOver.set(false)"
23
- (drop)="onDrop($event)"
24
- >
25
- <input
26
- type="file"
27
- [accept]="accept()"
28
- [multiple]="multiple()"
29
- [disabled]="disabled()"
30
- [attr.aria-label]="heading()"
31
- (change)="onSelect($event)"
32
- />
33
- <viking-icon name="upload" [size]="27" />
34
- <span class="viking-upload-heading">{{ heading() }}</span>
35
- <span class="viking-upload-hint">{{ hint() }}</span>
36
- </label>
37
- @if (fileList().length > 0) {
38
- <ul class="viking-upload-list">
39
- @for (file of fileList(); track file.name) {
40
- <li class="viking-upload-file">
41
- <viking-icon name="file" [size]="18" />
42
- <span class="viking-upload-name">{{ file.name }}</span>
43
- <span class="viking-upload-size">{{ formatSize(file.size) }}</span>
44
- <button
45
- type="button"
46
- class="viking-upload-remove"
47
- [attr.aria-label]="'Remove ' + file.name"
48
- (click)="removeFile(file)"
49
- >
50
- <viking-icon name="x" [size]="16" />
51
- </button>
52
- </li>
53
- }
54
- </ul>
55
- }
56
- `,
57
- styles: [
58
- `
59
- :host {
60
- display: block;
61
- font-family: var(--viking-font-family);
62
- }
63
- .viking-upload-zone {
64
- position: relative;
65
- display: flex;
66
- flex-direction: column;
67
- align-items: center;
68
- justify-content: center;
69
- gap: var(--viking-space-1);
70
- padding: var(--viking-space-4) var(--viking-space-2);
71
- border: 2px dashed var(--viking-border-strong);
72
- border-radius: var(--viking-radius);
73
- background: var(--viking-surface);
74
- color: var(--viking-text-muted);
75
- cursor: pointer;
76
- transition: var(--viking-transition);
77
- text-align: center;
78
- }
79
- .viking-upload-zone:hover,
80
- .viking-dragover {
81
- border-color: var(--viking-accent);
82
- background: var(--viking-accent-soft);
83
- color: var(--viking-accent);
84
- }
85
- .viking-upload-zone:focus-within {
86
- outline: var(--viking-ring-width) solid var(--viking-ring);
87
- outline-offset: var(--viking-ring-offset);
88
- }
89
- /* The native input fills the drop zone so clicks and focus land on it. */
90
- input {
91
- position: absolute;
92
- inset: 0;
93
- width: 100%;
94
- height: 100%;
95
- margin: 0;
96
- opacity: 0;
97
- cursor: pointer;
98
- }
99
- .viking-upload-heading {
100
- font-size: var(--viking-font-size);
101
- font-weight: 600;
102
- color: var(--viking-text);
103
- }
104
- .viking-upload-hint {
105
- font-size: var(--viking-font-size);
106
- color: var(--viking-text-muted);
107
- }
108
- .viking-upload-list {
109
- list-style: none;
110
- margin: var(--viking-space-1) 0 0;
111
- padding: 0;
112
- display: flex;
113
- flex-direction: column;
114
- gap: calc(var(--viking-space-1) / 2);
115
- }
116
- .viking-upload-file {
117
- display: flex;
118
- align-items: center;
119
- gap: var(--viking-space-1);
120
- padding: var(--viking-space-1);
121
- border: 1px solid var(--viking-border);
122
- border-radius: var(--viking-radius);
123
- background: var(--viking-surface);
124
- font-size: var(--viking-font-size);
125
- color: var(--viking-text);
126
- }
127
- .viking-upload-name {
128
- flex: 1;
129
- min-width: 0;
130
- overflow: hidden;
131
- text-overflow: ellipsis;
132
- white-space: nowrap;
133
- }
134
- .viking-upload-size {
135
- color: var(--viking-text-muted);
136
- font-variant-numeric: tabular-nums;
137
- }
138
- .viking-upload-remove {
139
- display: inline-flex;
140
- border: none;
141
- background: transparent;
142
- color: var(--viking-text-muted);
143
- cursor: pointer;
144
- padding: 3px;
145
- border-radius: var(--viking-radius-pill);
146
- }
147
- .viking-upload-remove:hover {
148
- color: var(--viking-danger);
149
- }
150
- .viking-upload-remove:focus-visible {
151
- outline: var(--viking-ring-width) solid var(--viking-ring);
152
- outline-offset: 1px;
153
- }
154
- `,
155
- ],
156
- })
157
- export class VikingFileUpload {
158
- readonly heading = input<string>("Drop files here or click to browse");
159
- readonly hint = input<string>("");
160
- readonly accept = input<string>("");
161
- readonly multiple = input<boolean>(true);
162
- readonly disabled = input<boolean>(false);
163
-
164
- readonly filesChanged = output<File[]>();
165
-
166
- protected readonly dragOver = signal(false);
167
- protected readonly fileList = signal<File[]>([]);
168
-
169
- protected onDragOver = (event: DragEvent): void => {
170
- event.preventDefault();
171
- this.dragOver.set(true);
172
- };
173
-
174
- protected onDrop = (event: DragEvent): void => {
175
- event.preventDefault();
176
- this.dragOver.set(false);
177
- this.addFiles(Array.from(event.dataTransfer?.files ?? []));
178
- };
179
-
180
- protected onSelect = (event: Event): void => {
181
- this.addFiles(Array.from((event.target as HTMLInputElement).files ?? []));
182
- };
183
-
184
- protected removeFile = (file: File): void => {
185
- this.fileList.update((list) => list.filter((item) => item !== file));
186
- this.filesChanged.emit(this.fileList());
187
- };
188
-
189
- protected formatSize = (bytes: number): string => {
190
- if (bytes < 1024) {
191
- return `${bytes} B`;
192
- }
193
- if (bytes < 1024 * 1024) {
194
- return `${(bytes / 1024).toFixed(1)} KB`;
195
- }
196
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
197
- };
198
-
199
- private addFiles(files: File[]): void {
200
- if (files.length === 0) {
201
- return;
202
- }
203
- this.fileList.update((list) =>
204
- this.multiple() ? [...list, ...files] : files.slice(0, 1),
205
- );
206
- this.filesChanged.emit(this.fileList());
207
- }
208
- }
@@ -1,162 +0,0 @@
1
- .viking-footer,
2
- .mega-footer {
3
- background-color: var(--viking-surface, var(--color-surface));
4
- border-top: 1px solid var(--viking-border-strong, var(--border-layout));
5
- padding: calc(var(--viking-space-2) * 2) var(--viking-space-2);
6
- font-family: var(--viking-font-family);
7
- color: var(--viking-text-muted);
8
- }
9
-
10
- .viking-footer-content,
11
- .footer-content {
12
- max-width: var(--container-max-width, 1260px);
13
- margin: 0 auto;
14
- }
15
-
16
- .viking-footer-directory,
17
- .footer-directory {
18
- display: grid;
19
- grid-template-columns: 1fr;
20
- gap: calc(var(--viking-space-2) * 1.75);
21
- padding-bottom: calc(var(--viking-space-2) * 2);
22
- border-bottom: 1px solid var(--viking-border-strong, var(--border-layout));
23
- }
24
-
25
- @media (min-width: 600px) {
26
- .viking-footer-directory,
27
- .footer-directory {
28
- grid-template-columns: repeat(2, 1fr);
29
- }
30
- }
31
-
32
- @media (min-width: 900px) {
33
- .viking-footer-directory,
34
- .footer-directory {
35
- grid-template-columns: repeat(4, 1fr);
36
- }
37
- }
38
-
39
- .viking-footer-column-title,
40
- .footer-column-title {
41
- font-size: var(--viking-font-size);
42
- font-weight: 700;
43
- color: var(--viking-text);
44
- margin: 0 0 var(--viking-space-2);
45
- letter-spacing: 0.05em;
46
- }
47
-
48
- .viking-footer-list,
49
- .footer-list {
50
- list-style: none;
51
- padding: 0;
52
- margin: 0;
53
- display: flex;
54
- flex-direction: column;
55
- gap: var(--viking-space-1);
56
- }
57
-
58
- .viking-footer-list a,
59
- .footer-list a {
60
- font-size: var(--viking-font-size);
61
- color: var(--viking-text-muted);
62
- text-decoration: none !important;
63
- border-bottom: 1px solid transparent;
64
- transition: color 0.2s ease, border-color 0.2s ease;
65
- }
66
-
67
- .viking-footer-list a:hover,
68
- .footer-list a:hover {
69
- color: var(--viking-text);
70
- border-bottom-color: var(--viking-text);
71
- }
72
-
73
- .viking-footer-bottom,
74
- .footer-bottom {
75
- padding-top: var(--viking-space-2);
76
- display: flex;
77
- flex-direction: column;
78
- gap: var(--viking-space-2);
79
- }
80
-
81
- .viking-footer-badges-top,
82
- .footer-badges-top {
83
- display: flex;
84
- justify-content: center;
85
- margin-bottom: var(--viking-space-2);
86
- }
87
-
88
- .viking-footer-compliance-row,
89
- .footer-compliance-row {
90
- display: flex;
91
- justify-content: center;
92
- align-items: center;
93
- }
94
-
95
- .viking-copyright-info,
96
- .copyright-info {
97
- display: flex;
98
- flex-wrap: wrap;
99
- align-items: center;
100
- justify-content: center;
101
- gap: var(--viking-space-2);
102
- font-size: var(--viking-font-size);
103
- color: var(--viking-text-muted);
104
- text-align: center;
105
- }
106
-
107
- .viking-copyright-info a,
108
- .copyright-info a {
109
- color: var(--viking-text-muted);
110
- text-decoration: none !important;
111
- border-bottom: 1px solid transparent;
112
- transition: color 0.2s ease, border-color 0.2s ease;
113
- }
114
-
115
- .viking-copyright-info a:hover,
116
- .copyright-info a:hover {
117
- color: var(--viking-text);
118
- border-bottom-color: var(--viking-text);
119
- }
120
-
121
- .viking-usa-badge,
122
- .usa-badge {
123
- display: inline-flex;
124
- align-items: center;
125
- gap: var(--viking-space-1);
126
- padding: var(--viking-space-1) var(--viking-space-2);
127
- border-radius: var(--viking-radius-pill);
128
- background-color: transparent;
129
- border: 1px solid var(--viking-border);
130
- cursor: pointer;
131
- transition: var(--viking-transition-colors);
132
- font-size: var(--viking-font-size);
133
- font-weight: 500;
134
- color: var(--viking-text-muted);
135
- }
136
-
137
- .viking-usa-badge:focus-visible,
138
- .usa-badge:focus-visible {
139
- outline: var(--viking-ring-width, 2px) solid
140
- var(--viking-ring, var(--viking-ring));
141
- outline-offset: var(--viking-ring-offset, 2px);
142
- }
143
-
144
- .viking-usa-badge:hover,
145
- .usa-badge:hover {
146
- background-color: color-mix(in srgb, var(--viking-surface) 95%, var(--viking-accent) 5%);
147
- border-color: var(--viking-border-strong);
148
- color: var(--viking-text);
149
- box-shadow: var(--viking-shadow-sm);
150
- }
151
-
152
- .viking-usa-badge-icon,
153
- .usa-badge-icon {
154
- font-size: 1.1em;
155
- line-height: 1;
156
- transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
157
- }
158
-
159
- .viking-usa-badge:hover .viking-usa-badge-icon,
160
- .usa-badge:hover .usa-badge-icon {
161
- transform: scale(1.15) rotate(-5deg);
162
- }
@@ -1,28 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- } from "@angular/core";
6
-
7
- /**
8
- * viking-footer — site-wide Drakkar footer shell. Project directory columns and bottom row via slots.
9
- * Static apps (marketing, backend) use the same class names from viking-ui.css.
10
- */
11
- @Component({
12
- selector: "viking-footer",
13
- changeDetection: ChangeDetectionStrategy.OnPush,
14
- encapsulation: ViewEncapsulation.None,
15
- host: { class: "viking-footer-host" },
16
- template: `
17
- <footer class="viking-footer mega-footer">
18
- <div class="viking-footer-content footer-content">
19
- <ng-content select="[vikingFooterDirectory]" />
20
- <section class="viking-footer-bottom footer-bottom">
21
- <ng-content select="[vikingFooterBottom]" />
22
- </section>
23
- </div>
24
- </footer>
25
- `,
26
- styleUrl: "./footer.scss",
27
- })
28
- export class VikingFooter {}
@@ -1,200 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, input } from "@angular/core";
2
- import { VikingIcon } from "../icon/icon";
3
- import { VikingIconName } from "../../core/icons";
4
-
5
- export type VikingFormSectionLayout = "inline" | "stack" | "status";
6
-
7
- /**
8
- * viking-form-panel — groups related form sections inside a card without nested outlines.
9
- */
10
- @Component({
11
- selector: "viking-form-panel",
12
- changeDetection: ChangeDetectionStrategy.OnPush,
13
- host: { class: "viking-form-panel" },
14
- template: `<ng-content />`,
15
- styles: [
16
- `
17
- :host {
18
- display: flex;
19
- flex-direction: column;
20
- gap: 0;
21
- width: 100%;
22
- min-width: 0;
23
- }
24
- :host ::ng-deep viking-form-section + viking-form-section {
25
- border-top: 1px solid var(--viking-border-subtle);
26
- margin-top: var(--viking-space-3);
27
- padding-top: var(--viking-space-3);
28
- }
29
- `,
30
- ],
31
- })
32
- export class VikingFormPanel {}
33
-
34
- /**
35
- * viking-form-section — standard dashboard form row: heading, fields, and actions.
36
- * Use inside viking-form-panel (or a card body) to avoid nested bordered sub-forms.
37
- */
38
- @Component({
39
- selector: "viking-form-section",
40
- imports: [VikingIcon],
41
- changeDetection: ChangeDetectionStrategy.OnPush,
42
- host: {
43
- class: "viking-form-section",
44
- "[class.viking-form-section-inline]": "layout() === 'inline'",
45
- "[class.viking-form-section-stack]": "layout() === 'stack'",
46
- "[class.viking-form-section-status]": "layout() === 'status'",
47
- },
48
- template: `
49
- <header class="viking-form-section-header">
50
- @if (icon()) {
51
- <viking-icon
52
- [name]="icon()!"
53
- [size]="16"
54
- class="viking-form-section-icon"
55
- />
56
- }
57
- <h3 class="viking-form-section-title">{{ heading() }}</h3>
58
- </header>
59
-
60
- <div class="viking-form-section-body">
61
- <div class="viking-form-section-fields">
62
- <ng-content />
63
- </div>
64
- <div class="viking-form-section-actions">
65
- <ng-content select="[vikingFormActions]" />
66
- </div>
67
- </div>
68
-
69
- <div class="viking-form-section-footer">
70
- <ng-content select="[vikingFormFooter]" />
71
- </div>
72
- `,
73
- styles: [
74
- `
75
- :host {
76
- display: flex;
77
- flex-direction: column;
78
- gap: var(--viking-space-2);
79
- width: 100%;
80
- min-width: 0;
81
- font-family: var(--viking-font-family);
82
- }
83
-
84
- .viking-form-section-header {
85
- display: flex;
86
- align-items: center;
87
- gap: var(--viking-space-1);
88
- min-width: 0;
89
- }
90
-
91
- .viking-form-section-icon {
92
- display: flex;
93
- align-items: center;
94
- justify-content: center;
95
- width: 24px;
96
- height: 24px;
97
- border-radius: var(--viking-radius-sm);
98
- background: var(--viking-accent-soft);
99
- color: var(--viking-accent-strong);
100
- flex-shrink: 0;
101
- }
102
-
103
- .viking-form-section-title {
104
- margin: 0;
105
- font-size: var(--viking-font-size-ui);
106
- font-weight: var(--viking-font-weight-semibold);
107
- letter-spacing: var(--viking-letter-spacing-caps);
108
- text-transform: uppercase;
109
- color: var(--viking-text);
110
- line-height: var(--viking-line-height-tight);
111
- }
112
-
113
- .viking-form-section-body {
114
- display: flex;
115
- flex-direction: column;
116
- align-items: stretch;
117
- gap: var(--viking-space-2);
118
- width: 100%;
119
- min-width: 0;
120
- }
121
-
122
- .viking-form-section-fields {
123
- display: flex;
124
- flex-direction: column;
125
- gap: var(--viking-space-2);
126
- min-width: 0;
127
- flex: 1;
128
- }
129
-
130
- .viking-form-section-actions {
131
- display: flex;
132
- flex-direction: column;
133
- align-items: stretch;
134
- gap: var(--viking-space-1);
135
- flex-shrink: 0;
136
- }
137
-
138
- .viking-form-section-actions:empty {
139
- display: none;
140
- }
141
-
142
- .viking-form-section-footer:empty {
143
- display: none;
144
- }
145
-
146
- .viking-form-section-footer:not(:empty) {
147
- display: flex;
148
- flex-direction: column;
149
- gap: var(--viking-space-1);
150
- }
151
-
152
- :host(.viking-form-section-inline) .viking-form-section-body {
153
- @media (min-width: 601px) {
154
- flex-direction: row;
155
- align-items: flex-end;
156
- }
157
- }
158
-
159
- :host(.viking-form-section-inline) .viking-form-section-actions {
160
- @media (min-width: 601px) {
161
- align-items: center;
162
- justify-content: flex-end;
163
- width: auto;
164
- }
165
- }
166
-
167
- :host(.viking-form-section-status) .viking-form-section-body {
168
- @media (min-width: 601px) {
169
- flex-direction: row;
170
- align-items: flex-start;
171
- justify-content: space-between;
172
- }
173
- }
174
-
175
- :host(.viking-form-section-status) .viking-form-section-fields {
176
- flex-direction: row;
177
- align-items: flex-start;
178
- gap: var(--viking-space-1, 8px);
179
- }
180
-
181
- :host(.viking-form-section-status) .viking-form-section-actions {
182
- @media (min-width: 601px) {
183
- align-items: flex-start;
184
- padding-top: 1px;
185
- margin-left: auto;
186
- }
187
- }
188
-
189
- :host ::ng-deep viking-field {
190
- width: 100%;
191
- min-width: 0;
192
- }
193
- `,
194
- ],
195
- })
196
- export class VikingFormSection {
197
- readonly heading = input.required<string>();
198
- readonly icon = input<VikingIconName | null>(null);
199
- readonly layout = input<VikingFormSectionLayout>("inline");
200
- }