@hermes-ui/angular 0.1.6 → 0.2.0

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 (151) hide show
  1. package/README.md +52 -52
  2. package/button/_buttons.clarity.scss +80 -2
  3. package/button/_mixins.buttons.scss +44 -2
  4. package/button/_properties.buttons.scss +349 -387
  5. package/button/_variables.buttons.scss +22 -0
  6. package/fesm2022/hermes-ui-angular-accordion.mjs +2 -2
  7. package/fesm2022/hermes-ui-angular-accordion.mjs.map +1 -1
  8. package/fesm2022/hermes-ui-angular-addons-a11y.mjs.map +1 -1
  9. package/fesm2022/hermes-ui-angular-addons-card-container.mjs +3 -3
  10. package/fesm2022/hermes-ui-angular-addons-card-container.mjs.map +1 -1
  11. package/fesm2022/hermes-ui-angular-addons-certificate-viewer.mjs +2 -2
  12. package/fesm2022/hermes-ui-angular-addons-certificate-viewer.mjs.map +1 -1
  13. package/fesm2022/hermes-ui-angular-addons-datagrid-filters.mjs +2 -2
  14. package/fesm2022/hermes-ui-angular-addons-datagrid-filters.mjs.map +1 -1
  15. package/fesm2022/hermes-ui-angular-addons-datagrid.mjs +30 -30
  16. package/fesm2022/hermes-ui-angular-addons-datagrid.mjs.map +1 -1
  17. package/fesm2022/hermes-ui-angular-addons-dialog.mjs.map +1 -1
  18. package/fesm2022/hermes-ui-angular-addons-menu.mjs +8 -8
  19. package/fesm2022/hermes-ui-angular-addons-menu.mjs.map +1 -1
  20. package/fesm2022/hermes-ui-angular-addons-property-view.mjs +2 -2
  21. package/fesm2022/hermes-ui-angular-addons-property-view.mjs.map +1 -1
  22. package/fesm2022/hermes-ui-angular-addons-stepper.mjs.map +1 -1
  23. package/fesm2022/hermes-ui-angular-addons-tabs.mjs.map +1 -1
  24. package/fesm2022/hermes-ui-angular-addons-testing.mjs +78 -78
  25. package/fesm2022/hermes-ui-angular-addons-testing.mjs.map +1 -1
  26. package/fesm2022/hermes-ui-angular-addons-theme-builder.mjs +66 -66
  27. package/fesm2022/hermes-ui-angular-addons-theme-builder.mjs.map +1 -1
  28. package/fesm2022/hermes-ui-angular-addons-var.mjs +2 -2
  29. package/fesm2022/hermes-ui-angular-addons-var.mjs.map +1 -1
  30. package/fesm2022/hermes-ui-angular-addons-wizard.mjs +2 -2
  31. package/fesm2022/hermes-ui-angular-addons-wizard.mjs.map +1 -1
  32. package/fesm2022/hermes-ui-angular-addons-workflow.mjs.map +1 -1
  33. package/fesm2022/hermes-ui-angular-button.mjs +76 -76
  34. package/fesm2022/hermes-ui-angular-button.mjs.map +1 -1
  35. package/fesm2022/hermes-ui-angular-card.mjs.map +1 -1
  36. package/fesm2022/hermes-ui-angular-collapsible-panel.mjs.map +1 -1
  37. package/fesm2022/hermes-ui-angular-data-datagrid.mjs +928 -928
  38. package/fesm2022/hermes-ui-angular-data-datagrid.mjs.map +1 -1
  39. package/fesm2022/hermes-ui-angular-data-stack-view.mjs +116 -116
  40. package/fesm2022/hermes-ui-angular-data-stack-view.mjs.map +1 -1
  41. package/fesm2022/hermes-ui-angular-data-tree-view.mjs +14 -14
  42. package/fesm2022/hermes-ui-angular-data-tree-view.mjs.map +1 -1
  43. package/fesm2022/hermes-ui-angular-data.mjs.map +1 -1
  44. package/fesm2022/hermes-ui-angular-divider.mjs +2 -2
  45. package/fesm2022/hermes-ui-angular-divider.mjs.map +1 -1
  46. package/fesm2022/hermes-ui-angular-emphasis-alert.mjs +2 -2
  47. package/fesm2022/hermes-ui-angular-emphasis-alert.mjs.map +1 -1
  48. package/fesm2022/hermes-ui-angular-emphasis-badge.mjs.map +1 -1
  49. package/fesm2022/hermes-ui-angular-emphasis-label.mjs +16 -16
  50. package/fesm2022/hermes-ui-angular-emphasis-label.mjs.map +1 -1
  51. package/fesm2022/hermes-ui-angular-emphasis.mjs.map +1 -1
  52. package/fesm2022/hermes-ui-angular-forms-checkbox.mjs +52 -52
  53. package/fesm2022/hermes-ui-angular-forms-checkbox.mjs.map +1 -1
  54. package/fesm2022/hermes-ui-angular-forms-combobox.mjs +128 -128
  55. package/fesm2022/hermes-ui-angular-forms-combobox.mjs.map +1 -1
  56. package/fesm2022/hermes-ui-angular-forms-common.mjs +2 -2
  57. package/fesm2022/hermes-ui-angular-forms-common.mjs.map +1 -1
  58. package/fesm2022/hermes-ui-angular-forms-datalist.mjs +48 -48
  59. package/fesm2022/hermes-ui-angular-forms-datalist.mjs.map +1 -1
  60. package/fesm2022/hermes-ui-angular-forms-datepicker.mjs +377 -377
  61. package/fesm2022/hermes-ui-angular-forms-datepicker.mjs.map +1 -1
  62. package/fesm2022/hermes-ui-angular-forms-file-input.mjs +192 -192
  63. package/fesm2022/hermes-ui-angular-forms-file-input.mjs.map +1 -1
  64. package/fesm2022/hermes-ui-angular-forms-input.mjs +54 -54
  65. package/fesm2022/hermes-ui-angular-forms-input.mjs.map +1 -1
  66. package/fesm2022/hermes-ui-angular-forms-native-select.mjs +40 -40
  67. package/fesm2022/hermes-ui-angular-forms-native-select.mjs.map +1 -1
  68. package/fesm2022/hermes-ui-angular-forms-number-input.mjs +82 -82
  69. package/fesm2022/hermes-ui-angular-forms-number-input.mjs.map +1 -1
  70. package/fesm2022/hermes-ui-angular-forms-password.mjs +60 -60
  71. package/fesm2022/hermes-ui-angular-forms-password.mjs.map +1 -1
  72. package/fesm2022/hermes-ui-angular-forms-radio.mjs +52 -52
  73. package/fesm2022/hermes-ui-angular-forms-radio.mjs.map +1 -1
  74. package/fesm2022/hermes-ui-angular-forms-range.mjs +46 -46
  75. package/fesm2022/hermes-ui-angular-forms-range.mjs.map +1 -1
  76. package/fesm2022/hermes-ui-angular-forms-select.mjs +10 -10
  77. package/fesm2022/hermes-ui-angular-forms-select.mjs.map +1 -1
  78. package/fesm2022/hermes-ui-angular-forms-textarea.mjs +40 -40
  79. package/fesm2022/hermes-ui-angular-forms-textarea.mjs.map +1 -1
  80. package/fesm2022/hermes-ui-angular-forms.mjs.map +1 -1
  81. package/fesm2022/hermes-ui-angular-icon.mjs +29 -29
  82. package/fesm2022/hermes-ui-angular-icon.mjs.map +1 -1
  83. package/fesm2022/hermes-ui-angular-layout-breadcrumbs.mjs.map +1 -1
  84. package/fesm2022/hermes-ui-angular-layout-main-container.mjs.map +1 -1
  85. package/fesm2022/hermes-ui-angular-layout-nav.mjs +48 -48
  86. package/fesm2022/hermes-ui-angular-layout-nav.mjs.map +1 -1
  87. package/fesm2022/hermes-ui-angular-layout-tabs.mjs +148 -148
  88. package/fesm2022/hermes-ui-angular-layout-tabs.mjs.map +1 -1
  89. package/fesm2022/hermes-ui-angular-layout-vertical-nav.mjs +382 -28
  90. package/fesm2022/hermes-ui-angular-layout-vertical-nav.mjs.map +1 -1
  91. package/fesm2022/hermes-ui-angular-layout.mjs.map +1 -1
  92. package/fesm2022/hermes-ui-angular-modal.mjs +2 -2
  93. package/fesm2022/hermes-ui-angular-modal.mjs.map +1 -1
  94. package/fesm2022/hermes-ui-angular-pagination.mjs +8 -8
  95. package/fesm2022/hermes-ui-angular-pagination.mjs.map +1 -1
  96. package/fesm2022/hermes-ui-angular-popover-common.mjs +26 -3
  97. package/fesm2022/hermes-ui-angular-popover-common.mjs.map +1 -1
  98. package/fesm2022/hermes-ui-angular-popover-dropdown.mjs.map +1 -1
  99. package/fesm2022/hermes-ui-angular-popover-signpost.mjs +68 -68
  100. package/fesm2022/hermes-ui-angular-popover-signpost.mjs.map +1 -1
  101. package/fesm2022/hermes-ui-angular-popover-tooltip.mjs.map +1 -1
  102. package/fesm2022/hermes-ui-angular-popover.mjs.map +1 -1
  103. package/fesm2022/hermes-ui-angular-progress-progress-bars.mjs +10 -10
  104. package/fesm2022/hermes-ui-angular-progress-progress-bars.mjs.map +1 -1
  105. package/fesm2022/hermes-ui-angular-progress-spinner.mjs.map +1 -1
  106. package/fesm2022/hermes-ui-angular-stepper.mjs +2 -2
  107. package/fesm2022/hermes-ui-angular-stepper.mjs.map +1 -1
  108. package/fesm2022/hermes-ui-angular-timeline.mjs +2 -2
  109. package/fesm2022/hermes-ui-angular-timeline.mjs.map +1 -1
  110. package/fesm2022/hermes-ui-angular-toast.mjs +6 -6
  111. package/fesm2022/hermes-ui-angular-toast.mjs.map +1 -1
  112. package/fesm2022/hermes-ui-angular-utils-conditional.mjs.map +1 -1
  113. package/fesm2022/hermes-ui-angular-utils.mjs +6 -0
  114. package/fesm2022/hermes-ui-angular-utils.mjs.map +1 -1
  115. package/fesm2022/hermes-ui-angular-wizard.mjs +58 -58
  116. package/fesm2022/hermes-ui-angular-wizard.mjs.map +1 -1
  117. package/fesm2022/hermes-ui-angular.mjs.map +1 -1
  118. package/forms/combobox/_combobox.clarity.scss +18 -4
  119. package/forms/combobox/_properties.combobox.scss +5 -5
  120. package/forms/styles/_input-group.clarity.scss +7 -0
  121. package/forms/styles/_mixins.forms.scss +12 -10
  122. package/forms/styles/_native-select.clarity.scss +17 -5
  123. package/forms/styles/_properties.forms.scss +29 -18
  124. package/forms/styles/_textarea.clarity.scss +4 -4
  125. package/forms/styles/_variables.forms.scss +6 -0
  126. package/hermes-ui.scss +7 -7
  127. package/layout/main-container/_properties.header.scss +44 -6
  128. package/layout/main-container/_variables.header.scss +11 -0
  129. package/layout/nav/_header.clarity.scss +14 -0
  130. package/layout/nav/_mixins.header.scss +55 -40
  131. package/layout/nav/_responsive-nav.clarity.scss +21 -10
  132. package/layout/vertical-nav/_properties.vertical-nav.scss +77 -27
  133. package/layout/vertical-nav/_variables.vertical-nav.scss +23 -0
  134. package/layout/vertical-nav/_vertical-nav.clarity.scss +418 -277
  135. package/package.json +1 -1
  136. package/toast/README.md +65 -65
  137. package/toast/_properties.toast.scss +56 -56
  138. package/toast/_toast.clarity.scss +190 -190
  139. package/toast/_variables.toast.scss +33 -33
  140. package/types/hermes-ui-angular-addons-theme-builder.d.ts +2 -2
  141. package/types/hermes-ui-angular-addons-theme-builder.d.ts.map +1 -1
  142. package/types/hermes-ui-angular-data-datagrid.d.ts.map +1 -1
  143. package/types/hermes-ui-angular-icon.d.ts +3 -3
  144. package/types/hermes-ui-angular-icon.d.ts.map +1 -1
  145. package/types/hermes-ui-angular-layout-vertical-nav.d.ts +134 -10
  146. package/types/hermes-ui-angular-layout-vertical-nav.d.ts.map +1 -1
  147. package/types/hermes-ui-angular-popover-common.d.ts +4 -3
  148. package/types/hermes-ui-angular-popover-common.d.ts.map +1 -1
  149. package/types/hermes-ui-angular-utils.d.ts +12 -0
  150. package/types/hermes-ui-angular-utils.d.ts.map +1 -1
  151. package/types/hermes-ui-angular-wizard.d.ts.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hermes-ui/angular",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Angular components for Hermes",
