@unopsitg/ux 21.0.5 → 21.0.20

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 (35) hide show
  1. package/README.md +15 -0
  2. package/assets/_card.scss +89 -2
  3. package/assets/_config.scss +3 -3
  4. package/assets/_content.scss +39 -5
  5. package/assets/_footer.scss +59 -3
  6. package/assets/_main.scss +6 -8
  7. package/assets/_responsive.scss +15 -3
  8. package/assets/_sass_variables.scss +8 -2
  9. package/assets/_search.scss +3 -3
  10. package/assets/_tabs.scss +44 -0
  11. package/assets/_tags.scss +1 -1
  12. package/assets/_topbar.scss +45 -17
  13. package/assets/_utils.scss +0 -12
  14. package/assets/layout.scss +1 -0
  15. package/assets/sidebar/_sidebar_compact.scss +1 -6
  16. package/assets/sidebar/_sidebar_horizontal.scss +97 -76
  17. package/assets/sidebar/_sidebar_slim.scss +1 -6
  18. package/assets/sidebar/_sidebar_theme_core.scss +19 -19
  19. package/assets/sidebar/themes/_dark.scss +5 -5
  20. package/assets/sidebar/themes/_light.scss +2 -2
  21. package/assets/sidebar/themes/_primary.scss +8 -8
  22. package/assets/tailwind.css +47 -18
  23. package/assets/variables/_common.scss +1 -0
  24. package/assets/variables/_light.scss +2 -2
  25. package/fesm2022/unopsitg-ux.mjs +1532 -574
  26. package/fesm2022/unopsitg-ux.mjs.map +1 -1
  27. package/package.json +1 -1
  28. package/types/unopsitg-ux.d.ts +211 -203
  29. package/assets/opp/AppLogo/AppLogo-onDark_V.svg +0 -55
  30. package/assets/opp/AppLogo/AppLogo-onLight_V.svg +0 -55
  31. package/assets/opp/AppLogo-dark-vertical.svg +0 -55
  32. package/assets/opp/drive-download-20260421T141232Z-3-001.zip +0 -0
  33. package/assets/opp/favicon/favicon.svg +0 -17
  34. package/assets/opp/logo-dark-horizontal.svg +0 -55
  35. package/assets/opp/logo-light-horizontal.svg +0 -55
package/README.md CHANGED
@@ -40,13 +40,28 @@ Reference library SCSS/Tailwind and copy bundled logos into your app output:
40
40
  "styles": [
41
41
  "node_modules/@unopsitg/ux/assets/styles.scss",
42
42
  "node_modules/@unopsitg/ux/assets/tailwind.css",
43
+ "node_modules/primeicons/primeicons.css",
43
44
  "src/styles.scss"
44
45
  ],
45
46
  "assets": [
47
+ { "glob": "**/*", "input": "public" },
46
48
  { "glob": "**/*", "input": "node_modules/@unopsitg/ux/assets/opp", "output": "assets/opp" }
47
49
  ]
