@foxeltech/angular-ui 0.0.14 → 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 (113) hide show
  1. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  2. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  3. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  4. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  5. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  6. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  7. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  8. package/SpaceMono-Regular.woff2 +0 -0
  9. package/components.css +5 -0
  10. package/dm-sans/DMSans-Bold.woff2 +0 -0
  11. package/dm-sans/DMSans-Light.woff2 +0 -0
  12. package/dm-sans/DMSans-Medium.woff2 +0 -0
  13. package/dm-sans/DMSans-Regular.woff2 +0 -0
  14. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  15. package/dm-sans/DMSans-Thin.woff2 +0 -0
  16. package/fesm2022/foxeltech-angular-ui.mjs +1061 -263
  17. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  18. package/fonts.css +68 -34
  19. package/index.d.ts +534 -138
  20. package/orbitron/Orbitron-Bold.woff2 +0 -0
  21. package/orbitron/Orbitron-Medium.woff2 +0 -0
  22. package/orbitron/Orbitron-Regular.woff2 +0 -0
  23. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  24. package/package.json +6 -6
  25. package/roboto/Roboto-Black.woff2 +0 -0
  26. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  27. package/roboto/Roboto-Bold.woff2 +0 -0
  28. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  29. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  30. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  31. package/roboto/Roboto-Condensed.woff2 +0 -0
  32. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  33. package/roboto/Roboto-Italic.woff2 +0 -0
  34. package/roboto/Roboto-Light.woff2 +0 -0
  35. package/roboto/Roboto-LightItalic.woff2 +0 -0
  36. package/roboto/Roboto-Medium.woff2 +0 -0
  37. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  38. package/roboto/Roboto-Regular.woff2 +0 -0
  39. package/roboto/Roboto-Thin.woff2 +0 -0
  40. package/roboto/Roboto-ThinItalic.woff2 +0 -0
  41. package/src/lib/styles/components.css +5 -0
  42. package/src/lib/styles/fonts.css +68 -34
  43. package/src/lib/styles/tailwind.css +1 -1
  44. package/src/lib/ui/components/button/button.component.scss +0 -0
  45. package/src/lib/ui/components/chart/chart.component.scss +49 -0
  46. package/src/lib/ui/components/checkbox/checkbox.component.scss +0 -0
  47. package/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.scss +0 -0
  48. package/src/lib/ui/components/datetime-picker/datetime-picker.component.scss +144 -0
  49. package/src/lib/ui/components/dnd-upload/dnd-upload.component.scss +87 -0
  50. package/src/lib/ui/components/drawer/drawer.component.scss +131 -0
  51. package/src/lib/ui/components/empty-state/empty-state.component.html +9 -0
  52. package/src/lib/ui/components/filter-chips/filter-chips.component.html +12 -0
  53. package/src/lib/ui/components/flow-connection/flow-connection.component.scss +0 -0
  54. package/src/lib/ui/components/hero-icon/hero-icon.component.scss +0 -0
  55. package/src/lib/ui/components/info-field/info-field.component.html +4 -0
  56. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +67 -0
  57. package/src/lib/ui/components/loading-panel/loading-panel.component.scss +0 -0
  58. package/src/lib/ui/components/meter/meter.component.html +15 -0
  59. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.scss +0 -0
  60. package/src/lib/ui/components/rich-text-area/rich-text-area.component.scss +15 -0
  61. package/src/lib/ui/components/search-bar/search-bar.component.scss +0 -0
  62. package/src/lib/ui/components/section-card/section-card.component.html +9 -0
  63. package/src/lib/ui/components/severity-badges/severity-badges.component.html +10 -0
  64. package/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html +22 -0
  65. package/src/lib/ui/components/skeleton-list/skeleton-list.component.html +12 -0
  66. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.scss +0 -0
  67. package/src/lib/ui/components/slider/slider.component.scss +0 -0
  68. package/src/lib/ui/components/stat-cards/stat-cards.component.html +18 -0
  69. package/src/lib/ui/components/switch/switch.component.scss +0 -0
  70. package/src/lib/ui/components/tab-component/tab.component.scss +0 -0
  71. package/src/lib/ui/components/tab-group/tab-group.component.scss +48 -0
  72. package/src/lib/ui/components/table-cell/table-cell.component.scss +0 -0
  73. package/src/lib/ui/components/tag/tag.component.scss +0 -0
  74. package/src/lib/ui/components/toast/toast.component.scss +0 -0
  75. package/src/lib/ui/components/toast-container/toast-container.component.scss +0 -0
  76. package/src/lib/ui/components/tree-diagram/tree-diagram.component.scss +0 -0
  77. package/src/lib/ui/dialogs/confirmation/confirmation.component.scss +0 -0
  78. package/tailwind.config.js +18 -0
  79. package/tailwind.css +1 -1
  80. package/BeVietnamPro/BeVietnamPro-Bold.ttf +0 -0
  81. package/BeVietnamPro/BeVietnamPro-ExtraLight.ttf +0 -0
  82. package/BeVietnamPro/BeVietnamPro-Light.ttf +0 -0
  83. package/BeVietnamPro/BeVietnamPro-Medium.ttf +0 -0
  84. package/BeVietnamPro/BeVietnamPro-Regular.ttf +0 -0
  85. package/BeVietnamPro/BeVietnamPro-SemiBold.ttf +0 -0
  86. package/BeVietnamPro/BeVietnamPro-Thin.ttf +0 -0
  87. package/SpaceMono-Regular.ttf +0 -0
  88. package/dm-sans/DMSans-Bold.ttf +0 -0
  89. package/dm-sans/DMSans-Light.ttf +0 -0
  90. package/dm-sans/DMSans-Medium.ttf +0 -0
  91. package/dm-sans/DMSans-Regular.ttf +0 -0
  92. package/dm-sans/DMSans-SemiBold.ttf +0 -0
  93. package/dm-sans/DMSans-Thin.ttf +0 -0
  94. package/orbitron/Orbitron-Bold.ttf +0 -0
  95. package/orbitron/Orbitron-Medium.ttf +0 -0
  96. package/orbitron/Orbitron-Regular.ttf +0 -0
  97. package/orbitron/Orbitron-SemiBold.ttf +0 -0
  98. package/roboto/Roboto-Black.ttf +0 -0
  99. package/roboto/Roboto-BlackItalic.ttf +0 -0
  100. package/roboto/Roboto-Bold.ttf +0 -0
  101. package/roboto/Roboto-BoldCondensed.ttf +0 -0
  102. package/roboto/Roboto-BoldCondensedItalic.ttf +0 -0
  103. package/roboto/Roboto-BoldItalic.ttf +0 -0
  104. package/roboto/Roboto-Condensed.ttf +0 -0
  105. package/roboto/Roboto-CondensedItalic.ttf +0 -0
  106. package/roboto/Roboto-Italic.ttf +0 -0
  107. package/roboto/Roboto-Light.ttf +0 -0
  108. package/roboto/Roboto-LightItalic.ttf +0 -0
  109. package/roboto/Roboto-Medium.ttf +0 -0
  110. package/roboto/Roboto-MediumItalic.ttf +0 -0
  111. package/roboto/Roboto-Regular.ttf +0 -0
  112. package/roboto/Roboto-Thin.ttf +0 -0
  113. package/roboto/Roboto-ThinItalic.ttf +0 -0