5
5
  "keywords": [
6
6
  "hermes",
package/toast/README.md CHANGED
@@ -1,65 +1,65 @@
1
- # Toast
2
-
3
- Replicates shadcn's Toast (Base UI primitive) stacking effect natively in hermes/angular:
4
- newest toast on top, older ones peeking out and scaled down behind it, expanding to a
5
- full list on hover/focus, sliding in/out with the same 500ms ease-out curve.
6
-
7
- ## Setup - two separate pieces
8
-
9
- `HermesToastService` and `<hermes-toaster>` are not wired to each other automatically;
10
- each consuming app has to connect them itself:
11
-
12
- - **`HermesToastService`** is `@Injectable({ providedIn: 'root' })` - it's available for
13
- injection anywhere in the app with zero setup. Calling `show()`/`success()`/etc. just
14
- pushes the toast onto an internal `BehaviorSubject`; it does **not** render anything.
15
- - **`<hermes-toaster>`** is a regular Angular component (selector `hermes-toaster`,
16
- from `HermesToastModule`) that has to be placed **once**, manually, somewhere in the
17
- app's template - it's the only thing that subscribes to the service and actually
18
- draws the stack.
19
-
20
- If `<hermes-toaster>` is never mounted, `HermesToastService` calls silently no-op from
21
- the user's perspective: the toasts pile up in the service's internal state but nothing
22
- ever appears on screen. Mount it once near the app root (same pattern as shadcn/sonner's
23
- `<Toaster />`):
24
-
25
- ```ts
26
- // app.component.ts
27
- import { HermesToastModule } from '@hermes/angular/toast';
28
-
29
- @Component({
30
- imports: [HermesToastModule /* ... */],
31
- template: `
32
- <router-outlet></router-outlet>
33
- <hermes-toaster></hermes-toaster>
34
- `,
35
- })
36
- export class AppComponent {}
37
- ```
38
-
39
- ## Triggering toasts
40
-
41
- From anywhere in the app, inject `HermesToastService`:
42
-
43
- ```ts
44
- constructor(private toasts: HermesToastService) {}
45
-
46
- save() {
47
- this.toasts.promise(this.api.save(), {
48
- loading: 'Saving...',
49
- success: 'Saved',
50
- error: 'Could not save',
51
- });
52
- }
53
- ```
54
-
55
- `HermesToastService` also exposes `show()`, `default()`, `info()`, `success()`, `warning()`,
56
- `danger()`, `loading()`, `update()`, `dismiss()` and `dismissAll()`.
57
-
58
- ## Known scope cuts
59
-
60
- - **Fixed-ish stack height**: each toast's height is measured live via `ResizeObserver`
61
- (see `toast-item.ts`), but the very first render frame uses `--hermes-toast-fallback-height`
62
- until that measurement lands.
63
- - **No swipe-to-dismiss**: shadcn's Base UI toast supports drag-to-dismiss in all four
64
- directions; this port dismisses only via the close button, the action button, timeout,
65
- or Escape (dismisses the frontmost toast).
1
+ # Toast
2
+
3
+ Replicates shadcn's Toast (Base UI primitive) stacking effect natively in hermes/angular:
4
+ newest toast on top, older ones peeking out and scaled down behind it, expanding to a
5
+ full list on hover/focus, sliding in/out with the same 500ms ease-out curve.
6
+
7
+ ## Setup - two separate pieces
8
+
9
+ `HermesToastService` and `<hermes-toaster>` are not wired to each other automatically;
10
+ each consuming app has to connect them itself:
11
+
12
+ - **`HermesToastService`** is `@Injectable({ providedIn: 'root' })` - it's available for
13
+ injection anywhere in the app with zero setup. Calling `show()`/`success()`/etc. just
14
+ pushes the toast onto an internal `BehaviorSubject`; it does **not** render anything.
15
+ - **`<hermes-toaster>`** is a regular Angular component (selector `hermes-toaster`,
16
+ from `HermesToastModule`) that has to be placed **once**, manually, somewhere in the
17
+ app's template - it's the only thing that subscribes to the service and actually
18
+ draws the stack.
19
+
20
+ If `<hermes-toaster>` is never mounted, `HermesToastService` calls silently no-op from
21
+ the user's perspective: the toasts pile up in the service's internal state but nothing
22
+ ever appears on screen. Mount it once near the app root (same pattern as shadcn/sonner's
23
+ `<Toaster />`):
24
+
25
+ ```ts
26
+ // app.component.ts
27
+ import { HermesToastModule } from '@hermes/angular/toast';
28
+
29
+ @Component({
30
+ imports: [HermesToastModule /* ... */],
31
+ template: `
32
+ <router-outlet></router-outlet>
33
+ <hermes-toaster></hermes-toaster>
34
+ `,
35
+ })
36
+ export class AppComponent {}
37
+ ```
38
+
39
+ ## Triggering toasts
40
+
41
+ From anywhere in the app, inject `HermesToastService`:
42
+
43
+ ```ts
44
+ constructor(private toasts: HermesToastService) {}
45
+
46
+ save() {
47
+ this.toasts.promise(this.api.save(), {
48
+ loading: 'Saving...',
49
+ success: 'Saved',
50
+ error: 'Could not save',
51
+ });
52
+ }
53
+ ```
54
+
55
+ `HermesToastService` also exposes `show()`, `default()`, `info()`, `success()`, `warning()`,
56
+ `danger()`, `loading()`, `update()`, `dismiss()` and `dismissAll()`.
57
+
58
+ ## Known scope cuts
59
+
60
+ - **Fixed-ish stack height**: each toast's height is measured live via `ResizeObserver`
61
+ (see `toast-item.ts`), but the very first render frame uses `--hermes-toast-fallback-height`
62
+ until that measurement lands.
63
+ - **No swipe-to-dismiss**: shadcn's Base UI toast supports drag-to-dismiss in all four
64
+ directions; this port dismisses only via the close button, the action button, timeout,
65
+ or Escape (dismisses the frontmost toast).
@@ -1,56 +1,56 @@
1
- /*
2
- * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
3
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4
- * This software is released under MIT license.
5
- * The full license information can be found in LICENSE in the root directory of this project.
6
- */
7
-
8
- @use '../styles/mixins';
9
- @use '../styles/core/tokens/variables.tokens' as tokens;
10
- @use '../styles/variables/variables.density' as density;
11
-
12
- @include mixins.exports('toast.properties') {
13
- @include mixins.root-or-host() {
14
- // Layout - shadcn's Toast viewport is `w-auto max-w-sm` (384px) with a 0.75rem
15
- // gap/peek between stacked cards and 1rem inset from the viewport edge.
16
- --hermes-toast-viewport-inset: #{mixins.baselinePx(16)};
17
- --hermes-toast-max-width: #{mixins.baselinePx(384)};
18
- --hermes-toast-gap: #{mixins.baselinePx(12)};
19
- --hermes-toast-peek: #{mixins.baselinePx(12)};
20
- // Fallback height used before the item's own ResizeObserver reports its real,
21
- // content-driven height (see toast-item.ts) - only visible for one frame on insert.
22
- --hermes-toast-fallback-height: #{mixins.baselinePx(56)};
23
- --hermes-toast-content-padding: #{mixins.baselinePx(16)};
24
- --hermes-toast-content-gap: #{mixins.baselinePx(12)};
25
- --hermes-toast-icon-size: #{mixins.baselinePx(16)};
26
-
27
- &,
28
- & [hermes-density] {
29
- // shadcn's default --radius token (0.625rem @ Tailwind's 16px root = 10px)
30
- --hermes-toast-border-radius: #{mixins.baselinePx(10)};
31
- }
32
-
33
- &,
34
- & [hermes-theme] {
35
- // shadcn's Toast is a neutral `bg-popover` surface - unlike hermes-alert, the
36
- // status color lives only on the icon, not on the card background.
37
- --hermes-toast-bg-color: #{tokens.$hermes-alias-object-overlay-background};
38
- --hermes-toast-color: #{tokens.$hermes-alias-typography-color-400};
39
- --hermes-toast-description-color: #{tokens.$hermes-alias-typography-color-300};
40
- --hermes-toast-border-color: #{tokens.$hermes-alias-object-container-border-color};
41
- --hermes-toast-border-width: #{tokens.$hermes-alias-object-border-width-100};
42
- // one step below the modal's shadow-300: toasts sit above page content but
43
- // below the modal/dialog surface when both happen to be visible together
44
- --hermes-toast-box-shadow: #{tokens.$hermes-alias-object-shadow-200};
45
-
46
- --hermes-toast-info-icon-color: #{tokens.$hermes-alias-status-info};
47
- --hermes-toast-success-icon-color: #{tokens.$hermes-alias-status-success};
48
- --hermes-toast-warning-icon-color: #{tokens.$hermes-alias-status-warning-dark};
49
- --hermes-toast-danger-icon-color: #{tokens.$hermes-alias-status-danger};
50
-
51
- --hermes-toast-action-color: #{tokens.$hermes-alias-typography-color-400};
52
- --hermes-toast-close-color: var(--hermes-close-color);
53
- --hermes-toast-close-color-hover: var(--hermes-close-color-hover);
54
- }
55
- }
56
- }
1
+ /*
2
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
3
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4
+ * This software is released under MIT license.
5
+ * The full license information can be found in LICENSE in the root directory of this project.
6
+ */
7
+
8
+ @use '../styles/mixins';
9
+ @use '../styles/core/tokens/variables.tokens' as tokens;
10
+ @use '../styles/variables/variables.density' as density;
11
+
12
+ @include mixins.exports('toast.properties') {
13
+ @include mixins.root-or-host() {
14
+ // Layout - shadcn's Toast viewport is `w-auto max-w-sm` (384px) with a 0.75rem
15
+ // gap/peek between stacked cards and 1rem inset from the viewport edge.
16
+ --hermes-toast-viewport-inset: #{mixins.baselinePx(16)};
17
+ --hermes-toast-max-width: #{mixins.baselinePx(384)};
18
+ --hermes-toast-gap: #{mixins.baselinePx(12)};
19
+ --hermes-toast-peek: #{mixins.baselinePx(12)};
20
+ // Fallback height used before the item's own ResizeObserver reports its real,
21
+ // content-driven height (see toast-item.ts) - only visible for one frame on insert.
22
+ --hermes-toast-fallback-height: #{mixins.baselinePx(56)};
23
+ --hermes-toast-content-padding: #{mixins.baselinePx(16)};
24
+ --hermes-toast-content-gap: #{mixins.baselinePx(12)};
25
+ --hermes-toast-icon-size: #{mixins.baselinePx(16)};
26
+
27
+ &,
28
+ & [hermes-density] {
29
+ // shadcn's default --radius token (0.625rem @ Tailwind's 16px root = 10px)
30
+ --hermes-toast-border-radius: #{mixins.baselinePx(10)};
31
+ }
32
+
33
+ &,
34
+ & [hermes-theme] {
35
+ // shadcn's Toast is a neutral `bg-popover` surface - unlike hermes-alert, the
36
+ // status color lives only on the icon, not on the card background.
37
+ --hermes-toast-bg-color: #{tokens.$hermes-alias-object-overlay-background};
38
+ --hermes-toast-color: #{tokens.$hermes-alias-typography-color-400};
39
+ --hermes-toast-description-color: #{tokens.$hermes-alias-typography-color-300};
40
+ --hermes-toast-border-color: #{tokens.$hermes-alias-object-container-border-color};
41
+ --hermes-toast-border-width: #{tokens.$hermes-alias-object-border-width-100};
42
+ // one step below the modal's shadow-300: toasts sit above page content but
43
+ // below the modal/dialog surface when both happen to be visible together
44
+ --hermes-toast-box-shadow: #{tokens.$hermes-alias-object-shadow-200};
45
+
46
+ --hermes-toast-info-icon-color: #{tokens.$hermes-alias-status-info};
47
+ --hermes-toast-success-icon-color: #{tokens.$hermes-alias-status-success};
48
+ --hermes-toast-warning-icon-color: #{tokens.$hermes-alias-status-warning-dark};
49
+ --hermes-toast-danger-icon-color: #{tokens.$hermes-alias-status-danger};
50
+
51
+ --hermes-toast-action-color: #{tokens.$hermes-alias-typography-color-400};
52
+ --hermes-toast-close-color: var(--hermes-close-color);
53
+ --hermes-toast-close-color-hover: var(--hermes-close-color-hover);
54
+ }
55
+ }
56
+ }
@@ -1,190 +1,190 @@
1
- /*
2
- * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
3
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4
- * This software is released under MIT license.
5
- * The full license information can be found in LICENSE in the root directory of this project.
6
- */
7
-
8
- @use 'sass:map';
9
- @use 'sass:meta';
10
- @use '../styles/mixins';
11
- @use '../styles/variables/variables';
12
- @use '../styles/variables/variables.density' as density;
13
- @use '../styles/core/tokens/variables.tokens' as tokens;
14
- @use 'variables.toast' as toast-variables;
15
-
16
- @include meta.load-css('properties.toast');
17
- @include mixins.exports('toast.clarity') {
18
- // Mirrors shadcn's toast primitive: 500ms, ease-out-expo-ish curve. Kept as a raw
19
- // value (not $hermes-global-animation-easing-secondary, which is a bouncier overshoot
20
- // curve) so the slide feels identical to the shadcn reference. Also set in
21
- // toaster.ts's Angular `animations: []` for the enter/leave transitions - keep both
22
- // in sync if this ever changes.
23
- $toast-transition-duration: tokens.$hermes-global-animation-duration-slow;
24
- $toast-transition-easing: cubic-bezier(0.22, 1, 0.36, 1);
25
-
26
- hermes-toaster {
27
- position: fixed;
28
- z-index: map.get(variables.$hermes-layers, toast);
29
- inset-block-end: toast-variables.$hermes-toast-viewport-inset;
30
- inset-inline-end: toast-variables.$hermes-toast-viewport-inset;
31
- width: 100%;
32
- max-width: toast-variables.$hermes-toast-max-width;
33
- // The viewport itself never intercepts clicks; only the toasts inside it do, so
34
- // page content underneath the empty parts of the stack stays fully interactive.
35
- pointer-events: none;
36
-
37
- // corners: shadcn's <Toaster/> defaults to bottom, `sm:right-4 sm:left-auto` -
38
- // bottom-right below is the hermes default, the rest are opt-in via
39
- // [hermesToasterPosition].
40
- &[data-position='bottom-left'] {
41
- inset-inline-end: auto;
42
- inset-inline-start: toast-variables.$hermes-toast-viewport-inset;
43
- }
44
-
45
- &[data-position='top-right'],
46
- &[data-position='top-left'] {
47
- inset-block-end: auto;
48
- inset-block-start: toast-variables.$hermes-toast-viewport-inset;
49
- }
50
-
51
- &[data-position='top-left'] {
52
- inset-inline-end: auto;
53
- inset-inline-start: toast-variables.$hermes-toast-viewport-inset;
54
- }
55
-
56
- @media screen and (max-width: map.get(variables.$hermes-grid-breakpoints, sm)) {
57
- inset-inline: toast-variables.$hermes-toast-viewport-inset;
58
- max-width: none;
59
- }
60
- }
61
-
62
- hermes-toast-item {
63
- // Per-item stacking state. --hermes-toast-index (0 = frontmost/newest) is set by
64
- // toast-item.ts; --hermes-toast-height is kept in sync with the item's real
65
- // rendered height by a ResizeObserver in the same file, falling back to a fixed
66
- // estimate for the single frame before that first measurement lands.
67
- --index: var(--hermes-toast-index, 0);
68
- --height: var(--hermes-toast-height, #{toast-variables.$hermes-toast-fallback-height});
69
- // shadcn's stack: each toast behind the front one shrinks by 10% and only peeks
70
- // out by --peek, until the group is expanded (hovered/focused).
71
- --scale: max(0, calc(1 - (var(--index) * 0.1)));
72
- --shrink: calc(1 - var(--scale));
73
-
74
- position: absolute;
75
- inset-inline: 0;
76
- inset-block-end: 0;
77
- display: block;
78
- width: 100%;
79
- transform-origin: bottom center;
80
- transform: translateY(
81
- calc((var(--index) * #{toast-variables.$hermes-toast-peek} * -1) - (var(--shrink) * var(--height)))
82
- )
83
- scale(var(--scale));
84
- transition:
85
- transform $toast-transition-duration $toast-transition-easing,
86
- opacity tokens.$hermes-global-animation-duration-quick ease;
87
- z-index: calc(1000 - var(--index));
88
- pointer-events: auto;
89
-
90
- &.limited {
91
- opacity: 0;
92
- pointer-events: none;
93
- }
94
- }
95
-
96
- hermes-toaster.expanded hermes-toast-item {
97
- transform: translateY(calc(var(--index) * (var(--height) + #{toast-variables.$hermes-toast-gap}) * -1));
98
- }
99
-
100
- .toast {
101
- display: flex;
102
- align-items: center;
103
- gap: toast-variables.$hermes-toast-content-gap;
104
- width: 100%;
105
- box-sizing: border-box;
106
- padding: toast-variables.$hermes-toast-content-padding;
107
- background-color: toast-variables.$hermes-toast-bg-color;
108
- color: toast-variables.$hermes-toast-color;
109
- border: toast-variables.$hermes-toast-border-width solid toast-variables.$hermes-toast-border-color;
110
- border-radius: toast-variables.$hermes-toast-border-radius;
111
- box-shadow: toast-variables.$hermes-toast-box-shadow;
112
-
113
- @include mixins.generate-typography-token('BODY-14-RG-STD');
114
- }
115
-
116
- .toast-icon {
117
- flex: 0 0 auto;
118
-
119
- @include mixins.equilateral(toast-variables.$hermes-toast-icon-size);
120
-
121
- &.spinner {
122
- @include mixins.min-equilateral(toast-variables.$hermes-toast-icon-size);
123
- }
124
- }
125
-
126
- .toast-info .toast-icon {
127
- fill: toast-variables.$hermes-toast-info-icon-color;
128
- }
129
-
130
- .toast-success .toast-icon {
131
- fill: toast-variables.$hermes-toast-success-icon-color;
132
- }
133
-
134
- .toast-warning .toast-icon {
135
- fill: toast-variables.$hermes-toast-warning-icon-color;
136
- }
137
-
138
- .toast-danger .toast-icon {
139
- fill: toast-variables.$hermes-toast-danger-icon-color;
140
- }
141
-
142
- .toast-content {
143
- flex: 1 1 auto;
144
- min-width: 0;
145
- display: flex;
146
- flex-direction: column;
147
- gap: density.$hermes-base-gap-xs;
148
- }
149
-
150
- .toast-title {
151
- @include mixins.generate-typography-token('BODY-14-MD-STD');
152
-
153
- color: toast-variables.$hermes-toast-color;
154
- }
155
-
156
- .toast-description {
157
- @include mixins.generate-typography-token('BODY-14-RG-STD');
158
-
159
- color: toast-variables.$hermes-toast-description-color;
160
- }
161
-
162
- .toast-action {
163
- flex: 0 0 auto;
164
- color: toast-variables.$hermes-toast-action-color;
165
- text-decoration: underline;
166
- white-space: nowrap;
167
- }
168
-
169
- .toast-close {
170
- flex: 0 0 auto;
171
- float: none;
172
- color: toast-variables.$hermes-toast-close-color;
173
-
174
- @include mixins.equilateral(density.$hermes-base-icon-size-s);
175
-
176
- hermes-icon,
177
- hermes-icon {
178
- fill: toast-variables.$hermes-toast-close-color;
179
- }
180
-
181
- &:hover {
182
- color: toast-variables.$hermes-toast-close-color-hover;
183
-
184
- hermes-icon,
185
- hermes-icon {
186
- fill: toast-variables.$hermes-toast-close-color-hover;
187
- }
188
- }
189
- }
190
- }
1
+ /*
2
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
3
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4
+ * This software is released under MIT license.
5
+ * The full license information can be found in LICENSE in the root directory of this project.
6
+ */
7
+
8
+ @use 'sass:map';
9
+ @use 'sass:meta';
10
+ @use '../styles/mixins';
11
+ @use '../styles/variables/variables';
12
+ @use '../styles/variables/variables.density' as density;
13
+ @use '../styles/core/tokens/variables.tokens' as tokens;
14
+ @use 'variables.toast' as toast-variables;
15
+
16
+ @include meta.load-css('properties.toast');
17
+ @include mixins.exports('toast.clarity') {
18
+ // Mirrors shadcn's toast primitive: 500ms, ease-out-expo-ish curve. Kept as a raw
19
+ // value (not $hermes-global-animation-easing-secondary, which is a bouncier overshoot
20
+ // curve) so the slide feels identical to the shadcn reference. Also set in
21
+ // toaster.ts's Angular `animations: []` for the enter/leave transitions - keep both
22
+ // in sync if this ever changes.
23
+ $toast-transition-duration: tokens.$hermes-global-animation-duration-slow;
24
+ $toast-transition-easing: cubic-bezier(0.22, 1, 0.36, 1);
25
+
26
+ hermes-toaster {
27
+ position: fixed;
28
+ z-index: map.get(variables.$hermes-layers, toast);
29
+ inset-block-end: toast-variables.$hermes-toast-viewport-inset;
30
+ inset-inline-end: toast-variables.$hermes-toast-viewport-inset;
31
+ width: 100%;
32
+ max-width: toast-variables.$hermes-toast-max-width;
33
+ // The viewport itself never intercepts clicks; only the toasts inside it do, so
34
+ // page content underneath the empty parts of the stack stays fully interactive.
35
+ pointer-events: none;
36
+
37
+ // corners: shadcn's <Toaster/> defaults to bottom, `sm:right-4 sm:left-auto` -
38
+ // bottom-right below is the hermes default, the rest are opt-in via
39
+ // [hermesToasterPosition].
40
+ &[data-position='bottom-left'] {
41
+ inset-inline-end: auto;
42
+ inset-inline-start: toast-variables.$hermes-toast-viewport-inset;
43
+ }
44
+
45
+ &[data-position='top-right'],
46
+ &[data-position='top-left'] {
47
+ inset-block-end: auto;
48
+ inset-block-start: toast-variables.$hermes-toast-viewport-inset;
49
+ }
50
+
51
+ &[data-position='top-left'] {
52
+ inset-inline-end: auto;
53
+ inset-inline-start: toast-variables.$hermes-toast-viewport-inset;
54
+ }
55
+
56
+ @media screen and (max-width: map.get(variables.$hermes-grid-breakpoints, sm)) {
57
+ inset-inline: toast-variables.$hermes-toast-viewport-inset;
58
+ max-width: none;
59
+ }
60
+ }
61
+
62
+ hermes-toast-item {
63
+ // Per-item stacking state. --hermes-toast-index (0 = frontmost/newest) is set by
64
+ // toast-item.ts; --hermes-toast-height is kept in sync with the item's real
65
+ // rendered height by a ResizeObserver in the same file, falling back to a fixed
66
+ // estimate for the single frame before that first measurement lands.
67
+ --index: var(--hermes-toast-index, 0);
68
+ --height: var(--hermes-toast-height, #{toast-variables.$hermes-toast-fallback-height});
69
+ // shadcn's stack: each toast behind the front one shrinks by 10% and only peeks
70
+ // out by --peek, until the group is expanded (hovered/focused).
71
+ --scale: max(0, calc(1 - (var(--index) * 0.1)));
72
+ --shrink: calc(1 - var(--scale));
73
+
74
+ position: absolute;
75
+ inset-inline: 0;
76
+ inset-block-end: 0;
77
+ display: block;
78
+ width: 100%;
79
+ transform-origin: bottom center;
80
+ transform: translateY(
81
+ calc((var(--index) * #{toast-variables.$hermes-toast-peek} * -1) - (var(--shrink) * var(--height)))
82
+ )
83
+ scale(var(--scale));
84
+ transition:
85
+ transform $toast-transition-duration $toast-transition-easing,
86
+ opacity tokens.$hermes-global-animation-duration-quick ease;
87
+ z-index: calc(1000 - var(--index));
88
+ pointer-events: auto;
89
+
90
+ &.limited {
91
+ opacity: 0;
92
+ pointer-events: none;
93
+ }
94
+ }
95
+
96
+ hermes-toaster.expanded hermes-toast-item {
97
+ transform: translateY(calc(var(--index) * (var(--height) + #{toast-variables.$hermes-toast-gap}) * -1));
98
+ }
99
+
100
+ .toast {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: toast-variables.$hermes-toast-content-gap;
104
+ width: 100%;
105
+ box-sizing: border-box;
106
+ padding: toast-variables.$hermes-toast-content-padding;
107
+ background-color: toast-variables.$hermes-toast-bg-color;
108
+ color: toast-variables.$hermes-toast-color;
109
+ border: toast-variables.$hermes-toast-border-width solid toast-variables.$hermes-toast-border-color;
110
+ border-radius: toast-variables.$hermes-toast-border-radius;
111
+ box-shadow: toast-variables.$hermes-toast-box-shadow;
112
+
113
+ @include mixins.generate-typography-token('BODY-14-RG-STD');
114
+ }
115
+
116
+ .toast-icon {
117
+ flex: 0 0 auto;
118
+
119
+ @include mixins.equilateral(toast-variables.$hermes-toast-icon-size);
120
+
121
+ &.spinner {
122
+ @include mixins.min-equilateral(toast-variables.$hermes-toast-icon-size);
123
+ }
124
+ }
125
+
126
+ .toast-info .toast-icon {
127
+ fill: toast-variables.$hermes-toast-info-icon-color;
128
+ }
129
+
130
+ .toast-success .toast-icon {
131
+ fill: toast-variables.$hermes-toast-success-icon-color;
132
+ }
133
+
134
+ .toast-warning .toast-icon {
135
+ fill: toast-variables.$hermes-toast-warning-icon-color;
136
+ }
137
+
138
+ .toast-danger .toast-icon {
139
+ fill: toast-variables.$hermes-toast-danger-icon-color;
140
+ }
141
+
142
+ .toast-content {
143
+ flex: 1 1 auto;
144
+ min-width: 0;
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: density.$hermes-base-gap-xs;
148
+ }
149
+
150
+ .toast-title {
151
+ @include mixins.generate-typography-token('BODY-14-MD-STD');
152
+
153
+ color: toast-variables.$hermes-toast-color;
154
+ }
155
+
156
+ .toast-description {
157
+ @include mixins.generate-typography-token('BODY-14-RG-STD');
158
+
159
+ color: toast-variables.$hermes-toast-description-color;
160
+ }
161
+
162
+ .toast-action {
163
+ flex: 0 0 auto;
164
+ color: toast-variables.$hermes-toast-action-color;
165
+ text-decoration: underline;
166
+ white-space: nowrap;
167
+ }
168
+
169
+ .toast-close {
170
+ flex: 0 0 auto;
171
+ float: none;
172
+ color: toast-variables.$hermes-toast-close-color;
173
+
174
+ @include mixins.equilateral(density.$hermes-base-icon-size-s);
175
+
176
+ hermes-icon,
177
+ hermes-icon {
178
+ fill: toast-variables.$hermes-toast-close-color;
179
+ }
180
+
181
+ &:hover {
182
+ color: toast-variables.$hermes-toast-close-color-hover;
183
+
184
+ hermes-icon,
185
+ hermes-icon {
186
+ fill: toast-variables.$hermes-toast-close-color-hover;
187
+ }
188
+ }
189
+ }
190
+ }