48
50
  ```
49
51
 
52
+ ### Critical: Tailwind content scan
53
+
54
+ Library components use Tailwind utility classes (`flex`, `items-center`, `gap-2`, `bg-surface-0`, etc.). Tailwind 4 only generates utilities for classes it finds in scanned sources. **You must add a `@source` directive** in your app's `styles.scss` so Tailwind scans the library:
55
+
56
+ ```scss
57
+ /* src/styles.scss */
58
+ @source "../../node_modules/@unopsitg/ux";
59
+ ```
60
+
61
+ Adjust the relative path to match your folder depth. Without this, layout utilities like positioning, spacing, and backgrounds will be missing and the topbar/shell will render incorrectly.
62
+
63
+ **Verify:** after `ng serve`, check the compiled CSS for `.flex { display: flex }`. If missing, the `@source` path is wrong.
64
+
50
65
  When developing **inside this monorepo**, use paths under `projects/unops-ux/src/assets/` instead of `node_modules`.
51
66
 
52
67
  ## Tokens
package/assets/_card.scss CHANGED
@@ -1,11 +1,98 @@
1
+ // ── Card base ──
2
+ // NOTE: `.card` is a layout-level utility class, NOT PrimeNG's `<p-card>`.
3
+ // PrimeNG `<p-card>` is styled via `components.card` in brand-theme.ts.
4
+
1
5
  .card {
6
+ background: var(--surface-card);
7
+ padding: 1rem;
8
+ border: 1px solid var(--p-surface-400);
9
+ border-radius: 1rem;
10
+ margin-bottom: 0;
11
+
12
+ &:has(.p-panel-collapsed) {
13
+ cursor: pointer;
14
+ }
15
+ }
16
+
17
+ :root[class*='app-dark'] .card {
18
+ border-color: var(--surface-border);
19
+ }
20
+
21
+ // Flush variant: removes inner padding and bottom margin for host-level cards
22
+ // (e.g. dashboard widgets embedded in a grid).
23
+ .card-flush {
24
+ padding: 0;
2
25
  margin-bottom: 0;
3
26
  }
4
27
 
5
- .layout-card-filled .card{
28
+ // ── Layout fill variants ──
29
+
30
+ .layout-card-filled .card {
6
31
  background: var(--surface-card);
7
32
  }
8
33
 
9
- .layout-card-transparent .card{
34
+ .layout-card-transparent .card {
10
35
  background: transparent;
11
36
  }
37
+
38
+ // ── Severity variants (mirrors PrimeNG Tag severity naming) ──
39
+
40
+ .card-primary {
41
+ background: var(--p-primary-50);
42
+ border-color: var(--p-primary-500);
43
+ }
44
+
45
+ .card-info {
46
+ background: var(--color-blue-50);
47
+ border-color: var(--color-blue-500);
48
+ }
49
+
50
+ .card-success {
51
+ background: var(--color-green-50);
52
+ border-color: var(--color-green-500);
53
+ }
54
+
55
+ .card-warn {
56
+ background: var(--color-orange-50);
57
+ border-color: var(--color-orange-500);
58
+ }
59
+
60
+ .card-danger {
61
+ background: var(--color-red-50);
62
+ border-color: var(--color-red-500);
63
+ }
64
+
65
+ .card-accent {
66
+ border-left-color: var(--color-teal-500);
67
+ }
68
+
69
+ :root[class*='app-dark'] {
70
+ .card-primary {
71
+ background: color-mix(in srgb, var(--p-primary-900) 20%, transparent);
72
+ border-color: var(--p-primary-800);
73
+ }
74
+
75
+ .card-info {
76
+ background: color-mix(in srgb, var(--color-blue-900) 20%, transparent);
77
+ border-color: var(--color-blue-800);
78
+ }
79
+
80
+ .card-success {
81
+ background: color-mix(in srgb, var(--color-green-900) 20%, transparent);
82
+ border-color: var(--color-green-800);
83
+ }
84
+
85
+ .card-warn {
86
+ background: color-mix(in srgb, var(--color-orange-900) 10%, transparent);
87
+ border-color: var(--color-orange-800);
88
+ }
89
+
90
+ .card-danger {
91
+ background: color-mix(in srgb, var(--color-red-900) 10%, transparent);
92
+ border-color: var(--color-red-800);
93
+ }
94
+
95
+ .card-accent {
96
+ border-left-color: var(--color-teal-400);
97
+ }
98
+ }
@@ -18,7 +18,7 @@
18
18
  overflow: hidden;
19
19
  cursor: pointer;
20
20
  z-index: 999;
21
- box-shadow: -0.25rem 0 1rem rgba(0, 0, 0, 0.15);
21
+ box-shadow: -0.25rem 0 1rem color-mix(in srgb, var(--p-surface-950) 15%, transparent);
22
22
 
23
23
  &.config-link {
24
24
  font-size: 1rem;
@@ -45,8 +45,8 @@
45
45
  }
46
46
 
47
47
  .app-config-button {
48
- border: 1px solid var(--border-color);
49
- background-color: var(--card-background);
48
+ border: 1px solid var(--surface-border);
49
+ background-color: var(--surface-overlay);
50
50
  position: relative;
51
51
  z-index: 0;
52
52
  border-radius: 0px;
@@ -41,15 +41,49 @@
41
41
 
42
42
  }
43
43
  .layout-content {
44
- padding: 2rem;
44
+ padding: 2rem 1rem 3.5rem;
45
45
  flex: 1 1 auto;
46
46
  position: relative;
47
47
 
48
- @media screen and (min-width: 576px) {
49
- padding: 1.5rem;
48
+ @media screen and (min-width: 780px) {
49
+ padding: 2rem 3rem 3.5rem;
50
50
  }
51
+ }
52
+
53
+ .layout-content-wrapper:has(ux-detail-layout) {
54
+ overflow: hidden;
55
+
56
+ > .layout-content-wrapper-inside {
57
+ height: 100%;
58
+ min-height: 0;
59
+ }
60
+
61
+ .layout-content {
62
+ flex: 1 1 0;
63
+ min-height: 0;
64
+ display: flex;
65
+ flex-direction: column;
66
+ padding: 1rem 1rem 3.5rem;
67
+
68
+ @media screen and (min-width: 780px) {
69
+ padding-inline: 2rem;
70
+ }
71
+ }
72
+
73
+ .layout-content > router-outlet + * {
74
+ flex: 1;
75
+ display: flex;
76
+ flex-direction: column;
77
+ min-height: 0;
78
+ }
79
+
80
+ ux-footer-main {
81
+ flex-shrink: 0;
51
82
 
52
- @media screen and (min-width: 992px) {
53
- padding: 1.5rem;
83
+ .footer-inner {
84
+ @media screen and (min-width: 780px) {
85
+ padding-inline: 2rem;
86
+ }
87
+ }
54
88
  }
55
89
  }
@@ -1,13 +1,13 @@
1
1
  .layout-footer {
2
2
  height: 4rem;
3
- padding: 1rem;
3
+ padding: 2rem 1rem;
4
4
  display: flex;
5
5
  align-items: center;
6
6
  justify-content: flex-end;
7
7
  text-align: right;
8
8
 
9
- @media screen and (min-width: 992px) {
10
- padding: 2rem;
9
+ @media screen and (min-width: 780px) {
10
+ padding: 2rem 3rem;
11
11
  }
12
12
 
13
13
  .footer-copyright {
@@ -15,3 +15,59 @@
15
15
  color: var(--text-muted-color);
16
16
  }
17
17
  }
18
+
19
+ .ux-footer-main {
20
+ .footer-desktop {
21
+ display: none;
22
+ flex-wrap: nowrap;
23
+ align-items: center;
24
+ column-gap: 0.75rem;
25
+ row-gap: 0.25rem;
26
+
27
+ @media screen and (min-width: 1024px) {
28
+ display: flex;
29
+ }
30
+ }
31
+
32
+ .footer-mobile {
33
+ display: flex;
34
+ flex-wrap: wrap;
35
+ align-items: center;
36
+ column-gap: 1rem;
37
+ row-gap: 0.25rem;
38
+
39
+ @media screen and (min-width: 1024px) {
40
+ display: none;
41
+ }
42
+ }
43
+
44
+ .footer-item {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 0.25rem;
48
+ white-space: nowrap;
49
+
50
+ > i {
51
+ flex-shrink: 0;
52
+ }
53
+ }
54
+
55
+ .footer-item-content {
56
+ display: flex;
57
+ flex-wrap: wrap;
58
+ align-content: flex-start;
59
+ column-gap: 0.25rem;
60
+ row-gap: 0.25rem;
61
+ line-height: 1.2;
62
+ }
63
+
64
+ .footer-item-wide {
65
+ display: flex;
66
+ flex-wrap: wrap;
67
+ align-content: flex-start;
68
+ column-gap: 0.25rem;
69
+ row-gap: 0.25rem;
70
+ white-space: nowrap;
71
+ line-height: 1.2;
72
+ }
73
+ }
package/assets/_main.scss CHANGED
@@ -10,7 +10,7 @@ body {
10
10
  font-family: 'Noto Sans', sans-serif;
11
11
  font-weight: 400;
12
12
  color: var(--text-color);
13
- background-color: var(--surface-ground);
13
+ background-color: transparent;
14
14
  padding: 0;
15
15
  margin: 0;
16
16
  min-height: 100%;
@@ -18,14 +18,12 @@ body {
18
18
  -moz-osx-font-smoothing: grayscale;
19
19
  }
20
20
 
21
- @media screen and (min-width: $breakpoint) {
22
- :root:not(.app-dark) body {
23
- background: linear-gradient(355deg, var(--p-primary-100) 5%, var(--p-surface-100) 50%, var(--p-surface-50) 80%);
24
- }
21
+ :root:not(.app-dark) body {
22
+ background: linear-gradient(355deg, var(--p-primary-100) 5%, var(--p-surface-100) 50%, var(--p-surface-50) 80%);
23
+ }
25
24
 
26
- .app-dark body {
27
- background: linear-gradient(355deg, var(--p-primary-900) 5%, var(--p-surface-900) 60%, var(--p-surface-950) 86%);
28
- }
25
+ .app-dark body {
26
+ background: linear-gradient(355deg, var(--p-primary-900) 5%, var(--p-surface-900) 40%, var(--p-surface-950) 86%);
29
27
  }
30
28
 
31
29
  a {
@@ -74,6 +74,17 @@
74
74
  display: none;
75
75
  }
76
76
 
77
+ .topbar-main {
78
+ flex: 1;
79
+ min-width: 0;
80
+ padding-left: 0;
81
+ justify-content: flex-end;
82
+ }
83
+
84
+ .topbar-main .layout-breadcrumb {
85
+ display: none;
86
+ }
87
+
77
88
  .topbar-right {
78
89
  display: flex;
79
90
  align-items: center;
@@ -105,6 +116,7 @@
105
116
  justify-content: center;
106
117
  width: 2.75rem;
107
118
  height: 2.75rem;
119
+ margin-left: -0.75rem;
108
120
  border-radius: 2rem;
109
121
  border: none;
110
122
  background: transparent;
@@ -162,7 +174,7 @@
162
174
  .layout-sidebar {
163
175
  position: absolute;
164
176
  z-index: 999;
165
- box-shadow: 0 0 1rem rgba(0, 0, 0, 0.15);
177
+ box-shadow: 0 0 1rem color-mix(in srgb, var(--p-surface-950) 15%, transparent);
166
178
  left: 0;
167
179
  transform: translateX(-100%);
168
180
 
@@ -187,7 +199,7 @@
187
199
 
188
200
  .layout-mask {
189
201
  display: block;
190
- animation: fadein var(--layout-section-transition-duration);
202
+ animation: fade-in var(--transition-duration);
191
203
  }
192
204
  }
193
205
 
@@ -195,7 +207,7 @@
195
207
  .search-container {
196
208
  width: 90vw;
197
209
 
198
- @media screen and (min-width: 576px) {
210
+ @media screen and (min-width: 780px) {
199
211
  width: 75vw;
200
212
  }
201
213
  }
@@ -1,2 +1,8 @@
1
- $breakpoint: 992px !default;
2
- $sidebarShadow: 0px 1px 2px 0px rgba(18, 18, 23, 0.05) !default;
1
+ $breakpoint: 1024px !default;
2
+ $sidebarShadow: 0px 1px 2px 0px color-mix(in srgb, var(--p-surface-950) 5%, transparent) !default;
3
+ $flyoutShadow:
4
+ 0px 56px 16px 0px color-mix(in srgb, var(--p-surface-950) 0%, transparent),
5
+ 0px 36px 14px 0px color-mix(in srgb, var(--p-surface-950) 1%, transparent),
6
+ 0px 20px 12px 0px color-mix(in srgb, var(--p-surface-950) 2%, transparent),
7
+ 0px 9px 9px 0px color-mix(in srgb, var(--p-surface-950) 3%, transparent),
8
+ 0px 2px 5px 0px color-mix(in srgb, var(--p-surface-950) 4%, transparent) !default;
@@ -7,9 +7,9 @@
7
7
  border-radius: var(--border-radius);
8
8
  position: relative;
9
9
  box-shadow:
10
- 0px 11px 15px -7px rgba(0, 0, 0, 0.2),
11
- 0px 24px 38px 3px rgba(0, 0, 0, 0.14),
12
- 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
10
+ 0px 11px 15px -7px color-mix(in srgb, var(--p-surface-950) 20%, transparent),
11
+ 0px 24px 38px 3px color-mix(in srgb, var(--p-surface-950) 14%, transparent),
12
+ 0px 9px 46px 8px color-mix(in srgb, var(--p-surface-950) 12%, transparent);
13
13
  border: var(--surface-border);
14
14
  -webkit-backface-visibility: hidden;
15
15
  backface-visibility: hidden;
@@ -0,0 +1,44 @@
1
+ // PrimeUIX tabs have no border-radius token. Apply pill shape to match sidebar
2
+ // menu items (border-radius: 1rem in _sidebar_vertical.scss).
3
+ .p-tab {
4
+ border-radius: 1.5rem;
5
+ font-size: var(--font-size-sm);
6
+ }
7
+
8
+ // Use the same active/hover background as sidebar menu items.
9
+ .p-tab-active {
10
+ background: var(--d-menuitem-active-bg) !important;
11
+ }
12
+ .p-tab:not(.p-tab-active):not(.p-disabled):hover {
13
+ background: var(--d-menuitem-hover-bg) !important;
14
+ }
15
+
16
+ // Mobile tab dropdown — visually match the desktop pill-tab style.
17
+ .ux-dl__mobile-select.p-select {
18
+ background: var(--p-primary-100);
19
+ border-color: transparent;
20
+ border-radius: 9999px;
21
+ padding: 0.5rem 1rem;
22
+
23
+ .p-select-label {
24
+ color: var(--p-primary-900);
25
+ font-weight: 600;
26
+ padding: 0;
27
+ }
28
+
29
+ .p-select-dropdown {
30
+ color: var(--p-primary-900);
31
+ }
32
+ }
33
+
34
+ :root[class*='app-dark'] .ux-dl__mobile-select.p-select {
35
+ background: var(--p-primary-900);
36
+
37
+ .p-select-label {
38
+ color: var(--p-primary-200);
39
+ }
40
+
41
+ .p-select-dropdown {
42
+ color: var(--p-primary-200);
43
+ }
44
+ }
package/assets/_tags.scss CHANGED
@@ -8,7 +8,6 @@
8
8
  .tag-status-active.p-tag {
9
9
  border-color: var(--color-babygreen-300);
10
10
  background-color: var(--color-babygreen-50);
11
- border-color: var(--color-babygreen-300);
12
11
  color: var(--color-babygreen-900);
13
12
  }
14
13
 
@@ -21,6 +20,7 @@
21
20
 
22
21
  .tag-status-closed.p-tag {
23
22
  border-color: var(--color-deepsea-500);
23
+ background-color: var(--color-gray-300);
24
24
  color: var(--color-deepsea-500);
25
25
  }
26
26
 
@@ -1,5 +1,4 @@
1
1
  .layout-topbar {
2
- padding: 0.75rem 0.5rem;
3
2
  border-bottom: 1px solid var(--surface-border);
4
3
  position: static;
5
4
  width: 100%;
@@ -8,19 +7,31 @@
8
7
  display: flex;
9
8
  align-items: center;
10
9
  justify-content: space-between;
10
+ padding: 0.75rem 0;
11
11
  color: var(--text-color);
12
12
  background: transparent;
13
13
 
14
- @media screen and (min-width: 992px) {
15
- padding: 0.75rem 1rem;
16
- }
17
14
 
18
15
  .topbar-left {
19
16
  display: flex;
20
17
  align-items: center;
21
- flex: 1;
22
- min-width: 0;
23
- gap: 1.8rem;
18
+ flex-shrink: 0;
19
+ gap: 0;
20
+
21
+ .topbar-sidebar-section {
22
+ display: none;
23
+
24
+ @media screen and (min-width: 1024px) {
25
+ display: flex;
26
+ align-items: center;
27
+ flex-shrink: 0;
28
+ width: var(--_sidebar-w);
29
+ box-sizing: border-box;
30
+ padding-left: 1.375rem;
31
+ gap: 0.75rem;
32
+ overflow: hidden;
33
+ }
34
+ }
24
35
 
25
36
  .topbar-logo {
26
37
  display: none;
@@ -28,7 +39,7 @@
28
39
  flex-shrink: 0;
29
40
  outline: 0 none;
30
41
 
31
- @media screen and (min-width: 992px) {
42
+ @media screen and (min-width: 1024px) {
32
43
  display: flex;
33
44
  }
34
45
 
@@ -36,10 +47,6 @@
36
47
  height: 2.3rem;
37
48
  width: auto;
38
49
  }
39
-
40
- @media screen and (min-width: 992px) {
41
- margin-right: 0.5rem;
42
- }
43
50
  }
44
51
 
45
52
  .topbar-menu-toggle {
@@ -53,6 +60,7 @@
53
60
  background: transparent;
54
61
  color: inherit;
55
62
  cursor: pointer;
63
+ flex-shrink: 0;
56
64
  transition:
57
65
  background-color var(--transition-duration)
58
66
  color var(--transition-duration),
@@ -70,9 +78,8 @@
70
78
  font-size: 1rem;
71
79
  }
72
80
 
73
- @media screen and (min-width: 992px) {
81
+ @media screen and (min-width: 1024px) {
74
82
  display: flex;
75
- margin-left: 0.375rem;
76
83
  }
77
84
  }
78
85
 
@@ -81,8 +88,10 @@
81
88
  width: 1px;
82
89
  align-self: stretch;
83
90
  background: var(--surface-border);
91
+ flex-shrink: 0;
92
+ margin-left: auto;
84
93
 
85
- @media screen and (min-width: 992px) {
94
+ @media screen and (min-width: 1024px) {
86
95
  display: block;
87
96
  }
88
97
  }
@@ -90,10 +99,28 @@
90
99
  .horizontal-logo {
91
100
  display: none;
92
101
  }
102
+ }
103
+
104
+ .topbar-main {
105
+ display: flex;
106
+ align-items: center;
107
+ flex: 1;
108
+ max-width: 1540px;
109
+ margin-inline: auto;
110
+ justify-content: space-between;
111
+ padding-left: 1rem;
93
112
 
94
113
  .layout-breadcrumb {
95
114
  display: flex;
115
+
116
+
96
117
  }
118
+
119
+ flex: 1 1 auto;
120
+ @media screen and (min-width: 780px) {
121
+ padding: 0 3rem;
122
+ }
123
+
97
124
  }
98
125
 
99
126
  .menu-button {
@@ -155,7 +182,7 @@
155
182
  display: none;
156
183
  }
157
184
 
158
- @media screen and (max-width: 991px) {
185
+ @media screen and (max-width: 1023px) {
159
186
  .mobile-profile-actions {
160
187
  display: block;
161
188
  }
@@ -172,7 +199,7 @@
172
199
  margin-left: 0.5rem;
173
200
  position: relative;
174
201
 
175
- @media screen and (min-width: 992px) {
202
+ @media screen and (min-width: 1024px) {
176
203
  margin-left: 1rem;
177
204
  }
178
205
 
@@ -248,3 +275,4 @@
248
275
  }
249
276
  }
250
277
  }
278
+
@@ -1,15 +1,3 @@
1
- .card {
2
- background: var(--surface-card);
3
- padding: 1rem;
4
- border: 1px solid var(--surface-border);
5
- margin-bottom: 2rem;
6
- border-radius: 1rem;
7
-
8
- &:last-child {
9
- margin-bottom: 0;
10
- }
11
- }
12
-
13
1
  .p-toast {
14
2
  &.p-toast-top-right,
15
3
  &.p-toast-top-left,
@@ -17,4 +17,5 @@
17
17
  @use './_card';
18
18
  @use './_tags';
19
19
  @use './_paginator';
20
+ @use './_tabs';
20
21
  @use './_animations';
@@ -133,12 +133,7 @@
133
133
  min-width: 15rem;
134
134
  background: var(--popover-background);
135
135
  border: 1px solid var(--popover-border-color);
136
- box-shadow:
137
- 0px 56px 16px 0px rgba(0, 0, 0, 0),
138
- 0px 36px 14px 0px rgba(0, 0, 0, 0.01),
139
- 0px 20px 12px 0px rgba(0, 0, 0, 0.02),
140
- 0px 9px 9px 0px rgba(0, 0, 0, 0.03),
141
- 0px 2px 5px 0px rgba(0, 0, 0, 0.04);
136
+ box-shadow: $flyoutShadow;
142
137
  border-radius: 1rem;
143
138
  padding: 0.5rem;
144
139
  max-height: 20rem;