@foxeltech/angular-ui 0.3.1 → 0.7.44

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 (193) hide show
  1. package/archivo/archivo-400-latin-ext.woff2 +0 -0
  2. package/archivo/archivo-400-latin.woff2 +0 -0
  3. package/archivo/archivo-400-vietnamese.woff2 +0 -0
  4. package/archivo/archivo-500-latin-ext.woff2 +0 -0
  5. package/archivo/archivo-500-latin.woff2 +0 -0
  6. package/archivo/archivo-500-vietnamese.woff2 +0 -0
  7. package/archivo/archivo-600-latin-ext.woff2 +0 -0
  8. package/archivo/archivo-600-latin.woff2 +0 -0
  9. package/archivo/archivo-600-vietnamese.woff2 +0 -0
  10. package/archivo/archivo-700-latin-ext.woff2 +0 -0
  11. package/archivo/archivo-700-latin.woff2 +0 -0
  12. package/archivo/archivo-700-vietnamese.woff2 +0 -0
  13. package/components.css +12 -12
  14. package/dialogs.css +2 -2
  15. package/fesm2022/foxeltech-angular-ui-chart.mjs +560 -0
  16. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -0
  17. package/fesm2022/foxeltech-angular-ui-flow.mjs +211 -0
  18. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -0
  19. package/fesm2022/foxeltech-angular-ui-rich-text.mjs +156 -0
  20. package/fesm2022/foxeltech-angular-ui-rich-text.mjs.map +1 -0
  21. package/fesm2022/foxeltech-angular-ui.mjs +1580 -1409
  22. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  23. package/fonts.css +462 -138
  24. package/fx-icons.svg +97 -0
  25. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic-ext.woff2 +0 -0
  26. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic.woff2 +0 -0
  27. package/ibm-plex-mono/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  28. package/ibm-plex-mono/ibm-plex-mono-400-latin.woff2 +0 -0
  29. package/ibm-plex-mono/ibm-plex-mono-400-vietnamese.woff2 +0 -0
  30. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic-ext.woff2 +0 -0
  31. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic.woff2 +0 -0
  32. package/ibm-plex-mono/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  33. package/ibm-plex-mono/ibm-plex-mono-500-latin.woff2 +0 -0
  34. package/ibm-plex-mono/ibm-plex-mono-500-vietnamese.woff2 +0 -0
  35. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic-ext.woff2 +0 -0
  36. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic.woff2 +0 -0
  37. package/ibm-plex-mono/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  38. package/ibm-plex-mono/ibm-plex-mono-600-latin.woff2 +0 -0
  39. package/ibm-plex-mono/ibm-plex-mono-600-vietnamese.woff2 +0 -0
  40. package/jetbrains-mono/jetbrains-mono-400-cyrillic-ext.woff2 +0 -0
  41. package/jetbrains-mono/jetbrains-mono-400-cyrillic.woff2 +0 -0
  42. package/jetbrains-mono/jetbrains-mono-400-greek.woff2 +0 -0
  43. package/jetbrains-mono/jetbrains-mono-400-latin-ext.woff2 +0 -0
  44. package/jetbrains-mono/jetbrains-mono-400-latin.woff2 +0 -0
  45. package/jetbrains-mono/jetbrains-mono-400-vietnamese.woff2 +0 -0
  46. package/jetbrains-mono/jetbrains-mono-500-cyrillic-ext.woff2 +0 -0
  47. package/jetbrains-mono/jetbrains-mono-500-cyrillic.woff2 +0 -0
  48. package/jetbrains-mono/jetbrains-mono-500-greek.woff2 +0 -0
  49. package/jetbrains-mono/jetbrains-mono-500-latin-ext.woff2 +0 -0
  50. package/jetbrains-mono/jetbrains-mono-500-latin.woff2 +0 -0
  51. package/jetbrains-mono/jetbrains-mono-500-vietnamese.woff2 +0 -0
  52. package/jetbrains-mono/jetbrains-mono-600-cyrillic-ext.woff2 +0 -0
  53. package/jetbrains-mono/jetbrains-mono-600-cyrillic.woff2 +0 -0
  54. package/jetbrains-mono/jetbrains-mono-600-greek.woff2 +0 -0
  55. package/jetbrains-mono/jetbrains-mono-600-latin-ext.woff2 +0 -0
  56. package/jetbrains-mono/jetbrains-mono-600-latin.woff2 +0 -0
  57. package/jetbrains-mono/jetbrains-mono-600-vietnamese.woff2 +0 -0
  58. package/jetbrains-mono/jetbrains-mono-700-cyrillic-ext.woff2 +0 -0
  59. package/jetbrains-mono/jetbrains-mono-700-cyrillic.woff2 +0 -0
  60. package/jetbrains-mono/jetbrains-mono-700-greek.woff2 +0 -0
  61. package/jetbrains-mono/jetbrains-mono-700-latin-ext.woff2 +0 -0
  62. package/jetbrains-mono/jetbrains-mono-700-latin.woff2 +0 -0
  63. package/jetbrains-mono/jetbrains-mono-700-vietnamese.woff2 +0 -0
  64. package/newsreader/newsreader-400-latin-ext.woff2 +0 -0
  65. package/newsreader/newsreader-400-latin.woff2 +0 -0
  66. package/newsreader/newsreader-400-vietnamese.woff2 +0 -0
  67. package/newsreader/newsreader-500-latin-ext.woff2 +0 -0
  68. package/newsreader/newsreader-500-latin.woff2 +0 -0
  69. package/newsreader/newsreader-500-vietnamese.woff2 +0 -0
  70. package/newsreader/newsreader-600-latin-ext.woff2 +0 -0
  71. package/newsreader/newsreader-600-latin.woff2 +0 -0
  72. package/newsreader/newsreader-600-vietnamese.woff2 +0 -0
  73. package/package.json +18 -9
  74. package/source-serif-4/source-serif-4-400-cyrillic-ext.woff2 +0 -0
  75. package/source-serif-4/source-serif-4-400-cyrillic.woff2 +0 -0
  76. package/source-serif-4/source-serif-4-400-greek.woff2 +0 -0
  77. package/source-serif-4/source-serif-4-400-latin-ext.woff2 +0 -0
  78. package/source-serif-4/source-serif-4-400-latin.woff2 +0 -0
  79. package/source-serif-4/source-serif-4-400-vietnamese.woff2 +0 -0
  80. package/source-serif-4/source-serif-4-600-cyrillic-ext.woff2 +0 -0
  81. package/source-serif-4/source-serif-4-600-cyrillic.woff2 +0 -0
  82. package/source-serif-4/source-serif-4-600-greek.woff2 +0 -0
  83. package/source-serif-4/source-serif-4-600-latin-ext.woff2 +0 -0
  84. package/source-serif-4/source-serif-4-600-latin.woff2 +0 -0
  85. package/source-serif-4/source-serif-4-600-vietnamese.woff2 +0 -0
  86. package/src/lib/styles/components.css +12 -12
  87. package/src/lib/styles/dialogs.css +2 -2
  88. package/src/lib/styles/fonts.css +462 -138
  89. package/src/lib/styles/tailwind.css +1 -2
  90. package/src/lib/styles/theme.css +596 -69
  91. package/src/lib/styles/tokens.css +56 -19
  92. package/src/lib/styles/utilities.css +4 -1
  93. package/src/lib/ui/components/bar-list/bar-list.component.html +29 -0
  94. package/src/lib/ui/components/button/button.component.html +20 -18
  95. package/src/lib/ui/components/checkbox/checkbox.component.html +3 -3
  96. package/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.html +2 -2
  97. package/src/lib/ui/components/code-block/code-block.component.html +8 -0
  98. package/src/lib/ui/components/datetime-picker/datetime-picker.component.html +49 -27
  99. package/src/lib/ui/components/datetime-picker/datetime-picker.component.scss +25 -137
  100. package/src/lib/ui/components/dnd-upload/dnd-upload.component.html +3 -3
  101. package/src/lib/ui/components/drawer/drawer.component.html +36 -13
  102. package/src/lib/ui/components/drawer/drawer.component.scss +104 -18
  103. package/src/lib/ui/components/empty-state/empty-state.component.html +2 -2
  104. package/src/lib/ui/components/facets-rail/facets-rail.component.html +42 -0
  105. package/src/lib/ui/components/filter-pills/filter-pills.component.html +16 -0
  106. package/src/lib/ui/components/hero-icon/hero-icon.component.html +10 -9
  107. package/src/lib/ui/components/info-field/info-field.component.html +1 -1
  108. package/src/lib/ui/components/input/input.component.html +6 -6
  109. package/src/lib/ui/components/kanban-board/kanban-board.component.html +1 -1
  110. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +9 -9
  111. package/src/lib/ui/components/list-row/list-row.component.html +20 -0
  112. package/src/lib/ui/components/loading-panel/loading-panel.component.html +1 -1
  113. package/src/lib/ui/components/master-detail/master-detail.component.css +22 -0
  114. package/src/lib/ui/components/master-detail/master-detail.component.html +42 -10
  115. package/src/lib/ui/components/menu/menu.component.html +27 -0
  116. package/src/lib/ui/components/pending-badge/pending-badge.component.html +15 -0
  117. package/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html +45 -0
  118. package/src/lib/ui/components/project-card/project-card.component.html +102 -0
  119. package/src/lib/ui/components/radio-button/radio-button.component.html +4 -4
  120. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +4 -4
  121. package/src/lib/ui/components/sample-frame/sample-frame.component.html +18 -0
  122. package/src/lib/ui/components/score-badge/score-badge.component.html +7 -0
  123. package/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html +40 -0
  124. package/src/lib/ui/components/search-bar/search-bar.component.html +1 -1
  125. package/src/lib/ui/components/section-card/section-card.component.html +19 -6
  126. package/src/lib/ui/components/segmented/segmented.component.html +42 -0
  127. package/src/lib/ui/components/segmented/segmented.component.scss +12 -0
  128. package/src/lib/ui/components/select/select.component.html +6 -6
  129. package/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html +2 -2
  130. package/src/lib/ui/components/skeleton-list/skeleton-list.component.html +1 -1
  131. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.html +5 -5
  132. package/src/lib/ui/components/slider/slider.component.html +8 -8
  133. package/src/lib/ui/components/sparkbar/sparkbar.component.html +14 -0
  134. package/src/lib/ui/components/stage-dots/stage-dots.component.html +13 -0
  135. package/src/lib/ui/components/stat-cards/stat-cards.component.html +45 -12
  136. package/src/lib/ui/components/status-dot/status-dot.component.html +13 -0
  137. package/src/lib/ui/components/switch/switch.component.html +1 -1
  138. package/src/lib/ui/components/tab-group/tab-group.component.html +41 -12
  139. package/src/lib/ui/components/tab-group/tab-group.component.scss +41 -1
  140. package/src/lib/ui/components/table-cell/table-cell.component.html +2 -2
  141. package/src/lib/ui/components/tag/tag.component.html +4 -4
  142. package/src/lib/ui/components/theme-picker/theme-picker.component.html +44 -0
  143. package/src/lib/ui/components/toast/toast.component.html +7 -7
  144. package/src/lib/ui/components/toast-container/toast-container.component.html +1 -0
  145. package/src/lib/ui/components/tree-diagram/tree-diagram.component.html +5 -5
  146. package/tailwind.css +1 -2
  147. package/theme.css +596 -69
  148. package/tokens.css +56 -19
  149. package/types/foxeltech-angular-ui-chart.d.ts +65 -0
  150. package/types/foxeltech-angular-ui-flow.d.ts +96 -0
  151. package/types/foxeltech-angular-ui-rich-text.d.ts +35 -0
  152. package/types/foxeltech-angular-ui.d.ts +1018 -395
  153. package/utilities.css +4 -1
  154. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  155. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  156. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  157. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  158. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  159. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  160. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  161. package/SpaceMono-Regular.woff2 +0 -0
  162. package/dm-sans/DMSans-Bold.woff2 +0 -0
  163. package/dm-sans/DMSans-Light.woff2 +0 -0
  164. package/dm-sans/DMSans-Medium.woff2 +0 -0
  165. package/dm-sans/DMSans-Regular.woff2 +0 -0
  166. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  167. package/dm-sans/DMSans-Thin.woff2 +0 -0
  168. package/orbitron/Orbitron-Bold.woff2 +0 -0
  169. package/orbitron/Orbitron-Medium.woff2 +0 -0
  170. package/orbitron/Orbitron-Regular.woff2 +0 -0
  171. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  172. package/roboto/Roboto-Black.woff2 +0 -0
  173. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  174. package/roboto/Roboto-Bold.woff2 +0 -0
  175. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  176. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  177. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  178. package/roboto/Roboto-Condensed.woff2 +0 -0
  179. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  180. package/roboto/Roboto-Italic.woff2 +0 -0
  181. package/roboto/Roboto-Light.woff2 +0 -0
  182. package/roboto/Roboto-LightItalic.woff2 +0 -0
  183. package/roboto/Roboto-Medium.woff2 +0 -0
  184. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  185. package/roboto/Roboto-Regular.woff2 +0 -0
  186. package/roboto/Roboto-Thin.woff2 +0 -0
  187. package/roboto/Roboto-ThinItalic.woff2 +0 -0
  188. package/src/lib/ui/components/chart/chart.component.html +0 -20
  189. package/src/lib/ui/components/chart/chart.component.scss +0 -49
  190. package/src/lib/ui/components/flow-connection/flow-connection.component.html +0 -10
  191. package/src/lib/ui/components/flow-connection/flow-connection.component.scss +0 -0
  192. package/src/lib/ui/components/rich-text-area/rich-text-area.component.html +0 -3
  193. package/src/lib/ui/components/rich-text-area/rich-text-area.component.scss +0 -18