@@ -0,0 +1,87 @@
1
+ :host {
2
+ --dnd-accent: rgba(var(--gradient-primary-start) / 1);
3
+ }
4
+
5
+ .dnd-wrapper {
6
+ display: block;
7
+ width: 100%;
8
+ }
9
+
10
+ .dnd-area {
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 12px;
16
+ min-height: 160px;
17
+ padding: 32px 24px;
18
+ border: 2px dashed color-mix(in srgb, var(--dnd-accent) 40%, transparent);
19
+ border-radius: 12px;
20
+ background: color-mix(in srgb, var(--dnd-accent) 4%, transparent);
21
+ cursor: pointer;
22
+ outline: none;
23
+ transition: all 0.2s ease;
24
+ position: relative;
25
+ }
26
+
27
+ .dnd-area:hover {
28
+ border-color: color-mix(in srgb, var(--dnd-accent) 70%, transparent);
29
+ background: color-mix(in srgb, var(--dnd-accent) 8%, transparent);
30
+ }
31
+
32
+ .dnd-area:focus-visible {
33
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dnd-accent) 20%, transparent);
34
+ }
35
+
36
+ .dnd-area.drag-over {
37
+ border-color: var(--dnd-accent);
38
+ background: color-mix(in srgb, var(--dnd-accent) 10%, transparent);
39
+ }
40
+
41
+ .dnd-icon {
42
+ color: var(--dnd-accent);
43
+ }
44
+
45
+ .dnd-text {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 4px;
49
+ font-size: 14px;
50
+ flex-wrap: wrap;
51
+ justify-content: center;
52
+ }
53
+
54
+ .dnd-link {
55
+ color: var(--dnd-accent);
56
+ font-weight: 600;
57
+ text-decoration: underline;
58
+ }
59
+
60
+ .dnd-or {
61
+ color: rgba(var(--text-secondary) / 1);
62
+ }
63
+
64
+ .dnd-hint {
65
+ font-size: 12px;
66
+ color: rgba(var(--text-secondary) / 0.7);
67
+ }
68
+
69
+ .dnd-input {
70
+ position: absolute;
71
+ width: 0;
72
+ height: 0;
73
+ overflow: hidden;
74
+ opacity: 0;
75
+ }
76
+
77
+ /* Responsive */
78
+ @media (max-width: 640px) {
79
+ .dnd-area {
80
+ min-height: 120px;
81
+ padding: 24px 16px;
82
+ }
83
+
84
+ .dnd-text {
85
+ font-size: 13px;
86
+ }
87
+ }
@@ -0,0 +1,131 @@
1
+ :host {
2
+ @apply block h-full;
3
+ }
4
+
5
+ .drawer-host-wrapper {
6
+ @apply relative h-full border-r border-border-default;
7
+ }
8
+
9
+ .drawer-container {
10
+ @apply px-2 h-full bg-bg-primary flex flex-col overflow-auto;
11
+ transition: width 300ms cubic-bezier(0.4, 0, 0.2, 1);
12
+ }
13
+
14
+ /* Floating toggle button — sits on the right border, vertically centered */
15
+ .toggle-btn {
16
+ @apply absolute top-1/2 -translate-y-1/2 z-50 flex items-center justify-center w-6 h-6 rounded-full bg-bg-primary border border-border-default cursor-pointer shadow-sm;
17
+ right: -12px; /* half of button width to straddle the border */
18
+ transition: all 200ms ease;
19
+
20
+ &:hover {
21
+ @apply bg-bg-hover shadow-md;
22
+ }
23
+
24
+ &:active {
25
+ transform: translateY(-50%) scale(0.9);
26
+ }
27
+
28
+ &:focus-visible {
29
+ @apply outline-2 outline-primary outline-offset-2;
30
+ }
31
+ }
32
+
33
+ .drawer-nav {
34
+ @apply flex-1 overflow-y-auto overflow-x-hidden py-2;
35
+
36
+ /* Custom scrollbar */
37
+ &::-webkit-scrollbar {
38
+ @apply w-1.5;
39
+ }
40
+
41
+ &::-webkit-scrollbar-track {
42
+ @apply bg-transparent;
43
+ }
44
+
45
+ &::-webkit-scrollbar-thumb {
46
+ @apply bg-border-default rounded-sm;
47
+
48
+ &:hover {
49
+ @apply bg-text-placeholder;
50
+ }
51
+ }
52
+ }
53
+
54
+ .drawer-item-wrapper {
55
+ @apply relative;
56
+ }
57
+
58
+ .drawer-item {
59
+ @apply flex items-center mt-1 w-full min-h-8 py-2 px-large border-none bg-transparent cursor-pointer no-underline text-text-primary relative rounded;
60
+ transition: all 200ms ease;
61
+
62
+ &:hover {
63
+ @apply bg-bg-hover text-text-primary scale-95;
64
+ }
65
+
66
+ &.active {
67
+ @apply bg-gradient-primary text-white font-medium;
68
+
69
+ .item-icon {
70
+ @apply text-white;
71
+ }
72
+ }
73
+
74
+ &:active {
75
+ transform: scale(0.98);
76
+ }
77
+
78
+ &:focus-visible {
79
+ @apply outline-2 outline-primary outline-offset-2;
80
+ }
81
+
82
+ -webkit-tap-highlight-color: transparent;
83
+ @apply outline-none;
84
+ }
85
+
86
+ .item-content {
87
+ @apply flex items-center gap-3 w-full overflow-hidden;
88
+ }
89
+
90
+ .item-icon {
91
+ @apply flex-shrink-0;
92
+ color: inherit;
93
+ }
94
+
95
+ .item-label {
96
+ @apply flex-1 whitespace-nowrap overflow-hidden text-ellipsis text-[13px] leading-5 text-left;
97
+ }
98
+
99
+ .chevron-icon {
100
+ @apply flex-shrink-0 ml-auto text-text-primary;
101
+ transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);
102
+
103
+ &.rotated {
104
+ transform: rotate(180deg);
105
+ }
106
+ }
107
+
108
+ .accordion-children {
109
+ @apply overflow-hidden;
110
+ }
111
+
112
+ .drawer-version {
113
+ @apply flex items-center justify-center py-3 px-4 text-text-placeholder text-[11px] border-t border-border-default select-none;
114
+ font-family: 'Roboto', monospace;
115
+ }
116
+
117
+ .drawer-version-dot {
118
+ @apply block w-1.5 h-1.5 rounded-full bg-text-placeholder;
119
+ }
120
+
121
+ /* Collapsed mode: center the icons */
122
+ .drawer-container[style*='width: 64px'] {
123
+ .drawer-item {
124
+ @apply justify-center;
125
+ padding-left: 16px !important;
126
+ }
127
+
128
+ .item-content {
129
+ @apply justify-center;
130
+ }
131
+ }
@@ -0,0 +1,9 @@
1
+ <div
2
+ class="flex flex-col items-center justify-center gap-small w-full"
3
+ [style.minHeight]="height"
4
+ >
5
+ @if (icon) {
6
+ <fx-ui-hero-icon class="text-text-placeholder" [icon]="icon" [size]="24"></fx-ui-hero-icon>
7
+ }
8
+ <div class="txt-default text-text-placeholder">{{ message }}</div>
9
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="flex flex-wrap items-center gap-small">
2
+ @for (option of options; track option.value) {
3
+ <button
4
+ type="button"
5
+ class="px-3 py-1 rounded-full txt-utility-caption font-medium transition-colors cursor-pointer"
6
+ [ngClass]="chipClass(option)"
7
+ (click)="select(option)"
8
+ >
9
+ {{ option.label }}
10
+ </button>
11
+ }
12
+ </div>
@@ -0,0 +1,4 @@
1
+ <div class="flex flex-col gap-small min-w-0">
2
+ <span class="txt-field-label !mb-0">{{ label }}</span>
3
+ <span class="txt-default" [ngClass]="valueClass">{{ displayValue }}</span>
4
+ </div>
@@ -0,0 +1,67 @@
1
+ .kanban-board {
2
+ @apply w-full h-full overflow-x-auto;
3
+ }
4
+
5
+ .kanban-columns {
6
+ @apply flex gap-4 p-4 min-h-full;
7
+ }
8
+
9
+ .kanban-column {
10
+ @apply flex flex-col min-w-[300px] bg-gray-50 dark:bg-gray-800 rounded-lg;
11
+ flex-shrink: 0;
12
+ }
13
+
14
+ .kanban-column-header {
15
+ @apply flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700;
16
+ }
17
+
18
+ .kanban-column-title {
19
+ @apply text-lg font-semibold text-gray-900 dark:text-gray-100 m-0;
20
+ }
21
+
22
+ .kanban-column-count {
23
+ @apply px-2 py-1 text-sm font-medium bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-full;
24
+ }
25
+
26
+ .kanban-column-content {
27
+ @apply flex-1 p-4 space-y-3 overflow-y-auto;
28
+ min-height: 200px;
29
+ }
30
+
31
+ .kanban-item {
32
+ @apply bg-white dark:bg-gray-700 rounded-lg shadow-sm border border-gray-200 dark:border-gray-600;
33
+ @apply transition-shadow duration-200;
34
+ cursor: move;
35
+
36
+ &:hover {
37
+ @apply shadow-md;
38
+ }
39
+ }
40
+
41
+ .kanban-item-default {
42
+ @apply p-4 text-gray-900 dark:text-gray-100;
43
+ }
44
+
45
+ .kanban-item-placeholder {
46
+ @apply bg-gray-200 dark:bg-gray-600 rounded-lg border-2 border-dashed border-gray-400 dark:border-gray-500;
47
+ @apply opacity-50;
48
+ min-height: 60px;
49
+ }
50
+
51
+ .kanban-column-empty {
52
+ @apply flex items-center justify-center h-32 text-gray-400 dark:text-gray-500 text-sm;
53
+ @apply border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg;
54
+ }
55
+
56
+ // CDK Drag and Drop Styles
57
+ .cdk-drag-preview {
58
+ @apply opacity-80 shadow-lg rounded-lg;
59
+ }
60
+
61
+ .cdk-drag-animating {
62
+ transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
63
+ }
64
+
65
+ .kanban-column-content.cdk-drop-list-dragging .kanban-item:not(.cdk-drag-placeholder) {
66
+ transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
67
+ }
@@ -0,0 +1,15 @@
1
+ <div class="flex flex-col gap-small w-full">
2
+ @if (label || caption) {
3
+ <div class="flex items-center justify-between gap-normal">
4
+ @if (label) {
5
+ <span class="txt-field-label !mb-0">{{ label }}</span>
6
+ }
7
+ @if (caption) {
8
+ <span class="txt-utility-caption text-text-secondary">{{ caption }}</span>
9
+ }
10
+ </div>
11
+ }
12
+ <div class="h-2 rounded-full bg-bg-hover overflow-hidden">
13
+ <div class="h-full rounded-full" [ngClass]="fillClass" [style.width.%]="percent"></div>
14
+ </div>
15
+ </div>
@@ -0,0 +1,15 @@
1
+ :host {
2
+ display: block;
3
+ }
4
+
5
+ .ql-toolbar {
6
+ @apply border-b border-border-default rounded-t p-2;
7
+ }
8
+
9
+ .ql-container {
10
+ @apply rounded-b;
11
+ }
12
+
13
+ .ql-editor {
14
+ @apply min-h-[200px] p-3 text-base;
15
+ }
@@ -0,0 +1,9 @@
1
+ <div class="card-common">
2
+ <div class="flex items-center gap-normal mb-large">
3
+ @if (icon) {
4
+ <fx-ui-hero-icon [ngClass]="iconClass" [icon]="icon" [size]="18"></fx-ui-hero-icon>
5
+ }
6
+ <span class="txt-heading-06">{{ title }}</span>
7
+ </div>
8
+ <ng-content></ng-content>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="flex items-center gap-small">
2
+ @for (badge of badges; track badge.key) {
3
+ <span
4
+ class="px-2 py-0.5 rounded-full txt-utility-caption font-medium cursor-pointer"
5
+ [ngClass]="badgeClass(badge)"
6
+ (click)="badgeClick.emit(badge.key)"
7
+ >{{ badge.label }}</span
8
+ >
9
+ }
10
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="flex flex-col gap-xl animate-pulse">
2
+ <div class="card-common">
3
+ <div class="flex items-start gap-normal">
4
+ <div class="w-10 h-10 rounded-lg bg-bg-hover shrink-0"></div>
5
+ <div class="flex-1 min-w-0 flex flex-col gap-normal">
6
+ <div class="h-5 w-1/2 rounded bg-bg-hover"></div>
7
+ <div class="h-3 w-3/4 rounded bg-bg-hover"></div>
8
+ </div>
9
+ </div>
10
+ </div>
11
+
12
+ @for (c of range(cards); track c) {
13
+ <div class="card-common flex flex-col gap-large">
14
+ <div class="h-4 w-1/3 rounded bg-bg-hover"></div>
15
+ <div class="flex flex-col gap-normal">
16
+ @for (r of range(rows); track r) {
17
+ <div class="h-3 rounded bg-bg-hover" [style.width.%]="rowWidth(r)"></div>
18
+ }
19
+ </div>
20
+ </div>
21
+ }
22
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="flex flex-col gap-normal animate-pulse">
2
+ @for (r of range(rows); track r) {
3
+ <div class="rounded-normal border border-border-default p-semi">
4
+ <div class="flex items-center gap-normal mb-small">
5
+ <div class="w-8 h-8 rounded-normal bg-bg-hover shrink-0"></div>
6
+ <div class="h-4 flex-1 rounded bg-bg-hover"></div>
7
+ <div class="h-5 w-12 rounded-full bg-bg-hover shrink-0"></div>
8
+ </div>
9
+ <div class="h-3 w-3/4 rounded bg-bg-hover"></div>
10
+ </div>
11
+ }
12
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="grid gap-normal" [ngStyle]="{ 'grid-template-columns': gridColumns }">
2
+ @for (card of cards; track card.label) {
3
+ <div class="card-common flex items-center gap-normal">
4
+ @if (card.icon) {
5
+ <div
6
+ class="w-10 h-10 rounded-lg flex items-center justify-center shrink-0"
7
+ [ngClass]="boxClass(card)"
8
+ >
9
+ <fx-ui-hero-icon [icon]="card.icon" [size]="20"></fx-ui-hero-icon>
10
+ </div>
11
+ }
12
+ <div class="flex flex-col min-w-0">
13
+ <span class="txt-heading-04" [ngClass]="numClass(card)">{{ card.value }}</span>
14
+ <span class="txt-utility-caption text-text-secondary truncate">{{ card.label }}</span>
15
+ </div>
16
+ </div>
17
+ }
18
+ </div>
@@ -0,0 +1,48 @@
1
+ @keyframes fadeIn {
2
+ from {
3
+ opacity: 0;
4
+ transform: translateY(4px);
5
+ }
6
+ to {
7
+ opacity: 1;
8
+ transform: translateY(0);
9
+ }
10
+ }
11
+
12
+ .animate-fadeIn {
13
+ animation: fadeIn 0.28s ease-in-out;
14
+ }
15
+
16
+ .no-scrollbar::-webkit-scrollbar {
17
+ display: none;
18
+ }
19
+ .no-scrollbar {
20
+ -ms-overflow-style: none;
21
+ scrollbar-width: none;
22
+ }
23
+
24
+ .underline {
25
+ position: absolute;
26
+ bottom: 0;
27
+ height: 2px;
28
+ background-color: rgb(var(--gradient-primary-start));
29
+ transition: transform 0.25s cubic-bezier(0.2, 0.9, 0.2, 1),
30
+ width 0.25s cubic-bezier(0.2, 0.9, 0.2, 1);
31
+ will-change: transform, width;
32
+ transform: translateX(0);
33
+ width: 0;
34
+ margin-left: 32px;
35
+ margin-right: 32px;
36
+ }
37
+
38
+ .left-scroll-button {
39
+ @apply absolute left-0 top-0 h-full px-normal z-10 flex items-center bg-bg-primary transition-opacity duration-200;
40
+ }
41
+
42
+ .right-scroll-button {
43
+ @apply absolute right-0 top-0 h-full px-normal z-10 flex items-center bg-bg-primary transition-opacity duration-200;
44
+ }
45
+
46
+ .tab-bar-btn {
47
+ @apply relative px-large py-normal text-sm whitespace-nowrap transition-colors duration-200;
48
+ }
File without changes
@@ -1,4 +1,22 @@
1
1
  module.exports = {
2
+ // Tone utilities are built dynamically (`text-${tone}`) by value-tone.util
3
+ // and fx-ui components, so content scanning can't see them — safelist keeps
4
+ // them generated in every host app.
5
+ safelist: [
6
+ { pattern: /^(text|bg)-(critical|danger|warning|success|information)$/ },
7
+ ...['critical', 'danger', 'warning', 'success', 'information'].map((t) => `bg-${t}/10`),
8
+ // Classes emitted from fx-ui component TypeScript (not scannable content):
9
+ 'text-text-secondary',
10
+ 'text-text-primary',
11
+ 'text-text-focus',
12
+ 'bg-bg-hover',
13
+ 'bg-text-primary',
14
+ 'hover:bg-gradient-primary-start/10',
15
+ 'hover:text-gradient-primary-start',
16
+ 'hover:opacity-50',
17
+ 'font-mono',
18
+ 'break-all',
19
+ ],
2
20
  theme: {
3
21
  extend: {
4
22
  colors: {
package/tailwind.css CHANGED
@@ -5,7 +5,7 @@
5
5
  @import './animations.css';
6
6
  @import '@danielmoncada/angular-datetime-picker/assets/style/picker.min.css';
7
7
  @tailwind base;
8
- @tailwind component;
8
+ @tailwind components;
9
9
  @tailwind utilities;
10
10
 
11
11
  html, body {
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file