@@ -26,9 +26,15 @@
26
26
  #tabList
27
27
  role="tablist"
28
28
  class="relative flex overflow-x-auto no-scrollbar scroll-smooth"
29
+ [class.fx-tabs-frame]="variant() === 'page'"
29
30
  (scroll)="onScroll()"
30
31
  >
31
- @for (tab of tabs.toArray(); track tab; let i = $index) {
32
+ <!-- 'page' variant: one raised pill that SLIDES to the active tab
33
+ (anh Tú 29/08 — same motion as fx-ui-segmented) -->
34
+ @if (variant() === 'page') {
35
+ <span #pagePill aria-hidden="true" class="fx-tabs-pill"></span>
36
+ }
37
+ @for (tab of tabs(); track tab; let i = $index) {
32
38
  <button
33
39
  type="button"
34
40
  role="tab"
@@ -37,31 +43,54 @@
37
43
  (click)="selectTab(i)"
38
44
  (keydown)="onTabKeydown($event, i)"
39
45
  class="tab-btn tab-bar-btn"
46
+ [class.tab-bar-btn-page]="variant() === 'page'"
40
47
  >
41
- <div class="flex flex-row items-center justify-center">
48
+ <div class="flex flex-row items-center justify-center gap-xs">
42
49
  @if (tab.icon) {
43
50
  <fx-ui-hero-icon
44
51
  [icon]="tab.icon"
45
- [size]="20"
52
+ [size]="variant() === 'page' ? 14 : 20"
46
53
  class="flex mr-[2px]"
47
- [ngClass]="{
48
- 'text-gradient-primary-start mb-small': i === activeIndex,
49
- 'text-text-placeholder': i !== activeIndex,
50
- }"
54
+ [ngClass]="
55
+ variant() === 'page'
56
+ ? i === activeIndex
57
+ ? 'text-strong'
58
+ : 'text-text-placeholder'
59
+ : i === activeIndex
60
+ ? 'text-accent-fg mb-small'
61
+ : 'text-text-placeholder'
62
+ "
51
63
  ></fx-ui-hero-icon>
52
64
  }
53
65
  <div
54
66
  [ngClass]="
55
- i === activeIndex ? 'txt-field-label text-gradient-primary-start' : 'txt-placeholder'
67
+ variant() === 'page'
68
+ ? i === activeIndex
69
+ ? 'text-[13px] leading-none font-semibold text-strong [text-box:trim-both_cap_alphabetic]'
70
+ : 'text-[13px] leading-none font-medium text-muted [text-box:trim-both_cap_alphabetic]'
71
+ : i === activeIndex
72
+ ? 'txt-field-label text-accent-fg'
73
+ : 'txt-placeholder'
56
74
  "
57
75
  >
58
- {{ tab.label }}
76
+ {{ tab.label() }}
59
77
  </div>
78
+ @if (tab.count() !== null) {
79
+ <span
80
+ class="txt-tag-label px-normal py-[1px] rounded-pill"
81
+ [ngClass]="badgeClass(tab)"
82
+ style="font-family: var(--og-font-figure)"
83
+ >
84
+ {{ tab.count() }}
85
+ </span>
86
+ }
60
87
  </div>
61
88
  </button>
62
89
  }
63
90
 
64
- <span #underline class="underline" style="width: 0; transform: translateX(0)"></span>
91
+ @if (variant() !== 'page') {
92
+ <span #underline class="underline" style="width: 0; transform: translateX(0)"></span>
93
+ }
65
94
  </div>
66
95
 
67
96
  <button
@@ -89,10 +118,10 @@
89
118
 
90
119
  <!-- Tab content -->
91
120
  <div class="transition-all duration-300 ease-in-out mt-4">
92
- @for (tab of tabs.toArray(); track tab; let i = $index) {
121
+ @for (tab of tabs(); track tab; let i = $index) {
93
122
  @if (i === activeIndex) {
94
123
  <div role="tabpanel" class="animate-fadeIn">
95
- <ng-container *ngTemplateOutlet="tab.content"></ng-container>
124
+ <ng-container *ngTemplateOutlet="tab.content()"></ng-container>
96
125
  </div>
97
126
  }
98
127
  }
@@ -28,7 +28,7 @@
28
28
  position: absolute;
29
29
  bottom: 0;
30
30
  height: 2px;
31
- background-color: rgb(var(--gradient-primary-start));
31
+ background-color: rgb(var(--og-accent));
32
32
  transition: transform 0.25s cubic-bezier(0.2, 0.9, 0.2, 1),
33
33
  width 0.25s cubic-bezier(0.2, 0.9, 0.2, 1);
34
34
  will-change: transform, width;
@@ -49,3 +49,43 @@
49
49
  .tab-bar-btn {
50
50
  @apply relative px-large py-normal text-sm whitespace-nowrap transition-colors duration-200;
51
51
  }
52
+
53
+ /* V2 'page' variant: workspace tab strip — pills inside a rounded frame
54
+ (design refs 02..04), active pill lifted on the raised surface. */
55
+ .fx-tabs-frame {
56
+ /* w-fit: the frame hugs its tabs (design refs 02..04) instead of spanning the
57
+ page; max-w-full keeps the inner scroll working when tabs overflow.
58
+ rounded-full: the design strip is a capsule in every theme, not the
59
+ theme control radius (refs 02..04 — anh Tú 28/08). */
60
+ @apply gap-xs p-[3px] w-fit max-w-full bg-surface-sunken border border-border rounded-full;
61
+ }
62
+
63
+ .tab-bar-btn-page {
64
+ /* py 5px: the design strip is slim (~36px capsule) — anh Tú 28/08.
65
+ The active background lives on .fx-tabs-pill (sliding thumb), so the
66
+ button itself only switches text colour. z-index keeps it above the pill. */
67
+ @apply px-semi py-[5px] rounded-full border border-transparent text-muted z-[1];
68
+
69
+ &[aria-selected='false']:hover {
70
+ @apply text-strong;
71
+ }
72
+ }
73
+
74
+ /* Sliding active pill for the 'page' variant — positioned from the active
75
+ tab's offsetLeft/offsetWidth (tabs hug content, widths differ), so it
76
+ scrolls with the strip and needs no scroll-time recompute. */
77
+ .fx-tabs-pill {
78
+ @apply absolute rounded-full bg-surface-raised border border-border shadow-sm pointer-events-none;
79
+ top: 3px; /* frame p-[3px] inset */
80
+ bottom: 3px;
81
+ left: 0;
82
+ width: 0;
83
+ transform: translateX(0);
84
+ transition:
85
+ transform 0.25s cubic-bezier(0.2, 0.9, 0.2, 1),
86
+ width 0.25s cubic-bezier(0.2, 0.9, 0.2, 1);
87
+ will-change: transform, width;
88
+ @media (prefers-reduced-motion: reduce) {
89
+ transition: none;
90
+ }
91
+ }
@@ -1,7 +1,7 @@
1
- @if (!loading) {
1
+ @if (!loading()) {
2
2
  <div animate.enter="fade-in-animation" class="inline-block my-normal">
3
3
  <ng-content />
4
4
  </div>
5
5
  } @else {
6
- <div animate.enter="fade-in-animation" class="skeleton-load my-semi" [class]="skeletonClass"></div>
6
+ <div animate.enter="fade-in-animation" class="skeleton-load my-semi" [class]="skeletonClass()"></div>
7
7
  }
@@ -6,18 +6,18 @@
6
6
  [attr.role]="clicked.observed ? 'button' : null"
7
7
  [attr.tabindex]="clicked.observed ? 0 : null"
8
8
  [class]="
9
- `flex flex-row gap-small ${rounded ? 'tag-round' : 'tag-square'} tag-${type}${solid ? '-solid' : ''}${clicked.observed ? ' cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50' : ''}`
9
+ `flex flex-row gap-small ${rounded() ? 'tag-round' : 'tag-square'} tag-${type()}${solid() ? '-solid' : ''}${clicked.observed ? ' cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50' : ''}`
10
10
  "
11
11
  >
12
12
  @if (icon) {
13
13
  <fx-ui-hero-icon
14
- [class]="`flex txt-tag-${type} ${solid && type !== 'default' ? 'text-white' : ''}`"
14
+ [class]="`flex txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface' : ''}`"
15
15
  [icon]="icon"
16
16
  [size]="18"
17
17
  ></fx-ui-hero-icon>
18
18
  }
19
19
 
20
- <div [class]="`txt-tag-${type} ${solid && type !== 'default' ? 'text-white font-medium' : ''}`">
21
- {{ label }}
20
+ <div [class]="`txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface font-medium' : ''}`">
21
+ {{ label() }}
22
22
  </div>
23
23
  </div>
@@ -0,0 +1,44 @@
1
+ <button
2
+ type="button"
3
+ [matMenuTriggerFor]="themeMenu"
4
+ class="flex items-center gap-small px-normal py-small rounded-control border border-border-default bg-transparent cursor-pointer hover:bg-bg-hover transition-colors"
5
+ aria-label="Change theme"
6
+ >
7
+ <span
8
+ class="w-4 h-4 rounded-full border border-border-strong/30 shrink-0"
9
+ [style.background]="
10
+ 'linear-gradient(135deg, ' +
11
+ currentMeta().accent +
12
+ ' 50%, ' +
13
+ currentMeta().pageBg +
14
+ ' 50%)'
15
+ "
16
+ ></span>
17
+ <span class="txt-body-01 hidden md:inline">{{ currentMeta().label }}</span>
18
+ <fx-ui-hero-icon icon="chevron-down" [size]="14" class="flex text-text-secondary" />
19
+ </button>
20
+
21
+ <mat-menu #themeMenu="matMenu">
22
+ @for (theme of themes; track theme.name) {
23
+ <button
24
+ mat-menu-item
25
+ type="button"
26
+ (click)="select(theme.name)"
27
+ [attr.aria-current]="theme.name === current() ? 'true' : null"
28
+ >
29
+ <div class="flex items-center gap-normal min-w-40">
30
+ <span
31
+ class="w-5 h-5 rounded-full border border-border-strong/30 shrink-0"
32
+ [style.background]="
33
+ 'linear-gradient(135deg, ' + theme.accent + ' 50%, ' + theme.pageBg + ' 50%)'
34
+ "
35
+ ></span>
36
+ <span class="txt-body-01 flex-1">{{ theme.label }}</span>
37
+ <span class="txt-utility-description">{{ theme.dark ? 'Dark' : 'Light' }}</span>
38
+ @if (theme.name === current()) {
39
+ <fx-ui-hero-icon icon="check" [size]="16" class="flex text-text-selected" />
40
+ }
41
+ </div>
42
+ </button>
43
+ }
44
+ </mat-menu>
@@ -1,17 +1,17 @@
1
1
  <div
2
2
  animate.enter="horizontal-fade-in-animation"
3
3
  animate.leave="horizontal-fade-out-animation"
4
- [attr.role]="type === 'error' ? 'alert' : 'status'"
4
+ [attr.role]="type() === 'error' ? 'alert' : 'status'"
5
5
  class="flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[400px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0"
6
6
  [ngClass]="{
7
- 'border-success': type === 'success',
8
- 'border-critical': type === 'error',
9
- 'border-warning': type === 'warning',
10
- 'border-information': type === 'info'
7
+ 'border-success': type() === 'success',
8
+ 'border-critical': type() === 'error',
9
+ 'border-warning': type() === 'warning',
10
+ 'border-information': type() === 'info'
11
11
  }"
12
12
  >
13
13
  <div class="" aria-hidden="true">
14
- @switch (type) { @case('success') {
14
+ @switch (type()) { @case('success') {
15
15
  <fx-ui-hero-icon
16
16
  icon="check-circle"
17
17
  [solid]="true"
@@ -46,6 +46,6 @@
46
46
  @if (title) {
47
47
  <strong class="txt-field-label">{{ title }}</strong>
48
48
  }
49
- <p class="txt-default">{{ message }}</p>
49
+ <p class="txt-default">{{ message() }}</p>
50
50
  </div>
51
51
  </div>
@@ -4,6 +4,7 @@
4
4
  @for (toast of toasts; track toast) {
5
5
  <fx-ui-toast
6
6
  class="pointer-events-auto"
7
+ [toastId]="toast.id"
7
8
  [message]="toast.message"
8
9
  [title]="toast.title"
9
10
  [type]="toast.type"
@@ -3,17 +3,17 @@
3
3
  <!-- ROOT -->
4
4
  <div
5
5
  #root
6
- class="mx-auto w-fit bg-blue-600 text-white px-7 py-3 rounded-md font-semibold text-center"
6
+ class="mx-auto w-fit bg-accent text-accent-contrast px-7 py-3 rounded-md font-semibold text-center"
7
7
  >
8
- {{ data.label }}
8
+ {{ data().label }}
9
9
  </div>
10
10
 
11
11
  <!-- CHILDREN -->
12
12
  <div class="mt-16 flex justify-center gap-16">
13
- @for (child of data.children; track child) {
13
+ @for (child of data().children; track child) {
14
14
  <div
15
15
  #child
16
- class="w-48 bg-rose-600 text-white px-4 py-4 rounded-lg text-center"
16
+ class="w-48 bg-surface-raised text-strong border border-border px-4 py-4 rounded-lg text-center"
17
17
  >
18
18
  <div class="font-semibold text-lg">{{ child.label }}</div>
19
19
  <div class="mt-1 text-sm opacity-90">{{ child.status }}</div>
@@ -33,7 +33,7 @@
33
33
  [attr.y1]="line.y1"
34
34
  [attr.x2]="line.x2"
35
35
  [attr.y2]="line.y2"
36
- stroke="#1f2937"
36
+ stroke="rgb(var(--og-border-strong))"
37
37
  stroke-width="2"
38
38
  />
39
39
  }
package/tailwind.css CHANGED
@@ -8,11 +8,10 @@
8
8
  @import './components.css' layer(components);
9
9
  @import './dialogs.css' layer(components);
10
10
  @import './animations.css';
11
- @import '@danielmoncada/angular-datetime-picker/assets/style/picker.min.css';
12
11
 
13
12
  html,
14
13
  body {
15
- font-family: 'Roboto';
14
+ font-family: var(--og-font-body);
16
15
  margin: 0;
17
16
  padding: 0;
18
17
  height: 100%;